@eggjs/tegg-controller-plugin 3.62.0 → 4.0.0-beta.10

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/README.md +15 -126
  2. package/dist/app/middleware/tegg_root_proto.d.ts +3 -0
  3. package/dist/app/middleware/tegg_root_proto.js +8 -0
  4. package/dist/app.d.ts +23 -0
  5. package/dist/app.js +76 -0
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +2 -0
  8. package/{lib → dist/lib}/AppLoadUnitControllerHook.d.ts +4 -4
  9. package/dist/lib/AppLoadUnitControllerHook.js +29 -0
  10. package/{lib → dist/lib}/ControllerLoadUnit.d.ts +2 -2
  11. package/dist/lib/ControllerLoadUnit.js +72 -0
  12. package/{lib → dist/lib}/ControllerLoadUnitHandler.d.ts +4 -4
  13. package/dist/lib/ControllerLoadUnitHandler.js +29 -0
  14. package/{lib → dist/lib}/ControllerLoadUnitInstance.d.ts +3 -3
  15. package/dist/lib/ControllerLoadUnitInstance.js +36 -0
  16. package/{lib → dist/lib}/ControllerMetadataManager.d.ts +1 -1
  17. package/dist/lib/ControllerMetadataManager.js +27 -0
  18. package/{lib → dist/lib}/ControllerRegister.d.ts +2 -2
  19. package/dist/lib/ControllerRegister.js +3 -0
  20. package/{lib → dist/lib}/ControllerRegisterFactory.d.ts +4 -4
  21. package/dist/lib/ControllerRegisterFactory.js +22 -0
  22. package/dist/lib/EggControllerLoader.d.ts +7 -0
  23. package/dist/lib/EggControllerLoader.js +31 -0
  24. package/{lib → dist/lib}/EggControllerPrototypeHook.d.ts +2 -2
  25. package/dist/lib/EggControllerPrototypeHook.js +11 -0
  26. package/{lib → dist/lib}/RootProtoManager.d.ts +2 -2
  27. package/dist/lib/RootProtoManager.js +34 -0
  28. package/dist/lib/errors.js +12 -0
  29. package/dist/lib/impl/http/Acl.d.ts +2 -0
  30. package/dist/lib/impl/http/Acl.js +33 -0
  31. package/{lib → dist/lib}/impl/http/HTTPControllerRegister.d.ts +4 -4
  32. package/dist/lib/impl/http/HTTPControllerRegister.js +64 -0
  33. package/{lib → dist/lib}/impl/http/HTTPMethodRegister.d.ts +2 -2
  34. package/dist/lib/impl/http/HTTPMethodRegister.js +165 -0
  35. package/dist/lib/impl/http/Req.js +13 -0
  36. package/dist/types.d.ts +2 -0
  37. package/dist/types.js +3 -0
  38. package/package.json +60 -50
  39. package/app/middleware/mcp_body_middleware.d.ts +0 -3
  40. package/app/middleware/mcp_body_middleware.js +0 -48
  41. package/app/middleware/tegg_root_proto.d.ts +0 -3
  42. package/app/middleware/tegg_root_proto.js +0 -11
  43. package/app.d.ts +0 -15
  44. package/app.js +0 -143
  45. package/config/config.default.d.ts +0 -11
  46. package/config/config.default.js +0 -16
  47. package/lib/AppLoadUnitControllerHook.js +0 -28
  48. package/lib/ControllerLoadUnit.js +0 -71
  49. package/lib/ControllerLoadUnitHandler.js +0 -31
  50. package/lib/ControllerLoadUnitInstance.js +0 -34
  51. package/lib/ControllerMetadataManager.js +0 -30
  52. package/lib/ControllerRegister.js +0 -3
  53. package/lib/ControllerRegisterFactory.js +0 -21
  54. package/lib/EggControllerLoader.d.ts +0 -6
  55. package/lib/EggControllerLoader.js +0 -37
  56. package/lib/EggControllerPrototypeHook.js +0 -14
  57. package/lib/RootProtoManager.js +0 -38
  58. package/lib/errors.js +0 -16
  59. package/lib/impl/http/Acl.d.ts +0 -2
  60. package/lib/impl/http/Acl.js +0 -34
  61. package/lib/impl/http/HTTPControllerRegister.js +0 -62
  62. package/lib/impl/http/HTTPMethodRegister.js +0 -173
  63. package/lib/impl/http/Req.js +0 -17
  64. package/lib/impl/mcp/MCPConfig.d.ts +0 -32
  65. package/lib/impl/mcp/MCPConfig.js +0 -107
  66. package/lib/impl/mcp/MCPControllerRegister.d.ts +0 -67
  67. package/lib/impl/mcp/MCPControllerRegister.js +0 -541
  68. package/lib/impl/mcp/MCPServerHelper.d.ts +0 -17
  69. package/lib/impl/mcp/MCPServerHelper.js +0 -122
  70. package/typings/index.d.ts +0 -17
  71. /package/{lib → dist/lib}/errors.d.ts +0 -0
  72. /package/{lib → dist/lib}/impl/http/Req.d.ts +0 -0
