@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.
- package/package.json +22 -21
- package/src/errors.js +27 -0
- package/{dist/src → src}/factory/EggPrototypeCreatorFactory.d.ts +1 -1
- package/src/factory/EggPrototypeCreatorFactory.js +103 -0
- package/src/factory/EggPrototypeFactory.js +52 -0
- package/src/factory/LoadUnitFactory.js +59 -0
- package/src/factory/index.d.ts +3 -0
- package/src/factory/index.js +4 -0
- package/src/impl/EggPrototypeBuilder.js +124 -0
- package/{dist/src → src}/impl/EggPrototypeImpl.d.ts +1 -0
- package/src/impl/EggPrototypeImpl.js +53 -0
- package/src/impl/LoadUnitMultiInstanceProtoHook.js +18 -0
- package/{dist/src → src}/impl/ModuleLoadUnit.d.ts +2 -2
- package/src/impl/ModuleLoadUnit.js +268 -0
- package/src/impl/index.d.ts +4 -0
- package/src/impl/index.js +5 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +7 -0
- package/{dist/src → src}/model/AppGraph.d.ts +4 -3
- package/src/model/AppGraph.js +264 -0
- package/src/model/EggPrototype.js +3 -0
- package/src/model/LoadUnit.js +3 -0
- package/src/model/ModuleDescriptor.js +38 -0
- package/src/model/ProtoDescriptor/AbstractProtoDescriptor.js +30 -0
- package/{dist/src → src}/model/ProtoDescriptor/ClassProtoDescriptor.d.ts +1 -1
- package/src/model/ProtoDescriptor/ClassProtoDescriptor.js +30 -0
- package/src/model/ProtoDescriptor/index.d.ts +2 -0
- package/src/model/ProtoDescriptor/index.js +3 -0
- package/{dist/src → src}/model/ProtoDescriptorHelper.d.ts +3 -3
- package/src/model/ProtoDescriptorHelper.js +129 -0
- package/{dist/src → src}/model/graph/GlobalGraph.d.ts +4 -4
- package/src/model/graph/GlobalGraph.js +233 -0
- package/{dist/src → src}/model/graph/GlobalModuleNode.d.ts +1 -1
- package/src/model/graph/GlobalModuleNode.js +38 -0
- package/{dist/src → src}/model/graph/GlobalModuleNodeBuilder.d.ts +2 -2
- package/src/model/graph/GlobalModuleNodeBuilder.js +53 -0
- package/{dist/src → src}/model/graph/ProtoNode.d.ts +1 -1
- package/src/model/graph/ProtoNode.js +37 -0
- package/src/model/graph/ProtoSelector.js +2 -0
- package/src/model/graph/index.d.ts +5 -0
- package/src/model/graph/index.js +6 -0
- package/src/model/index.d.ts +7 -0
- package/src/model/index.js +8 -0
- package/src/util/ClassUtil.js +17 -0
- package/src/util/index.d.ts +1 -0
- package/src/util/index.js +2 -0
- package/dist/index.d.ts +0 -21
- package/dist/index.js +0 -38
- package/dist/src/errors.js +0 -34
- package/dist/src/factory/EggPrototypeCreatorFactory.js +0 -104
- package/dist/src/factory/EggPrototypeFactory.js +0 -58
- package/dist/src/factory/LoadUnitFactory.js +0 -63
- package/dist/src/impl/EggPrototypeBuilder.js +0 -128
- package/dist/src/impl/EggPrototypeImpl.js +0 -45
- package/dist/src/impl/LoadUnitMultiInstanceProtoHook.js +0 -24
- package/dist/src/impl/ModuleLoadUnit.js +0 -259
- package/dist/src/model/AppGraph.js +0 -262
- package/dist/src/model/EggPrototype.js +0 -6
- package/dist/src/model/LoadUnit.js +0 -6
- package/dist/src/model/ModuleDescriptor.js +0 -46
- package/dist/src/model/ProtoDescriptor/AbstractProtoDescriptor.js +0 -21
- package/dist/src/model/ProtoDescriptor/ClassProtoDescriptor.js +0 -32
- package/dist/src/model/ProtoDescriptorHelper.js +0 -143
- package/dist/src/model/graph/GlobalGraph.js +0 -213
- package/dist/src/model/graph/GlobalModuleNode.js +0 -36
- package/dist/src/model/graph/GlobalModuleNodeBuilder.js +0 -53
- package/dist/src/model/graph/ProtoNode.js +0 -39
- package/dist/src/model/graph/ProtoSelector.js +0 -3
- package/dist/src/util/ClassUtil.js +0 -21
- /package/{dist/src → src}/errors.d.ts +0 -0
- /package/{dist/src → src}/factory/EggPrototypeFactory.d.ts +0 -0
- /package/{dist/src → src}/factory/LoadUnitFactory.d.ts +0 -0
- /package/{dist/src → src}/impl/EggPrototypeBuilder.d.ts +0 -0
- /package/{dist/src → src}/impl/LoadUnitMultiInstanceProtoHook.d.ts +0 -0
- /package/{dist/src → src}/model/EggPrototype.d.ts +0 -0
- /package/{dist/src → src}/model/LoadUnit.d.ts +0 -0
- /package/{dist/src → src}/model/ModuleDescriptor.d.ts +0 -0
- /package/{dist/src → src}/model/ProtoDescriptor/AbstractProtoDescriptor.d.ts +0 -0
- /package/{dist/src → src}/model/graph/ProtoSelector.d.ts +0 -0
- /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,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
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
|
-
|
|
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==
|