@hodfords/nestjs-response 8.0.0 → 9.0.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.
Files changed (31) hide show
  1. package/README.md +132 -42
  2. package/constants/metadata.constant.d.ts +1 -0
  3. package/constants/metadata.constant.js +2 -1
  4. package/constants/metadata.constant.js.map +1 -1
  5. package/constants/native-class-response-names.constant.d.ts +1 -0
  6. package/constants/native-class-response-names.constant.js +5 -0
  7. package/constants/native-class-response-names.constant.js.map +1 -0
  8. package/decorators/response-model.decorator.d.ts +2 -1
  9. package/decorators/response-model.decorator.js +4 -3
  10. package/decorators/response-model.decorator.js.map +1 -1
  11. package/decorators/response-models.decorator.d.ts +2 -0
  12. package/decorators/response-models.decorator.js +20 -0
  13. package/decorators/response-models.decorator.js.map +1 -0
  14. package/decorators/use-response-interceptor.decorator.js.map +1 -1
  15. package/exceptions/response-validate.exception.js.map +1 -1
  16. package/index.d.ts +3 -0
  17. package/index.js +3 -0
  18. package/index.js.map +1 -1
  19. package/interceptors/response.interceptor.d.ts +17 -1
  20. package/interceptors/response.interceptor.js +164 -24
  21. package/interceptors/response.interceptor.js.map +1 -1
  22. package/package.json +38 -35
  23. package/responses/native-value.response.d.ts +5 -0
  24. package/responses/native-value.response.js +32 -0
  25. package/responses/native-value.response.js.map +1 -0
  26. package/types/handle-result.type.d.ts +5 -0
  27. package/types/handle-result.type.js +3 -0
  28. package/types/handle-result.type.js.map +1 -0
  29. package/types/response-metadata.type.d.ts +7 -0
  30. package/types/response-metadata.type.js +3 -0
  31. package/types/response-metadata.type.js.map +1 -0
package/README.md CHANGED
@@ -1,71 +1,161 @@
1
1
  <p align="center">
2
- <a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo_text.svg" width="320" alt="Nest Logo" /></a>
2
+ <a href="http://opensource.hodfords.uk" target="blank"><img src="https://opensource.hodfords.uk/img/logo.svg" width="320" alt="Nest Logo" /></a>
3
3
  </p>
4
4
 
