@eggjs/aop-runtime 4.0.0-beta.35 → 4.0.0-beta.36
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/dist/AspectExecutor.d.ts +24 -21
- package/dist/AspectExecutor.js +113 -117
- package/dist/CrossCutGraphHook.d.ts +6 -2
- package/dist/CrossCutGraphHook.js +33 -49
- package/dist/EggObjectAopHook.d.ts +9 -5
- package/dist/EggObjectAopHook.js +54 -60
- package/dist/EggPrototypeCrossCutHook.d.ts +10 -6
- package/dist/EggPrototypeCrossCutHook.js +15 -13
- package/dist/LoadUnitAopHook.d.ts +10 -6
- package/dist/LoadUnitAopHook.js +32 -37
- package/dist/PointCutGraphHook.d.ts +6 -2
- package/dist/PointCutGraphHook.js +34 -39
- package/dist/index.d.ts +7 -6
- package/dist/index.js +8 -7
- package/package.json +30 -34
package/dist/AspectExecutor.d.ts
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AdviceContext, AspectAdvice, IAdvice } from "@eggjs/tegg-types";
|
|
2
|
+
|
|
3
|
+
//#region src/AspectExecutor.d.ts
|
|
2
4
|
declare class InternalAdviceContext<T = Record<string, IAdvice>> {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
private readonly state;
|
|
6
|
+
that: T;
|
|
7
|
+
method: PropertyKey;
|
|
8
|
+
args: any[];
|
|
9
|
+
constructor(that: T, method: PropertyKey, args: any[]);
|
|
10
|
+
get(key: PropertyKey): any;
|
|
11
|
+
set(key: PropertyKey, value: any): this;
|
|
12
|
+
createCallContext(adviceParams?: any): AdviceContext<T>;
|
|
11
13
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
14
|
+
declare class AspectExecutor {
|
|
15
|
+
obj: object;
|
|
16
|
+
method: PropertyKey;
|
|
17
|
+
aspectAdviceList: readonly AspectAdvice[];
|
|
18
|
+
constructor(obj: object, method: PropertyKey, aspectAdviceList: readonly AspectAdvice[]);
|
|
19
|
+
execute(...args: any[]): Promise<unknown>;
|
|
20
|
+
beforeCall(ctx: InternalAdviceContext): Promise<void>;
|
|
21
|
+
afterReturn(ctx: InternalAdviceContext, result: any): Promise<void>;
|
|
22
|
+
afterThrow(ctx: InternalAdviceContext, error: Error): Promise<void>;
|
|
23
|
+
afterFinally(ctx: InternalAdviceContext): Promise<void>;
|
|
24
|
+
doExecute(ctx: InternalAdviceContext): Promise<unknown>;
|
|
23
25
|
}
|
|
24
|
-
|
|
26
|
+
//#endregion
|
|
27
|
+
export { AspectExecutor };
|
package/dist/AspectExecutor.js
CHANGED
|
@@ -1,117 +1,113 @@
|
|
|
1
|
-
import compose from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return compose(functions)(ctx);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNwZWN0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQXNwZWN0RXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxPQUFPLE1BQU0sYUFBYSxDQUFDO0FBR2xDLE1BQU0scUJBQXFCO0lBQ1IsS0FBSyxDQUF3QjtJQUM5QyxJQUFJLENBQUk7SUFDUixNQUFNLENBQWM7SUFDcEIsSUFBSSxDQUFRO0lBRVosWUFBWSxJQUFPLEVBQUUsTUFBbUIsRUFBRSxJQUFXO1FBQ25ELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFnQixFQUFFLEtBQVU7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlCQUFpQixDQUFDLFlBQWtCO1FBQ2xDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDekIsWUFBWSxFQUFFO2dCQUNaLEtBQUssRUFBRSxZQUFZO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7SUFDekIsR0FBRyxDQUFTO0lBQ1osTUFBTSxDQUFjO0lBQ3BCLGdCQUFnQixDQUEwQjtJQUUxQyxZQUFZLEdBQVcsRUFBRSxNQUFtQixFQUFFLGdCQUF5QztRQUNyRixJQUFJLENB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
|
|
1
|
+
import compose from "koa-compose";
|
|
2
|
+
|
|
3
|
+
//#region src/AspectExecutor.ts
|
|
4
|
+
var InternalAdviceContext = class {
|
|
5
|
+
state;
|
|
6
|
+
that;
|
|
7
|
+
method;
|
|
8
|
+
args;
|
|
9
|
+
constructor(that, method, args) {
|
|
10
|
+
this.state = /* @__PURE__ */ new Map();
|
|
11
|
+
this.that = that;
|
|
12
|
+
this.method = method;
|
|
13
|
+
this.args = args;
|
|
14
|
+
}
|
|
15
|
+
get(key) {
|
|
16
|
+
return this.state.get(key);
|
|
17
|
+
}
|
|
18
|
+
set(key, value) {
|
|
19
|
+
this.state.set(key, value);
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
createCallContext(adviceParams) {
|
|
23
|
+
return Object.create(this, { adviceParams: { value: adviceParams } });
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
var AspectExecutor = class {
|
|
27
|
+
obj;
|
|
28
|
+
method;
|
|
29
|
+
aspectAdviceList;
|
|
30
|
+
constructor(obj, method, aspectAdviceList) {
|
|
31
|
+
this.obj = obj;
|
|
32
|
+
this.method = method;
|
|
33
|
+
this.aspectAdviceList = aspectAdviceList;
|
|
34
|
+
}
|
|
35
|
+
async execute(...args) {
|
|
36
|
+
const ctx = new InternalAdviceContext(this.obj, this.method, args);
|
|
37
|
+
await this.beforeCall(ctx);
|
|
38
|
+
try {
|
|
39
|
+
const result = await this.doExecute(ctx);
|
|
40
|
+
await this.afterReturn(ctx, result);
|
|
41
|
+
return result;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
await this.afterThrow(ctx, e);
|
|
44
|
+
throw e;
|
|
45
|
+
} finally {
|
|
46
|
+
await this.afterFinally(ctx);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async beforeCall(ctx) {
|
|
50
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
51
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
52
|
+
if (advice.beforeCall) {
|
|
53
|
+
/**
|
|
54
|
+
* 这里...写法使传入的参数变成了一个新的对象
|
|
55
|
+
* 因此beforeCall里面如果修改了ctx.args
|
|
56
|
+
* 最新的args是不会在方法里生效的
|
|
57
|
+
* 先保证args可以生效
|
|
58
|
+
* 不改动其余地方
|
|
59
|
+
*/
|
|
60
|
+
const fnCtx = ctx.createCallContext(aspectAdvice.adviceParams);
|
|
61
|
+
await advice.beforeCall(fnCtx);
|
|
62
|
+
ctx.args = fnCtx.args;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async afterReturn(ctx, result) {
|
|
67
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
68
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
69
|
+
if (advice.afterReturn) {
|
|
70
|
+
const fnCtx = ctx.createCallContext(aspectAdvice.adviceParams);
|
|
71
|
+
await advice.afterReturn(fnCtx, result);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async afterThrow(ctx, error) {
|
|
76
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
77
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
78
|
+
if (advice.afterThrow) {
|
|
79
|
+
const fnCtx = ctx.createCallContext(aspectAdvice.adviceParams);
|
|
80
|
+
await advice.afterThrow(fnCtx, error);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async afterFinally(ctx) {
|
|
85
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
86
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
87
|
+
if (advice.afterFinally) {
|
|
88
|
+
const fnCtx = ctx.createCallContext(aspectAdvice.adviceParams);
|
|
89
|
+
await advice.afterFinally(fnCtx);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async doExecute(ctx) {
|
|
94
|
+
const lastCall = () => {
|
|
95
|
+
const originMethod = Object.getPrototypeOf(this.obj)[this.method];
|
|
96
|
+
return Reflect.apply(originMethod, ctx.that, ctx.args);
|
|
97
|
+
};
|
|
98
|
+
const functions = [];
|
|
99
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
100
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
101
|
+
const fn = advice.around;
|
|
102
|
+
if (fn) functions.push(async (ctx$1, next) => {
|
|
103
|
+
const fnCtx = ctx$1.createCallContext(aspectAdvice.adviceParams);
|
|
104
|
+
return await fn.call(advice, fnCtx, next);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
functions.push(lastCall);
|
|
108
|
+
return compose(functions)(ctx);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
//#endregion
|
|
113
|
+
export { AspectExecutor };
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
import { GlobalGraph } from
|
|
2
|
-
|
|
1
|
+
import { GlobalGraph } from "@eggjs/metadata";
|
|
2
|
+
|
|
3
|
+
//#region src/CrossCutGraphHook.d.ts
|
|
4
|
+
declare function crossCutGraphHook(globalGraph: GlobalGraph): void;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { crossCutGraphHook };
|
|
@@ -1,54 +1,38 @@
|
|
|
1
|
-
import { AspectMetaBuilder, CrosscutInfoUtil } from
|
|
2
|
-
import { ClassProtoDescriptor, GlobalGraph
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
}
|
|
1
|
+
import { AspectMetaBuilder, CrosscutInfoUtil } from "@eggjs/aop-decorator";
|
|
2
|
+
import { ClassProtoDescriptor, GlobalGraph } from "@eggjs/metadata";
|
|
3
|
+
import "@eggjs/tegg-common-util";
|
|
4
|
+
|
|
5
|
+
//#region src/CrossCutGraphHook.ts
|
|
6
|
+
function crossCutGraphHook(globalGraph) {
|
|
7
|
+
for (const moduleNode of globalGraph.moduleGraph.nodes.values()) for (const crossCutProtoNode of moduleNode.val.protos) {
|
|
8
|
+
const protoNodes = findCrossCuttedClazz(globalGraph, crossCutProtoNode);
|
|
9
|
+
if (!protoNodes) continue;
|
|
10
|
+
for (const crossCuttedProtoNode of protoNodes) {
|
|
11
|
+
const crossCuttedModuleNode = globalGraph.findModuleNode(crossCuttedProtoNode.val.proto.instanceModuleName);
|
|
12
|
+
if (!crossCuttedModuleNode) continue;
|
|
13
|
+
globalGraph.addInject(crossCuttedModuleNode, crossCuttedProtoNode, crossCutProtoNode, crossCutProtoNode.val.proto.name);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
18
16
|
}
|
|
19
17
|
function findCrossCuttedClazz(globalGraph, protoNode) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
crosscut: for (const crosscutInfo of crosscutInfoList) {
|
|
31
|
-
for (const protoNode of globalGraph.protoGraph.nodes.values()) {
|
|
32
|
-
if (checkClazzMatchCrossCut(protoNode, crosscutInfo)) {
|
|
33
|
-
result.push(protoNode);
|
|
34
|
-
// eslint-disable-next-line no-labels
|
|
35
|
-
break crosscut;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return result;
|
|
18
|
+
const proto = protoNode.val.proto;
|
|
19
|
+
if (!ClassProtoDescriptor.isClassProtoDescriptor(proto)) return;
|
|
20
|
+
if (!CrosscutInfoUtil.isCrosscutAdvice(proto.clazz)) return;
|
|
21
|
+
const crosscutInfoList = CrosscutInfoUtil.getCrosscutInfoList(proto.clazz);
|
|
22
|
+
const result = [];
|
|
23
|
+
crosscut: for (const crosscutInfo of crosscutInfoList) for (const protoNode$1 of globalGraph.protoGraph.nodes.values()) if (checkClazzMatchCrossCut(protoNode$1, crosscutInfo)) {
|
|
24
|
+
result.push(protoNode$1);
|
|
25
|
+
break crosscut;
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
40
28
|
}
|
|
41
29
|
function checkClazzMatchCrossCut(protoNode, crosscutInfo) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
for (const method of allMethods) {
|
|
48
|
-
if (crosscutInfo.pointcutInfo.match(proto.clazz, method)) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return false;
|
|
30
|
+
const proto = protoNode.val.proto;
|
|
31
|
+
if (!ClassProtoDescriptor.isClassProtoDescriptor(proto)) return;
|
|
32
|
+
const allMethods = AspectMetaBuilder.getAllMethods(proto.clazz);
|
|
33
|
+
for (const method of allMethods) if (crosscutInfo.pointcutInfo.match(proto.clazz, method)) return true;
|
|
34
|
+
return false;
|
|
53
35
|
}
|
|
54
|
-
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { crossCutGraphHook };
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { EggObject, EggObjectLifeCycleContext, LifecycleHook } from "@eggjs/tegg-types";
|
|
2
|
+
|
|
3
|
+
//#region src/EggObjectAopHook.d.ts
|
|
4
|
+
declare class EggObjectAopHook implements LifecycleHook<EggObjectLifeCycleContext, EggObject> {
|
|
5
|
+
private hijackMethods;
|
|
6
|
+
private injectAdvice;
|
|
7
|
+
postCreate(_: EggObjectLifeCycleContext, eggObject: EggObject): Promise<void>;
|
|
6
8
|
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { EggObjectAopHook };
|
package/dist/EggObjectAopHook.js
CHANGED
|
@@ -1,60 +1,54 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
this.hijackMethods(eggObject.obj, aspectList);
|
|
56
|
-
this.injectAdvice(eggObject, eggObject.obj, aspectList);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnT2JqZWN0QW9wSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9FZ2dPYmplY3RBb3BIb29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUVqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsYUFBYSxDQUFDLEdBQVEsRUFBRSxVQUF5QjtRQUN2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5RSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELHlDQUF5QztJQUNqQyxZQUFZLENBQUMsU0FBb0IsRUFBRSxHQUFRLEVBQUUsVUFBeUI7UUFDNUUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEtBQUssVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RGLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdkMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxDQUFDLFlBQVksRUFBRSwyQkFBMkIsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxZQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRTtvQkFDdEMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxHQUFHO29CQUNwQixVQUFVLEVBQUUsS0FBSztpQkFDbEIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUE0QixFQUFFLFNBQW9CO1FBQ2pFLE1BQU0sVUFBVSxHQUE4QixTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQzlDLE1BQU0sWUFBWSxHQUNoQixTQUFTLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUUsQ0FBQztRQUNyRywwQkFBMEI7UUFDMUIsSUFBSSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxHQUFZLENBQUM7WUFDakIsMkJBQTJCO1lBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztZQUNsQixNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7Z0JBQ3RDLEdBQUcsWUFBWTtnQkFDZixHQUFHO29CQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDVCxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztvQkFDRCxPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
1
|
+
import { AspectExecutor } from "./AspectExecutor.js";
|
|
2
|
+
import "@eggjs/aop-decorator";
|
|
3
|
+
import assert from "node:assert";
|
|
4
|
+
import { PrototypeUtil } from "@eggjs/core-decorator";
|
|
5
|
+
import { EggContainerFactory } from "@eggjs/tegg-runtime";
|
|
6
|
+
import { ASPECT_LIST, InjectType } from "@eggjs/tegg-types";
|
|
7
|
+
|
|
8
|
+
//#region src/EggObjectAopHook.ts
|
|
9
|
+
var EggObjectAopHook = class {
|
|
10
|
+
hijackMethods(obj, aspectList) {
|
|
11
|
+
for (const aspect of aspectList) {
|
|
12
|
+
const newExecutor = new AspectExecutor(obj, aspect.method, aspect.adviceList);
|
|
13
|
+
obj[aspect.method] = newExecutor.execute.bind(newExecutor);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
injectAdvice(eggObject, obj, aspectList) {
|
|
17
|
+
if (eggObject.proto.getMetaData(PrototypeUtil.INJECT_TYPE) !== InjectType.CONSTRUCTOR) return;
|
|
18
|
+
for (const aspect of aspectList) for (const advice of aspect.adviceList) {
|
|
19
|
+
const injectObject = eggObject.proto.injectObjects.find((t) => t.objName === advice.name);
|
|
20
|
+
assert(injectObject, `not found inject advice ${advice.name}`);
|
|
21
|
+
const adviceObj = EggContainerFactory.getEggObject(injectObject.proto, advice.name);
|
|
22
|
+
Object.defineProperty(obj, advice.name, {
|
|
23
|
+
value: adviceObj.obj,
|
|
24
|
+
enumerable: false
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async postCreate(_, eggObject) {
|
|
29
|
+
const aspectList = eggObject.proto.getMetaData(ASPECT_LIST);
|
|
30
|
+
if (!aspectList || !aspectList.length) return;
|
|
31
|
+
const propertyDesc = eggObject.constructor && Reflect.getOwnPropertyDescriptor(eggObject.constructor.prototype, "obj");
|
|
32
|
+
if (propertyDesc?.get) {
|
|
33
|
+
let obj;
|
|
34
|
+
const self = this;
|
|
35
|
+
Object.defineProperty(eggObject, "obj", {
|
|
36
|
+
...propertyDesc,
|
|
37
|
+
get() {
|
|
38
|
+
if (!obj) {
|
|
39
|
+
obj = Reflect.apply(propertyDesc.get, eggObject, []);
|
|
40
|
+
self.hijackMethods(obj, aspectList);
|
|
41
|
+
self.injectAdvice(eggObject, obj, aspectList);
|
|
42
|
+
}
|
|
43
|
+
return obj;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
} else {
|
|
47
|
+
this.hijackMethods(eggObject.obj, aspectList);
|
|
48
|
+
this.injectAdvice(eggObject, eggObject.obj, aspectList);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { EggObjectAopHook };
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { CrosscutAdviceFactory } from
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { CrosscutAdviceFactory } from "@eggjs/aop-decorator";
|
|
2
|
+
import { EggPrototype, EggPrototypeLifecycleContext, LifecycleHook } from "@eggjs/tegg-types";
|
|
3
|
+
|
|
4
|
+
//#region src/EggPrototypeCrossCutHook.d.ts
|
|
5
|
+
declare class EggPrototypeCrossCutHook implements LifecycleHook<EggPrototypeLifecycleContext, EggPrototype> {
|
|
6
|
+
private readonly crosscutAdviceFactory;
|
|
7
|
+
constructor(crosscutAdviceFactory: CrosscutAdviceFactory);
|
|
8
|
+
preCreate(ctx: EggPrototypeLifecycleContext): Promise<void>;
|
|
7
9
|
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { EggPrototypeCrossCutHook };
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { CrosscutAdviceFactory, CrosscutInfoUtil } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
1
|
+
import { CrosscutAdviceFactory, CrosscutInfoUtil } from "@eggjs/aop-decorator";
|
|
2
|
+
|
|
3
|
+
//#region src/EggPrototypeCrossCutHook.ts
|
|
4
|
+
var EggPrototypeCrossCutHook = class {
|
|
5
|
+
crosscutAdviceFactory;
|
|
6
|
+
constructor(crosscutAdviceFactory) {
|
|
7
|
+
this.crosscutAdviceFactory = crosscutAdviceFactory;
|
|
8
|
+
}
|
|
9
|
+
async preCreate(ctx) {
|
|
10
|
+
if (CrosscutInfoUtil.isCrosscutAdvice(ctx.clazz)) this.crosscutAdviceFactory.registerCrossAdviceClazz(ctx.clazz);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { EggPrototypeCrossCutHook };
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { CrosscutAdviceFactory } from
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { CrosscutAdviceFactory } from "@eggjs/aop-decorator";
|
|
2
|
+
import { LifecycleHook, LoadUnit, LoadUnitLifecycleContext } from "@eggjs/tegg-types";
|
|
3
|
+
|
|
4
|
+
//#region src/LoadUnitAopHook.d.ts
|
|
5
|
+
declare class LoadUnitAopHook implements LifecycleHook<LoadUnitLifecycleContext, LoadUnit> {
|
|
6
|
+
private readonly crosscutAdviceFactory;
|
|
7
|
+
constructor(crosscutAdviceFactory: CrosscutAdviceFactory);
|
|
8
|
+
postCreate(_: LoadUnitLifecycleContext, loadUnit: LoadUnit): Promise<void>;
|
|
7
9
|
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { LoadUnitAopHook };
|
package/dist/LoadUnitAopHook.js
CHANGED
|
@@ -1,37 +1,32 @@
|
|
|
1
|
-
import { AspectInfoUtil, AspectMetaBuilder, CrosscutAdviceFactory } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFVuaXRBb3BIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xvYWRVbml0QW9wSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVM1QyxNQUFNLE9BQU8sZUFBZTtJQUNULHFCQUFxQixDQUF3QjtJQUU5RCxZQUFZLHFCQUE0QztRQUN0RCxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBMkIsRUFBRSxRQUFrQjtRQUM5RCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUM7WUFDbkQsTUFBTSxjQUFjLEdBQUcsS0FBOEIsQ0FBQztZQUN0RCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLO2dCQUFFLFNBQVM7WUFFckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7Z0JBQzNDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7YUFDbEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELEtBQUssTUFBTSxNQUFNLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN2QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUNqQixNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksMEJBQTBCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztvQkFDeEcsQ0FBQztvQkFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJO3dCQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLElBQUk7d0JBQ3BCLFVBQVUsRUFBRSxFQUFFO3dCQUNkLEtBQUssRUFBRSxXQUEyQjtxQkFDbkMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiJ9
|
|
1
|
+
import { AspectInfoUtil, AspectMetaBuilder, CrosscutAdviceFactory } from "@eggjs/aop-decorator";
|
|
2
|
+
import { TeggError } from "@eggjs/metadata";
|
|
3
|
+
import { PrototypeUtil } from "@eggjs/core-decorator";
|
|
4
|
+
|
|
5
|
+
//#region src/LoadUnitAopHook.ts
|
|
6
|
+
var LoadUnitAopHook = class {
|
|
7
|
+
crosscutAdviceFactory;
|
|
8
|
+
constructor(crosscutAdviceFactory) {
|
|
9
|
+
this.crosscutAdviceFactory = crosscutAdviceFactory;
|
|
10
|
+
}
|
|
11
|
+
async postCreate(_, loadUnit) {
|
|
12
|
+
for (const proto of loadUnit.iterateEggPrototype()) {
|
|
13
|
+
const clazz = proto.clazz;
|
|
14
|
+
if (!clazz) continue;
|
|
15
|
+
const aspectList = new AspectMetaBuilder(clazz, { crosscutAdviceFactory: this.crosscutAdviceFactory }).build();
|
|
16
|
+
AspectInfoUtil.setAspectList(aspectList, clazz);
|
|
17
|
+
for (const aspect of aspectList) for (const advice of aspect.adviceList) {
|
|
18
|
+
const adviceProto = PrototypeUtil.getClazzProto(advice.clazz);
|
|
19
|
+
if (!adviceProto) throw TeggError.create(`Aop Advice(${advice.clazz.name}) not found in loadUnits`, "advice_not_found");
|
|
20
|
+
proto.injectObjects.push({
|
|
21
|
+
refName: advice.name,
|
|
22
|
+
objName: advice.name,
|
|
23
|
+
qualifiers: [],
|
|
24
|
+
proto: adviceProto
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { LoadUnitAopHook };
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
import { GlobalGraph } from
|
|
2
|
-
|
|
1
|
+
import { GlobalGraph } from "@eggjs/metadata";
|
|
2
|
+
|
|
3
|
+
//#region src/PointCutGraphHook.d.ts
|
|
4
|
+
declare function pointCutGraphHook(globalGraph: GlobalGraph): void;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { pointCutGraphHook };
|
|
@@ -1,42 +1,37 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
}
|
|
1
|
+
import { AspectMetaBuilder, PointcutAdviceInfoUtil } from "@eggjs/aop-decorator";
|
|
2
|
+
import { ClassProtoDescriptor, GlobalGraph } from "@eggjs/metadata";
|
|
3
|
+
import "@eggjs/tegg-common-util";
|
|
4
|
+
import assert from "node:assert";
|
|
5
|
+
import { PrototypeUtil, QualifierUtil } from "@eggjs/core-decorator";
|
|
6
|
+
|
|
7
|
+
//#region src/PointCutGraphHook.ts
|
|
8
|
+
function pointCutGraphHook(globalGraph) {
|
|
9
|
+
for (const moduleNode of globalGraph.moduleGraph.nodes.values()) for (const pointCuttedProtoNode of moduleNode.val.protos) {
|
|
10
|
+
const pointCutAdviceProtoList = findPointCutAdvice(globalGraph, pointCuttedProtoNode);
|
|
11
|
+
if (!pointCutAdviceProtoList) continue;
|
|
12
|
+
for (const pointCutAdviceProto of pointCutAdviceProtoList) globalGraph.addInject(moduleNode, pointCuttedProtoNode, pointCutAdviceProto, pointCutAdviceProto.val.proto.name);
|
|
13
|
+
}
|
|
17
14
|
}
|
|
18
15
|
function findPointCutAdvice(globalGraph, protoNode) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return Array.from(result);
|
|
16
|
+
const proto = protoNode.val.proto;
|
|
17
|
+
if (!ClassProtoDescriptor.isClassProtoDescriptor(proto)) return;
|
|
18
|
+
const result = /* @__PURE__ */ new Set();
|
|
19
|
+
const allMethods = AspectMetaBuilder.getAllMethods(proto.clazz);
|
|
20
|
+
for (const method of allMethods) {
|
|
21
|
+
const adviceInfoList = PointcutAdviceInfoUtil.getPointcutAdviceInfoList(proto.clazz, method);
|
|
22
|
+
for (const { clazz } of adviceInfoList) {
|
|
23
|
+
const property = PrototypeUtil.getProperty(clazz);
|
|
24
|
+
assert(property, "not found property");
|
|
25
|
+
const injectProto = globalGraph.findDependencyProtoNode(protoNode.val.proto, {
|
|
26
|
+
objName: property.name,
|
|
27
|
+
refName: property.name,
|
|
28
|
+
qualifiers: QualifierUtil.mergeQualifiers(property?.qualifiers ?? [], QualifierUtil.getProtoQualifiers(clazz))
|
|
29
|
+
});
|
|
30
|
+
if (injectProto) result.add(injectProto);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return Array.from(result);
|
|
41
34
|
}
|
|
42
|
-
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { pointCutGraphHook };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { AspectExecutor } from "./AspectExecutor.js";
|
|
2
|
+
import { crossCutGraphHook } from "./CrossCutGraphHook.js";
|
|
3
|
+
import { EggObjectAopHook } from "./EggObjectAopHook.js";
|
|
4
|
+
import { EggPrototypeCrossCutHook } from "./EggPrototypeCrossCutHook.js";
|
|
5
|
+
import { LoadUnitAopHook } from "./LoadUnitAopHook.js";
|
|
6
|
+
import { pointCutGraphHook } from "./PointCutGraphHook.js";
|
|
7
|
+
export { AspectExecutor, EggObjectAopHook, EggPrototypeCrossCutHook, LoadUnitAopHook, crossCutGraphHook, pointCutGraphHook };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { AspectExecutor } from "./AspectExecutor.js";
|
|
2
|
+
import { crossCutGraphHook } from "./CrossCutGraphHook.js";
|
|
3
|
+
import { EggObjectAopHook } from "./EggObjectAopHook.js";
|
|
4
|
+
import { EggPrototypeCrossCutHook } from "./EggPrototypeCrossCutHook.js";
|
|
5
|
+
import { LoadUnitAopHook } from "./LoadUnitAopHook.js";
|
|
6
|
+
import { pointCutGraphHook } from "./PointCutGraphHook.js";
|
|
7
|
+
|
|
8
|
+
export { AspectExecutor, EggObjectAopHook, EggPrototypeCrossCutHook, LoadUnitAopHook, crossCutGraphHook, pointCutGraphHook };
|
package/package.json
CHANGED
|
@@ -1,66 +1,62 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/aop-runtime",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.36",
|
|
4
4
|
"description": "tegg aop runtime",
|
|
5
|
-
"eggModule": {
|
|
6
|
-
"name": "teggAopRuntime"
|
|
7
|
-
},
|
|
8
|
-
"type": "module",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": "./dist/index.js",
|
|
11
|
-
"./package.json": "./package.json"
|
|
12
|
-
},
|
|
13
|
-
"files": [
|
|
14
|
-
"dist"
|
|
15
|
-
],
|
|
16
5
|
"keywords": [
|
|
6
|
+
"aop",
|
|
17
7
|
"egg",
|
|
18
|
-
"typescript",
|
|
19
8
|
"runtime",
|
|
20
9
|
"tegg",
|
|
21
|
-
"
|
|
10
|
+
"typescript"
|
|
22
11
|
],
|
|
23
|
-
"author": "killagu <killa123@126.com>",
|
|
24
|
-
"license": "MIT",
|
|
25
12
|
"homepage": "https://github.com/eggjs/egg/tree/next/tegg/core/aop-runtime",
|
|
26
13
|
"bugs": {
|
|
27
14
|
"url": "https://github.com/eggjs/egg/issues"
|
|
28
15
|
},
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"author": "killagu <killa123@126.com>",
|
|
29
18
|
"repository": {
|
|
30
19
|
"type": "git",
|
|
31
20
|
"url": "git+https://github.com/eggjs/egg.git",
|
|
32
21
|
"directory": "tegg/core/aop-runtime"
|
|
33
22
|
},
|
|
34
|
-
"
|
|
35
|
-
"
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": "./dist/index.js",
|
|
32
|
+
"./package.json": "./package.json"
|
|
36
33
|
},
|
|
37
34
|
"publishConfig": {
|
|
38
35
|
"access": "public"
|
|
39
36
|
},
|
|
40
37
|
"dependencies": {
|
|
41
38
|
"koa-compose": "^4.1.0",
|
|
42
|
-
"@eggjs/aop-decorator": "4.0.0-beta.
|
|
43
|
-
"@eggjs/
|
|
44
|
-
"@eggjs/tegg-
|
|
45
|
-
"@eggjs/
|
|
46
|
-
"@eggjs/
|
|
47
|
-
"@eggjs/tegg-
|
|
39
|
+
"@eggjs/aop-decorator": "4.0.0-beta.36",
|
|
40
|
+
"@eggjs/core-decorator": "4.0.0-beta.36",
|
|
41
|
+
"@eggjs/tegg-runtime": "4.0.0-beta.36",
|
|
42
|
+
"@eggjs/metadata": "4.0.0-beta.36",
|
|
43
|
+
"@eggjs/tegg-common-util": "4.0.0-beta.36",
|
|
44
|
+
"@eggjs/tegg-types": "4.0.0-beta.36"
|
|
48
45
|
},
|
|
49
46
|
"devDependencies": {
|
|
50
47
|
"@types/koa-compose": "^3.2.8",
|
|
51
|
-
"@types/node": "^24.10.
|
|
48
|
+
"@types/node": "^24.10.2",
|
|
52
49
|
"typescript": "^5.9.3",
|
|
53
|
-
"tsdown": "^0.17.0",
|
|
54
|
-
"unplugin-unused": "^0.5.4",
|
|
55
50
|
"@eggjs/module-test-util": "4.0.0-beta.29",
|
|
56
|
-
"@eggjs/tegg-loader": "4.0.0-beta.
|
|
51
|
+
"@eggjs/tegg-loader": "4.0.0-beta.36"
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=22.18.0"
|
|
55
|
+
},
|
|
56
|
+
"eggModule": {
|
|
57
|
+
"name": "teggAopRuntime"
|
|
57
58
|
},
|
|
58
|
-
"main": "./dist/index.js",
|
|
59
|
-
"module": "./dist/index.js",
|
|
60
|
-
"types": "./dist/index.d.ts",
|
|
61
59
|
"scripts": {
|
|
62
|
-
"
|
|
63
|
-
"build": "tsdown && npm run clean && tsc -p tsconfig.build.json",
|
|
64
|
-
"typecheck": "tsc --noEmit"
|
|
60
|
+
"typecheck": "tsgo --noEmit"
|
|
65
61
|
}
|
|
66
62
|
}
|