@eggjs/tegg-plugin 3.39.0 → 3.39.2
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 +11 -11
- package/lib/AppGraph.d.ts +0 -29
- package/lib/AppGraph.js +0 -127
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"teggConfig"
|
|
7
7
|
]
|
|
8
8
|
},
|
|
9
|
-
"version": "3.39.
|
|
9
|
+
"version": "3.39.2",
|
|
10
10
|
"description": "module plugin for egg",
|
|
11
11
|
"keywords": [
|
|
12
12
|
"egg",
|
|
@@ -45,19 +45,19 @@
|
|
|
45
45
|
"node": ">=14.0.0"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@eggjs/egg-module-common": "^3.39.
|
|
49
|
-
"@eggjs/tegg": "^3.39.
|
|
50
|
-
"@eggjs/tegg-background-task": "^3.39.
|
|
51
|
-
"@eggjs/tegg-common-util": "^3.39.
|
|
52
|
-
"@eggjs/tegg-dynamic-inject-runtime": "^3.39.
|
|
53
|
-
"@eggjs/tegg-loader": "^3.39.
|
|
54
|
-
"@eggjs/tegg-metadata": "^3.39.
|
|
55
|
-
"@eggjs/tegg-runtime": "^3.39.
|
|
48
|
+
"@eggjs/egg-module-common": "^3.39.2",
|
|
49
|
+
"@eggjs/tegg": "^3.39.2",
|
|
50
|
+
"@eggjs/tegg-background-task": "^3.39.2",
|
|
51
|
+
"@eggjs/tegg-common-util": "^3.39.2",
|
|
52
|
+
"@eggjs/tegg-dynamic-inject-runtime": "^3.39.2",
|
|
53
|
+
"@eggjs/tegg-loader": "^3.39.2",
|
|
54
|
+
"@eggjs/tegg-metadata": "^3.39.2",
|
|
55
|
+
"@eggjs/tegg-runtime": "^3.39.2",
|
|
56
56
|
"extend2": "^1.0.0",
|
|
57
57
|
"sdk-base": "^4.2.0"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
-
"@eggjs/tegg-config": "^3.39.
|
|
60
|
+
"@eggjs/tegg-config": "^3.39.2",
|
|
61
61
|
"@types/mocha": "^10.0.1",
|
|
62
62
|
"@types/node": "^20.2.4",
|
|
63
63
|
"cross-env": "^7.0.3",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"publishConfig": {
|
|
74
74
|
"access": "public"
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "afb2a324c63048166c60fe9b07cbe307bf1760fb"
|
|
77
77
|
}
|
package/lib/AppGraph.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { GraphNodeObj } from '@eggjs/tegg-common-util';
|
|
2
|
-
import { EggProtoImplClass, EggPrototypeName, QualifierInfo } from '@eggjs/tegg';
|
|
3
|
-
export interface ModuleConfig {
|
|
4
|
-
path: string;
|
|
5
|
-
}
|
|
6
|
-
export declare class ModuleNode implements GraphNodeObj {
|
|
7
|
-
readonly id: string;
|
|
8
|
-
readonly name: string;
|
|
9
|
-
readonly moduleConfig: ModuleConfig;
|
|
10
|
-
private clazzList;
|
|
11
|
-
static readModuleName(modulePath: string): string;
|
|
12
|
-
constructor(moduleConfig: ModuleConfig);
|
|
13
|
-
addClazz(clazz: EggProtoImplClass): void;
|
|
14
|
-
getClazzList(): readonly EggProtoImplClass[];
|
|
15
|
-
getPublicClazzList(): readonly EggProtoImplClass[];
|
|
16
|
-
toString(): string;
|
|
17
|
-
verifyQualifiers(clazz: EggProtoImplClass, qualifiers: QualifierInfo[]): boolean;
|
|
18
|
-
verifyQualifier(clazzQualifiers: QualifierInfo[], qualifier: QualifierInfo): boolean;
|
|
19
|
-
findImplementClazzList(objName: EggPrototypeName, qualifiers: QualifierInfo[], innerFind: boolean): EggProtoImplClass[];
|
|
20
|
-
}
|
|
21
|
-
export declare class AppGraph {
|
|
22
|
-
private graph;
|
|
23
|
-
moduleConfigList: Array<ModuleConfig>;
|
|
24
|
-
constructor();
|
|
25
|
-
addNode(moduleNode: ModuleNode): void;
|
|
26
|
-
private findDependencyModule;
|
|
27
|
-
build(): void;
|
|
28
|
-
sort(): void;
|
|
29
|
-
}
|
package/lib/AppGraph.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.AppGraph = exports.ModuleNode = void 0;
|
|
7
|
-
const assert_1 = __importDefault(require("assert"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const tegg_common_util_1 = require("@eggjs/tegg-common-util");
|
|
10
|
-
const tegg_1 = require("@eggjs/tegg");
|
|
11
|
-
class ModuleNode {
|
|
12
|
-
// TODO refactor to ModuleUtil
|
|
13
|
-
static readModuleName(modulePath) {
|
|
14
|
-
const pkgPath = path_1.default.join(modulePath, 'package.json');
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
16
|
-
const pkg = require(pkgPath);
|
|
17
|
-
(0, assert_1.default)(pkg.eggModule, `module config not found in package ${pkgPath}`);
|
|
18
|
-
const { name } = pkg.eggModule;
|
|
19
|
-
return name;
|
|
20
|
-
}
|
|
21
|
-
constructor(moduleConfig) {
|
|
22
|
-
this.moduleConfig = moduleConfig;
|
|
23
|
-
this.id = moduleConfig.path;
|
|
24
|
-
this.name = ModuleNode.readModuleName(moduleConfig.path);
|
|
25
|
-
this.clazzList = [];
|
|
26
|
-
}
|
|
27
|
-
addClazz(clazz) {
|
|
28
|
-
this.clazzList.push(clazz);
|
|
29
|
-
}
|
|
30
|
-
getClazzList() {
|
|
31
|
-
return this.clazzList;
|
|
32
|
-
}
|
|
33
|
-
getPublicClazzList() {
|
|
34
|
-
return this.clazzList.filter(clazz => tegg_1.PrototypeUtil.getAccessLevel(clazz, {
|
|
35
|
-
unitPath: this.moduleConfig.path,
|
|
36
|
-
}) === tegg_1.AccessLevel.PUBLIC);
|
|
37
|
-
}
|
|
38
|
-
toString() {
|
|
39
|
-
return `${this.name}@${this.moduleConfig.path}`;
|
|
40
|
-
}
|
|
41
|
-
verifyQualifiers(clazz, qualifiers) {
|
|
42
|
-
const clazzQualifiers = tegg_1.QualifierUtil.getProtoQualifiers(clazz);
|
|
43
|
-
for (const qualifier of qualifiers) {
|
|
44
|
-
if (!this.verifyQualifier(clazzQualifiers, qualifier)) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
verifyQualifier(clazzQualifiers, qualifier) {
|
|
51
|
-
const selfQualifiers = clazzQualifiers.find(t => t.attribute === qualifier.attribute);
|
|
52
|
-
return (selfQualifiers === null || selfQualifiers === void 0 ? void 0 : selfQualifiers.value) === qualifier.value;
|
|
53
|
-
}
|
|
54
|
-
findImplementClazzList(objName, qualifiers, innerFind) {
|
|
55
|
-
const moduleQualifier = qualifiers.find(t => t.attribute === tegg_1.LoadUnitNameQualifierAttribute);
|
|
56
|
-
if (moduleQualifier && moduleQualifier.value !== this.name) {
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
const clazzList = innerFind ? this.clazzList : this.getPublicClazzList();
|
|
60
|
-
const implList = clazzList
|
|
61
|
-
.filter(clazz => tegg_1.PrototypeUtil.getObjNames(clazz, {
|
|
62
|
-
unitPath: this.moduleConfig.path,
|
|
63
|
-
}).includes(objName))
|
|
64
|
-
.filter(clazz => this.verifyQualifiers(clazz, qualifiers));
|
|
65
|
-
if (implList.length === 1) {
|
|
66
|
-
return implList;
|
|
67
|
-
}
|
|
68
|
-
const initTypeQualifiers = tegg_1.INIT_TYPE_TRY_ORDER.map(type => ({
|
|
69
|
-
attribute: tegg_1.InitTypeQualifierAttribute,
|
|
70
|
-
value: type,
|
|
71
|
-
}));
|
|
72
|
-
for (const initTypeQualifier of initTypeQualifiers) {
|
|
73
|
-
const initTypeList = implList.filter(clazz => this.verifyQualifiers(clazz, [initTypeQualifier]));
|
|
74
|
-
if (initTypeList.length === 1) {
|
|
75
|
-
return initTypeList;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return implList;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
exports.ModuleNode = ModuleNode;
|
|
82
|
-
class AppGraph {
|
|
83
|
-
constructor() {
|
|
84
|
-
this.graph = new tegg_common_util_1.Graph();
|
|
85
|
-
}
|
|
86
|
-
addNode(moduleNode) {
|
|
87
|
-
if (!this.graph.addVertex(new tegg_common_util_1.GraphNode(moduleNode))) {
|
|
88
|
-
throw new Error(`duplicate module: ${moduleNode}`);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
findDependencyModule(objName, properqualifiers, protoQualifiers) {
|
|
92
|
-
var _a;
|
|
93
|
-
const nodes = Array.from(this.graph.nodes.values());
|
|
94
|
-
const hostModuleName = (_a = protoQualifiers.find(t => t.attribute === tegg_1.LoadUnitNameQualifierAttribute)) === null || _a === void 0 ? void 0 : _a.value;
|
|
95
|
-
return nodes.filter(node => {
|
|
96
|
-
// private 的类只能在当前 module 中被找到
|
|
97
|
-
const clazzList = node.val.findImplementClazzList(objName, properqualifiers, hostModuleName === node.val.name);
|
|
98
|
-
return clazzList.length;
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
build() {
|
|
102
|
-
for (const node of this.graph.nodes.values()) {
|
|
103
|
-
for (const clazz of node.val.getClazzList()) {
|
|
104
|
-
const injectObjects = tegg_1.PrototypeUtil.getInjectObjects(clazz);
|
|
105
|
-
for (const injectObject of injectObjects) {
|
|
106
|
-
const properqualifiers = tegg_1.QualifierUtil.getProperQualifiers(clazz, injectObject.refName);
|
|
107
|
-
const protoQualifiers = tegg_1.QualifierUtil.getProtoQualifiers(clazz);
|
|
108
|
-
const dependencyModules = this.findDependencyModule(injectObject.objName, properqualifiers, protoQualifiers);
|
|
109
|
-
for (const moduleNode of dependencyModules) {
|
|
110
|
-
if (node !== moduleNode) {
|
|
111
|
-
this.graph.addEdge(node, moduleNode);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
sort() {
|
|
119
|
-
const loopPath = this.graph.loopPath();
|
|
120
|
-
if (loopPath) {
|
|
121
|
-
throw new Error('module has recursive deps: ' + loopPath);
|
|
122
|
-
}
|
|
123
|
-
this.moduleConfigList = this.graph.sort().map(t => t.val.moduleConfig);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
exports.AppGraph = AppGraph;
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJBcHBHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsZ0RBQXdCO0FBQ3hCLDhEQUF5RTtBQUN6RSxzQ0FVcUI7QUFNckIsTUFBYSxVQUFVO0lBTXJCLDhCQUE4QjtJQUM5QixNQUFNLENBQUMsY0FBYyxDQUFDLFVBQWtCO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELDhEQUE4RDtRQUM5RCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsSUFBQSxnQkFBTSxFQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsc0NBQXNDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsWUFBWSxZQUEwQjtRQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQXdCO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFL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
|