@ynight/core 0.0.0-stage → 0.0.1

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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +472 -2
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/base-class/controller.d.ts +42 -0
  5. package/dist/base-class/controller.d.ts.map +1 -0
  6. package/dist/base-class/controller.js +62 -0
  7. package/dist/base-class/controller.js.map +1 -0
  8. package/dist/base-class/service.d.ts +31 -0
  9. package/dist/base-class/service.d.ts.map +1 -0
  10. package/dist/base-class/service.js +42 -0
  11. package/dist/base-class/service.js.map +1 -0
  12. package/dist/core.d.ts +119 -0
  13. package/dist/core.d.ts.map +1 -0
  14. package/dist/core.js +143 -0
  15. package/dist/core.js.map +1 -0
  16. package/dist/define-config.d.ts +26 -0
  17. package/dist/define-config.d.ts.map +1 -0
  18. package/dist/define-config.js +17 -0
  19. package/dist/define-config.js.map +1 -0
  20. package/dist/env.d.ts +40 -0
  21. package/dist/env.d.ts.map +1 -0
  22. package/dist/env.js +54 -0
  23. package/dist/env.js.map +1 -0
  24. package/dist/index.d.ts +42 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +42 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/lifecycle.d.ts +86 -0
  29. package/dist/lifecycle.d.ts.map +1 -0
  30. package/dist/lifecycle.js +226 -0
  31. package/dist/lifecycle.js.map +1 -0
  32. package/dist/loader/config.d.ts +31 -0
  33. package/dist/loader/config.d.ts.map +1 -0
  34. package/dist/loader/config.js +81 -0
  35. package/dist/loader/config.js.map +1 -0
  36. package/dist/loader/controller.d.ts +24 -0
  37. package/dist/loader/controller.d.ts.map +1 -0
  38. package/dist/loader/controller.js +39 -0
  39. package/dist/loader/controller.js.map +1 -0
  40. package/dist/loader/extend.d.ts +26 -0
  41. package/dist/loader/extend.d.ts.map +1 -0
  42. package/dist/loader/extend.js +53 -0
  43. package/dist/loader/extend.js.map +1 -0
  44. package/dist/loader/middleware.d.ts +29 -0
  45. package/dist/loader/middleware.d.ts.map +1 -0
  46. package/dist/loader/middleware.js +85 -0
  47. package/dist/loader/middleware.js.map +1 -0
  48. package/dist/loader/modules.d.ts +57 -0
  49. package/dist/loader/modules.d.ts.map +1 -0
  50. package/dist/loader/modules.js +168 -0
  51. package/dist/loader/modules.js.map +1 -0
  52. package/dist/loader/router-schema.d.ts +30 -0
  53. package/dist/loader/router-schema.d.ts.map +1 -0
  54. package/dist/loader/router-schema.js +52 -0
  55. package/dist/loader/router-schema.js.map +1 -0
  56. package/dist/loader/router.d.ts +24 -0
  57. package/dist/loader/router.d.ts.map +1 -0
  58. package/dist/loader/router.js +57 -0
  59. package/dist/loader/router.js.map +1 -0
  60. package/dist/loader/service.d.ts +24 -0
  61. package/dist/loader/service.d.ts.map +1 -0
  62. package/dist/loader/service.js +39 -0
  63. package/dist/loader/service.js.map +1 -0
  64. package/dist/logger.d.ts +48 -0
  65. package/dist/logger.d.ts.map +1 -0
  66. package/dist/logger.js +67 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/utils/index.d.ts +16 -0
  69. package/dist/utils/index.d.ts.map +1 -0
  70. package/dist/utils/index.js +23 -0
  71. package/dist/utils/index.js.map +1 -0
  72. package/package.json +54 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 diaogroup
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,473 @@
1
- # Temporary Holding Version
1
+ # @ynight/core
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ > Elpis 框架的服务端底层引擎:Koa 应用生命周期、约定式目录扫描与模块加载、Controller/Service 基类与日志能力。
4
+
5
+ ## 概述
6
+
7
+ `@ynight/core` 是 Elpis 框架的服务端核心层,基于 [Koa](https://koajs.com/) 与 TypeScript 构建。它向上层 `@ynight/framework` 提供以下能力:
8
+
9
+ - 一个可托管(managed)的 Koa 应用容器,负责应用创建、HTTP 监听、优雅关闭与信号处理;
10
+ - 一组约定式目录 loader(加载器),按固定顺序扫描业务目录并自动装配 controller、service、middleware、extend、router-schema、router 与全局中间件;
11
+ - 一套基类与工具函数,让业务侧的 controller 与 service 继承后即可访问框架能力;
12
+ - 基于 [log4js](https://log4js-node.github.io/log4js-node/) 的内置日志器;
13
+ - 环境判定与运行时配置类型定义工具。
14
+
15
+ `@ynight/core` 不包含任何业务模型,仅作为框架底层引擎存在,业务代码通常通过上层 `@ynight/framework` 间接使用,也可以单独引用本包来构建定制化服务。
16
+
17
+ ## 核心能力
18
+
19
+ - **应用生命周期管理**:提供 `createApplicationContainer` / `startApplicationContainer` 两个底层 API,以及 `createApplication` / `startApplication` 两个高级入口,处理 listen 幂等、close 幂等、超时兜底与信号处理器注册。
20
+ - **Koa 应用初始化与装配**:`ElipsCore.start()` 按固定顺序加载所有约定目录,返回一个已经完整装配的 `ElipsApplication`。
21
+ - **约定式目录扫描与模块加载**:内置 `config` / `controller` / `extend` / `middleware` / `router` / `router-schema` / `service` 共 7 个 loader,覆盖典型后端分层。
22
+ - **Controller / Service 基类**:`BaseController` 提供 `success` / `fail` 统一响应结构,`BaseService` 内置基于 axios 的 `curl` HTTP 客户端。
23
+ - **日志能力**:基于 log4js 实现,可同时输出到控制台与按天归档的文件 appender。
24
+ - **环境判定**:`ElipsEnv` 提供 `isLocal` / `isBeta` / `isTest` / `isProd` / `get` 一组方法,便于运行时分支判断。
25
+ - **配置类型定义**:`defineConfig` 与 `ElipsBuiltInConfig` 提供带类型推断的配置声明方式。
26
+
27
+ ## 安装
28
+
29
+ ```bash
30
+ pnpm add @ynight/core
31
+ ```
32
+
33
+ 依赖要求:
34
+
35
+ - Node.js `>=22.0.0`
36
+ - Koa `^2.15.0`
37
+ - @koa/router `^15.1.1`
38
+ - axios `^1.13.2`
39
+ - log4js `^6.9.1`
40
+ - glob `^11.0.0`
41
+
42
+ ## 快速开始
43
+
44
+ 下面展示一个最简使用方式:通过 `startApplication` 启动一个已经装配好的 Elpis 应用。
45
+
46
+ ```typescript
47
+ // app/controller/hello.ts
48
+ import { Context } from 'koa';
49
+ import { BaseController } from '@ynight/core';
50
+
51
+ export default class HelloController extends BaseController {
52
+ sayHi(ctx: Context) {
53
+ this.success(ctx, { message: 'hello, elpis' });
54
+ }
55
+ }
56
+ ```
57
+
58
+ ```typescript
59
+ // app/router/hello.ts
60
+ export default (app: any, router: any) => {
61
+ const { hello } = app.controller;
62
+ router.get('/hello', hello.sayHi.bind(hello));
63
+ };
64
+ ```
65
+
66
+ ```typescript
67
+ // app/service/world.ts
68
+ import { BaseService } from '@ynight/core';
69
+
70
+ export default class WorldService extends BaseService {
71
+ getMessage() {
72
+ return 'world from service';
73
+ }
74
+ }
75
+ ```
76
+
77
+ ```typescript
78
+ // config.default.ts
79
+ export default {
80
+ logger: {
81
+ level: 'info',
82
+ console: true,
83
+ },
84
+ };
85
+ ```
86
+
87
+ ```typescript
88
+ // server.ts —— 启动入口
89
+ import { startApplication } from '@ynight/core';
90
+
91
+ startApplication({ baseDir: __dirname }).catch(err => {
92
+ console.error('应用启动失败', err);
93
+ process.exit(1);
94
+ });
95
+ ```
96
+
97
+ 启动后访问 `http://localhost:3000/hello` 即可看到返回的 JSON 响应。
98
+
99
+ ## API 参考
100
+
101
+ ### 应用生命周期
102
+
103
+ #### `startApplication(options?)`
104
+
105
+ `@ynight/core` 推荐的生产入口。内部会:
106
+
107
+ 1. 调用 `ElipsCore.start()` 装配 Koa 应用;
108
+ 2. 调用 `listen` 启动 HTTP 监听;
109
+ 3. 注册 `SIGINT` / `SIGTERM` 信号处理器,进程收到终止信号时自动优雅关闭。
110
+
111
+ ```typescript
112
+ function startApplication(options?: ElipsCoreOptions): Promise<ManagedElipsApplication>;
113
+ ```
114
+
115
+ | 参数 | 类型 | 说明 |
116
+ | --------- | ---------------------------------- | ------------------------------------ |
117
+ | `options` | `ElipsCoreOptions` | 启动配置,可省略 |
118
+ | 返回值 | `Promise<ManagedElipsApplication>` | 已经监听端口并注册信号处理的托管应用 |
119
+
120
+ #### `createApplication(options?)`
121
+
122
+ 与 `startApplication` 的区别:只装配应用并托管生命周期,不会自动调用 `listen` 也不会注册信号处理器。适合测试或自定义进程管理场景。
123
+
124
+ ```typescript
125
+ function createApplication(options?: ElipsCoreOptions): Promise<ManagedElipsApplication>;
126
+ ```
127
+
128
+ #### `createApplicationContainer(options?)`
129
+
130
+ 底层容器 API:直接创建一个托管应用并把 listen/close 收敛到一个确定的对象上。
131
+
132
+ ```typescript
133
+ function createApplicationContainer<TApp extends ApplicationContainerApp = Koa>(
134
+ options?: ApplicationContainerOptions<TApp>
135
+ ): ManagedApplication<TApp>;
136
+ ```
137
+
138
+ 关键设计:
139
+
140
+ - **listen 幂等**:重复调用 `listen()` 会复用第一次创建的 `http.Server`;并发调用复用同一个 `listening` Promise。
141
+ - **close 幂等**:重复调用 `close()` 会复用同一个 `closing` Promise。
142
+ - **不可逆**:调用 `close()` 后再次调用 `listen()` 会被拒绝并抛出 `ELPIS_APPLICATION_CLOSED` 错误。
143
+ - **超时兜底**:`closeTimeoutMs`(默认 10000ms)控制 server 关闭与 `onClose` 钩子的等待时长;超时后会强制销毁所有 socket 并调用 `closeAllConnections()` 防止长连接卡死。
144
+ - **WeakMap 防泄漏**:使用 `WeakMap` 记录每个托管应用注册的信号处理器清理函数,避免容器自身阻止应用被 GC。
145
+ - **错误聚合**:server 关闭错误与 `onClose` 钩子错误都会被收集,最终通过 `AggregateError` 一次性抛出。
146
+
147
+ #### `startApplicationContainer(managed, options?)`
148
+
149
+ 在已托管应用上启动监听并注册 `SIGINT` / `SIGTERM` 信号处理器:
150
+
151
+ - 监听失败时会尝试调用 `close()` 清理已部分初始化的资源,清理失败则抛出 `AggregateError([listenError, cleanupError])`;
152
+ - 信号处理器使用 `process.once` 注册,同一信号不会重复触发关闭;
153
+ - 仅在第一次启动时注册清理函数,避免重复绑定。
154
+
155
+ ```typescript
156
+ function startApplicationContainer<TApp extends ApplicationContainerApp>(
157
+ managed: ManagedApplication<TApp>,
158
+ options?: { host?: string; port?: number }
159
+ ): Promise<ManagedApplication<TApp>>;
160
+ ```
161
+
162
+ ### Koa 应用初始化与加载
163
+
164
+ #### `ElipsCore` 类
165
+
166
+ ```typescript
167
+ import ElipsCore from '@ynight/core';
168
+
169
+ const app = new ElipsCore().start({ baseDir: __dirname });
170
+ ```
171
+
172
+ `start(options?)` 方法返回已经完整装配的 `ElipsApplication`,内部按以下顺序依次加载各模块:
173
+
174
+ 1. **config** —— 加载 `config.default.*` 与 `config.{env}.*`,写入 `app.config`;
175
+ 2. **logger** —— 基于 `app.config.logger` 创建 log4js logger;
176
+ 3. **extend** —— 扫描并执行 extend 工厂函数,把结果挂到 `app.${name}`;
177
+ 4. **middleware** —— 扫描并装配 middleware 文件,结果写入 `app.middlewares`;
178
+ 5. **routerSchema** —— 扫描并合并 router-schema 文件,结果写入 `app.routerSchema`;
179
+ 6. **service** —— 扫描并实例化 service class,结果写入 `app.service`;
180
+ 7. **controller** —— 扫描并实例化 controller class,结果写入 `app.controller`;
181
+ 8. **全局中间件** —— 若 `app/middleware.ts`(注意拼写沿用旧约定)存在则执行它;
182
+ 9. **router** —— 扫描并注册所有路由文件,最后挂上 404 兜底路由;
183
+ 10. **HTTP 监听** —— 若 `options.listen !== false` 且 `ENV !== test` 时调用 `app.listen()`。
184
+
185
+ #### `ElipsCoreOptions`
186
+
187
+ ```typescript
188
+ interface ElipsCoreOptions {
189
+ PORT?: string | number; // 监听端口,优先级高于环境变量 PORT
190
+ IP?: string; // 监听主机,优先级高于环境变量 IP
191
+ ext?: string; // 业务模块扩展名,默认取当前文件扩展名
192
+ baseDir?: string; // 应用根目录,默认 process.cwd()
193
+ businessPath?: string; // 业务文件目录,默认 ${baseDir}/app
194
+ configPath?: string; // 配置目录,默认 ${baseDir}/config
195
+ homePage?: string; // 首页路径(预留字段)
196
+ listen?: boolean; // 是否自动监听端口,默认 true
197
+ closeTimeoutMs?: number; // 关闭超时毫秒数,默认 10000
198
+ [key: string]: unknown; // 允许扩展自定义字段
199
+ }
200
+ ```
201
+
202
+ #### `ElipsApplication`
203
+
204
+ 框架对 Koa 应用的扩展类型(注意 `Omit<Koa, 'env'>` 排除了 Koa 内置的 `env` 字符串字段,改用框架自定义的 `ElipsEnv`):
205
+
206
+ ```typescript
207
+ interface ElipsApplication extends Omit<Koa, 'env'>, IApplication {
208
+ options: ElipsCoreOptions & { ext: string };
209
+ baseDir: string;
210
+ businessPath: string;
211
+ configPath: string;
212
+ env: ElipsEnv;
213
+ middlewares: IMiddleware; // 中间件命名空间
214
+ routerSchema: any; // 路由参数描述对象
215
+ controller: IController; // 控制器命名空间
216
+ service: IService; // 服务命名空间
217
+ config: AppConfig; // 已合并的配置
218
+ logger: ElipsLogger; // 框架内置 logger
219
+ }
220
+ ```
221
+
222
+ 其中 `IController` / `IService` / `IMiddleware` / `IApplication` / `AppConfigRegistry` 是 5 个空接口,业务应用可以通过 TypeScript [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html) 机制补充具体类型:
223
+
224
+ ```typescript
225
+ // global.d.ts
226
+ import '@ynight/core';
227
+
228
+ declare module '@ynight/core' {
229
+ interface IController {
230
+ user: { list: (ctx: any) => Promise<void> };
231
+ }
232
+ }
233
+ ```
234
+
235
+ ### 配置定义
236
+
237
+ #### `defineConfig(config)`
238
+
239
+ 为业务配置对象保留完整类型推断,同时接受框架内置字段的类型校验。
240
+
241
+ ```typescript
242
+ import { defineConfig } from '@ynight/core';
243
+
244
+ export default defineConfig({
245
+ logger: {
246
+ level: 'info',
247
+ console: true,
248
+ file: { enabled: true, filename: 'logs/app.log' },
249
+ },
250
+ db: {
251
+ host: 'localhost',
252
+ port: 3306,
253
+ },
254
+ });
255
+ ```
256
+
257
+ #### `ElipsBuiltInConfig`
258
+
259
+ 业务配置应继承此接口以获得框架内置字段(如 `logger`)的类型约束:
260
+
261
+ ```typescript
262
+ interface ElipsBuiltInConfig {
263
+ logger?: ElipsLoggerOptions;
264
+ }
265
+ ```
266
+
267
+ `defineConfig` 当前作为类型入口与未来扩展点存在,不会修改传入的对象,保证 `Object.is(defineConfig(c), c)` 为 `true`。
268
+
269
+ ### 环境判定
270
+
271
+ #### `ElipsEnv` 类
272
+
273
+ 通过 `process.env.ENV` 环境变量判定当前运行环境,支持 `local` / `beta` / `test` / `production` 四种环境。所有方法名采用严格相等(`===`)判定,`ENV` 的大小写必须完全匹配。
274
+
275
+ ```typescript
276
+ class ElipsEnv {
277
+ isLocal(): boolean; // ENV=local
278
+ isBeta(): boolean; // ENV=beta
279
+ isTest(): boolean; // ENV=test
280
+ isProd(): boolean; // ENV=production
281
+ get(): string; // 返回环境名,未设置时默认 'local'
282
+ }
283
+ ```
284
+
285
+ 通常不需要手动 `new ElipsEnv()`,框架在 `start()` 时会自动实例化并挂到 `app.env` 上。
286
+
287
+ ### 日志
288
+
289
+ #### `createLogger(app)`
290
+
291
+ 创建框架内置 logger:
292
+
293
+ ```typescript
294
+ function createLogger(app: ElipsApplication): ElipsLogger;
295
+ ```
296
+
297
+ 装配逻辑:
298
+
299
+ 1. 默认启用 `console` appender,若 `options.console !== false` 则加入启用列表;
300
+ 2. 当 `file.enabled` 为 `true` 时构造 `dateFile` appender,自动创建日志目录,按 `.yyyy-MM-dd` 归档;
301
+ 3. 若没有任何 appender 被启用(如 `console=false` 且 `file.enabled=false`),退回 `console` 但级别设为 `off`,避免日志静默丢失;
302
+ 4. 调用 `log4js.configure` 并返回默认 logger 实例。
303
+
304
+ #### `ElipsLoggerOptions`
305
+
306
+ ```typescript
307
+ interface ElipsLoggerOptions {
308
+ level?: string; // trace/debug/info/warn/error/fatal,默认 info
309
+ console?: boolean; // 是否启用控制台,默认 true
310
+ file?: ElipsLoggerFileOptions; // 文件输出配置
311
+ }
312
+
313
+ interface ElipsLoggerFileOptions {
314
+ enabled?: boolean; // 是否启用文件输出,默认 false
315
+ filename?: string; // 日志文件路径,相对路径基于 app.baseDir
316
+ pattern?: string; // 归档命名模式,默认 '.yyyy-MM-dd'
317
+ }
318
+ ```
319
+
320
+ #### `ElipsLogger`
321
+
322
+ ```typescript
323
+ type ElipsLogger = Logger; // 复用 log4js 的 Logger 接口
324
+ ```
325
+
326
+ 通过 `app.logger` 访问:
327
+
328
+ ```typescript
329
+ app.logger.info('hello %s', 'elpis');
330
+ app.logger.error(err);
331
+ ```
332
+
333
+ ### 基类
334
+
335
+ #### `BaseController`
336
+
337
+ ```typescript
338
+ import { Context } from 'koa';
339
+ import { BaseController } from '@ynight/core';
340
+
341
+ export default class UserController extends BaseController {
342
+ async list(ctx: Context) {
343
+ const data = await this.app.service.user.findAll();
344
+ this.success(ctx, data);
345
+ }
346
+
347
+ async failDemo(ctx: Context) {
348
+ this.fail(ctx, '用户不存在', 1001);
349
+ }
350
+ }
351
+ ```
352
+
353
+ **继承成员**:
354
+
355
+ - `readonly app: ElipsApplication` —— 由 controller loader 自动注入;
356
+ - `success(ctx, data?, metadata?)` —— 设置 `ctx.status = 200` 并写入 `{ success: true, data, metadata }`;
357
+ - `fail(ctx, message, code)` —— 设置 `ctx.status = 200` 并写入 `{ success: false, message, code }`(注意 status 仍为 200,错误通过业务字段传递,便于与仅识别 HTTP 200 的前端拦截器兼容)。
358
+
359
+ #### `BaseService`
360
+
361
+ ```typescript
362
+ import { BaseService } from '@ynight/core';
363
+
364
+ export default class UserService extends BaseService {
365
+ async findAll() {
366
+ const res = await this.curl.get('/api/users');
367
+ return res.data;
368
+ }
369
+ }
370
+ ```
371
+
372
+ **继承成员**:
373
+
374
+ - `readonly app: ElipsApplication` —— 由 service loader 自动注入;
375
+ - `readonly curl` —— 基于 axios 的 HTTP 客户端实例,默认超时 `1000ms`,业务可在构造函数中扩展 `baseURL`、拦截器等配置。
376
+
377
+ ### 加载器(Loader)
378
+
379
+ 所有 loader 均在 `ElipsCore.start()` 内部按固定顺序实例化。loader 自身不导出供业务调用的 API(除 `modules` 工具函数外),下表描述每个 loader 的职责与命名规则。
380
+
381
+ | Loader | 职责 | 扫描目录 | 输出位置 |
382
+ | ------------------------- | ---------------------------------------------------- | ------------------------------------ | ---------------------------------- |
383
+ | `ElipsConfigLoader` | 加载 `config.default.*` 与 `config.{env}.*` 并浅合并 | `${configPath}` | `app.config` |
384
+ | `ElipsExtendLoader` | 扫描 extend 文件并执行工厂函数 | `${businessPath}/extend/**/*` | `app.${camelCaseName}` |
385
+ | `ElipsMiddlewareLoader` | 扫描 middleware 文件并执行工厂函数 | `${businessPath}/middleware/**/*` | `app.middlewares.${camelCasePath}` |
386
+ | `ElipsRouterSchemaLoader` | 扫描 schema 文件并浅合并到一个对象 | `${businessPath}/router-schema/**/*` | `app.routerSchema`(扁平) |
387
+ | `ElipsServiceLoader` | 扫描 service class 文件并实例化 | `${businessPath}/service/**/*` | `app.service.${camelCasePath}` |
388
+ | `ElipsControllerLoader` | 扫描 controller class 文件并实例化 | `${businessPath}/controller/**/*` | `app.controller.${camelCasePath}` |
389
+ | `ElipsRouterLoader` | 扫描 router 文件并注册到 KoaRouter | `${businessPath}/router/**/*` | `app.use(router.routes())` |
390
+
391
+ #### 命名规则
392
+
393
+ - 文件名 / 目录名中的 `-` 和 `_` 会被转换为小驼峰(`custom-extend` → `customExtend`);
394
+ - 嵌套目录映射为对象嵌套(`order/list.ts` → `app.service.order.list`);
395
+ - 业务模块名称禁止使用 `__proto__` / `prototype` / `constructor`,会触发原型链防护检查。
396
+
397
+ #### Loader 工具函数
398
+
399
+ 以下 4 个工具函数从 `@ynight/core` 命名导出,可被 SDK、测试工具或自定义 loader 复用:
400
+
401
+ ```typescript
402
+ import { listModuleFiles, readModule, loadModuleTree, loadClassModules } from '@ynight/core';
403
+ ```
404
+
405
+ ##### `listModuleFiles(root, extension)`
406
+
407
+ 递归扫描 `root` 目录,收集所有匹配扩展名的文件路径。
408
+
409
+ - 扩展名白名单:`.ts` / `.js` / `.cjs`,其他扩展名会抛出错误;
410
+ - 自动忽略 `.d.ts`;
411
+ - 目录按字典序遍历,保证加载顺序稳定;
412
+ - 目录不存在时返回空数组而非抛错。
413
+
414
+ ##### `readModule(file)`
415
+
416
+ 读取并解析一个业务模块,自动解包 ESM/TS 编译后的 `{ default: ... }` 形态;`require` 失败时抛出带 `cause` 字段的链式异常。
417
+
418
+ ##### `loadModuleTree(root, extension, instantiate)`
419
+
420
+ 通用模块树加载器:扫描目录并按嵌套路径构建命名空间对象。
421
+
422
+ - 每段路径转小驼峰后作为命名空间 key;
423
+ - 通过 `instantiate` 回调实例化每个叶子模块;
424
+ - 检测并报错:禁止使用 `__proto__` / `prototype` / `constructor` 等危险 key;同名叶子或同名中间目录冲突时报错。
425
+
426
+ ##### `loadClassModules(root, extension, app)`
427
+
428
+ 加载以 class 为导出形式的业务模块(controller / service 场景):
429
+
430
+ - 内部调用 `loadModuleTree` 完成扫描与命名空间构建;
431
+ - 对每个叶子,校验导出必须是函数(class),然后用 `new Constructor(app)` 实例化;
432
+ - 构造失败时抛出带 `cause` 的错误链。
433
+
434
+ ## 加载顺序与约束
435
+
436
+ `ElipsCore.start()` 内部按以下固定顺序装配应用,**不可调整**:
437
+
438
+ ```text
439
+ config → logger → extend → middleware → routerSchema → service → controller → 全局中间件 → router → listen
440
+ ```
441
+
442
+ ### 为什么是这个顺序?
443
+
444
+ 1. **config 先**:其它模块(logger、service、extend 等)都可能依赖配置信息,必须先就绪;
445
+ 2. **logger 次之**:所有 loader 在执行过程中都可能输出日志,必须先创建 logger;
446
+ 3. **extend 第三**:extend 给 app 注入额外能力,后续 middleware 与 service 可能用到;
447
+ 4. **middleware 第四**:middleware 可能使用 config、logger、extend;
448
+ 5. **routerSchema 第五**:路由参数校验规则要在 router 注册前就绪,便于校验请求参数;
449
+ 6. **service 第六**:controller 必然依赖 service,因此 service 必须在 controller 之前加载;
450
+ 7. **controller 最后业务模块**:controller 依赖 service、config、logger、extend;
451
+ 8. **全局中间件**:与目录式中间件不同,这是一个单一入口文件 `app/middleware.ts`,支持默认导出或具名导出的工厂函数;
452
+ 9. **router**:所有路由文件注册完毕后由 router loader 统一挂载到 Koa 上,并加上 404 兜底;
453
+ 10. **listen**:在测试环境(`ENV=test`)或显式 `listen: false` 时跳过监听。
454
+
455
+ ### 命名冲突与防护
456
+
457
+ - **同名叶子冲突**:两个模块文件映射到同一命名空间 key(如 `app/service/user.ts` 与 `app/service/user/index.ts`)会抛出错误;
458
+ - **叶子与中间目录冲突**:文件不能与已有的中间目录同名,反之亦然;
459
+ - **原型链防护**:`__proto__` / `prototype` / `constructor` 等危险 key 直接拒绝;
460
+ - **extend 覆盖防护**:extend 文件名若与 Koa/框架已有属性同名(如 `listen`、`use`),loader 会输出警告并跳过挂载,避免破坏内置能力。
461
+
462
+ ## 相关包
463
+
464
+ - [@ynight/framework](../framework) —— 框架主入口,依赖本包;
465
+ - [@ynight/contracts](../contracts) —— 类型契约,提供跨包共享的类型定义。
466
+
467
+ ## 引擎要求
468
+
469
+ - Node.js `>=22.0.0`
470
+
471
+ ## 许可证
472
+
473
+ MIT
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/disposable.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/indexable.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/compatibility/index.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/globals.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/assert/strict.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/async_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/buffer.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/child_process.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/cluster.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/console.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/constants.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/crypto.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dgram.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/dns/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/domain.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/events.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/fs/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/http2.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/https.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/module.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/net.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/os.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/path.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/process.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/punycode.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/querystring.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/readline/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/repl.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sea.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/sqlite.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/stream/web.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/string_decoder.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/test.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/timers/promises.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tls.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/trace_events.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/tty.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/url.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/util.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/v8.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/vm.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/wasi.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/worker_threads.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/zlib.d.ts","../../../node_modules/.pnpm/@types+node@22.20.1/node_modules/@types/node/index.d.ts","../../../node_modules/.pnpm/@types+accepts@1.3.7/node_modules/@types/accepts/index.d.ts","../../../node_modules/.pnpm/@types+connect@3.4.38/node_modules/@types/connect/index.d.ts","../../../node_modules/.pnpm/@types+send@1.2.1/node_modules/@types/send/index.d.ts","../../../node_modules/.pnpm/@types+qs@6.14.0/node_modules/@types/qs/index.d.ts","../../../node_modules/.pnpm/@types+range-parser@1.2.7/node_modules/@types/range-parser/index.d.ts","../../../node_modules/.pnpm/@types+express-serve-static-core@5.1.0/node_modules/@types/express-serve-static-core/index.d.ts","../../../node_modules/.pnpm/@types+http-errors@2.0.5/node_modules/@types/http-errors/index.d.ts","../../../node_modules/.pnpm/@types+serve-static@2.2.0/node_modules/@types/serve-static/index.d.ts","../../../node_modules/.pnpm/@types+body-parser@1.19.6/node_modules/@types/body-parser/index.d.ts","../../../node_modules/.pnpm/@types+express@5.0.6/node_modules/@types/express/index.d.ts","../../../node_modules/.pnpm/@types+keygrip@1.0.6/node_modules/@types/keygrip/index.d.ts","../../../node_modules/.pnpm/@types+cookies@0.9.2/node_modules/@types/cookies/index.d.ts","../../../node_modules/.pnpm/@types+http-assert@1.5.6/node_modules/@types/http-assert/index.d.ts","../../../node_modules/.pnpm/@types+content-disposition@0.5.9/node_modules/@types/content-disposition/index.d.ts","../../../node_modules/.pnpm/@types+koa-compose@3.2.9/node_modules/@types/koa-compose/index.d.ts","../../../node_modules/.pnpm/@types+koa@2.15.0/node_modules/@types/koa/index.d.ts","../src/lifecycle.ts","../src/env.ts","../src/loader/modules.ts","../src/base-class/controller.ts","../../../node_modules/.pnpm/axios@1.13.2/node_modules/axios/index.d.ts","../src/base-class/service.ts","../../../node_modules/.pnpm/log4js@6.9.1/node_modules/log4js/types/log4js.d.ts","../src/logger.ts","../src/define-config.ts","../src/index.ts","../src/loader/config.ts","../src/loader/controller.ts","../../../node_modules/.pnpm/minipass@7.1.2/node_modules/minipass/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/lru-cache@11.2.4/node_modules/lru-cache/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/path-scurry@2.0.1/node_modules/path-scurry/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/ast.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/escape.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/unescape.d.ts","../../../node_modules/.pnpm/minimatch@10.1.1/node_modules/minimatch/dist/commonjs/index.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/pattern.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/processor.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/walker.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/ignore.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/glob.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/has-magic.d.ts","../../../node_modules/.pnpm/glob@11.1.0/node_modules/glob/dist/commonjs/index.d.ts","../src/loader/extend.ts","../src/loader/middleware.ts","../../../node_modules/.pnpm/path-to-regexp@8.3.0/node_modules/path-to-regexp/dist/index.d.ts","../../../node_modules/.pnpm/@koa+router@15.1.1_koa@2.16.3/node_modules/@koa/router/dist/index.d.ts","../src/loader/router.ts","../src/loader/service.ts","../src/loader/router-schema.ts","../src/core.ts","../src/utils/index.ts"],"fileIdsList":[[64,114,131,132,180,209],[64,114,128,131,132,164],[64,114,128,131,132,164,166],[64,114,131,132],[64,114,128,131,132,164,166,174,175],[64,114,125,128,131,132,164,167,168,169],[64,114,131,132,170,172,173],[64,114,131,132,180],[64,113,114,125,128,129,131,132,134,140,157,164,165,171,175,176,177,178,179],[64,111,112,114,131,132],[64,113,114,131,132],[114,131,132],[64,114,119,131,132,149],[64,114,115,120,125,131,132,134,146,157],[64,114,115,116,125,131,132,134],[59,60,61,64,114,131,132],[64,114,117,131,132,158],[64,114,118,119,126,131,132,135],[64,114,119,131,132,146,154],[64,114,120,122,125,131,132,134],[64,113,114,121,131,132],[64,114,122,123,131,132],[64,114,124,125,131,132],[64,113,114,125,131,132],[64,114,125,126,127,131,132,146,157],[64,114,125,126,127,131,132,141,146,149],[64,106,114,122,125,128,131,132,134,146,157],[64,114,125,126,128,129,131,132,134,146,154,157],[64,114,128,130,131,132,146,154,157],[62,63,64,65,66,67,68,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[64,114,125,131,132],[64,114,131,132,133,157],[64,114,122,125,131,132,134,146],[64,114,131,132,135],[64,114,131,132,136],[64,113,114,131,132,137],[64,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163],[64,114,131,132,139],[64,114,131,132,140],[64,114,125,131,132,141,142],[64,114,131,132,141,143,158,160],[64,114,126,131,132],[64,114,125,131,132,146,147,149],[64,114,131,132,148,149],[64,114,131,132,146,147],[64,114,131,132,149],[64,114,131,132,150],[64,111,114,131,132,146,151,157],[64,114,125,131,132,152,153],[64,114,131,132,152,153],[64,114,119,131,132,134,146,154],[64,114,131,132,155],[64,114,131,132,134,156],[64,114,128,131,132,140,157],[64,114,119,131,132,158],[64,114,131,132,146,159],[64,114,131,132,133,160],[64,114,131,132,161],[64,106,114,131,132],[64,106,114,125,127,131,132,137,146,149,157,159,160,162],[64,114,131,132,146,163],[64,114,126,131,132,146,164],[64,114,128,131,132,164,171],[64,114,131,132,193,195,199,200,203],[64,114,131,132,204],[64,114,131,132,195,199,202],[64,114,131,132,193,195,199,202,203,204,205],[64,114,131,132,199],[64,114,131,132,195,199,200,202],[64,114,131,132,193,195,200,201,203],[64,114,131,132,196,197,198],[64,114,125,131,132,150,164],[64,114,126,131,132,136,193,194],[64,78,82,114,131,132,157],[64,78,114,131,132,146,157],[64,73,114,131,132],[64,75,78,114,131,132,154,157],[64,114,131,132,134,154],[64,114,131,132,164],[64,73,114,131,132,164],[64,75,78,114,131,132,134,157],[64,70,71,74,77,114,125,131,132,146,157],[64,78,85,114,131,132],[64,70,76,114,131,132],[64,78,99,100,114,131,132],[64,74,78,114,131,132,149,157,164],[64,99,114,131,132,164],[64,72,73,114,131,132,164],[64,78,114,131,132],[64,72,73,74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,100,101,102,103,104,105,114,131,132],[64,78,93,114,131,132],[64,78,85,86,114,131,132],[64,76,78,86,87,114,131,132],[64,77,114,131,132],[64,70,73,78,114,131,132],[64,78,82,86,87,114,131,132],[64,82,114,131,132],[64,76,78,81,114,131,132,157],[64,70,75,78,85,114,131,132],[64,114,131,132,146],[64,73,78,99,114,131,132,162,164],[58,64,114,131,132,180,190],[58,64,114,131,132,185,190],[58,64,114,131,132,136,180,181,182,188,190,191,192,207,208,211,212,213],[58,64,114,131,132,188],[58,64,114,131,132],[58,64,114,131,132,181,183,184,186,188,189,214],[58,64,114,128,131,132,134,180],[58,64,114,126,131,132,136,190],[58,64,114,131,132,136,183,190],[58,64,114,131,132,136,190,206],[58,64,114,126,131,132,136],[58,64,114,131,132,136,190,206,210],[58,64,114,126,131,132,136,187,214]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"13f5c844119c43e51ce777c509267f14d6aaf31eafb2c2b002ca35584cd13b29","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"d61e0a64cd175208ac0b83670151a9a6b5916f0d1ffcdc5c29c90b1cebfc5045","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"87f287f296f3ff07dbd14ea7853c2400d995dccd7bd83206196d6c0974774e96","impliedFormat":1},{"version":"104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","impliedFormat":1},{"version":"d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","impliedFormat":1},{"version":"baac9896d29bcc55391d769e408ff400d61273d832dd500f21de766205255acb","impliedFormat":1},{"version":"2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed","impliedFormat":1},{"version":"f429b61e369208ef7668ebf1dc63176e506fbfaea7b0ecc13d586a5839ebb071","affectsGlobalScope":true,"impliedFormat":1},{"version":"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","impliedFormat":1},{"version":"168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","impliedFormat":1},{"version":"cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","impliedFormat":1},{"version":"8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47","impliedFormat":1},{"version":"6847334317c1bc1e6fc4b679b0095bbd2b6ee3b85fe3f26fc26bac462f68ef5e","impliedFormat":1},{"version":"e3ccea927a3e1cb3895f549c439452774db977521d2086738642ef1e1608ba64","impliedFormat":1},{"version":"fbf802b3a028f5eb22ad406ee5fc7c368f0acfd3a2a6d0f805120766f5717ec8","impliedFormat":1},{"version":"0504070e7eaba788f5d0d5926782ed177f1db01cee28363c488fae94950c0bbc","impliedFormat":1},{"version":"2e9a5180cb127e7614170db6d4452e1bc604bdd2f7921e28f799c460c88e8c35","impliedFormat":1},{"version":"8cf9b9045a614f883b623c2f1a631ec6a93321747e933330b2eec0ee47164a34","impliedFormat":1},{"version":"e0af410e0f8c37fc813a1c7406ea73601fae97758c8cf27944ca91f5f1fc647d","signature":"ada6e3c9a7ad72cc13fa3c0ca062803db1649e5aee983953317e5038ee515cdd"},{"version":"c852fc3644b6b4d5f96cfb4dc834c1816227fc785a0e504fed483ce5190af930","signature":"b19ac92477a56e50e8286680c0c0621c78825440ad49b2e9eb2f642b84c3ba1a"},{"version":"7bf0d5bbbbd7e2c096c3b4bcd7eb16c5bbc35038c2783a59aa17fac2208e9171","signature":"44b467ab86ecd7c0dc3f10088d607774ec8482f266523627cb74a55e4f5e4305"},{"version":"6b441f22e1c8b3293a8690f608b3e0281bde92725237b42328c9f077a35cce13","signature":"3770f1580d0f8aa122827322f7c82fbe778560ce90d12d6e7c1d0f937e504fb2"},{"version":"1c9800fbae1b443d77672e6d3e715df7280479b7c41f08cb790e750f01b50d90","impliedFormat":99},{"version":"c58e0028e89d2499755cd9d36f57af06ce2395d49fe062b528519c5aa3015d02","signature":"54b4746be3ae10f4fb9d3274d3b0e62a5b79225a5efa66063dbaed4735662836"},{"version":"07eaba6c381ae3c3f513d61a39adc62373fa538f5f2e3852abbc7505f45e44b6","impliedFormat":1},{"version":"469553c9721c50aec757899f581032c92c0b4127642f844a5031aefce965473a","signature":"4b666ac1a7990c9486baa19cd3e53f8c9c5e32c0598e187a770ad74c99ed9c3c"},{"version":"22424c3f240fe46994bcd3f98c79c39cf8a79edba248278e5dee27dacb291783","signature":"b7eb7f5f605a366de5c0369c3c37faae65b6cedbeea1c02af181c150a27c87f5"},{"version":"402de08fca360d13663f4856674b922b8e46efdffa87996cb2acf899dacee025","signature":"ec39189f03830bd45a87edb9a42652496b53680436a2768ad2d076e67946b888"},{"version":"baa71d87a0d726eded3d9238e3260596a742709348e9afdb1dfbadc4c894022e","signature":"e35bd56a3656457d9b255d4e3efffb96fc8949c0da4b8d1474bfdfa5251d0baa"},{"version":"3c03afb0445285b225d41aae977a3e97544f29c8bf29b6f11c5117315cfc3f07","signature":"127248064fb2caf58b241ba43be526d8041316c470ddea6fc19e3db419930539"},{"version":"041597c12abeaa2ef07766775955fc87cfc65c43e0fe86c836071bea787e967c","impliedFormat":1},{"version":"044e197786d0bd718281d6f4ab7332684bc7c7b3ba8ecda54ac5038c89e6e0bb","impliedFormat":1},{"version":"072f583571d6e3d30cd9760ee3485d29484fb7b54ba772ac135c747a380096a1","impliedFormat":1},{"version":"7212c2d58855b8df35275180e97903a4b6093d4fbaefea863d8d028da63938c6","impliedFormat":1},{"version":"d8a6b3f899917210f00ddf13b564a2a4fdcf1e50c5a22e8d3abcfd4f1c4f9ae1","impliedFormat":1},{"version":"fd5eab954b31e761a72234031dadc3aab768763942a9637e380aed441cc94f59","impliedFormat":1},{"version":"c7aaac3119acf27e03190cc4224f1d81c7498cf6b36fa72d10d99f2c41d1bbc0","impliedFormat":1},{"version":"dd9faff42b456b5f03b85d8fbd64838eb92f6f7b03b36322cbc59c005b7033d3","impliedFormat":1},{"version":"6ff702721d87c0ba8e7f8950e7b0a3b009dfd912fab3997e0b63fab8d83919c3","impliedFormat":1},{"version":"9dce9fc12e9a79d1135699d525aa6b44b71a45e32e3fa0cf331060b980b16317","impliedFormat":1},{"version":"586b2fd8a7d582329658aaceec22f8a5399e05013deb49bcfde28f95f093c8ee","impliedFormat":1},{"version":"59c44b081724d4ab8039988aba34ee6b3bd41c30fc2d8686f4ed06588397b2f7","impliedFormat":1},{"version":"ef1f3eadd7bed282de45bafd7c2c00105cf1db93e22f6cd763bec8a9c2cf6df1","impliedFormat":1},{"version":"2b90463c902dbe4f5bbb9eae084c05de37477c17a5de1e342eb7cbc9410dc6a1","impliedFormat":1},{"version":"8cd4b9d5dec458d01d41e1d1dbc6db80332d6a2617aa1da09743ff8311d26d08","signature":"8638855504b37b5073c6b8847361c8145cfe733a5fd48e9d882ada2a0a432398"},{"version":"19ca0edc946ed47a731b7aa7b4a4f046dae8ad621766ced05b3641552b122b19","signature":"25542b6d9e30c5e2a33e61271f9f0259ad9ee86810c0f71a63d392a6064b76a3"},{"version":"9a40a3320a2301a30e155d4d8445d971ad516a73222c1374b204fbe90d6f5203","impliedFormat":1},{"version":"de86308e6e819652ab8c70c9356d528f999cfc22a54ed721da2287e83a8f6609","impliedFormat":1},{"version":"159fd6ba7d7797fbf06d9b3e2abec3139f2129109c95618b6218fa84e584771e","signature":"4f6ffdf3b696e80bf9513b7702bf8a7959a3e3f2a4fb1827aca6c91c2c773f97"},{"version":"aabc60fb7b65d334adb09e93a6530fedeb1e13ae924c68d7bd509a52a2ac6dd5","signature":"3354492e13b979a43e264202f4026bcd9cf20a5cff96de2cf01fa558e47308a3"},{"version":"fca938c2b4967ad2c8057742e647e014f8104ad131ea4857f4b69f14c419a46b","signature":"1ea5b740ebc8a27f3d88aa6c7a0a3c3884881ac8f04df6d0ef25c6bafbb4453b"},{"version":"c259207baf838f8a1303526ccd300921bbba3935a37301e62403b25ab2d6fa80","signature":"c7d1d8e785136cdc418db831074223d5629cddb95112b8b2dea0c5ae6977eea0"},{"version":"6dd897d393ad5400cbe7c5211aa5dd08ec5ec989962160bbf9ace93da2b01c5c","signature":"8d1a655a27915193a40360ce6cb9c03332a3d28958ae89e4f50614f347f68b81"}],"root":[[181,184],186,[188,192],207,208,[211,215]],"options":{"allowSyntheticDefaultImports":true,"allowUnreachableCode":false,"allowUnusedLabels":false,"alwaysStrict":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"exactOptionalPropertyTypes":true,"importHelpers":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictBindCallApply":true,"strictFunctionTypes":true,"strictNullChecks":true,"strictPropertyInitialization":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","useUnknownInCatchVariables":true},"referencedMap":[[210,1],[165,2],[173,3],[166,2],[178,4],[176,5],[170,6],[174,7],[177,4],[171,4],[175,4],[179,8],[180,9],[111,10],[112,10],[113,11],[64,12],[114,13],[115,14],[116,15],[59,4],[62,16],[60,4],[61,4],[117,17],[118,18],[119,19],[120,20],[121,21],[122,22],[123,22],[124,23],[125,24],[126,25],[127,26],[65,4],[63,4],[128,27],[129,28],[130,29],[164,30],[131,31],[132,4],[133,32],[134,33],[135,34],[136,35],[137,36],[138,37],[139,38],[140,39],[141,40],[142,40],[143,41],[144,4],[145,42],[146,43],[148,44],[147,45],[149,46],[150,47],[151,48],[152,49],[153,50],[154,51],[155,52],[156,53],[157,54],[158,55],[159,56],[160,57],[161,58],[66,4],[67,4],[68,4],[107,59],[108,4],[109,4],[110,46],[162,60],[163,61],[168,4],[169,4],[167,62],[172,63],[185,4],[69,4],[204,64],[205,65],[203,66],[206,67],[200,68],[201,69],[202,70],[187,4],[194,4],[196,68],[197,68],[199,71],[198,68],[193,72],[195,73],[209,4],[58,4],[56,4],[57,4],[11,4],[10,4],[2,4],[12,4],[13,4],[14,4],[15,4],[16,4],[17,4],[18,4],[19,4],[3,4],[20,4],[21,4],[4,4],[22,4],[26,4],[23,4],[24,4],[25,4],[27,4],[28,4],[29,4],[5,4],[30,4],[31,4],[32,4],[33,4],[6,4],[37,4],[34,4],[35,4],[36,4],[38,4],[7,4],[39,4],[44,4],[45,4],[40,4],[41,4],[42,4],[43,4],[8,4],[49,4],[46,4],[47,4],[48,4],[50,4],[9,4],[51,4],[52,4],[53,4],[55,4],[54,4],[1,4],[85,74],[95,75],[84,74],[105,76],[76,77],[75,78],[104,79],[98,80],[103,81],[78,82],[92,83],[77,84],[101,85],[73,86],[72,79],[102,87],[74,88],[79,89],[80,4],[83,89],[70,4],[106,90],[96,91],[87,92],[88,93],[90,94],[86,95],[89,96],[99,79],[81,97],[82,98],[91,99],[71,100],[94,91],[93,89],[97,4],[100,101],[184,102],[186,103],[214,104],[189,105],[182,106],[190,107],[181,108],[191,109],[192,110],[207,111],[208,111],[183,112],[213,111],[211,113],[212,110],[188,114],[215,106]],"version":"5.9.3"}