nestjs-api-forge 1.0.1
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 +221 -0
- package/dist/api-forge.module.d.ts +11 -0
- package/dist/api-forge.module.js +70 -0
- package/dist/api-forge.module.js.map +1 -0
- package/dist/decorators/api-response.decorator.d.ts +6 -0
- package/dist/decorators/api-response.decorator.js +19 -0
- package/dist/decorators/api-response.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +18 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/dto/api-response.dto.d.ts +7 -0
- package/dist/dto/api-response.dto.js +37 -0
- package/dist/dto/api-response.dto.js.map +1 -0
- package/dist/dto/index.d.ts +1 -0
- package/dist/dto/index.js +18 -0
- package/dist/dto/index.js.map +1 -0
- package/dist/exceptions/api.exception.d.ts +34 -0
- package/dist/exceptions/api.exception.js +67 -0
- package/dist/exceptions/api.exception.js.map +1 -0
- package/dist/exceptions/index.d.ts +2 -0
- package/dist/exceptions/index.js +19 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/exceptions/validation.exception.d.ts +6 -0
- package/dist/exceptions/validation.exception.js +19 -0
- package/dist/exceptions/validation.exception.js.map +1 -0
- package/dist/filters/global-exception.filter.d.ts +12 -0
- package/dist/filters/global-exception.filter.js +93 -0
- package/dist/filters/global-exception.filter.js.map +1 -0
- package/dist/filters/index.d.ts +1 -0
- package/dist/filters/index.js +18 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/index.d.ts +1 -0
- package/dist/interceptors/index.js +18 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/response.interceptor.d.ts +11 -0
- package/dist/interceptors/response.interceptor.js +52 -0
- package/dist/interceptors/response.interceptor.js.map +1 -0
- package/dist/interfaces/api-response.interface.d.ts +36 -0
- package/dist/interfaces/api-response.interface.js +3 -0
- package/dist/interfaces/api-response.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +18 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utils/error-code.util.d.ts +3 -0
- package/dist/utils/error-code.util.js +37 -0
- package/dist/utils/error-code.util.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,93 @@
|
|
|
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 ForgeExceptionFilter_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.ForgeExceptionFilter = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const api_exception_1 = require("../exceptions/api.exception");
|
|
16
|
+
const api_response_dto_1 = require("../dto/api-response.dto");
|
|
17
|
+
const error_code_util_1 = require("../utils/error-code.util");
|
|
18
|
+
let ForgeExceptionFilter = ForgeExceptionFilter_1 = class ForgeExceptionFilter {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this.logger = new common_1.Logger(ForgeExceptionFilter_1.name);
|
|
22
|
+
}
|
|
23
|
+
catch(exception, host) {
|
|
24
|
+
const ctx = host.switchToHttp();
|
|
25
|
+
const response = ctx.getResponse();
|
|
26
|
+
const request = ctx.getRequest();
|
|
27
|
+
const meta = this.buildMeta(request);
|
|
28
|
+
const errorResponse = this.buildErrorResponse(exception, meta);
|
|
29
|
+
if (errorResponse.statusCode >= 500) {
|
|
30
|
+
this.logger.error(`${request.method} ${request.url} → ${errorResponse.statusCode}`, exception instanceof Error ? exception.stack : String(exception));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
this.logger.warn(`${request.method} ${request.url} → ${errorResponse.statusCode}: ${errorResponse.message}`);
|
|
34
|
+
}
|
|
35
|
+
response.status(errorResponse.statusCode).json(errorResponse);
|
|
36
|
+
}
|
|
37
|
+
buildMeta(request) {
|
|
38
|
+
const { includePath = true, includeTimestamp = true, version } = this.options;
|
|
39
|
+
return {
|
|
40
|
+
...(includeTimestamp && { timestamp: new Date().toISOString() }),
|
|
41
|
+
...(includePath && { path: request.url }),
|
|
42
|
+
...(version && { version }),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
buildErrorResponse(exception, meta) {
|
|
46
|
+
if (exception instanceof api_exception_1.ApiException) {
|
|
47
|
+
return api_response_dto_1.ApiResponseDto.error(exception.message, exception.getStatus(), { code: exception.code, details: exception.details }, meta);
|
|
48
|
+
}
|
|
49
|
+
if (exception instanceof common_1.HttpException) {
|
|
50
|
+
const status = exception.getStatus();
|
|
51
|
+
const exceptionResponse = exception.getResponse();
|
|
52
|
+
const message = this.extractHttpExceptionMessage(exceptionResponse);
|
|
53
|
+
const details = this.extractValidationDetails(exceptionResponse);
|
|
54
|
+
return api_response_dto_1.ApiResponseDto.error(message, status, {
|
|
55
|
+
code: (0, error_code_util_1.httpStatusToErrorCode)(status),
|
|
56
|
+
...(details.length > 0 && { details }),
|
|
57
|
+
}, meta);
|
|
58
|
+
}
|
|
59
|
+
return api_response_dto_1.ApiResponseDto.error('An unexpected error occurred', common_1.HttpStatus.INTERNAL_SERVER_ERROR, { code: 'INTERNAL_SERVER_ERROR' }, meta);
|
|
60
|
+
}
|
|
61
|
+
extractHttpExceptionMessage(response) {
|
|
62
|
+
if (typeof response === 'string')
|
|
63
|
+
return response;
|
|
64
|
+
if (typeof response === 'object' && response !== null) {
|
|
65
|
+
const r = response;
|
|
66
|
+
if (typeof r['message'] === 'string')
|
|
67
|
+
return r['message'];
|
|
68
|
+
if (Array.isArray(r['message']))
|
|
69
|
+
return 'Validation failed';
|
|
70
|
+
if (typeof r['error'] === 'string')
|
|
71
|
+
return r['error'];
|
|
72
|
+
}
|
|
73
|
+
return 'An error occurred';
|
|
74
|
+
}
|
|
75
|
+
extractValidationDetails(response) {
|
|
76
|
+
if (typeof response !== 'object' || response === null)
|
|
77
|
+
return [];
|
|
78
|
+
const r = response;
|
|
79
|
+
if (!Array.isArray(r['message']))
|
|
80
|
+
return [];
|
|
81
|
+
return r['message'].map((msg) => {
|
|
82
|
+
const parts = msg.split(' ');
|
|
83
|
+
const field = parts.shift();
|
|
84
|
+
return { field, message: parts.join(' ') };
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
exports.ForgeExceptionFilter = ForgeExceptionFilter;
|
|
89
|
+
exports.ForgeExceptionFilter = ForgeExceptionFilter = ForgeExceptionFilter_1 = __decorate([
|
|
90
|
+
(0, common_1.Catch)(),
|
|
91
|
+
__metadata("design:paramtypes", [Object])
|
|
92
|
+
], ForgeExceptionFilter);
|
|
93
|
+
//# sourceMappingURL=global-exception.filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './global-exception.filter';
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./global-exception.filter"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
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("./api-forge.module"), exports);
|
|
18
|
+
__exportStar(require("./decorators"), exports);
|
|
19
|
+
__exportStar(require("./dto"), exports);
|
|
20
|
+
__exportStar(require("./exceptions"), exports);
|
|
21
|
+
__exportStar(require("./filters"), exports);
|
|
22
|
+
__exportStar(require("./interceptors"), exports);
|
|
23
|
+
__exportStar(require("./interfaces"), exports);
|
|
24
|
+
__exportStar(require("./utils"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,+CAA6B;AAC7B,wCAAsB;AACtB,+CAA6B;AAC7B,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,0CAAwB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './response.interceptor';
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./response.interceptor"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interceptors/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { ForgeOptions } from '../interfaces/api-response.interface';
|
|
5
|
+
export declare class ForgeResponseInterceptor implements NestInterceptor {
|
|
6
|
+
private readonly reflector;
|
|
7
|
+
private readonly options;
|
|
8
|
+
constructor(reflector: Reflector, options?: ForgeOptions);
|
|
9
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
10
|
+
private buildMeta;
|
|
11
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
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.ForgeResponseInterceptor = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
const operators_1 = require("rxjs/operators");
|
|
16
|
+
const api_response_dto_1 = require("../dto/api-response.dto");
|
|
17
|
+
const api_response_decorator_1 = require("../decorators/api-response.decorator");
|
|
18
|
+
let ForgeResponseInterceptor = class ForgeResponseInterceptor {
|
|
19
|
+
constructor(reflector, options = {}) {
|
|
20
|
+
this.reflector = reflector;
|
|
21
|
+
this.options = options;
|
|
22
|
+
}
|
|
23
|
+
intercept(context, next) {
|
|
24
|
+
const isRaw = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_RAW_RESPONSE_KEY, [context.getHandler(), context.getClass()]);
|
|
25
|
+
if (isRaw)
|
|
26
|
+
return next.handle();
|
|
27
|
+
const customMessage = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_MESSAGE_KEY, [context.getHandler(), context.getClass()]);
|
|
28
|
+
const request = context.switchToHttp().getRequest();
|
|
29
|
+
const statusCode = context.switchToHttp().getResponse().statusCode;
|
|
30
|
+
const meta = this.buildMeta(request);
|
|
31
|
+
return next.handle().pipe((0, operators_1.map)((data) => {
|
|
32
|
+
const message = customMessage ??
|
|
33
|
+
this.options.defaultSuccessMessage ??
|
|
34
|
+
'Request successful';
|
|
35
|
+
return api_response_dto_1.ApiResponseDto.success(data, message, statusCode, meta);
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
buildMeta(request) {
|
|
39
|
+
const { includePath = true, includeTimestamp = true, version } = this.options;
|
|
40
|
+
return {
|
|
41
|
+
...(includeTimestamp && { timestamp: new Date().toISOString() }),
|
|
42
|
+
...(includePath && { path: request.url }),
|
|
43
|
+
...(version && { version }),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.ForgeResponseInterceptor = ForgeResponseInterceptor;
|
|
48
|
+
exports.ForgeResponseInterceptor = ForgeResponseInterceptor = __decorate([
|
|
49
|
+
(0, common_1.Injectable)(),
|
|
50
|
+
__metadata("design:paramtypes", [core_1.Reflector, Object])
|
|
51
|
+
], ForgeResponseInterceptor);
|
|
52
|
+
//# sourceMappingURL=response.interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/response.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AAEzC,8CAAqC;AAErC,8DAAyD;AAEzD,iFAG8C;AAGvC,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IACnC,YACmB,SAAoB,EACpB,UAAwB,EAAE;QAD1B,cAAS,GAAT,SAAS,CAAW;QACpB,YAAO,GAAP,OAAO,CAAmB;IAC1C,CAAC;IAEJ,SAAS,CAAC,OAAyB,EAAE,IAAiB;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAC5C,+CAAsB,EACtB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;QAEF,IAAI,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QAEhC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CACpD,0CAAiB,EACjB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAC3C,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC;QAEnE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,eAAG,EAAC,CAAC,IAAI,EAAE,EAAE;YACX,MAAM,OAAO,GACX,aAAa;gBACb,IAAI,CAAC,OAAO,CAAC,qBAAqB;gBAClC,oBAAoB,CAAC;YAEvB,OAAO,iCAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,OAAgB;QAChC,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC9E,OAAO;YACL,GAAG,CAAC,gBAAgB,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAChE,GAAG,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;SAC5B,CAAC;IACJ,CAAC;CACF,CAAA;AA5CY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;GAF5B,wBAAwB,CA4CpC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface ApiMeta {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
path?: string;
|
|
4
|
+
version?: string;
|
|
5
|
+
requestId?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ApiSuccessResponse<T = unknown> {
|
|
8
|
+
success: true;
|
|
9
|
+
statusCode: number;
|
|
10
|
+
message: string;
|
|
11
|
+
data: T;
|
|
12
|
+
meta: ApiMeta;
|
|
13
|
+
}
|
|
14
|
+
export interface ApiErrorDetail {
|
|
15
|
+
field?: string;
|
|
16
|
+
message: string;
|
|
17
|
+
value?: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface ApiErrorPayload {
|
|
20
|
+
code: string;
|
|
21
|
+
details?: ApiErrorDetail[];
|
|
22
|
+
}
|
|
23
|
+
export interface ApiErrorResponse {
|
|
24
|
+
success: false;
|
|
25
|
+
statusCode: number;
|
|
26
|
+
message: string;
|
|
27
|
+
error: ApiErrorPayload;
|
|
28
|
+
meta: ApiMeta;
|
|
29
|
+
}
|
|
30
|
+
export type ApiResponse<T = unknown> = ApiSuccessResponse<T> | ApiErrorResponse;
|
|
31
|
+
export interface ForgeOptions {
|
|
32
|
+
includePath?: boolean;
|
|
33
|
+
includeTimestamp?: boolean;
|
|
34
|
+
version?: string;
|
|
35
|
+
defaultSuccessMessage?: string;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-response.interface.js","sourceRoot":"","sources":["../../src/interfaces/api-response.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './api-response.interface';
|
|
@@ -0,0 +1,18 @@
|
|
|
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("./api-response.interface"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC"}
|