@eggjs/tegg-metadata 3.51.2 → 4.0.0-beta.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 (80) hide show
  1. package/package.json +22 -21
  2. package/src/errors.js +27 -0
  3. package/{dist/src → src}/factory/EggPrototypeCreatorFactory.d.ts +1 -1
  4. package/src/factory/EggPrototypeCreatorFactory.js +103 -0
  5. package/src/factory/EggPrototypeFactory.js +52 -0
  6. package/src/factory/LoadUnitFactory.js +59 -0
  7. package/src/factory/index.d.ts +3 -0
  8. package/src/factory/index.js +4 -0
  9. package/src/impl/EggPrototypeBuilder.js +124 -0
  10. package/{dist/src → src}/impl/EggPrototypeImpl.d.ts +1 -0
  11. package/src/impl/EggPrototypeImpl.js +53 -0
  12. package/src/impl/LoadUnitMultiInstanceProtoHook.js +18 -0
  13. package/{dist/src → src}/impl/ModuleLoadUnit.d.ts +2 -2
  14. package/src/impl/ModuleLoadUnit.js +268 -0
  15. package/src/impl/index.d.ts +4 -0
  16. package/src/impl/index.js +5 -0
  17. package/src/index.d.ts +6 -0
  18. package/src/index.js +7 -0
  19. package/{dist/src → src}/model/AppGraph.d.ts +4 -3
  20. package/src/model/AppGraph.js +264 -0
  21. package/src/model/EggPrototype.js +3 -0
  22. package/src/model/LoadUnit.js +3 -0
  23. package/src/model/ModuleDescriptor.js +38 -0
  24. package/src/model/ProtoDescriptor/AbstractProtoDescriptor.js +30 -0
  25. package/{dist/src → src}/model/ProtoDescriptor/ClassProtoDescriptor.d.ts +1 -1
  26. package/src/model/ProtoDescriptor/ClassProtoDescriptor.js +30 -0
  27. package/src/model/ProtoDescriptor/index.d.ts +2 -0
  28. package/src/model/ProtoDescriptor/index.js +3 -0
  29. package/{dist/src → src}/model/ProtoDescriptorHelper.d.ts +3 -3
  30. package/src/model/ProtoDescriptorHelper.js +129 -0
  31. package/{dist/src → src}/model/graph/GlobalGraph.d.ts +4 -4
  32. package/src/model/graph/GlobalGraph.js +233 -0
  33. package/{dist/src → src}/model/graph/GlobalModuleNode.d.ts +1 -1
  34. package/src/model/graph/GlobalModuleNode.js +38 -0
  35. package/{dist/src → src}/model/graph/GlobalModuleNodeBuilder.d.ts +2 -2
  36. package/src/model/graph/GlobalModuleNodeBuilder.js +53 -0
  37. package/{dist/src → src}/model/graph/ProtoNode.d.ts +1 -1
  38. package/src/model/graph/ProtoNode.js +37 -0
  39. package/src/model/graph/ProtoSelector.js +2 -0
  40. package/src/model/graph/index.d.ts +5 -0
  41. package/src/model/graph/index.js +6 -0
  42. package/src/model/index.d.ts +7 -0
  43. package/src/model/index.js +8 -0
  44. package/src/util/ClassUtil.js +17 -0
  45. package/src/util/index.d.ts +1 -0
  46. package/src/util/index.js +2 -0
  47. package/dist/index.d.ts +0 -21
  48. package/dist/index.js +0 -38
  49. package/dist/src/errors.js +0 -34
  50. package/dist/src/factory/EggPrototypeCreatorFactory.js +0 -104
  51. package/dist/src/factory/EggPrototypeFactory.js +0 -58
  52. package/dist/src/factory/LoadUnitFactory.js +0 -63
  53. package/dist/src/impl/EggPrototypeBuilder.js +0 -128
  54. package/dist/src/impl/EggPrototypeImpl.js +0 -45
  55. package/dist/src/impl/LoadUnitMultiInstanceProtoHook.js +0 -24
  56. package/dist/src/impl/ModuleLoadUnit.js +0 -259
  57. package/dist/src/model/AppGraph.js +0 -262
  58. package/dist/src/model/EggPrototype.js +0 -6
  59. package/dist/src/model/LoadUnit.js +0 -6
  60. package/dist/src/model/ModuleDescriptor.js +0 -46
  61. package/dist/src/model/ProtoDescriptor/AbstractProtoDescriptor.js +0 -21
  62. package/dist/src/model/ProtoDescriptor/ClassProtoDescriptor.js +0 -32
  63. package/dist/src/model/ProtoDescriptorHelper.js +0 -143
  64. package/dist/src/model/graph/GlobalGraph.js +0 -213
  65. package/dist/src/model/graph/GlobalModuleNode.js +0 -36
  66. package/dist/src/model/graph/GlobalModuleNodeBuilder.js +0 -53
  67. package/dist/src/model/graph/ProtoNode.js +0 -39
  68. package/dist/src/model/graph/ProtoSelector.js +0 -3
  69. package/dist/src/util/ClassUtil.js +0 -21
  70. /package/{dist/src → src}/errors.d.ts +0 -0
  71. /package/{dist/src → src}/factory/EggPrototypeFactory.d.ts +0 -0
  72. /package/{dist/src → src}/factory/LoadUnitFactory.d.ts +0 -0
  73. /package/{dist/src → src}/impl/EggPrototypeBuilder.d.ts +0 -0
  74. /package/{dist/src → src}/impl/LoadUnitMultiInstanceProtoHook.d.ts +0 -0
  75. /package/{dist/src → src}/model/EggPrototype.d.ts +0 -0
  76. /package/{dist/src → src}/model/LoadUnit.d.ts +0 -0
  77. /package/{dist/src → src}/model/ModuleDescriptor.d.ts +0 -0
  78. /package/{dist/src → src}/model/ProtoDescriptor/AbstractProtoDescriptor.d.ts +0 -0
  79. /package/{dist/src → src}/model/graph/ProtoSelector.d.ts +0 -0
  80. /package/{dist/src → src}/util/ClassUtil.d.ts +0 -0
