{"_id":"@altbzh/nestjs-exceptions","name":"@altbzh/nestjs-exceptions","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@altbzh/nestjs-exceptions","version":"0.1.0","description":"Production-ready exception handling for NestJS with multi-context support (HTTP, RPC, WebSocket)","main":"dist/index.js","types":"dist/index.d.ts","author":{"name":"Florian - ALT","email":"florian@alt.bzh"},"license":"MIT","keywords":["nestjs","exceptions","error-handling","typescript","http","rpc","websocket","grpc"],"repository":{"type":"git","url":"git+https://github.com/AltCompagny/nestjs-exceptions.git"},"bugs":{"url":"https://github.com/AltCompagny/nestjs-exceptions/issues"},"homepage":"https://github.com/AltCompagny/nestjs-exceptions#readme","engines":{"node":">=18.0.0"},"scripts":{"build":"rimraf dist && tsc -p tsconfig.build.json","build:watch":"tsc -p tsconfig.build.json --watch","prepublishOnly":"npm run build","format":"prettier --write \"src/**/*.ts\"","lint":"eslint \"src/**/*.ts\" --fix","test":"jest","test:watch":"jest --watch","test:cov":"jest --coverage"},"peerDependencies":{"@nestjs/common":"^10.0.0","@nestjs/core":"^10.0.0","reflect-metadata":"^0.1.13 || ^0.2.0","rxjs":"^7.0.0"},"peerDependenciesMeta":{"@nestjs/microservices":{"optional":true},"@nestjs/websockets":{"optional":true},"@nestjs/platform-socket.io":{"optional":true}},"devDependencies":{"@nestjs/cli":"^10.3.0","@nestjs/common":"^10.3.0","@nestjs/core":"^10.3.0","@nestjs/microservices":"^10.4.20","@nestjs/platform-express":"^10.3.0","@nestjs/platform-socket.io":"^10.4.20","@nestjs/schematics":"^10.1.0","@nestjs/testing":"^10.3.0","@nestjs/websockets":"^10.4.20","@types/express":"^4.17.21","@types/jest":"^29.5.11","@types/node":"^20.11.0","@types/supertest":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.19.0","@typescript-eslint/parser":"^6.19.0","eslint":"^8.56.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest":"^29.7.0","prettier":"^3.2.4","reflect-metadata":"^0.2.1","rimraf":"^5.0.5","rxjs":"^7.8.1","source-map-support":"^0.5.21","supertest":"^6.3.4","ts-jest":"^29.1.1","ts-loader":"^9.5.1","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0","typescript":"^5.3.3"},"publishConfig":{"access":"public"},"jest":{"moduleFileExtensions":["js","json","ts"],"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"collectCoverageFrom":["**/*.(t|j)s"],"coverageDirectory":"../coverage","testEnvironment":"node"},"_id":"@altbzh/nestjs-exceptions@0.1.0","gitHead":"2147e896ed8639107f4ba529317b37258fb8dad9","_nodeVersion":"23.7.0","_npmVersion":"11.2.0","dist":{"integrity":"sha512-VFlFwSQc4qulyFT1tS5dH1P3PhaAVHTvPHcDHRtd0Nxk4yOSrObnW/foCybkxq7Gg/8APdvyJs+hMOqBrYJYqA==","shasum":"b0268ba67d07a563155ce4fd0098929f829a2597","tarball":"https://registry.npmjs.org/@altbzh/nestjs-exceptions/-/nestjs-exceptions-0.1.0.tgz","fileCount":102,"unpackedSize":266809,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBLDVXAVIlCXTzek4p2WRct/s0jdVZoEH3Ts7ex0iRuNAiEA2XWoQfF7jv2p6Fl5tBjzYWcY0r56C8l1DpFTkT7UCQs="}]},"_npmUser":{"name":"floalt","email":"florian@alt.bzh"},"directories":{},"maintainers":[{"name":"floalt","email":"florian@alt.bzh"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-exceptions_0.1.0_1764431522206_0.19204618454679556"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-29T15:52:02.121Z","0.1.0":"2025-11-29T15:52:02.410Z","modified":"2025-11-29T15:52:02.695Z"},"maintainers":[{"name":"floalt","email":"florian@alt.bzh"}],"description":"Production-ready exception handling for NestJS with multi-context support (HTTP, RPC, WebSocket)","homepage":"https://github.com/AltCompagny/nestjs-exceptions#readme","keywords":["nestjs","exceptions","error-handling","typescript","http","rpc","websocket","grpc"],"repository":{"type":"git","url":"git+https://github.com/AltCompagny/nestjs-exceptions.git"},"author":{"name":"Florian - ALT","email":"florian@alt.bzh"},"bugs":{"url":"https://github.com/AltCompagny/nestjs-exceptions/issues"},"license":"MIT","readme":"# @altbzh/nestjs-exceptions\r\n\r\n> Production-ready exception handling for NestJS with multi-context support (HTTP, RPC, WebSocket)\r\n\r\n[![npm version](https://img.shields.io/npm/v/@altbzh/nestjs-exceptions.svg)](https://www.npmjs.com/package/@altbzh/nestjs-exceptions)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.3-blue.svg)](https://www.typescriptlang.org/)\r\n[![NestJS](https://img.shields.io/badge/NestJS-10.x-red.svg)](https://nestjs.com/)\r\n\r\nA comprehensive exception handling system for NestJS applications that provides type-safe, context-aware error handling across HTTP, RPC (gRPC/microservices), and WebSocket communication. Built with enterprise applications in mind, featuring automatic context detection, standardized error responses, and structured logging.\r\n\r\n## ✨ Features\r\n\r\n- 🔒 **Type-Safe Exception Handling** - Full TypeScript support with generic error details\r\n- 🌐 **Multi-Context Support** - Seamless handling across HTTP, RPC, and WebSocket\r\n- 🎯 **Automatic Context Detection** - Smart detection using multiple strategies\r\n- 📊 **Standardized Error Responses** - Consistent error format across all contexts\r\n- 🔢 **Comprehensive Error Codes** - 20+ predefined error codes for common scenarios\r\n- 🔍 **Global Exception Filter** - Centralized error handling and transformation\r\n- 📝 **Structured Logging** - Rich request context with every error log\r\n- 🛡️ **Environment-Aware** - Different error details for development vs production\r\n- ⚡ **Zero Dependencies** - Only peer dependencies on NestJS packages\r\n\r\n## 📦 Installation\r\n\r\n```bash\r\nnpm install @altbzh/nestjs-exceptions\r\n```\r\n\r\n### Peer Dependencies\r\n\r\nInstall the required NestJS packages if you haven't already:\r\n\r\n```bash\r\nnpm install @nestjs/common @nestjs/core reflect-metadata rxjs\r\n```\r\n\r\n### Optional Dependencies\r\n\r\nFor RPC/microservices support:\r\n\r\n```bash\r\nnpm install @nestjs/microservices\r\n```\r\n\r\nFor WebSocket support:\r\n\r\n```bash\r\nnpm install @nestjs/websockets @nestjs/platform-socket.io\r\n```\r\n\r\n## 🚀 Quick Start\r\n\r\n### 1. Register the Global Exception Filter\r\n\r\nIn your [`main.ts`](./examples/basic-app/src/main.ts:1):\r\n\r\n```typescript\r\nimport { NestFactory } from '@nestjs/core';\r\nimport { GlobalExceptionFilter } from '@altbzh/nestjs-exceptions';\r\nimport { AppModule } from './app.module';\r\n\r\nasync function bootstrap() {\r\n  const app = await NestFactory.create(AppModule);\r\n\r\n  // Register global exception filter\r\n  app.useGlobalFilters(app.get(GlobalExceptionFilter));\r\n\r\n  await app.listen(3000);\r\n}\r\nbootstrap();\r\n```\r\n\r\n### 2. Throw Exceptions in Your Code\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { NotFoundException, ErrorCode } from '@altbzh/nestjs-exceptions';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n  async findById(id: number) {\r\n    const user = await this.repository.findOne(id);\r\n\r\n    if (!user) {\r\n      throw new NotFoundException(ErrorCode.RESOURCE_NOT_FOUND, `User with ID ${id} not found`, {\r\n        resourceType: 'User',\r\n        resourceId: id,\r\n      });\r\n    }\r\n\r\n    return user;\r\n  }\r\n}\r\n```\r\n\r\n### 3. Standardized Error Response\r\n\r\nYour API will automatically return consistent error responses:\r\n\r\n```json\r\n{\r\n  \"error\": \"resource_not_found\",\r\n  \"message\": \"User with ID 123 not found\",\r\n  \"details\": {\r\n    \"resourceType\": \"User\",\r\n    \"resourceId\": 123\r\n  },\r\n  \"timestamp\": \"2024-01-15T10:30:00.000Z\"\r\n}\r\n```\r\n\r\n## 🧩 Core Concepts\r\n\r\n### Exception Hierarchy\r\n\r\nThe library provides a clear exception hierarchy:\r\n\r\n```\r\nAppException (abstract base)\r\n├── HttpAppException (HTTP/REST APIs)\r\n│   ├── BadRequestException (400)\r\n│   ├── UnauthorizedException (401)\r\n│   ├── ForbiddenException (403)\r\n│   ├── NotFoundException (404)\r\n│   ├── ConflictException (409)\r\n│   └── InternalServerErrorException (500)\r\n├── RpcAppException (Microservices/gRPC)\r\n└── WsAppException (WebSocket)\r\n```\r\n\r\n### Context Detection\r\n\r\nThe library automatically detects the execution context:\r\n\r\n1. **ExecutionContextStrategy** (Highest Priority) - Uses NestJS ArgumentsHost\r\n2. **AsyncStorageStrategy** (Medium Priority) - Uses Node.js AsyncLocalStorage\r\n3. **StackTraceStrategy** (Lowest Priority) - Analyzes stack traces (dev only)\r\n\r\nManual override is available when needed:\r\n\r\n```typescript\r\nimport { NotFoundException, ContextType } from '@altbzh/nestjs-exceptions';\r\n\r\nthrow new NotFoundException(\r\n  'resource_not_found',\r\n  'User not found',\r\n  { userId: 123 },\r\n  { context: ContextType.HTTP }, // Manual override\r\n);\r\n```\r\n\r\n### Error Codes\r\n\r\nPredefined error codes organized by category:\r\n\r\n```typescript\r\n// Authentication & Authorization\r\nErrorCode.AUTHENTICATION_REQUIRED;\r\nErrorCode.INVALID_CREDENTIALS;\r\nErrorCode.TOKEN_EXPIRED;\r\nErrorCode.INSUFFICIENT_PERMISSIONS;\r\n\r\n// Validation\r\nErrorCode.VALIDATION_FAILED;\r\nErrorCode.INVALID_INPUT;\r\n\r\n// Resources\r\nErrorCode.RESOURCE_NOT_FOUND;\r\nErrorCode.RESOURCE_ALREADY_EXISTS;\r\n\r\n// Server Errors\r\nErrorCode.INTERNAL_SERVER_ERROR;\r\nErrorCode.SERVICE_UNAVAILABLE;\r\n```\r\n\r\n[See full list of error codes →](./docs/exceptions/api/README.md#error-codes)\r\n\r\n### Exception Metadata\r\n\r\nAll exceptions support typed metadata:\r\n\r\n```typescript\r\ninterface ResourceErrorDetails {\r\n  resourceType: string;\r\n  resourceId: string | number;\r\n  action?: 'create' | 'read' | 'update' | 'delete';\r\n}\r\n\r\nthrow new NotFoundException<ResourceErrorDetails>(ErrorCode.RESOURCE_NOT_FOUND, 'User not found', {\r\n  resourceType: 'User',\r\n  resourceId: 123,\r\n  action: 'read',\r\n});\r\n```\r\n\r\n## 💻 Usage Examples\r\n\r\n### HTTP Exception Handling\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport {\r\n  BadRequestException,\r\n  NotFoundException,\r\n  ConflictException,\r\n  ErrorCode,\r\n} from '@altbzh/nestjs-exceptions';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n  async create(email: string, password: string) {\r\n    // Validation error\r\n    if (!this.isValidEmail(email)) {\r\n      throw new BadRequestException(ErrorCode.VALIDATION_FAILED, 'Invalid email format', {\r\n        field: 'email',\r\n        value: email,\r\n      });\r\n    }\r\n\r\n    // Conflict error\r\n    const existing = await this.findByEmail(email);\r\n    if (existing) {\r\n      throw new ConflictException(\r\n        ErrorCode.RESOURCE_ALREADY_EXISTS,\r\n        'User with this email already exists',\r\n        { email },\r\n      );\r\n    }\r\n\r\n    return this.repository.create({ email, password });\r\n  }\r\n\r\n  async findById(id: number) {\r\n    const user = await this.repository.findOne(id);\r\n\r\n    // Not found error\r\n    if (!user) {\r\n      throw new NotFoundException(ErrorCode.RESOURCE_NOT_FOUND, `User with ID ${id} not found`, {\r\n        resourceType: 'User',\r\n        resourceId: id,\r\n      });\r\n    }\r\n\r\n    return user;\r\n  }\r\n}\r\n```\r\n\r\n### RPC Exception Handling\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { RpcAppException, GrpcStatus } from '@altbzh/nestjs-exceptions';\r\n\r\n@Injectable()\r\nexport class UserRpcService {\r\n  async getUser(id: number) {\r\n    const user = await this.repository.findOne(id);\r\n\r\n    if (!user) {\r\n      throw new RpcAppException({\r\n        errorCode: 'user_not_found',\r\n        message: 'User does not exist',\r\n        details: { userId: id },\r\n        grpcStatus: GrpcStatus.NOT_FOUND, // gRPC status code\r\n      });\r\n    }\r\n\r\n    return user;\r\n  }\r\n\r\n  async authenticateUser(credentials: { email: string; password: string }) {\r\n    const user = await this.validateCredentials(credentials);\r\n\r\n    if (!user) {\r\n      throw new RpcAppException({\r\n        errorCode: 'invalid_credentials',\r\n        message: 'Authentication failed',\r\n        grpcStatus: GrpcStatus.UNAUTHENTICATED,\r\n      });\r\n    }\r\n\r\n    return { token: this.generateToken(user) };\r\n  }\r\n}\r\n```\r\n\r\n### WebSocket Exception Handling\r\n\r\n```typescript\r\nimport { WebSocketGateway, SubscribeMessage, MessageBody } from '@nestjs/websockets';\r\nimport { WsAppException } from '@altbzh/nestjs-exceptions';\r\n\r\n@WebSocketGateway()\r\nexport class ChatGateway {\r\n  @SubscribeMessage('subscribe')\r\n  handleSubscribe(@MessageBody() data: { topicId: string }) {\r\n    const topic = this.topics.get(data.topicId);\r\n\r\n    if (!topic) {\r\n      throw new WsAppException({\r\n        errorCode: 'invalid_subscription',\r\n        message: 'Topic does not exist',\r\n        details: { topicId: data.topicId },\r\n        wsCode: 1008, // Policy Violation\r\n      });\r\n    }\r\n\r\n    return { success: true, topicId: data.topicId };\r\n  }\r\n\r\n  @SubscribeMessage('sendMessage')\r\n  handleMessage(@MessageBody() data: { message: string }) {\r\n    if (!data.message || data.message.length > 1000) {\r\n      throw new WsAppException({\r\n        errorCode: 'invalid_message',\r\n        message: 'Message must be between 1-1000 characters',\r\n        wsCode: 1003, // Unsupported Data\r\n      });\r\n    }\r\n\r\n    this.broadcast(data.message);\r\n    return { success: true };\r\n  }\r\n}\r\n```\r\n\r\n## 📚 API Reference\r\n\r\nFor detailed API documentation, see:\r\n\r\n- **[Complete API Reference](./docs/exceptions/api/README.md)** - Full documentation of all classes and methods\r\n- **[Usage Examples](./docs/exceptions/guides/usage-examples.md)** - More detailed examples and patterns\r\n- **[Architecture Guide](./docs/exceptions/architecture.md)** - Technical design and architecture decisions\r\n\r\n### Key Exports\r\n\r\n```typescript\r\n// Base Classes\r\nimport {\r\n  AppException,\r\n  HttpAppException,\r\n  RpcAppException,\r\n  WsAppException,\r\n} from '@altbzh/nestjs-exceptions';\r\n\r\n// HTTP Exceptions\r\nimport {\r\n  BadRequestException,\r\n  UnauthorizedException,\r\n  ForbiddenException,\r\n  NotFoundException,\r\n  ConflictException,\r\n  InternalServerErrorException,\r\n} from '@altbzh/nestjs-exceptions';\r\n\r\n// Filters & Services\r\nimport {\r\n  GlobalExceptionFilter,\r\n  ExceptionLogger,\r\n  ExceptionTransformer,\r\n} from '@altbzh/nestjs-exceptions';\r\n\r\n// Constants & Types\r\nimport { ErrorCode, ContextType, GrpcStatus } from '@altbzh/nestjs-exceptions';\r\n\r\n// Utilities\r\nimport { ContextDetector } from '@altbzh/nestjs-exceptions';\r\n```\r\n\r\n## ⚙️ Configuration\r\n\r\n### Custom Exception Filter\r\n\r\nYou can extend the [`GlobalExceptionFilter`](./src/filters/global-exception.filter.ts:1) to customize behavior:\r\n\r\n```typescript\r\nimport { Injectable, ExecutionContext } from '@nestjs/common';\r\nimport { GlobalExceptionFilter } from '@altbzh/nestjs-exceptions';\r\n\r\n@Injectable()\r\nexport class CustomExceptionFilter extends GlobalExceptionFilter {\r\n  // Override to add custom logging\r\n  catch(exception: unknown, host: ArgumentsHost): void {\r\n    // Add custom logic here\r\n    this.customLogger.log('Exception caught', exception);\r\n\r\n    // Call parent implementation\r\n    super.catch(exception, host);\r\n  }\r\n}\r\n```\r\n\r\n### Custom Exception Logger\r\n\r\nCustomize logging behavior by extending [`ExceptionLogger`](./src/filters/exception-logger.service.ts:1):\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { ExceptionLogger } from '@altbzh/nestjs-exceptions';\r\n\r\n@Injectable()\r\nexport class CustomExceptionLogger extends ExceptionLogger {\r\n  logException(exception: unknown, context: ExecutionContext): void {\r\n    // Add custom logging logic (e.g., send to external service)\r\n    this.sendToMonitoringService(exception);\r\n\r\n    // Call parent implementation\r\n    super.logException(exception, context);\r\n  }\r\n\r\n  private sendToMonitoringService(exception: unknown): void {\r\n    // Integration with Sentry, DataDog, etc.\r\n  }\r\n}\r\n```\r\n\r\n### Environment-Specific Configuration\r\n\r\nControl error detail visibility:\r\n\r\n```typescript\r\n// main.ts\r\nconst app = await NestFactory.create(AppModule);\r\n\r\nif (process.env.NODE_ENV === 'production') {\r\n  // Production: minimal error details\r\n  app.useGlobalFilters(\r\n    new GlobalExceptionFilter(new ExceptionTransformer(), new ExceptionLogger()),\r\n  );\r\n} else {\r\n  // Development: detailed error information including stack traces\r\n  app.useGlobalFilters(\r\n    new GlobalExceptionFilter(new ExceptionTransformer(), new ExceptionLogger()),\r\n  );\r\n}\r\n```\r\n\r\n### Module Registration\r\n\r\nRegister exception handling services in your module:\r\n\r\n```typescript\r\nimport { Module } from '@nestjs/common';\r\nimport {\r\n  GlobalExceptionFilter,\r\n  ExceptionLogger,\r\n  ExceptionTransformer,\r\n} from '@altbzh/nestjs-exceptions';\r\n\r\n@Module({\r\n  providers: [GlobalExceptionFilter, ExceptionLogger, ExceptionTransformer],\r\n  exports: [GlobalExceptionFilter],\r\n})\r\nexport class ExceptionModule {}\r\n```\r\n\r\n## 🎯 Best Practices\r\n\r\n### 1. Use Specific Exception Classes\r\n\r\n```typescript\r\n// ✅ Good - Specific exception with context\r\nthrow new NotFoundException(ErrorCode.RESOURCE_NOT_FOUND, 'User not found', { userId: 123 });\r\n\r\n// ❌ Bad - Generic error\r\nthrow new Error('User not found');\r\n```\r\n\r\n### 2. Provide Meaningful Error Details\r\n\r\n```typescript\r\n// ✅ Good - Rich context for debugging\r\nthrow new BadRequestException(ErrorCode.VALIDATION_FAILED, 'Email validation failed', {\r\n  field: 'email',\r\n  value: userInput.email,\r\n  reason: 'Invalid format',\r\n  expectedFormat: 'user@example.com',\r\n});\r\n\r\n// ❌ Bad - Minimal context\r\nthrow new BadRequestException(ErrorCode.VALIDATION_FAILED, 'Validation failed');\r\n```\r\n\r\n### 3. Use Error Codes for Client-Side Handling\r\n\r\n```typescript\r\n// Backend\r\nthrow new UnauthorizedException(ErrorCode.TOKEN_EXPIRED, 'Authentication token has expired', {\r\n  expiresAt: token.expiresAt,\r\n});\r\n\r\n// Frontend can handle specifically\r\nif (error.error === 'token_expired') {\r\n  refreshToken();\r\n}\r\n```\r\n\r\n### 4. Leverage Context Detection\r\n\r\n```typescript\r\n// ✅ Good - Let the library detect context automatically\r\nthrow new NotFoundException(ErrorCode.RESOURCE_NOT_FOUND, 'User not found');\r\n\r\n// ⚠️ Only override when necessary\r\nthrow new NotFoundException(\r\n  ErrorCode.RESOURCE_NOT_FOUND,\r\n  'User not found',\r\n  {},\r\n  { context: ContextType.HTTP },\r\n);\r\n```\r\n\r\n### 5. Create Domain-Specific Exceptions\r\n\r\n```typescript\r\n// Create reusable exceptions for your domain\r\nexport class UserNotFoundException extends NotFoundException {\r\n  constructor(userId: number) {\r\n    super(ErrorCode.RESOURCE_NOT_FOUND, `User with ID ${userId} not found`, {\r\n      resourceType: 'User',\r\n      resourceId: userId,\r\n      action: 'read',\r\n    });\r\n  }\r\n}\r\n\r\nexport class InvalidUserCredentialsException extends UnauthorizedException {\r\n  constructor(email: string) {\r\n    super(ErrorCode.INVALID_CREDENTIALS, 'Invalid email or password', {\r\n      email,\r\n      loginAttempt: new Date().toISOString(),\r\n    });\r\n  }\r\n}\r\n```\r\n\r\n### 6. Handle Async Errors Properly\r\n\r\n```typescript\r\n// ✅ Good - Let errors bubble up\r\nasync findUser(id: number) {\r\n  const user = await this.repository.findOne(id);\r\n  if (!user) {\r\n    throw new NotFoundException(/* ... */);\r\n  }\r\n  return user;\r\n}\r\n\r\n// ❌ Bad - Catching and swallowing errors\r\nasync findUser(id: number) {\r\n  try {\r\n    return await this.repository.findOne(id);\r\n  } catch (error) {\r\n    console.log(error); // Don't do this\r\n    return null;\r\n  }\r\n}\r\n```\r\n\r\n## 📖 Documentation\r\n\r\n- [API Reference](./docs/exceptions/api/README.md) - Complete API documentation\r\n- [Architecture Guide](./docs/exceptions/architecture.md) - Design decisions and architecture\r\n- [Usage Examples](./docs/exceptions/guides/usage-examples.md) - Detailed usage patterns\r\n- [Migration Guide](./MIGRATION.md) - Upgrading from previous versions\r\n- [Contributing](./CONTRIBUTING.md) - How to contribute to this project\r\n\r\n## 🤝 Contributing\r\n\r\nContributions are welcome! Please read our [Contributing Guide](./CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.\r\n\r\n## 📝 License\r\n\r\nThis project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.\r\n\r\n## 🔗 Links\r\n\r\n- [GitHub Repository](https://github.com/AltCompagny/nestjs-exceptions)\r\n- [npm Package](https://www.npmjs.com/package/@altbzh/nestjs-exceptions)\r\n- [Issue Tracker](https://github.com/AltCompagny/nestjs-exceptions/issues)\r\n- [NestJS Documentation](https://docs.nestjs.com/)\r\n\r\n## 💡 Support\r\n\r\nIf you have any questions or need help, please:\r\n\r\n1. Check the [documentation](./docs/exceptions/api/README.md)\r\n2. Search [existing issues](https://github.com/AltCompagny/nestjs-exceptions/issues)\r\n3. Create a [new issue](https://github.com/AltCompagny/nestjs-exceptions/issues/new) if needed\r\n\r\n---\r\n\r\n**Built with ❤️ for the NestJS community**\r\n","readmeFilename":"README.md","_rev":"1-b8425feb3eee7a8cd02f569d48030cef"}