nestjs-api-forge 1.0.3 → 1.0.5
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 +290 -105
- package/dist/decorators/api-response.decorator.d.ts +4 -0
- package/dist/decorators/api-response.decorator.js +7 -1
- package/dist/decorators/api-response.decorator.js.map +1 -1
- package/dist/dto/api-response.dto.d.ts +1 -0
- package/dist/dto/api-response.dto.js +3 -0
- package/dist/dto/api-response.dto.js.map +1 -1
- package/dist/filters/global-exception.filter.d.ts +1 -0
- package/dist/filters/global-exception.filter.js +23 -4
- package/dist/filters/global-exception.filter.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/response.interceptor.d.ts +1 -0
- package/dist/interceptors/response.interceptor.js +45 -5
- package/dist/interceptors/response.interceptor.js.map +1 -1
- package/dist/interfaces/api-response.interface.d.ts +6 -0
- package/dist/pipes/forge-validation.pipe.d.ts +4 -0
- package/dist/pipes/forge-validation.pipe.js +34 -0
- package/dist/pipes/forge-validation.pipe.js.map +1 -0
- package/dist/pipes/index.d.ts +1 -0
- package/dist/pipes/index.js +18 -0
- package/dist/pipes/index.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -3
|
@@ -5,6 +5,7 @@ export declare class ForgeExceptionFilter implements ExceptionFilter {
|
|
|
5
5
|
private readonly logger;
|
|
6
6
|
constructor(options?: ForgeOptions);
|
|
7
7
|
catch(exception: unknown, host: ArgumentsHost): void;
|
|
8
|
+
private resolveRequestId;
|
|
8
9
|
private buildMeta;
|
|
9
10
|
private buildErrorResponse;
|
|
10
11
|
private extractHttpExceptionMessage;
|
|
@@ -25,7 +25,10 @@ let ForgeExceptionFilter = ForgeExceptionFilter_1 = class ForgeExceptionFilter {
|
|
|
25
25
|
const ctx = host.switchToHttp();
|
|
26
26
|
const response = ctx.getResponse();
|
|
27
27
|
const request = ctx.getRequest();
|
|
28
|
-
const
|
|
28
|
+
const requestId = this.resolveRequestId(request);
|
|
29
|
+
if (requestId)
|
|
30
|
+
response.setHeader('x-request-id', requestId);
|
|
31
|
+
const meta = this.buildMeta(request, requestId);
|
|
29
32
|
const errorResponse = this.buildErrorResponse(exception, meta);
|
|
30
33
|
if (errorResponse.statusCode >= 500) {
|
|
31
34
|
this.logger.error(`${request.method} ${request.url} → ${errorResponse.statusCode}`, exception instanceof Error ? exception.stack : String(exception));
|
|
@@ -35,13 +38,29 @@ let ForgeExceptionFilter = ForgeExceptionFilter_1 = class ForgeExceptionFilter {
|
|
|
35
38
|
}
|
|
36
39
|
response.status(errorResponse.statusCode).json(errorResponse);
|
|
37
40
|
}
|
|
38
|
-
|
|
39
|
-
const {
|
|
41
|
+
resolveRequestId(request) {
|
|
42
|
+
const { includeRequestId = false, correlationIdHeader } = this.options;
|
|
43
|
+
if (!includeRequestId && !correlationIdHeader)
|
|
44
|
+
return undefined;
|
|
45
|
+
const headers = typeof correlationIdHeader === 'string'
|
|
46
|
+
? [correlationIdHeader]
|
|
47
|
+
: Array.isArray(correlationIdHeader)
|
|
48
|
+
? correlationIdHeader
|
|
49
|
+
: ['x-request-id', 'x-correlation-id'];
|
|
50
|
+
for (const h of headers) {
|
|
51
|
+
const val = request.headers[h.toLowerCase()];
|
|
52
|
+
if (typeof val === 'string' && val)
|
|
53
|
+
return val;
|
|
54
|
+
}
|
|
55
|
+
return includeRequestId ? (0, crypto_1.randomUUID)() : undefined;
|
|
56
|
+
}
|
|
57
|
+
buildMeta(request, requestId) {
|
|
58
|
+
const { includePath = true, includeTimestamp = true, version } = this.options;
|
|
40
59
|
return {
|
|
41
60
|
...(includeTimestamp && { timestamp: new Date().toISOString() }),
|
|
42
61
|
...(includePath && { path: request.url }),
|
|
43
62
|
...(version && { version }),
|
|
44
|
-
...(
|
|
63
|
+
...(requestId && { requestId }),
|
|
45
64
|
};
|
|
46
65
|
}
|
|
47
66
|
buildErrorResponse(exception, meta) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAOwB;AACxB,mCAAoC;AAEpC,+DAA2D;AAC3D,8DAAyD;AAEzD,8DAAiE;AAG1D,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAG/B,YAA6B,UAAwB,EAAE;QAA1B,YAAO,GAAP,OAAO,CAAmB;QAFtC,WAAM,GAAG,IAAI,eAAM,CAAC,sBAAoB,CAAC,IAAI,CAAC,CAAC;IAEN,CAAC;IAE3D,KAAK,CAAC,SAAkB,EAAE,IAAmB;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAY,CAAC;QAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAW,CAAC;QAE1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"global-exception.filter.js","sourceRoot":"","sources":["../../src/filters/global-exception.filter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -21,5 +21,6 @@ __exportStar(require("./exceptions"), exports);
|
|
|
21
21
|
__exportStar(require("./filters"), exports);
|
|
22
22
|
__exportStar(require("./interceptors"), exports);
|
|
23
23
|
__exportStar(require("./interfaces"), exports);
|
|
24
|
+
__exportStar(require("./pipes"), exports);
|
|
24
25
|
__exportStar(require("./utils"), exports);
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"}
|
|
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;AACxB,0CAAwB"}
|
|
@@ -7,5 +7,6 @@ export declare class ForgeResponseInterceptor implements NestInterceptor {
|
|
|
7
7
|
private readonly options;
|
|
8
8
|
constructor(reflector: Reflector, options?: ForgeOptions);
|
|
9
9
|
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
10
|
+
private resolveRequestId;
|
|
10
11
|
private buildMeta;
|
|
11
12
|
}
|
|
@@ -25,24 +25,64 @@ let ForgeResponseInterceptor = class ForgeResponseInterceptor {
|
|
|
25
25
|
const isRaw = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_RAW_RESPONSE_KEY, [context.getHandler(), context.getClass()]);
|
|
26
26
|
if (isRaw)
|
|
27
27
|
return next.handle();
|
|
28
|
+
const start = Date.now();
|
|
28
29
|
const customMessage = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_MESSAGE_KEY, [context.getHandler(), context.getClass()]);
|
|
30
|
+
const extraMeta = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_META_KEY, [context.getHandler(), context.getClass()]) ?? {};
|
|
31
|
+
const deprecatedValue = this.reflector.getAllAndOverride(api_response_decorator_1.FORGE_DEPRECATED_KEY, [context.getHandler(), context.getClass()]);
|
|
29
32
|
const request = context.switchToHttp().getRequest();
|
|
30
|
-
const
|
|
31
|
-
const
|
|
33
|
+
const response = context.switchToHttp().getResponse();
|
|
34
|
+
const statusCode = response.statusCode;
|
|
35
|
+
const requestId = this.resolveRequestId(request);
|
|
36
|
+
if (requestId)
|
|
37
|
+
response.setHeader('x-request-id', requestId);
|
|
38
|
+
if (deprecatedValue)
|
|
39
|
+
response.setHeader('Deprecation', 'true');
|
|
32
40
|
return next.handle().pipe((0, operators_1.map)((data) => {
|
|
33
41
|
const message = customMessage ??
|
|
34
42
|
this.options.defaultSuccessMessage ??
|
|
35
43
|
'Request successful';
|
|
44
|
+
const deprecationMeta = deprecatedValue
|
|
45
|
+
? {
|
|
46
|
+
deprecated: true,
|
|
47
|
+
...(typeof deprecatedValue === 'string' && {
|
|
48
|
+
deprecationNotice: deprecatedValue,
|
|
49
|
+
}),
|
|
50
|
+
}
|
|
51
|
+
: {};
|
|
52
|
+
const meta = {
|
|
53
|
+
...this.buildMeta(request, requestId),
|
|
54
|
+
...(this.options.includeResponseTime && {
|
|
55
|
+
responseTime: `${Date.now() - start}ms`,
|
|
56
|
+
}),
|
|
57
|
+
...deprecationMeta,
|
|
58
|
+
...extraMeta,
|
|
59
|
+
};
|
|
36
60
|
return api_response_dto_1.ApiResponseDto.success(data, message, statusCode, meta);
|
|
37
61
|
}));
|
|
38
62
|
}
|
|
39
|
-
|
|
40
|
-
const {
|
|
63
|
+
resolveRequestId(request) {
|
|
64
|
+
const { includeRequestId = false, correlationIdHeader } = this.options;
|
|
65
|
+
if (!includeRequestId && !correlationIdHeader)
|
|
66
|
+
return undefined;
|
|
67
|
+
const headers = typeof correlationIdHeader === 'string'
|
|
68
|
+
? [correlationIdHeader]
|
|
69
|
+
: Array.isArray(correlationIdHeader)
|
|
70
|
+
? correlationIdHeader
|
|
71
|
+
: ['x-request-id', 'x-correlation-id'];
|
|
72
|
+
for (const h of headers) {
|
|
73
|
+
const val = request.headers[h.toLowerCase()];
|
|
74
|
+
if (typeof val === 'string' && val)
|
|
75
|
+
return val;
|
|
76
|
+
}
|
|
77
|
+
return includeRequestId ? (0, crypto_1.randomUUID)() : undefined;
|
|
78
|
+
}
|
|
79
|
+
buildMeta(request, requestId) {
|
|
80
|
+
const { includePath = true, includeTimestamp = true, version } = this.options;
|
|
41
81
|
return {
|
|
42
82
|
...(includeTimestamp && { timestamp: new Date().toISOString() }),
|
|
43
83
|
...(includePath && { path: request.url }),
|
|
44
84
|
...(version && { version }),
|
|
45
|
-
...(
|
|
85
|
+
...(requestId && { requestId }),
|
|
46
86
|
};
|
|
47
87
|
}
|
|
48
88
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/response.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyC;AACzC,mCAAoC;AAEpC,8CAAqC;AAErC,8DAAyD;AAEzD,
|
|
1
|
+
{"version":3,"file":"response.interceptor.js","sourceRoot":"","sources":["../../src/interceptors/response.interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@ export interface ApiMeta {
|
|
|
3
3
|
path?: string;
|
|
4
4
|
version?: string;
|
|
5
5
|
requestId?: string;
|
|
6
|
+
responseTime?: string;
|
|
7
|
+
deprecated?: true;
|
|
8
|
+
deprecationNotice?: string;
|
|
9
|
+
[key: string]: unknown;
|
|
6
10
|
}
|
|
7
11
|
export interface ApiSuccessResponse<T = unknown> {
|
|
8
12
|
success: true;
|
|
@@ -48,6 +52,8 @@ export interface ForgeOptions {
|
|
|
48
52
|
includePath?: boolean;
|
|
49
53
|
includeTimestamp?: boolean;
|
|
50
54
|
includeRequestId?: boolean;
|
|
55
|
+
correlationIdHeader?: string | string[];
|
|
56
|
+
includeResponseTime?: boolean;
|
|
51
57
|
version?: string;
|
|
52
58
|
defaultSuccessMessage?: string;
|
|
53
59
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ForgeValidationPipe = void 0;
|
|
4
|
+
const common_1 = require("@nestjs/common");
|
|
5
|
+
const validation_exception_1 = require("../exceptions/validation.exception");
|
|
6
|
+
class ForgeValidationPipe extends common_1.ValidationPipe {
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
super({
|
|
9
|
+
whitelist: true,
|
|
10
|
+
transform: true,
|
|
11
|
+
forbidNonWhitelisted: true,
|
|
12
|
+
...options,
|
|
13
|
+
exceptionFactory: (errors) => new validation_exception_1.ValidationException(flattenErrors(errors)),
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.ForgeValidationPipe = ForgeValidationPipe;
|
|
18
|
+
function flattenErrors(errors, parentField) {
|
|
19
|
+
const details = [];
|
|
20
|
+
for (const err of errors) {
|
|
21
|
+
const field = parentField ? `${parentField}.${err.property}` : err.property;
|
|
22
|
+
if (err.constraints) {
|
|
23
|
+
details.push({
|
|
24
|
+
field,
|
|
25
|
+
message: Object.values(err.constraints).join(', '),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (err.children?.length) {
|
|
29
|
+
details.push(...flattenErrors(err.children, field));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return details;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=forge-validation.pipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forge-validation.pipe.js","sourceRoot":"","sources":["../../src/pipes/forge-validation.pipe.ts"],"names":[],"mappings":";;;AAAA,2CAAwF;AACxF,6EAAyE;AAczE,MAAa,mBAAoB,SAAQ,uBAAc;IACrD,YAAY,UAAiC,EAAE;QAC7C,KAAK,CAAC;YACJ,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,oBAAoB,EAAE,IAAI;YAC1B,GAAG,OAAO;YACV,gBAAgB,EAAE,CAAC,MAAyB,EAAE,EAAE,CAC9C,IAAI,0CAAmB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AAXD,kDAWC;AAED,SAAS,aAAa,CACpB,MAAyB,EACzB,WAAoB;IAEpB,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAE5E,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK;gBACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;aACnD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './forge-validation.pipe';
|
|
@@ -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("./forge-validation.pipe"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0DAAwC"}
|