@e22m4u/ts-rest-router 0.2.0 → 0.2.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 +129 -34
- package/dist/cjs/index.cjs +87 -23
- package/dist/esm/controller-registry.js +9 -4
- package/dist/esm/decorators/after-action/after-action-reflector.spec.js +0 -1
- package/dist/esm/decorators/before-action/before-action-reflector.spec.js +0 -1
- package/dist/esm/decorators/index.d.ts +1 -0
- package/dist/esm/decorators/index.js +1 -0
- package/dist/esm/decorators/request-context/request-context-reflector.spec.js +0 -1
- package/dist/esm/decorators/request-data/request-data-decorator.d.ts +11 -11
- package/dist/esm/decorators/request-data/request-data-decorator.js +3 -3
- package/dist/esm/decorators/request-data/request-data-reflector.spec.js +0 -1
- package/dist/esm/decorators/response-body/index.d.ts +3 -0
- package/dist/esm/decorators/response-body/index.js +3 -0
- package/dist/esm/decorators/response-body/response-body-decorator.d.ts +9 -0
- package/dist/esm/decorators/response-body/response-body-decorator.js +23 -0
- package/dist/esm/decorators/response-body/response-body-decorator.spec.d.ts +1 -0
- package/dist/esm/decorators/response-body/response-body-decorator.spec.js +61 -0
- package/dist/esm/decorators/response-body/response-body-metadata.d.ts +16 -0
- package/dist/esm/decorators/response-body/response-body-metadata.js +5 -0
- package/dist/esm/decorators/response-body/response-body-reflector.d.ts +22 -0
- package/dist/esm/decorators/response-body/response-body-reflector.js +29 -0
- package/dist/esm/decorators/response-body/response-body-reflector.spec.d.ts +1 -0
- package/dist/esm/decorators/response-body/response-body-reflector.spec.js +58 -0
- package/dist/esm/decorators/rest-action/rest-action-reflector.spec.js +0 -1
- package/dist/esm/decorators/rest-controller/rest-controller-reflector.spec.js +0 -1
- package/eslint.config.js +1 -1
- package/package.json +15 -15
- package/src/controller-registry.spec.ts +85 -27
- package/src/controller-registry.ts +13 -4
- package/src/debuggable-service.spec.ts +0 -1
- package/src/decorators/after-action/after-action-reflector.spec.ts +0 -1
- package/src/decorators/before-action/before-action-reflector.spec.ts +0 -1
- package/src/decorators/index.ts +1 -0
- package/src/decorators/request-context/request-context-reflector.spec.ts +0 -1
- package/src/decorators/request-data/request-data-decorator.ts +3 -11
- package/src/decorators/request-data/request-data-reflector.spec.ts +0 -1
- package/src/decorators/response-body/index.ts +3 -0
- package/src/decorators/response-body/response-body-decorator.spec.ts +40 -0
- package/src/decorators/response-body/response-body-decorator.ts +43 -0
- package/src/decorators/response-body/response-body-metadata.ts +20 -0
- package/src/decorators/response-body/response-body-reflector.spec.ts +59 -0
- package/src/decorators/response-body/response-body-reflector.ts +41 -0
- package/src/decorators/rest-action/rest-action-reflector.spec.ts +0 -1
- package/src/decorators/rest-controller/rest-controller-reflector.spec.ts +0 -1
@@ -0,0 +1,20 @@
|
|
1
|
+
import {MetadataKey} from '@e22m4u/ts-reflector';
|
2
|
+
import {DataSchema} from '@e22m4u/ts-data-schema';
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Response body metadata.
|
6
|
+
*/
|
7
|
+
export type ResponseBodyMetadata = {
|
8
|
+
schema?: DataSchema;
|
9
|
+
};
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Response body metadata map.
|
13
|
+
*/
|
14
|
+
export type ResponseBodyMetadataMap = Map<string, ResponseBodyMetadata>;
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Response body metadata key.
|
18
|
+
*/
|
19
|
+
export const RESPONSE_BODY_METADATA_KEY =
|
20
|
+
new MetadataKey<ResponseBodyMetadataMap>('responseBodyMetadataKey');
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import {expect} from 'chai';
|
2
|
+
import {Reflector} from '@e22m4u/ts-reflector';
|
3
|
+
import {ResponseBodyMetadata} from './response-body-metadata.js';
|
4
|
+
import {ResponseBodyReflector} from './response-body-reflector.js';
|
5
|
+
import {RESPONSE_BODY_METADATA_KEY} from './response-body-metadata.js';
|
6
|
+
|
7
|
+
describe('ResponseBodyReflector', function () {
|
8
|
+
describe('setMetadata', function () {
|
9
|
+
it('sets a given value as target metadata', function () {
|
10
|
+
class Target {}
|
11
|
+
const md1 = {};
|
12
|
+
const md2 = {};
|
13
|
+
ResponseBodyReflector.setMetadata(md1, Target, 'propertyKey1');
|
14
|
+
ResponseBodyReflector.setMetadata(md2, Target, 'propertyKey2');
|
15
|
+
const res = Reflector.getOwnMetadata(RESPONSE_BODY_METADATA_KEY, Target);
|
16
|
+
expect(res).to.be.instanceof(Map);
|
17
|
+
expect(res!.get('propertyKey1')).to.be.eq(md1);
|
18
|
+
expect(res!.get('propertyKey2')).to.be.eq(md2);
|
19
|
+
});
|
20
|
+
|
21
|
+
it('overrides existing metadata', function () {
|
22
|
+
class Target {}
|
23
|
+
const md1 = {};
|
24
|
+
const md2 = {};
|
25
|
+
ResponseBodyReflector.setMetadata(md1, Target, 'propertyKey');
|
26
|
+
const res1 = Reflector.getOwnMetadata(RESPONSE_BODY_METADATA_KEY, Target);
|
27
|
+
expect(res1).to.be.instanceof(Map);
|
28
|
+
expect(res1!.get('propertyKey')).to.be.eq(md1);
|
29
|
+
ResponseBodyReflector.setMetadata(md2, Target, 'propertyKey');
|
30
|
+
const res2 = Reflector.getOwnMetadata(RESPONSE_BODY_METADATA_KEY, Target);
|
31
|
+
expect(res2).to.be.instanceof(Map);
|
32
|
+
expect(res2!.get('propertyKey')).to.be.eq(md2);
|
33
|
+
});
|
34
|
+
});
|
35
|
+
|
36
|
+
describe('getMetadata', function () {
|
37
|
+
it('returns an existing metadata of the target', function () {
|
38
|
+
class Target {}
|
39
|
+
const md1 = {};
|
40
|
+
const md2 = {};
|
41
|
+
const mdMap = new Map<string, ResponseBodyMetadata>([
|
42
|
+
['propertyKey1', md1],
|
43
|
+
['propertyKey2', md2],
|
44
|
+
]);
|
45
|
+
Reflector.defineMetadata(RESPONSE_BODY_METADATA_KEY, mdMap, Target);
|
46
|
+
const res = ResponseBodyReflector.getMetadata(Target);
|
47
|
+
expect(res).to.be.instanceof(Map);
|
48
|
+
expect(res!.get('propertyKey1')).to.be.eq(md1);
|
49
|
+
expect(res!.get('propertyKey2')).to.be.eq(md2);
|
50
|
+
});
|
51
|
+
|
52
|
+
it('returns an empty map if no metadata', function () {
|
53
|
+
class Target {}
|
54
|
+
const res = ResponseBodyReflector.getMetadata(Target);
|
55
|
+
expect(res).to.be.instanceof(Map);
|
56
|
+
expect(res).to.be.empty;
|
57
|
+
});
|
58
|
+
});
|
59
|
+
});
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import {Constructor} from '../../types.js';
|
2
|
+
import {Reflector} from '@e22m4u/ts-reflector';
|
3
|
+
import {ResponseBodyMetadata} from './response-body-metadata.js';
|
4
|
+
import {ResponseBodyMetadataMap} from './response-body-metadata.js';
|
5
|
+
import {RESPONSE_BODY_METADATA_KEY} from './response-body-metadata.js';
|
6
|
+
|
7
|
+
/**
|
8
|
+
* Response body reflector.
|
9
|
+
*/
|
10
|
+
export class ResponseBodyReflector {
|
11
|
+
/**
|
12
|
+
* Set metadata.
|
13
|
+
*
|
14
|
+
* @param metadata
|
15
|
+
* @param target
|
16
|
+
* @param propertyKey
|
17
|
+
*/
|
18
|
+
static setMetadata(
|
19
|
+
metadata: ResponseBodyMetadata,
|
20
|
+
target: Constructor,
|
21
|
+
propertyKey: string,
|
22
|
+
) {
|
23
|
+
const oldMap = Reflector.getOwnMetadata(RESPONSE_BODY_METADATA_KEY, target);
|
24
|
+
const newMap = new Map(oldMap);
|
25
|
+
newMap.set(propertyKey, metadata);
|
26
|
+
Reflector.defineMetadata(RESPONSE_BODY_METADATA_KEY, newMap, target);
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Get metadata.
|
31
|
+
*
|
32
|
+
* @param target
|
33
|
+
*/
|
34
|
+
static getMetadata(target: Constructor): ResponseBodyMetadataMap {
|
35
|
+
const metadata = Reflector.getOwnMetadata(
|
36
|
+
RESPONSE_BODY_METADATA_KEY,
|
37
|
+
target,
|
38
|
+
);
|
39
|
+
return metadata ?? new Map();
|
40
|
+
}
|
41
|
+
}
|