koatty 4.3.3 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +85 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +331 -43
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +340 -43
- package/dist/index.mjs.map +1 -1
- package/dist/package.json +21 -14
- package/package.json +20 -13
- package/.rollup.config.js +0 -89
- package/.turbo/turbo-build.log +0 -99
- package/.turbo/turbo-clean.log +0 -4
- package/.turbo/turbo-lint.log +0 -18
- package/.turbo/turbo-test.log +0 -114
- package/TASKS.md +0 -1227
- package/examples/README.md +0 -172
- package/examples/basic-app/README.md +0 -72
- package/examples/basic-app/package.json +0 -23
- package/examples/basic-app/pnpm-workspace.yaml +0 -4
- package/examples/basic-app/resource/data.json +0 -2
- package/examples/basic-app/resource/graphql/User.graphql +0 -22
- package/examples/basic-app/resource/proto/.gitkeep +0 -0
- package/examples/basic-app/resource/proto/hello.proto +0 -19
- package/examples/basic-app/static/.gitkeep +0 -0
- package/examples/basic-app/static/favicon.ico +0 -0
- package/examples/basic-app/test-app.js +0 -28
- package/examples/basic-app/test-logger.js +0 -19
- package/examples/basic-app/test-simple.ts +0 -13
- package/examples/basic-app/view/index.html +0 -25
- package/tsconfig.test.json +0 -16
- package/tsconfig.tsbuildinfo +0 -1
- package/tsup.config.ts +0 -6
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/util/Helper.ts","../src/core/Constants.ts","../src/core/Loader.ts","../src/core/Bootstrap.ts","../src/core/Decorator.ts"],"names":["exports","pkg","require","engines","version","KOATTY_VERSION","ENGINES_VERSION","node","slice","checkClass","fileName","xpath","target","exSet","Helper","isClass","name","Error","undefined","keys","Object","has","add","checkRuntime","nodeEngines","lastIndexOf","nodeVersion","process","toNumber","Logger","Fatal","checkUTRuntime","isUTRuntime","argv","JSON","stringify","indexOf","COMPONENT_SCAN","CONFIGURATION_SCAN","LOGO","Loader","app","initialize","env","setLevel","rootPath","cwd","appPath","resolve","appDebug","koattyPath","__dirname","define","isEmpty","safeRequire","dirname","ROOT_PATH","APP_PATH","KOATTY_PATH","THINK_PATH","GetComponentMeta","componentMetas","componentMeta","IOC","getClassMetadata","TAGGED_CLS","isArray","push","length","GetConfigurationMeta","confMeta","configurationMetas","CheckAllComponents","Set","Load","xTarget","clear","SetLogger","data","getMetaData","configs","config","opt","logLevel","logFilePath","sensFields","logsLevel","toLowerCase","logsPath","enableBatch","setBatchConfig","maxSize","flushInterval","silent","LOGS_PATH","setLogFilePath","setSensFields","once","AppEvent","appStop","flushBatch","destroy","LoadAllComponents","isFunction","preloadMetadata","error","configurationMeta","loader","event","AppEventArr","appBoot","Log","LoadConfigs","asyncEvent","loadConfigure","loadComponent","componentManager","ComponentManager","discoverComponents","stats","getStats","coreComponents","userComponents","LoadComponents","registerAppEvents","registerCoreComponentHooks","loadPlugin","loadMiddleware","LoadMiddlewares","loadService","LoadServices","loadController","LoadControllers","loadRouter","loadServe","appReady","loadPath","frameConfig","path","exp","appConfig","loadConf","extend","setMetaData","middlewareConf","list","traceOptions","trace","tracer","Trace","use","Debug","Warn","message","appMiddleware","listClass","forEach","item","id","replace","reg","scope","type","args","ctl","getInsByClass","implementsMiddlewareInterface","middlewareList","appMList","middlewareConfig","key","Array","from","handle","get","run","middlewareOpt","middlewareClass","find","m","decoratorOptions","getPropertyData","MIDDLEWARE_OPTIONS","mergedOptions","enabled","result","middleware","protocol","protocols","join","protocolMiddleware","useExp","controllerList","controllers","implementsControllerInterface","serviceList","implementsServiceInterface","componentList","endsWith","implementsAspectInterface","loadUserComponents","pluginsConf","pluginConfList","ExecBootStrap","bootFunc","prototype","Koatty","executeBootstrap","bootstrapApplication","isInitiative","NODE_DEBUG","debugModules","split","filter","includes","Reflect","construct","enable","console","log","setApp","markReady","listen","listenCallback","err","exitCode","createApplication","appStart","Bootstrap","createDecorator","_context","saveClass","catch","ComponentScan","scanPath","saveClassMetadata","ConfigurationScan"],"mappings":"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","file":"index.mjs","sourcesContent":["{\n \"name\": \"koatty\",\n \"version\": \"4.3.3\",\n \"description\": \"Koa + Typescript = koatty. Use Typescript's decorator implement auto injection.\",\n \"scripts\": {\n \"build\": \"pnpm run build:js && pnpm run build:dts && pnpm run build:doc && pnpm run build:cp\",\n \"build:js\": \"tsup\",\n \"build:dts\": \"bash scripts/build-dts.sh\",\n \"build:doc\": \"api-documenter markdown --input temp --output docs/api\",\n \"build:cp\": \"node scripts/copyFiles && node ../../scripts/postBuild.js\",\n \"clean\": \"rimraf dist temp docs/api\",\n \"lint\": \"eslint --ext .ts,.js ./src\",\n \"test\": \"pnpm run lint && jest --passWithNoTests\",\n \"test:cov\": \"jest --collectCoverage --detectOpenHandles\"\n },\n \"main\": \"./dist/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"keywords\": [\n \"koatty\",\n \"koa\",\n \"typescript\",\n \"framework\",\n \"mvc\",\n \"http\",\n \"https\",\n \"websocket\",\n \"grpc\",\n \"quic\",\n \"http2\",\n \"http3\",\n \"di\",\n \"aop\",\n \"ioc\",\n \"inversion of control\",\n \"dependency injection\",\n \"aspect-oriented programming\",\n \"decorator\",\n \"decorator pattern\",\n \"decorator factory\"\n ],\n \"directories\": {\n \"doc\": \"docs\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/koatty/koatty.git\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"author\": {\n \"name\": \"richenlin\",\n \"email\": \"richenlin@gmail.com\"\n },\n \"license\": \"BSD-3-Clause\",\n \"bugs\": {\n \"url\": \"https://github.com/koatty/koatty/issues\"\n },\n \"homepage\": \"https://github.com/koatty/koatty\",\n \"maintainers\": [\n {\n \"name\": \"richenlin\",\n \"email\": \"richenlin@gmail.com\"\n }\n ],\n \"devDependencies\": {\n \"@grpc/grpc-js\": \"^1.12.2\",\n \"@microsoft/api-documenter\": \"^7.26.x\",\n \"@microsoft/api-extractor\": \"^7.52.x\",\n \"@types/formidable\": \"^3.x.x\",\n \"@types/jest\": \"^29.5.x\",\n \"@types/koa\": \"^2.x.x\",\n \"@types/koa-compose\": \"^3.x.x\",\n \"@types/lodash\": \"^4.x.x\",\n \"@types/node\": \"^22.x.x\",\n \"@types/on-finished\": \"^2.x.x\",\n \"@types/supertest\": \"^6.x.x\",\n \"@types/ws\": \"^8.x.x\",\n \"@typescript-eslint/eslint-plugin\": \"^8.x.x\",\n \"@typescript-eslint/parser\": \"^8.x.x\",\n \"eslint\": \"^8.x.x\",\n \"eslint-plugin-jest\": \"^28.x.x\",\n \"jest\": \"^29.x.x\",\n \"jest-html-reporters\": \"^3.x.x\",\n \"koatty_validation\": \"workspace:*\",\n \"reflect-metadata\": \"^0.2.2\",\n \"supertest\": \"^7.x.x\",\n \"ts-jest\": \"^29.x.x\",\n \"tslib\": \"^2.x.x\"\n },\n \"dependencies\": {\n \"koa\": \"^3.1.2\",\n \"koatty_config\": \"workspace:*\",\n \"koatty_container\": \"workspace:*\",\n \"koatty_core\": \"workspace:*\",\n \"koatty_exception\": \"workspace:*\",\n \"koatty_lib\": \"workspace:*\",\n \"koatty_loader\": \"workspace:*\",\n \"koatty_logger\": \"workspace:*\",\n \"koatty_router\": \"workspace:*\",\n \"koatty_serve\": \"workspace:*\",\n \"koatty_trace\": \"workspace:*\",\n \"ts-morph\": \"^27.0.2\"\n },\n \"types\": \"./dist/index.d.ts\"\n}\n","/*\n * @Description: framework helper\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2025-01-14 16:14:10\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\nconst pkg = require(\"../../package.json\");\nconst { engines, version } = pkg;\n\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nconst ARGUMENT_NAMES = /([^\\s,]+)/g;\n\nexport const KOATTY_VERSION = version;\nexport const ENGINES_VERSION = engines.node.slice(1) || '12.0.0';\n\n/**\n * require default export\n *\n * @export\n * @param {string} p\n * @returns\n */\nexport function requireDefault(p: string) {\n // Dynamic require is necessary for runtime module loading\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ex = require(p);\n return (ex && (typeof ex === \"object\") && \"default\" in ex) ? ex.default : ex;\n}\n\n/**\n * controller match\n *\n * @export\n * @param {string} name\n * @param {string} [controllerSuffix=\"\"]\n * @returns\n */\nlet controllerReg: any = null;\nexport function ControllerMatch(name: string, controllerSuffix = \"\") {\n if (!controllerReg) {\n controllerReg = new RegExp(`([a-zA-Z0-9_]+)${controllerSuffix}`);\n }\n\n const result = name.split(\".\")[0].match(controllerReg);\n return result;\n}\n\n\n/**\n * get parameter name from function\n * @param func\n */\nexport function getParamNames(func: { toString: () => { replace: (arg0: RegExp, arg1: string) => any } }) {\n const fnStr = func.toString().replace(STRIP_COMMENTS, \"\");\n let result = fnStr.slice(fnStr.indexOf(\"(\") + 1, fnStr.indexOf(\")\")).match(ARGUMENT_NAMES);\n if (result === null) {\n result = [];\n }\n return result;\n}\n\n/**\n * Check class file \n * name should be always the same as class name\n * class must be unique\n *\n * @export\n * @param {string} fileName\n * @param {string} xpath\n * @param {*} target\n * @param {Set<unknown>} [exSet]\n * @returns {*} \n */\nexport function checkClass(fileName: string, xpath: string, target: any, exSet?: Set<unknown>) {\n if (Helper.isClass(target) && target.name != fileName) { // export default class name{}\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n if (target[\"__esModule\"]) {\n if (target.name === undefined) { // export class name{}\n const keys = Object.keys(target);\n if (keys[0] != fileName && Helper.isClass(target[keys[0]])) {\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n } else if (target.name != fileName) { // export default class {}\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n }\n if (!exSet) {\n return;\n }\n if (exSet.has(fileName)) {\n throw new Error(`A same class already exists. at \\`${xpath}\\`.`);\n }\n exSet.add(fileName);\n\n return;\n}\n\n/**\n * check node version\n * @return {void} []\n */\nexport function checkRuntime() {\n let nodeEngines = ENGINES_VERSION;\n nodeEngines = nodeEngines.slice(0, nodeEngines.lastIndexOf('.'));\n let nodeVersion = process.version;\n if (nodeVersion[0] === 'v') {\n nodeVersion = nodeVersion.slice(1);\n }\n nodeVersion = nodeVersion.slice(0, nodeVersion.lastIndexOf('.'));\n\n if (Helper.toNumber(nodeEngines) > Helper.toNumber(nodeVersion)) {\n Logger.Fatal(`Koatty need node version > ${nodeEngines}, current version is ${nodeVersion}, please upgrade it.`);\n }\n}\n\n/**\n * unittest running environment detection\n * only support jest\n * @returns {boolean}\n */\nexport const checkUTRuntime = (): boolean => {\n let isUTRuntime = false;\n // UT runtime detection, only support jest\n const argv = JSON.stringify(process.argv[1]);\n if (argv.indexOf('jest') > -1) {\n isUTRuntime = true;\n }\n return isUTRuntime;\n};","/*\n * @Description: framework constants\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2023-12-09 23:00:13\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nexport const COMPONENT_SCAN = 'COMPONENT_SCAN';\nexport const CONFIGURATION_SCAN = 'CONFIGURATION_SCAN';\nexport const PRIORITY_KEY = 'PRIORITY_KEY';\n\n// tslint:disable: no-irregular-whitespace\nexport const LOGO = `\n\n┬┌─┌─┐┌─┐┌┬┐┌┬┐┬ ┬\n├┴┐│ │├─┤ │ │ └┬┘\n┴ ┴└─┘┴ ┴ ┴ ┴ ┴ \n-------------------------------------------\nhttps://github.com/koatty\n`;","/*\n * @Description: framework loader\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 22:55:49\n * @LastEditTime: 2025-03-13 16:44:39\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { LoadConfigs as loadConf } from \"koatty_config\";\nimport { IOC, TAGGED_CLS } from \"koatty_container\";\nimport {\n AppEvent, AppEventArr, IMiddleware, IMiddlewareOptions, protocolMiddleware,\n implementsAspectInterface, implementsControllerInterface,\n implementsMiddlewareInterface,\n implementsServiceInterface, IPlugin, KoattyApplication, Koatty, MIDDLEWARE_OPTIONS,\n ComponentManager, asyncEvent\n} from 'koatty_core';\nimport { Helper } from \"koatty_lib\";\nimport { Load } from \"koatty_loader\";\nimport { Trace } from \"koatty_trace\";\nimport * as path from \"path\";\nimport { checkClass } from \"../util/Helper\";\nimport { COMPONENT_SCAN, CONFIGURATION_SCAN } from './Constants';\nimport { DefaultLogger as Logger, LogLevelType } from \"koatty_logger\";\n\n/**\n * Interface representing a component item.\n * @interface ComponentItem\n * @property {string} id - Unique identifier for the component\n * @property {any} target - Target object or instance of the component\n */\ninterface ComponentItem {\n id: string;\n target: any;\n}\n\n/**\n * Loader class for Koatty framework.\n * Handles initialization, loading and configuration of application components.\n * \n * Responsibilities:\n * - Initialize environment and paths\n * - Load configurations, components, middlewares, services and controllers\n * - Set up logging\n * - Handle application event hooks\n * - Load and configure router\n * \n * @export\n * @class Loader\n */\nexport class Loader {\n app: KoattyApplication;\n\n /**\n * Creates an instance of Loader.\n * @param {KoattyApplication} app\n * @memberof Loader\n */\n constructor(app: KoattyApplication) {\n this.app = app;\n }\n\n /**\n * Initialize application configuration and environment settings.\n * Sets up logging levels, defines essential paths, and loads application metadata.\n *\n * @param {KoattyApplication} app - The Koatty application instance\n * - Sets logging level based on environment\n * - Defines root, app and framework paths on app object\n * - Loads application name and version from package.json\n * - Sets environment variables for paths\n * - Maintains backward compatibility with legacy path variables\n */\n public static initialize(app: KoattyApplication) {\n if (app.env == 'development') {\n Logger.setLevel(\"debug\");\n } else {\n Logger.setLevel(\"info\");\n }\n // define path\n const rootPath = app.rootPath || process.cwd();\n const appPath = app.appPath || path.resolve(rootPath, app.appDebug ? 'src' : 'dist');\n const koattyPath = path.resolve(__dirname, '..');\n Helper.define(app, 'rootPath', rootPath);\n Helper.define(app, 'appPath', appPath);\n Helper.define(app, 'koattyPath', koattyPath);\n\n //\n if (Helper.isEmpty(app.name)) {\n const pkg = Helper.safeRequire(`${path.dirname(appPath)}/package.json`);\n if (pkg.name) {\n app.name = pkg.name;\n app.version = app.version || pkg.version;\n }\n }\n\n // Set environment variables for backward compatibility \n // Use app.rootPath, app.appPath, app.koattyPath instead\n process.env.ROOT_PATH = rootPath;\n process.env.APP_PATH = appPath;\n process.env.KOATTY_PATH = koattyPath;\n\n // Compatible with old version, will be deprecated, do not use it in new code\n process.env.THINK_PATH = koattyPath;\n Helper.define(app, 'thinkPath', koattyPath);\n }\n\n /**\n * Get component metadata from target class.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @param {any} target - The target class to get metadata from\n * @returns {any[]} Array of component metadata paths\n * \n * @static\n * @public\n */\n public static GetComponentMeta(app: KoattyApplication, target: any): any[] {\n let componentMetas = [];\n const componentMeta = IOC.getClassMetadata(TAGGED_CLS, COMPONENT_SCAN, target);\n if (componentMeta) {\n if (Helper.isArray(componentMeta)) {\n componentMetas = componentMeta;\n } else {\n componentMetas.push(componentMeta);\n }\n }\n if (componentMetas.length < 1) {\n componentMetas = [app.appPath];\n }\n return componentMetas;\n }\n\n /**\n * Get configuration metadata from target class.\n * \n * @param {KoattyApplication} app Application instance\n * @param {any} target Target class\n * @returns {any[]} Array of configuration metadata\n */\n public static GetConfigurationMeta(app: KoattyApplication, target: any): any[] {\n const confMeta = IOC.getClassMetadata(TAGGED_CLS, CONFIGURATION_SCAN, target);\n let configurationMetas = [];\n if (confMeta) {\n if (Helper.isArray(confMeta)) {\n configurationMetas = confMeta;\n } else {\n configurationMetas.push(confMeta);\n }\n }\n return configurationMetas;\n }\n\n /**\n * Check and load all components(excepted config/*、App.ts) in the application.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @param {any} target - The target class or object to check components from\n * @static\n * @public\n */\n public static CheckAllComponents(app: KoattyApplication, target: any) {\n // component metadata\n const componentMetas = Loader.GetComponentMeta(app, target);\n // configuration metadata\n const configurationMetas = Loader.GetConfigurationMeta(app, target);\n const exSet = new Set();\n Load(componentMetas, '', (fileName: string, xpath: string, xTarget: any) => {\n checkClass(fileName, xpath, xTarget, exSet);\n }, ['**/**.js', '**/**.ts', '!**/**.d.ts'], [...configurationMetas, `${target.name || '.no'}.ts`]);\n exSet.clear();\n }\n\n /**\n * Set logger configuration for the Koatty application.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @description Configures logging settings based on application environment and config options.\n * Handles log level, log file path, and sensitive fields configuration.\n * In production environment, default log level is 'info', otherwise 'debug'.\n */\n public static SetLogger(app: KoattyApplication) {\n const data = app.getMetaData('_configs') || [];\n const configs = data[0] || {};\n //Logger\n if (configs.config) {\n const opt = configs.config;\n let logLevel: LogLevelType = \"debug\",\n logFilePath = \"\",\n sensFields = [];\n if (app.env === \"production\") {\n logLevel = \"info\";\n }\n if (opt.logsLevel) {\n logLevel = (opt.logsLevel).toLowerCase();\n }\n if (opt.logsPath) {\n logFilePath = opt.logsPath;\n }\n if (opt.sensFields) {\n sensFields = opt.sensFields;\n }\n if (!app.appDebug) {\n Logger.enableBatch(true);\n Logger.setBatchConfig({\n maxSize: 200,\n flushInterval: 500\n });\n }\n if (logLevel) {\n Logger.setLevel(logLevel);\n }\n if (logFilePath && !app.silent) {\n Helper.define(app, \"logsPath\", logFilePath);\n process.env.LOGS_PATH = logFilePath;\n Logger.setLogFilePath(logFilePath);\n }\n if (sensFields) {\n Logger.setSensFields(sensFields);\n }\n (app as any).once(AppEvent.appStop, async () => {\n await Logger.flushBatch(); // 等待所有日志写入完成\n await Logger.destroy(); // 释放所有资源\n });\n }\n }\n\n /**\n * Load all components and initialize the application.\n * \n * @param app - The KoattyApplication instance\n * @param target - The target class or object containing configuration metadata\n * \n * This method performs the following initialization steps:\n * 1. Loads configurations\n * 2. Creates server and router instances\n * 3. Loads components, middlewares, services and controllers\n * 4. Sets up routing\n * \n * @static\n * @async\n */\n public static async LoadAllComponents(app: KoattyApplication, target: any) {\n try {\n if (Helper.isFunction((IOC as any).preloadMetadata)) {\n (IOC as any).preloadMetadata();\n }\n } catch (error) {\n Logger.Error('[Loader] preloadMetadata failed:', error);\n }\n\n const configurationMeta = Loader.GetConfigurationMeta(app, target);\n const loader = new Loader(app);\n\n for (const event of AppEventArr) {\n switch (event) {\n case AppEvent.appBoot:\n Logger.Log('Koatty', '', 'Load Configurations ...');\n loader.LoadConfigs(configurationMeta);\n Loader.SetLogger(app);\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadConfigure:\n Logger.Log('Koatty', '', 'Emit loadConfigure ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadComponent:\n Logger.Log('Koatty', '', 'Initializing Component Manager ...');\n const componentManager = new ComponentManager(app);\n Helper.define(app, 'componentManager', componentManager);\n\n // Step 1: Discover components (scan metadata)\n componentManager.discoverComponents();\n \n const stats = componentManager.getStats();\n Logger.Log('Koatty', '', `Discovered ${stats.coreComponents} core components, ${stats.userComponents} user components`);\n\n // Step 2: Load components (create instances)\n Logger.Log('Koatty', '', 'Load Components ...');\n await loader.LoadComponents(componentManager);\n\n // Step 3: Register event hooks (instances now exist)\n componentManager.registerAppEvents(target);\n componentManager.registerCoreComponentHooks();\n \n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadPlugin:\n Logger.Log('Koatty', '', 'Emit loadPlugin ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadMiddleware:\n Logger.Log('Koatty', '', 'Load Middlewares ...');\n await loader.LoadMiddlewares();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadService:\n Logger.Log('Koatty', '', 'Load Services ...');\n await loader.LoadServices();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadController:\n Logger.Log('Koatty', '', 'Load Controllers ...');\n await loader.LoadControllers();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadRouter:\n Logger.Log('Koatty', '', 'Initialize Router and Load Routes ...');\n // RouterComponent.initRouter() handles both router creation and route loading\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadServe:\n Logger.Log('Koatty', '', 'Emit loadServe ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.appReady:\n Logger.Log('Koatty', '', 'Emit appReady ...');\n await asyncEvent(app, event);\n break;\n\n default:\n await asyncEvent(app, event);\n break;\n }\n }\n }\n\n /**\n * Load configuration files from specified paths.\n * First loads framework configurations from './config' directory,\n * then loads application configurations from custom paths.\n * Finally merges both configurations with framework configs as lower priority.\n * \n * @protected\n * @param {string[]} [loadPath] - Optional array of paths to load application configs from\n */\n protected LoadConfigs(loadPath?: string[]) {\n const frameConfig: any = {};\n // Logger.Debug(`Load configuration path: ${app.thinkPath}/config`);\n Load([\"./config\"], this.app.koattyPath, function (name: string, path: string, exp: any) {\n frameConfig[name] = exp;\n });\n\n if (Helper.isArray(loadPath)) {\n loadPath = loadPath.length > 0 ? loadPath : [\"./config\"];\n }\n let appConfig = loadConf(loadPath, this.app.appPath);\n appConfig = Helper.extend(frameConfig, appConfig, true);\n\n this.app.setMetaData(\"_configs\", appConfig);\n }\n\n /**\n * Load and register middleware components.\n * Processes middleware configuration, registers middleware classes with IOC container,\n * and mounts middleware to the application.\n * Supports protocol-specific middleware mounting via @Middleware({ protocol }) option.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When middleware doesn't implement IMiddleware interface\n * @throws {Error} When middleware loading fails\n */\n protected async LoadMiddlewares() {\n // ============================================\n // Load middleware configuration\n // ============================================\n let middlewareConf = this.app.config(undefined, \"middleware\");\n if (Helper.isEmpty(middlewareConf)) {\n middlewareConf = { config: {}, list: []};\n }\n \n // ============================================\n // Trace Middleware(请求链路追踪中间件)\n // ============================================\n // Koatty-Trace 是一个纯粹的 Middleware\n // 配置位置:config/middleware.ts 中的 config.trace\n // \n // 作为第一个加载的中间件,用于追踪整个请求链路\n try {\n const traceOptions = middlewareConf.config?.trace ?? {};\n const tracer = Trace(traceOptions, this.app as Koatty) as any;\n Helper.define(this.app, \"tracer\", tracer);\n this.app.use(tracer);\n Logger.Debug(`Trace middleware registered`);\n } catch (error: any) {\n Logger.Warn(`Trace middleware failed to load: ${error.message}`);\n }\n\n //Mount application middleware\n const appMiddleware = IOC.listClass(\"MIDDLEWARE\") ?? [];\n appMiddleware.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"MIDDLEWARE:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n IOC.reg(item.id, item.target, { scope: \"Prototype\", type: \"MIDDLEWARE\", args: [] });\n const ctl = IOC.getInsByClass(item.target);\n if (!implementsMiddlewareInterface(ctl)) {\n throw Error(`The middleware ${item.id} must implements interface 'IMiddleware'.`);\n }\n }\n });\n\n const middlewareList = middlewareConf.list || [];\n //de-duplication\n const appMList = new Set([]);\n middlewareList.forEach((item: string) => {\n appMList.add(item);\n });\n\n //Automatically call middleware\n const middlewareConfig = middlewareConf.config || {};\n for (const key of Array.from(appMList)) {\n const handle: IMiddleware = IOC.get(key, \"MIDDLEWARE\");\n if (!handle) {\n throw Error(`Middleware ${key} load error.`);\n }\n if (!Helper.isFunction(handle.run)) {\n throw Error(`The middleware ${key} must implements interface 'IMiddleware'.`);\n }\n \n Logger.Debug(`Load middleware: ${key}`);\n const middlewareOpt = middlewareConfig[key] || {};\n \n // Get middleware options from decorator metadata\n const middlewareClass = appMiddleware.find(m => m.id === key)?.target;\n let decoratorOptions: IMiddlewareOptions = {};\n if (middlewareClass) {\n try {\n decoratorOptions = IOC.getPropertyData(MIDDLEWARE_OPTIONS, middlewareClass, key) || {};\n } catch {\n // If metadata not found, use empty object\n decoratorOptions = {};\n }\n }\n \n // Merge decorator options with config options (config has higher priority)\n const mergedOptions: IMiddlewareOptions = { ...decoratorOptions, ...middlewareOpt };\n \n // Check if middleware is disabled\n if (mergedOptions.enabled === false) {\n Logger.Warn(`The middleware ${key} has been loaded but is disabled.`);\n continue;\n }\n \n // Execute middleware handler\n const result = await handle.run(mergedOptions, this.app);\n if (Helper.isFunction(result)) {\n let middleware = result;\n \n // Wrap with protocol filter if protocol option is specified\n if (mergedOptions.protocol) {\n const protocols = Helper.isArray(mergedOptions.protocol) \n ? mergedOptions.protocol \n : [mergedOptions.protocol];\n \n Logger.Log(\n 'Koatty', \n '', \n `Middleware ${key} limited to protocols: ${protocols.join(', ')}`\n );\n \n middleware = protocolMiddleware(protocols, result);\n }\n \n // Mount middleware\n if (middleware.length < 3) {\n this.app.use(middleware);\n } else {\n this.app.useExp(middleware);\n }\n }\n }\n }\n\n /**\n * Load and register controller classes from IOC container.\n * Each controller must implement the IController interface.\n * \n * @returns {Promise<string[]>} A promise that resolves to an array of controller IDs.\n * @protected\n * @throws {Error} If a controller does not implement the IController interface.\n */\n protected async LoadControllers() {\n const controllerList = IOC.listClass(\"CONTROLLER\");\n\n const controllers: string[] = [];\n controllerList.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"CONTROLLER:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n Logger.Debug(`Load controller: ${item.id}`);\n // registering to IOC\n IOC.reg(item.id, item.target, { scope: \"Prototype\", type: \"CONTROLLER\", args: [] });\n const ctl = IOC.getInsByClass(item.target);\n if (!implementsControllerInterface(ctl)) {\n throw Error(`The controller ${item.id} must implements interface 'IController'.`);\n }\n controllers.push(item.id);\n }\n });\n this.app.setMetaData(\"_controllers\", controllers);\n return controllers;\n }\n\n /**\n * Load and register service components into IOC container.\n * Each service must implement the IService interface.\n * Services are registered with singleton scope.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When service does not implement IService interface\n */\n protected async LoadServices() {\n const serviceList = IOC.listClass(\"SERVICE\");\n\n for (const item of serviceList) {\n item.id = (item.id ?? \"\").replace(\"SERVICE:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n Logger.Debug(`Load service: ${item.id}`);\n // registering to IOC\n IOC.reg(item.id, item.target, { scope: \"Singleton\", type: \"SERVICE\", args: [] });\n const ctl = IOC.getInsByClass(item.target);\n if (!implementsServiceInterface(ctl)) {\n throw Error(`The service ${item.id} must implements interface 'IService'.`);\n }\n }\n }\n }\n\n /**\n * Load and initialize components, plugins and aspects.\n * Components with suffix 'Plugin' must implement IPlugin interface.\n * Components with suffix 'Aspect' must implement IAspect interface.\n * Plugins are loaded based on configuration and executed synchronously.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When plugin/aspect doesn't implement required interface\n * @throws {Error} When plugin loading fails\n */\n protected async LoadComponents(componentManager?: ComponentManager) {\n const componentList = IOC.listClass(\"COMPONENT\");\n\n componentList.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"COMPONENT:\", \"\");\n if (Helper.isClass(item.target)) {\n IOC.reg(item.id, item.target, { scope: \"Singleton\", type: \"COMPONENT\", args: [] });\n\n if (item.id && (item.id).endsWith(\"Aspect\")) {\n const ctl = IOC.getInsByClass(item.target);\n if (!implementsAspectInterface(ctl)) {\n throw Error(`The aspect ${item.id} must implements interface 'IAspect'.`);\n }\n }\n }\n });\n\n if (componentManager) {\n await componentManager.loadUserComponents();\n } else {\n Logger.Warn('Loading plugins in legacy mode');\n let pluginsConf = this.app.config(undefined, \"plugin\");\n if (Helper.isEmpty(pluginsConf)) {\n pluginsConf = { config: {}, list: [] };\n }\n const pluginConfList = pluginsConf.list ?? [];\n for (const key of pluginConfList) {\n const handle: IPlugin = IOC.get(key, \"COMPONENT\");\n if (!handle) {\n throw Error(`Plugin ${key} load error.`);\n }\n if (!Helper.isFunction(handle.run)) {\n throw Error(`Plugin ${key} must implements interface 'IPlugin'.`);\n }\n if (pluginsConf.config[key] === false) {\n Logger.Warn(`Plugin ${key} already loaded but not effective.`);\n continue;\n }\n\n await handle.run(pluginsConf.config[key] ?? {}, this.app);\n }\n }\n }\n\n\n}\n\n\n","/*\n * @Description: framework bootstrap\n * @Usage: \n * @Author: richen\n * @Date: 2021-12-09 21:56:32\n * @LastEditTime: 2025-01-14 16:11:21\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { IOC } from \"koatty_container\";\nimport { AppEvent, Koatty, KoattyApplication, asyncEvent } from 'koatty_core';\nimport { Helper } from \"koatty_lib\";\nimport { checkRuntime, checkUTRuntime, KOATTY_VERSION } from \"../util/Helper\";\nimport { LOGO } from \"./Constants\";\nimport { Loader } from \"./Loader\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\n/**\n * Decorator function for bootstrapping a Koatty application.\n * \n * @param bootFunc Optional function to be executed during bootstrap process\n * @returns A decorator function that validates and executes the bootstrap process\n * @throws Error if the target class does not inherit from Koatty\n * \n * @example\n * ```typescript\n * app = await ExecBootStrap()(App);\n * ```\n */\nexport function ExecBootStrap(bootFunc?: (...args: any[]) => any) {\n return async (target: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n return await executeBootstrap(target, bootFunc, true);\n };\n}\n\n/**\n * Core bootstrap logic: initialize application, load all components, mark as ready.\n * Does NOT call app.listen() — caller decides how to start the server.\n *\n * @param target - The target class to instantiate the application\n * @param bootFunc - Optional function to execute during bootstrap process\n * @param isInitiative - Whether the bootstrap is initiated manually\n * @returns Promise<KoattyApplication> The fully initialized (but not listening) application instance\n *\n * @internal\n */\nconst bootstrapApplication = async function (target: any, bootFunc?: (...args: any[]) => any,\n isInitiative = false): Promise<KoattyApplication> {\n // Disable winston internal debug logs\n // Filter out winston from NODE_DEBUG to prevent internal logging\n if (process.env.NODE_DEBUG) {\n const debugModules = process.env.NODE_DEBUG.split(',')\n .filter(m => !m.includes('winston'))\n .join(',');\n process.env.NODE_DEBUG = debugModules;\n }\n\n // checked runtime\n checkRuntime();\n // unittest running environment\n const isUTRuntime = checkUTRuntime();\n if (!isInitiative && isUTRuntime) {\n return;\n }\n\n const app = <KoattyApplication>Reflect.construct(target, []);\n // unittest does not print startup logs\n if (isUTRuntime) {\n app.silent = true;\n Logger.enable(false);\n }\n\n if (!app.silent) console.log(LOGO);\n if (!(app instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n\n // Initialize env\n Loader.initialize(app);\n\n // exec bootFunc\n if (Helper.isFunction(bootFunc)) {\n Logger.Log('Koatty', '', 'Execute bootFunc ...');\n await bootFunc(app);\n }\n // Set IOC.app\n IOC.setApp(app);\n\n // Check all bean\n Logger.Log('Koatty', '', 'ComponentScan ...');\n Loader.CheckAllComponents(app, target);\n\n // Load All components\n await Loader.LoadAllComponents(app, target);\n\n // Mark application as ready (all components loaded, middleware registered)\n app.markReady();\n\n return app;\n};\n\n/**\n * Execute bootstrap process for Koatty application (traditional server mode).\n * Calls bootstrapApplication() for initialization, then starts the server.\n *\n * @param target - The target class to instantiate the application\n * @param bootFunc - Optional function to execute during bootstrap process\n * @param isInitiative - Whether the bootstrap is initiated manually\n * @returns Promise<KoattyApplication> The bootstrapped application instance\n */\nconst executeBootstrap = async function (target: any, bootFunc?: (...args: any[]) => any,\n isInitiative = false): Promise<KoattyApplication> {\n try {\n const app = await bootstrapApplication(target, bootFunc, isInitiative);\n if (!app) return; // e.g. UT runtime + not initiative\n\n // Start listening (traditional server mode)\n const isUTRuntime = checkUTRuntime();\n if (!isUTRuntime) {\n app.listen(listenCallback);\n }\n\n return app;\n } catch (err) {\n // COR-02: startup failures must surface. In test/UT runtime or when the\n // bootstrap was invoked programmatically, rethrow so the caller observes\n // the failure (Logger.Fatal would asynchronously exit(1) and kill the\n // test runner). In production, Fatal flushes logs and exits with code 1.\n if (checkUTRuntime() || isInitiative) {\n throw err;\n }\n Logger.Fatal(err);\n process.exitCode = 1;\n }\n};\n\n/**\n * Create a fully initialized Koatty application WITHOUT starting a server.\n *\n * Use this for:\n * - Serverless deployment (AWS Lambda, Alibaba Cloud FC, Tencent SCF, etc.)\n * - Custom server setup (attach handler to an existing HTTP server)\n * - Testing (use app.getRequestHandler() with supertest)\n *\n * @param target - The Koatty application class decorated with @Bootstrap()\n * @param bootFunc - Optional function to execute during bootstrap process\n * @returns Promise<KoattyApplication> A ready application instance (not listening)\n *\n * @example\n * ```typescript\n * // Serverless entry point\n * import { createApplication } from 'koatty';\n * import { App } from './App';\n *\n * let cachedApp: KoattyApplication;\n *\n * export async function handler(req, res) {\n * if (!cachedApp) {\n * cachedApp = await createApplication(App);\n * }\n * return cachedApp.getRequestHandler()(req, res);\n * }\n *\n * // Custom HTTP server\n * import http from 'http';\n * const app = await createApplication(App);\n * http.createServer(app.getRequestHandler()).listen(3000);\n * ```\n */\nexport async function createApplication(\n target: any,\n bootFunc?: (...args: any[]) => any,\n): Promise<KoattyApplication> {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n const app = await bootstrapApplication(target, bootFunc, true);\n if (!app) {\n throw new Error('Failed to initialize application');\n }\n return app;\n}\n\n/**\n * Server listen callback function.\n * Print server information and initialize logger settings.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @returns {void}\n * \n * @internal\n */\nconst listenCallback = (app: KoattyApplication) => {\n Logger.Log('Koatty', '', '====================================');\n Logger.Log(\"Koatty\", \"\", `Nodejs Version: ${process.version}`);\n Logger.Log(\"Koatty\", \"\", `Koatty Version: v${KOATTY_VERSION}`);\n Logger.Log(\"Koatty\", \"\", `App Environment: ${app.env}`);\n if (app.appDebug) Logger.Warn(`Running in debug mode.`);\n Logger.Log('Koatty', '', '====================================');\n \n // Trigger appStart event after server starts listening\n // Listeners are registered via app.once in LoadAppEventHooks\n asyncEvent(app, AppEvent.appStart);\n};\n","/**\n * Decorator for Koatty framework\n * @author richen\n * @copyright Copyright (c) - <richenlin(at)gmail.com>\n * @license BSD (3-Clause)\n * @version 2026-02-03 10:00:00\n */\n\nimport { IOC, TAGGED_CLS } from \"koatty_container\";\nimport { Koatty } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { ExecBootStrap } from \"./Bootstrap\";\nimport { COMPONENT_SCAN, CONFIGURATION_SCAN } from \"./Constants\";\n\n/**\n * Bootstrap decorator for Koatty application class.\n * \n * @param bootFunc Optional function to execute during bootstrap process\n * @returns ClassDecorator\n * @throws Error if target class does not inherit from Koatty\n * \n * @example\n * ```ts\n * @Bootstrap()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function Bootstrap(bootFunc?: (...args: any[]) => any) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n IOC.saveClass('COMPONENT', target, 'KOATTY_APP');\n // The decorator cannot await the bootstrap promise; make sure a startup\n // failure is still fatal (flush logs, exit 1) instead of surfacing as an\n // unhandled rejection that leaves a silently dead process (COR-02).\n ExecBootStrap(bootFunc)(target).catch((err) => {\n Logger.Fatal(err);\n process.exitCode = 1;\n });\n }, 'class');\n}\n\n/**\n * Component scan decorator for Koatty application.\n * Scans the specified path(s) for components and registers them in the IOC container.\n * \n * @param {string | string[]} [scanPath] - The path or array of paths to scan for components\n * @returns {ClassDecorator} A class decorator that enables component scanning\n * @throws {Error} If the decorated class does not inherit from Koatty\n * @example\n * ```typescript\n * @ComponentScan()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function ComponentScan(scanPath?: string | string[]) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n scanPath = scanPath ?? '';\n IOC.saveClassMetadata(TAGGED_CLS, COMPONENT_SCAN, scanPath, target);\n }, 'class');\n}\n\n\n/**\n * Configuration scan decorator, used to scan and load configuration files.\n * \n * @param scanPath - The path or array of paths to scan for configuration files. If not provided, defaults to empty string.\n * @returns A class decorator function that registers configuration scan metadata.\n * @throws Error if the decorated class does not inherit from Koatty.\n * @example\n * ```typescript\n * @ConfigurationScan()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function ConfigurationScan(scanPath?: string | string[]) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n scanPath = scanPath ?? '';\n IOC.saveClassMetadata(TAGGED_CLS, CONFIGURATION_SCAN, scanPath, target);\n }, 'class');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/util/Helper.ts","../src/core/Constants.ts","../src/config/config.ts","../src/config/middleware.ts","../src/config/plugin.ts","../src/config/router.ts","../src/config/server.ts","../src/core/Loader.ts","../src/core/Bootstrap.ts","../src/core/Decorator.ts"],"names":["exports","pkg","require","engines","version","KOATTY_VERSION","ENGINES_VERSION","node","slice","checkClass","fileName","xpath","target","exSet","Helper","isClass","name","Error","undefined","keys","Object","has","add","checkRuntime","nodeEngines","lastIndexOf","nodeVersion","process","toNumber","Logger","Fatal","checkUTRuntime","isUTRuntime","argv","String","indexOf","COMPONENT_SCAN","CONFIGURATION_SCAN","LOGO","logsLevel","list","config","trace","timeout","requestIdHeaderName","requestIdName","encoding","enableTrace","asyncHooks","metricsConf","defaultAttributes","metricsEndpoint","reportInterval","metricsPort","opentelemetryConf","endpoint","enableTopology","headers","resourceAttributes","instrumentations","spanTimeout","maxActiveSpans","samplingRate","batchMaxQueueSize","batchMaxExportSize","batchDelayMillis","batchExportTimeout","retryConf","enabled","count","interval","RouterComponent","ServeComponent","payload","extTypes","json","form","text","multipart","xml","grpc","graphql","websocket","multiples","hostname","env","IP","port","PORT","APP_PORT","protocol","ssl","mode","key","cert","ca","Loader","app","loggingApps","Set","initialize","setLevel","rootPath","cwd","appPath","resolve","appDebug","koattyPath","__dirname","define","isEmpty","safeRequire","dirname","ROOT_PATH","APP_PATH","KOATTY_PATH","THINK_PATH","GetComponentMeta","componentMetas","componentMeta","IOC","getClassMetadata","TAGGED_CLS","isArray","push","length","GetConfigurationMeta","confMeta","configurationMetas","CheckAllComponents","manifestFile","join","Load","xTarget","values","component","container","saveClass","getType","getIdentifier","existsSync","item","listClass","id","options","getPropertyData","scope","clear","SetLogger","data","getMetaData","configs","opt","logLevel","logFilePath","sensFields","toLowerCase","logsPath","enableBatch","setBatchConfig","maxSize","flushInterval","silent","LOGS_PATH","setLogFilePath","setSensFields","once","AppEvent","appStop","flushBatch","delete","size","LoadAllComponents","isFunction","preloadMetadata","error","configurationMeta","loader","event","AppEventArr","appBoot","Log","LoadConfigs","asyncEvent","loadConfigure","loadComponent","componentManager","ComponentManager","discoverComponents","stats","getStats","coreComponents","userComponents","LoadComponents","registerAppEvents","registerCoreComponentHooks","loadPlugin","loadMiddleware","LoadMiddlewares","loadService","LoadServices","loadController","LoadControllers","loadRouter","loadServe","ready","appReady","seal","loadPath","frameConfig","clone","defaultConfig","middleware","defaultMiddleware","plugin","defaultPlugin","router","defaultRouter","server","defaultServer","manifest","appConfig","loadConf","baseDir","extend","setMetaData","middlewareConf","traceOptions","tracer","Trace","use","Debug","Warn","message","appMiddleware","forEach","replace","reg","type","args","ctl","getInsByClass","implementsMiddlewareInterface","middlewareList","appMList","middlewareConfig","Array","from","handle","get","run","middlewareOpt","middlewareClass","find","m","decoratorOptions","MIDDLEWARE_OPTIONS","mergedOptions","result","protocols","protocolMiddleware","useExp","controllerList","controllers","serviceList","implementsServiceInterface","componentList","endsWith","implementsAspectInterface","loadUserComponents","pluginsConf","pluginConfList","ExecBootStrap","bootFunc","prototype","Koatty","executeBootstrap","bootstrapApplication","isInitiative","NODE_DEBUG","debugModules","split","filter","includes","Reflect","construct","enable","console","log","Container","setApp","markReady","listen","listenCallback","err","exitCode","createApplication","Bootstrap","createDecorator","_context","catch","ComponentScan","scanPath","saveClassMetadata","ConfigurationScan"],"mappings":"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","file":"index.mjs","sourcesContent":["{\n \"name\": \"koatty\",\n \"version\": \"5.0.0\",\n \"description\": \"Koa + Typescript = koatty. Use Typescript's decorator implement auto injection.\",\n \"scripts\": {\n \"build\": \"pnpm run build:js && pnpm run build:dts && pnpm run build:doc && pnpm run build:cp\",\n \"build:js\": \"tsup\",\n \"build:dts\": \"bash scripts/build-dts.sh\",\n \"build:doc\": \"api-documenter markdown --input temp --output docs/api\",\n \"build:cp\": \"node scripts/copyFiles && node ../../scripts/postBuild.js\",\n \"clean\": \"rimraf dist temp docs/api\",\n \"lint\": \"eslint --ext .ts,.js ./src\",\n \"test\": \"pnpm run lint && jest --passWithNoTests\",\n \"test:cov\": \"jest --collectCoverage --detectOpenHandles\",\n \"test:example\": \"jest --config examples/mcp-order-service/jest.config.js --coverage=false\"\n },\n \"main\": \"./dist/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"keywords\": [\n \"koatty\",\n \"koa\",\n \"typescript\",\n \"framework\",\n \"mvc\",\n \"http\",\n \"https\",\n \"websocket\",\n \"grpc\",\n \"quic\",\n \"http2\",\n \"http3\",\n \"di\",\n \"aop\",\n \"ioc\",\n \"inversion of control\",\n \"dependency injection\",\n \"aspect-oriented programming\",\n \"decorator\",\n \"decorator pattern\",\n \"decorator factory\"\n ],\n \"directories\": {\n \"doc\": \"docs\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/koatty/koatty.git\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"author\": {\n \"name\": \"richenlin\",\n \"email\": \"richenlin@gmail.com\"\n },\n \"license\": \"BSD-3-Clause\",\n \"bugs\": {\n \"url\": \"https://github.com/koatty/koatty/issues\"\n },\n \"homepage\": \"https://github.com/koatty/koatty\",\n \"maintainers\": [\n {\n \"name\": \"richenlin\",\n \"email\": \"richenlin@gmail.com\"\n }\n ],\n \"devDependencies\": {\n \"@grpc/grpc-js\": \"^1.12.2\",\n \"@microsoft/api-documenter\": \"^7.26.x\",\n \"@microsoft/api-extractor\": \"^7.52.x\",\n \"@types/formidable\": \"^3.x.x\",\n \"@types/jest\": \"^29.5.x\",\n \"@types/koa\": \"^2.x.x\",\n \"@types/koa-compose\": \"^3.x.x\",\n \"@types/lodash\": \"^4.x.x\",\n \"@types/node\": \"^22.x.x\",\n \"@types/on-finished\": \"^2.x.x\",\n \"@types/supertest\": \"^6.x.x\",\n \"@types/ws\": \"^8.x.x\",\n \"@typescript-eslint/eslint-plugin\": \"^8.x.x\",\n \"@typescript-eslint/parser\": \"^8.x.x\",\n \"eslint\": \"^8.x.x\",\n \"eslint-plugin-jest\": \"^28.x.x\",\n \"jest\": \"^29.x.x\",\n \"jest-html-reporters\": \"^3.x.x\",\n \"koatty_validation\": \"workspace:*\",\n \"reflect-metadata\": \"^0.2.2\",\n \"supertest\": \"^7.x.x\",\n \"ts-jest\": \"^29.x.x\",\n \"tslib\": \"^2.x.x\"\n },\n \"dependencies\": {\n \"koa\": \"^3.1.2\",\n \"koatty_config\": \"workspace:*\",\n \"koatty_container\": \"workspace:*\",\n \"koatty_core\": \"workspace:*\",\n \"koatty_exception\": \"workspace:*\",\n \"koatty_lib\": \"workspace:*\",\n \"koatty_loader\": \"workspace:*\",\n \"koatty_logger\": \"workspace:*\",\n \"koatty_router\": \"workspace:*\",\n \"koatty_serve\": \"workspace:*\",\n \"koatty_trace\": \"workspace:*\",\n \"ts-morph\": \"^27.0.2\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"README.md\",\n \"CHANGELOG.md\",\n \"LICENSE\"\n ]\n}\n","/*\n * @Description: framework helper\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2025-01-14 16:14:10\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { Helper } from \"koatty_lib\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\nconst pkg = require(\"../../package.json\");\nconst { engines, version } = pkg;\n\nconst STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nconst ARGUMENT_NAMES = /([^\\s,]+)/g;\n\nexport const KOATTY_VERSION = version;\nexport const ENGINES_VERSION = engines.node.slice(1) || '12.0.0';\n\n/**\n * require default export\n *\n * @export\n * @param {string} p\n * @returns\n */\nexport function requireDefault(p: string) {\n // Dynamic require is necessary for runtime module loading\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const ex = require(p);\n return (ex && (typeof ex === \"object\") && \"default\" in ex) ? ex.default : ex;\n}\n\n/**\n * controller match\n *\n * @export\n * @param {string} name\n * @param {string} [controllerSuffix=\"\"]\n * @returns\n */\nlet controllerReg: any = null;\nexport function ControllerMatch(name: string, controllerSuffix = \"\") {\n if (!controllerReg) {\n controllerReg = new RegExp(`([a-zA-Z0-9_]+)${controllerSuffix}`);\n }\n\n const result = name.split(\".\")[0].match(controllerReg);\n return result;\n}\n\n\n/**\n * get parameter name from function\n * @param func\n */\nexport function getParamNames(func: { toString: () => { replace: (arg0: RegExp, arg1: string) => any } }) {\n const fnStr = func.toString().replace(STRIP_COMMENTS, \"\");\n let result = fnStr.slice(fnStr.indexOf(\"(\") + 1, fnStr.indexOf(\")\")).match(ARGUMENT_NAMES);\n if (result === null) {\n result = [];\n }\n return result;\n}\n\n/**\n * Check class file \n * name should be always the same as class name\n * class must be unique\n *\n * @export\n * @param {string} fileName\n * @param {string} xpath\n * @param {*} target\n * @param {Set<unknown>} [exSet]\n * @returns {*} \n */\nexport function checkClass(fileName: string, xpath: string, target: any, exSet?: Set<unknown>) {\n if (Helper.isClass(target) && target.name != fileName) { // export default class name{}\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n if (target[\"__esModule\"]) {\n if (target.name === undefined) { // export class name{}\n const keys = Object.keys(target);\n if (keys[0] != fileName && Helper.isClass(target[keys[0]])) {\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n } else if (target.name != fileName) { // export default class {}\n throw Error(`The file(${xpath}) name should be always the same as class name.`);\n }\n }\n if (!exSet) {\n return;\n }\n if (exSet.has(fileName)) {\n throw new Error(`A same class already exists. at \\`${xpath}\\`.`);\n }\n exSet.add(fileName);\n\n return;\n}\n\n/**\n * check node version\n * @return {void} []\n */\nexport function checkRuntime() {\n let nodeEngines = ENGINES_VERSION;\n nodeEngines = nodeEngines.slice(0, nodeEngines.lastIndexOf('.'));\n let nodeVersion = process.version;\n if (nodeVersion[0] === 'v') {\n nodeVersion = nodeVersion.slice(1);\n }\n nodeVersion = nodeVersion.slice(0, nodeVersion.lastIndexOf('.'));\n\n if (Helper.toNumber(nodeEngines) > Helper.toNumber(nodeVersion)) {\n Logger.Fatal(`Koatty need node version > ${nodeEngines}, current version is ${nodeVersion}, please upgrade it.`);\n }\n}\n\n/**\n * unittest running environment detection\n * only support jest\n * @returns {boolean}\n */\nexport const checkUTRuntime = (): boolean => {\n let isUTRuntime = false;\n // UT runtime detection, only support jest\n const argv = String(process.argv[1] ?? \"\");\n if (argv.indexOf('jest') > -1) {\n isUTRuntime = true;\n }\n return isUTRuntime;\n};","/*\n * @Description: framework constants\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2023-12-09 23:00:13\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nexport const COMPONENT_SCAN = 'COMPONENT_SCAN';\nexport const CONFIGURATION_SCAN = 'CONFIGURATION_SCAN';\nexport const PRIORITY_KEY = 'PRIORITY_KEY';\n\n// tslint:disable: no-irregular-whitespace\nexport const LOGO = `\n\n┬┌─┌─┐┌─┐┌┬┐┌┬┐┬ ┬\n├┴┐│ │├─┤ │ │ └┬┘\n┴ ┴└─┘┴ ┴ ┴ ┴ ┴ \n-------------------------------------------\nhttps://github.com/koatty\n`;","/*\n * @Description: app config\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2025-03-15 17:18:20\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nexport default {\n /*app config*/\n logsLevel: \"debug\", // Level log is printed to the console, \"debug\" | \"info\" | \"warning\" | \"error\"\n // logsPath: \"./logs\", // Log file directory\n // sensFields: [\"password\"] // Defined privacy fields will not be printed in logs.\n\n};","/*\n * @Description: middleware config\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2023-12-09 22:40:07\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nexport default {\n // List of loaded middleware(except for the middleware loaded by default), \n // executed in the order of elements\n list: [],\n // middleware configuration\n config: {\n // ============================================\n // Trace Middleware - 请求链路追踪中间件\n // ============================================\n // Koatty-Trace 用于追踪请求链路、记录日志、收集指标\n // 它会自动作为第一个中间件加载,无需添加到 list 中\n trace: {\n // response timeout in milliseconds\n timeout: 10000,\n // request id header name\n requestIdHeaderName: 'X-Request-Id',\n // request id name\n requestIdName: \"requestId\",\n // id generator function\n // idFactory: Function,\n // encoding\n encoding: 'utf-8',\n // Whether to enable trace (default: false)\n enableTrace: false,\n // asynchooks enabled\n asyncHooks: false,\n /**\n * Metrics configuration\n */\n metricsConf: {\n /**\n * Metrics reporter function\n */\n // reporter: (metrics: {\n // duration: number,\n // status: number,\n // path: string,\n // attributes: Record<string, any>,\n // }) => void,\n /**\n * Default attributes for metrics\n */\n defaultAttributes: {},\n /**\n * Prometheus metrics endpoint (production only)\n */\n metricsEndpoint: '/metrics',\n /**\n * Metrics report interval in milliseconds (default: 5000)\n */\n reportInterval: 5000,\n /**\n * Prometheus metrics port (default: 9464)\n */\n metricsPort: 9464,\n },\n\n /**\n * OpenTelemetry configuration\n */\n opentelemetryConf: {\n /**\n * OTLP endpoint URL\n */\n endpoint: \"http://localhost:4318/v1/traces\",\n /**\n * Whether to enable topology analysis (default: same as enableTrace)\n * \n */\n enableTopology: false,\n /**\n * OTLP headers\n */\n headers: {},\n /**\n * Resource attributes\n */\n resourceAttributes: {},\n /**\n * Instrumentations to enable\n */\n instrumentations: [],\n /**\n * Exporter timeout in milliseconds\n */\n timeout: 10000,\n /**\n * Maximum lifetime for a span in milliseconds\n */\n spanTimeout: 30000,\n /**\n * Maximum number of active spans in memory (default: 1000)\n */\n maxActiveSpans: 1000,\n /**\n * Request attributes to be added to the span\n */\n // spanAttributes: (ctx: KoattyContext) => Record<string, any>,\n\n /**\n * Sampling rate (0.0 - 1.0)\n */\n samplingRate: 1.0,\n /**\n * Maximum number of spans in batch queue\n */\n batchMaxQueueSize: 2048,\n /**\n * Maximum number of spans to export in one batch\n */\n batchMaxExportSize: 512,\n /**\n * Delay between batch exports in milliseconds\n */\n batchDelayMillis: 5000,\n /**\n * Timeout for batch export in milliseconds\n */\n batchExportTimeout: 30000,\n },\n /**\n * Retry configuration\n */\n retryConf: {\n /**\n * Whether to enable retry mechanism (default: false)\n */\n enabled: false,\n /**\n * Max retry count when error occurs (default: 3)\n */\n count: 3,\n /**\n * Retry interval in milliseconds (default: 1000)\n */\n interval: 1000,\n /**\n * Custom function to determine if error should be retried\n */\n // conditions: (error: any) => boolean,\n },\n }\n }\n};\n","/*\n * @Description: plugin config\n * @Usage:\n * @Author: richen\n * @Date: 2023-12-09 21:56:32\n * @LastEditTime: 2023-12-09 22:17:13\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\n\nexport default {\n // ============================================================\n // User plugin loading list (executed in order)\n // Note: Core components (@Component) are loaded automatically\n // ============================================================\n list: [\n // 'AuthPlugin', // Authentication plugin\n // 'CachePlugin', // Cache plugin\n // 'SchedulePlugin', // Scheduled task plugin\n ],\n\n // ============================================================\n // Component/Plugin configuration\n // ============================================================\n config: {\n // --- Core components (@Component) ---\n // Framework built-in components, usually do not need to modify\n // Can be disabled by setting enabled: false\n RouterComponent: {\n enabled: true,\n },\n ServeComponent: {\n enabled: true,\n },\n\n // --- User plugins (@Plugin) ---\n // Configuration for user-defined plugins\n // AuthPlugin: {\n // enabled: true,\n // // Plugin-specific configuration\n // secret: 'your-jwt-secret',\n // },\n // CachePlugin: {\n // enabled: true,\n // redis: {\n // host: 'localhost',\n // port: 6379,\n // },\n // },\n }\n};","/**\n * @Description: Router config\n * @Usage: Configure router settings for the application\n * @Author: richen\n * @Date: 2020-12-22 15:24:25\n * @LastEditTime: 2025-03-12 17:40:08\n */\n\nexport default {\n /**\n * prefix of the router\n */\n // prefix: string,\n\n /**\n * Methods which should be supported by the router.\n */\n // methods?: string[];\n // routerPath?: string;\n /**\n * Whether or not routing should be case-sensitive.\n */\n // sensitive?: boolean;\n /**\n * Whether or not routes should matched strictly.\n *\n * If strict matching is enabled, the trailing slash is taken into\n * account when matching routes.\n */\n // strict?: boolean;\n\n /**\n * payload options\n *\n */\n payload: {\n extTypes: {\n json: ['application/json'],\n form: ['application/x-www-form-urlencoded'],\n text: ['text/plain'],\n multipart: ['multipart/form-data'],\n xml: ['text/xml'],\n grpc: ['application/grpc'],\n graphql: ['application/graphql+json'],\n websocket: ['application/websocket']\n },\n // body-size limit intentionally unset (ADR-102): the security profile\n // decides (1mb in production, 20mb in development) unless the project\n // config/router.ts sets payload.limit explicitly\n encoding: 'utf-8',\n multiples: true,\n // keepExtensions intentionally unset: defaults to false (SEC-05) —\n // never keep attacker-controlled extensions for uploaded temp files\n },\n\n\n /**\n * protocol specific extension config\n *\n * all protocol specific parameters are placed in this field:\n * - WebSocket: { maxFrameSize, heartbeatInterval, maxConnections, ... }\n * - gRPC: { protoFile, poolSize, batchSize, streamConfig, ... }\n * - GraphQL: { schemaFile, playground, introspection, keyFile, crtFile, ssl, http2, ... }\n * - HTTP/HTTPS/HTTP2: reserved extension fields\n *\n * **Important: GraphQL Protocol and Transport**\n * GraphQL is an application-layer protocol that runs over HTTP/HTTPS/HTTP2.\n * When protocol is set to 'graphql', koatty_serve will automatically:\n * - Use HTTP as transport by default\n * - Use HTTP/2 when SSL certificates (keyFile/crtFile) are configured\n *\n * HTTP/2 benefits for GraphQL:\n * - Multiplexing: Handle multiple queries over single connection\n * - Header compression: Reduce bandwidth for large queries\n * - Server push: Prefetch related resources\n * - HTTP/1.1 fallback: Automatic downgrade for compatibility\n *\n * To enable HTTP/2 for GraphQL, add SSL certificate configuration in ext.graphql:\n *\n * For multi-protocol support, use protocol name as key:\n * ext: {\n * http: {},\n * grpc: { protoFile: \"./proto/service.proto\" },\n * graphql: {\n * schemaFile: \"./schema.graphql\",\n * keyFile: \"./ssl/server.key\", // Enable HTTPS for GraphQL\n * crtFile: \"./ssl/server.crt\"\n * },\n * ws: { maxFrameSize: 1024 * 1024 }\n * }\n *\n * @example\n * ```typescript\n *\n * // Multi-protocol config (recommended for multi-protocol servers)\n * ext: {\n * http: {},\n * grpc: {\n * protoFile: \"./proto/service.proto\",\n * poolSize: 10,\n * streamConfig: { maxConcurrentStreams: 50 }\n * },\n * graphql: {\n * schemaFile: \"./resource/graphql/schema.graphql\",\n * // Optional: Enable HTTP/2 with SSL for GraphQL\n * // keyFile: \"./ssl/server.key\",\n * // crtFile: \"./ssl/server.crt\",\n * // ssl: { mode: 'auto', allowHTTP1: true },\n * // http2: { maxConcurrentStreams: 100 }\n * },\n * ws: {\n * maxFrameSize: 1024 * 1024,\n * heartbeatInterval: 15000,\n * maxConnections: 1000\n * }\n * }\n * ```\n */\n // ext?: Record<string, any>;\n\n}","/**\n * @Description: Server config \n * @Usage: Configure server settings for the application\n * @Author: richen\n * @Date: 2020-12-22 15:24:25\n * @LastEditTime: 2026-01-30 15:00:00\n */\n\nexport default {\n hostname: process.env.IP || '127.0.0.1', // server hostname\n // server port: single value (e.g. 3000) or array (e.g. [3000, 3001])\n // For multi-protocol: if port is array, each port maps to corresponding protocol\n // If port is single value, first protocol uses it, others auto-increment (3000, 3001, 3002...)\n port: process.env.PORT || process.env.APP_PORT || 3000,\n // Server protocol: 'http' | 'https' | 'http2' | 'grpc' | 'ws' | 'wss' | 'graphql'\n // For multi-protocol: use array like [\"http\", \"grpc\"] and configure ext below\n protocol: \"http\",\n trace: false, // Full stack debug & trace, default: false\n ssl: {\n mode: 'auto', // 'auto' | 'manual' | 'mutual_tls'\n key: '', // key file path\n cert: '', // crt file path\n ca: '' // ca file path\n },\n // Protocol-specific configuration (required for grpc, ws, graphql)\n // ext: {\n // grpc: { protoFile: \"./proto/service.proto\", poolSize: 10 },\n // ws: { maxConnections: 1000, heartbeatInterval: 30000 },\n // graphql: { schemaFile: \"./schema.graphql\", playground: true }\n // }\n}","/*\n * @Description: framework loader\n * @Usage: \n * @Author: richen\n * @Date: 2023-12-09 22:55:49\n * @LastEditTime: 2025-03-13 16:44:39\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\n\nimport { LoadConfigs as loadConf } from \"koatty_config\";\nimport { IOC, TAGGED_CLS } from \"koatty_container\";\nimport {\n AppEvent, AppEventArr, IMiddleware, IMiddlewareOptions, protocolMiddleware,\n implementsAspectInterface,\n implementsMiddlewareInterface,\n implementsServiceInterface, IPlugin, KoattyApplication, Koatty, MIDDLEWARE_OPTIONS,\n ComponentManager, asyncEvent\n} from 'koatty_core';\nimport { Helper } from \"koatty_lib\";\nimport { Load } from \"koatty_loader\";\nimport { Trace } from \"koatty_trace\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport { checkClass } from \"../util/Helper\";\nimport { COMPONENT_SCAN, CONFIGURATION_SCAN } from './Constants';\nimport { DefaultLogger as Logger, LogLevelType } from \"koatty_logger\";\n\nimport defaultConfig from '../config/config';\nimport defaultMiddleware from '../config/middleware';\nimport defaultPlugin from '../config/plugin';\nimport defaultRouter from '../config/router';\nimport defaultServer from '../config/server';\n\n/**\n * Interface representing a component item.\n * @interface ComponentItem\n * @property {string} id - Unique identifier for the component\n * @property {any} target - Target object or instance of the component\n */\ninterface ComponentItem {\n id: string;\n target: any;\n}\n\n/**\n * Loader class for Koatty framework.\n * Handles initialization, loading and configuration of application components.\n * \n * Responsibilities:\n * - Initialize environment and paths\n * - Load configurations, components, middlewares, services and controllers\n * - Set up logging\n * - Handle application event hooks\n * - Load and configure router\n * \n * @export\n * @class Loader\n */\nexport class Loader {\n app: KoattyApplication;\n private static loggingApps = new Set<KoattyApplication>();\n\n /**\n * Creates an instance of Loader.\n * @param {KoattyApplication} app\n * @memberof Loader\n */\n constructor(app: KoattyApplication) {\n this.app = app;\n }\n\n /**\n * Initialize application configuration and environment settings.\n * Sets up logging levels, defines essential paths, and loads application metadata.\n *\n * @param {KoattyApplication} app - The Koatty application instance\n * - Sets logging level based on environment\n * - Defines root, app and framework paths on app object\n * - Loads application name and version from package.json\n * - Sets environment variables for paths\n * - Maintains backward compatibility with legacy path variables\n */\n public static initialize(app: KoattyApplication) {\n if (app.env == 'development') {\n Logger.setLevel(\"debug\");\n } else {\n Logger.setLevel(\"info\");\n }\n // define path\n const rootPath = app.rootPath || process.cwd();\n const appPath = app.appPath || path.resolve(rootPath, app.appDebug ? 'src' : 'dist');\n const koattyPath = path.resolve(__dirname, '..');\n Helper.define(app, 'rootPath', rootPath);\n Helper.define(app, 'appPath', appPath);\n Helper.define(app, 'koattyPath', koattyPath);\n\n //\n if (Helper.isEmpty(app.name)) {\n const pkg = Helper.safeRequire(`${path.dirname(appPath)}/package.json`);\n if (pkg.name) {\n app.name = pkg.name;\n app.version = app.version || pkg.version;\n }\n }\n\n // Canonical path record (ARCH-01 / D-1 step 5). New code should read\n // `app.paths`; the individual `app.rootPath` / `app.appPath` /\n // `app.koattyPath` fields remain for backward compatibility.\n Helper.define(app, 'paths', { rootPath, appPath, koattyPath });\n\n // Set environment variables for backward compatibility \n // Use app.rootPath, app.appPath, app.koattyPath instead\n // @deprecated Use `app.paths` (or the individual app.*Path fields). These\n // process-level writes will be removed in 5.0.\n process.env.ROOT_PATH = rootPath;\n process.env.APP_PATH = appPath;\n process.env.KOATTY_PATH = koattyPath;\n\n // Compatible with old version, will be deprecated, do not use it in new code\n process.env.THINK_PATH = koattyPath;\n Helper.define(app, 'thinkPath', koattyPath);\n }\n\n /**\n * Get component metadata from target class.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @param {any} target - The target class to get metadata from\n * @returns {any[]} Array of component metadata paths\n * \n * @static\n * @public\n */\n public static GetComponentMeta(app: KoattyApplication, target: any): any[] {\n let componentMetas = [];\n const componentMeta = IOC.getClassMetadata(TAGGED_CLS, COMPONENT_SCAN, target);\n if (componentMeta) {\n if (Helper.isArray(componentMeta)) {\n componentMetas = componentMeta;\n } else {\n componentMetas.push(componentMeta);\n }\n }\n if (componentMetas.length < 1) {\n componentMetas = [app.appPath];\n }\n return componentMetas;\n }\n\n /**\n * Get configuration metadata from target class.\n * \n * @param {KoattyApplication} app Application instance\n * @param {any} target Target class\n * @returns {any[]} Array of configuration metadata\n */\n public static GetConfigurationMeta(app: KoattyApplication, target: any): any[] {\n const confMeta = IOC.getClassMetadata(TAGGED_CLS, CONFIGURATION_SCAN, target);\n let configurationMetas = [];\n if (confMeta) {\n if (Helper.isArray(confMeta)) {\n configurationMetas = confMeta;\n } else {\n configurationMetas.push(confMeta);\n }\n }\n return configurationMetas;\n }\n\n /**\n * Check and load all components(excepted config/*、App.ts) in the application.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @param {any} target - The target class or object to check components from\n * @static\n * @public\n */\n public static CheckAllComponents(app: KoattyApplication, target: any) {\n // component metadata\n const componentMetas = Loader.GetComponentMeta(app, target);\n // configuration metadata\n const configurationMetas = Loader.GetConfigurationMeta(app, target);\n const exSet = new Set();\n const manifestFile = path.join(app.rootPath, \".koatty\", \"manifest.json\");\n Load(componentMetas, app.rootPath, (fileName: string, xpath: string, xTarget: any) => {\n checkClass(fileName, xpath, xTarget, exSet);\n const exports = typeof xTarget === 'function' ? [xTarget] : Object.values(xTarget ?? {});\n for (const component of exports) {\n if (Helper.isClass(component)) app.container.saveClass(IOC.getType(component), component as Function, IOC.getIdentifier(component));\n }\n }, ['**/**.js', '**/**.ts', '!**/**.d.ts'], [...configurationMetas, `${target.name || '.no'}.ts`, `${target.name || '.no'}.js`], {\n manifestFile: app.env === 'production' && fs.existsSync(manifestFile) ? manifestFile : undefined,\n });\n for (const item of IOC.listClass('COMPONENT')) {\n const id = IOC.getIdentifier(item.target);\n const options = IOC.getPropertyData<any>('COMPONENT_OPTIONS', item.target, id);\n if (options?.scope === 'core') app.container.saveClass('COMPONENT', item.target, id);\n }\n exSet.clear();\n }\n\n /**\n * Set logger configuration for the Koatty application.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @description Configures logging settings based on application environment and config options.\n * Handles log level, log file path, and sensitive fields configuration.\n * In production environment, default log level is 'info', otherwise 'debug'.\n */\n public static SetLogger(app: KoattyApplication) {\n const data = app.getMetaData('_configs') || [];\n const configs = data[0] || {};\n //Logger\n if (configs.config) {\n Loader.loggingApps.add(app);\n const opt = configs.config;\n let logLevel: LogLevelType = \"debug\",\n logFilePath = \"\",\n sensFields = [];\n if (app.env === \"production\") {\n logLevel = \"info\";\n }\n if (opt.logsLevel) {\n logLevel = (opt.logsLevel).toLowerCase();\n }\n if (opt.logsPath) {\n logFilePath = opt.logsPath;\n }\n if (opt.sensFields) {\n sensFields = opt.sensFields;\n }\n if (!app.appDebug) {\n Logger.enableBatch(true);\n Logger.setBatchConfig({\n maxSize: 200,\n flushInterval: 500\n });\n }\n if (logLevel) {\n Logger.setLevel(logLevel);\n }\n if (logFilePath && !app.silent) {\n Helper.define(app, \"logsPath\", logFilePath);\n process.env.LOGS_PATH = logFilePath;\n Logger.setLogFilePath(logFilePath);\n }\n if (sensFields) {\n Logger.setSensFields(sensFields);\n }\n (app as any).once(AppEvent.appStop, async () => {\n await Logger.flushBatch(); // 等待所有日志写入完成\n Loader.loggingApps.delete(app);\n // Keep the shared logger usable, but do not leave an idle batch timer\n // alive after the last application has stopped.\n if (Loader.loggingApps.size === 0) Logger.enableBatch(false);\n });\n }\n }\n\n /**\n * Load all components and initialize the application.\n * \n * @param app - The KoattyApplication instance\n * @param target - The target class or object containing configuration metadata\n * \n * This method performs the following initialization steps:\n * 1. Loads configurations\n * 2. Creates server and router instances\n * 3. Loads components, middlewares, services and controllers\n * 4. Sets up routing\n * \n * @static\n * @async\n */\n public static async LoadAllComponents(app: KoattyApplication, target: any) {\n try {\n if (Helper.isFunction((app.container as any).preloadMetadata)) {\n (app.container as any).preloadMetadata();\n }\n } catch (error) {\n Logger.Error('[Loader] preloadMetadata failed:', error);\n }\n\n const configurationMeta = Loader.GetConfigurationMeta(app, target);\n const loader = new Loader(app);\n\n for (const event of AppEventArr) {\n switch (event) {\n case AppEvent.appBoot:\n Logger.Log('Koatty', '', 'Load Configurations ...');\n loader.LoadConfigs(configurationMeta);\n Loader.SetLogger(app);\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadConfigure:\n Logger.Log('Koatty', '', 'Emit loadConfigure ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadComponent:\n Logger.Log('Koatty', '', 'Initializing Component Manager ...');\n const componentManager = new ComponentManager(app);\n Helper.define(app, 'componentManager', componentManager);\n\n // Step 1: Discover components (scan metadata)\n componentManager.discoverComponents();\n \n const stats = componentManager.getStats();\n Logger.Log('Koatty', '', `Discovered ${stats.coreComponents} core components, ${stats.userComponents} user components`);\n\n // Step 2: Load components (create instances)\n Logger.Log('Koatty', '', 'Load Components ...');\n await loader.LoadComponents(componentManager);\n\n // Step 3: Register event hooks (instances now exist)\n componentManager.registerAppEvents(target);\n componentManager.registerCoreComponentHooks();\n \n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadPlugin:\n Logger.Log('Koatty', '', 'Emit loadPlugin ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadMiddleware:\n Logger.Log('Koatty', '', 'Load Middlewares ...');\n await loader.LoadMiddlewares();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadService:\n Logger.Log('Koatty', '', 'Load Services ...');\n await loader.LoadServices();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadController:\n Logger.Log('Koatty', '', 'Load Controllers ...');\n await loader.LoadControllers();\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadRouter:\n Logger.Log('Koatty', '', 'Initialize Router and Load Routes ...');\n // RouterComponent.initRouter() handles both router creation and route loading\n await asyncEvent(app, event);\n break;\n\n case AppEvent.loadServe:\n await app.container?.ready?.();\n Logger.Log('Koatty', '', 'Emit loadServe ...');\n await asyncEvent(app, event);\n break;\n\n case AppEvent.appReady:\n Logger.Log('Koatty', '', 'Emit appReady ...');\n await asyncEvent(app, event);\n await app.container?.ready?.();\n app.container?.seal?.();\n break;\n\n default:\n await asyncEvent(app, event);\n break;\n }\n }\n }\n\n /**\n * Load configuration files from specified paths.\n * First loads framework configurations from './config' directory,\n * then loads application configurations from custom paths.\n * Finally merges both configurations with framework configs as lower priority.\n * \n * @protected\n * @param {string[]} [loadPath] - Optional array of paths to load application configs from\n */\n protected LoadConfigs(loadPath?: string[]) {\n // Bundle defaults into the package: a tsup single-file build has no sibling\n // config directory. Clone before merging so applications cannot share mutations.\n const frameConfig: any = Helper.clone({config: defaultConfig, middleware: defaultMiddleware,\n plugin: defaultPlugin, router: defaultRouter, server: defaultServer}, true);\n\n if (Helper.isArray(loadPath)) {\n loadPath = loadPath.length > 0 ? loadPath : [\"./config\"];\n }\n const manifest = path.join(this.app.rootPath, '.koatty/manifest.json');\n let appConfig = loadConf(loadPath, this.app.appPath, undefined, undefined, undefined,\n this.app.env === 'production' && fs.existsSync(manifest)\n ? {manifestFile: manifest, baseDir: this.app.rootPath} : undefined);\n appConfig = Helper.extend(frameConfig, appConfig, true);\n\n this.app.setMetaData(\"_configs\", appConfig);\n }\n\n /**\n * Load and register middleware components.\n * Processes middleware configuration, registers middleware classes with IOC container,\n * and mounts middleware to the application.\n * Supports protocol-specific middleware mounting via @Middleware({ protocol }) option.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When middleware doesn't implement IMiddleware interface\n * @throws {Error} When middleware loading fails\n */\n protected async LoadMiddlewares() {\n // ============================================\n // Load middleware configuration\n // ============================================\n let middlewareConf = this.app.config(undefined, \"middleware\");\n if (Helper.isEmpty(middlewareConf)) {\n middlewareConf = { config: {}, list: []};\n }\n \n // ============================================\n // Trace Middleware(请求链路追踪中间件)\n // ============================================\n // Koatty-Trace 是一个纯粹的 Middleware\n // 配置位置:config/middleware.ts 中的 config.trace\n // \n // 作为第一个加载的中间件,用于追踪整个请求链路\n try {\n const traceOptions = middlewareConf.config?.trace ?? {};\n const tracer = Trace(traceOptions, this.app as Koatty) as any;\n Helper.define(this.app, \"tracer\", tracer);\n this.app.use(tracer);\n Logger.Debug(`Trace middleware registered`);\n } catch (error: any) {\n Logger.Warn(`Trace middleware failed to load: ${error.message}`);\n }\n\n //Mount application middleware\n const appMiddleware = this.app.container.listClass(\"MIDDLEWARE\") ?? [];\n appMiddleware.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"MIDDLEWARE:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n this.app.container.reg(item.id, item.target, { scope: \"Prototype\", type: \"MIDDLEWARE\", args: [] });\n const ctl = this.app.container.getInsByClass(item.target);\n if (!implementsMiddlewareInterface(ctl)) {\n throw Error(`The middleware ${item.id} must implements interface 'IMiddleware'.`);\n }\n }\n });\n\n const middlewareList = middlewareConf.list || [];\n //de-duplication\n const appMList = new Set([]);\n middlewareList.forEach((item: string) => {\n appMList.add(item);\n });\n\n //Automatically call middleware\n const middlewareConfig = middlewareConf.config || {};\n for (const key of Array.from(appMList)) {\n const handle: IMiddleware = this.app.container.get(key, \"MIDDLEWARE\");\n if (!handle) {\n throw Error(`Middleware ${key} load error.`);\n }\n if (!Helper.isFunction(handle.run)) {\n throw Error(`The middleware ${key} must implements interface 'IMiddleware'.`);\n }\n \n Logger.Debug(`Load middleware: ${key}`);\n const middlewareOpt = middlewareConfig[key] || {};\n \n // Get middleware options from decorator metadata\n const middlewareClass = appMiddleware.find(m => m.id === key)?.target;\n let decoratorOptions: IMiddlewareOptions = {};\n if (middlewareClass) {\n try {\n decoratorOptions = this.app.container.getPropertyData(MIDDLEWARE_OPTIONS, middlewareClass, key) || {};\n } catch {\n // If metadata not found, use empty object\n decoratorOptions = {};\n }\n }\n \n // Merge decorator options with config options (config has higher priority)\n const mergedOptions: IMiddlewareOptions = { ...decoratorOptions, ...middlewareOpt };\n \n // Check if middleware is disabled\n if (mergedOptions.enabled === false) {\n Logger.Warn(`The middleware ${key} has been loaded but is disabled.`);\n continue;\n }\n \n // Execute middleware handler\n const result = await handle.run(mergedOptions, this.app);\n if (Helper.isFunction(result)) {\n let middleware = result;\n \n // Wrap with protocol filter if protocol option is specified\n if (mergedOptions.protocol) {\n const protocols = Helper.isArray(mergedOptions.protocol) \n ? mergedOptions.protocol \n : [mergedOptions.protocol];\n \n Logger.Log(\n 'Koatty', \n '', \n `Middleware ${key} limited to protocols: ${protocols.join(', ')}`\n );\n \n middleware = protocolMiddleware(protocols, result);\n }\n \n // Mount middleware\n if (middleware.length < 3) {\n this.app.use(middleware);\n } else {\n this.app.useExp(middleware);\n }\n }\n }\n }\n\n /**\n * Load and register controller classes from IOC container.\n * Each controller must implement the IController interface.\n * \n * @returns {Promise<string[]>} A promise that resolves to an array of controller IDs.\n * @protected\n * @throws {Error} If a controller does not implement the IController interface.\n */\n protected async LoadControllers() {\n const controllerList = this.app.container.listClass(\"CONTROLLER\");\n\n const controllers: string[] = [];\n controllerList.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"CONTROLLER:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n Logger.Debug(`Load controller: ${item.id}`);\n // registering to IOC\n this.app.container.reg(item.id, item.target, { scope: \"Prototype\", type: \"CONTROLLER\", args: [] });\n // Controllers are constructed with the real request, so Request dependencies\n // are never resolved merely to validate a startup-time dummy instance.\n controllers.push(item.id);\n }\n });\n this.app.setMetaData(\"_controllers\", controllers);\n return controllers;\n }\n\n /**\n * Load and register service components into IOC container.\n * Each service must implement the IService interface.\n * Services are registered with singleton scope.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When service does not implement IService interface\n */\n protected async LoadServices() {\n const serviceList = this.app.container.listClass(\"SERVICE\");\n\n for (const item of serviceList) {\n item.id = (item.id ?? \"\").replace(\"SERVICE:\", \"\");\n if (item.id && Helper.isClass(item.target)) {\n Logger.Debug(`Load service: ${item.id}`);\n // registering to IOC\n const options = this.app.container.getPropertyData<any>('SERVICE_OPTIONS', item.target, item.id) ?? {};\n this.app.container.reg(item.id, item.target, { scope: 'Singleton', ...options, type: 'SERVICE', args: options.args ?? [] });\n if (options.scope === 'Request') continue;\n const ctl = this.app.container.getInsByClass(item.target);\n if (!implementsServiceInterface(ctl)) {\n throw Error(`The service ${item.id} must implements interface 'IService'.`);\n }\n }\n }\n }\n\n /**\n * Load and initialize components, plugins and aspects.\n * Components with suffix 'Plugin' must implement IPlugin interface.\n * Components with suffix 'Aspect' must implement IAspect interface.\n * Plugins are loaded based on configuration and executed synchronously.\n * \n * @protected\n * @returns {Promise<void>}\n * @throws {Error} When plugin/aspect doesn't implement required interface\n * @throws {Error} When plugin loading fails\n */\n protected async LoadComponents(componentManager?: ComponentManager) {\n const componentList = this.app.container.listClass(\"COMPONENT\");\n\n componentList.forEach((item: ComponentItem) => {\n item.id = (item.id ?? \"\").replace(\"COMPONENT:\", \"\");\n if (Helper.isClass(item.target)) {\n this.app.container.reg(item.id, item.target, { scope: \"Singleton\", type: \"COMPONENT\", args: [] });\n\n if (item.id && (item.id).endsWith(\"Aspect\")) {\n const ctl = this.app.container.getInsByClass(item.target);\n if (!implementsAspectInterface(ctl)) {\n throw Error(`The aspect ${item.id} must implements interface 'IAspect'.`);\n }\n }\n }\n });\n\n if (componentManager) {\n await componentManager.loadUserComponents();\n } else {\n Logger.Warn('Loading plugins in legacy mode');\n let pluginsConf = this.app.config(undefined, \"plugin\");\n if (Helper.isEmpty(pluginsConf)) {\n pluginsConf = { config: {}, list: [] };\n }\n const pluginConfList = pluginsConf.list ?? [];\n for (const key of pluginConfList) {\n const handle: IPlugin = this.app.container.get(key, \"COMPONENT\");\n if (!handle) {\n throw Error(`Plugin ${key} load error.`);\n }\n if (!Helper.isFunction(handle.run)) {\n throw Error(`Plugin ${key} must implements interface 'IPlugin'.`);\n }\n if (pluginsConf.config[key] === false) {\n Logger.Warn(`Plugin ${key} already loaded but not effective.`);\n continue;\n }\n\n await handle.run(pluginsConf.config[key] ?? {}, this.app);\n }\n }\n }\n\n\n}\n\n\n","/*\n * @Description: framework bootstrap\n * @Usage: \n * @Author: richen\n * @Date: 2021-12-09 21:56:32\n * @LastEditTime: 2025-01-14 16:11:21\n * @License: BSD (3-Clause)\n * @Copyright (c): <richenlin(at)gmail.com>\n */\nimport { IOC, Container } from \"koatty_container\";\nimport { Koatty, KoattyApplication } from 'koatty_core';\nimport { Helper } from \"koatty_lib\";\nimport { checkRuntime, checkUTRuntime, KOATTY_VERSION } from \"../util/Helper\";\nimport { LOGO } from \"./Constants\";\nimport { Loader } from \"./Loader\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\n\n/**\n * Decorator function for bootstrapping a Koatty application.\n * \n * @param bootFunc Optional function to be executed during bootstrap process\n * @returns A decorator function that validates and executes the bootstrap process\n * @throws Error if the target class does not inherit from Koatty\n * \n * @example\n * ```typescript\n * app = await ExecBootStrap()(App);\n * ```\n */\nexport function ExecBootStrap(bootFunc?: (...args: any[]) => any) {\n return async (target: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n return await executeBootstrap(target, bootFunc, true);\n };\n}\n\n/**\n * Core bootstrap logic: initialize application, load all components, mark as ready.\n * Does NOT call app.listen() — caller decides how to start the server.\n *\n * @param target - The target class to instantiate the application\n * @param bootFunc - Optional function to execute during bootstrap process\n * @param isInitiative - Whether the bootstrap is initiated manually\n * @returns Promise<KoattyApplication> The fully initialized (but not listening) application instance\n *\n * @internal\n */\nconst bootstrapApplication = async function (target: any, bootFunc?: (...args: any[]) => any,\n isInitiative = false): Promise<KoattyApplication> {\n // Disable winston internal debug logs\n // Filter out winston from NODE_DEBUG to prevent internal logging\n if (process.env.NODE_DEBUG) {\n const debugModules = process.env.NODE_DEBUG.split(',')\n .filter(m => !m.includes('winston'))\n .join(',');\n process.env.NODE_DEBUG = debugModules;\n }\n\n // checked runtime\n checkRuntime();\n // unittest running environment\n const isUTRuntime = checkUTRuntime();\n if (!isInitiative && isUTRuntime) {\n return;\n }\n\n const app = <KoattyApplication>Reflect.construct(target, []);\n // unittest does not print startup logs\n if (isUTRuntime) {\n app.silent = true;\n Logger.enable(false);\n }\n\n if (!app.silent) console.log(LOGO);\n if (!(app instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n\n // Initialize env\n Loader.initialize(app);\n\n // exec bootFunc\n if (Helper.isFunction(bootFunc)) {\n Logger.Log('Koatty', '', 'Execute bootFunc ...');\n await bootFunc(app);\n }\n // Decorators populate the default catalogue; runtime instances belong to this app.\n if (!app.container || app.container === IOC) app.container = new Container();\n app.container.setApp(app);\n\n // Check all bean\n Logger.Log('Koatty', '', 'ComponentScan ...');\n Loader.CheckAllComponents(app, target);\n\n // Load All components\n await Loader.LoadAllComponents(app, target);\n\n // Mark application as ready (all components loaded, middleware registered)\n app.markReady();\n\n return app;\n};\n\n/**\n * Execute bootstrap process for Koatty application (traditional server mode).\n * Calls bootstrapApplication() for initialization, then starts the server.\n *\n * @param target - The target class to instantiate the application\n * @param bootFunc - Optional function to execute during bootstrap process\n * @param isInitiative - Whether the bootstrap is initiated manually\n * @returns Promise<KoattyApplication> The bootstrapped application instance\n */\nconst executeBootstrap = async function (target: any, bootFunc?: (...args: any[]) => any,\n isInitiative = false): Promise<KoattyApplication> {\n try {\n const app = await bootstrapApplication(target, bootFunc, isInitiative);\n if (!app) return; // e.g. UT runtime + not initiative\n\n // Start listening (traditional server mode)\n const isUTRuntime = checkUTRuntime();\n if (!isUTRuntime) {\n app.listen(listenCallback);\n }\n\n return app;\n } catch (err) {\n // COR-02: startup failures must surface. In test/UT runtime or when the\n // bootstrap was invoked programmatically, rethrow so the caller observes\n // the failure (Logger.Fatal would asynchronously exit(1) and kill the\n // test runner). In production, Fatal flushes logs and exits with code 1.\n if (checkUTRuntime() || isInitiative) {\n throw err;\n }\n Logger.Fatal(err);\n process.exitCode = 1;\n }\n};\n\n/**\n * Create a fully initialized Koatty application WITHOUT starting a server.\n *\n * Use this for:\n * - Serverless deployment (AWS Lambda, Alibaba Cloud FC, Tencent SCF, etc.)\n * - Custom server setup (attach handler to an existing HTTP server)\n * - Testing (use app.getRequestHandler() with supertest)\n *\n * @param target - The Koatty application class decorated with @Bootstrap()\n * @param bootFunc - Optional function to execute during bootstrap process\n * @returns Promise<KoattyApplication> A ready application instance (not listening)\n *\n * @example\n * ```typescript\n * // Serverless entry point\n * import { createApplication } from 'koatty';\n * import { App } from './App';\n *\n * let cachedApp: KoattyApplication;\n *\n * export async function handler(req, res) {\n * if (!cachedApp) {\n * cachedApp = await createApplication(App);\n * }\n * return cachedApp.getRequestHandler()(req, res);\n * }\n *\n * // Custom HTTP server\n * import http from 'http';\n * const app = await createApplication(App);\n * http.createServer(app.getRequestHandler()).listen(3000);\n * ```\n */\nexport async function createApplication(\n target: any,\n bootFunc?: (...args: any[]) => any,\n): Promise<KoattyApplication> {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class ${target.name} does not inherit from Koatty`);\n }\n const app = await bootstrapApplication(target, bootFunc, true);\n if (!app) {\n throw new Error('Failed to initialize application');\n }\n return app;\n}\n\n/**\n * Server listen callback function.\n * Print server information and initialize logger settings.\n * \n * @param {KoattyApplication} app - The Koatty application instance\n * @returns {void}\n * \n * @internal\n */\nconst listenCallback = (app: KoattyApplication) => {\n Logger.Log('Koatty', '', '====================================');\n Logger.Log(\"Koatty\", \"\", `Nodejs Version: ${process.version}`);\n Logger.Log(\"Koatty\", \"\", `Koatty Version: v${KOATTY_VERSION}`);\n Logger.Log(\"Koatty\", \"\", `App Environment: ${app.env}`);\n if (app.appDebug) Logger.Warn(`Running in debug mode.`);\n Logger.Log('Koatty', '', '====================================');\n \n};\n","/**\n * Decorator for Koatty framework\n * @author richen\n * @copyright Copyright (c) - <richenlin(at)gmail.com>\n * @license BSD (3-Clause)\n * @version 2026-02-03 10:00:00\n */\n\nimport { IOC, TAGGED_CLS } from \"koatty_container\";\nimport { Koatty } from \"koatty_core\";\nimport { DefaultLogger as Logger } from \"koatty_logger\";\nimport { ExecBootStrap } from \"./Bootstrap\";\nimport { checkUTRuntime } from \"../util/Helper\";\nimport { COMPONENT_SCAN, CONFIGURATION_SCAN } from \"./Constants\";\n\n/**\n * Bootstrap decorator for Koatty application class.\n * \n * @param bootFunc Optional function to execute during bootstrap process\n * @returns ClassDecorator\n * @throws Error if target class does not inherit from Koatty\n * \n * @example\n * ```ts\n * @Bootstrap()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function Bootstrap(bootFunc?: (...args: any[]) => any) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n IOC.saveClass('COMPONENT', target, 'KOATTY_APP');\n // Importing a decorated fixture must not create an unowned application.\n // Tests explicitly call createApplication/ExecBootStrap and own its stop.\n if (checkUTRuntime()) return;\n // The decorator cannot await the bootstrap promise; make sure a startup\n // failure is still fatal (flush logs, exit 1) instead of surfacing as an\n // unhandled rejection that leaves a silently dead process (COR-02).\n ExecBootStrap(bootFunc)(target).catch((err) => {\n Logger.Fatal(err);\n process.exitCode = 1;\n });\n }, 'class');\n}\n\n/**\n * Component scan decorator for Koatty application.\n * Scans the specified path(s) for components and registers them in the IOC container.\n * \n * @param {string | string[]} [scanPath] - The path or array of paths to scan for components\n * @returns {ClassDecorator} A class decorator that enables component scanning\n * @throws {Error} If the decorated class does not inherit from Koatty\n * @example\n * ```typescript\n * @ComponentScan()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function ComponentScan(scanPath?: string | string[]) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n scanPath = scanPath ?? '';\n IOC.saveClassMetadata(TAGGED_CLS, COMPONENT_SCAN, scanPath, target);\n }, 'class');\n}\n\n\n/**\n * Configuration scan decorator, used to scan and load configuration files.\n * \n * @param scanPath - The path or array of paths to scan for configuration files. If not provided, defaults to empty string.\n * @returns A class decorator function that registers configuration scan metadata.\n * @throws Error if the decorated class does not inherit from Koatty.\n * @example\n * ```typescript\n * @ConfigurationScan()\n * export class App extends Koatty {\n * // ...\n * }\n * ```\n */\nexport function ConfigurationScan(scanPath?: string | string[]) {\n return IOC.createDecorator((target: Function, _context?: any) => {\n if (!(target.prototype instanceof Koatty)) {\n throw new Error(`class does not inherit from Koatty`);\n }\n scanPath = scanPath ?? '';\n IOC.saveClassMetadata(TAGGED_CLS, CONFIGURATION_SCAN, scanPath, target);\n }, 'class');\n}\n"]}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koatty",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Koa + Typescript = koatty. Use Typescript's decorator implement auto injection.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "pnpm run build:js && pnpm run build:dts && pnpm run build:doc && pnpm run build:cp",
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
"clean": "rimraf dist temp docs/api",
|
|
12
12
|
"lint": "eslint --ext .ts,.js ./src",
|
|
13
13
|
"test": "pnpm run lint && jest --passWithNoTests",
|
|
14
|
-
"test:cov": "jest --collectCoverage --detectOpenHandles"
|
|
14
|
+
"test:cov": "jest --collectCoverage --detectOpenHandles",
|
|
15
|
+
"test:example": "jest --config examples/mcp-order-service/jest.config.js --coverage=false"
|
|
15
16
|
},
|
|
16
17
|
"main": "./index.js",
|
|
17
18
|
"exports": {
|
|
@@ -88,7 +89,7 @@
|
|
|
88
89
|
"eslint-plugin-jest": "^28.x.x",
|
|
89
90
|
"jest": "^29.x.x",
|
|
90
91
|
"jest-html-reporters": "^3.x.x",
|
|
91
|
-
"koatty_validation": "
|
|
92
|
+
"koatty_validation": "^5.0.0",
|
|
92
93
|
"reflect-metadata": "^0.2.2",
|
|
93
94
|
"supertest": "^7.x.x",
|
|
94
95
|
"ts-jest": "^29.x.x",
|
|
@@ -96,17 +97,23 @@
|
|
|
96
97
|
},
|
|
97
98
|
"dependencies": {
|
|
98
99
|
"koa": "^3.1.2",
|
|
99
|
-
"koatty_config": "
|
|
100
|
-
"koatty_container": "
|
|
101
|
-
"koatty_core": "
|
|
102
|
-
"koatty_exception": "
|
|
103
|
-
"koatty_lib": "
|
|
104
|
-
"koatty_loader": "
|
|
105
|
-
"koatty_logger": "
|
|
106
|
-
"koatty_router": "
|
|
107
|
-
"koatty_serve": "
|
|
108
|
-
"koatty_trace": "
|
|
100
|
+
"koatty_config": "^1.5.0",
|
|
101
|
+
"koatty_container": "^4.1.0",
|
|
102
|
+
"koatty_core": "^2.7.0",
|
|
103
|
+
"koatty_exception": "^2.2.3",
|
|
104
|
+
"koatty_lib": "^1.6.1",
|
|
105
|
+
"koatty_loader": "^2.1.0",
|
|
106
|
+
"koatty_logger": "^3.1.2",
|
|
107
|
+
"koatty_router": "^2.5.0",
|
|
108
|
+
"koatty_serve": "^4.0.0",
|
|
109
|
+
"koatty_trace": "^2.5.0",
|
|
109
110
|
"ts-morph": "^27.0.2"
|
|
110
111
|
},
|
|
111
|
-
"types": "./index.d.ts"
|
|
112
|
+
"types": "./index.d.ts",
|
|
113
|
+
"files": [
|
|
114
|
+
"dist",
|
|
115
|
+
"README.md",
|
|
116
|
+
"CHANGELOG.md",
|
|
117
|
+
"LICENSE"
|
|
118
|
+
]
|
|
112
119
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koatty",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "5.0.0",
|
|
4
4
|
"description": "Koa + Typescript = koatty. Use Typescript's decorator implement auto injection.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"exports": {
|
|
@@ -81,23 +81,29 @@
|
|
|
81
81
|
"supertest": "^7.x.x",
|
|
82
82
|
"ts-jest": "^29.x.x",
|
|
83
83
|
"tslib": "^2.x.x",
|
|
84
|
-
"koatty_validation": "
|
|
84
|
+
"koatty_validation": "5.0.0"
|
|
85
85
|
},
|
|
86
86
|
"dependencies": {
|
|
87
87
|
"koa": "^3.1.2",
|
|
88
88
|
"ts-morph": "^27.0.2",
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"koatty_router": "2.
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
89
|
+
"koatty_container": "4.1.0",
|
|
90
|
+
"koatty_core": "2.7.0",
|
|
91
|
+
"koatty_exception": "2.2.3",
|
|
92
|
+
"koatty_lib": "1.6.1",
|
|
93
|
+
"koatty_config": "1.5.0",
|
|
94
|
+
"koatty_loader": "2.1.0",
|
|
95
|
+
"koatty_router": "2.5.0",
|
|
96
|
+
"koatty_logger": "3.1.2",
|
|
97
|
+
"koatty_serve": "4.0.0",
|
|
98
|
+
"koatty_trace": "2.5.0"
|
|
99
99
|
},
|
|
100
100
|
"types": "./dist/index.d.ts",
|
|
101
|
+
"files": [
|
|
102
|
+
"dist",
|
|
103
|
+
"README.md",
|
|
104
|
+
"CHANGELOG.md",
|
|
105
|
+
"LICENSE"
|
|
106
|
+
],
|
|
101
107
|
"scripts": {
|
|
102
108
|
"build": "pnpm run build:js && pnpm run build:dts && pnpm run build:doc && pnpm run build:cp",
|
|
103
109
|
"build:js": "tsup",
|
|
@@ -107,6 +113,7 @@
|
|
|
107
113
|
"clean": "rimraf dist temp docs/api",
|
|
108
114
|
"lint": "eslint --ext .ts,.js ./src",
|
|
109
115
|
"test": "pnpm run lint && jest --passWithNoTests",
|
|
110
|
-
"test:cov": "jest --collectCoverage --detectOpenHandles"
|
|
116
|
+
"test:cov": "jest --collectCoverage --detectOpenHandles",
|
|
117
|
+
"test:example": "jest --config examples/mcp-order-service/jest.config.js --coverage=false"
|
|
111
118
|
}
|
|
112
119
|
}
|
package/.rollup.config.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* @Description:
|
|
4
|
-
* @Author: richen
|
|
5
|
-
* @Date: 2024-11-07 11:22:26
|
|
6
|
-
* @LastEditTime: 2025-04-02 15:05:36
|
|
7
|
-
* @License: BSD (3-Clause)
|
|
8
|
-
* @Copyright (c): <richenlin(at)gmail.com>
|
|
9
|
-
*/
|
|
10
|
-
import commonjs from '@rollup/plugin-commonjs';
|
|
11
|
-
import json from "@rollup/plugin-json";
|
|
12
|
-
import resolve from '@rollup/plugin-node-resolve';
|
|
13
|
-
import { builtinModules } from 'module';
|
|
14
|
-
import del from "rollup-plugin-delete";
|
|
15
|
-
import typescript from 'rollup-plugin-typescript2';
|
|
16
|
-
// import babel from '@rollup/plugin-babel';
|
|
17
|
-
import terser from "@rollup/plugin-terser";
|
|
18
|
-
const pkg = require('./package.json');
|
|
19
|
-
|
|
20
|
-
export default [
|
|
21
|
-
{
|
|
22
|
-
input: './src/index.ts',
|
|
23
|
-
output: [
|
|
24
|
-
{
|
|
25
|
-
format: 'cjs',
|
|
26
|
-
file: './dist/index.js',
|
|
27
|
-
banner: require('./scripts/copyright'),
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
format: 'es',
|
|
31
|
-
file: './dist/index.mjs',
|
|
32
|
-
banner: require('./scripts/copyright'),
|
|
33
|
-
}
|
|
34
|
-
],
|
|
35
|
-
plugins: [
|
|
36
|
-
del({ targets: ["dist/*", "temp/*", "docs/api"] }),
|
|
37
|
-
// babel({
|
|
38
|
-
// babelHelpers: "runtime",
|
|
39
|
-
// configFile: './babel.config.js',
|
|
40
|
-
// exclude: 'node_modules/**',
|
|
41
|
-
// }),
|
|
42
|
-
json(),
|
|
43
|
-
resolve({
|
|
44
|
-
preferBuiltins: true, // 优先选择内置模块
|
|
45
|
-
}),
|
|
46
|
-
commonjs(),
|
|
47
|
-
typescript({
|
|
48
|
-
tsconfigOverride: {
|
|
49
|
-
compilerOptions: {
|
|
50
|
-
declaration: false,
|
|
51
|
-
declarationMap: false,
|
|
52
|
-
module: "ESNext",
|
|
53
|
-
skipLibCheck: true,
|
|
54
|
-
// 不使用 paths,让 TypeScript 使用 node_modules 中的类型
|
|
55
|
-
// 这样可以避免类型冲突
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
// 使用 cache 来提高性能
|
|
59
|
-
useTsconfigDeclarationDir: false,
|
|
60
|
-
// 忽略类型错误,只做转译
|
|
61
|
-
check: false
|
|
62
|
-
}),
|
|
63
|
-
terser({
|
|
64
|
-
compress: {
|
|
65
|
-
defaults: false, // 改为 `false`(新版本默认启用所有优化)
|
|
66
|
-
arrows: true, // 保留箭头函数转换
|
|
67
|
-
booleans: true, // 保留布尔简化
|
|
68
|
-
drop_console: false, // 保留 console
|
|
69
|
-
keep_fnames: true // 保留函数名
|
|
70
|
-
},
|
|
71
|
-
mangle: {
|
|
72
|
-
reserved: ['$super'], // 保留关键字
|
|
73
|
-
keep_classnames: true // 保留类名
|
|
74
|
-
},
|
|
75
|
-
format: {
|
|
76
|
-
beautify: true, // 启用格式化
|
|
77
|
-
indent_level: 2, // 缩进层级
|
|
78
|
-
comments: /@Author|@License|@Copyright/ // 保留特定注释
|
|
79
|
-
}
|
|
80
|
-
})
|
|
81
|
-
],
|
|
82
|
-
external: [
|
|
83
|
-
...builtinModules, // 排除 Node.js 内置模块
|
|
84
|
-
...Object.keys(pkg.dependencies || {}), // 排除 package.json 中的外部依赖
|
|
85
|
-
...Object.keys(pkg.devDependencies || {}),
|
|
86
|
-
],
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
]
|