nestjs-exception-handler 4.3.0 → 4.4.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/dist/index.d.mts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +78 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +76 -70
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -60,10 +60,11 @@ declare class ExceptionHandlerService {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
declare class GlobalExceptionFilter implements ExceptionFilter {
|
|
63
|
-
private exceptionHandlerService
|
|
63
|
+
private exceptionHandlerService?;
|
|
64
64
|
private readonly logger;
|
|
65
65
|
private config;
|
|
66
|
-
constructor(exceptionHandlerService
|
|
66
|
+
constructor(exceptionHandlerService?: ExceptionHandlerService | undefined, config?: ExceptionHandlerConfig);
|
|
67
|
+
private getService;
|
|
67
68
|
catch(exception: unknown, host: ArgumentsHost): void;
|
|
68
69
|
private getStatusCode;
|
|
69
70
|
private logError;
|
package/dist/index.d.ts
CHANGED
|
@@ -60,10 +60,11 @@ declare class ExceptionHandlerService {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
declare class GlobalExceptionFilter implements ExceptionFilter {
|
|
63
|
-
private exceptionHandlerService
|
|
63
|
+
private exceptionHandlerService?;
|
|
64
64
|
private readonly logger;
|
|
65
65
|
private config;
|
|
66
|
-
constructor(exceptionHandlerService
|
|
66
|
+
constructor(exceptionHandlerService?: ExceptionHandlerService | undefined, config?: ExceptionHandlerConfig);
|
|
67
|
+
private getService;
|
|
67
68
|
catch(exception: unknown, host: ArgumentsHost): void;
|
|
68
69
|
private getStatusCode;
|
|
69
70
|
private logError;
|
package/dist/index.js
CHANGED
|
@@ -227,83 +227,16 @@ DtoValidationFormatter = __decorateClass([
|
|
|
227
227
|
], DtoValidationFormatter);
|
|
228
228
|
|
|
229
229
|
// src/filter/global-exception.filter.ts
|
|
230
|
-
var
|
|
231
|
-
var GlobalExceptionFilter = class {
|
|
232
|
-
constructor(exceptionHandlerService, config) {
|
|
233
|
-
this.exceptionHandlerService = exceptionHandlerService;
|
|
234
|
-
this.logger = new import_common3.Logger(GlobalExceptionFilter.name);
|
|
235
|
-
this.config = config || { enableLogging: true, hideStackTrace: false };
|
|
236
|
-
}
|
|
237
|
-
catch(exception, host) {
|
|
238
|
-
const ctx = host.switchToHttp();
|
|
239
|
-
const response = ctx.getResponse();
|
|
240
|
-
const request = ctx.getRequest();
|
|
241
|
-
const { errors, message } = this.exceptionHandlerService.formatException(exception);
|
|
242
|
-
let status = this.getStatusCode(exception);
|
|
243
|
-
let finalErrors = errors;
|
|
244
|
-
let finalMessage = message;
|
|
245
|
-
if (exception instanceof import_common3.NotFoundException) {
|
|
246
|
-
const exceptionResponse = exception.getResponse();
|
|
247
|
-
if (typeof exceptionResponse === "object" && exceptionResponse !== null && "message" in exceptionResponse) {
|
|
248
|
-
const msg = exceptionResponse.message;
|
|
249
|
-
if (typeof msg === "string" && msg.includes("Cannot")) {
|
|
250
|
-
status = import_common3.HttpStatus.NOT_FOUND;
|
|
251
|
-
finalMessage = "Route Not Found";
|
|
252
|
-
finalErrors = [
|
|
253
|
-
{
|
|
254
|
-
path: "route",
|
|
255
|
-
message: [msg]
|
|
256
|
-
}
|
|
257
|
-
];
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
const errorResponse = {
|
|
262
|
-
success: false,
|
|
263
|
-
message: finalMessage,
|
|
264
|
-
errorMessages: finalErrors
|
|
265
|
-
};
|
|
266
|
-
if (this.config.enableLogging) {
|
|
267
|
-
this.logError(request, status, finalErrors, exception);
|
|
268
|
-
}
|
|
269
|
-
response.status(status).json(errorResponse);
|
|
270
|
-
}
|
|
271
|
-
getStatusCode(exception) {
|
|
272
|
-
if (exception instanceof import_common3.HttpException) {
|
|
273
|
-
return exception.getStatus();
|
|
274
|
-
}
|
|
275
|
-
return import_common3.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
276
|
-
}
|
|
277
|
-
logError(request, status, errorMessages, exception) {
|
|
278
|
-
const method = request.method;
|
|
279
|
-
const url = request.url;
|
|
280
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
281
|
-
const logData = {
|
|
282
|
-
timestamp,
|
|
283
|
-
method,
|
|
284
|
-
url,
|
|
285
|
-
status,
|
|
286
|
-
errorMessages,
|
|
287
|
-
stack: this.config.hideStackTrace ? void 0 : exception?.stack
|
|
288
|
-
};
|
|
289
|
-
this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));
|
|
290
|
-
}
|
|
291
|
-
};
|
|
292
|
-
GlobalExceptionFilter = __decorateClass([
|
|
293
|
-
(0, import_common3.Catch)()
|
|
294
|
-
], GlobalExceptionFilter);
|
|
295
|
-
|
|
296
|
-
// src/module/exception-handler.module.ts
|
|
297
|
-
var import_common6 = require("@nestjs/common");
|
|
230
|
+
var import_common5 = require("@nestjs/common");
|
|
298
231
|
|
|
299
232
|
// src/services/exception-handler.service.ts
|
|
300
|
-
var
|
|
233
|
+
var import_common4 = require("@nestjs/common");
|
|
301
234
|
|
|
302
235
|
// src/formatters/http-exception.formatter.ts
|
|
303
|
-
var
|
|
236
|
+
var import_common3 = require("@nestjs/common");
|
|
304
237
|
var HttpExceptionFormatter = class {
|
|
305
238
|
supports(exception) {
|
|
306
|
-
return exception instanceof
|
|
239
|
+
return exception instanceof import_common3.HttpException;
|
|
307
240
|
}
|
|
308
241
|
format(exception) {
|
|
309
242
|
const httpException = exception;
|
|
@@ -481,10 +414,83 @@ var ExceptionHandlerService = class {
|
|
|
481
414
|
}
|
|
482
415
|
};
|
|
483
416
|
ExceptionHandlerService = __decorateClass([
|
|
484
|
-
(0,
|
|
417
|
+
(0, import_common4.Injectable)()
|
|
485
418
|
], ExceptionHandlerService);
|
|
486
419
|
|
|
420
|
+
// src/filter/global-exception.filter.ts
|
|
421
|
+
var GlobalExceptionFilter = class {
|
|
422
|
+
constructor(exceptionHandlerService, config) {
|
|
423
|
+
this.exceptionHandlerService = exceptionHandlerService;
|
|
424
|
+
this.logger = new import_common5.Logger(GlobalExceptionFilter.name);
|
|
425
|
+
this.config = config || { enableLogging: true, hideStackTrace: false };
|
|
426
|
+
}
|
|
427
|
+
getService() {
|
|
428
|
+
if (!this.exceptionHandlerService) {
|
|
429
|
+
this.exceptionHandlerService = new ExceptionHandlerService();
|
|
430
|
+
}
|
|
431
|
+
return this.exceptionHandlerService;
|
|
432
|
+
}
|
|
433
|
+
catch(exception, host) {
|
|
434
|
+
const ctx = host.switchToHttp();
|
|
435
|
+
const response = ctx.getResponse();
|
|
436
|
+
const request = ctx.getRequest();
|
|
437
|
+
const { errors, message } = this.getService().formatException(exception);
|
|
438
|
+
let status = this.getStatusCode(exception);
|
|
439
|
+
let finalErrors = errors;
|
|
440
|
+
let finalMessage = message;
|
|
441
|
+
if (exception instanceof import_common5.NotFoundException) {
|
|
442
|
+
const exceptionResponse = exception.getResponse();
|
|
443
|
+
if (typeof exceptionResponse === "object" && exceptionResponse !== null && "message" in exceptionResponse) {
|
|
444
|
+
const msg = exceptionResponse.message;
|
|
445
|
+
if (typeof msg === "string" && msg.includes("Cannot")) {
|
|
446
|
+
status = import_common5.HttpStatus.NOT_FOUND;
|
|
447
|
+
finalMessage = "Route Not Found";
|
|
448
|
+
finalErrors = [
|
|
449
|
+
{
|
|
450
|
+
path: "route",
|
|
451
|
+
message: [msg]
|
|
452
|
+
}
|
|
453
|
+
];
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
const errorResponse = {
|
|
458
|
+
success: false,
|
|
459
|
+
message: finalMessage,
|
|
460
|
+
errorMessages: finalErrors
|
|
461
|
+
};
|
|
462
|
+
if (this.config.enableLogging) {
|
|
463
|
+
this.logError(request, status, finalErrors, exception);
|
|
464
|
+
}
|
|
465
|
+
response.status(status).json(errorResponse);
|
|
466
|
+
}
|
|
467
|
+
getStatusCode(exception) {
|
|
468
|
+
if (exception instanceof import_common5.HttpException) {
|
|
469
|
+
return exception.getStatus();
|
|
470
|
+
}
|
|
471
|
+
return import_common5.HttpStatus.INTERNAL_SERVER_ERROR;
|
|
472
|
+
}
|
|
473
|
+
logError(request, status, errorMessages, exception) {
|
|
474
|
+
const method = request.method;
|
|
475
|
+
const url = request.url;
|
|
476
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
477
|
+
const logData = {
|
|
478
|
+
timestamp,
|
|
479
|
+
method,
|
|
480
|
+
url,
|
|
481
|
+
status,
|
|
482
|
+
errorMessages,
|
|
483
|
+
stack: this.config.hideStackTrace ? void 0 : exception?.stack
|
|
484
|
+
};
|
|
485
|
+
this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
GlobalExceptionFilter = __decorateClass([
|
|
489
|
+
(0, import_common5.Catch)()
|
|
490
|
+
], GlobalExceptionFilter);
|
|
491
|
+
|
|
487
492
|
// src/module/exception-handler.module.ts
|
|
493
|
+
var import_common6 = require("@nestjs/common");
|
|
488
494
|
var ExceptionHandlerModule = class {
|
|
489
495
|
static forRoot(config) {
|
|
490
496
|
const providers = [
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/formatters/validation-error.formatter.ts","../src/formatters/prisma-exception.formatter.ts","../src/formatters/dto-validation.formatter.ts","../src/filter/global-exception.filter.ts","../src/module/exception-handler.module.ts","../src/services/exception-handler.service.ts","../src/formatters/http-exception.formatter.ts","../src/formatters/dto-exception.formatter.ts","../src/constants/default-messages.ts","../src/formatters/unknown-exception.formatter.ts","../src/utils/http-error.formatter.ts"],"sourcesContent":["export * from './interfaces';\nexport * from './formatters/validation-error.formatter';\nexport * from './formatters/prisma-exception.formatter';\nexport * from './formatters/dto-validation.formatter';\nexport * from './filter/global-exception.filter';\nexport * from './module/exception-handler.module';\nexport * from './services/exception-handler.service';\nexport * from './utils/http-error.formatter';\n","import { HttpException, ValidationError } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class ValidationErrorFormatter {\n formatValidationErrors(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n const messages = responseObj.message;\n\n if (messages.length > 0 && typeof messages[0] === 'object' && 'property' in messages[0]) {\n return this.formatNestedValidationErrors(messages as ValidationError[]);\n }\n\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message: ['Validation failed'],\n },\n ];\n }\n\n private formatNestedValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.map((error) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n PrismaClientKnownRequestError,\n PrismaClientValidationError,\n PrismaClientRustPanicError,\n PrismaClientInitializationError,\n} from '@prisma/client/runtime/library';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\n\ntype PrismaError =\n | PrismaClientKnownRequestError\n | PrismaClientValidationError\n | PrismaClientRustPanicError\n | PrismaClientInitializationError\n | unknown;\n\n@Injectable()\nexport class PrismaExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return (\n exception instanceof PrismaClientKnownRequestError ||\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError ||\n exception instanceof PrismaClientInitializationError\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n return this.formatError(exception as PrismaError);\n }\n\n message(_exception: unknown): string {\n return 'Database error';\n }\n\n formatError(exception: PrismaError): ErrorMessage[] {\n if (exception instanceof PrismaClientKnownRequestError) {\n return this.formatPrismaError(exception);\n }\n\n if (\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError\n ) {\n return this.formatQueryError(exception);\n }\n\n if (exception instanceof PrismaClientInitializationError) {\n return this.formatInitializationError(exception);\n }\n\n return this.formatUnknownError(exception);\n }\n\n private formatPrismaError(exception: PrismaClientKnownRequestError): ErrorMessage[] {\n const code = exception.code;\n const meta = exception.meta as Record<string, unknown> | undefined;\n\n switch (code) {\n case 'P2002': {\n const target = meta?.target as string[] | undefined;\n const field = target?.[0] || 'field';\n return [\n {\n path: field,\n message: [`A record with this ${field} already exists.`],\n },\n ];\n }\n case 'P2003': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The referenced ${fieldName || 'record'} does not exist.`],\n },\n ];\n }\n case 'P2005': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The value for ${fieldName || 'field'} is invalid.`],\n },\n ];\n }\n case 'P2006': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The ${fieldName || 'field'} field is required.`],\n },\n ];\n }\n case 'P2025': {\n return [\n {\n path: 'record',\n message: ['The requested record does not exist.'],\n },\n ];\n }\n default:\n return [\n {\n path: 'database',\n message: ['Database operation failed.'],\n },\n ];\n }\n }\n\n private formatQueryError(\n exception: PrismaClientValidationError | PrismaClientRustPanicError,\n ): ErrorMessage[] {\n let message = 'Invalid database query.';\n\n if (exception instanceof PrismaClientRustPanicError) {\n message = 'Database engine panic occurred.';\n }\n\n return [\n {\n path: 'database',\n message: [message],\n },\n ];\n }\n\n private formatInitializationError(exception: PrismaClientInitializationError): ErrorMessage[] {\n return [\n {\n path: 'database',\n message: [`Database initialization error: ${exception.message}`],\n },\n ];\n }\n\n private formatUnknownError(exception: unknown): ErrorMessage[] {\n return [\n {\n path: 'unknown',\n message:\n exception instanceof Error\n ? [exception.message]\n : ['An unexpected database error occurred.'],\n },\n ];\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\ninterface ValidationError {\n property: string;\n constraints?: Record<string, string>;\n children?: ValidationError[];\n}\n\n@Injectable()\nexport class DtoValidationFormatter {\n formatDtoValidationException(exception: HttpException): ErrorMessage[] {\n const responseBody: unknown = exception.getResponse();\n\n if (\n typeof responseBody === 'object' &&\n responseBody !== null &&\n 'message' in responseBody &&\n Array.isArray((responseBody as Record<string, unknown>).message)\n ) {\n const messages = (responseBody as Record<string, unknown>).message as unknown[];\n const firstMessage = messages[0];\n\n if (\n firstMessage &&\n typeof firstMessage === 'object' &&\n firstMessage !== null &&\n 'property' in firstMessage\n ) {\n const validationErrors = messages as ValidationError[];\n return validationErrors.map((error: ValidationError) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n\n if (typeof firstMessage === 'string') {\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message:\n typeof responseBody === 'object' && responseBody !== null && 'message' in responseBody\n ? [(responseBody as Record<string, unknown>).message as string]\n : ['An HTTP error occurred'],\n },\n ];\n }\n}\n","import {\n ExceptionFilter,\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { Request, Response } from 'express';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { ErrorResponse, ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\n\n@Catch()\nexport class GlobalExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(GlobalExceptionFilter.name);\n private config: ExceptionHandlerConfig;\n\n constructor(\n private exceptionHandlerService: ExceptionHandlerService,\n config?: ExceptionHandlerConfig,\n ) {\n this.config = config || { enableLogging: true, hideStackTrace: false };\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest<Request>();\n\n const { errors, message } = this.exceptionHandlerService.formatException(exception);\n let status = this.getStatusCode(exception);\n\n let finalErrors = errors;\n let finalMessage = message;\n\n if (exception instanceof NotFoundException) {\n const exceptionResponse = exception.getResponse();\n if (\n typeof exceptionResponse === 'object' &&\n exceptionResponse !== null &&\n 'message' in exceptionResponse\n ) {\n const msg = exceptionResponse.message;\n if (typeof msg === 'string' && msg.includes('Cannot')) {\n status = HttpStatus.NOT_FOUND;\n finalMessage = 'Route Not Found';\n finalErrors = [\n {\n path: 'route',\n message: [msg],\n },\n ];\n }\n }\n }\n\n const errorResponse: ErrorResponse = {\n success: false,\n message: finalMessage,\n errorMessages: finalErrors,\n };\n\n if (this.config.enableLogging) {\n this.logError(request, status, finalErrors, exception);\n }\n\n response.status(status).json(errorResponse);\n }\n\n private getStatusCode(exception: unknown): number {\n if (exception instanceof HttpException) {\n return exception.getStatus();\n }\n return HttpStatus.INTERNAL_SERVER_ERROR;\n }\n\n private logError(\n request: Request,\n status: number,\n errorMessages: ErrorMessage[],\n exception: unknown,\n ): void {\n const method = request.method;\n const url = request.url;\n const timestamp = new Date().toISOString();\n\n const logData = {\n timestamp,\n method,\n url,\n status,\n errorMessages,\n stack: this.config.hideStackTrace ? undefined : (exception as Error)?.stack,\n };\n\n this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));\n }\n}\n","import { DynamicModule, Module } from '@nestjs/common';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { GlobalExceptionFilter } from '../filter/global-exception.filter';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Module({})\nexport class ExceptionHandlerModule {\n static forRoot(config?: ExceptionHandlerConfig): DynamicModule {\n const providers = [\n ExceptionHandlerService,\n {\n provide: GlobalExceptionFilter,\n useFactory: (service: ExceptionHandlerService) => {\n return new GlobalExceptionFilter(service, config);\n },\n inject: [ExceptionHandlerService],\n },\n ];\n\n return {\n module: ExceptionHandlerModule,\n providers,\n exports: [ExceptionHandlerService, GlobalExceptionFilter],\n global: true,\n };\n }\n\n static forFeature(config?: ExceptionHandlerConfig): DynamicModule {\n return this.forRoot(config);\n }\n}\n\n// Initialize formatters\nexport function initializeFormatters(service: ExceptionHandlerService): void {\n service.registerFormatter(new PrismaExceptionFormatter());\n service.registerFormatter(new DtoExceptionFormatter());\n service.registerFormatter(new HttpExceptionFormatter());\n service.registerFormatter(new UnknownExceptionFormatter());\n}\n","import { Injectable } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Injectable()\nexport class ExceptionHandlerService {\n private formatters: ExceptionFormatter[] = [];\n private defaultFormatter: ExceptionFormatter;\n\n constructor() {\n this.defaultFormatter = new UnknownExceptionFormatter();\n this.registerFormatters();\n }\n\n private registerFormatters(): void {\n this.formatters = [\n new PrismaExceptionFormatter(),\n new HttpExceptionFormatter(),\n new DtoExceptionFormatter(),\n ];\n }\n\n registerFormatter(formatter: ExceptionFormatter): void {\n this.formatters.push(formatter);\n }\n\n getFormatter(exception: unknown): ExceptionFormatter {\n for (const formatter of this.formatters) {\n if (formatter.supports(exception)) {\n return formatter;\n }\n }\n return this.defaultFormatter;\n }\n\n formatException(exception: unknown): { errors: ErrorMessage[]; message: string } {\n const formatter = this.getFormatter(exception);\n const errors = formatter.format(exception);\n const message = formatter.message(exception);\n\n return { errors, message };\n }\n\n formatErrors(exception: unknown): ErrorMessage[] {\n const formatter = this.getFormatter(exception);\n return formatter.format(exception);\n }\n\n getErrorMessage(exception: unknown): string {\n const formatter = this.getFormatter(exception);\n return formatter.message(exception);\n }\n\n getAllFormatters(): ExceptionFormatter[] {\n return [...this.formatters];\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return exception instanceof HttpException;\n }\n\n format(exception: unknown): ErrorMessage[] {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message as string] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n message(exception: unknown): string {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return responseObj.message as string;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error as string;\n }\n }\n\n return 'An error occurred';\n }\n}\n","import { ValidationError } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class DtoExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n if (!exception || typeof exception !== 'object') {\n return false;\n }\n\n const error = exception as Record<string, unknown>;\n return (\n Array.isArray(error.validationErrors) ||\n (Array.isArray(error.children) && error.constraints !== undefined)\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors) {\n return this.formatValidationErrors(validationErrors);\n }\n\n if (children) {\n return this.formatChildrenErrors(children);\n }\n\n return [{ path: 'unknown', message: ['Validation failed'] }];\n }\n\n message(exception: unknown): string {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors && validationErrors.length > 0) {\n const firstError = validationErrors[0];\n const constraints = firstError.constraints;\n if (constraints) {\n return Object.values(constraints)[0];\n }\n }\n\n if (children && children.length > 0) {\n return 'Validation failed for nested fields';\n }\n\n return 'Validation failed';\n }\n\n private formatValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.flatMap((error) => {\n const constraints = error.constraints;\n if (constraints) {\n return [\n {\n path: error.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n\n private formatChildrenErrors(children: ValidationError[]): ErrorMessage[] {\n return children.flatMap((child) => {\n const constraints = child.constraints;\n if (constraints) {\n return [\n {\n path: child.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n}\n","export const DEFAULT_ERROR_MESSAGES = {\n UNKNOWN_ERROR: 'An unexpected error occurred',\n VALIDATION_ERROR: 'Validation failed',\n DATABASE_ERROR: 'Database error',\n NOT_FOUND: 'Resource not found',\n UNAUTHORIZED: 'Unauthorized access',\n FORBIDDEN: 'Access forbidden',\n CONFLICT: 'Conflict occurred',\n BAD_REQUEST: 'Bad request',\n};\n\nexport const PRISMA_ERROR_MESSAGES: Record<string, string> = {\n P2002: 'A record with this {field} already exists.',\n P2003: 'This {field} does not exist.',\n P2005: 'Invalid value for {field}.',\n P2006: 'Invalid format for {field}.',\n P2025: 'Record not found.',\n};\n\nexport const DEFAULT_PATH = 'unknown';\n","import { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { DEFAULT_PATH } from '../constants/default-messages';\n\nexport class UnknownExceptionFormatter implements ExceptionFormatter {\n supports(_exception: unknown): boolean {\n return true;\n }\n\n format(_exception: unknown): ErrorMessage[] {\n return [\n {\n path: DEFAULT_PATH,\n message: ['Something went wrong'],\n },\n ];\n }\n\n message(_exception: unknown): string {\n return 'Internal Server Error';\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpErrorFormatter {\n formatHttpException(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n getMessage(exception: HttpException): string {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (typeof responseObj.message === 'string') {\n return responseObj.message;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error;\n }\n }\n\n return 'An error occurred';\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,2BAAN,MAA+B;AAAA,EACpC,uBAAuB,WAA0C;AAC/D,UAAM,WAAW,UAAU,YAAY;AAEvC,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,YAAM,cAAc;AAEpB,UAAI,MAAM,QAAQ,YAAY,OAAO,GAAG;AACtC,cAAM,WAAW,YAAY;AAE7B,YAAI,SAAS,SAAS,KAAK,OAAO,SAAS,CAAC,MAAM,YAAY,cAAc,SAAS,CAAC,GAAG;AACvF,iBAAO,KAAK,6BAA6B,QAA6B;AAAA,QACxE;AAEA,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS,CAAC,mBAAmB;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,6BAA6B,QAA2C;AAC9E,WAAO,OAAO,IAAI,CAAC,WAAW;AAAA,MAC5B,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM,cAAc,OAAO,OAAO,MAAM,WAAW,IAAI,CAAC,kBAAkB;AAAA,IACrF,EAAE;AAAA,EACJ;AACF;;;ACxCA,oBAA2B;AAC3B,qBAKO;AAYA,IAAM,2BAAN,MAA6D;AAAA,EAClE,SAAS,WAA6B;AACpC,WACE,qBAAqB,gDACrB,qBAAqB,8CACrB,qBAAqB,6CACrB,qBAAqB;AAAA,EAEzB;AAAA,EAEA,OAAO,WAAoC;AACzC,WAAO,KAAK,YAAY,SAAwB;AAAA,EAClD;AAAA,EAEA,QAAQ,YAA6B;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,WAAwC;AAClD,QAAI,qBAAqB,8CAA+B;AACtD,aAAO,KAAK,kBAAkB,SAAS;AAAA,IACzC;AAEA,QACE,qBAAqB,8CACrB,qBAAqB,2CACrB;AACA,aAAO,KAAK,iBAAiB,SAAS;AAAA,IACxC;AAEA,QAAI,qBAAqB,gDAAiC;AACxD,aAAO,KAAK,0BAA0B,SAAS;AAAA,IACjD;AAEA,WAAO,KAAK,mBAAmB,SAAS;AAAA,EAC1C;AAAA,EAEQ,kBAAkB,WAA0D;AAClF,UAAM,OAAO,UAAU;AACvB,UAAM,OAAO,UAAU;AAEvB,YAAQ,MAAM;AAAA,MACZ,KAAK,SAAS;AACZ,cAAM,SAAS,MAAM;AACrB,cAAM,QAAQ,SAAS,CAAC,KAAK;AAC7B,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS,CAAC,sBAAsB,KAAK,kBAAkB;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,YAAY,MAAM;AACxB,eAAO;AAAA,UACL;AAAA,YACE,MAAM,aAAa;AAAA,YACnB,SAAS,CAAC,kBAAkB,aAAa,QAAQ,kBAAkB;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,YAAY,MAAM;AACxB,eAAO;AAAA,UACL;AAAA,YACE,MAAM,aAAa;AAAA,YACnB,SAAS,CAAC,iBAAiB,aAAa,OAAO,cAAc;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,YAAY,MAAM;AACxB,eAAO;AAAA,UACL;AAAA,YACE,MAAM,aAAa;AAAA,YACnB,SAAS,CAAC,OAAO,aAAa,OAAO,qBAAqB;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS,CAAC,sCAAsC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA;AACE,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS,CAAC,4BAA4B;AAAA,UACxC;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,iBACN,WACgB;AAChB,QAAI,UAAU;AAEd,QAAI,qBAAqB,2CAA4B;AACnD,gBAAU;AAAA,IACZ;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS,CAAC,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,0BAA0B,WAA4D;AAC5F,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS,CAAC,kCAAkC,UAAU,OAAO,EAAE;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,WAAoC;AAC7D,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SACE,qBAAqB,QACjB,CAAC,UAAU,OAAO,IAClB,CAAC,wCAAwC;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;AAtIa,2BAAN;AAAA,MADN,0BAAW;AAAA,GACC;;;AClBb,IAAAA,iBAA2B;AAWpB,IAAM,yBAAN,MAA6B;AAAA,EAClC,6BAA6B,WAA0C;AACrE,UAAM,eAAwB,UAAU,YAAY;AAEpD,QACE,OAAO,iBAAiB,YACxB,iBAAiB,QACjB,aAAa,gBACb,MAAM,QAAS,aAAyC,OAAO,GAC/D;AACA,YAAM,WAAY,aAAyC;AAC3D,YAAM,eAAe,SAAS,CAAC;AAE/B,UACE,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,QACjB,cAAc,cACd;AACA,cAAM,mBAAmB;AACzB,eAAO,iBAAiB,IAAI,CAAC,WAA4B;AAAA,UACvD,MAAM,MAAM;AAAA,UACZ,SAAS,MAAM,cAAc,OAAO,OAAO,MAAM,WAAW,IAAI,CAAC,kBAAkB;AAAA,QACrF,EAAE;AAAA,MACJ;AAEA,UAAI,OAAO,iBAAiB,UAAU;AACpC,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SACE,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,aAAa,eACtE,CAAE,aAAyC,OAAiB,IAC5D,CAAC,wBAAwB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AA9Ca,yBAAN;AAAA,MADN,2BAAW;AAAA,GACC;;;ACXb,IAAAC,iBAQO;AAOA,IAAM,wBAAN,MAAuD;AAAA,EAI5D,YACU,yBACR,QACA;AAFQ;AAJV,SAAiB,SAAS,IAAI,sBAAO,sBAAsB,IAAI;AAO7D,SAAK,SAAS,UAAU,EAAE,eAAe,MAAM,gBAAgB,MAAM;AAAA,EACvE;AAAA,EAEA,MAAM,WAAoB,MAA2B;AACnD,UAAM,MAAM,KAAK,aAAa;AAC9B,UAAM,WAAW,IAAI,YAAsB;AAC3C,UAAM,UAAU,IAAI,WAAoB;AAExC,UAAM,EAAE,QAAQ,QAAQ,IAAI,KAAK,wBAAwB,gBAAgB,SAAS;AAClF,QAAI,SAAS,KAAK,cAAc,SAAS;AAEzC,QAAI,cAAc;AAClB,QAAI,eAAe;AAEnB,QAAI,qBAAqB,kCAAmB;AAC1C,YAAM,oBAAoB,UAAU,YAAY;AAChD,UACE,OAAO,sBAAsB,YAC7B,sBAAsB,QACtB,aAAa,mBACb;AACA,cAAM,MAAM,kBAAkB;AAC9B,YAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,QAAQ,GAAG;AACrD,mBAAS,0BAAW;AACpB,yBAAe;AACf,wBAAc;AAAA,YACZ;AAAA,cACE,MAAM;AAAA,cACN,SAAS,CAAC,GAAG;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAA+B;AAAA,MACnC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,IACjB;AAEA,QAAI,KAAK,OAAO,eAAe;AAC7B,WAAK,SAAS,SAAS,QAAQ,aAAa,SAAS;AAAA,IACvD;AAEA,aAAS,OAAO,MAAM,EAAE,KAAK,aAAa;AAAA,EAC5C;AAAA,EAEQ,cAAc,WAA4B;AAChD,QAAI,qBAAqB,8BAAe;AACtC,aAAO,UAAU,UAAU;AAAA,IAC7B;AACA,WAAO,0BAAW;AAAA,EACpB;AAAA,EAEQ,SACN,SACA,QACA,eACA,WACM;AACN,UAAM,SAAS,QAAQ;AACvB,UAAM,MAAM,QAAQ;AACpB,UAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAEzC,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,KAAK,OAAO,iBAAiB,SAAa,WAAqB;AAAA,IACxE;AAEA,SAAK,OAAO,MAAM,GAAG,MAAM,IAAI,GAAG,MAAM,MAAM,IAAI,KAAK,UAAU,OAAO,CAAC;AAAA,EAC3E;AACF;AApFa,wBAAN;AAAA,MADN,sBAAM;AAAA,GACM;;;ACfb,IAAAC,iBAAsC;;;ACAtC,IAAAC,iBAA2B;;;ACA3B,IAAAC,iBAA8B;AAIvB,IAAM,yBAAN,MAA2D;AAAA,EAChE,SAAS,WAA6B;AACpC,WAAO,qBAAqB;AAAA,EAC9B;AAAA,EAEA,OAAO,WAAoC;AACzC,UAAM,gBAAgB;AACtB,UAAM,WAAW,cAAc,YAAY;AAE3C,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,QAAQ,EAAE,CAAC;AAAA,IACrD;AAEA,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,YAAM,cAAc;AAEpB,UAAI,YAAY,WAAW,MAAM,QAAQ,YAAY,OAAO,GAAG;AAC7D,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,WAAW,OAAO,YAAY,YAAY,UAAU;AAClE,eAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,YAAY,OAAiB,EAAE,CAAC;AAAA,MAC1E;AAEA,UAAI,YAAY,SAAS,OAAO,YAAY,UAAU,UAAU;AAC9D,eAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,YAAY,KAAK,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,mBAAmB,EAAE,CAAC;AAAA,EAChE;AAAA,EAEA,QAAQ,WAA4B;AAClC,UAAM,gBAAgB;AACtB,UAAM,WAAW,cAAc,YAAY;AAE3C,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,YAAM,cAAc;AAEpB,UAAI,YAAY,WAAW,OAAO,YAAY,YAAY,UAAU;AAClE,eAAO,YAAY;AAAA,MACrB;AAEA,UAAI,YAAY,SAAS,OAAO,YAAY,UAAU,UAAU;AAC9D,eAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC3DO,IAAM,wBAAN,MAA0D;AAAA,EAC/D,SAAS,WAA6B;AACpC,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ;AACd,WACE,MAAM,QAAQ,MAAM,gBAAgB,KACnC,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,gBAAgB;AAAA,EAE5D;AAAA,EAEA,OAAO,WAAoC;AACzC,UAAM,QAAQ;AACd,UAAM,mBAAmB,MAAM;AAC/B,UAAM,WAAW,MAAM;AAEvB,QAAI,kBAAkB;AACpB,aAAO,KAAK,uBAAuB,gBAAgB;AAAA,IACrD;AAEA,QAAI,UAAU;AACZ,aAAO,KAAK,qBAAqB,QAAQ;AAAA,IAC3C;AAEA,WAAO,CAAC,EAAE,MAAM,WAAW,SAAS,CAAC,mBAAmB,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEA,QAAQ,WAA4B;AAClC,UAAM,QAAQ;AACd,UAAM,mBAAmB,MAAM;AAC/B,UAAM,WAAW,MAAM;AAEvB,QAAI,oBAAoB,iBAAiB,SAAS,GAAG;AACnD,YAAM,aAAa,iBAAiB,CAAC;AACrC,YAAM,cAAc,WAAW;AAC/B,UAAI,aAAa;AACf,eAAO,OAAO,OAAO,WAAW,EAAE,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAA2C;AACxE,WAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,YAAM,cAAc,MAAM;AAC1B,UAAI,aAAa;AACf,eAAO;AAAA,UACL;AAAA,YACE,MAAM,MAAM;AAAA,YACZ,SAAS,OAAO,OAAO,WAAW;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,UAA6C;AACxE,WAAO,SAAS,QAAQ,CAAC,UAAU;AACjC,YAAM,cAAc,MAAM;AAC1B,UAAI,aAAa;AACf,eAAO;AAAA,UACL;AAAA,YACE,MAAM,MAAM;AAAA,YACZ,SAAS,OAAO,OAAO,WAAW;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC;AAAA,IACV,CAAC;AAAA,EACH;AACF;;;AC/DO,IAAM,eAAe;;;ACfrB,IAAM,4BAAN,MAA8D;AAAA,EACnE,SAAS,YAA8B;AACrC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,YAAqC;AAC1C,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SAAS,CAAC,sBAAsB;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,YAA6B;AACnC,WAAO;AAAA,EACT;AACF;;;AJZO,IAAM,0BAAN,MAA8B;AAAA,EAInC,cAAc;AAHd,SAAQ,aAAmC,CAAC;AAI1C,SAAK,mBAAmB,IAAI,0BAA0B;AACtD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAA2B;AACjC,SAAK,aAAa;AAAA,MAChB,IAAI,yBAAyB;AAAA,MAC7B,IAAI,uBAAuB;AAAA,MAC3B,IAAI,sBAAsB;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,kBAAkB,WAAqC;AACrD,SAAK,WAAW,KAAK,SAAS;AAAA,EAChC;AAAA,EAEA,aAAa,WAAwC;AACnD,eAAW,aAAa,KAAK,YAAY;AACvC,UAAI,UAAU,SAAS,SAAS,GAAG;AACjC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAgB,WAAiE;AAC/E,UAAM,YAAY,KAAK,aAAa,SAAS;AAC7C,UAAM,SAAS,UAAU,OAAO,SAAS;AACzC,UAAM,UAAU,UAAU,QAAQ,SAAS;AAE3C,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B;AAAA,EAEA,aAAa,WAAoC;AAC/C,UAAM,YAAY,KAAK,aAAa,SAAS;AAC7C,WAAO,UAAU,OAAO,SAAS;AAAA,EACnC;AAAA,EAEA,gBAAgB,WAA4B;AAC1C,UAAM,YAAY,KAAK,aAAa,SAAS;AAC7C,WAAO,UAAU,QAAQ,SAAS;AAAA,EACpC;AAAA,EAEA,mBAAyC;AACvC,WAAO,CAAC,GAAG,KAAK,UAAU;AAAA,EAC5B;AACF;AAnDa,0BAAN;AAAA,MADN,2BAAW;AAAA,GACC;;;ADCN,IAAM,yBAAN,MAA6B;AAAA,EAClC,OAAO,QAAQ,QAAgD;AAC7D,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,YAAY,CAAC,YAAqC;AAChD,iBAAO,IAAI,sBAAsB,SAAS,MAAM;AAAA,QAClD;AAAA,QACA,QAAQ,CAAC,uBAAuB;AAAA,MAClC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,CAAC,yBAAyB,qBAAqB;AAAA,MACxD,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,OAAO,WAAW,QAAgD;AAChE,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B;AACF;AAxBa,yBAAN;AAAA,MADN,uBAAO,CAAC,CAAC;AAAA,GACG;AA2BN,SAAS,qBAAqB,SAAwC;AAC3E,UAAQ,kBAAkB,IAAI,yBAAyB,CAAC;AACxD,UAAQ,kBAAkB,IAAI,sBAAsB,CAAC;AACrD,UAAQ,kBAAkB,IAAI,uBAAuB,CAAC;AACtD,UAAQ,kBAAkB,IAAI,0BAA0B,CAAC;AAC3D;;;AMvCO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,oBAAoB,WAA0C;AAC5D,UAAM,WAAW,UAAU,YAAY;AAEvC,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,QAAQ,EAAE,CAAC;AAAA,IACrD;AAEA,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,YAAM,cAAc;AAEpB,UAAI,MAAM,QAAQ,YAAY,OAAO,GAAG;AACtC,eAAO;AAAA,UACL;AAAA,YACE,MAAM;AAAA,YACN,SAAS,YAAY;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,OAAO,YAAY,YAAY,UAAU;AAC3C,eAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,YAAY,OAAO,EAAE,CAAC;AAAA,MAChE;AAEA,UAAI,YAAY,SAAS,OAAO,YAAY,UAAU,UAAU;AAC9D,eAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,YAAY,KAAK,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,CAAC,EAAE,MAAM,cAAc,SAAS,CAAC,mBAAmB,EAAE,CAAC;AAAA,EAChE;AAAA,EAEA,WAAW,WAAkC;AAC3C,UAAM,WAAW,UAAU,YAAY;AAEvC,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,YAAY,aAAa,MAAM;AACrD,YAAM,cAAc;AAEpB,UAAI,OAAO,YAAY,YAAY,UAAU;AAC3C,eAAO,YAAY;AAAA,MACrB;AAEA,UAAI,YAAY,SAAS,OAAO,YAAY,UAAU,UAAU;AAC9D,eAAO,YAAY;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":["import_common","import_common","import_common","import_common","import_common"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/formatters/validation-error.formatter.ts","../src/formatters/prisma-exception.formatter.ts","../src/formatters/dto-validation.formatter.ts","../src/filter/global-exception.filter.ts","../src/services/exception-handler.service.ts","../src/formatters/http-exception.formatter.ts","../src/formatters/dto-exception.formatter.ts","../src/constants/default-messages.ts","../src/formatters/unknown-exception.formatter.ts","../src/module/exception-handler.module.ts","../src/utils/http-error.formatter.ts"],"sourcesContent":["export * from './interfaces';\nexport * from './formatters/validation-error.formatter';\nexport * from './formatters/prisma-exception.formatter';\nexport * from './formatters/dto-validation.formatter';\nexport * from './filter/global-exception.filter';\nexport * from './module/exception-handler.module';\nexport * from './services/exception-handler.service';\nexport * from './utils/http-error.formatter';\n","import { HttpException, ValidationError } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class ValidationErrorFormatter {\n formatValidationErrors(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n const messages = responseObj.message;\n\n if (messages.length > 0 && typeof messages[0] === 'object' && 'property' in messages[0]) {\n return this.formatNestedValidationErrors(messages as ValidationError[]);\n }\n\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message: ['Validation failed'],\n },\n ];\n }\n\n private formatNestedValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.map((error) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n PrismaClientKnownRequestError,\n PrismaClientValidationError,\n PrismaClientRustPanicError,\n PrismaClientInitializationError,\n} from '@prisma/client/runtime/library';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\n\ntype PrismaError =\n | PrismaClientKnownRequestError\n | PrismaClientValidationError\n | PrismaClientRustPanicError\n | PrismaClientInitializationError\n | unknown;\n\n@Injectable()\nexport class PrismaExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return (\n exception instanceof PrismaClientKnownRequestError ||\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError ||\n exception instanceof PrismaClientInitializationError\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n return this.formatError(exception as PrismaError);\n }\n\n message(_exception: unknown): string {\n return 'Database error';\n }\n\n formatError(exception: PrismaError): ErrorMessage[] {\n if (exception instanceof PrismaClientKnownRequestError) {\n return this.formatPrismaError(exception);\n }\n\n if (\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError\n ) {\n return this.formatQueryError(exception);\n }\n\n if (exception instanceof PrismaClientInitializationError) {\n return this.formatInitializationError(exception);\n }\n\n return this.formatUnknownError(exception);\n }\n\n private formatPrismaError(exception: PrismaClientKnownRequestError): ErrorMessage[] {\n const code = exception.code;\n const meta = exception.meta as Record<string, unknown> | undefined;\n\n switch (code) {\n case 'P2002': {\n const target = meta?.target as string[] | undefined;\n const field = target?.[0] || 'field';\n return [\n {\n path: field,\n message: [`A record with this ${field} already exists.`],\n },\n ];\n }\n case 'P2003': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The referenced ${fieldName || 'record'} does not exist.`],\n },\n ];\n }\n case 'P2005': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The value for ${fieldName || 'field'} is invalid.`],\n },\n ];\n }\n case 'P2006': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The ${fieldName || 'field'} field is required.`],\n },\n ];\n }\n case 'P2025': {\n return [\n {\n path: 'record',\n message: ['The requested record does not exist.'],\n },\n ];\n }\n default:\n return [\n {\n path: 'database',\n message: ['Database operation failed.'],\n },\n ];\n }\n }\n\n private formatQueryError(\n exception: PrismaClientValidationError | PrismaClientRustPanicError,\n ): ErrorMessage[] {\n let message = 'Invalid database query.';\n\n if (exception instanceof PrismaClientRustPanicError) {\n message = 'Database engine panic occurred.';\n }\n\n return [\n {\n path: 'database',\n message: [message],\n },\n ];\n }\n\n private formatInitializationError(exception: PrismaClientInitializationError): ErrorMessage[] {\n return [\n {\n path: 'database',\n message: [`Database initialization error: ${exception.message}`],\n },\n ];\n }\n\n private formatUnknownError(exception: unknown): ErrorMessage[] {\n return [\n {\n path: 'unknown',\n message:\n exception instanceof Error\n ? [exception.message]\n : ['An unexpected database error occurred.'],\n },\n ];\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\ninterface ValidationError {\n property: string;\n constraints?: Record<string, string>;\n children?: ValidationError[];\n}\n\n@Injectable()\nexport class DtoValidationFormatter {\n formatDtoValidationException(exception: HttpException): ErrorMessage[] {\n const responseBody: unknown = exception.getResponse();\n\n if (\n typeof responseBody === 'object' &&\n responseBody !== null &&\n 'message' in responseBody &&\n Array.isArray((responseBody as Record<string, unknown>).message)\n ) {\n const messages = (responseBody as Record<string, unknown>).message as unknown[];\n const firstMessage = messages[0];\n\n if (\n firstMessage &&\n typeof firstMessage === 'object' &&\n firstMessage !== null &&\n 'property' in firstMessage\n ) {\n const validationErrors = messages as ValidationError[];\n return validationErrors.map((error: ValidationError) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n\n if (typeof firstMessage === 'string') {\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message:\n typeof responseBody === 'object' && responseBody !== null && 'message' in responseBody\n ? [(responseBody as Record<string, unknown>).message as string]\n : ['An HTTP error occurred'],\n },\n ];\n }\n}\n","import {\n ExceptionFilter,\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { Request, Response } from 'express';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { ErrorResponse, ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\n\n@Catch()\nexport class GlobalExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(GlobalExceptionFilter.name);\n private config: ExceptionHandlerConfig;\n\n constructor(\n private exceptionHandlerService?: ExceptionHandlerService,\n config?: ExceptionHandlerConfig,\n ) {\n this.config = config || { enableLogging: true, hideStackTrace: false };\n }\n\n private getService(): ExceptionHandlerService {\n if (!this.exceptionHandlerService) {\n this.exceptionHandlerService = new ExceptionHandlerService();\n }\n return this.exceptionHandlerService;\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest<Request>();\n\n const { errors, message } = this.getService().formatException(exception);\n let status = this.getStatusCode(exception);\n\n let finalErrors = errors;\n let finalMessage = message;\n\n if (exception instanceof NotFoundException) {\n const exceptionResponse = exception.getResponse();\n if (\n typeof exceptionResponse === 'object' &&\n exceptionResponse !== null &&\n 'message' in exceptionResponse\n ) {\n const msg = exceptionResponse.message;\n if (typeof msg === 'string' && msg.includes('Cannot')) {\n status = HttpStatus.NOT_FOUND;\n finalMessage = 'Route Not Found';\n finalErrors = [\n {\n path: 'route',\n message: [msg],\n },\n ];\n }\n }\n }\n\n const errorResponse: ErrorResponse = {\n success: false,\n message: finalMessage,\n errorMessages: finalErrors,\n };\n\n if (this.config.enableLogging) {\n this.logError(request, status, finalErrors, exception);\n }\n\n response.status(status).json(errorResponse);\n }\n\n private getStatusCode(exception: unknown): number {\n if (exception instanceof HttpException) {\n return exception.getStatus();\n }\n return HttpStatus.INTERNAL_SERVER_ERROR;\n }\n\n private logError(\n request: Request,\n status: number,\n errorMessages: ErrorMessage[],\n exception: unknown,\n ): void {\n const method = request.method;\n const url = request.url;\n const timestamp = new Date().toISOString();\n\n const logData = {\n timestamp,\n method,\n url,\n status,\n errorMessages,\n stack: this.config.hideStackTrace ? undefined : (exception as Error)?.stack,\n };\n\n this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Injectable()\nexport class ExceptionHandlerService {\n private formatters: ExceptionFormatter[] = [];\n private defaultFormatter: ExceptionFormatter;\n\n constructor() {\n this.defaultFormatter = new UnknownExceptionFormatter();\n this.registerFormatters();\n }\n\n private registerFormatters(): void {\n this.formatters = [\n new PrismaExceptionFormatter(),\n new HttpExceptionFormatter(),\n new DtoExceptionFormatter(),\n ];\n }\n\n registerFormatter(formatter: ExceptionFormatter): void {\n this.formatters.push(formatter);\n }\n\n getFormatter(exception: unknown): ExceptionFormatter {\n for (const formatter of this.formatters) {\n if (formatter.supports(exception)) {\n return formatter;\n }\n }\n return this.defaultFormatter;\n }\n\n formatException(exception: unknown): { errors: ErrorMessage[]; message: string } {\n const formatter = this.getFormatter(exception);\n const errors = formatter.format(exception);\n const message = formatter.message(exception);\n\n return { errors, message };\n }\n\n formatErrors(exception: unknown): ErrorMessage[] {\n const formatter = this.getFormatter(exception);\n return formatter.format(exception);\n }\n\n getErrorMessage(exception: unknown): string {\n const formatter = this.getFormatter(exception);\n return formatter.message(exception);\n }\n\n getAllFormatters(): ExceptionFormatter[] {\n return [...this.formatters];\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return exception instanceof HttpException;\n }\n\n format(exception: unknown): ErrorMessage[] {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message as string] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n message(exception: unknown): string {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return responseObj.message as string;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error as string;\n }\n }\n\n return 'An error occurred';\n }\n}\n","import { ValidationError } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class DtoExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n if (!exception || typeof exception !== 'object') {\n return false;\n }\n\n const error = exception as Record<string, unknown>;\n return (\n Array.isArray(error.validationErrors) ||\n (Array.isArray(error.children) && error.constraints !== undefined)\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors) {\n return this.formatValidationErrors(validationErrors);\n }\n\n if (children) {\n return this.formatChildrenErrors(children);\n }\n\n return [{ path: 'unknown', message: ['Validation failed'] }];\n }\n\n message(exception: unknown): string {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors && validationErrors.length > 0) {\n const firstError = validationErrors[0];\n const constraints = firstError.constraints;\n if (constraints) {\n return Object.values(constraints)[0];\n }\n }\n\n if (children && children.length > 0) {\n return 'Validation failed for nested fields';\n }\n\n return 'Validation failed';\n }\n\n private formatValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.flatMap((error) => {\n const constraints = error.constraints;\n if (constraints) {\n return [\n {\n path: error.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n\n private formatChildrenErrors(children: ValidationError[]): ErrorMessage[] {\n return children.flatMap((child) => {\n const constraints = child.constraints;\n if (constraints) {\n return [\n {\n path: child.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n}\n","export const DEFAULT_ERROR_MESSAGES = {\n UNKNOWN_ERROR: 'An unexpected error occurred',\n VALIDATION_ERROR: 'Validation failed',\n DATABASE_ERROR: 'Database error',\n NOT_FOUND: 'Resource not found',\n UNAUTHORIZED: 'Unauthorized access',\n FORBIDDEN: 'Access forbidden',\n CONFLICT: 'Conflict occurred',\n BAD_REQUEST: 'Bad request',\n};\n\nexport const PRISMA_ERROR_MESSAGES: Record<string, string> = {\n P2002: 'A record with this {field} already exists.',\n P2003: 'This {field} does not exist.',\n P2005: 'Invalid value for {field}.',\n P2006: 'Invalid format for {field}.',\n P2025: 'Record not found.',\n};\n\nexport const DEFAULT_PATH = 'unknown';\n","import { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { DEFAULT_PATH } from '../constants/default-messages';\n\nexport class UnknownExceptionFormatter implements ExceptionFormatter {\n supports(_exception: unknown): boolean {\n return true;\n }\n\n format(_exception: unknown): ErrorMessage[] {\n return [\n {\n path: DEFAULT_PATH,\n message: ['Something went wrong'],\n },\n ];\n }\n\n message(_exception: unknown): string {\n return 'Internal Server Error';\n }\n}\n","import { DynamicModule, Module } from '@nestjs/common';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { GlobalExceptionFilter } from '../filter/global-exception.filter';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Module({})\nexport class ExceptionHandlerModule {\n static forRoot(config?: ExceptionHandlerConfig): DynamicModule {\n const providers = [\n ExceptionHandlerService,\n {\n provide: GlobalExceptionFilter,\n useFactory: (service: ExceptionHandlerService) => {\n return new GlobalExceptionFilter(service, config);\n },\n inject: [ExceptionHandlerService],\n },\n ];\n\n return {\n module: ExceptionHandlerModule,\n providers,\n exports: [ExceptionHandlerService, GlobalExceptionFilter],\n global: true,\n };\n }\n\n static forFeature(config?: ExceptionHandlerConfig): DynamicModule {\n return this.forRoot(config);\n }\n}\n\n// Initialize formatters\nexport function initializeFormatters(service: ExceptionHandlerService): void {\n service.registerFormatter(new PrismaExceptionFormatter());\n service.registerFormatter(new DtoExceptionFormatter());\n service.registerFormatter(new HttpExceptionFormatter());\n service.registerFormatter(new UnknownExceptionFormatter());\n}\n","import { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpErrorFormatter {\n formatHttpException(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n getMessage(exception: HttpException): string {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (typeof responseObj.message === 'string') {\n return responseObj.message;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error;\n }\n }\n\n return 'An error occurred';\n }\n}\n"],"mappings":"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","names":["import_common","import_common","import_common","import_common","import_common"]}
|
package/dist/index.mjs
CHANGED
|
@@ -204,87 +204,20 @@ DtoValidationFormatter = __decorateClass([
|
|
|
204
204
|
// src/filter/global-exception.filter.ts
|
|
205
205
|
import {
|
|
206
206
|
Catch,
|
|
207
|
-
HttpException,
|
|
207
|
+
HttpException as HttpException2,
|
|
208
208
|
HttpStatus,
|
|
209
209
|
Logger,
|
|
210
210
|
NotFoundException
|
|
211
211
|
} from "@nestjs/common";
|
|
212
|
-
var GlobalExceptionFilter = class {
|
|
213
|
-
constructor(exceptionHandlerService, config) {
|
|
214
|
-
this.exceptionHandlerService = exceptionHandlerService;
|
|
215
|
-
this.logger = new Logger(GlobalExceptionFilter.name);
|
|
216
|
-
this.config = config || { enableLogging: true, hideStackTrace: false };
|
|
217
|
-
}
|
|
218
|
-
catch(exception, host) {
|
|
219
|
-
const ctx = host.switchToHttp();
|
|
220
|
-
const response = ctx.getResponse();
|
|
221
|
-
const request = ctx.getRequest();
|
|
222
|
-
const { errors, message } = this.exceptionHandlerService.formatException(exception);
|
|
223
|
-
let status = this.getStatusCode(exception);
|
|
224
|
-
let finalErrors = errors;
|
|
225
|
-
let finalMessage = message;
|
|
226
|
-
if (exception instanceof NotFoundException) {
|
|
227
|
-
const exceptionResponse = exception.getResponse();
|
|
228
|
-
if (typeof exceptionResponse === "object" && exceptionResponse !== null && "message" in exceptionResponse) {
|
|
229
|
-
const msg = exceptionResponse.message;
|
|
230
|
-
if (typeof msg === "string" && msg.includes("Cannot")) {
|
|
231
|
-
status = HttpStatus.NOT_FOUND;
|
|
232
|
-
finalMessage = "Route Not Found";
|
|
233
|
-
finalErrors = [
|
|
234
|
-
{
|
|
235
|
-
path: "route",
|
|
236
|
-
message: [msg]
|
|
237
|
-
}
|
|
238
|
-
];
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
const errorResponse = {
|
|
243
|
-
success: false,
|
|
244
|
-
message: finalMessage,
|
|
245
|
-
errorMessages: finalErrors
|
|
246
|
-
};
|
|
247
|
-
if (this.config.enableLogging) {
|
|
248
|
-
this.logError(request, status, finalErrors, exception);
|
|
249
|
-
}
|
|
250
|
-
response.status(status).json(errorResponse);
|
|
251
|
-
}
|
|
252
|
-
getStatusCode(exception) {
|
|
253
|
-
if (exception instanceof HttpException) {
|
|
254
|
-
return exception.getStatus();
|
|
255
|
-
}
|
|
256
|
-
return HttpStatus.INTERNAL_SERVER_ERROR;
|
|
257
|
-
}
|
|
258
|
-
logError(request, status, errorMessages, exception) {
|
|
259
|
-
const method = request.method;
|
|
260
|
-
const url = request.url;
|
|
261
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
262
|
-
const logData = {
|
|
263
|
-
timestamp,
|
|
264
|
-
method,
|
|
265
|
-
url,
|
|
266
|
-
status,
|
|
267
|
-
errorMessages,
|
|
268
|
-
stack: this.config.hideStackTrace ? void 0 : exception?.stack
|
|
269
|
-
};
|
|
270
|
-
this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
GlobalExceptionFilter = __decorateClass([
|
|
274
|
-
Catch()
|
|
275
|
-
], GlobalExceptionFilter);
|
|
276
|
-
|
|
277
|
-
// src/module/exception-handler.module.ts
|
|
278
|
-
import { Module } from "@nestjs/common";
|
|
279
212
|
|
|
280
213
|
// src/services/exception-handler.service.ts
|
|
281
214
|
import { Injectable as Injectable3 } from "@nestjs/common";
|
|
282
215
|
|
|
283
216
|
// src/formatters/http-exception.formatter.ts
|
|
284
|
-
import { HttpException
|
|
217
|
+
import { HttpException } from "@nestjs/common";
|
|
285
218
|
var HttpExceptionFormatter = class {
|
|
286
219
|
supports(exception) {
|
|
287
|
-
return exception instanceof
|
|
220
|
+
return exception instanceof HttpException;
|
|
288
221
|
}
|
|
289
222
|
format(exception) {
|
|
290
223
|
const httpException = exception;
|
|
@@ -465,7 +398,80 @@ ExceptionHandlerService = __decorateClass([
|
|
|
465
398
|
Injectable3()
|
|
466
399
|
], ExceptionHandlerService);
|
|
467
400
|
|
|
401
|
+
// src/filter/global-exception.filter.ts
|
|
402
|
+
var GlobalExceptionFilter = class {
|
|
403
|
+
constructor(exceptionHandlerService, config) {
|
|
404
|
+
this.exceptionHandlerService = exceptionHandlerService;
|
|
405
|
+
this.logger = new Logger(GlobalExceptionFilter.name);
|
|
406
|
+
this.config = config || { enableLogging: true, hideStackTrace: false };
|
|
407
|
+
}
|
|
408
|
+
getService() {
|
|
409
|
+
if (!this.exceptionHandlerService) {
|
|
410
|
+
this.exceptionHandlerService = new ExceptionHandlerService();
|
|
411
|
+
}
|
|
412
|
+
return this.exceptionHandlerService;
|
|
413
|
+
}
|
|
414
|
+
catch(exception, host) {
|
|
415
|
+
const ctx = host.switchToHttp();
|
|
416
|
+
const response = ctx.getResponse();
|
|
417
|
+
const request = ctx.getRequest();
|
|
418
|
+
const { errors, message } = this.getService().formatException(exception);
|
|
419
|
+
let status = this.getStatusCode(exception);
|
|
420
|
+
let finalErrors = errors;
|
|
421
|
+
let finalMessage = message;
|
|
422
|
+
if (exception instanceof NotFoundException) {
|
|
423
|
+
const exceptionResponse = exception.getResponse();
|
|
424
|
+
if (typeof exceptionResponse === "object" && exceptionResponse !== null && "message" in exceptionResponse) {
|
|
425
|
+
const msg = exceptionResponse.message;
|
|
426
|
+
if (typeof msg === "string" && msg.includes("Cannot")) {
|
|
427
|
+
status = HttpStatus.NOT_FOUND;
|
|
428
|
+
finalMessage = "Route Not Found";
|
|
429
|
+
finalErrors = [
|
|
430
|
+
{
|
|
431
|
+
path: "route",
|
|
432
|
+
message: [msg]
|
|
433
|
+
}
|
|
434
|
+
];
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const errorResponse = {
|
|
439
|
+
success: false,
|
|
440
|
+
message: finalMessage,
|
|
441
|
+
errorMessages: finalErrors
|
|
442
|
+
};
|
|
443
|
+
if (this.config.enableLogging) {
|
|
444
|
+
this.logError(request, status, finalErrors, exception);
|
|
445
|
+
}
|
|
446
|
+
response.status(status).json(errorResponse);
|
|
447
|
+
}
|
|
448
|
+
getStatusCode(exception) {
|
|
449
|
+
if (exception instanceof HttpException2) {
|
|
450
|
+
return exception.getStatus();
|
|
451
|
+
}
|
|
452
|
+
return HttpStatus.INTERNAL_SERVER_ERROR;
|
|
453
|
+
}
|
|
454
|
+
logError(request, status, errorMessages, exception) {
|
|
455
|
+
const method = request.method;
|
|
456
|
+
const url = request.url;
|
|
457
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
458
|
+
const logData = {
|
|
459
|
+
timestamp,
|
|
460
|
+
method,
|
|
461
|
+
url,
|
|
462
|
+
status,
|
|
463
|
+
errorMessages,
|
|
464
|
+
stack: this.config.hideStackTrace ? void 0 : exception?.stack
|
|
465
|
+
};
|
|
466
|
+
this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
GlobalExceptionFilter = __decorateClass([
|
|
470
|
+
Catch()
|
|
471
|
+
], GlobalExceptionFilter);
|
|
472
|
+
|
|
468
473
|
// src/module/exception-handler.module.ts
|
|
474
|
+
import { Module } from "@nestjs/common";
|
|
469
475
|
var ExceptionHandlerModule = class {
|
|
470
476
|
static forRoot(config) {
|
|
471
477
|
const providers = [
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formatters/validation-error.formatter.ts","../src/formatters/prisma-exception.formatter.ts","../src/formatters/dto-validation.formatter.ts","../src/filter/global-exception.filter.ts","../src/module/exception-handler.module.ts","../src/services/exception-handler.service.ts","../src/formatters/http-exception.formatter.ts","../src/formatters/dto-exception.formatter.ts","../src/constants/default-messages.ts","../src/formatters/unknown-exception.formatter.ts","../src/utils/http-error.formatter.ts"],"sourcesContent":["import { HttpException, ValidationError } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class ValidationErrorFormatter {\n formatValidationErrors(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n const messages = responseObj.message;\n\n if (messages.length > 0 && typeof messages[0] === 'object' && 'property' in messages[0]) {\n return this.formatNestedValidationErrors(messages as ValidationError[]);\n }\n\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message: ['Validation failed'],\n },\n ];\n }\n\n private formatNestedValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.map((error) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n PrismaClientKnownRequestError,\n PrismaClientValidationError,\n PrismaClientRustPanicError,\n PrismaClientInitializationError,\n} from '@prisma/client/runtime/library';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\n\ntype PrismaError =\n | PrismaClientKnownRequestError\n | PrismaClientValidationError\n | PrismaClientRustPanicError\n | PrismaClientInitializationError\n | unknown;\n\n@Injectable()\nexport class PrismaExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return (\n exception instanceof PrismaClientKnownRequestError ||\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError ||\n exception instanceof PrismaClientInitializationError\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n return this.formatError(exception as PrismaError);\n }\n\n message(_exception: unknown): string {\n return 'Database error';\n }\n\n formatError(exception: PrismaError): ErrorMessage[] {\n if (exception instanceof PrismaClientKnownRequestError) {\n return this.formatPrismaError(exception);\n }\n\n if (\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError\n ) {\n return this.formatQueryError(exception);\n }\n\n if (exception instanceof PrismaClientInitializationError) {\n return this.formatInitializationError(exception);\n }\n\n return this.formatUnknownError(exception);\n }\n\n private formatPrismaError(exception: PrismaClientKnownRequestError): ErrorMessage[] {\n const code = exception.code;\n const meta = exception.meta as Record<string, unknown> | undefined;\n\n switch (code) {\n case 'P2002': {\n const target = meta?.target as string[] | undefined;\n const field = target?.[0] || 'field';\n return [\n {\n path: field,\n message: [`A record with this ${field} already exists.`],\n },\n ];\n }\n case 'P2003': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The referenced ${fieldName || 'record'} does not exist.`],\n },\n ];\n }\n case 'P2005': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The value for ${fieldName || 'field'} is invalid.`],\n },\n ];\n }\n case 'P2006': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The ${fieldName || 'field'} field is required.`],\n },\n ];\n }\n case 'P2025': {\n return [\n {\n path: 'record',\n message: ['The requested record does not exist.'],\n },\n ];\n }\n default:\n return [\n {\n path: 'database',\n message: ['Database operation failed.'],\n },\n ];\n }\n }\n\n private formatQueryError(\n exception: PrismaClientValidationError | PrismaClientRustPanicError,\n ): ErrorMessage[] {\n let message = 'Invalid database query.';\n\n if (exception instanceof PrismaClientRustPanicError) {\n message = 'Database engine panic occurred.';\n }\n\n return [\n {\n path: 'database',\n message: [message],\n },\n ];\n }\n\n private formatInitializationError(exception: PrismaClientInitializationError): ErrorMessage[] {\n return [\n {\n path: 'database',\n message: [`Database initialization error: ${exception.message}`],\n },\n ];\n }\n\n private formatUnknownError(exception: unknown): ErrorMessage[] {\n return [\n {\n path: 'unknown',\n message:\n exception instanceof Error\n ? [exception.message]\n : ['An unexpected database error occurred.'],\n },\n ];\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\ninterface ValidationError {\n property: string;\n constraints?: Record<string, string>;\n children?: ValidationError[];\n}\n\n@Injectable()\nexport class DtoValidationFormatter {\n formatDtoValidationException(exception: HttpException): ErrorMessage[] {\n const responseBody: unknown = exception.getResponse();\n\n if (\n typeof responseBody === 'object' &&\n responseBody !== null &&\n 'message' in responseBody &&\n Array.isArray((responseBody as Record<string, unknown>).message)\n ) {\n const messages = (responseBody as Record<string, unknown>).message as unknown[];\n const firstMessage = messages[0];\n\n if (\n firstMessage &&\n typeof firstMessage === 'object' &&\n firstMessage !== null &&\n 'property' in firstMessage\n ) {\n const validationErrors = messages as ValidationError[];\n return validationErrors.map((error: ValidationError) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n\n if (typeof firstMessage === 'string') {\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message:\n typeof responseBody === 'object' && responseBody !== null && 'message' in responseBody\n ? [(responseBody as Record<string, unknown>).message as string]\n : ['An HTTP error occurred'],\n },\n ];\n }\n}\n","import {\n ExceptionFilter,\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { Request, Response } from 'express';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { ErrorResponse, ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\n\n@Catch()\nexport class GlobalExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(GlobalExceptionFilter.name);\n private config: ExceptionHandlerConfig;\n\n constructor(\n private exceptionHandlerService: ExceptionHandlerService,\n config?: ExceptionHandlerConfig,\n ) {\n this.config = config || { enableLogging: true, hideStackTrace: false };\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest<Request>();\n\n const { errors, message } = this.exceptionHandlerService.formatException(exception);\n let status = this.getStatusCode(exception);\n\n let finalErrors = errors;\n let finalMessage = message;\n\n if (exception instanceof NotFoundException) {\n const exceptionResponse = exception.getResponse();\n if (\n typeof exceptionResponse === 'object' &&\n exceptionResponse !== null &&\n 'message' in exceptionResponse\n ) {\n const msg = exceptionResponse.message;\n if (typeof msg === 'string' && msg.includes('Cannot')) {\n status = HttpStatus.NOT_FOUND;\n finalMessage = 'Route Not Found';\n finalErrors = [\n {\n path: 'route',\n message: [msg],\n },\n ];\n }\n }\n }\n\n const errorResponse: ErrorResponse = {\n success: false,\n message: finalMessage,\n errorMessages: finalErrors,\n };\n\n if (this.config.enableLogging) {\n this.logError(request, status, finalErrors, exception);\n }\n\n response.status(status).json(errorResponse);\n }\n\n private getStatusCode(exception: unknown): number {\n if (exception instanceof HttpException) {\n return exception.getStatus();\n }\n return HttpStatus.INTERNAL_SERVER_ERROR;\n }\n\n private logError(\n request: Request,\n status: number,\n errorMessages: ErrorMessage[],\n exception: unknown,\n ): void {\n const method = request.method;\n const url = request.url;\n const timestamp = new Date().toISOString();\n\n const logData = {\n timestamp,\n method,\n url,\n status,\n errorMessages,\n stack: this.config.hideStackTrace ? undefined : (exception as Error)?.stack,\n };\n\n this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));\n }\n}\n","import { DynamicModule, Module } from '@nestjs/common';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { GlobalExceptionFilter } from '../filter/global-exception.filter';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Module({})\nexport class ExceptionHandlerModule {\n static forRoot(config?: ExceptionHandlerConfig): DynamicModule {\n const providers = [\n ExceptionHandlerService,\n {\n provide: GlobalExceptionFilter,\n useFactory: (service: ExceptionHandlerService) => {\n return new GlobalExceptionFilter(service, config);\n },\n inject: [ExceptionHandlerService],\n },\n ];\n\n return {\n module: ExceptionHandlerModule,\n providers,\n exports: [ExceptionHandlerService, GlobalExceptionFilter],\n global: true,\n };\n }\n\n static forFeature(config?: ExceptionHandlerConfig): DynamicModule {\n return this.forRoot(config);\n }\n}\n\n// Initialize formatters\nexport function initializeFormatters(service: ExceptionHandlerService): void {\n service.registerFormatter(new PrismaExceptionFormatter());\n service.registerFormatter(new DtoExceptionFormatter());\n service.registerFormatter(new HttpExceptionFormatter());\n service.registerFormatter(new UnknownExceptionFormatter());\n}\n","import { Injectable } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Injectable()\nexport class ExceptionHandlerService {\n private formatters: ExceptionFormatter[] = [];\n private defaultFormatter: ExceptionFormatter;\n\n constructor() {\n this.defaultFormatter = new UnknownExceptionFormatter();\n this.registerFormatters();\n }\n\n private registerFormatters(): void {\n this.formatters = [\n new PrismaExceptionFormatter(),\n new HttpExceptionFormatter(),\n new DtoExceptionFormatter(),\n ];\n }\n\n registerFormatter(formatter: ExceptionFormatter): void {\n this.formatters.push(formatter);\n }\n\n getFormatter(exception: unknown): ExceptionFormatter {\n for (const formatter of this.formatters) {\n if (formatter.supports(exception)) {\n return formatter;\n }\n }\n return this.defaultFormatter;\n }\n\n formatException(exception: unknown): { errors: ErrorMessage[]; message: string } {\n const formatter = this.getFormatter(exception);\n const errors = formatter.format(exception);\n const message = formatter.message(exception);\n\n return { errors, message };\n }\n\n formatErrors(exception: unknown): ErrorMessage[] {\n const formatter = this.getFormatter(exception);\n return formatter.format(exception);\n }\n\n getErrorMessage(exception: unknown): string {\n const formatter = this.getFormatter(exception);\n return formatter.message(exception);\n }\n\n getAllFormatters(): ExceptionFormatter[] {\n return [...this.formatters];\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return exception instanceof HttpException;\n }\n\n format(exception: unknown): ErrorMessage[] {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message as string] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n message(exception: unknown): string {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return responseObj.message as string;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error as string;\n }\n }\n\n return 'An error occurred';\n }\n}\n","import { ValidationError } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class DtoExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n if (!exception || typeof exception !== 'object') {\n return false;\n }\n\n const error = exception as Record<string, unknown>;\n return (\n Array.isArray(error.validationErrors) ||\n (Array.isArray(error.children) && error.constraints !== undefined)\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors) {\n return this.formatValidationErrors(validationErrors);\n }\n\n if (children) {\n return this.formatChildrenErrors(children);\n }\n\n return [{ path: 'unknown', message: ['Validation failed'] }];\n }\n\n message(exception: unknown): string {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors && validationErrors.length > 0) {\n const firstError = validationErrors[0];\n const constraints = firstError.constraints;\n if (constraints) {\n return Object.values(constraints)[0];\n }\n }\n\n if (children && children.length > 0) {\n return 'Validation failed for nested fields';\n }\n\n return 'Validation failed';\n }\n\n private formatValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.flatMap((error) => {\n const constraints = error.constraints;\n if (constraints) {\n return [\n {\n path: error.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n\n private formatChildrenErrors(children: ValidationError[]): ErrorMessage[] {\n return children.flatMap((child) => {\n const constraints = child.constraints;\n if (constraints) {\n return [\n {\n path: child.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n}\n","export const DEFAULT_ERROR_MESSAGES = {\n UNKNOWN_ERROR: 'An unexpected error occurred',\n VALIDATION_ERROR: 'Validation failed',\n DATABASE_ERROR: 'Database error',\n NOT_FOUND: 'Resource not found',\n UNAUTHORIZED: 'Unauthorized access',\n FORBIDDEN: 'Access forbidden',\n CONFLICT: 'Conflict occurred',\n BAD_REQUEST: 'Bad request',\n};\n\nexport const PRISMA_ERROR_MESSAGES: Record<string, string> = {\n P2002: 'A record with this {field} already exists.',\n P2003: 'This {field} does not exist.',\n P2005: 'Invalid value for {field}.',\n P2006: 'Invalid format for {field}.',\n P2025: 'Record not found.',\n};\n\nexport const DEFAULT_PATH = 'unknown';\n","import { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { DEFAULT_PATH } from '../constants/default-messages';\n\nexport class UnknownExceptionFormatter implements ExceptionFormatter {\n supports(_exception: unknown): boolean {\n return true;\n }\n\n format(_exception: unknown): ErrorMessage[] {\n return [\n {\n path: DEFAULT_PATH,\n message: ['Something went wrong'],\n },\n ];\n }\n\n message(_exception: unknown): string {\n return 'Internal Server Error';\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpErrorFormatter {\n formatHttpException(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n getMessage(exception: HttpException): string {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (typeof responseObj.message === 'string') {\n return responseObj.message;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error;\n }\n }\n\n return 'An error occurred';\n }\n}\n"],"mappings":"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","names":["Injectable","Injectable","Injectable","HttpException","Injectable"]}
|
|
1
|
+
{"version":3,"sources":["../src/formatters/validation-error.formatter.ts","../src/formatters/prisma-exception.formatter.ts","../src/formatters/dto-validation.formatter.ts","../src/filter/global-exception.filter.ts","../src/services/exception-handler.service.ts","../src/formatters/http-exception.formatter.ts","../src/formatters/dto-exception.formatter.ts","../src/constants/default-messages.ts","../src/formatters/unknown-exception.formatter.ts","../src/module/exception-handler.module.ts","../src/utils/http-error.formatter.ts"],"sourcesContent":["import { HttpException, ValidationError } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class ValidationErrorFormatter {\n formatValidationErrors(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n const messages = responseObj.message;\n\n if (messages.length > 0 && typeof messages[0] === 'object' && 'property' in messages[0]) {\n return this.formatNestedValidationErrors(messages as ValidationError[]);\n }\n\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message: ['Validation failed'],\n },\n ];\n }\n\n private formatNestedValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.map((error) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport {\n PrismaClientKnownRequestError,\n PrismaClientValidationError,\n PrismaClientRustPanicError,\n PrismaClientInitializationError,\n} from '@prisma/client/runtime/library';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\n\ntype PrismaError =\n | PrismaClientKnownRequestError\n | PrismaClientValidationError\n | PrismaClientRustPanicError\n | PrismaClientInitializationError\n | unknown;\n\n@Injectable()\nexport class PrismaExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return (\n exception instanceof PrismaClientKnownRequestError ||\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError ||\n exception instanceof PrismaClientInitializationError\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n return this.formatError(exception as PrismaError);\n }\n\n message(_exception: unknown): string {\n return 'Database error';\n }\n\n formatError(exception: PrismaError): ErrorMessage[] {\n if (exception instanceof PrismaClientKnownRequestError) {\n return this.formatPrismaError(exception);\n }\n\n if (\n exception instanceof PrismaClientValidationError ||\n exception instanceof PrismaClientRustPanicError\n ) {\n return this.formatQueryError(exception);\n }\n\n if (exception instanceof PrismaClientInitializationError) {\n return this.formatInitializationError(exception);\n }\n\n return this.formatUnknownError(exception);\n }\n\n private formatPrismaError(exception: PrismaClientKnownRequestError): ErrorMessage[] {\n const code = exception.code;\n const meta = exception.meta as Record<string, unknown> | undefined;\n\n switch (code) {\n case 'P2002': {\n const target = meta?.target as string[] | undefined;\n const field = target?.[0] || 'field';\n return [\n {\n path: field,\n message: [`A record with this ${field} already exists.`],\n },\n ];\n }\n case 'P2003': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The referenced ${fieldName || 'record'} does not exist.`],\n },\n ];\n }\n case 'P2005': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The value for ${fieldName || 'field'} is invalid.`],\n },\n ];\n }\n case 'P2006': {\n const fieldName = meta?.field_name as string | undefined;\n return [\n {\n path: fieldName || 'field',\n message: [`The ${fieldName || 'field'} field is required.`],\n },\n ];\n }\n case 'P2025': {\n return [\n {\n path: 'record',\n message: ['The requested record does not exist.'],\n },\n ];\n }\n default:\n return [\n {\n path: 'database',\n message: ['Database operation failed.'],\n },\n ];\n }\n }\n\n private formatQueryError(\n exception: PrismaClientValidationError | PrismaClientRustPanicError,\n ): ErrorMessage[] {\n let message = 'Invalid database query.';\n\n if (exception instanceof PrismaClientRustPanicError) {\n message = 'Database engine panic occurred.';\n }\n\n return [\n {\n path: 'database',\n message: [message],\n },\n ];\n }\n\n private formatInitializationError(exception: PrismaClientInitializationError): ErrorMessage[] {\n return [\n {\n path: 'database',\n message: [`Database initialization error: ${exception.message}`],\n },\n ];\n }\n\n private formatUnknownError(exception: unknown): ErrorMessage[] {\n return [\n {\n path: 'unknown',\n message:\n exception instanceof Error\n ? [exception.message]\n : ['An unexpected database error occurred.'],\n },\n ];\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\ninterface ValidationError {\n property: string;\n constraints?: Record<string, string>;\n children?: ValidationError[];\n}\n\n@Injectable()\nexport class DtoValidationFormatter {\n formatDtoValidationException(exception: HttpException): ErrorMessage[] {\n const responseBody: unknown = exception.getResponse();\n\n if (\n typeof responseBody === 'object' &&\n responseBody !== null &&\n 'message' in responseBody &&\n Array.isArray((responseBody as Record<string, unknown>).message)\n ) {\n const messages = (responseBody as Record<string, unknown>).message as unknown[];\n const firstMessage = messages[0];\n\n if (\n firstMessage &&\n typeof firstMessage === 'object' &&\n firstMessage !== null &&\n 'property' in firstMessage\n ) {\n const validationErrors = messages as ValidationError[];\n return validationErrors.map((error: ValidationError) => ({\n path: error.property,\n message: error.constraints ? Object.values(error.constraints) : ['Validation error'],\n }));\n }\n\n if (typeof firstMessage === 'string') {\n return [\n {\n path: 'http_error',\n message: messages as string[],\n },\n ];\n }\n }\n\n return [\n {\n path: 'http_error',\n message:\n typeof responseBody === 'object' && responseBody !== null && 'message' in responseBody\n ? [(responseBody as Record<string, unknown>).message as string]\n : ['An HTTP error occurred'],\n },\n ];\n }\n}\n","import {\n ExceptionFilter,\n Catch,\n ArgumentsHost,\n HttpException,\n HttpStatus,\n Logger,\n NotFoundException,\n} from '@nestjs/common';\nimport { Request, Response } from 'express';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { ErrorResponse, ErrorMessage } from '../interfaces/error-message.interface';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\n\n@Catch()\nexport class GlobalExceptionFilter implements ExceptionFilter {\n private readonly logger = new Logger(GlobalExceptionFilter.name);\n private config: ExceptionHandlerConfig;\n\n constructor(\n private exceptionHandlerService?: ExceptionHandlerService,\n config?: ExceptionHandlerConfig,\n ) {\n this.config = config || { enableLogging: true, hideStackTrace: false };\n }\n\n private getService(): ExceptionHandlerService {\n if (!this.exceptionHandlerService) {\n this.exceptionHandlerService = new ExceptionHandlerService();\n }\n return this.exceptionHandlerService;\n }\n\n catch(exception: unknown, host: ArgumentsHost): void {\n const ctx = host.switchToHttp();\n const response = ctx.getResponse<Response>();\n const request = ctx.getRequest<Request>();\n\n const { errors, message } = this.getService().formatException(exception);\n let status = this.getStatusCode(exception);\n\n let finalErrors = errors;\n let finalMessage = message;\n\n if (exception instanceof NotFoundException) {\n const exceptionResponse = exception.getResponse();\n if (\n typeof exceptionResponse === 'object' &&\n exceptionResponse !== null &&\n 'message' in exceptionResponse\n ) {\n const msg = exceptionResponse.message;\n if (typeof msg === 'string' && msg.includes('Cannot')) {\n status = HttpStatus.NOT_FOUND;\n finalMessage = 'Route Not Found';\n finalErrors = [\n {\n path: 'route',\n message: [msg],\n },\n ];\n }\n }\n }\n\n const errorResponse: ErrorResponse = {\n success: false,\n message: finalMessage,\n errorMessages: finalErrors,\n };\n\n if (this.config.enableLogging) {\n this.logError(request, status, finalErrors, exception);\n }\n\n response.status(status).json(errorResponse);\n }\n\n private getStatusCode(exception: unknown): number {\n if (exception instanceof HttpException) {\n return exception.getStatus();\n }\n return HttpStatus.INTERNAL_SERVER_ERROR;\n }\n\n private logError(\n request: Request,\n status: number,\n errorMessages: ErrorMessage[],\n exception: unknown,\n ): void {\n const method = request.method;\n const url = request.url;\n const timestamp = new Date().toISOString();\n\n const logData = {\n timestamp,\n method,\n url,\n status,\n errorMessages,\n stack: this.config.hideStackTrace ? undefined : (exception as Error)?.stack,\n };\n\n this.logger.error(`${method} ${url} - ${status}`, JSON.stringify(logData));\n }\n}\n","import { Injectable } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Injectable()\nexport class ExceptionHandlerService {\n private formatters: ExceptionFormatter[] = [];\n private defaultFormatter: ExceptionFormatter;\n\n constructor() {\n this.defaultFormatter = new UnknownExceptionFormatter();\n this.registerFormatters();\n }\n\n private registerFormatters(): void {\n this.formatters = [\n new PrismaExceptionFormatter(),\n new HttpExceptionFormatter(),\n new DtoExceptionFormatter(),\n ];\n }\n\n registerFormatter(formatter: ExceptionFormatter): void {\n this.formatters.push(formatter);\n }\n\n getFormatter(exception: unknown): ExceptionFormatter {\n for (const formatter of this.formatters) {\n if (formatter.supports(exception)) {\n return formatter;\n }\n }\n return this.defaultFormatter;\n }\n\n formatException(exception: unknown): { errors: ErrorMessage[]; message: string } {\n const formatter = this.getFormatter(exception);\n const errors = formatter.format(exception);\n const message = formatter.message(exception);\n\n return { errors, message };\n }\n\n formatErrors(exception: unknown): ErrorMessage[] {\n const formatter = this.getFormatter(exception);\n return formatter.format(exception);\n }\n\n getErrorMessage(exception: unknown): string {\n const formatter = this.getFormatter(exception);\n return formatter.message(exception);\n }\n\n getAllFormatters(): ExceptionFormatter[] {\n return [...this.formatters];\n }\n}\n","import { HttpException } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n return exception instanceof HttpException;\n }\n\n format(exception: unknown): ErrorMessage[] {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message as string] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n message(exception: unknown): string {\n const httpException = exception as HttpException;\n const response = httpException.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (responseObj.message && typeof responseObj.message === 'string') {\n return responseObj.message as string;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error as string;\n }\n }\n\n return 'An error occurred';\n }\n}\n","import { ValidationError } from '@nestjs/common';\nimport { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class DtoExceptionFormatter implements ExceptionFormatter {\n supports(exception: unknown): boolean {\n if (!exception || typeof exception !== 'object') {\n return false;\n }\n\n const error = exception as Record<string, unknown>;\n return (\n Array.isArray(error.validationErrors) ||\n (Array.isArray(error.children) && error.constraints !== undefined)\n );\n }\n\n format(exception: unknown): ErrorMessage[] {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors) {\n return this.formatValidationErrors(validationErrors);\n }\n\n if (children) {\n return this.formatChildrenErrors(children);\n }\n\n return [{ path: 'unknown', message: ['Validation failed'] }];\n }\n\n message(exception: unknown): string {\n const error = exception as Record<string, unknown>;\n const validationErrors = error.validationErrors as ValidationError[] | undefined;\n const children = error.children as ValidationError[] | undefined;\n\n if (validationErrors && validationErrors.length > 0) {\n const firstError = validationErrors[0];\n const constraints = firstError.constraints;\n if (constraints) {\n return Object.values(constraints)[0];\n }\n }\n\n if (children && children.length > 0) {\n return 'Validation failed for nested fields';\n }\n\n return 'Validation failed';\n }\n\n private formatValidationErrors(errors: ValidationError[]): ErrorMessage[] {\n return errors.flatMap((error) => {\n const constraints = error.constraints;\n if (constraints) {\n return [\n {\n path: error.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n\n private formatChildrenErrors(children: ValidationError[]): ErrorMessage[] {\n return children.flatMap((child) => {\n const constraints = child.constraints;\n if (constraints) {\n return [\n {\n path: child.property,\n message: Object.values(constraints),\n },\n ];\n }\n return [];\n });\n }\n}\n","export const DEFAULT_ERROR_MESSAGES = {\n UNKNOWN_ERROR: 'An unexpected error occurred',\n VALIDATION_ERROR: 'Validation failed',\n DATABASE_ERROR: 'Database error',\n NOT_FOUND: 'Resource not found',\n UNAUTHORIZED: 'Unauthorized access',\n FORBIDDEN: 'Access forbidden',\n CONFLICT: 'Conflict occurred',\n BAD_REQUEST: 'Bad request',\n};\n\nexport const PRISMA_ERROR_MESSAGES: Record<string, string> = {\n P2002: 'A record with this {field} already exists.',\n P2003: 'This {field} does not exist.',\n P2005: 'Invalid value for {field}.',\n P2006: 'Invalid format for {field}.',\n P2025: 'Record not found.',\n};\n\nexport const DEFAULT_PATH = 'unknown';\n","import { ExceptionFormatter } from '../interfaces/exception-formatter.interface';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\nimport { DEFAULT_PATH } from '../constants/default-messages';\n\nexport class UnknownExceptionFormatter implements ExceptionFormatter {\n supports(_exception: unknown): boolean {\n return true;\n }\n\n format(_exception: unknown): ErrorMessage[] {\n return [\n {\n path: DEFAULT_PATH,\n message: ['Something went wrong'],\n },\n ];\n }\n\n message(_exception: unknown): string {\n return 'Internal Server Error';\n }\n}\n","import { DynamicModule, Module } from '@nestjs/common';\nimport { ExceptionHandlerService } from '../services/exception-handler.service';\nimport { GlobalExceptionFilter } from '../filter/global-exception.filter';\nimport { ExceptionHandlerConfig } from '../interfaces/exception-handler-config.interface';\nimport { PrismaExceptionFormatter } from '../formatters/prisma-exception.formatter';\nimport { DtoExceptionFormatter } from '../formatters/dto-exception.formatter';\nimport { HttpExceptionFormatter } from '../formatters/http-exception.formatter';\nimport { UnknownExceptionFormatter } from '../formatters/unknown-exception.formatter';\n\n@Module({})\nexport class ExceptionHandlerModule {\n static forRoot(config?: ExceptionHandlerConfig): DynamicModule {\n const providers = [\n ExceptionHandlerService,\n {\n provide: GlobalExceptionFilter,\n useFactory: (service: ExceptionHandlerService) => {\n return new GlobalExceptionFilter(service, config);\n },\n inject: [ExceptionHandlerService],\n },\n ];\n\n return {\n module: ExceptionHandlerModule,\n providers,\n exports: [ExceptionHandlerService, GlobalExceptionFilter],\n global: true,\n };\n }\n\n static forFeature(config?: ExceptionHandlerConfig): DynamicModule {\n return this.forRoot(config);\n }\n}\n\n// Initialize formatters\nexport function initializeFormatters(service: ExceptionHandlerService): void {\n service.registerFormatter(new PrismaExceptionFormatter());\n service.registerFormatter(new DtoExceptionFormatter());\n service.registerFormatter(new HttpExceptionFormatter());\n service.registerFormatter(new UnknownExceptionFormatter());\n}\n","import { HttpException } from '@nestjs/common';\nimport { ErrorMessage } from '../interfaces/error-message.interface';\n\nexport class HttpErrorFormatter {\n formatHttpException(exception: HttpException): ErrorMessage[] {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return [{ path: 'http_error', message: [response] }];\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (Array.isArray(responseObj.message)) {\n return [\n {\n path: 'http_error',\n message: responseObj.message as string[],\n },\n ];\n }\n\n if (typeof responseObj.message === 'string') {\n return [{ path: 'http_error', message: [responseObj.message] }];\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return [{ path: 'http_error', message: [responseObj.error] }];\n }\n }\n\n return [{ path: 'http_error', message: ['An error occurred'] }];\n }\n\n getMessage(exception: HttpException): string {\n const response = exception.getResponse();\n\n if (typeof response === 'string') {\n return response;\n }\n\n if (typeof response === 'object' && response !== null) {\n const responseObj = response as Record<string, unknown>;\n\n if (typeof responseObj.message === 'string') {\n return responseObj.message;\n }\n\n if (responseObj.error && typeof responseObj.error === 'string') {\n return responseObj.error;\n }\n }\n\n return 'An error occurred';\n }\n}\n"],"mappings":"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","names":["Injectable","Injectable","HttpException","Injectable","Injectable","HttpException"]}
|