@hodfords/nestjs-response 8.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.
package/README.md ADDED
@@ -0,0 +1,71 @@
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>
3
+ </p>
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>
21
+ </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
+
27
+ ## Installation 🤖
28
+
29
+ ```
30
+ npm install @hodfords/nestjs-response --save
31
+
32
+ ```
33
+
34
+ ```typescript
35
+ class UserResponse {
36
+ @ApiProperty()
37
+ @IsNotEmpty()
38
+ @IsString()
39
+ name: string
40
+ }
41
+
42
+ class UserController{
43
+ @Get()
44
+ @ResponseModel(UserResponse, true)
45
+ getAllUser() {
46
+ return [{name: "hello"}]
47
+ }
48
+ }
49
+
50
+ ```
51
+
52
+ - `Interceptor global`
53
+ ```javascript
54
+ {
55
+ providers: [
56
+ {
57
+ provide: APP_INTERCEPTOR,
58
+ useClass: LoggingInterceptor
59
+ }
60
+ ]
61
+ }
62
+ ```
63
+
64
+ - `Interceptor decorator`
65
+ ```javascript
66
+ @Controller('test')
67
+ @UseResponseInterceptor()
68
+ export class TestController {
69
+
70
+ }
71
+ ```
@@ -0,0 +1 @@
1
+ export declare const RESPONSE_METADATA_KEY = "response:class";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESPONSE_METADATA_KEY = void 0;
4
+ exports.RESPONSE_METADATA_KEY = 'response:class';
5
+ //# sourceMappingURL=metadata.constant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.constant.js","sourceRoot":"","sources":["../../../libs/constants/metadata.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,gBAAgB,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function ResponseModel(responseClass: any, isArray?: boolean): any;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseModel = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const metadata_constant_1 = require("../constants/metadata.constant");
6
+ const swagger_1 = require("@nestjs/swagger");
7
+ function ResponseModel(responseClass, isArray = false) {
8
+ return (0, common_1.applyDecorators)((0, swagger_1.ApiResponse)({ type: responseClass, isArray }), (0, common_1.SetMetadata)(metadata_constant_1.RESPONSE_METADATA_KEY, {
9
+ responseClass,
10
+ isArray
11
+ }));
12
+ }
13
+ exports.ResponseModel = ResponseModel;
14
+ //# sourceMappingURL=response-model.decorator.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export declare function UseResponseInterceptor(): MethodDecorator & ClassDecorator;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UseResponseInterceptor = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const response_interceptor_1 = require("../interceptors/response.interceptor");
6
+ function UseResponseInterceptor() {
7
+ return (0, common_1.UseInterceptors)(response_interceptor_1.ResponseInterceptor);
8
+ }
9
+ exports.UseResponseInterceptor = UseResponseInterceptor;
10
+ //# sourceMappingURL=use-response-interceptor.decorator.js.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ import { HttpException } from '@nestjs/common';
2
+ export declare class ResponseValidateException extends HttpException {
3
+ errors: any;
4
+ constructor(errors: any);
5
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseValidateException = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ class ResponseValidateException extends common_1.HttpException {
6
+ constructor(errors) {
7
+ super({}, common_1.HttpStatus.INTERNAL_SERVER_ERROR);
8
+ this.errors = errors;
9
+ }
10
+ }
11
+ exports.ResponseValidateException = ResponseValidateException;
12
+ //# sourceMappingURL=response-validate.exception.js.map
@@ -0,0 +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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './constants/metadata.constant';
2
+ export * from './decorators/response-model.decorator';
3
+ export * from './decorators/use-response-interceptor.decorator';
4
+ export * from './exceptions/response-validate.exception';
5
+ export * from './interceptors/response.interceptor';
package/index.js ADDED
@@ -0,0 +1,22 @@
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("./constants/metadata.constant"), exports);
18
+ __exportStar(require("./decorators/response-model.decorator"), exports);
19
+ __exportStar(require("./decorators/use-response-interceptor.decorator"), exports);
20
+ __exportStar(require("./exceptions/response-validate.exception"), exports);
21
+ __exportStar(require("./interceptors/response.interceptor"), exports);
22
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ export declare class ResponseInterceptor implements NestInterceptor {
4
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any>;
5
+ handleResponse(context: ExecutionContext, data: any): Promise<any>;
6
+ }
@@ -0,0 +1,57 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ResponseInterceptor = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const rxjs_1 = require("rxjs");
12
+ const class_transformer_1 = require("class-transformer");
13
+ const class_validator_1 = require("class-validator");
14
+ const response_validate_exception_1 = require("../exceptions/response-validate.exception");
15
+ const metadata_constant_1 = require("../constants/metadata.constant");
16
+ let ResponseInterceptor = class ResponseInterceptor {
17
+ intercept(context, next) {
18
+ return next.handle().pipe((0, rxjs_1.map)((data) => this.handleResponse(context, data)));
19
+ }
20
+ async handleResponse(context, data) {
21
+ let responseMetadata = Reflect.getMetadata(metadata_constant_1.RESPONSE_METADATA_KEY, context.getHandler());
22
+ if (!responseMetadata) {
23
+ return data;
24
+ }
25
+ 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);
38
+ }
39
+ return newData;
40
+ }
41
+ let newData = (0, class_transformer_1.plainToInstance)(responseMetadata.responseClass, data);
42
+ let errors = await (0, class_validator_1.validate)(newData, {
43
+ whitelist: true,
44
+ stopAtFirstError: true
45
+ });
46
+ if (errors.length) {
47
+ console.error(errors);
48
+ throw new response_validate_exception_1.ResponseValidateException(errors);
49
+ }
50
+ return newData;
51
+ }
52
+ };
53
+ ResponseInterceptor = __decorate([
54
+ (0, common_1.Injectable)()
55
+ ], ResponseInterceptor);
56
+ exports.ResponseInterceptor = ResponseInterceptor;
57
+ //# sourceMappingURL=response.interceptor.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@hodfords/nestjs-response",
3
+ "version": "8.0.0",
4
+ "description": "",
5
+ "author": "",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/hodfords-solutions/nestjs-response.git"
10
+ },
11
+ "scripts": {
12
+ "prebuild": "rimraf dist",
13
+ "build": "nest build",
14
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"libs/**/*.ts\"",
15
+ "start": "nest start",
16
+ "start:dev": "npm run prebuild && nest start --watch",
17
+ "start:debug": "nest start --debug --watch",
18
+ "start:prod": "node dist/main",
19
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
20
+ "test": "jest",
21
+ "test:watch": "jest --watch",
22
+ "test:cov": "jest --coverage",
23
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
24
+ "test:e2e": "jest --config ./test/jest-e2e.json",
25
+ "wz-command": "wz-command",
26
+ "prepare": "is-ci || husky install",
27
+ "version": "auto-changelog && git add CHANGELOG.md",
28
+ "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
+ },
31
+ "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",
42
+ "@types/supertest": "2.0.12",
43
+ "@typescript-eslint/eslint-plugin": "5.26.0",
44
+ "@typescript-eslint/parser": "5.26.0",
45
+ "auto-changelog": "2.4.0",
46
+ "class-transformer": "^0.5.1",
47
+ "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",
52
+ "is-ci": "3.0.1",
53
+ "jest": "27.5.1",
54
+ "lint-staged": "13.0.3",
55
+ "prettier": "2.6.2",
56
+ "reflect-metadata": "0.1.13",
57
+ "rimraf": "3.0.2",
58
+ "rxjs": "7.5.7",
59
+ "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"
66
+ },
67
+ "jest": {
68
+ "moduleFileExtensions": [
69
+ "js",
70
+ "json",
71
+ "ts"
72
+ ],
73
+ "rootDir": ".",
74
+ "testRegex": ".*\\.spec\\.ts$",
75
+ "transform": {
76
+ "^.+\\.(t|j)s$": "ts-jest"
77
+ },
78
+ "collectCoverageFrom": [
79
+ "**/*.(t|j)s"
80
+ ],
81
+ "coverageDirectory": "./coverage",
82
+ "testEnvironment": "node",
83
+ "roots": [
84
+ "<rootDir>/src/",
85
+ "<rootDir>/libs/"
86
+ ],
87
+ "moduleNameMapper": {
88
+ "^@hodfords/nestjs-response(|/.*)$": "<rootDir>/libs/nestjs-response/src/$1"
89
+ }
90
+ }
91
+ }