@@ -0,0 +1,268 @@
1
+ import assert from 'node:assert';
2
+ import path from 'node:path';
3
+ import { readFileSync } from 'node:fs';
4
+ import { debuglog } from 'node:util';
5
+ import { EggLoadUnitType, InitTypeQualifierAttribute, } from '@eggjs/tegg-types';
6
+ import { Graph, GraphNode, MapUtil } from '@eggjs/tegg-common-util';
7
+ import { IdenticalUtil, LifecycleUtil } from '@eggjs/tegg-lifecycle';
8
+ import { FrameworkErrorFormater } from 'egg-errors';
9
+ import { PrototypeUtil, QualifierUtil } from '@eggjs/core-decorator';
10
+ import { EggPrototypeFactory, LoadUnitFactory, EggPrototypeCreatorFactory } from '../factory/index.js';
11
+ import { ClassProtoDescriptor, GlobalGraph } from '../model/index.js';
12
+ import { MultiPrototypeFound } from '../errors.js';
13
+ const debug = debuglog('@eggjs/tegg-metadata/ModuleLoadUnit');
14
+ let id = 0;
15
+ // TODO del ModuleGraph in next major version
16
+ class ProtoNode {
17
+ clazz;
18
+ name;
19
+ id;
20
+ qualifiers;
21
+ initType;
22
+ PrototypeUtil;
23
+ constructor(clazz, objName, initType, qualifiers) {
24
+ this.name = objName;
25
+ this.id = '' + (id++);
26
+ this.clazz = clazz;
27
+ this.qualifiers = qualifiers;
28
+ this.initType = initType;
29
+ }
30
+ verifyQualifiers(qualifiers) {
31
+ for (const qualifier of qualifiers) {
32
+ if (!this.verifyQualifier(qualifier)) {
33
+ return false;
34
+ }
35
+ }
36
+ return true;
37
+ }
38
+ verifyQualifier(qualifier) {
39
+ const selfQualifiers = this.qualifiers.find(t => t.attribute === qualifier.attribute);
40
+ return selfQualifiers?.value === qualifier.value;
41
+ }
42
+ toString() {
43
+ return `${this.clazz.name}@${this.PrototypeUtil.getFilePath(this.clazz)}`;
44
+ }
45
+ }
46
+ export class ModuleGraph {
47
+ graph;
48
+ clazzList;
49
+ unitPath;
50
+ name;
51
+ constructor(clazzList, unitPath, name) {
52
+ this.clazzList = clazzList;
53
+ this.graph = new Graph();
54
+ this.unitPath = unitPath;
55
+ this.name = name;
56
+ debug('ModuleGraph constructor on moduleName: %o, unitPath: %o, clazzList size: %o', this.name, this.unitPath, this.clazzList.length);
57
+ }
58
+ findInjectNode(objName, qualifiers, parentInitTye) {
59
+ let nodes = Array.from(this.graph.nodes.values())
60
+ .filter(t => t.val.name === objName)
61
+ .filter(t => t.val.verifyQualifiers(qualifiers));
62
+ if (nodes.length === 0) {
63
+ return undefined;
64
+ }
65
+ if (nodes.length === 1) {
66
+ return nodes[0];
67
+ }
68
+ const initTypeQualifier = {
69
+ attribute: InitTypeQualifierAttribute,
70
+ value: parentInitTye,
71
+ };
72
+ nodes = nodes.filter(t => t.val.verifyQualifiers([initTypeQualifier]));
73
+ if (nodes.length === 1) {
74
+ return nodes[0];
75
+ }
76
+ const temp = new Map();
77
+ for (const node of nodes) {
78
+ temp.set(node.val.clazz, node);
79
+ }
80
+ nodes = Array.from(temp.values());
81
+ if (nodes.length === 1) {
82
+ return nodes[0];
83
+ }
84
+ const result = nodes.map(node => node.val.toString());
85
+ throw FrameworkErrorFormater.formatError(new MultiPrototypeFound(String(objName), qualifiers, JSON.stringify(result)));
86
+ }
87
+ async build() {
88
+ const protoGraphNodes = [];
89
+ for (const clazz of this.clazzList) {
90
+ if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
91
+ const properties = await PrototypeUtil.getMultiInstanceProperty(clazz, {
92
+ unitPath: this.unitPath,
93
+ moduleName: this.name,
94
+ });
95
+ if (properties) {
96
+ const qualifiers = QualifierUtil.getProtoQualifiers(clazz);
97
+ for (const obj of properties.objects || []) {
98
+ const instanceQualifiers = [
99
+ ...qualifiers,
100
+ ...obj.qualifiers,
101
+ ];
102
+ protoGraphNodes.push(new GraphNode(new ProtoNode(clazz, obj.name, properties.initType, instanceQualifiers)));
103
+ }
104
+ }
105
+ }
106
+ else {
107
+ const qualifiers = QualifierUtil.getProtoQualifiers(clazz);
108
+ const property = PrototypeUtil.getProperty(clazz);
109
+ if (property) {
110
+ protoGraphNodes.push(new GraphNode(new ProtoNode(clazz, property.name, property.initType, qualifiers)));
111
+ }
112
+ }
113
+ }
114
+ for (const node of protoGraphNodes) {
115
+ if (!this.graph.addVertex(node)) {
116
+ throw new Error(`duplicate proto: ${node.val.id}`);
117
+ }
118
+ }
119
+ for (const node of protoGraphNodes) {
120
+ if (PrototypeUtil.isEggMultiInstancePrototype(node.val.clazz)) {
121
+ const property = await PrototypeUtil.getMultiInstanceProperty(node.val.clazz, {
122
+ moduleName: this.name,
123
+ unitPath: this.unitPath,
124
+ });
125
+ for (const objectInfo of property?.objects || []) {
126
+ const injectObjects = PrototypeUtil.getInjectObjects(node.val.clazz);
127
+ for (const injectObject of injectObjects) {
128
+ const qualifiers = [
129
+ ...QualifierUtil.getProperQualifiers(node.val.clazz, injectObject.refName),
130
+ ...objectInfo.properQualifiers?.[injectObject.refName] ?? [],
131
+ ];
132
+ const injectNode = this.findInjectNode(injectObject.objName, qualifiers, node.val.initType);
133
+ // If not found maybe in other module
134
+ if (injectNode) {
135
+ this.graph.addEdge(node, injectNode);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ const injectObjects = PrototypeUtil.getInjectObjects(node.val.clazz);
142
+ for (const injectObject of injectObjects) {
143
+ const qualifiers = QualifierUtil.getProperQualifiers(node.val.clazz, injectObject.refName);
144
+ const injectNode = this.findInjectNode(injectObject.objName, qualifiers, node.val.initType);
145
+ // If not found maybe in other module
146
+ if (injectNode) {
147
+ this.graph.addEdge(node, injectNode);
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ sort() {
154
+ const loopPath = this.graph.loopPath();
155
+ if (loopPath) {
156
+ throw new Error('proto has recursive deps: ' + loopPath);
157
+ }
158
+ const clazzSet = new Set();
159
+ for (const clazz of this.graph.sort()) {
160
+ clazzSet.add(clazz.val.clazz);
161
+ }
162
+ this.clazzList = Array.from(clazzSet);
163
+ }
164
+ }
165
+ export class ModuleLoadUnit {
166
+ // private loader: Loader;
167
+ protoMap = new Map();
168
+ protos;
169
+ clazzList;
170
+ id;
171
+ name;
172
+ unitPath;
173
+ type = EggLoadUnitType.MODULE;
174
+ get globalGraph() {
175
+ return GlobalGraph.instance;
176
+ }
177
+ constructor(name, unitPath) {
178
+ this.id = IdenticalUtil.createLoadUnitId(name);
179
+ this.name = name;
180
+ this.unitPath = unitPath;
181
+ debug('ModuleLoadUnit constructor on moduleName: %o, unitPath: %o, id: %o', this.name, this.unitPath, this.id);
182
+ }
183
+ doLoadClazz() {
184
+ const protos = this.globalGraph.moduleProtoDescriptorMap.get(this.name);
185
+ if (protos) {
186
+ // TODO ModuleLoadUnit should support all proto descriptor
187
+ this.protos = protos.filter(t => ClassProtoDescriptor.isClassProtoDescriptor(t));
188
+ this.clazzList = this.protos.map(t => t.clazz);
189
+ }
190
+ else {
191
+ this.protos = [];
192
+ this.clazzList = [];
193
+ }
194
+ debug('doLoadClazz on moduleName: %o, protos size: %o, clazzList size: %o', this.name, this.protos.length, this.clazzList.length);
195
+ }
196
+ loadClazz() {
197
+ if (!this.clazzList) {
198
+ this.doLoadClazz();
199
+ }
200
+ }
201
+ async preLoad() {
202
+ this.loadClazz();
203
+ for (const protoClass of this.clazzList) {
204
+ // TODO refactor lifecycle hook to ProtoDescriptor or EggPrototype
205
+ // ModuleLoadUnit should not use clazz list
206
+ const fnName = LifecycleUtil.getStaticLifecycleHook('preLoad', protoClass);
207
+ if (fnName) {
208
+ const lifecycleHook = Reflect.get(protoClass, fnName);
209
+ if (typeof lifecycleHook === 'function') {
210
+ await lifecycleHook();
211
+ }
212
+ // TODO(@fengmk2): lifecycleHook is not a function should throw error
213
+ }
214
+ }
215
+ }
216
+ async init() {
217
+ this.loadClazz();
218
+ for (const protoDescriptor of this.protos) {
219
+ const proto = await EggPrototypeCreatorFactory.createProtoByDescriptor(protoDescriptor, this);
220
+ EggPrototypeFactory.instance.registerPrototype(proto, this);
221
+ }
222
+ }
223
+ containPrototype(proto) {
224
+ return !!(this.protoMap.get(proto.name)?.find(t => t === proto));
225
+ }
226
+ getEggPrototype(name, qualifiers) {
227
+ const protos = this.protoMap.get(name);
228
+ return protos?.filter(proto => proto.verifyQualifiers(qualifiers)) || [];
229
+ }
230
+ registerEggPrototype(proto) {
231
+ const protoList = MapUtil.getOrStore(this.protoMap, proto.name, []);
232
+ protoList.push(proto);
233
+ }
234
+ deletePrototype(proto) {
235
+ const protos = this.protoMap.get(proto.name);
236
+ if (protos) {
237
+ const index = protos.indexOf(proto);
238
+ if (index !== -1) {
239
+ protos.splice(index, 1);
240
+ }
241
+ }
242
+ }
243
+ async destroy() {
244
+ for (const namedProtoMap of this.protoMap.values()) {
245
+ for (const proto of namedProtoMap.slice()) {
246
+ EggPrototypeFactory.instance.deletePrototype(proto, this);
247
+ }
248
+ }
249
+ this.protoMap.clear();
250
+ }
251
+ iterateEggPrototype() {
252
+ const protos = Array.from(this.protoMap.values())
253
+ .reduce((p, c) => {
254
+ p = p.concat(c);
255
+ return p;
256
+ }, []);
257
+ return protos.values();
258
+ }
259
+ static createModule(ctx) {
260
+ const pkgPath = path.join(ctx.unitPath, 'package.json');
261
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
262
+ assert(pkg.eggModule, `module config not found in package ${pkgPath}`);
263
+ const { name } = pkg.eggModule;
264
+ return new ModuleLoadUnit(name, ctx.unitPath);
265
+ }
266
+ }
267
+ LoadUnitFactory.registerLoadUnitCreator(EggLoadUnitType.MODULE, ModuleLoadUnit.createModule);
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kdWxlTG9hZFVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJNb2R1bGVMb2FkVW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsZUFBZSxFQUVmLDBCQUEwQixHQUUzQixNQUFNLG1CQUFtQixDQUFDO0FBUzNCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbkQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFFOUQsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRVgsNkNBQTZDO0FBQzdDLE1BQU0sU0FBUztJQUNKLEtBQUssQ0FBb0I7SUFDekIsSUFBSSxDQUFtQjtJQUN2QixFQUFFLENBQVM7SUFDWCxVQUFVLENBQWtCO0lBQzVCLFFBQVEsQ0FBcUI7SUFDOUIsYUFBYSxDQUFNO0lBRTNCLFlB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
@@ -0,0 +1,4 @@
1
+ export * from './EggPrototypeBuilder.js';
2
+ export * from './EggPrototypeImpl.js';
3
+ export * from './LoadUnitMultiInstanceProtoHook.js';
4
+ export * from './ModuleLoadUnit.js';
@@ -0,0 +1,5 @@
1
+ export * from './EggPrototypeBuilder.js';
2
+ export * from './EggPrototypeImpl.js';
3
+ export * from './LoadUnitMultiInstanceProtoHook.js';
4
+ export * from './ModuleLoadUnit.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLHFCQUFxQixDQUFDIn0=
package/src/index.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export * from '@eggjs/tegg-types/metadata';
2
+ export * from './factory/index.js';
3
+ export * from './model/index.js';
4
+ export * from './errors.js';
5
+ export * from './util/index.js';
6
+ export * from './impl/index.js';
package/src/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from '@eggjs/tegg-types/metadata';
2
+ export * from './factory/index.js';
3
+ export * from './model/index.js';
4
+ export * from './errors.js';
5
+ export * from './util/index.js';
6
+ export * from './impl/index.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsaUJBQWlCLENBQUMifQ==
@@ -12,8 +12,9 @@ export interface InstanceClazzMeta {
12
12
  export type ClazzMetaMap = Record<EggPrototypeName, InstanceClazzMeta[]>;
13
13
  export declare class ClazzMap {
14
14
  private clazzMap;
15
+ private graph;
15
16
  constructor(graph: Graph<ModuleNode>);
16
- private build;
17
+ build(): Promise<void>;
17
18
  findDependencyModule(objName: EggPrototypeName, properQualifiers: QualifierInfo[], intoModule: GraphNode<ModuleNode>): GraphNode<ModuleNode>[];
18
19
  }
19
20
  export declare class ModuleNode implements GraphNodeObj {
@@ -22,7 +23,7 @@ export declare class ModuleNode implements GraphNodeObj {
22
23
  readonly moduleConfig: ModuleReference;
23
24
  private readonly clazzList;
24
25
  constructor(moduleConfig: ModuleReference);
25
- addClazz(clazz: EggProtoImplClass): void;
26
+ addClazz(clazz: EggProtoImplClass): Promise<void>;
26
27
  toString(): string;
27
28
  getClazzList(): readonly EggProtoImplClass[];
28
29
  }
@@ -33,6 +34,6 @@ export declare class AppGraph {
33
34
  constructor();
34
35
  addNode(moduleNode: ModuleNode): void;
35
36
  getClazzList(): readonly EggProtoImplClass[];
36
- build(): void;
37
+ build(): Promise<void>;
37
38
  sort(): void;
38
39
  }
@@ -0,0 +1,264 @@
1
+ import assert from 'node:assert';
2
+ import util from 'node:util';
3
+ import { Graph, GraphNode, ModuleConfigUtil } from '@eggjs/tegg-common-util';
4
+ import { PrototypeUtil, QualifierUtil } from '@eggjs/core-decorator';
5
+ import { AccessLevel, INIT_TYPE_TRY_ORDER, InitTypeQualifierAttribute, LoadUnitNameQualifierAttribute } from '@eggjs/tegg-types';
6
+ function verifyQualifier(clazzQualifiers, qualifier) {
7
+ const selfQualifiers = clazzQualifiers.find(t => t.attribute === qualifier.attribute);
8
+ return selfQualifiers?.value === qualifier.value;
9
+ }
10
+ function verifyQualifiers(clazzQualifiers, qualifiers) {
11
+ for (const qualifier of qualifiers) {
12
+ if (!verifyQualifier(clazzQualifiers, qualifier)) {
13
+ return false;
14
+ }
15
+ }
16
+ return true;
17
+ }
18
+ export class ClazzMap {
19
+ clazzMap;
20
+ graph;
21
+ constructor(graph) {
22
+ this.graph = graph;
23
+ }
24
+ async build() {
25
+ const graph = this.graph;
26
+ /**
27
+ * 1. iterate all module get all MultiInstanceClazz
28
+ * 2. iterate MultiInstanceClazz and all module get object meta
29
+ * 3. iterate object meta and build clazz map
30
+ */
31
+ const clazzMap = {};
32
+ for (const ownerNode of graph.nodes.values()) {
33
+ for (const clazz of ownerNode.val.getClazzList()) {
34
+ const qualifiers = QualifierUtil.getProtoQualifiers(clazz);
35
+ if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
36
+ for (const instanceNode of graph.nodes.values()) {
37
+ const property = await PrototypeUtil.getMultiInstanceProperty(clazz, {
38
+ unitPath: instanceNode.val.moduleConfig.path,
39
+ moduleName: instanceNode.val.moduleConfig.name,
40
+ });
41
+ assert(property, `multi instance property not found for ${clazz.name}`);
42
+ for (const info of property.objects) {
43
+ const instanceQualifiers = [
44
+ ...qualifiers,
45
+ ...info.qualifiers,
46
+ ];
47
+ clazzMap[info.name] = clazzMap[info.name] || [];
48
+ clazzMap[info.name].push({
49
+ name: info.name,
50
+ accessLevel: await PrototypeUtil.getAccessLevel(clazz, {
51
+ unitPath: instanceNode.val.moduleConfig.path,
52
+ moduleName: instanceNode.val.moduleConfig.name,
53
+ }),
54
+ qualifiers: instanceQualifiers,
55
+ properQualifiers: info.properQualifiers || {},
56
+ instanceModule: instanceNode,
57
+ ownerModule: ownerNode,
58
+ });
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ const property = PrototypeUtil.getProperty(clazz);
64
+ assert(property, `property not found for ${clazz.name}`);
65
+ clazzMap[property.name] = clazzMap[property.name] || [];
66
+ clazzMap[property.name].push({
67
+ name: property.name,
68
+ accessLevel: await PrototypeUtil.getAccessLevel(clazz, {
69
+ unitPath: ownerNode.val.moduleConfig.path,
70
+ moduleName: ownerNode.val.moduleConfig.name,
71
+ }),
72
+ qualifiers,
73
+ properQualifiers: {},
74
+ ownerModule: ownerNode,
75
+ instanceModule: ownerNode,
76
+ });
77
+ }
78
+ }
79
+ }
80
+ this.clazzMap = clazzMap;
81
+ }
82
+ findDependencyModule(objName, properQualifiers, intoModule) {
83
+ const result = new Set();
84
+ const objInfo = this.clazzMap[objName];
85
+ if (!objInfo) {
86
+ return [];
87
+ }
88
+ let mayObjs = objInfo.filter(obj => {
89
+ // 1. check accessLevel
90
+ if (obj.instanceModule !== intoModule && obj.accessLevel === AccessLevel.PRIVATE) {
91
+ return false;
92
+ }
93
+ // 2. check qualifier
94
+ return verifyQualifiers(obj.qualifiers, properQualifiers);
95
+ });
96
+ // 3. auto set init type qualifier
97
+ if (mayObjs.length > 1) {
98
+ const initTypeQualifiers = INIT_TYPE_TRY_ORDER.map(type => ({
99
+ attribute: InitTypeQualifierAttribute,
100
+ value: type,
101
+ }));
102
+ for (const initTypeQualifier of initTypeQualifiers) {
103
+ const mayInitTypeObjs = mayObjs.filter(obj => {
104
+ return verifyQualifiers(obj.qualifiers, [
105
+ ...properQualifiers,
106
+ initTypeQualifier,
107
+ ]);
108
+ });
109
+ if (mayInitTypeObjs.length > 0) {
110
+ mayObjs = mayInitTypeObjs;
111
+ }
112
+ }
113
+ }
114
+ // 4. auto set load unit name qualifier
115
+ if (mayObjs.length > 1) {
116
+ const moduleNameQualifiers = {
117
+ attribute: LoadUnitNameQualifierAttribute,
118
+ value: intoModule.val.name,
119
+ };
120
+ const mayLoadUnitNameObjs = mayObjs.filter(obj => {
121
+ return verifyQualifiers(obj.qualifiers, [
122
+ ...properQualifiers,
123
+ moduleNameQualifiers,
124
+ ]);
125
+ });
126
+ if (mayLoadUnitNameObjs.length > 0) {
127
+ mayObjs = mayLoadUnitNameObjs;
128
+ }
129
+ }
130
+ if (mayObjs.length > 1) {
131
+ const message = util.format('multi class found for %s@%o in module %j', objName, properQualifiers, mayObjs.map(t => {
132
+ return t.instanceModule.val.moduleConfig.path;
133
+ }));
134
+ throw new Error(message);
135
+ }
136
+ for (const obj of mayObjs) {
137
+ result.add(obj.instanceModule);
138
+ // result.add(obj.ownerModule);
139
+ }
140
+ return Array.from(result);
141
+ }
142
+ }
143
+ export class ModuleNode {
144
+ id;
145
+ name;
146
+ moduleConfig;
147
+ clazzList;
148
+ constructor(moduleConfig) {
149
+ this.moduleConfig = moduleConfig;
150
+ this.id = moduleConfig.path;
151
+ this.name = ModuleConfigUtil.readModuleNameSync(moduleConfig.path);
152
+ this.clazzList = [];
153
+ }
154
+ async addClazz(clazz) {
155
+ if (!this.clazzList.includes(clazz)) {
156
+ this.clazzList.push(clazz);
157
+ }
158
+ if (!PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
159
+ const initTypeQualifierAttributeValue = await PrototypeUtil.getInitType(clazz, {
160
+ unitPath: this.moduleConfig.path,
161
+ moduleName: this.moduleConfig.name,
162
+ });
163
+ const defaultQualifier = [{
164
+ attribute: InitTypeQualifierAttribute,
165
+ value: initTypeQualifierAttributeValue,
166
+ }, {
167
+ attribute: LoadUnitNameQualifierAttribute,
168
+ value: this.name,
169
+ }];
170
+ for (const qualifier of defaultQualifier) {
171
+ QualifierUtil.addProtoQualifier(clazz, qualifier.attribute, qualifier.value);
172
+ }
173
+ }
174
+ }
175
+ toString() {
176
+ return `${this.name}@${this.moduleConfig.path}`;
177
+ }
178
+ getClazzList() {
179
+ return this.clazzList;
180
+ }
181
+ }
182
+ export class AppGraph {
183
+ graph;
184
+ clazzMap;
185
+ moduleConfigList;
186
+ constructor() {
187
+ this.graph = new Graph();
188
+ }
189
+ addNode(moduleNode) {
190
+ if (!this.graph.addVertex(new GraphNode(moduleNode))) {
191
+ throw new Error(`duplicate module: ${moduleNode}`);
192
+ }
193
+ }
194
+ getClazzList() {
195
+ const clazzSet = new Set();
196
+ for (const node of this.graph.nodes.values()) {
197
+ for (const clazz of node.val.getClazzList()) {
198
+ clazzSet.add(clazz);
199
+ }
200
+ }
201
+ return Array.from(clazzSet);
202
+ }
203
+ async build() {
204
+ this.clazzMap = new ClazzMap(this.graph);
205
+ await this.clazzMap.build();
206
+ // 1. iterate all modules
207
+ for (const node of this.graph.nodes.values()) {
208
+ // 2. iterate all class
209
+ for (const clazz of node.val.getClazzList()) {
210
+ const injectObjects = PrototypeUtil.getInjectObjects(clazz);
211
+ // 3. iterate all inject objects
212
+ for (const injectObject of injectObjects) {
213
+ if (PrototypeUtil.isEggMultiInstancePrototype(clazz)) {
214
+ for (const instanceNode of this.graph.nodes.values()) {
215
+ const property = await PrototypeUtil.getMultiInstanceProperty(clazz, {
216
+ unitPath: instanceNode.val.moduleConfig.path,
217
+ moduleName: instanceNode.val.moduleConfig.name,
218
+ });
219
+ for (const info of property?.objects || []) {
220
+ const properQualifiers = [
221
+ ...QualifierUtil.getProperQualifiers(clazz, injectObject.refName),
222
+ ...info.properQualifiers?.[injectObject.refName] ?? [],
223
+ ];
224
+ // 4. find dependency module
225
+ const dependencyModules = this.clazzMap.findDependencyModule(injectObject.objName, properQualifiers, node);
226
+ for (const moduleNode of dependencyModules) {
227
+ // 5. add edge
228
+ if (instanceNode !== moduleNode) {
229
+ this.graph.addEdge(instanceNode, moduleNode);
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ else {
236
+ const properQualifiers = [
237
+ ...QualifierUtil.getProperQualifiers(clazz, injectObject.refName),
238
+ ];
239
+ // 4. find dependency module
240
+ const dependencyModules = this.clazzMap.findDependencyModule(injectObject.objName, properQualifiers, node);
241
+ for (const moduleNode of dependencyModules) {
242
+ // 5. add edge
243
+ if (node !== moduleNode) {
244
+ this.graph.addEdge(node, moduleNode);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ sort() {
253
+ const loopPath = this.graph.loopPath();
254
+ if (loopPath) {
255
+ throw new Error('module has recursive deps: ' + loopPath);
256
+ }
257
+ this.moduleConfigList = this.graph.sort()
258
+ .filter(t => {
259
+ return t.val.moduleConfig.optional !== true || t.fromNodeMap.size > 0;
260
+ })
261
+ .map(t => t.val.moduleConfig);
262
+ }
263
+ }
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcHBHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLDBCQUEwQixFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFjakksU0FBUyxlQUFlLENBQUMsZUFBZ0MsRUFBRSxTQUF3QjtJQUNqRixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEYsT0FBTyxjQUFjLEVBQUUsS0FBSyxLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsZUFBZ0MsRUFBRSxVQUEyQjtJQUNyRixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDakQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sT0FBTyxRQUFRO0lBQ1gsUUFBUSxDQUFlO0lBQ3ZCLEtBQUssQ0FBb0I7SUFFakMsWUFBWSxLQUF3QjtRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFD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
@@ -0,0 +1,3 @@
1
+ import { LifecycleUtil } from '@eggjs/tegg-lifecycle';
2
+ export const EggPrototypeLifecycleUtil = new LifecycleUtil();
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnUHJvdG90eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRWdnUHJvdG90eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd0RCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLGFBQWEsRUFBOEMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ import { LifecycleUtil } from '@eggjs/tegg-lifecycle';
2
+ export const LoadUnitLifecycleUtil = new LifecycleUtil();
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJMb2FkVW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHdEQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxhQUFhLEVBQXNDLENBQUMifQ==