@eggjs/tegg-aop-runtime 1.5.4 → 3.0.0-alpha.0
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/aop-runtime/index.d.ts +3 -0
- package/dist/aop-runtime/index.js +20 -0
- package/dist/aop-runtime/src/AspectExecutor.d.ts +13 -0
- package/dist/aop-runtime/src/AspectExecutor.js +84 -0
- package/dist/aop-runtime/src/EggObjectAopHook.d.ts +6 -0
- package/dist/aop-runtime/src/EggObjectAopHook.js +39 -0
- package/dist/aop-runtime/src/EggPrototypeCrossCutHook.d.ts +8 -0
- package/dist/aop-runtime/src/EggPrototypeCrossCutHook.js +16 -0
- package/dist/aop-runtime/src/LoadUnitAopHook.d.ts +12 -0
- package/dist/aop-runtime/src/LoadUnitAopHook.js +40 -0
- package/dist/aop-runtime/test/aop-runtime.test.d.ts +1 -0
- package/dist/aop-runtime/test/aop-runtime.test.js +132 -0
- package/dist/aop-runtime/test/fixtures/modules/hello_succeed/Hello.d.ts +30 -0
- package/dist/aop-runtime/test/fixtures/modules/hello_succeed/Hello.js +131 -0
- package/dist/aop-runtime/test/fixtures/modules/should_throw/Hello.d.ts +4 -0
- package/dist/aop-runtime/test/fixtures/modules/should_throw/Hello.js +41 -0
- package/dist/test-util/CoreTestHelper.d.ts +14 -0
- package/dist/test-util/CoreTestHelper.js +43 -0
- package/package.json +10 -10
- package/CHANGELOG.md +0 -91
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./src/EggPrototypeCrossCutHook"), exports);
|
|
18
|
+
__exportStar(require("./src/EggObjectAopHook"), exports);
|
|
19
|
+
__exportStar(require("./src/LoadUnitAopHook"), exports);
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaUVBQStDO0FBQy9DLHlEQUF1QztBQUN2Qyx3REFBc0MifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AdviceContext, AspectAdvice } from '@eggjs/aop-decorator';
|
|
2
|
+
export declare class AspectExecutor {
|
|
3
|
+
obj: Object;
|
|
4
|
+
method: PropertyKey;
|
|
5
|
+
aspectAdviceList: readonly AspectAdvice[];
|
|
6
|
+
constructor(obj: object, method: PropertyKey, aspectAdviceList: readonly AspectAdvice[]);
|
|
7
|
+
execute(...args: any[]): Promise<void>;
|
|
8
|
+
beforeCall(ctx: AdviceContext): Promise<void>;
|
|
9
|
+
afterReturn(ctx: AdviceContext, result: any): Promise<void>;
|
|
10
|
+
afterThrow(ctx: AdviceContext, error: Error): Promise<void>;
|
|
11
|
+
afterFinally(ctx: AdviceContext): Promise<void>;
|
|
12
|
+
doExecute(ctx: AdviceContext): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
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.AspectExecutor = void 0;
|
|
7
|
+
const koa_compose_1 = __importDefault(require("koa-compose"));
|
|
8
|
+
class AspectExecutor {
|
|
9
|
+
constructor(obj, method, aspectAdviceList) {
|
|
10
|
+
this.obj = obj;
|
|
11
|
+
this.method = method;
|
|
12
|
+
this.aspectAdviceList = aspectAdviceList;
|
|
13
|
+
}
|
|
14
|
+
async execute(...args) {
|
|
15
|
+
const ctx = {
|
|
16
|
+
that: this.obj,
|
|
17
|
+
method: this.method,
|
|
18
|
+
args,
|
|
19
|
+
};
|
|
20
|
+
await this.beforeCall(ctx);
|
|
21
|
+
try {
|
|
22
|
+
const result = await this.doExecute(ctx);
|
|
23
|
+
await this.afterReturn(ctx, result);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
await this.afterThrow(ctx, e);
|
|
28
|
+
throw e;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
await this.afterFinally(ctx);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async beforeCall(ctx) {
|
|
35
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
36
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
37
|
+
if (advice.beforeCall) {
|
|
38
|
+
await advice.beforeCall(ctx);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async afterReturn(ctx, result) {
|
|
43
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
44
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
45
|
+
if (advice.afterReturn) {
|
|
46
|
+
await advice.afterReturn(ctx, result);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async afterThrow(ctx, error) {
|
|
51
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
52
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
53
|
+
if (advice.afterThrow) {
|
|
54
|
+
await advice.afterThrow(ctx, error);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async afterFinally(ctx) {
|
|
59
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
60
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
61
|
+
if (advice.afterFinally) {
|
|
62
|
+
await advice.afterFinally(ctx);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async doExecute(ctx) {
|
|
67
|
+
const lastCall = () => {
|
|
68
|
+
const originMethod = Object.getPrototypeOf(this.obj)[this.method];
|
|
69
|
+
return Reflect.apply(originMethod, ctx.that, ctx.args);
|
|
70
|
+
};
|
|
71
|
+
const functions = [];
|
|
72
|
+
for (const aspectAdvice of this.aspectAdviceList) {
|
|
73
|
+
const advice = ctx.that[aspectAdvice.name];
|
|
74
|
+
const fn = advice.around;
|
|
75
|
+
if (fn) {
|
|
76
|
+
functions.push(fn.bind(advice));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
functions.push(lastCall);
|
|
80
|
+
return (0, koa_compose_1.default)(functions)(ctx);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.AspectExecutor = AspectExecutor;
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNwZWN0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQXNwZWN0RXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsOERBQWtDO0FBR2xDLE1BQWEsY0FBYztJQUt6QixZQUFZLEdBQVcsRUFBRSxNQUFtQixFQUFFLGdCQUF5QztRQUNyRixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQVc7UUFDMUIsTUFBTSxHQUFHLEdBQWtCO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRztZQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixJQUFJO1NBQ0wsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJO1lBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLENBQUMsQ0FBQztTQUNUO2dCQUFTO1lBQ1IsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlCO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBa0I7UUFDakMsS0FBSyxNQUFNLFlBQVksSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVB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
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { LifecycleHook } from '@eggjs/tegg-lifecycle';
|
|
2
|
+
import { EggObject, EggObjectLifeCycleContext } from '@eggjs/tegg-runtime';
|
|
3
|
+
export declare class EggObjectAopHook implements LifecycleHook<EggObjectLifeCycleContext, EggObject> {
|
|
4
|
+
private hijackMethods;
|
|
5
|
+
postCreate(_: EggObjectLifeCycleContext, eggObject: EggObject): Promise<void>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EggObjectAopHook = void 0;
|
|
4
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
5
|
+
const AspectExecutor_1 = require("./AspectExecutor");
|
|
6
|
+
class EggObjectAopHook {
|
|
7
|
+
hijackMethods(obj, aspectList) {
|
|
8
|
+
for (const aspect of aspectList) {
|
|
9
|
+
const newExecutor = new AspectExecutor_1.AspectExecutor(obj, aspect.method, aspect.adviceList);
|
|
10
|
+
obj[aspect.method] = newExecutor.execute.bind(newExecutor);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async postCreate(_, eggObject) {
|
|
14
|
+
const aspectList = eggObject.proto.getMetaData(aop_decorator_1.ASPECT_LIST);
|
|
15
|
+
if (!aspectList || !aspectList.length)
|
|
16
|
+
return;
|
|
17
|
+
const propertyDesc = eggObject.constructor && Reflect.getOwnPropertyDescriptor(eggObject.constructor.prototype, 'obj');
|
|
18
|
+
// process the lazy getter
|
|
19
|
+
if (propertyDesc === null || propertyDesc === void 0 ? void 0 : propertyDesc.get) {
|
|
20
|
+
let obj;
|
|
21
|
+
const self = this;
|
|
22
|
+
Object.defineProperty(eggObject, 'obj', {
|
|
23
|
+
...propertyDesc,
|
|
24
|
+
get() {
|
|
25
|
+
if (!obj) {
|
|
26
|
+
obj = Reflect.apply(propertyDesc.get, eggObject, []);
|
|
27
|
+
self.hijackMethods(obj, aspectList);
|
|
28
|
+
}
|
|
29
|
+
return obj;
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.hijackMethods(eggObject.obj, aspectList);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.EggObjectAopHook = EggObjectAopHook;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnT2JqZWN0QW9wSG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9FZ2dPYmplY3RBb3BIb29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdEQUEyRDtBQUMzRCxxREFBa0Q7QUFFbEQsTUFBYSxnQkFBZ0I7SUFDbkIsYUFBYSxDQUFDLEdBQVEsRUFBRSxVQUF5QjtRQUN2RCxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsRUFBRTtZQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLCtCQUFjLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlFLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUE0QixFQUFFLFNBQW9CO1FBQ2pFLE1BQU0sVUFBVSxHQUE4QixTQUFTLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQywyQkFBVyxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUM5QyxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUUsQ0FBQztRQUN4SCwwQkFBMEI7UUFDMUIsSUFBSSxZQUFZLGFBQVosWUFBWSx1QkFBWixZQUFZLENBQUUsR0FBRyxFQUFFO1lBQ3JCLElBQUksR0FBRyxDQUFDO1lBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRTtnQkFDdEMsR0FBRyxZQUFZO2dCQUNmLEdBQUc7b0JBQ0QsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDUixHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQ3JDO29CQUNELE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUM7YUFDRixDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQy9DO0lBQ0gsQ0FBQztDQUNGO0FBOUJELDRDQThCQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { LifecycleHook } from '@eggjs/tegg-lifecycle';
|
|
2
|
+
import { CrosscutAdviceFactory } from '@eggjs/aop-decorator';
|
|
3
|
+
import { EggPrototype, EggPrototypeLifecycleContext } from '@eggjs/tegg-metadata';
|
|
4
|
+
export declare class EggPrototypeCrossCutHook implements LifecycleHook<EggPrototypeLifecycleContext, EggPrototype> {
|
|
5
|
+
private readonly crosscutAdviceFactory;
|
|
6
|
+
constructor(crosscutAdviceFactory: CrosscutAdviceFactory);
|
|
7
|
+
preCreate(ctx: EggPrototypeLifecycleContext): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EggPrototypeCrossCutHook = void 0;
|
|
4
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
5
|
+
class EggPrototypeCrossCutHook {
|
|
6
|
+
constructor(crosscutAdviceFactory) {
|
|
7
|
+
this.crosscutAdviceFactory = crosscutAdviceFactory;
|
|
8
|
+
}
|
|
9
|
+
async preCreate(ctx) {
|
|
10
|
+
if (aop_decorator_1.CrosscutInfoUtil.isCrosscutAdvice(ctx.clazz)) {
|
|
11
|
+
this.crosscutAdviceFactory.registerCrossAdviceClazz(ctx.clazz);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.EggPrototypeCrossCutHook = EggPrototypeCrossCutHook;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWdnUHJvdG90eXBlQ3Jvc3NDdXRIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0VnZ1Byb3RvdHlwZUNyb3NzQ3V0SG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx3REFBK0U7QUFHL0UsTUFBYSx3QkFBd0I7SUFHbkMsWUFBWSxxQkFBNEM7UUFDdEQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQWlDO1FBQy9DLElBQUksZ0NBQWdCLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0NBQ0Y7QUFaRCw0REFZQyJ9
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { LifecycleHook } from '@eggjs/tegg-lifecycle';
|
|
2
|
+
import { CrosscutAdviceFactory } from '@eggjs/aop-decorator';
|
|
3
|
+
import { EggProtoImplClass } from '@eggjs/core-decorator';
|
|
4
|
+
import { EggPrototype, LoadUnit, LoadUnitLifecycleContext } from '@eggjs/tegg-metadata';
|
|
5
|
+
export interface EggPrototypeWithClazz extends EggPrototype {
|
|
6
|
+
clazz?: EggProtoImplClass;
|
|
7
|
+
}
|
|
8
|
+
export declare class LoadUnitAopHook implements LifecycleHook<LoadUnitLifecycleContext, LoadUnit> {
|
|
9
|
+
private readonly crosscutAdviceFactory;
|
|
10
|
+
constructor(crosscutAdviceFactory: CrosscutAdviceFactory);
|
|
11
|
+
postCreate(_: LoadUnitLifecycleContext, loadUnit: LoadUnit): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LoadUnitAopHook = void 0;
|
|
4
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
5
|
+
const core_decorator_1 = require("@eggjs/core-decorator");
|
|
6
|
+
const tegg_metadata_1 = require("@eggjs/tegg-metadata");
|
|
7
|
+
class LoadUnitAopHook {
|
|
8
|
+
constructor(crosscutAdviceFactory) {
|
|
9
|
+
this.crosscutAdviceFactory = crosscutAdviceFactory;
|
|
10
|
+
}
|
|
11
|
+
async postCreate(_, loadUnit) {
|
|
12
|
+
for (const proto of loadUnit.iterateEggPrototype()) {
|
|
13
|
+
const protoWithClazz = proto;
|
|
14
|
+
const clazz = protoWithClazz.clazz;
|
|
15
|
+
if (!clazz)
|
|
16
|
+
continue;
|
|
17
|
+
const builder = new aop_decorator_1.AspectMetaBuilder(clazz, {
|
|
18
|
+
crosscutAdviceFactory: this.crosscutAdviceFactory,
|
|
19
|
+
});
|
|
20
|
+
const aspectList = builder.build();
|
|
21
|
+
for (const aspect of aspectList) {
|
|
22
|
+
aop_decorator_1.AspectInfoUtil.setAspectList(aspectList, clazz);
|
|
23
|
+
for (const advice of aspect.adviceList) {
|
|
24
|
+
const adviceProto = core_decorator_1.PrototypeUtil.getClazzProto(advice.clazz);
|
|
25
|
+
if (!adviceProto) {
|
|
26
|
+
throw tegg_metadata_1.TeggError.create(`Aop Advice(${advice.clazz.name}) not found in loadUnits`, 'advice_not_found');
|
|
27
|
+
}
|
|
28
|
+
proto.injectObjects.push({
|
|
29
|
+
refName: advice.name,
|
|
30
|
+
objName: advice.name,
|
|
31
|
+
qualifiers: [],
|
|
32
|
+
proto: adviceProto,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.LoadUnitAopHook = LoadUnitAopHook;
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9hZFVuaXRBb3BIb29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0xvYWRVbml0QW9wSG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx3REFBZ0c7QUFDaEcsMERBQXlFO0FBQ3pFLHdEQUFtRztBQU1uRyxNQUFhLGVBQWU7SUFHMUIsWUFBWSxxQkFBNEM7UUFDdEQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0lBQ3JELENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLENBQTJCLEVBQUUsUUFBa0I7UUFDOUQsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtZQUNsRCxNQUFNLGNBQWMsR0FBRyxLQUE4QixDQUFDO1lBQ3RELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDbkMsSUFBSSxDQUFDLEtBQUs7Z0JBQUUsU0FBUztZQUVyQixNQUFNLE9BQU8sR0FBRyxJQUFJLGlDQUFpQixDQUFDLEtBQUssRUFBRTtnQkFDM0MscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjthQUNsRCxDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLE1BQU0sSUFBSSxVQUFVLEVBQUU7Z0JBQy9CLDhCQUFjLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEQsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO29CQUN0QyxNQUFNLFdBQVcsR0FBRyw4QkFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlELElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ2hCLE1BQU0seUJBQVMsQ0FBQyxNQUFNLENBQUMsY0FBYyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksMEJBQTBCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztxQkFDdkc7b0JBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQ3ZCLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSTt3QkFDcEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJO3dCQUNwQixVQUFVLEVBQUUsRUFBRTt3QkFDZCxLQUFLLEVBQUUsV0FBMkI7cUJBQ25DLENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUFuQ0QsMENBbUNDIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
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
|
+
const path_1 = __importDefault(require("path"));
|
|
7
|
+
const mm_1 = __importDefault(require("mm"));
|
|
8
|
+
const assert_1 = __importDefault(require("assert"));
|
|
9
|
+
const tegg_runtime_1 = require("@eggjs/tegg-runtime");
|
|
10
|
+
const tegg_metadata_1 = require("@eggjs/tegg-metadata");
|
|
11
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
12
|
+
const test_util_1 = require("../../test-util");
|
|
13
|
+
const Hello_1 = require("./fixtures/modules/hello_succeed/Hello");
|
|
14
|
+
const CoreTestHelper_1 = require("../../test-util/CoreTestHelper");
|
|
15
|
+
const EggObjectAopHook_1 = require("../src/EggObjectAopHook");
|
|
16
|
+
const LoadUnitAopHook_1 = require("../src/LoadUnitAopHook");
|
|
17
|
+
const EggPrototypeCrossCutHook_1 = require("../src/EggPrototypeCrossCutHook");
|
|
18
|
+
describe('test/aop-runtime.test.ts', () => {
|
|
19
|
+
describe('succeed call', () => {
|
|
20
|
+
let modules;
|
|
21
|
+
let crosscutAdviceFactory;
|
|
22
|
+
let eggObjectAopHook;
|
|
23
|
+
let loadUnitAopHook;
|
|
24
|
+
let eggPrototypeCrossCutHook;
|
|
25
|
+
beforeEach(async () => {
|
|
26
|
+
crosscutAdviceFactory = new aop_decorator_1.CrosscutAdviceFactory();
|
|
27
|
+
eggObjectAopHook = new EggObjectAopHook_1.EggObjectAopHook();
|
|
28
|
+
loadUnitAopHook = new LoadUnitAopHook_1.LoadUnitAopHook(crosscutAdviceFactory);
|
|
29
|
+
eggPrototypeCrossCutHook = new EggPrototypeCrossCutHook_1.EggPrototypeCrossCutHook(crosscutAdviceFactory);
|
|
30
|
+
tegg_metadata_1.EggPrototypeLifecycleUtil.registerLifecycle(eggPrototypeCrossCutHook);
|
|
31
|
+
tegg_metadata_1.LoadUnitLifecycleUtil.registerLifecycle(loadUnitAopHook);
|
|
32
|
+
tegg_runtime_1.EggObjectLifecycleUtil.registerLifecycle(eggObjectAopHook);
|
|
33
|
+
modules = await CoreTestHelper_1.CoreTestHelper.prepareModules([
|
|
34
|
+
path_1.default.join(__dirname, '..'),
|
|
35
|
+
path_1.default.join(__dirname, 'fixtures/modules/hello_succeed'),
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
afterEach(async () => {
|
|
39
|
+
for (const module of modules) {
|
|
40
|
+
await tegg_metadata_1.LoadUnitFactory.destroyLoadUnit(module.loadUnit);
|
|
41
|
+
await tegg_runtime_1.LoadUnitInstanceFactory.destroyLoadUnitInstance(module);
|
|
42
|
+
}
|
|
43
|
+
tegg_metadata_1.EggPrototypeLifecycleUtil.deleteLifecycle(eggPrototypeCrossCutHook);
|
|
44
|
+
tegg_metadata_1.LoadUnitLifecycleUtil.deleteLifecycle(loadUnitAopHook);
|
|
45
|
+
tegg_runtime_1.EggObjectLifecycleUtil.deleteLifecycle(eggObjectAopHook);
|
|
46
|
+
});
|
|
47
|
+
it('should work', async () => {
|
|
48
|
+
await test_util_1.EggTestContext.mockContext(async () => {
|
|
49
|
+
const hello = await CoreTestHelper_1.CoreTestHelper.getObject(Hello_1.Hello);
|
|
50
|
+
const callTrace = await CoreTestHelper_1.CoreTestHelper.getObject(Hello_1.CallTrace);
|
|
51
|
+
const msg = await hello.hello('aop');
|
|
52
|
+
const traceMsg = callTrace.msgs;
|
|
53
|
+
(0, assert_1.default)(msg === 'withCrossAroundResult(withPointAroundResult(hello withPointAroundParam(withCrosscutAroundParam(aop))))');
|
|
54
|
+
assert_1.default.deepStrictEqual(traceMsg, [
|
|
55
|
+
{
|
|
56
|
+
className: 'CrosscutAdvice',
|
|
57
|
+
methodName: 'beforeCall',
|
|
58
|
+
id: 233,
|
|
59
|
+
name: 'aop',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
className: 'PointcutAdvice',
|
|
63
|
+
methodName: 'beforeCall',
|
|
64
|
+
id: 233,
|
|
65
|
+
name: 'aop',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
className: 'CrosscutAdvice',
|
|
69
|
+
methodName: 'afterReturn',
|
|
70
|
+
id: 233,
|
|
71
|
+
name: 'withPointAroundParam(withCrosscutAroundParam(aop))',
|
|
72
|
+
result: 'withCrossAroundResult(withPointAroundResult(hello withPointAroundParam(withCrosscutAroundParam(aop))))',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
className: 'PointcutAdvice',
|
|
76
|
+
methodName: 'afterReturn',
|
|
77
|
+
id: 233,
|
|
78
|
+
name: 'withPointAroundParam(withCrosscutAroundParam(aop))',
|
|
79
|
+
result: 'withCrossAroundResult(withPointAroundResult(hello withPointAroundParam(withCrosscutAroundParam(aop))))',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
className: 'CrosscutAdvice',
|
|
83
|
+
methodName: 'afterFinally',
|
|
84
|
+
id: 233,
|
|
85
|
+
name: 'withPointAroundParam(withCrosscutAroundParam(aop))',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
className: 'PointcutAdvice',
|
|
89
|
+
methodName: 'afterFinally',
|
|
90
|
+
id: 233,
|
|
91
|
+
name: 'withPointAroundParam(withCrosscutAroundParam(aop))',
|
|
92
|
+
},
|
|
93
|
+
]);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('mock should work', async () => {
|
|
97
|
+
await test_util_1.EggTestContext.mockContext(async () => {
|
|
98
|
+
const hello = await CoreTestHelper_1.CoreTestHelper.getObject(Hello_1.Hello);
|
|
99
|
+
let helloMocked = false;
|
|
100
|
+
(0, mm_1.default)(Hello_1.Hello.prototype, 'hello', async () => {
|
|
101
|
+
helloMocked = true;
|
|
102
|
+
});
|
|
103
|
+
await hello.hello('aop');
|
|
104
|
+
(0, assert_1.default)(helloMocked === true);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('should failed', () => {
|
|
109
|
+
let crosscutAdviceFactory;
|
|
110
|
+
let eggObjectAopHook;
|
|
111
|
+
let loadUnitAopHook;
|
|
112
|
+
let eggPrototypeCrossCutHook;
|
|
113
|
+
beforeEach(async () => {
|
|
114
|
+
crosscutAdviceFactory = new aop_decorator_1.CrosscutAdviceFactory();
|
|
115
|
+
eggObjectAopHook = new EggObjectAopHook_1.EggObjectAopHook();
|
|
116
|
+
loadUnitAopHook = new LoadUnitAopHook_1.LoadUnitAopHook(crosscutAdviceFactory);
|
|
117
|
+
eggPrototypeCrossCutHook = new EggPrototypeCrossCutHook_1.EggPrototypeCrossCutHook(crosscutAdviceFactory);
|
|
118
|
+
tegg_metadata_1.EggPrototypeLifecycleUtil.registerLifecycle(eggPrototypeCrossCutHook);
|
|
119
|
+
tegg_metadata_1.LoadUnitLifecycleUtil.registerLifecycle(loadUnitAopHook);
|
|
120
|
+
tegg_runtime_1.EggObjectLifecycleUtil.registerLifecycle(eggObjectAopHook);
|
|
121
|
+
});
|
|
122
|
+
it('should throw', async () => {
|
|
123
|
+
await assert_1.default.rejects(async () => {
|
|
124
|
+
await CoreTestHelper_1.CoreTestHelper.prepareModules([
|
|
125
|
+
path_1.default.join(__dirname, '..'),
|
|
126
|
+
path_1.default.join(__dirname, 'fixtures/modules/should_throw'),
|
|
127
|
+
]);
|
|
128
|
+
}, /Aop Advice\(PointcutAdvice\) not found in loadUnits/);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW9wLXJ1bnRpbWUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvYW9wLXJ1bnRpbWUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGdEQUF3QjtBQUN4Qiw0Q0FBb0I7QUFDcEIsb0RBQTRCO0FBQzVCLHNEQUF3RztBQUN4Ryx3REFBeUc7QUFDekcsd0RBQTZEO0FBQzdELCtDQUFpRDtBQUNqRCxrRUFBMEU7QUFDMUUsbUVBQWdFO0FBQ2hFLDhEQUEyRDtBQUMzRCw0REFBeUQ7QUFDekQsOEVBQTJFO0FBRTNFLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7UUFDNUIsSUFBSSxPQUFnQyxDQUFDO1FBQ3JDLElBQUkscUJBQTRDLENBQUM7UUFDakQsSUFBSSxnQkFBa0MsQ0FBQztRQUN2QyxJQUFJLGVBQWdDLENBQUM7UUFDckMsSUFBSSx3QkFBa0QsQ0FBQztRQUV2RCxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDcEIscUJBQXFCLEdBQUcsSUFBSSxxQ0FBcUIsRUFBRSxDQUFDO1lBQ3BELGdCQUFnQixHQUFHLElBQUksbUNBQWdCLEVBQUUsQ0FBQztZQUMxQyxlQUFlLEdBQUcsSUFBSSxpQ0FBZSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDN0Qsd0JBQXdCLEdBQUcsSUFBSSxtREFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQy9FLHlDQUF5QixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdEUscUNBQXFCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDekQscUNBQXNCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUUzRCxPQUFPLEdBQUcsTUFBTSwrQkFBYyxDQUFDLGNBQWMsQ0FBQztnQkFDNUMsY0FBSSxDQUFDLElBQUksQ0FBQyxTQUFT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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AdviceContext, IAdvice } from '@eggjs/aop-decorator';
|
|
2
|
+
export interface CallTraceMsg {
|
|
3
|
+
className: string;
|
|
4
|
+
methodName: string;
|
|
5
|
+
id: number;
|
|
6
|
+
name: string;
|
|
7
|
+
result?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class CallTrace {
|
|
10
|
+
msgs: Array<CallTraceMsg>;
|
|
11
|
+
addMsg(msg: CallTraceMsg): void;
|
|
12
|
+
}
|
|
13
|
+
export declare class PointcutAdvice implements IAdvice<Hello> {
|
|
14
|
+
callTrace: CallTrace;
|
|
15
|
+
beforeCall(ctx: AdviceContext<Hello>): Promise<void>;
|
|
16
|
+
afterReturn(ctx: AdviceContext<Hello>, result: any): Promise<void>;
|
|
17
|
+
afterFinally(ctx: AdviceContext<Hello>): Promise<void>;
|
|
18
|
+
around(ctx: AdviceContext<Hello>, next: () => Promise<any>): Promise<any>;
|
|
19
|
+
}
|
|
20
|
+
export declare class Hello {
|
|
21
|
+
id: number;
|
|
22
|
+
hello(name: string): Promise<string>;
|
|
23
|
+
}
|
|
24
|
+
export declare class CrosscutAdvice implements IAdvice<Hello> {
|
|
25
|
+
callTrace: CallTrace;
|
|
26
|
+
beforeCall(ctx: AdviceContext<Hello>): Promise<void>;
|
|
27
|
+
afterReturn(ctx: AdviceContext<Hello>, result: any): Promise<void>;
|
|
28
|
+
afterFinally(ctx: AdviceContext<Hello>): Promise<void>;
|
|
29
|
+
around(ctx: AdviceContext<Hello>, next: () => Promise<any>): Promise<any>;
|
|
30
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var PointcutAdvice_1, CrosscutAdvice_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.CrosscutAdvice = exports.Hello = exports.PointcutAdvice = exports.CallTrace = void 0;
|
|
14
|
+
const core_decorator_1 = require("@eggjs/core-decorator");
|
|
15
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
16
|
+
let CallTrace = class CallTrace {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.msgs = [];
|
|
19
|
+
}
|
|
20
|
+
addMsg(msg) {
|
|
21
|
+
this.msgs.push(msg);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
CallTrace = __decorate([
|
|
25
|
+
(0, core_decorator_1.SingletonProto)()
|
|
26
|
+
], CallTrace);
|
|
27
|
+
exports.CallTrace = CallTrace;
|
|
28
|
+
let PointcutAdvice = PointcutAdvice_1 = class PointcutAdvice {
|
|
29
|
+
async beforeCall(ctx) {
|
|
30
|
+
this.callTrace.addMsg({
|
|
31
|
+
className: PointcutAdvice_1.name,
|
|
32
|
+
methodName: 'beforeCall',
|
|
33
|
+
id: ctx.that.id,
|
|
34
|
+
name: ctx.args[0],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async afterReturn(ctx, result) {
|
|
38
|
+
this.callTrace.addMsg({
|
|
39
|
+
className: PointcutAdvice_1.name,
|
|
40
|
+
methodName: 'afterReturn',
|
|
41
|
+
id: ctx.that.id,
|
|
42
|
+
name: ctx.args[0],
|
|
43
|
+
result,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async afterFinally(ctx) {
|
|
47
|
+
this.callTrace.addMsg({
|
|
48
|
+
className: PointcutAdvice_1.name,
|
|
49
|
+
methodName: 'afterFinally',
|
|
50
|
+
id: ctx.that.id,
|
|
51
|
+
name: ctx.args[0],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async around(ctx, next) {
|
|
55
|
+
ctx.args[0] = `withPointAroundParam(${ctx.args[0]})`;
|
|
56
|
+
const result = await next();
|
|
57
|
+
return `withPointAroundResult(${result})`;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
__decorate([
|
|
61
|
+
(0, core_decorator_1.Inject)(),
|
|
62
|
+
__metadata("design:type", CallTrace)
|
|
63
|
+
], PointcutAdvice.prototype, "callTrace", void 0);
|
|
64
|
+
PointcutAdvice = PointcutAdvice_1 = __decorate([
|
|
65
|
+
(0, aop_decorator_1.Advice)()
|
|
66
|
+
], PointcutAdvice);
|
|
67
|
+
exports.PointcutAdvice = PointcutAdvice;
|
|
68
|
+
let Hello = class Hello {
|
|
69
|
+
constructor() {
|
|
70
|
+
this.id = 233;
|
|
71
|
+
}
|
|
72
|
+
async hello(name) {
|
|
73
|
+
return `hello ${name}`;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
__decorate([
|
|
77
|
+
(0, aop_decorator_1.Pointcut)(PointcutAdvice),
|
|
78
|
+
__metadata("design:type", Function),
|
|
79
|
+
__metadata("design:paramtypes", [String]),
|
|
80
|
+
__metadata("design:returntype", Promise)
|
|
81
|
+
], Hello.prototype, "hello", null);
|
|
82
|
+
Hello = __decorate([
|
|
83
|
+
(0, core_decorator_1.ContextProto)()
|
|
84
|
+
], Hello);
|
|
85
|
+
exports.Hello = Hello;
|
|
86
|
+
let CrosscutAdvice = CrosscutAdvice_1 = class CrosscutAdvice {
|
|
87
|
+
async beforeCall(ctx) {
|
|
88
|
+
this.callTrace.addMsg({
|
|
89
|
+
className: CrosscutAdvice_1.name,
|
|
90
|
+
methodName: 'beforeCall',
|
|
91
|
+
id: ctx.that.id,
|
|
92
|
+
name: ctx.args[0],
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
async afterReturn(ctx, result) {
|
|
96
|
+
this.callTrace.addMsg({
|
|
97
|
+
className: CrosscutAdvice_1.name,
|
|
98
|
+
methodName: 'afterReturn',
|
|
99
|
+
id: ctx.that.id,
|
|
100
|
+
name: ctx.args[0],
|
|
101
|
+
result,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async afterFinally(ctx) {
|
|
105
|
+
this.callTrace.addMsg({
|
|
106
|
+
className: CrosscutAdvice_1.name,
|
|
107
|
+
methodName: 'afterFinally',
|
|
108
|
+
id: ctx.that.id,
|
|
109
|
+
name: ctx.args[0],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async around(ctx, next) {
|
|
113
|
+
ctx.args[0] = `withCrosscutAroundParam(${ctx.args[0]})`;
|
|
114
|
+
const result = await next();
|
|
115
|
+
return `withCrossAroundResult(${result})`;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
__decorate([
|
|
119
|
+
(0, core_decorator_1.Inject)(),
|
|
120
|
+
__metadata("design:type", CallTrace)
|
|
121
|
+
], CrosscutAdvice.prototype, "callTrace", void 0);
|
|
122
|
+
CrosscutAdvice = CrosscutAdvice_1 = __decorate([
|
|
123
|
+
(0, aop_decorator_1.Crosscut)({
|
|
124
|
+
type: aop_decorator_1.PointcutType.CLASS,
|
|
125
|
+
clazz: Hello,
|
|
126
|
+
methodName: 'hello',
|
|
127
|
+
}),
|
|
128
|
+
(0, aop_decorator_1.Advice)()
|
|
129
|
+
], CrosscutAdvice);
|
|
130
|
+
exports.CrosscutAdvice = CrosscutAdvice;
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVsbG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L2ZpeHR1cmVzL21vZHVsZXMvaGVsbG9fc3VjY2VlZC9IZWxsby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsMERBQTZFO0FBQzdFLHdEQUF3RztBQVdqRyxJQUFNLFNBQVMsR0FBZixNQUFNLFNBQVM7SUFBZjtRQUNMLFNBQUksR0FBd0IsRUFBRSxDQUFDO0lBS2pDLENBQUM7SUFIQyxNQUFNLENBQUMsR0FBaUI7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGLENBQUE7QUFOWSxTQUFTO0lBRHJCLElBQUEsK0JBQWMsR0FBRTtHQUNKLFNBQVMsQ0FNckI7QUFOWSw4QkFBUztBQVNmLElBQU0sY0FBYyxzQkFBcEIsTUFBTSxjQUFjO0lBSXpCLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBeUI7UUFDeEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFDcEIsU0FBUyxFQUFFLGdCQUFjLENBQUMsSUFBSTtZQUM5QixVQUFVLEVBQUUsWUFBWTtZQUN4QixFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQXlCLEVBQUUsTUFBVztRQUN0RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUNwQixTQUFTLEVBQUUsZ0JBQWMsQ0FBQyxJQUFJO1lBQzlCLFVBQVUsRUFBRSxhQUFhO1lBQ3pCLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDZixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFB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
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Hello = void 0;
|
|
13
|
+
const core_decorator_1 = require("@eggjs/core-decorator");
|
|
14
|
+
const aop_decorator_1 = require("@eggjs/aop-decorator");
|
|
15
|
+
let PointcutAdvice = class PointcutAdvice {
|
|
16
|
+
async beforeCall(ctx) {
|
|
17
|
+
console.info(ctx);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
PointcutAdvice = __decorate([
|
|
21
|
+
(0, aop_decorator_1.Advice)()
|
|
22
|
+
], PointcutAdvice);
|
|
23
|
+
let Hello = class Hello {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.id = 233;
|
|
26
|
+
}
|
|
27
|
+
async hello(name) {
|
|
28
|
+
return `hello ${name}`;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, aop_decorator_1.Pointcut)(PointcutAdvice),
|
|
33
|
+
__metadata("design:type", Function),
|
|
34
|
+
__metadata("design:paramtypes", [String]),
|
|
35
|
+
__metadata("design:returntype", Promise)
|
|
36
|
+
], Hello.prototype, "hello", null);
|
|
37
|
+
Hello = __decorate([
|
|
38
|
+
(0, core_decorator_1.ContextProto)()
|
|
39
|
+
], Hello);
|
|
40
|
+
exports.Hello = Hello;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVsbG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZXN0L2ZpeHR1cmVzL21vZHVsZXMvc2hvdWxkX3Rocm93L0hlbGxvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDBEQUFxRDtBQUNyRCx3REFBZ0Y7QUFHaEYsSUFBTSxjQUFjLEdBQXBCLE1BQU0sY0FBYztJQUNsQixLQUFLLENBQUMsVUFBVSxDQUFDLEdBQXlCO1FBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztDQUNGLENBQUE7QUFKSyxjQUFjO0lBRG5CLElBQUEsc0JBQU0sR0FBRTtHQUNILGNBQWMsQ0FJbkI7QUFHTSxJQUFNLEtBQUssR0FBWCxNQUFNLEtBQUs7SUFBWDtRQUNMLE9BQUUsR0FBRyxHQUFHLENBQUM7SUFNWCxDQUFDO0lBSE8sQUFBTixLQUFLLENBQUMsS0FBSyxDQUFDLElBQVk7UUFDdEIsT0FBTyxTQUFTLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7Q0FDRixDQUFBO0FBSE87SUFETCxJQUFBLHdCQUFRLEVBQUMsY0FBYyxDQUFDOzs7O2tDQUd4QjtBQU5VLEtBQUs7SUFEakIsSUFBQSw2QkFBWSxHQUFFO0dBQ0YsS0FBSyxDQU9qQjtBQVBZLHNCQUFLIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { EggContext, LoadUnitInstance } from '@eggjs/tegg-runtime';
|
|
3
|
+
import { EggProtoImplClass } from '@eggjs/core-decorator';
|
|
4
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
5
|
+
export declare class EggContextStorage {
|
|
6
|
+
static storage: AsyncLocalStorage<EggContext>;
|
|
7
|
+
static register(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare class CoreTestHelper {
|
|
10
|
+
static contextStorage: AsyncLocalStorage<unknown>;
|
|
11
|
+
static getLoadUnitInstance(moduleDir: string): Promise<LoadUnitInstance>;
|
|
12
|
+
static prepareModules(moduleDirs: string[]): Promise<Array<LoadUnitInstance>>;
|
|
13
|
+
static getObject<T>(clazz: EggProtoImplClass<T>): Promise<T>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CoreTestHelper = exports.EggContextStorage = void 0;
|
|
4
|
+
const tegg_runtime_1 = require("@eggjs/tegg-runtime");
|
|
5
|
+
const tegg_metadata_1 = require("@eggjs/tegg-metadata");
|
|
6
|
+
const tegg_loader_1 = require("@eggjs/tegg-loader");
|
|
7
|
+
const core_decorator_1 = require("@eggjs/core-decorator");
|
|
8
|
+
const async_hooks_1 = require("async_hooks");
|
|
9
|
+
class EggContextStorage {
|
|
10
|
+
static register() {
|
|
11
|
+
tegg_runtime_1.ContextHandler.getContextCallback = () => {
|
|
12
|
+
return EggContextStorage.storage.getStore();
|
|
13
|
+
};
|
|
14
|
+
tegg_runtime_1.ContextHandler.runInContextCallback = (context, fn) => {
|
|
15
|
+
return EggContextStorage.storage.run(context, fn);
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.EggContextStorage = EggContextStorage;
|
|
20
|
+
EggContextStorage.storage = new async_hooks_1.AsyncLocalStorage();
|
|
21
|
+
class CoreTestHelper {
|
|
22
|
+
static async getLoadUnitInstance(moduleDir) {
|
|
23
|
+
const loader = tegg_loader_1.LoaderFactory.createLoader(moduleDir, tegg_metadata_1.EggLoadUnitType.MODULE);
|
|
24
|
+
const loadUnit = await tegg_metadata_1.LoadUnitFactory.createLoadUnit(moduleDir, tegg_metadata_1.EggLoadUnitType.MODULE, loader);
|
|
25
|
+
return await tegg_runtime_1.LoadUnitInstanceFactory.createLoadUnitInstance(loadUnit);
|
|
26
|
+
}
|
|
27
|
+
static async prepareModules(moduleDirs) {
|
|
28
|
+
EggContextStorage.register();
|
|
29
|
+
const instances = [];
|
|
30
|
+
for (const moduleDir of moduleDirs) {
|
|
31
|
+
instances.push(await CoreTestHelper.getLoadUnitInstance(moduleDir));
|
|
32
|
+
}
|
|
33
|
+
return instances;
|
|
34
|
+
}
|
|
35
|
+
static async getObject(clazz) {
|
|
36
|
+
const proto = core_decorator_1.PrototypeUtil.getClazzProto(clazz);
|
|
37
|
+
const eggObj = await tegg_runtime_1.EggContainerFactory.getOrCreateEggObject(proto, proto.name);
|
|
38
|
+
return eggObj.obj;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.CoreTestHelper = CoreTestHelper;
|
|
42
|
+
CoreTestHelper.contextStorage = new async_hooks_1.AsyncLocalStorage();
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29yZVRlc3RIZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0LXV0aWwvQ29yZVRlc3RIZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBTTZCO0FBQzdCLHdEQUFzRjtBQUN0RixvREFBbUQ7QUFDbkQsMERBQXlFO0FBQ3pFLDZDQUFnRDtBQUVoRCxNQUFhLGlCQUFpQjtJQUc1QixNQUFNLENBQUMsUUFBUTtRQUNiLDZCQUFjLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxFQUFFO1lBQ3ZDLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUNGLDZCQUFjLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDcEQsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUM7SUFDSixDQUFDOztBQVZILDhDQVdDO0FBVlEseUJBQU8sR0FBRyxJQUFJLCtCQUFpQixFQUFjLENBQUM7QUFZdkQsTUFBYSxjQUFjO0lBR3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsU0FBaUI7UUFDaEQsTUFBTSxNQUFNLEdBQUcsMkJBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLCtCQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsTUFBTSwrQkFBZSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsK0JBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakcsT0FBTyxNQUFNLHNDQUF1QixDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFvQjtRQUM5QyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBNEIsRUFBRSxDQUFDO1FBQzlDLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ2xDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBSSxLQUEyQjtRQUNuRCxNQUFNLEtBQUssR0FBRyw4QkFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFZLENBQWlCLENBQUM7UUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxrQ0FBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sTUFBTSxDQUFDLEdBQW1CLENBQUM7SUFDcEMsQ0FBQzs7QUFwQkgsd0NBcUJDO0FBcEJRLDZCQUFjLEdBQUcsSUFBSSwrQkFBaUIsRUFBRSxDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eggjs/tegg-aop-runtime",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0-alpha.0",
|
|
4
4
|
"description": "tegg aop",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"eggModule": {
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
"scripts": {
|
|
22
22
|
"clean": "tsc -b --clean",
|
|
23
23
|
"tsc": "npm run clean && tsc -p ./tsconfig.json",
|
|
24
|
-
"tsc
|
|
25
|
-
"prepublishOnly": "npm run tsc
|
|
24
|
+
"tsc:pub": "npm run clean && tsc -p ./tsconfig.pub.json",
|
|
25
|
+
"prepublishOnly": "npm run tsc:pub",
|
|
26
26
|
"autod": "autod"
|
|
27
27
|
},
|
|
28
28
|
"author": "killagu <killa123@126.com>",
|
|
@@ -43,17 +43,17 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@eggjs/aop-decorator": "^
|
|
47
|
-
"@eggjs/core-decorator": "^
|
|
46
|
+
"@eggjs/aop-decorator": "^3.0.0-alpha.0",
|
|
47
|
+
"@eggjs/core-decorator": "^3.0.0-alpha.0",
|
|
48
48
|
"@eggjs/tegg-common-util": "^1.2.3",
|
|
49
49
|
"@eggjs/tegg-lifecycle": "^1.0.0",
|
|
50
|
-
"@eggjs/tegg-metadata": "^
|
|
51
|
-
"@eggjs/tegg-runtime": "^
|
|
50
|
+
"@eggjs/tegg-metadata": "^3.0.0-alpha.0",
|
|
51
|
+
"@eggjs/tegg-runtime": "^3.0.0-alpha.0",
|
|
52
52
|
"koa-compose": "^4.1.0"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@eggjs/module-test-util": "^
|
|
56
|
-
"@eggjs/tegg-loader": "^
|
|
55
|
+
"@eggjs/module-test-util": "^3.0.0-alpha.0",
|
|
56
|
+
"@eggjs/tegg-loader": "^3.0.0-alpha.0"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "acb16c4149047c6f1f102b5c3845979447262833"
|
|
59
59
|
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
# Change Log
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
-
|
|
6
|
-
## [1.4.1](https://github.com/eggjs/tegg/compare/@eggjs/tegg-aop-runtime@1.4.0...@eggjs/tegg-aop-runtime@1.4.1) (2022-09-04)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
### Bug Fixes
|
|
10
|
-
|
|
11
|
-
* fix events type from any to keyof Events ([#54](https://github.com/eggjs/tegg/issues/54)) ([a2551b2](https://github.com/eggjs/tegg/commit/a2551b2d9f9eabf9ed5c87f83489615eefa3e6d1))
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# 1.4.0 (2022-08-24)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# 1.3.0 (2022-07-01)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# 1.2.0 (2022-06-29)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
## 1.1.1 (2022-06-21)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
# 1.1.0 (2022-06-15)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
## 1.0.5 (2022-04-24)
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
### Bug Fixes
|
|
41
|
-
|
|
42
|
-
* should throw with no aop proto ([#34](https://github.com/eggjs/tegg/issues/34)) ([5c0b98a](https://github.com/eggjs/tegg/commit/5c0b98a89924f5bad062018e32fbd7993169126c))
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
## 1.0.3 (2022-02-08)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
### Bug Fixes
|
|
50
|
-
|
|
51
|
-
* rm console ([7455ce6](https://github.com/eggjs/tegg/commit/7455ce6fcc04fe9463a1ecf6e03e049ce2faf6f0))
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
## 1.0.2 (2022-02-08)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
## 1.0.1 (2022-02-08)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
# 1.0.0 (2022-02-08)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
# 0.2.0 (2022-01-20)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
### Features
|
|
71
|
-
|
|
72
|
-
* impl aop ([c53df00](https://github.com/eggjs/tegg/commit/c53df001d1455a0a105689694775d880541d9d2f))
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
# [1.3.0](https://github.com/eggjs/tegg/compare/v1.2.0...v1.3.0) (2022-07-01)
|
|
79
|
-
|
|
80
|
-
**Note:** Version bump only for package @eggjs/tegg-aop-runtime
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
# [0.2.0](https://github.com/eggjs/tegg/compare/v0.1.19...v0.2.0) (2022-01-20)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
### Features
|
|
90
|
-
|
|
91
|
-
* impl aop ([c53df00](https://github.com/eggjs/tegg/commit/c53df001d1455a0a105689694775d880541d9d2f))
|