package/README.md CHANGED
@@ -1,16 +1,28 @@
1
1
  # @eggjs/tegg-controller-plugin
2
2
 
3
+ [![NPM version][npm-image]][npm-url]
4
+ [![Known Vulnerabilities][snyk-image]][snyk-url]
5
+ [![npm download][download-image]][download-url]
6
+ [![Node.js Version](https://img.shields.io/node/v/@eggjs/tegg-controller-plugin.svg?style=flat)](https://nodejs.org/en/download/)
7
+
8
+ [npm-image]: https://img.shields.io/npm/v/@eggjs/tegg-controller-plugin.svg?style=flat-square
9
+ [npm-url]: https://npmjs.org/package/@eggjs/tegg-controller-plugin
10
+ [snyk-image]: https://snyk.io/test/npm/@eggjs/tegg-controller-plugin/badge.svg?style=flat-square
11
+ [snyk-url]: https://snyk.io/test/npm/@eggjs/tegg-controller-plugin
12
+ [download-image]: https://img.shields.io/npm/dm/@eggjs/tegg-controller-plugin.svg?style=flat-square
13
+ [download-url]: https://npmjs.org/package/@eggjs/tegg-controller-plugin
14
+
3
15
  使用注解的方式来开发 egg 中的 Controller
4
16
 
5
17
  ## Install
6
18
 
7
19
  ```shell
8
20
  # tegg 注解
9
- npm i --save @eggjs/tegg
21
+ npm i --save @eggjs/tegg@beta
10
22
  # tegg 插件
11
- npm i --save @eggjs/tegg-plugin
23
+ npm i --save @eggjs/tegg-plugin@beta
12
24
  # tegg controller 插件
13
- npm i --save @eggjs/tegg-controller-plugin
25
+ npm i --save @eggjs/tegg-controller-plugin@beta
14
26
  ```
15
27
 
16
28
  ## Prepare
@@ -211,126 +223,3 @@ export class FooController {
211
223
  }
212
224
  }
213
225
  ```
214
-
215
- ### MCP 注解
216
-
217
- #### MCPController/MCPPrompt/MCPTool/MCPResource
218
-
219
- `@MCPController` 注解用来声明当前类是一个 MCP controller。
220
- 通过使用装饰器 `@MCPPrompt` `@MCPTool` `@MCPResource` 来声明对应的 MCP 类型。
221
- 使用 `@ToolArgsSchema` `@PromptArgsSchema` `@Extra` 来 schema 和 extra。
222
-
223
- ```ts
224
- import {
225
- MCPController,
226
- PromptArgs,
227
- ToolArgs,
228
- MCPPromptResponse,
229
- MCPToolResponse,
230
- MCPResourceResponse,
231
- MCPPrompt,
232
- MCPTool,
233
- MCPResource,
234
- PromptArgsSchema,
235
- Logger,
236
- Inject,
237
- ToolArgsSchema,
238
- } from '@eggjs/tegg';
239
- import z from 'zod';
240
-
241
- export const PromptType = {
242
- name: z.string(),
243
- };
244
-
245
- export const ToolType = {
246
- name: z.string({
247
- description: 'npm package name',
248
- }),
249
- };
250
-
251
-
252
- @MCPController()
253
- export class McpController {
254
-
255
- @Inject()
256
- logger: Logger;
257
-
258
- @MCPPrompt()
259
- async foo(@PromptArgsSchema(PromptType) args: PromptArgs<typeof PromptType>): Promise<MCPPromptResponse> {
260
- this.logger.info('hello world');
261
- return {
262
- messages: [
263
- {
264
- role: 'user',
265
- content: {
266
- type: 'text',
267
- text: `Generate a concise but descriptive commit message for these changes:\n\n${args.name}`,
268
- },
269
- },
270
- ],
271
- };
272
- }
273
-
274
- @MCPTool()
275
- async bar(@ToolArgsSchema(ToolType) args: ToolArgs<typeof ToolType>): Promise<MCPToolResponse> {
276
- return {
277
- content: [
278
- {
279
- type: 'text',
280
- text: `npm package: ${args.name} not found`,
281
- },
282
- ],
283
- };
284
- }
285
-
286
-
287
- @MCPResource({
288
- template: [
289
- 'mcp://npm/{name}{?version}',
290
- {
291
- list: () => {
292
- return {
293
- resources: [
294
- { name: 'egg', uri: 'mcp://npm/egg?version=4.10.0' },
295
- { name: 'mcp', uri: 'mcp://npm/mcp?version=0.10.0' },
296
- ],
297
- };
298
- },
299
- },
300
- ],
301
- })
302
- async car(uri: URL): Promise<MCPResourceResponse> {
303
- return {
304
- contents: [{
305
- uri: uri.toString(),
306
- text: 'MOCK TEXT',
307
- }],
308
- };
309
- }
310
- }
311
-
312
- ```
313
-
314
- #### MCP 地址
315
- MCP controller 完整的实现了 SSE / streamable HTTP / streamable stateless HTTP 三种模式,默认情况下,他们的路径分别是 `/mcp/init` `/mcp/stream` `/mcp/stateless/stream`, 你可以根据你所需要的场景,灵活使用对应的接口。
316
-
317
- ``` ts
318
- // config.{env}.ts
319
- import { randomUUID } from 'node:crypto';
320
-
321
- export default () => {
322
-
323
- const config = {
324
- mcp: {
325
- sseInitPath: '/mcp/init', // SSE path
326
- sseMessagePath: '/mcp/message', // SSE message path
327
- streamPath: '/mcp/stream', // streamable path
328
- statelessStreamPath: '/mcp/stateless/stream', // stateless streamable path
329
- sessionIdGenerator: randomUUID,
330
- },
331
- };
332
-
333
- return config;
334
- };
335
-
336
- ```
@@ -0,0 +1,3 @@
1
+ import type { MiddlewareFunc } from 'egg';
2
+ declare const _default: () => MiddlewareFunc;
3
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { ROOT_PROTO } from '@eggjs/egg-module-common';
2
+ export default () => {
3
+ return async function teggRootProto(ctx, next) {
4
+ ctx[ROOT_PROTO] = ctx.app.rootProtoManager.getRootProto(ctx);
5
+ return next();
6
+ };
7
+ };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVnZ19yb290X3Byb3RvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcC9taWRkbGV3YXJlL3RlZ2dfcm9vdF9wcm90by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsZUFBZSxHQUFtQixFQUFFO0lBQ2xDLE9BQU8sS0FBSyxVQUFVLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUMzQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUEifQ==
package/dist/app.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import type { Application, ILifecycleBoot } from 'egg';
2
+ import { ControllerMetaBuilderFactory } from '@eggjs/tegg';
3
+ import { ControllerRegisterFactory } from './lib/ControllerRegisterFactory.ts';
4
+ import { RootProtoManager } from './lib/RootProtoManager.ts';
5
+ export default class ControllerAppBootHook implements ILifecycleBoot {
6
+ private readonly app;
7
+ private readonly loadUnitHook;
8
+ private readonly controllerRegisterFactory;
9
+ private controllerLoadUnitHandler;
10
+ private readonly controllerPrototypeHook;
11
+ constructor(app: Application);
12
+ configWillLoad(): void;
13
+ prepareMiddleware(middlewareNames: string[]): string[];
14
+ didLoad(): Promise<void>;
15
+ beforeClose(): Promise<void>;
16
+ }
17
+ declare module 'egg' {
18
+ interface Application {
19
+ rootProtoManager: RootProtoManager;
20
+ controllerRegisterFactory: ControllerRegisterFactory;
21
+ controllerMetaBuilderFactory: typeof ControllerMetaBuilderFactory;
22
+ }
23
+ }
package/dist/app.js ADDED
@@ -0,0 +1,76 @@
1
+ import {} from '@eggjs/tegg-metadata';
2
+ import { ControllerMetaBuilderFactory, ControllerType } from '@eggjs/tegg';
3
+ import { ModuleLoadUnitInstance } from '@eggjs/tegg-runtime';
4
+ import { CONTROLLER_LOAD_UNIT, ControllerLoadUnit } from "./lib/ControllerLoadUnit.js";
5
+ import { AppLoadUnitControllerHook } from "./lib/AppLoadUnitControllerHook.js";
6
+ import { HTTPControllerRegister } from "./lib/impl/http/HTTPControllerRegister.js";
7
+ import { ControllerRegisterFactory } from "./lib/ControllerRegisterFactory.js";
8
+ import { ControllerLoadUnitHandler } from "./lib/ControllerLoadUnitHandler.js";
9
+ import { ControllerMetadataManager } from "./lib/ControllerMetadataManager.js";
10
+ import { EggControllerPrototypeHook } from "./lib/EggControllerPrototypeHook.js";
11
+ import { RootProtoManager } from "./lib/RootProtoManager.js";
12
+ import { EggControllerLoader } from "./lib/EggControllerLoader.js";
13
+ // Load Controller process
14
+ // 1. await add load unit is ready, controller may depend other load unit
15
+ // 2. load ${app_base_dir}app/controller file
16
+ // 3. ControllerRegister register controller implement
17
+ export default class ControllerAppBootHook {
18
+ app;
19
+ loadUnitHook;
20
+ controllerRegisterFactory;
21
+ controllerLoadUnitHandler;
22
+ controllerPrototypeHook;
23
+ constructor(app) {
24
+ this.app = app;
25
+ this.controllerRegisterFactory = new ControllerRegisterFactory(this.app);
26
+ this.app.rootProtoManager = new RootProtoManager();
27
+ this.app.controllerRegisterFactory = this.controllerRegisterFactory;
28
+ this.app.controllerMetaBuilderFactory = ControllerMetaBuilderFactory;
29
+ this.loadUnitHook = new AppLoadUnitControllerHook(this.controllerRegisterFactory, this.app.rootProtoManager);
30
+ this.controllerPrototypeHook = new EggControllerPrototypeHook();
31
+ }
32
+ configWillLoad() {
33
+ this.app.loadUnitLifecycleUtil.registerLifecycle(this.loadUnitHook);
34
+ this.app.eggPrototypeLifecycleUtil.registerLifecycle(this.controllerPrototypeHook);
35
+ this.app.loaderFactory.registerLoader(CONTROLLER_LOAD_UNIT, unitPath => {
36
+ return new EggControllerLoader(unitPath);
37
+ });
38
+ this.controllerRegisterFactory.registerControllerRegister(ControllerType.HTTP, HTTPControllerRegister.create);
39
+ this.app.loadUnitFactory.registerLoadUnitCreator(CONTROLLER_LOAD_UNIT, (ctx) => {
40
+ return new ControllerLoadUnit(`tegg-app-controller:${ctx.unitPath}`, ctx.unitPath, ctx.loader, this.app.eggPrototypeFactory, this.app.eggPrototypeCreatorFactory);
41
+ });
42
+ this.app.loadUnitInstanceFactory.registerLoadUnitInstanceClass(CONTROLLER_LOAD_UNIT, (ctx) => {
43
+ return new ModuleLoadUnitInstance(ctx.loadUnit);
44
+ });
45
+ // init http root proto middleware
46
+ this.prepareMiddleware(this.app.config.coreMiddleware);
47
+ }
48
+ prepareMiddleware(middlewareNames) {
49
+ if (!middlewareNames.includes('teggCtxLifecycleMiddleware')) {
50
+ middlewareNames.unshift('teggCtxLifecycleMiddleware');
51
+ }
52
+ const index = middlewareNames.indexOf('teggCtxLifecycleMiddleware');
53
+ middlewareNames.splice(index, 0, 'teggRootProto');
54
+ return middlewareNames;
55
+ }
56
+ async didLoad() {
57
+ await this.app.moduleHandler.ready();
58
+ this.controllerLoadUnitHandler = new ControllerLoadUnitHandler(this.app);
59
+ await this.controllerLoadUnitHandler.ready();
60
+ // The real register HTTP controller/method.
61
+ // HTTP method should sort by priority
62
+ // The HTTPControllerRegister will collect all the methods
63
+ // and register methods after collect is done.
64
+ HTTPControllerRegister.instance?.doRegister(this.app.rootProtoManager);
65
+ }
66
+ async beforeClose() {
67
+ if (this.controllerLoadUnitHandler) {
68
+ await this.controllerLoadUnitHandler.destroy();
69
+ }
70
+ this.app.loadUnitLifecycleUtil.deleteLifecycle(this.loadUnitHook);
71
+ this.app.eggPrototypeLifecycleUtil.deleteLifecycle(this.controllerPrototypeHook);
72
+ ControllerMetadataManager.instance.clear();
73
+ HTTPControllerRegister.clean();
74
+ }
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWlDLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzRSxPQUFPLEVBQXlDLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFcEcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsMEJBQTBCO0FBQzFCLHlFQUF5RTtBQUN6RSw2Q0FBNkM7QUFDN0Msc0RBQXNEO0FBRXRELE1BQU0sQ0FBQyxPQUFPLE9BQU8scUJBQXFCO0lBQ3ZCLEdBQUcsQ0FBYztJQUNqQixZQUFZLENBQTRCO0lBQ3hDLHlCQUF5QixDQUE0QjtJQUM5RCx5QkFBeUIsQ0FBNEI7SUFDNUMsdUJBQXVCLENBQTZCO0lBRXJFLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMseUJBQXlCLEdBQUcs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
@@ -0,0 +1 @@
1
+ import './types.ts';
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ import "./types.js";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLENBQUMifQ==
@@ -1,7 +1,7 @@
1
- import { LoadUnit, LoadUnitLifecycleContext } from '@eggjs/tegg-metadata';
2
- import { LifecycleHook } from '@eggjs/tegg';
3
- import { ControllerRegisterFactory } from './ControllerRegisterFactory';
4
- import { RootProtoManager } from './RootProtoManager';
1
+ import { type LoadUnit, type LoadUnitLifecycleContext } from '@eggjs/tegg-metadata';
2
+ import { type LifecycleHook } from '@eggjs/tegg';
3
+ import { ControllerRegisterFactory } from './ControllerRegisterFactory.ts';
4
+ import { RootProtoManager } from './RootProtoManager.ts';
5
5
  export declare class AppLoadUnitControllerHook implements LifecycleHook<LoadUnitLifecycleContext, LoadUnit> {
6
6
  private readonly controllerRegisterFactory;
7
7
  private readonly rootProtoManager;
@@ -0,0 +1,29 @@
1
+ import {} from '@eggjs/tegg-metadata';
2
+ import { CONTROLLER_META_DATA } from '@eggjs/tegg';
3
+ import { ControllerRegisterFactory } from "./ControllerRegisterFactory.js";
4
+ import { ControllerMetadataManager } from "./ControllerMetadataManager.js";
5
+ import { RootProtoManager } from "./RootProtoManager.js";
6
+ export class AppLoadUnitControllerHook {
7
+ controllerRegisterFactory;
8
+ rootProtoManager;
9
+ constructor(controllerRegisterFactory, rootProtoManager) {
10
+ this.controllerRegisterFactory = controllerRegisterFactory;
11
+ this.rootProtoManager = rootProtoManager;
12
+ }
13
+ async postCreate(_, obj) {
14
+ const iterator = obj.iterateEggPrototype();
15
+ for (const proto of iterator) {
16
+ const metadata = proto.getMetaData(CONTROLLER_META_DATA);
17
+ if (!metadata) {
18
+ continue;
19
+ }
20
+ const register = this.controllerRegisterFactory.getControllerRegister(proto, metadata);
21
+ if (!register) {
22
+ throw new Error(`not find controller implement for ${String(proto.name)} which type is ${metadata.type}`);
23
+ }
24
+ ControllerMetadataManager.instance.addController(metadata);
25
+ await register.register(this.rootProtoManager, obj);
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwTG9hZFVuaXRDb250cm9sbGVySG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvQXBwTG9hZFVuaXRDb250cm9sbGVySG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdELE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUErQyxNQUFNLGFBQWEsQ0FBQztBQUVoRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxNQUFNLE9BQU8seUJBQXlCO0lBQ25CLHlCQUF5QixDQUE0QjtJQUNyRCxnQkFBZ0IsQ0FBbUI7SUFFcEQsWUFBWSx5QkFBb0QsRUFBRSxnQkFBa0M7UUFDbEcsSUFBSSxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO1FBQzNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUEyQixFQUFFLEdBQWE7UUFDekQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBbUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDZCxTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM1RyxDQUFDO1lBQ0QseUJBQXlCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -1,5 +1,5 @@
1
- import { EggPrototype, EggPrototypeFactory, Loader, LoadUnit, EggPrototypeCreatorFactory } from '@eggjs/tegg-metadata';
2
- import { QualifierInfo, Id } from '@eggjs/tegg';
1
+ import { type EggPrototype, EggPrototypeFactory, type Loader, type LoadUnit, type EggPrototypeCreatorFactory } from '@eggjs/tegg-metadata';
2
+ import { type QualifierInfo, type Id } from '@eggjs/tegg';
3
3
  export declare const CONTROLLER_LOAD_UNIT = "app#controller";
4
4
  export declare class ControllerLoadUnit implements LoadUnit {
5
5
  private readonly loader;
@@ -0,0 +1,72 @@
1
+ import { EggPrototypeFactory, } from '@eggjs/tegg-metadata';
2
+ import { IdenticalUtil, } from '@eggjs/tegg';
3
+ import { MapUtil } from '@eggjs/tegg-common-util';
4
+ export const CONTROLLER_LOAD_UNIT = 'app#controller';
5
+ // ControllerLoadUnit is responsible for manage controller proto
6
+ export class ControllerLoadUnit {
7
+ loader;
8
+ id;
9
+ name;
10
+ type = CONTROLLER_LOAD_UNIT;
11
+ unitPath;
12
+ eggPrototypeFactory;
13
+ eggPrototypeCreatorFactory;
14
+ protoMap = new Map();
15
+ constructor(name, unitPath, loader, eggPrototypeFactory, eggPrototypeCreatorFactory) {
16
+ this.id = IdenticalUtil.createLoadUnitId(name);
17
+ this.name = name;
18
+ this.unitPath = unitPath;
19
+ this.loader = loader;
20
+ this.eggPrototypeFactory = eggPrototypeFactory;
21
+ this.eggPrototypeCreatorFactory = eggPrototypeCreatorFactory;
22
+ }
23
+ async init() {
24
+ const clazzList = await this.loader.load();
25
+ for (const clazz of clazzList) {
26
+ const protos = await this.eggPrototypeCreatorFactory.createProto(clazz, this);
27
+ for (const proto of protos) {
28
+ this.eggPrototypeFactory.registerPrototype(proto, this);
29
+ }
30
+ }
31
+ }
32
+ containPrototype(proto) {
33
+ return !!(this.protoMap.get(proto.name)?.find(t => t === proto));
34
+ }
35
+ getEggPrototype(name, qualifiers) {
36
+ const protos = this.protoMap.get(name);
37
+ return protos?.filter(proto => proto.verifyQualifiers(qualifiers)) || [];
38
+ }
39
+ registerEggPrototype(proto) {
40
+ const protoList = MapUtil.getOrStore(this.protoMap, proto.name, []);
41
+ protoList.push(proto);
42
+ }
43
+ deletePrototype(proto) {
44
+ const protos = this.protoMap.get(proto.name);
45
+ if (protos) {
46
+ const index = protos.indexOf(proto);
47
+ if (index !== -1) {
48
+ protos.splice(index, 1);
49
+ }
50
+ }
51
+ }
52
+ async destroy() {
53
+ for (const namedProtos of this.protoMap.values()) {
54
+ // Delete prototype will delete item
55
+ // array iterator is not safe
56
+ const protos = namedProtos.slice();
57
+ for (const proto of protos) {
58
+ EggPrototypeFactory.instance.deletePrototype(proto, this);
59
+ }
60
+ }
61
+ this.protoMap.clear();
62
+ }
63
+ iterateEggPrototype() {
64
+ const protos = Array.from(this.protoMap.values())
65
+ .reduce((p, c) => {
66
+ p = p.concat(c);
67
+ return p;
68
+ }, []);
69
+ return protos.values();
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlckxvYWRVbml0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9Db250cm9sbGVyTG9hZFVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLG1CQUFtQixHQUlwQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFJTCxhQUFhLEdBQ2QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWxELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO0FBRXJELGdFQUFnRTtBQUNoRSxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osTUFBTSxDQUFTO0lBQ2hDLEVBQUUsQ0FBSztJQUNFLElBQUksQ0FBUztJQUNiLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUM1QixRQUFRLENBQVM7SUFDbEIsbUJBQW1CLENBQXNCO0lBQ3pDLDBCQUEwQixDQUFvQztJQUM5RCxRQUFRLEdBQTBDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFcEUsWUFDRSxJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsTUFBYyxFQUNkLG1CQUF3QyxFQUN4QywwQkFBNkQ7UUFFN0QsSUFBSSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQywwQkFBMEIsR0FBRywwQkFBMEIsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFB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
@@ -1,7 +1,7 @@
1
- import Base from 'sdk-base';
2
- import { Application } from 'egg';
3
- import { LoadUnit } from '@eggjs/tegg-metadata';
4
- import { LoadUnitInstance } from '@eggjs/tegg-runtime';
1
+ import { Base } from 'sdk-base';
2
+ import type { Application } from 'egg';
3
+ import { type LoadUnit } from '@eggjs/tegg-metadata';
4
+ import { type LoadUnitInstance } from '@eggjs/tegg-runtime';
5
5
  export declare class ControllerLoadUnitHandler extends Base {
6
6
  private readonly app;
7
7
  controllerLoadUnit: LoadUnit;
@@ -0,0 +1,29 @@
1
+ import path from 'node:path';
2
+ import { Base } from 'sdk-base';
3
+ import { EggLoadUnitType } from '@eggjs/tegg-metadata';
4
+ import {} from '@eggjs/tegg-runtime';
5
+ import { CONTROLLER_LOAD_UNIT } from "./ControllerLoadUnit.js";
6
+ export class ControllerLoadUnitHandler extends Base {
7
+ app;
8
+ controllerLoadUnit;
9
+ controllerLoadUnitInstance;
10
+ constructor(app) {
11
+ super({ initMethod: '_init' });
12
+ this.app = app;
13
+ }
14
+ async _init() {
15
+ const controllerDir = path.join(this.app.config.baseDir, 'app/controller');
16
+ const loader = this.app.loaderFactory.createLoader(controllerDir, CONTROLLER_LOAD_UNIT);
17
+ this.controllerLoadUnit = await this.app.loadUnitFactory.createLoadUnit(controllerDir, CONTROLLER_LOAD_UNIT, loader);
18
+ this.controllerLoadUnitInstance = await this.app.loadUnitInstanceFactory.createLoadUnitInstance(this.controllerLoadUnit);
19
+ }
20
+ async destroy() {
21
+ if (this.controllerLoadUnit) {
22
+ await this.app.loadUnitFactory.destroyLoadUnit(this.controllerLoadUnit);
23
+ }
24
+ if (this.controllerLoadUnitInstance) {
25
+ await this.app.loadUnitInstanceFactory.destroyLoadUnitInstance(this.controllerLoadUnitInstance);
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlckxvYWRVbml0SGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvQ29udHJvbGxlckxvYWRVbml0SGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFFN0IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsZUFBZSxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBeUIsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsSUFBSTtJQUNoQyxHQUFHLENBQWM7SUFDbEMsa0JBQWtCLENBQVc7SUFDN0IsMEJBQTBCLENBQW1CO0lBRTdDLFlBQVksR0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLG9CQUF1QyxDQUFDLENBQUM7UUFDM0csSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTztRQUNYLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
@@ -1,6 +1,6 @@
1
- import { EggPrototype, LoadUnit } from '@eggjs/tegg-metadata';
2
- import { EggObjectName } from '@eggjs/tegg';
3
- import { EggObject, LoadUnitInstance, LoadUnitInstanceLifecycleContext, LoadUnitInstanceLifecycleUtil } from '@eggjs/tegg-runtime';
1
+ import { type EggPrototype, type LoadUnit } from '@eggjs/tegg-metadata';
2
+ import { type EggObjectName } from '@eggjs/tegg';
3
+ import { type EggObject, type LoadUnitInstance, type LoadUnitInstanceLifecycleContext, LoadUnitInstanceLifecycleUtil } from '@eggjs/tegg-runtime';
4
4
  export declare class ControllerLoadUnitInstance implements LoadUnitInstance {
5
5
  readonly loadUnit: LoadUnit;
6
6
  readonly id: string;
@@ -0,0 +1,36 @@
1
+ import {} from '@eggjs/tegg-metadata';
2
+ import { IdenticalUtil } from '@eggjs/tegg';
3
+ import { LoadUnitInstanceLifecycleUtil, } from '@eggjs/tegg-runtime';
4
+ export class ControllerLoadUnitInstance {
5
+ loadUnit;
6
+ id;
7
+ name;
8
+ protoToCreateMap = new Map();
9
+ loadUnitInstanceLifecycleUtil;
10
+ constructor(loadUnit, loadUnitInstanceLifecycleUtil) {
11
+ this.loadUnit = loadUnit;
12
+ this.name = loadUnit.name;
13
+ this.id = IdenticalUtil.createLoadUnitInstanceId(loadUnit.id);
14
+ this.loadUnitInstanceLifecycleUtil = loadUnitInstanceLifecycleUtil;
15
+ }
16
+ iterateProtoToCreate() {
17
+ return this.protoToCreateMap.entries();
18
+ }
19
+ addProtoToCreate() {
20
+ throw new Error('controller load unit not allow have singleton proto');
21
+ }
22
+ deleteProtoToCreate() {
23
+ throw new Error('controller load unit not allow have singleton proto');
24
+ }
25
+ async init(ctx) {
26
+ await this.loadUnitInstanceLifecycleUtil.objectPreCreate(ctx, this);
27
+ await this.loadUnitInstanceLifecycleUtil.objectPostCreate(ctx, this);
28
+ }
29
+ async getOrCreateEggObject() {
30
+ throw new Error('controller load unit not allow have singleton proto');
31
+ }
32
+ getEggObject() {
33
+ throw new Error('controller load unit not allow have singleton proto');
34
+ }
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlckxvYWRVbml0SW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL0NvbnRyb2xsZXJMb2FkVW5pdEluc3RhbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQTZDLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2RixPQUFPLEVBR2tDLDZCQUE2QixHQUNyRSxNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE1BQU0sT0FBTywwQkFBMEI7SUFDNUIsUUFBUSxDQUFXO0lBQ25CLEVBQUUsQ0FBUztJQUNYLElBQUksQ0FBUztJQUNkLGdCQUFnQixHQUF3QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2xFLDZCQUE2QixDQUF1QztJQUU1RSxZQUFZLFFBQWtCLEVBQUUsNkJBQW1FO1FBQ2pHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLDZCQUE2QixDQUFDO0lBQ3JFLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFxQztRQUM5QyxNQUFNLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sSUFBSSxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNGIn0=
@@ -1,4 +1,4 @@
1
- import { ControllerMetadata } from '@eggjs/tegg';
1
+ import { type ControllerMetadata } from '@eggjs/tegg';
2
2
  export declare class ControllerMetadataManager {
3
3
  private readonly controllers;
4
4
  static instance: ControllerMetadataManager;
@@ -0,0 +1,27 @@
1
+ import {} from '@eggjs/tegg';
2
+ import { MapUtil } from '@eggjs/tegg-common-util';
3
+ export class ControllerMetadataManager {
4
+ controllers = new Map();
5
+ static instance = new ControllerMetadataManager();
6
+ constructor() {
7
+ this.controllers = new Map();
8
+ }
9
+ addController(metadata) {
10
+ const typeControllers = MapUtil.getOrStore(this.controllers, metadata.type, []);
11
+ // 1.check controller name
12
+ // 2.check proto name
13
+ const sameNameControllers = typeControllers.filter(c => c.controllerName === metadata.controllerName);
14
+ if (sameNameControllers.length) {
15
+ throw new Error(`duplicate controller name ${metadata.controllerName}`);
16
+ }
17
+ const sameProtoControllers = typeControllers.filter(c => c.protoName === metadata.protoName);
18
+ if (sameProtoControllers.length) {
19
+ throw new Error(`duplicate proto name ${String(metadata.protoName)}`);
20
+ }
21
+ typeControllers.push(metadata);
22
+ }
23
+ clear() {
24
+ this.controllers.clear();
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlck1ldGFkYXRhTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvQ29udHJvbGxlck1ldGFkYXRhTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9ELE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxNQUFNLE9BQU8seUJBQXlCO0lBQ25CLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBNEMsQ0FBQztJQUVuRixNQUFNLENBQUMsUUFBUSxHQUFHLElBQUkseUJBQXlCLEVBQUUsQ0FBQztJQUVsRDtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLFFBQTRCO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLDBCQUEwQjtRQUMxQixxQkFBcUI7UUFDckIsTUFBTSxtQkFBbUIsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEcsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0YsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQyJ9
@@ -1,5 +1,5 @@
1
- import { LoadUnit } from '@eggjs/tegg-metadata';
2
- import { RootProtoManager } from './RootProtoManager';
1
+ import { type LoadUnit } from '@eggjs/tegg-metadata';
2
+ import { RootProtoManager } from './RootProtoManager.ts';
3
3
  export interface ControllerRegister {
4
4
  register(rootProtoManager: RootProtoManager, loadUnit?: LoadUnit): Promise<void>;
5
5
  }
@@ -0,0 +1,3 @@
1
+ import {} from '@eggjs/tegg-metadata';
2
+ import { RootProtoManager } from "./RootProtoManager.js";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlclJlZ2lzdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9Db250cm9sbGVyUmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRXJELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDIn0=
@@ -1,7 +1,7 @@
1
- import { Application } from 'egg';
2
- import { ControllerMetadata, ControllerTypeLike } from '@eggjs/tegg';
3
- import { EggPrototype } from '@eggjs/tegg-metadata';
4
- import { ControllerRegister } from './ControllerRegister';
1
+ import type { Application } from 'egg';
2
+ import { type ControllerMetadata, type ControllerTypeLike } from '@eggjs/tegg';
3
+ import { type EggPrototype } from '@eggjs/tegg-metadata';
4
+ import { type ControllerRegister } from './ControllerRegister.ts';
5
5
  export type RegisterCreator = (proto: EggPrototype, controllerMeta: ControllerMetadata, app: Application) => ControllerRegister;
6
6
  export declare class ControllerRegisterFactory {
7
7
  private readonly app;
@@ -0,0 +1,22 @@
1
+ import {} from '@eggjs/tegg';
2
+ import {} from '@eggjs/tegg-metadata';
3
+ import {} from "./ControllerRegister.js";
4
+ export class ControllerRegisterFactory {
5
+ app;
6
+ registerCreatorMap;
7
+ constructor(app) {
8
+ this.app = app;
9
+ this.registerCreatorMap = new Map();
10
+ }
11
+ registerControllerRegister(type, creator) {
12
+ this.registerCreatorMap.set(type, creator);
13
+ }
14
+ getControllerRegister(proto, metadata) {
15
+ const creator = this.registerCreatorMap.get(metadata.type);
16
+ if (!creator) {
17
+ return;
18
+ }
19
+ return creator(proto, metadata, this.app);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlclJlZ2lzdGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvQ29udHJvbGxlclJlZ2lzdGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQW9ELE1BQU0sYUFBYSxDQUFDO0FBQy9FLE9BQU8sRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQTJCLE1BQU0seUJBQXlCLENBQUM7QUFJbEUsTUFBTSxPQUFPLHlCQUF5QjtJQUNuQixHQUFHLENBQWM7SUFDMUIsa0JBQWtCLENBQTJDO0lBRXJFLFlBQVksR0FBZ0I7UUFDMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBd0IsRUFBRSxPQUF3QjtRQUMzRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBbUIsRUFBRSxRQUE0QjtRQUNyRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRiJ9
@@ -0,0 +1,7 @@
1
+ import type { EggProtoImplClass } from '@eggjs/tegg';
2
+ import type { Loader } from '@eggjs/tegg-types';
3
+ export declare class EggControllerLoader implements Loader {
4
+ private readonly controllerDir;
5
+ constructor(controllerDir: string);
6
+ load(): Promise<EggProtoImplClass[]>;
7
+ }