5
- [circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
6
- [circleci-url]: https://circleci.com/gh/nestjs/nest
7
-
8
- <p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
9
- <p align="center">
10
- <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
11
- <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
12
- <a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
13
- <a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
14
- <a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
15
- <a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
16
- <a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
17
- <a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
18
- <a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
19
- <a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
20
- <a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
5
+ <p align="center">
6
+ Nestjs-Response is a simple yet powerful library for managing API responses in a NestJS application. It provides decorators to handle response models, allowing easy integration with Swagger for API documentation and validation.
21
7
  </p>
22
- <!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
23
- [![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->
24
-
25
- # nestjs-response
26
8
 
27
9
  ## Installation 🤖
28
10
 
11
+ To begin using it, we first install the required dependencies.
12
+
13
+ ```
14
+ npm install @hodfords/nestjs-response
29
15
  ```
30
- npm install @hodfords/nestjs-response --save
31
16
 
17
+ ## Interceptor Setup 🚀
18
+
19
+ - `Global Interceptor (Recommended):`
20
+
21
+ Global interceptors are applied across the entire application. To set up a global interceptor, you can register it in the providers array in your module.
22
+
23
+ ```typescript
24
+ import { APP_INTERCEPTOR } from '@nestjs/core';
25
+ import { ResponseInterceptor } from '@hodfords/nestjs-response';
26
+
27
+ @Module({
28
+ providers: [
29
+ {
30
+ provide: APP_INTERCEPTOR,
31
+ useClass: ResponseInterceptor
32
+ }
33
+ ]
34
+ })
35
+ export class AppModule {}
32
36
  ```
33
37
 
38
+ - `Interceptor with Decorator:`
39
+
40
+ For microservices or specific scenarios, use the @UseInterceptors decorator to apply interceptors at the controller or method level. However, it's generally recommended to use global interceptors.
41
+
34
42
  ```typescript
43
+ import { Controller } from '@nestjs/common';
44
+ import { UseResponseInterceptor } from '@hodfords/nestjs-response';
45
+
46
+ @Controller()
47
+ @UseResponseInterceptor()
48
+ export class AppController {}
49
+ ```
50
+
51
+ ## Usage 🚀
52
+
53
+ `@ResponseModel()`
54
+
55
+ Use the @ResponseModel decorator when an API return single response type.
56
+
57
+ Parameter:
58
+
59
+ - `responseClass`: The class that defines the response model.
60
+ - `isArray` (optional): Set to `true` if the response is an array of `responseClass`. Defaults to `false`.
61
+ - `isAllowEmpty` (optional): Set to true if the response can be empty. Defaults to `false`.
62
+
63
+ Example of usage:
64
+
65
+ ```typescript
66
+ import { ResponseModel } from '@hodfords/nestjs-response';
67
+ import { Get } from '@nestjs/common';
68
+ import { IsNotEmpty, IsString } from 'class-validator';
69
+
35
70
  class UserResponse {
36
- @ApiProperty()
37
71
  @IsNotEmpty()
38
72
  @IsString()
39
- name: string
73
+ name: string;
40
74
  }
41
75
 
42
- class UserController{
76
+ export class UserController {
43
77
  @Get()
44
78
  @ResponseModel(UserResponse, true)
45
79
  getAllUser() {
46
- return [{name: "hello"}]
80
+ return [{ name: 'John' }];
47
81
  }
48
82
  }
49
-
50
83
  ```
51
84
 
52
- - `Interceptor global`
53
- ```javascript
54
- {
55
- providers: [
56
- {
57
- provide: APP_INTERCEPTOR,
58
- useClass: LoggingInterceptor
85
+ `@ResponseModels()`
86
+
87
+ Use the @ResponseModels decorator when an API might return multiple response types.
88
+
89
+ Parameter:
90
+
91
+ - `...responseClasses`: A list of response classes or arrays of response classes.
92
+
93
+ Example of usage:
94
+
95
+ ```typescript
96
+ import { ResponseModels } from '@hodfords/nestjs-response';
97
+ import { Controller, Get, Param } from '@nestjs/common';
98
+ import { UserResponse } from './responses/user.response';
99
+ import { UserPaginationResponse } from './responses/user-pagination.response';
100
+
101
+ @Controller()
102
+ export class AppController {
103
+ @Get('list-models/:type')
104
+ @ResponseModels(Number, [Number], UserPaginationResponse, [UserResponse], undefined, null)
105
+ getModels(@Param('type') type: string) {
106
+ if (type == 'undefined') {
107
+ return undefined;
59
108
  }
60
- ]
109
+ if (type == 'pagination') {
110
+ return {
111
+ items: [{ name: 'John' }, { name: 'Daniel' }],
112
+ total: 2,
113
+ lastPage: 1,
114
+ perPage: 10,
115
+ currentPage: 1
116
+ };
117
+ }
118
+ if (type == 'multiple') {
119
+ return [{ name: 'John' }, { name: 'Daniel' }];
120
+ }
121
+ if (type == 'list-number') {
122
+ return [123, 456];
123
+ }
124
+ if (type == 'number') {
125
+ return 456;
126
+ }
127
+ return null;
128
+ }
61
129
  }
130
+
62
131
  ```
63
132
 
64
- - `Interceptor decorator`
65
- ```javascript
66
- @Controller('test')
67
- @UseResponseInterceptor()
68
- export class TestController {
69
-
133
+ ### Exception Handling
134
+
135
+ When the response data does not match the expected model, a validation exception will be raised. This ensures that the API returns data conforming to the defined structure.
136
+
137
+ Example Case: If a property is expected to be a string, but a number is returned, a validation error will occur.
138
+
139
+ ```typescript
140
+ import { ResponseModel } from '@hodfords/nestjs-response';
141
+ import { Get } from '@nestjs/common';
142
+ import { IsString } from 'class-validator';
143
+
144
+ class UserResponse {
145
+ @IsString()
146
+ name: string;
70
147
  }
71
- ```
148
+
149
+ export class UserController {
150
+ @Get()
151
+ @ResponseModel(UserResponse)
152
+ getUser() {
153
+ return { name: 123 }; // Error: name must be a number ...
154
+ }
155
+ }
156
+
157
+ ```
158
+
159
+ ## License
160
+
161
+ This project is licensed under the MIT License
@@ -1 +1,2 @@
1
1
  export declare const RESPONSE_METADATA_KEY = "response:class";
2
+ export declare const RESPONSE_METADATA_KEYS = "response:classes";
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RESPONSE_METADATA_KEY = void 0;
3
+ exports.RESPONSE_METADATA_KEYS = exports.RESPONSE_METADATA_KEY = void 0;
4
4
  exports.RESPONSE_METADATA_KEY = 'response:class';
5
+ exports.RESPONSE_METADATA_KEYS = 'response:classes';
5
6
  //# sourceMappingURL=metadata.constant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.constant.js","sourceRoot":"","sources":["../../../libs/constants/metadata.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,gBAAgB,CAAA"}
1
+ {"version":3,"file":"metadata.constant.js","sourceRoot":"","sources":["../../../lib/constants/metadata.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,gBAAgB,CAAC;AACzC,QAAA,sBAAsB,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const NativeClassResponseNamesConstant: string[];
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NativeClassResponseNamesConstant = void 0;
4
+ exports.NativeClassResponseNamesConstant = ['Boolean', 'String', 'Number'];
5
+ //# sourceMappingURL=native-class-response-names.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-class-response-names.constant.js","sourceRoot":"","sources":["../../../lib/constants/native-class-response-names.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,gCAAgC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC"}
@@ -1 +1,2 @@
1
- export declare function ResponseModel(responseClass: any, isArray?: boolean): any;
1
+ import { ClassConstructor } from 'class-transformer';
2
+ export declare function ResponseModel(responseClass: ClassConstructor<object>, isArray?: boolean, isAllowEmpty?: boolean): MethodDecorator;
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ResponseModel = void 0;
4
4
  const common_1 = require("@nestjs/common");
5
- const metadata_constant_1 = require("../constants/metadata.constant");
6
5
  const swagger_1 = require("@nestjs/swagger");
7
- function ResponseModel(responseClass, isArray = false) {
6
+ const metadata_constant_1 = require("../constants/metadata.constant");
7
+ function ResponseModel(responseClass, isArray = false, isAllowEmpty = false) {
8
8
  return (0, common_1.applyDecorators)((0, swagger_1.ApiResponse)({ type: responseClass, isArray }), (0, common_1.SetMetadata)(metadata_constant_1.RESPONSE_METADATA_KEY, {
9
9
  responseClass,
10
- isArray
10
+ isArray,
11
+ isAllowEmpty
11
12
  }));
12
13
  }
13
14
  exports.ResponseModel = ResponseModel;
@@ -1 +1 @@
1
- {"version":3,"file":"response-model.decorator.js","sourceRoot":"","sources":["../../../libs/decorators/response-model.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,sEAAuE;AACvE,6CAA8C;AAE9C,SAAgB,aAAa,CAAC,aAAa,EAAE,OAAO,GAAG,KAAK;IACxD,OAAO,IAAA,wBAAe,EAClB,IAAA,qBAAW,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAC7C,IAAA,oBAAW,EAAC,yCAAqB,EAAE;QAC/B,aAAa;QACb,OAAO;KACV,CAAC,CACL,CAAC;AACN,CAAC;AARD,sCAQC"}
1
+ {"version":3,"file":"response-model.decorator.js","sourceRoot":"","sources":["../../../lib/decorators/response-model.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA8D;AAC9D,6CAA8C;AAE9C,sEAAuE;AAEvE,SAAgB,aAAa,CACzB,aAAuC,EACvC,OAAO,GAAG,KAAK,EACf,YAAY,GAAG,KAAK;IAEpB,OAAO,IAAA,wBAAe,EAClB,IAAA,qBAAW,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,EAC7C,IAAA,oBAAW,EAAC,yCAAqB,EAAE;QAC/B,aAAa;QACb,OAAO;QACP,YAAY;KACf,CAAC,CACL,CAAC;AACN,CAAC;AAbD,sCAaC"}
@@ -0,0 +1,2 @@
1
+ import { ResponseClass } from './../types/response-metadata.type';
2
+ export declare function ResponseModels(...responseClasses: ResponseClass[]): MethodDecorator;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseModels = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const swagger_1 = require("@nestjs/swagger");
6
+ const metadata_constant_1 = require("../constants/metadata.constant");
7
+ function ResponseModels(...responseClasses) {
8
+ const metadatas = responseClasses.map((metadata) => {
9
+ const isArray = Array.isArray(metadata);
10
+ const responseClass = isArray ? metadata[0] : metadata;
11
+ const isAllowEmpty = metadata === undefined || metadata === null;
12
+ return { isArray, responseClass, isAllowEmpty };
13
+ });
14
+ const models = metadatas.filter((metadata) => !metadata.isAllowEmpty).map((metadata) => metadata.responseClass);
15
+ return (0, common_1.applyDecorators)((0, swagger_1.ApiExtraModels)(...models), (0, swagger_1.ApiOkResponse)({
16
+ schema: { anyOf: (0, swagger_1.refs)(...models) }
17
+ }), (0, common_1.SetMetadata)(metadata_constant_1.RESPONSE_METADATA_KEYS, metadatas));
18
+ }
19
+ exports.ResponseModels = ResponseModels;
20
+ //# sourceMappingURL=response-models.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-models.decorator.js","sourceRoot":"","sources":["../../../lib/decorators/response-models.decorator.ts"],"names":[],"mappings":";;;AACA,2CAA8D;AAC9D,6CAAsE;AACtE,sEAAwE;AAExE,SAAgB,cAAc,CAAC,GAAG,eAAgC;IAC9D,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvD,MAAM,YAAY,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAChH,OAAO,IAAA,wBAAe,EAClB,IAAA,wBAAc,EAAC,GAAG,MAAM,CAAC,EACzB,IAAA,uBAAa,EAAC;QACV,MAAM,EAAE,EAAE,KAAK,EAAE,IAAA,cAAI,EAAC,GAAG,MAAM,CAAC,EAAE;KACrC,CAAC,EACF,IAAA,oBAAW,EAAC,0CAAsB,EAAE,SAAS,CAAC,CACjD,CAAC;AACN,CAAC;AAfD,wCAeC"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-response-interceptor.decorator.js","sourceRoot":"","sources":["../../../libs/decorators/use-response-interceptor.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAC/C,+EAAyE;AAEzE,SAAgB,sBAAsB;IAClC,OAAO,IAAA,wBAAe,EAAC,0CAAmB,CAAC,CAAA;AAC/C,CAAC;AAFD,wDAEC"}
1
+ {"version":3,"file":"use-response-interceptor.decorator.js","sourceRoot":"","sources":["../../../lib/decorators/use-response-interceptor.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAiD;AACjD,+EAA2E;AAE3E,SAAgB,sBAAsB;IAClC,OAAO,IAAA,wBAAe,EAAC,0CAAmB,CAAC,CAAC;AAChD,CAAC;AAFD,wDAEC"}
@@ -1 +1 @@
1
- {"version":3,"file":"response-validate.exception.js","sourceRoot":"","sources":["../../../libs/exceptions/response-validate.exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAE3D,MAAa,yBAA0B,SAAQ,sBAAa;IACxD,YAAmB,MAAM;QACrB,KAAK,CAAC,EAAE,EAAE,mBAAU,CAAC,qBAAqB,CAAC,CAAC;QAD7B,WAAM,GAAN,MAAM,CAAA;IAEzB,CAAC;CACJ;AAJD,8DAIC"}
1
+ {"version":3,"file":"response-validate.exception.js","sourceRoot":"","sources":["../../../lib/exceptions/response-validate.exception.ts"],"names":[],"mappings":";;;AAAA,2CAA2D;AAE3D,MAAa,yBAA0B,SAAQ,sBAAa;IACxD,YAAmB,MAAM;QACrB,KAAK,CAAC,EAAE,EAAE,mBAAU,CAAC,qBAAqB,CAAC,CAAC;QAD7B,WAAM,GAAN,MAAM,CAAA;IAEzB,CAAC;CACJ;AAJD,8DAIC"}
package/index.d.ts CHANGED
@@ -3,3 +3,6 @@ export * from './decorators/response-model.decorator';
3
3
  export * from './decorators/use-response-interceptor.decorator';
4
4
  export * from './exceptions/response-validate.exception';
5
5
  export * from './interceptors/response.interceptor';
6
+ export * from './types/response-metadata.type';
7
+ export * from './decorators/response-models.decorator';
8
+ export * from './types/handle-result.type';
package/index.js CHANGED
@@ -19,4 +19,7 @@ __exportStar(require("./decorators/response-model.decorator"), exports);
19
19
  __exportStar(require("./decorators/use-response-interceptor.decorator"), exports);
20
20
  __exportStar(require("./exceptions/response-validate.exception"), exports);
21
21
  __exportStar(require("./interceptors/response.interceptor"), exports);
22
+ __exportStar(require("./types/response-metadata.type"), exports);
23
+ __exportStar(require("./decorators/response-models.decorator"), exports);
24
+ __exportStar(require("./types/handle-result.type"), exports);
22
25
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../libs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA6C;AAC7C,wEAAqD;AACrD,kFAA+D;AAC/D,2EAAwD;AACxD,sEAAmD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAA8C;AAC9C,wEAAsD;AACtD,kFAAgE;AAChE,2EAAyD;AACzD,sEAAoD;AACpD,iEAA+C;AAC/C,yEAAuD;AACvD,6DAA2C"}
@@ -1,6 +1,22 @@
1
1
  import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
2
  import { Observable } from 'rxjs';
3
+ import { ResponseMetadata } from '../types/response-metadata.type';
3
4
  export declare class ResponseInterceptor implements NestInterceptor {
5
+ private readonly logger;
4
6
  intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
5
- handleResponse(context: ExecutionContext, data: any): Promise<any>;
7
+ handleResponse(context: ExecutionContext, data: any): any;
8
+ handleOneTypeResponse(context: ExecutionContext, data: any, responseMetadata: ResponseMetadata): any;
9
+ handleMutilTypeResponse(context: ExecutionContext, data: any, responseMetadatas: ResponseMetadata[]): any;
10
+ handleSingleResponse(responseMetadata: ResponseMetadata, data: any): any;
11
+ handleListResponse(context: ExecutionContext, responseMetadata: ResponseMetadata, data: any): object[] | {
12
+ items: object[];
13
+ grpcArray: boolean;
14
+ };
15
+ handleEmptyResponse(responseMetadata: ResponseMetadata, data: any): any;
16
+ private handleNativeValueResponse;
17
+ private getResponseMap;
18
+ private filterResponseMetadatas;
19
+ private getArrayTypeMetadata;
20
+ private getEmptyTypeMetadata;
21
+ private getObjectTypeMetadata;
6
22
  }
@@ -5,52 +5,192 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
+ var ResponseInterceptor_1;
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
9
10
  exports.ResponseInterceptor = void 0;
11
+ const native_class_response_names_constant_1 = require("./../constants/native-class-response-names.constant");
10
12
  const common_1 = require("@nestjs/common");
11
- const rxjs_1 = require("rxjs");
12
13
  const class_transformer_1 = require("class-transformer");
13
14
  const class_validator_1 = require("class-validator");
14
- const response_validate_exception_1 = require("../exceptions/response-validate.exception");
15
+ const rxjs_1 = require("rxjs");
15
16
  const metadata_constant_1 = require("../constants/metadata.constant");
16
- let ResponseInterceptor = class ResponseInterceptor {
17
+ const response_validate_exception_1 = require("../exceptions/response-validate.exception");
18
+ const native_value_response_1 = require("../responses/native-value.response");
19
+ let Metadata = null;
20
+ try {
21
+ const grpc = require('@grpc/grpc-js');
22
+ Metadata = grpc.Metadata;
23
+ }
24
+ catch (ex) { }
25
+ let ResponseInterceptor = ResponseInterceptor_1 = class ResponseInterceptor {
26
+ constructor() {
27
+ this.logger = new common_1.Logger(ResponseInterceptor_1.name);
28
+ }
17
29
  intercept(context, next) {
18
30
  return next.handle().pipe((0, rxjs_1.map)((data) => this.handleResponse(context, data)));
19
31
  }
20
- async handleResponse(context, data) {
21
- let responseMetadata = Reflect.getMetadata(metadata_constant_1.RESPONSE_METADATA_KEY, context.getHandler());
22
- if (!responseMetadata) {
23
- return data;
32
+ handleResponse(context, data) {
33
+ const responseMetadata = Reflect.getMetadata(metadata_constant_1.RESPONSE_METADATA_KEY, context.getHandler());
34
+ const responseMetadatas = Reflect.getMetadata(metadata_constant_1.RESPONSE_METADATA_KEYS, context.getHandler());
35
+ if (responseMetadata) {
36
+ return this.handleMutilTypeResponse(context, data, [responseMetadata]);
37
+ }
38
+ if (responseMetadatas && responseMetadatas.length > 0) {
39
+ return this.handleMutilTypeResponse(context, data, responseMetadatas);
40
+ }
41
+ return data;
42
+ }
43
+ handleOneTypeResponse(context, data, responseMetadata) {
44
+ if (!(0, class_validator_1.isBoolean)(data) && !data) {
45
+ return this.handleEmptyResponse(responseMetadata, data);
24
46
  }
25
47
  if (responseMetadata.isArray) {
26
- let newData = [];
27
- for (let item of data) {
28
- let newItem = (0, class_transformer_1.plainToInstance)(responseMetadata.responseClass, item);
29
- let errors = await (0, class_validator_1.validate)(newItem, {
30
- whitelist: true,
31
- stopAtFirstError: true
32
- });
33
- if (errors.length) {
34
- console.error(errors);
35
- throw new response_validate_exception_1.ResponseValidateException(errors);
36
- }
37
- newData.push(newItem);
48
+ return this.handleListResponse(context, responseMetadata, data);
49
+ }
50
+ return this.handleSingleResponse(responseMetadata, data);
51
+ }
52
+ handleMutilTypeResponse(context, data, responseMetadatas) {
53
+ const results = [];
54
+ const newMetadatas = this.filterResponseMetadatas(responseMetadatas, data);
55
+ for (const metadata of newMetadatas) {
56
+ try {
57
+ const result = this.handleOneTypeResponse(context, data, metadata);
58
+ results.push({ data: result, error: null });
38
59
  }
39
- return newData;
60
+ catch (error) {
61
+ const newError = error.errors ? error.errors : error;
62
+ results.push({ data: null, error: newError });
63
+ }
64
+ }
65
+ const resultValid = results.find((result) => result.error === null);
66
+ if (resultValid) {
67
+ return resultValid.data;
68
+ }
69
+ const errors = results.map((result) => result.error);
70
+ this.logger.error(errors);
71
+ throw new response_validate_exception_1.ResponseValidateException(errors);
72
+ }
73
+ handleSingleResponse(responseMetadata, data) {
74
+ if (native_class_response_names_constant_1.NativeClassResponseNamesConstant.includes(responseMetadata.responseClass.name)) {
75
+ return this.handleNativeValueResponse(responseMetadata, data);
40
76
  }
41
- let newData = (0, class_transformer_1.plainToInstance)(responseMetadata.responseClass, data);
42
- let errors = await (0, class_validator_1.validate)(newData, {
77
+ const newData = (0, class_transformer_1.plainToInstance)(responseMetadata.responseClass, data);
78
+ const errors = (0, class_validator_1.validateSync)(newData, {
43
79
  whitelist: true,
44
80
  stopAtFirstError: true
45
81
  });
46
82
  if (errors.length) {
47
- console.error(errors);
48
83
  throw new response_validate_exception_1.ResponseValidateException(errors);
49
84
  }
85
+ return (0, class_transformer_1.plainToInstance)(responseMetadata.responseClass, data);
86
+ }
87
+ handleListResponse(context, responseMetadata, data) {
88
+ const newData = [];
89
+ for (const item of data) {
90
+ const newItem = this.handleSingleResponse(responseMetadata, item);
91
+ newData.push(newItem);
92
+ }
93
+ if (Metadata && context.switchToRpc().getContext() instanceof Metadata) {
94
+ return { items: newData, grpcArray: true };
95
+ }
50
96
  return newData;
51
97
  }
98
+ handleEmptyResponse(responseMetadata, data) {
99
+ if (responseMetadata.isAllowEmpty) {
100
+ return data;
101
+ }
102
+ else {
103
+ throw new response_validate_exception_1.ResponseValidateException([
104
+ {
105
+ target: data,
106
+ children: [],
107
+ constraints: {
108
+ nullValue: 'an null value was passed to the validate function'
109
+ }
110
+ }
111
+ ]);
112
+ }
113
+ }
114
+ handleNativeValueResponse(responseMetadata, data) {
115
+ const responseMap = this.getResponseMap(responseMetadata, data);
116
+ const newData = (0, class_transformer_1.plainToInstance)(native_value_response_1.NativeValueResponse, responseMap);
117
+ const errors = (0, class_validator_1.validateSync)(newData, {
118
+ whitelist: true,
119
+ stopAtFirstError: true
120
+ });
121
+ if (errors.length) {
122
+ throw new response_validate_exception_1.ResponseValidateException(errors);
123
+ }
124
+ return data;
125
+ }
126
+ getResponseMap(responseMetadata, data) {
127
+ switch (responseMetadata.responseClass.name) {
128
+ case 'Boolean':
129
+ return { ['boolean']: data };
130
+ case 'String':
131
+ return { ['string']: data };
132
+ case 'Number':
133
+ return { ['number']: data };
134
+ default:
135
+ return {};
136
+ }
137
+ }
138
+ filterResponseMetadatas(responseMetadatas, data) {
139
+ if (Array.isArray(data)) {
140
+ return this.getArrayTypeMetadata(responseMetadatas, data);
141
+ }
142
+ if (!(0, class_validator_1.isBoolean)(data) && !data) {
143
+ return this.getEmptyTypeMetadata(responseMetadatas, data);
144
+ }
145
+ return this.getObjectTypeMetadata(responseMetadatas, data);
146
+ }
147
+ getArrayTypeMetadata(responseMetadatas, data) {
148
+ const arrayTypes = responseMetadatas.filter((metadata) => metadata.isArray);
149
+ if (arrayTypes.length == 0) {
150
+ throw new response_validate_exception_1.ResponseValidateException([
151
+ {
152
+ target: data,
153
+ children: [],
154
+ constraints: {
155
+ arrayValue: 'an array value was passed to the validate function'
156
+ }
157
+ }
158
+ ]);
159
+ }
160
+ return arrayTypes;
161
+ }
162
+ getEmptyTypeMetadata(responseMetadatas, data) {
163
+ const emptyType = responseMetadatas.find((metadata) => metadata.isAllowEmpty);
164
+ if (emptyType) {
165
+ return [emptyType];
166
+ }
167
+ throw new response_validate_exception_1.ResponseValidateException([
168
+ {
169
+ target: data,
170
+ children: [],
171
+ constraints: {
172
+ arrayValue: 'an empty value was passed to the validate function'
173
+ }
174
+ }
175
+ ]);
176
+ }
177
+ getObjectTypeMetadata(responseMetadatas, data) {
178
+ const objectTypes = responseMetadatas.filter((metadata) => !metadata.isArray && !metadata.isAllowEmpty);
179
+ if (objectTypes.length == 0) {
180
+ throw new response_validate_exception_1.ResponseValidateException([
181
+ {
182
+ target: data,
183
+ children: [],
184
+ constraints: {
185
+ arrayValue: 'an object value was passed to the validate function'
186
+ }
187
+ }
188
+ ]);
189
+ }
190
+ return objectTypes;
191
+ }
52
192
  };
53
- ResponseInterceptor = __decorate([
193
+ ResponseInterceptor = ResponseInterceptor_1 = __decorate([
54
194
  (0, common_1.Injectable)()
55
195
  ], ResponseInterceptor);
56
196
  exports.ResponseInterceptor = ResponseInterceptor;
@@ -1 +1 @@
1
- {"version":3,"file":"response.interceptor.js","sourceRoot":"","sources":["../../../libs/interceptors/response.interceptor.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4F;AAC5F,+BAAuC;AACvC,yDAAoD;AACpD,qDAA2C;AAC3C,2FAAsF;AACtF,sEAAuE;AAGvE,IAAa,mBAAmB,GAAhC,MAAa,mBAAmB;IAC5B,SAAS,CAAC,OAAyB,EAAE,IAAiB;QAClD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAyB,EAAE,IAAI;QAChD,IAAI,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,yCAAqB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,gBAAgB,EAAE;YACnB,OAAO,IAAI,CAAC;SACf;QACD,IAAI,gBAAgB,CAAC,OAAO,EAAE;YAC1B,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE;gBACnB,IAAI,OAAO,GAAG,IAAA,mCAAe,EAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBACpE,IAAI,MAAM,GAAG,MAAM,IAAA,0BAAQ,EAAC,OAAO,EAAE;oBACjC,SAAS,EAAE,IAAI;oBACf,gBAAgB,EAAE,IAAI;iBACzB,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,EAAE;oBACf,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtB,MAAM,IAAI,uDAAyB,CAAC,MAAM,CAAC,CAAC;iBAC/C;gBACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACzB;YACD,OAAO,OAAO,CAAC;SAClB;QACD,IAAI,OAAO,GAAG,IAAA,mCAAe,EAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,MAAM,GAAG,MAAM,IAAA,0BAAQ,EAAC,OAAO,EAAE;YACjC,SAAS,EAAE,IAAI;YACf,gBAAgB,EAAE,IAAI;SACzB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtB,MAAM,IAAI,uDAAyB,CAAC,MAAM,CAAC,CAAC;SAC/C;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ,CAAA;AArCY,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;GACA,mBAAmB,CAqC/B;AArCY,kDAAmB"}
1
+ {"version":3,"file":"response.interceptor.js","sourceRoot":"","sources":["../../../lib/interceptors/response.interceptor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hodfords/nestjs-response",
3
- "version": "8.0.0",
4
- "description": "",
3
+ "version": "9.0.0",
4
+ "description": "Standardizes and validates API responses in NestJS for consistent and reliable communication",
5
5
  "author": "",
6
6
  "license": "UNLICENSED",
7
7
  "repository": {
@@ -11,58 +11,61 @@
11
11
  "scripts": {
12
12
  "prebuild": "rimraf dist",
13
13
  "build": "nest build",
14
- "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"libs/**/*.ts\"",
14
+ "postbuild": "cp package.json dist/lib && cp README.md dist/lib && cp .npmrc dist/lib",
15
+ "format": "prettier --write \"sample/**/*.ts\" \"test/**/*.ts\" \"lib/**/*.ts\"",
15
16
  "start": "nest start",
16
17
  "start:dev": "npm run prebuild && nest start --watch",
17
18
  "start:debug": "nest start --debug --watch",
18
19
  "start:prod": "node dist/main",
19
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
20
+ "lint": "eslint \"{sample,apps,lib,test}/**/*.ts\" --fix",
20
21
  "test": "jest",
21
22
  "test:watch": "jest --watch",
22
23
  "test:cov": "jest --coverage",
23
24
  "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
24
25
  "test:e2e": "jest --config ./test/jest-e2e.json",
25
26
  "wz-command": "wz-command",
26
- "prepare": "is-ci || husky install",
27
+ "prepare": "is-ci || husky",
27
28
  "version": "auto-changelog && git add CHANGELOG.md",
28
29
  "release:patch": "git add CHANGELOG.md && npm version patch --tag-version-prefix='' -f -m 'chore: release to %s'",
29
- "release:push": "git push --no-verify && git push --tags --no-verify"
30
+ "release:push": "git push --no-verify && git push --tags --no-verify",
31
+ "lint-staged": "lint-staged",
32
+ "cspell": "cspell"
30
33
  },
31
34
  "devDependencies": {
32
- "@nestjs/cli": "8.2.6",
33
- "@nestjs/common": "8.4.5",
34
- "@nestjs/core": "8.4.5",
35
- "@nestjs/platform-express": "8.4.5",
36
- "@nestjs/swagger": "5.2.1",
37
- "@nestjs/schematics": "8.0.11",
38
- "@nestjs/testing": "8.4.5",
39
- "@types/express": "4.17.13",
40
- "@types/jest": "27.4.1",
41
- "@types/node": "16.18.3",
35
+ "@nestjs/cli": "9.3.0",
36
+ "@nestjs/common": "9.3.12",
37
+ "@nestjs/core": "9.3.12",
38
+ "@nestjs/platform-express": "9.3.12",
39
+ "@nestjs/swagger": "6.2.1",
40
+ "@nestjs/schematics": "9.0.4",
41
+ "@nestjs/testing": "9.3.12",
42
+ "@types/express": "4.17.17",
43
+ "@types/jest": "29.5.0",
44
+ "@types/node": "18.15.7",
42
45
  "@types/supertest": "2.0.12",
43
- "@typescript-eslint/eslint-plugin": "5.26.0",
44
- "@typescript-eslint/parser": "5.26.0",
46
+ "@typescript-eslint/eslint-plugin": "5.56.0",
47
+ "@typescript-eslint/parser": "5.56.0",
45
48
  "auto-changelog": "2.4.0",
46
- "class-transformer": "^0.5.1",
49
+ "class-transformer": "0.5.1",
47
50
  "class-validator": "^0.14.0",
48
- "eslint": "8.16.0",
49
- "eslint-config-prettier": "8.5.0",
50
- "eslint-plugin-prettier": "4.0.0",
51
- "husky": "8.0.1",
51
+ "eslint": "8.36.0",
52
+ "eslint-config-prettier": "8.8.0",
53
+ "eslint-plugin-prettier": "4.2.1",
54
+ "husky": "8.0.3",
52
55
  "is-ci": "3.0.1",
53
- "jest": "27.5.1",
54
- "lint-staged": "13.0.3",
55
- "prettier": "2.6.2",
56
+ "jest": "29.5.0",
57
+ "lint-staged": "13.2.0",
58
+ "prettier": "2.8.7",
56
59
  "reflect-metadata": "0.1.13",
57
- "rimraf": "3.0.2",
58
- "rxjs": "7.5.7",
60
+ "rimraf": "4.4.1",
61
+ "rxjs": "7.8.0",
59
62
  "source-map-support": "0.5.21",
60
- "supertest": "6.2.3",
61
- "ts-jest": "27.1.5",
62
- "ts-loader": "9.3.0",
63
- "ts-node": "10.8.0",
64
- "tsconfig-paths": "3.14.1",
65
- "typescript": "4.6.4"
63
+ "supertest": "6.3.3",
64
+ "ts-jest": "29.0.5",
65
+ "ts-loader": "9.4.2",
66
+ "ts-node": "10.9.1",
67
+ "tsconfig-paths": "4.1.2",
68
+ "typescript": "4.9.5"
66
69
  },
67
70
  "jest": {
68
71
  "moduleFileExtensions": [
@@ -85,7 +88,7 @@
85
88
  "<rootDir>/libs/"
86
89
  ],
87
90
  "moduleNameMapper": {
88
- "^@hodfords/nestjs-response(|/.*)$": "<rootDir>/libs/nestjs-response/src/$1"
91
+ "^@hodfords/nestjs-response(|/.*)$": "<rootDir>/lib/nestjs-response/sample/$1"
89
92
  }
90
93
  }
91
94
  }
@@ -0,0 +1,5 @@
1
+ export declare class NativeValueResponse {
2
+ string: string;
3
+ number: number;
4
+ boolean: boolean;
5
+ }
@@ -0,0 +1,32 @@
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.NativeValueResponse = void 0;
13
+ const class_validator_1 = require("class-validator");
14
+ class NativeValueResponse {
15
+ }
16
+ __decorate([
17
+ (0, class_validator_1.IsOptional)(),
18
+ (0, class_validator_1.IsString)(),
19
+ __metadata("design:type", String)
20
+ ], NativeValueResponse.prototype, "string", void 0);
21
+ __decorate([
22
+ (0, class_validator_1.IsOptional)(),
23
+ (0, class_validator_1.IsNumber)(),
24
+ __metadata("design:type", Number)
25
+ ], NativeValueResponse.prototype, "number", void 0);
26
+ __decorate([
27
+ (0, class_validator_1.IsOptional)(),
28
+ (0, class_validator_1.IsBoolean)(),
29
+ __metadata("design:type", Boolean)
30
+ ], NativeValueResponse.prototype, "boolean", void 0);
31
+ exports.NativeValueResponse = NativeValueResponse;
32
+ //# sourceMappingURL=native-value.response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-value.response.js","sourceRoot":"","sources":["../../../lib/responses/native-value.response.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAA4E;AAE5E,MAAa,mBAAmB;CAY/B;AAXG;IAAC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;mDACI;AAEf;IAAC,IAAA,4BAAU,GAAE;IACZ,IAAA,0BAAQ,GAAE;;mDACI;AAEf;IAAC,IAAA,4BAAU,GAAE;IACZ,IAAA,2BAAS,GAAE;;oDACK;AAXrB,kDAYC"}
@@ -0,0 +1,5 @@
1
+ import { ValidationError } from 'class-validator';
2
+ export type HandleResult = {
3
+ error: ValidationError;
4
+ data: any;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=handle-result.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handle-result.type.js","sourceRoot":"","sources":["../../../lib/types/handle-result.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { ClassConstructor } from 'class-transformer';
2
+ export type ResponseMetadata = {
3
+ responseClass: ClassConstructor<object>;
4
+ isArray: boolean;
5
+ isAllowEmpty: boolean;
6
+ };
7
+ export type ResponseClass = Function | [Function];
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=response-metadata.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-metadata.type.js","sourceRoot":"","sources":["../../../lib/types/response-metadata.type.ts"],"names":[],"mappings":""}