@e22m4u/ts-rest-router 0.5.0 → 0.5.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/README.md +535 -238
- package/dist/cjs/index.cjs +14 -14
- package/dist/esm/controller-registry.js +8 -8
- package/dist/esm/decorators/after-action/after-action-decorator.d.ts +2 -2
- package/dist/esm/decorators/after-action/after-action-decorator.js +4 -4
- package/dist/esm/decorators/after-action/after-action-decorator.spec.js +22 -25
- package/dist/esm/decorators/after-action/after-action-metadata.d.ts +1 -1
- package/dist/esm/decorators/after-action/after-action-reflector.spec.js +15 -15
- package/dist/esm/decorators/before-action/before-action-decorator.d.ts +2 -2
- package/dist/esm/decorators/before-action/before-action-decorator.js +4 -4
- package/dist/esm/decorators/before-action/before-action-decorator.spec.js +22 -25
- package/dist/esm/decorators/before-action/before-action-metadata.d.ts +1 -1
- package/dist/esm/decorators/before-action/before-action-reflector.spec.js +15 -15
- package/package.json +13 -13
- package/src/controller-registry.spec.ts +21 -21
- package/src/controller-registry.ts +8 -8
- package/src/decorators/after-action/after-action-decorator.spec.ts +22 -25
- package/src/decorators/after-action/after-action-decorator.ts +4 -4
- package/src/decorators/after-action/after-action-metadata.ts +1 -1
- package/src/decorators/after-action/after-action-reflector.spec.ts +15 -15
- package/src/decorators/before-action/before-action-decorator.spec.ts +22 -25
- package/src/decorators/before-action/before-action-decorator.ts +4 -4
- package/src/decorators/before-action/before-action-metadata.ts +1 -1
- package/src/decorators/before-action/before-action-reflector.spec.ts +15 -15
package/dist/cjs/index.cjs
CHANGED
|
@@ -376,13 +376,13 @@ var AfterActionReflector = _AfterActionReflector;
|
|
|
376
376
|
// dist/esm/decorators/after-action/after-action-decorator.js
|
|
377
377
|
var import_ts_reflector11 = require("@e22m4u/ts-reflector");
|
|
378
378
|
var import_ts_reflector12 = require("@e22m4u/ts-reflector");
|
|
379
|
-
function afterAction(
|
|
379
|
+
function afterAction(hook) {
|
|
380
380
|
return function(target, propertyKey, descriptor) {
|
|
381
381
|
const decoratorType = (0, import_ts_reflector12.getDecoratorTargetType)(target, propertyKey, descriptor);
|
|
382
382
|
if (decoratorType === import_ts_reflector11.DecoratorTargetType.CONSTRUCTOR) {
|
|
383
|
-
AfterActionReflector.addMetadata({
|
|
383
|
+
AfterActionReflector.addMetadata({ hook }, target);
|
|
384
384
|
} else if (decoratorType === import_ts_reflector11.DecoratorTargetType.INSTANCE_METHOD) {
|
|
385
|
-
AfterActionReflector.addMetadata({ propertyKey,
|
|
385
|
+
AfterActionReflector.addMetadata({ propertyKey, hook }, target.constructor, propertyKey);
|
|
386
386
|
} else {
|
|
387
387
|
throw new Error("@afterAction decorator is only supported on a class or an instance method.");
|
|
388
388
|
}
|
|
@@ -426,13 +426,13 @@ var BeforeActionReflector = _BeforeActionReflector;
|
|
|
426
426
|
// dist/esm/decorators/before-action/before-action-decorator.js
|
|
427
427
|
var import_ts_reflector15 = require("@e22m4u/ts-reflector");
|
|
428
428
|
var import_ts_reflector16 = require("@e22m4u/ts-reflector");
|
|
429
|
-
function beforeAction(
|
|
429
|
+
function beforeAction(hook) {
|
|
430
430
|
return function(target, propertyKey, descriptor) {
|
|
431
431
|
const decoratorType = (0, import_ts_reflector16.getDecoratorTargetType)(target, propertyKey, descriptor);
|
|
432
432
|
if (decoratorType === import_ts_reflector15.DecoratorTargetType.CONSTRUCTOR) {
|
|
433
|
-
BeforeActionReflector.addMetadata({
|
|
433
|
+
BeforeActionReflector.addMetadata({ hook }, target);
|
|
434
434
|
} else if (decoratorType === import_ts_reflector15.DecoratorTargetType.INSTANCE_METHOD) {
|
|
435
|
-
BeforeActionReflector.addMetadata({ propertyKey,
|
|
435
|
+
BeforeActionReflector.addMetadata({ propertyKey, hook }, target.constructor, propertyKey);
|
|
436
436
|
} else {
|
|
437
437
|
throw new Error("@beforeAction decorator is only supported on a class or an instance method.");
|
|
438
438
|
}
|
|
@@ -624,7 +624,7 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
|
|
|
624
624
|
addController(ctor, options) {
|
|
625
625
|
const debug = this.getDebuggerFor(this.addController);
|
|
626
626
|
if (this.hasController(ctor))
|
|
627
|
-
throw new import_js_format3.Errorf("The controller %v is already registered.");
|
|
627
|
+
throw new import_js_format3.Errorf("The controller %v is already registered.", ctor.name);
|
|
628
628
|
const controllerMd = RestControllerReflector.getMetadata(ctor);
|
|
629
629
|
if (!controllerMd)
|
|
630
630
|
throw new NotAControllerError(ctor);
|
|
@@ -761,10 +761,10 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
|
|
|
761
761
|
let preHandlers = [];
|
|
762
762
|
const mdArray = BeforeActionReflector.getMetadata(ctor, actionName);
|
|
763
763
|
mdArray.forEach((md) => {
|
|
764
|
-
if (Array.isArray(md.
|
|
765
|
-
preHandlers = [...preHandlers, ...md.
|
|
764
|
+
if (Array.isArray(md.hook)) {
|
|
765
|
+
preHandlers = [...preHandlers, ...md.hook];
|
|
766
766
|
} else {
|
|
767
|
-
preHandlers.push(md.
|
|
767
|
+
preHandlers.push(md.hook);
|
|
768
768
|
}
|
|
769
769
|
});
|
|
770
770
|
if (mdArray.length) {
|
|
@@ -791,10 +791,10 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
|
|
|
791
791
|
let res = [];
|
|
792
792
|
const mdArray = AfterActionReflector.getMetadata(ctor, actionName);
|
|
793
793
|
mdArray.forEach((md) => {
|
|
794
|
-
if (Array.isArray(md.
|
|
795
|
-
res = [...res, ...md.
|
|
794
|
+
if (Array.isArray(md.hook)) {
|
|
795
|
+
res = [...res, ...md.hook];
|
|
796
796
|
} else {
|
|
797
|
-
res.push(md.
|
|
797
|
+
res.push(md.hook);
|
|
798
798
|
}
|
|
799
799
|
});
|
|
800
800
|
if (mdArray.length) {
|
|
@@ -874,7 +874,7 @@ var _ControllerRegistry = class _ControllerRegistry extends DebuggableService {
|
|
|
874
874
|
let res = [];
|
|
875
875
|
if (actionMd.after)
|
|
876
876
|
res = Array.isArray(actionMd.after) ? actionMd.after : [actionMd.after];
|
|
877
|
-
debug("%v
|
|
877
|
+
debug("%v post-handlers found.", res.length);
|
|
878
878
|
return res;
|
|
879
879
|
}
|
|
880
880
|
/**
|
|
@@ -32,7 +32,7 @@ export class ControllerRegistry extends DebuggableService {
|
|
|
32
32
|
// заметить ошибку в коде, который использует
|
|
33
33
|
// интерфейс данного сервиса
|
|
34
34
|
if (this.hasController(ctor))
|
|
35
|
-
throw new Errorf('The controller %v is already registered.');
|
|
35
|
+
throw new Errorf('The controller %v is already registered.', ctor.name);
|
|
36
36
|
// так как контроллером может быть любой
|
|
37
37
|
// класс, выполняется проверка на наличие
|
|
38
38
|
// метаданных применяемых декоратором
|
|
@@ -185,11 +185,11 @@ export class ControllerRegistry extends DebuggableService {
|
|
|
185
185
|
let preHandlers = [];
|
|
186
186
|
const mdArray = BeforeActionReflector.getMetadata(ctor, actionName);
|
|
187
187
|
mdArray.forEach(md => {
|
|
188
|
-
if (Array.isArray(md.
|
|
189
|
-
preHandlers = [...preHandlers, ...md.
|
|
188
|
+
if (Array.isArray(md.hook)) {
|
|
189
|
+
preHandlers = [...preHandlers, ...md.hook];
|
|
190
190
|
}
|
|
191
191
|
else {
|
|
192
|
-
preHandlers.push(md.
|
|
192
|
+
preHandlers.push(md.hook);
|
|
193
193
|
}
|
|
194
194
|
});
|
|
195
195
|
if (mdArray.length) {
|
|
@@ -218,11 +218,11 @@ export class ControllerRegistry extends DebuggableService {
|
|
|
218
218
|
let res = [];
|
|
219
219
|
const mdArray = AfterActionReflector.getMetadata(ctor, actionName);
|
|
220
220
|
mdArray.forEach(md => {
|
|
221
|
-
if (Array.isArray(md.
|
|
222
|
-
res = [...res, ...md.
|
|
221
|
+
if (Array.isArray(md.hook)) {
|
|
222
|
+
res = [...res, ...md.hook];
|
|
223
223
|
}
|
|
224
224
|
else {
|
|
225
|
-
res.push(md.
|
|
225
|
+
res.push(md.hook);
|
|
226
226
|
}
|
|
227
227
|
});
|
|
228
228
|
if (mdArray.length) {
|
|
@@ -305,7 +305,7 @@ export class ControllerRegistry extends DebuggableService {
|
|
|
305
305
|
let res = [];
|
|
306
306
|
if (actionMd.after)
|
|
307
307
|
res = Array.isArray(actionMd.after) ? actionMd.after : [actionMd.after];
|
|
308
|
-
debug('%v
|
|
308
|
+
debug('%v post-handlers found.', res.length);
|
|
309
309
|
return res;
|
|
310
310
|
}
|
|
311
311
|
/**
|
|
@@ -4,6 +4,6 @@ import { AfterActionMetadata } from './after-action-metadata.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* After action decorator.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param hook
|
|
8
8
|
*/
|
|
9
|
-
export declare function afterAction<T extends object>(
|
|
9
|
+
export declare function afterAction<T extends object>(hook: AfterActionMetadata['hook']): (target: Constructor<T> | Prototype<T>, propertyKey?: string, descriptor?: PropertyDescriptor) => void;
|
|
@@ -4,16 +4,16 @@ import { AfterActionReflector } from './after-action-reflector.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* After action decorator.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param hook
|
|
8
8
|
*/
|
|
9
|
-
export function afterAction(
|
|
9
|
+
export function afterAction(hook) {
|
|
10
10
|
return function (target, propertyKey, descriptor) {
|
|
11
11
|
const decoratorType = getDecoratorTargetType(target, propertyKey, descriptor);
|
|
12
12
|
if (decoratorType === DecoratorTargetType.CONSTRUCTOR) {
|
|
13
|
-
AfterActionReflector.addMetadata({
|
|
13
|
+
AfterActionReflector.addMetadata({ hook }, target);
|
|
14
14
|
}
|
|
15
15
|
else if (decoratorType === DecoratorTargetType.INSTANCE_METHOD) {
|
|
16
|
-
AfterActionReflector.addMetadata({ propertyKey,
|
|
16
|
+
AfterActionReflector.addMetadata({ propertyKey, hook }, target.constructor, propertyKey);
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
19
|
throw new Error('@afterAction decorator is only supported on a class or an instance method.');
|
|
@@ -11,53 +11,50 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
import { expect } from 'chai';
|
|
12
12
|
import { afterAction } from './after-action-decorator.js';
|
|
13
13
|
import { AfterActionReflector } from './after-action-reflector.js';
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
14
|
+
const HOOK_1 = () => undefined;
|
|
15
|
+
const HOOK_2 = () => undefined;
|
|
16
|
+
const HOOK_3 = () => undefined;
|
|
17
17
|
describe('afterAction', function () {
|
|
18
18
|
describe('class target', function () {
|
|
19
|
-
it('sets given
|
|
19
|
+
it('sets given hook to the target metadata', function () {
|
|
20
20
|
let Target = class Target {
|
|
21
21
|
method() { }
|
|
22
22
|
};
|
|
23
23
|
Target = __decorate([
|
|
24
|
-
afterAction(
|
|
24
|
+
afterAction(HOOK_1)
|
|
25
25
|
], Target);
|
|
26
26
|
const res = AfterActionReflector.getMetadata(Target);
|
|
27
|
-
expect(res).to.be.eql([{
|
|
27
|
+
expect(res).to.be.eql([{ hook: HOOK_1 }]);
|
|
28
28
|
});
|
|
29
|
-
it('sets multiple
|
|
29
|
+
it('sets multiple hooks to the target metadata', function () {
|
|
30
30
|
let Target = class Target {
|
|
31
31
|
method() { }
|
|
32
32
|
};
|
|
33
33
|
Target = __decorate([
|
|
34
|
-
afterAction([
|
|
34
|
+
afterAction([HOOK_1, HOOK_2])
|
|
35
35
|
], Target);
|
|
36
36
|
const res = AfterActionReflector.getMetadata(Target);
|
|
37
|
-
expect(res).to.be.eql([{
|
|
37
|
+
expect(res).to.be.eql([{ hook: [HOOK_1, HOOK_2] }]);
|
|
38
38
|
});
|
|
39
39
|
it('allows to use the decorator multiple times', function () {
|
|
40
40
|
let Target = class Target {
|
|
41
41
|
method() { }
|
|
42
42
|
};
|
|
43
43
|
Target = __decorate([
|
|
44
|
-
afterAction(
|
|
45
|
-
afterAction([
|
|
44
|
+
afterAction(HOOK_1),
|
|
45
|
+
afterAction([HOOK_2, HOOK_3])
|
|
46
46
|
], Target);
|
|
47
47
|
const res = AfterActionReflector.getMetadata(Target);
|
|
48
|
-
expect(res).to.be.eql([
|
|
49
|
-
{ middleware: MIDDLEWARE_1 },
|
|
50
|
-
{ middleware: [MIDDLEWARE_2, MIDDLEWARE_3] },
|
|
51
|
-
]);
|
|
48
|
+
expect(res).to.be.eql([{ hook: HOOK_1 }, { hook: [HOOK_2, HOOK_3] }]);
|
|
52
49
|
});
|
|
53
50
|
});
|
|
54
51
|
describe('method target', function () {
|
|
55
|
-
it('sets given
|
|
52
|
+
it('sets given hook to the target metadata', function () {
|
|
56
53
|
class Target {
|
|
57
54
|
method() { }
|
|
58
55
|
}
|
|
59
56
|
__decorate([
|
|
60
|
-
afterAction(
|
|
57
|
+
afterAction(HOOK_1),
|
|
61
58
|
__metadata("design:type", Function),
|
|
62
59
|
__metadata("design:paramtypes", []),
|
|
63
60
|
__metadata("design:returntype", void 0)
|
|
@@ -66,16 +63,16 @@ describe('afterAction', function () {
|
|
|
66
63
|
expect(res).to.be.eql([
|
|
67
64
|
{
|
|
68
65
|
propertyKey: 'method',
|
|
69
|
-
|
|
66
|
+
hook: HOOK_1,
|
|
70
67
|
},
|
|
71
68
|
]);
|
|
72
69
|
});
|
|
73
|
-
it('sets multiple
|
|
70
|
+
it('sets multiple hooks to the target metadata', function () {
|
|
74
71
|
class Target {
|
|
75
72
|
method() { }
|
|
76
73
|
}
|
|
77
74
|
__decorate([
|
|
78
|
-
afterAction([
|
|
75
|
+
afterAction([HOOK_1, HOOK_2]),
|
|
79
76
|
__metadata("design:type", Function),
|
|
80
77
|
__metadata("design:paramtypes", []),
|
|
81
78
|
__metadata("design:returntype", void 0)
|
|
@@ -84,7 +81,7 @@ describe('afterAction', function () {
|
|
|
84
81
|
expect(res).to.be.eql([
|
|
85
82
|
{
|
|
86
83
|
propertyKey: 'method',
|
|
87
|
-
|
|
84
|
+
hook: [HOOK_1, HOOK_2],
|
|
88
85
|
},
|
|
89
86
|
]);
|
|
90
87
|
});
|
|
@@ -93,8 +90,8 @@ describe('afterAction', function () {
|
|
|
93
90
|
method() { }
|
|
94
91
|
}
|
|
95
92
|
__decorate([
|
|
96
|
-
afterAction(
|
|
97
|
-
afterAction([
|
|
93
|
+
afterAction(HOOK_1),
|
|
94
|
+
afterAction([HOOK_2, HOOK_3]),
|
|
98
95
|
__metadata("design:type", Function),
|
|
99
96
|
__metadata("design:paramtypes", []),
|
|
100
97
|
__metadata("design:returntype", void 0)
|
|
@@ -103,11 +100,11 @@ describe('afterAction', function () {
|
|
|
103
100
|
expect(res).to.be.eql([
|
|
104
101
|
{
|
|
105
102
|
propertyKey: 'method',
|
|
106
|
-
|
|
103
|
+
hook: HOOK_1,
|
|
107
104
|
},
|
|
108
105
|
{
|
|
109
106
|
propertyKey: 'method',
|
|
110
|
-
|
|
107
|
+
hook: [HOOK_2, HOOK_3],
|
|
111
108
|
},
|
|
112
109
|
]);
|
|
113
110
|
});
|
|
@@ -5,7 +5,7 @@ import { RoutePostHandler } from '@e22m4u/js-trie-router';
|
|
|
5
5
|
*/
|
|
6
6
|
export type AfterActionMetadata = {
|
|
7
7
|
propertyKey?: string;
|
|
8
|
-
|
|
8
|
+
hook: RoutePostHandler | RoutePostHandler[];
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
11
|
* After action metadata key.
|
|
@@ -2,17 +2,17 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { Reflector } from '@e22m4u/ts-reflector';
|
|
3
3
|
import { AfterActionReflector } from './after-action-reflector.js';
|
|
4
4
|
import { AFTER_ACTION_METADATA_KEY } from './after-action-metadata.js';
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
5
|
+
const HOOK_1 = () => undefined;
|
|
6
|
+
const HOOK_2 = () => undefined;
|
|
7
|
+
const HOOK_3 = () => undefined;
|
|
8
8
|
describe('AfterActionReflector', function () {
|
|
9
9
|
describe('class target', function () {
|
|
10
10
|
describe('addMetadata', function () {
|
|
11
11
|
it('adds a given value to the target metadata', function () {
|
|
12
12
|
class Target {
|
|
13
13
|
}
|
|
14
|
-
const md1 = {
|
|
15
|
-
const md2 = {
|
|
14
|
+
const md1 = { hook: HOOK_1 };
|
|
15
|
+
const md2 = { hook: [HOOK_2, HOOK_3] };
|
|
16
16
|
AfterActionReflector.addMetadata(md1, Target);
|
|
17
17
|
AfterActionReflector.addMetadata(md2, Target);
|
|
18
18
|
const res = Reflector.getOwnMetadata(AFTER_ACTION_METADATA_KEY, Target);
|
|
@@ -29,8 +29,8 @@ describe('AfterActionReflector', function () {
|
|
|
29
29
|
it('returns existing metadata by the target', function () {
|
|
30
30
|
class Target {
|
|
31
31
|
}
|
|
32
|
-
const md1 = {
|
|
33
|
-
const md2 = {
|
|
32
|
+
const md1 = { hook: HOOK_1 };
|
|
33
|
+
const md2 = { hook: [HOOK_2, HOOK_3] };
|
|
34
34
|
const mdArray = [md1, md2];
|
|
35
35
|
Reflector.defineMetadata(AFTER_ACTION_METADATA_KEY, mdArray, Target);
|
|
36
36
|
const res = AfterActionReflector.getMetadata(Target);
|
|
@@ -43,8 +43,8 @@ describe('AfterActionReflector', function () {
|
|
|
43
43
|
it('adds a given value to the target metadata', function () {
|
|
44
44
|
class Target {
|
|
45
45
|
}
|
|
46
|
-
const md1 = {
|
|
47
|
-
const md2 = {
|
|
46
|
+
const md1 = { hook: HOOK_1 };
|
|
47
|
+
const md2 = { hook: [HOOK_2, HOOK_3] };
|
|
48
48
|
AfterActionReflector.addMetadata(md1, Target, 'prop');
|
|
49
49
|
AfterActionReflector.addMetadata(md2, Target, 'prop');
|
|
50
50
|
const res = Reflector.getOwnMetadata(AFTER_ACTION_METADATA_KEY, Target, 'prop');
|
|
@@ -61,8 +61,8 @@ describe('AfterActionReflector', function () {
|
|
|
61
61
|
it('returns existing metadata by the target', function () {
|
|
62
62
|
class Target {
|
|
63
63
|
}
|
|
64
|
-
const md1 = {
|
|
65
|
-
const md2 = {
|
|
64
|
+
const md1 = { hook: HOOK_1 };
|
|
65
|
+
const md2 = { hook: [HOOK_2, HOOK_3] };
|
|
66
66
|
const mdArray = [md1, md2];
|
|
67
67
|
Reflector.defineMetadata(AFTER_ACTION_METADATA_KEY, mdArray, Target, 'prop');
|
|
68
68
|
const res = AfterActionReflector.getMetadata(Target, 'prop');
|
|
@@ -74,8 +74,8 @@ describe('AfterActionReflector', function () {
|
|
|
74
74
|
it('can distinguish class and method metadata', function () {
|
|
75
75
|
class Target {
|
|
76
76
|
}
|
|
77
|
-
const md1 = {
|
|
78
|
-
const md2 = {
|
|
77
|
+
const md1 = { hook: HOOK_1 };
|
|
78
|
+
const md2 = { hook: HOOK_2 };
|
|
79
79
|
AfterActionReflector.addMetadata(md1, Target);
|
|
80
80
|
AfterActionReflector.addMetadata(md2, Target, 'prop');
|
|
81
81
|
const res1 = Reflector.getOwnMetadata(AFTER_ACTION_METADATA_KEY, Target);
|
|
@@ -88,8 +88,8 @@ describe('AfterActionReflector', function () {
|
|
|
88
88
|
it('can distinguish class and method metadata', function () {
|
|
89
89
|
class Target {
|
|
90
90
|
}
|
|
91
|
-
const md1 = {
|
|
92
|
-
const md2 = {
|
|
91
|
+
const md1 = { hook: HOOK_1 };
|
|
92
|
+
const md2 = { hook: HOOK_2 };
|
|
93
93
|
Reflector.defineMetadata(AFTER_ACTION_METADATA_KEY, [md1], Target);
|
|
94
94
|
Reflector.defineMetadata(AFTER_ACTION_METADATA_KEY, [md2], Target, 'prop');
|
|
95
95
|
const res1 = AfterActionReflector.getMetadata(Target);
|
|
@@ -4,6 +4,6 @@ import { BeforeActionMetadata } from './before-action-metadata.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Before action decorator.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param hook
|
|
8
8
|
*/
|
|
9
|
-
export declare function beforeAction<T extends object>(
|
|
9
|
+
export declare function beforeAction<T extends object>(hook: BeforeActionMetadata['hook']): (target: Constructor<T> | Prototype<T>, propertyKey?: string, descriptor?: PropertyDescriptor) => void;
|
|
@@ -4,16 +4,16 @@ import { BeforeActionReflector } from './before-action-reflector.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Before action decorator.
|
|
6
6
|
*
|
|
7
|
-
* @param
|
|
7
|
+
* @param hook
|
|
8
8
|
*/
|
|
9
|
-
export function beforeAction(
|
|
9
|
+
export function beforeAction(hook) {
|
|
10
10
|
return function (target, propertyKey, descriptor) {
|
|
11
11
|
const decoratorType = getDecoratorTargetType(target, propertyKey, descriptor);
|
|
12
12
|
if (decoratorType === DecoratorTargetType.CONSTRUCTOR) {
|
|
13
|
-
BeforeActionReflector.addMetadata({
|
|
13
|
+
BeforeActionReflector.addMetadata({ hook }, target);
|
|
14
14
|
}
|
|
15
15
|
else if (decoratorType === DecoratorTargetType.INSTANCE_METHOD) {
|
|
16
|
-
BeforeActionReflector.addMetadata({ propertyKey,
|
|
16
|
+
BeforeActionReflector.addMetadata({ propertyKey, hook }, target.constructor, propertyKey);
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
19
|
throw new Error('@beforeAction decorator is only supported on a class or an instance method.');
|
|
@@ -11,53 +11,50 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
import { expect } from 'chai';
|
|
12
12
|
import { beforeAction } from './before-action-decorator.js';
|
|
13
13
|
import { BeforeActionReflector } from './before-action-reflector.js';
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
const
|
|
14
|
+
const HOOK_1 = () => undefined;
|
|
15
|
+
const HOOK_2 = () => undefined;
|
|
16
|
+
const HOOK_3 = () => undefined;
|
|
17
17
|
describe('beforeAction', function () {
|
|
18
18
|
describe('class target', function () {
|
|
19
|
-
it('sets given
|
|
19
|
+
it('sets given hook to the target metadata', function () {
|
|
20
20
|
let Target = class Target {
|
|
21
21
|
method() { }
|
|
22
22
|
};
|
|
23
23
|
Target = __decorate([
|
|
24
|
-
beforeAction(
|
|
24
|
+
beforeAction(HOOK_1)
|
|
25
25
|
], Target);
|
|
26
26
|
const res = BeforeActionReflector.getMetadata(Target);
|
|
27
|
-
expect(res).to.be.eql([{
|
|
27
|
+
expect(res).to.be.eql([{ hook: HOOK_1 }]);
|
|
28
28
|
});
|
|
29
|
-
it('sets multiple
|
|
29
|
+
it('sets multiple hooks to the target metadata', function () {
|
|
30
30
|
let Target = class Target {
|
|
31
31
|
method() { }
|
|
32
32
|
};
|
|
33
33
|
Target = __decorate([
|
|
34
|
-
beforeAction([
|
|
34
|
+
beforeAction([HOOK_1, HOOK_2])
|
|
35
35
|
], Target);
|
|
36
36
|
const res = BeforeActionReflector.getMetadata(Target);
|
|
37
|
-
expect(res).to.be.eql([{
|
|
37
|
+
expect(res).to.be.eql([{ hook: [HOOK_1, HOOK_2] }]);
|
|
38
38
|
});
|
|
39
39
|
it('allows to use the decorator multiple times', function () {
|
|
40
40
|
let Target = class Target {
|
|
41
41
|
method() { }
|
|
42
42
|
};
|
|
43
43
|
Target = __decorate([
|
|
44
|
-
beforeAction(
|
|
45
|
-
beforeAction([
|
|
44
|
+
beforeAction(HOOK_1),
|
|
45
|
+
beforeAction([HOOK_2, HOOK_3])
|
|
46
46
|
], Target);
|
|
47
47
|
const res = BeforeActionReflector.getMetadata(Target);
|
|
48
|
-
expect(res).to.be.eql([
|
|
49
|
-
{ middleware: MIDDLEWARE_1 },
|
|
50
|
-
{ middleware: [MIDDLEWARE_2, MIDDLEWARE_3] },
|
|
51
|
-
]);
|
|
48
|
+
expect(res).to.be.eql([{ hook: HOOK_1 }, { hook: [HOOK_2, HOOK_3] }]);
|
|
52
49
|
});
|
|
53
50
|
});
|
|
54
51
|
describe('method target', function () {
|
|
55
|
-
it('sets given
|
|
52
|
+
it('sets given hook to the target metadata', function () {
|
|
56
53
|
class Target {
|
|
57
54
|
method() { }
|
|
58
55
|
}
|
|
59
56
|
__decorate([
|
|
60
|
-
beforeAction(
|
|
57
|
+
beforeAction(HOOK_1),
|
|
61
58
|
__metadata("design:type", Function),
|
|
62
59
|
__metadata("design:paramtypes", []),
|
|
63
60
|
__metadata("design:returntype", void 0)
|
|
@@ -66,16 +63,16 @@ describe('beforeAction', function () {
|
|
|
66
63
|
expect(res).to.be.eql([
|
|
67
64
|
{
|
|
68
65
|
propertyKey: 'method',
|
|
69
|
-
|
|
66
|
+
hook: HOOK_1,
|
|
70
67
|
},
|
|
71
68
|
]);
|
|
72
69
|
});
|
|
73
|
-
it('sets multiple
|
|
70
|
+
it('sets multiple hooks to the target metadata', function () {
|
|
74
71
|
class Target {
|
|
75
72
|
method() { }
|
|
76
73
|
}
|
|
77
74
|
__decorate([
|
|
78
|
-
beforeAction([
|
|
75
|
+
beforeAction([HOOK_1, HOOK_2]),
|
|
79
76
|
__metadata("design:type", Function),
|
|
80
77
|
__metadata("design:paramtypes", []),
|
|
81
78
|
__metadata("design:returntype", void 0)
|
|
@@ -84,7 +81,7 @@ describe('beforeAction', function () {
|
|
|
84
81
|
expect(res).to.be.eql([
|
|
85
82
|
{
|
|
86
83
|
propertyKey: 'method',
|
|
87
|
-
|
|
84
|
+
hook: [HOOK_1, HOOK_2],
|
|
88
85
|
},
|
|
89
86
|
]);
|
|
90
87
|
});
|
|
@@ -93,8 +90,8 @@ describe('beforeAction', function () {
|
|
|
93
90
|
method() { }
|
|
94
91
|
}
|
|
95
92
|
__decorate([
|
|
96
|
-
beforeAction(
|
|
97
|
-
beforeAction([
|
|
93
|
+
beforeAction(HOOK_1),
|
|
94
|
+
beforeAction([HOOK_2, HOOK_3]),
|
|
98
95
|
__metadata("design:type", Function),
|
|
99
96
|
__metadata("design:paramtypes", []),
|
|
100
97
|
__metadata("design:returntype", void 0)
|
|
@@ -103,11 +100,11 @@ describe('beforeAction', function () {
|
|
|
103
100
|
expect(res).to.be.eql([
|
|
104
101
|
{
|
|
105
102
|
propertyKey: 'method',
|
|
106
|
-
|
|
103
|
+
hook: HOOK_1,
|
|
107
104
|
},
|
|
108
105
|
{
|
|
109
106
|
propertyKey: 'method',
|
|
110
|
-
|
|
107
|
+
hook: [HOOK_2, HOOK_3],
|
|
111
108
|
},
|
|
112
109
|
]);
|
|
113
110
|
});
|
|
@@ -5,7 +5,7 @@ import { RoutePreHandler } from '@e22m4u/js-trie-router';
|
|
|
5
5
|
*/
|
|
6
6
|
export type BeforeActionMetadata = {
|
|
7
7
|
propertyKey?: string;
|
|
8
|
-
|
|
8
|
+
hook: RoutePreHandler | RoutePreHandler[];
|
|
9
9
|
};
|
|
10
10
|
/**
|
|
11
11
|
* Before action metadata key.
|
|
@@ -2,17 +2,17 @@ import { expect } from 'chai';
|
|
|
2
2
|
import { Reflector } from '@e22m4u/ts-reflector';
|
|
3
3
|
import { BeforeActionReflector } from './before-action-reflector.js';
|
|
4
4
|
import { BEFORE_ACTION_METADATA_KEY } from './before-action-metadata.js';
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
5
|
+
const hook_1 = () => undefined;
|
|
6
|
+
const hook_2 = () => undefined;
|
|
7
|
+
const hook_3 = () => undefined;
|
|
8
8
|
describe('BeforeActionReflector', function () {
|
|
9
9
|
describe('class target', function () {
|
|
10
10
|
describe('addMetadata', function () {
|
|
11
11
|
it('adds a given value to the target metadata', function () {
|
|
12
12
|
class Target {
|
|
13
13
|
}
|
|
14
|
-
const md1 = {
|
|
15
|
-
const md2 = {
|
|
14
|
+
const md1 = { hook: hook_1 };
|
|
15
|
+
const md2 = { hook: [hook_2, hook_3] };
|
|
16
16
|
BeforeActionReflector.addMetadata(md1, Target);
|
|
17
17
|
BeforeActionReflector.addMetadata(md2, Target);
|
|
18
18
|
const res = Reflector.getOwnMetadata(BEFORE_ACTION_METADATA_KEY, Target);
|
|
@@ -29,8 +29,8 @@ describe('BeforeActionReflector', function () {
|
|
|
29
29
|
it('returns existing metadata by the target', function () {
|
|
30
30
|
class Target {
|
|
31
31
|
}
|
|
32
|
-
const md1 = {
|
|
33
|
-
const md2 = {
|
|
32
|
+
const md1 = { hook: hook_1 };
|
|
33
|
+
const md2 = { hook: [hook_2, hook_3] };
|
|
34
34
|
const mdArray = [md1, md2];
|
|
35
35
|
Reflector.defineMetadata(BEFORE_ACTION_METADATA_KEY, mdArray, Target);
|
|
36
36
|
const res = BeforeActionReflector.getMetadata(Target);
|
|
@@ -43,8 +43,8 @@ describe('BeforeActionReflector', function () {
|
|
|
43
43
|
it('adds a given value to the target metadata', function () {
|
|
44
44
|
class Target {
|
|
45
45
|
}
|
|
46
|
-
const md1 = {
|
|
47
|
-
const md2 = {
|
|
46
|
+
const md1 = { hook: hook_1 };
|
|
47
|
+
const md2 = { hook: [hook_2, hook_3] };
|
|
48
48
|
BeforeActionReflector.addMetadata(md1, Target, 'prop');
|
|
49
49
|
BeforeActionReflector.addMetadata(md2, Target, 'prop');
|
|
50
50
|
const res = Reflector.getOwnMetadata(BEFORE_ACTION_METADATA_KEY, Target, 'prop');
|
|
@@ -61,8 +61,8 @@ describe('BeforeActionReflector', function () {
|
|
|
61
61
|
it('returns existing metadata by the target', function () {
|
|
62
62
|
class Target {
|
|
63
63
|
}
|
|
64
|
-
const md1 = {
|
|
65
|
-
const md2 = {
|
|
64
|
+
const md1 = { hook: hook_1 };
|
|
65
|
+
const md2 = { hook: [hook_2, hook_3] };
|
|
66
66
|
const mdArray = [md1, md2];
|
|
67
67
|
Reflector.defineMetadata(BEFORE_ACTION_METADATA_KEY, mdArray, Target, 'prop');
|
|
68
68
|
const res = BeforeActionReflector.getMetadata(Target, 'prop');
|
|
@@ -74,8 +74,8 @@ describe('BeforeActionReflector', function () {
|
|
|
74
74
|
it('can distinguish class and method metadata', function () {
|
|
75
75
|
class Target {
|
|
76
76
|
}
|
|
77
|
-
const md1 = {
|
|
78
|
-
const md2 = {
|
|
77
|
+
const md1 = { hook: hook_1 };
|
|
78
|
+
const md2 = { hook: hook_2 };
|
|
79
79
|
BeforeActionReflector.addMetadata(md1, Target);
|
|
80
80
|
BeforeActionReflector.addMetadata(md2, Target, 'prop');
|
|
81
81
|
const res1 = Reflector.getOwnMetadata(BEFORE_ACTION_METADATA_KEY, Target);
|
|
@@ -88,8 +88,8 @@ describe('BeforeActionReflector', function () {
|
|
|
88
88
|
it('can distinguish class and method metadata', function () {
|
|
89
89
|
class Target {
|
|
90
90
|
}
|
|
91
|
-
const md1 = {
|
|
92
|
-
const md2 = {
|
|
91
|
+
const md1 = { hook: hook_1 };
|
|
92
|
+
const md2 = { hook: hook_2 };
|
|
93
93
|
Reflector.defineMetadata(BEFORE_ACTION_METADATA_KEY, [md1], Target);
|
|
94
94
|
Reflector.defineMetadata(BEFORE_ACTION_METADATA_KEY, [md2], Target, 'prop');
|
|
95
95
|
const res1 = BeforeActionReflector.getMetadata(Target);
|