@lyxa.ai/core 1.0.38 → 1.0.40

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.
Files changed (198) hide show
  1. package/dist/index.js +6 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/libraries/auth/index.js.map +1 -1
  4. package/dist/libraries/auth/refreshtoken.js.map +1 -1
  5. package/dist/libraries/auth/repository.js.map +1 -1
  6. package/dist/libraries/configuration/index.js.map +1 -1
  7. package/dist/libraries/configuration/types/EnvironmentConfigurationType.js.map +1 -1
  8. package/dist/libraries/dispatcher/index.js.map +1 -1
  9. package/dist/libraries/event/BaseEvent.js.map +1 -1
  10. package/dist/libraries/event/decorators/metadata.js.map +1 -1
  11. package/dist/libraries/event/decorators/subscribe.js.map +1 -1
  12. package/dist/libraries/event/index.js.map +1 -1
  13. package/dist/libraries/event/registry/SubscriptionRegistry.js.map +1 -1
  14. package/dist/libraries/event/test/OrderCreationEvent.js.map +1 -1
  15. package/dist/libraries/firebase/index.js.map +1 -1
  16. package/dist/libraries/index.d.ts +2 -0
  17. package/dist/libraries/index.js +4 -0
  18. package/dist/libraries/index.js.map +1 -1
  19. package/dist/libraries/logger/index.js.map +1 -1
  20. package/dist/libraries/map/index.d.ts +2 -0
  21. package/dist/libraries/map/index.js +19 -0
  22. package/dist/libraries/map/index.js.map +1 -0
  23. package/dist/libraries/map/interfaces/IMapService.d.ts +31 -0
  24. package/dist/libraries/map/interfaces/IMapService.js +3 -0
  25. package/dist/libraries/map/interfaces/IMapService.js.map +1 -0
  26. package/dist/libraries/map/mapService.d.ts +8 -0
  27. package/dist/libraries/map/mapService.js +45 -0
  28. package/dist/libraries/map/mapService.js.map +1 -0
  29. package/dist/libraries/map/providers/google-maps.d.ts +7 -0
  30. package/dist/libraries/map/providers/google-maps.js +134 -0
  31. package/dist/libraries/map/providers/google-maps.js.map +1 -0
  32. package/dist/libraries/map/providers/index.d.ts +1 -0
  33. package/dist/libraries/map/providers/index.js +18 -0
  34. package/dist/libraries/map/providers/index.js.map +1 -0
  35. package/dist/libraries/mongo/index.js.map +1 -1
  36. package/dist/libraries/mongo/models/activity-log.model.js.map +1 -1
  37. package/dist/libraries/mongo/models/admin-access-control.model.js.map +1 -1
  38. package/dist/libraries/mongo/models/admin.model.js.map +1 -1
  39. package/dist/libraries/mongo/models/app-screen-setting.model.js.map +1 -1
  40. package/dist/libraries/mongo/models/attribute.model.js.map +1 -1
  41. package/dist/libraries/mongo/models/banner.model.js.map +1 -1
  42. package/dist/libraries/mongo/models/base/base-review.model.js.map +1 -1
  43. package/dist/libraries/mongo/models/bob-finance.model.js.map +1 -1
  44. package/dist/libraries/mongo/models/brand.model.js.map +1 -1
  45. package/dist/libraries/mongo/models/card.model.js.map +1 -1
  46. package/dist/libraries/mongo/models/cart-participant.model.js.map +1 -1
  47. package/dist/libraries/mongo/models/cart.model.js.map +1 -1
  48. package/dist/libraries/mongo/models/category.model.js.map +1 -1
  49. package/dist/libraries/mongo/models/core-auth-identity.model.js.map +1 -1
  50. package/dist/libraries/mongo/models/core-user.model.js.map +1 -1
  51. package/dist/libraries/mongo/models/counter.model.js.map +1 -1
  52. package/dist/libraries/mongo/models/coupon.model.js.map +1 -1
  53. package/dist/libraries/mongo/models/deal-setting.model.js.map +1 -1
  54. package/dist/libraries/mongo/models/dish.model.js.map +1 -1
  55. package/dist/libraries/mongo/models/embedded/charge.model.js.map +1 -1
  56. package/dist/libraries/mongo/models/embedded/delivery-charge-setting.model.d.ts +10 -0
  57. package/dist/libraries/mongo/models/embedded/{charge-setting.model.js → delivery-charge-setting.model.js} +16 -25
  58. package/dist/libraries/mongo/models/embedded/delivery-charge-setting.model.js.map +1 -0
  59. package/dist/libraries/mongo/models/embedded/delivery-info.model.js.map +1 -1
  60. package/dist/libraries/mongo/models/embedded/line-item-attribute.model.js.map +1 -1
  61. package/dist/libraries/mongo/models/embedded/marketing-cut.model.d.ts +17 -0
  62. package/dist/libraries/mongo/models/embedded/marketing-cut.model.js +69 -0
  63. package/dist/libraries/mongo/models/embedded/marketing-cut.model.js.map +1 -0
  64. package/dist/libraries/mongo/models/embedded/order-cancel.model.js.map +1 -1
  65. package/dist/libraries/mongo/models/embedded/order-pricing.model.d.ts +2 -6
  66. package/dist/libraries/mongo/models/embedded/order-pricing.model.js +4 -24
  67. package/dist/libraries/mongo/models/embedded/order-pricing.model.js.map +1 -1
  68. package/dist/libraries/mongo/models/embedded/otp-fields.model.js.map +1 -1
  69. package/dist/libraries/mongo/models/embedded/parent-document.model.js.map +1 -1
  70. package/dist/libraries/mongo/models/embedded/payment-attempt.model.js.map +1 -1
  71. package/dist/libraries/mongo/models/embedded/payment-infromation.model.js +3 -8
  72. package/dist/libraries/mongo/models/embedded/payment-infromation.model.js.map +1 -1
  73. package/dist/libraries/mongo/models/embedded/price-breakdown.model.js.map +1 -1
  74. package/dist/libraries/mongo/models/embedded/profit.model.d.ts +14 -0
  75. package/dist/libraries/mongo/models/embedded/profit.model.js +63 -0
  76. package/dist/libraries/mongo/models/embedded/profit.model.js.map +1 -0
  77. package/dist/libraries/mongo/models/embedded/rider-equipment.model.js.map +1 -1
  78. package/dist/libraries/mongo/models/embedded/shop-document.model.js.map +1 -1
  79. package/dist/libraries/mongo/models/embedded/status-timeline.model.js.map +1 -1
  80. package/dist/libraries/mongo/models/embedded/vat.model.d.ts +4 -0
  81. package/dist/libraries/mongo/models/embedded/vat.model.js +27 -0
  82. package/dist/libraries/mongo/models/embedded/vat.model.js.map +1 -0
  83. package/dist/libraries/mongo/models/embedded/zone-geometry.mode.js.map +1 -1
  84. package/dist/libraries/mongo/models/faq.model.js.map +1 -1
  85. package/dist/libraries/mongo/models/favourite.model.js.map +1 -1
  86. package/dist/libraries/mongo/models/featured-setting.model.js.map +1 -1
  87. package/dist/libraries/mongo/models/filter-container.model.js.map +1 -1
  88. package/dist/libraries/mongo/models/finance-settlement.model.d.ts +18 -0
  89. package/dist/libraries/mongo/models/finance-settlement.model.js +68 -0
  90. package/dist/libraries/mongo/models/finance-settlement.model.js.map +1 -0
  91. package/dist/libraries/mongo/models/gallery.model.js.map +1 -1
  92. package/dist/libraries/mongo/models/index.d.ts +28 -16
  93. package/dist/libraries/mongo/models/index.js +30 -18
  94. package/dist/libraries/mongo/models/index.js.map +1 -1
  95. package/dist/libraries/mongo/models/line-item.model.js.map +1 -1
  96. package/dist/libraries/mongo/models/list-container.model.js.map +1 -1
  97. package/dist/libraries/mongo/models/loyalty-point-category.model.js.map +1 -1
  98. package/dist/libraries/mongo/models/loyalty-point-setting.model.js.map +1 -1
  99. package/dist/libraries/mongo/models/marketing.model.js +3 -0
  100. package/dist/libraries/mongo/models/marketing.model.js.map +1 -1
  101. package/dist/libraries/mongo/models/meal-plan.model.js.map +1 -1
  102. package/dist/libraries/mongo/models/notification.model.js.map +1 -1
  103. package/dist/libraries/mongo/models/nutrition.model.js.map +1 -1
  104. package/dist/libraries/mongo/models/order-delivery.model.js.map +1 -1
  105. package/dist/libraries/mongo/models/order-finance.model.d.ts +12 -0
  106. package/dist/libraries/mongo/models/order-finance.model.js +45 -0
  107. package/dist/libraries/mongo/models/order-finance.model.js.map +1 -0
  108. package/dist/libraries/mongo/models/order-payment.model.d.ts +0 -4
  109. package/dist/libraries/mongo/models/order-payment.model.js +2 -14
  110. package/dist/libraries/mongo/models/order-payment.model.js.map +1 -1
  111. package/dist/libraries/mongo/models/order.model.js.map +1 -1
  112. package/dist/libraries/mongo/models/parent.model.js.map +1 -1
  113. package/dist/libraries/mongo/models/product-marketing.model.js.map +1 -1
  114. package/dist/libraries/mongo/models/product.model.js.map +1 -1
  115. package/dist/libraries/mongo/models/providers/areeba-card.model.js.map +1 -1
  116. package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js.map +1 -1
  117. package/dist/libraries/mongo/models/providers/core-apple-auth-identity.model.js.map +1 -1
  118. package/dist/libraries/mongo/models/providers/core-email-auth-identity.model.js.map +1 -1
  119. package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js.map +1 -1
  120. package/dist/libraries/mongo/models/providers/core-phone-auth-identity.model.js.map +1 -1
  121. package/dist/libraries/mongo/models/providers/courier-order-finance.model.d.ts +7 -0
  122. package/dist/libraries/mongo/models/providers/courier-order-finance.model.js +26 -0
  123. package/dist/libraries/mongo/models/providers/courier-order-finance.model.js.map +1 -0
  124. package/dist/libraries/mongo/models/providers/courier-order.model.js.map +1 -1
  125. package/dist/libraries/mongo/models/providers/custom-coupon.model.js.map +1 -1
  126. package/dist/libraries/mongo/models/providers/discount-marketing.model.d.ts +1 -1
  127. package/dist/libraries/mongo/models/providers/discount-marketing.model.js +6 -2
  128. package/dist/libraries/mongo/models/providers/discount-marketing.model.js.map +1 -1
  129. package/dist/libraries/mongo/models/providers/featured-marketing.model.js.map +1 -1
  130. package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js.map +1 -1
  131. package/dist/libraries/mongo/models/providers/global-coupon.model.js.map +1 -1
  132. package/dist/libraries/mongo/models/providers/individual-store-coupon.model.d.ts +1 -1
  133. package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js +1 -1
  134. package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js.map +1 -1
  135. package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js.map +1 -1
  136. package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js.map +1 -1
  137. package/dist/libraries/mongo/models/providers/punch-marketing.model.js.map +1 -1
  138. package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js.map +1 -1
  139. package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.d.ts +1 -1
  140. package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js +3 -3
  141. package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js.map +1 -1
  142. package/dist/libraries/mongo/models/providers/regular-order-finance.model.d.ts +18 -0
  143. package/dist/libraries/mongo/models/providers/regular-order-finance.model.js +73 -0
  144. package/dist/libraries/mongo/models/providers/regular-order-finance.model.js.map +1 -0
  145. package/dist/libraries/mongo/models/providers/regular-order.model.js.map +1 -1
  146. package/dist/libraries/mongo/models/punch-marketing-history.model.js.map +1 -1
  147. package/dist/libraries/mongo/models/rating-setting.model.js.map +1 -1
  148. package/dist/libraries/mongo/models/referral-setting.model.js.map +1 -1
  149. package/dist/libraries/mongo/models/request-area.model.js.map +1 -1
  150. package/dist/libraries/mongo/models/rider-review.model.js.map +1 -1
  151. package/dist/libraries/mongo/models/rider-timeout.model.js.map +1 -1
  152. package/dist/libraries/mongo/models/rider-tracking.model.js.map +1 -1
  153. package/dist/libraries/mongo/models/rider.model.js.map +1 -1
  154. package/dist/libraries/mongo/models/role.model.js.map +1 -1
  155. package/dist/libraries/mongo/models/setting.model.d.ts +2 -2
  156. package/dist/libraries/mongo/models/setting.model.js +5 -5
  157. package/dist/libraries/mongo/models/setting.model.js.map +1 -1
  158. package/dist/libraries/mongo/models/shared/address.model.js.map +1 -1
  159. package/dist/libraries/mongo/models/shared/geo-location.model.js.map +1 -1
  160. package/dist/libraries/mongo/models/shared/work-hour.model.js.map +1 -1
  161. package/dist/libraries/mongo/models/shop-access-control.model.js.map +1 -1
  162. package/dist/libraries/mongo/models/shop-category.model.js.map +1 -1
  163. package/dist/libraries/mongo/models/shop-meal-plan.model.js.map +1 -1
  164. package/dist/libraries/mongo/models/shop-review.model.js.map +1 -1
  165. package/dist/libraries/mongo/models/shop.model.js.map +1 -1
  166. package/dist/libraries/mongo/models/subscription-setting.model.js.map +1 -1
  167. package/dist/libraries/mongo/models/subscription.model.js.map +1 -1
  168. package/dist/libraries/mongo/models/tag.model.js.map +1 -1
  169. package/dist/libraries/mongo/models/user.model.js.map +1 -1
  170. package/dist/libraries/mongo/models/zone.model.js.map +1 -1
  171. package/dist/libraries/mongo/plugins/soft-delete-plugin.js.map +1 -1
  172. package/dist/libraries/redis/index.js.map +1 -1
  173. package/dist/libraries/secrets/index.js.map +1 -1
  174. package/dist/libraries/trpc/context.js.map +1 -1
  175. package/dist/libraries/trpc/index.js.map +1 -1
  176. package/dist/libraries/trpc/middlewares/auth.js.map +1 -1
  177. package/dist/libraries/trpc/middlewares/cors.js.map +1 -1
  178. package/dist/libraries/trpc/middlewares/phone-verified.js.map +1 -1
  179. package/dist/libraries/twilio/index.js.map +1 -1
  180. package/dist/libraries/upload/index.js.map +1 -1
  181. package/dist/utilities/common/password.js.map +1 -1
  182. package/dist/utilities/common/week.js.map +1 -1
  183. package/dist/utilities/enum.d.ts +12 -1
  184. package/dist/utilities/enum.js +14 -2
  185. package/dist/utilities/enum.js.map +1 -1
  186. package/dist/utilities/error-handler.js.map +1 -1
  187. package/dist/utilities/error-middleware.js.map +1 -1
  188. package/dist/utilities/pagination.js.map +1 -1
  189. package/dist/utilities/response.js.map +1 -1
  190. package/dist/utilities/search.js.map +1 -1
  191. package/dist/utilities/transformers.js.map +1 -1
  192. package/dist/utilities/validation/common-validation.d.ts +7 -7
  193. package/dist/utilities/validation/common-validation.js.map +1 -1
  194. package/dist/utilities/validation/global-validation.js.map +1 -1
  195. package/dist/utilities/validation/index.js.map +1 -1
  196. package/package.json +52 -50
  197. package/dist/libraries/mongo/models/embedded/charge-setting.model.d.ts +0 -14
  198. package/dist/libraries/mongo/models/embedded/charge-setting.model.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\r\n * Provides centralized error handling, logging, and retry mechanisms.\r\n */\r\n\r\nimport { TRPCError } from '@trpc/server';\r\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\r\nimport { ZodError } from 'zod';\r\n\r\n/**\r\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\r\n * Provides error transformation, logging, and retry mechanisms.\r\n */\r\nexport class ErrorHandler {\r\n\t/**\r\n\t * Configuration options for error handling behavior\r\n\t * @private\r\n\t */\r\n\tprivate static readonly CONFIG = {\r\n\t\t/** Whether to log errors to console */\r\n\t\tshouldLogErrors: true,\r\n\t\t/** Maximum number of stack trace lines to include in logs */\r\n\t\tmaxStackTraceLines: 10,\r\n\t\t/** Set of error codes that are considered retryable */\r\n\t\tretryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\r\n\t};\r\n\r\n\t/**\r\n\t * Mapping of MongoDB error codes to TRPC error types and messages\r\n\t * @private\r\n\t */\r\n\tprivate static readonly MONGO_ERROR_CODES: Record<\r\n\t\tnumber,\r\n\t\t{\r\n\t\t\tcode: TRPCError['code'];\r\n\t\t\tmessage: string;\r\n\t\t}\r\n\t> = {\r\n\t\t11000: { code: 'CONFLICT', message: 'Duplicate key error: A record with this value already exists.' },\r\n\t\t11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\r\n\t\t121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\r\n\t\t7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\r\n\t\t89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\r\n\t\t91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\r\n\t\t189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\r\n\t\t50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\r\n\t};\r\n\r\n\t/**\r\n\t * Logs error information with metadata and stack trace\r\n\t * @private\r\n\t * @param error - The error to log\r\n\t * @param context - Additional context information for the error\r\n\t */\r\n\tprivate static logError(error: unknown, context: Record<string, unknown> = {}): void {\r\n\t\tif (!this.CONFIG.shouldLogErrors) return;\r\n\r\n\t\tconst errorMeta = this.extractErrorMetadata(error);\r\n\t\tconst timestamp = new Date().toISOString();\r\n\r\n\t\tconst logData = {\r\n\t\t\ttimestamp,\r\n\t\t\ttype: errorMeta.type,\r\n\t\t\tmessage: error instanceof Error ? error.message : 'Unknown error',\r\n\t\t\tstack:\r\n\t\t\t\terror instanceof Error\r\n\t\t\t\t\t? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\r\n\t\t\t\t\t: undefined,\r\n\t\t\tcontext,\r\n\t\t\tmetadata: errorMeta,\r\n\t\t};\r\n\r\n\t\tconsole.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\r\n\t}\r\n\r\n\t/**\r\n\t * Main error handling method that transforms various error types into TRPC errors\r\n\t * @param error - The error to handle\r\n\t * @param customMessage - Optional custom error message\r\n\t * @param context - Additional context information\r\n\t * @throws {TRPCError} Transformed error with appropriate error code and message\r\n\t */\r\n\tpublic static handleError(\r\n\t\terror: unknown,\r\n\t\tcustomMessage = 'An unexpected error occurred',\r\n\t\tcontext: Record<string, unknown> = {}\r\n\t): never {\r\n\t\tthis.logError(error, context);\r\n\r\n\t\tif (error instanceof TRPCError) {\r\n\t\t\tthrow error;\r\n\t\t}\r\n\r\n\t\tif (error instanceof ZodError) {\r\n\t\t\ttry {\r\n\t\t\t\tconsole.log('ZodError:', error.flatten());\r\n\t\t\t\tconst formatted = error.errors.map(e => ({\r\n\t\t\t\t\tfield: e.path.join('.'),\r\n\t\t\t\t\tmessage: e.message,\r\n\t\t\t\t}));\r\n\r\n\t\t\t\tthrow new TRPCError({\r\n\t\t\t\t\tcode: 'BAD_REQUEST',\r\n\t\t\t\t\tmessage: 'Validation error',\r\n\t\t\t\t\tcause: formatted,\r\n\t\t\t\t});\r\n\t\t\t} catch (err) {\r\n\t\t\t\t// Handle any issues with flattening or logging\r\n\t\t\t\tconsole.error('Error while processing ZodError:', err);\r\n\t\t\t\tthrow new TRPCError({\r\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\t\t\tmessage: 'Error processing validation error',\r\n\t\t\t\t\tcause: err,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (error instanceof MongoNetworkError) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\t\tmessage: 'Database connection error',\r\n\t\t\t\tcause: error,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.isMongoError(error)) {\r\n\t\t\tthrow this.createMongoTRPCError(error);\r\n\t\t}\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: this.mapNodeErrorCode(error),\r\n\t\t\t\tmessage: error.message || customMessage,\r\n\t\t\t\tcause: error,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthrow new TRPCError({\r\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tmessage: customMessage,\r\n\t\t\tcause: error,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Type guard to check if an error is a MongoDB error\r\n\t * @private\r\n\t * @param error - The error to check\r\n\t * @returns True if the error is a MongoDB error\r\n\t */\r\n\tprivate static isMongoError(error: unknown): error is MongoServerError {\r\n\t\treturn (\r\n\t\t\terror instanceof MongoServerError ||\r\n\t\t\terror instanceof MongoError ||\r\n\t\t\t(typeof error === 'object' &&\r\n\t\t\t\terror !== null &&\r\n\t\t\t\t'code' in error &&\r\n\t\t\t\t'name' in error &&\r\n\t\t\t\t((error as MongoServerError).name === 'MongoServerError' ||\r\n\t\t\t\t\t(error as MongoServerError).name === 'MongoError'))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a TRPC error from a MongoDB error\r\n\t * @private\r\n\t * @param error - MongoDB error to transform\r\n\t * @returns Transformed TRPC error\r\n\t */\r\n\tprivate static createMongoTRPCError(error: MongoServerError): TRPCError {\r\n\t\tconst errorCode = typeof error.code === 'number' ? error.code : 0;\r\n\t\tconst errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\r\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tmessage: `Database error occurred. Code: ${errorCode}`,\r\n\t\t};\r\n\r\n\t\treturn new TRPCError({\r\n\t\t\tcode: errorInfo.code,\r\n\t\t\tmessage: errorInfo.message,\r\n\t\t\tcause: error,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Maps Node.js error codes to TRPC error codes\r\n\t * @private\r\n\t * @param error - Node.js error to map\r\n\t * @returns Appropriate TRPC error code\r\n\t */\r\n\tprivate static mapNodeErrorCode(error: Error): TRPCError['code'] {\r\n\t\tconst nodeErrorMap: Record<string, TRPCError['code']> = {\r\n\t\t\tENOENT: 'NOT_FOUND',\r\n\t\t\tEACCES: 'FORBIDDEN',\r\n\t\t\tECONNREFUSED: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tECONNRESET: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tETIMEDOUT: 'TIMEOUT',\r\n\t\t\tEPIPE: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tENOTFOUND: 'NOT_FOUND',\r\n\t\t\tEINVAL: 'BAD_REQUEST',\r\n\t\t\tEMFILE: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tEPERM: 'FORBIDDEN',\r\n\t\t};\r\n\r\n\t\tconst code = (error as NodeJS.ErrnoException).code;\r\n\t\treturn code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\r\n\t}\r\n\r\n\t/**\r\n\t * Wraps an async function with error handling\r\n\t * @param fn - Async function to wrap\r\n\t * @param context - Additional context information\r\n\t * @returns Promise resolving to the function's return type\r\n\t * @throws {TRPCError} If the function throws an error\r\n\t */\r\n\tpublic static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\r\n\t\ttry {\r\n\t\t\treturn await fn();\r\n\t\t} catch (error) {\r\n\t\t\tthis.handleError(error, undefined, context);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Executes an async function with retry mechanism for transient errors\r\n\t * @param fn - Async function to execute\r\n\t * @param options - Retry configuration options\r\n\t * @returns Promise resolving to the function's return type\r\n\t * @throws {TRPCError} If all retry attempts fail\r\n\t */\r\n\tpublic static async withRetry<T>(\r\n\t\tfn: () => Promise<T>,\r\n\t\toptions: {\r\n\t\t\tmaxAttempts?: number;\r\n\t\t\tdelayMs?: number;\r\n\t\t\tbackoffFactor?: number;\r\n\t\t\tcontext?: Record<string, unknown>;\r\n\t\t} = {}\r\n\t): Promise<T> {\r\n\t\tconst { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\r\n\r\n\t\tlet lastError: unknown;\r\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n\t\t\ttry {\r\n\t\t\t\treturn await fn();\r\n\t\t\t} catch (error) {\r\n\t\t\t\tlastError = error;\r\n\r\n\t\t\t\tconst isRetryable = this.isRetryableError(error);\r\n\t\t\t\tconst isLastAttempt = attempt === maxAttempts;\r\n\r\n\t\t\t\tif (!isRetryable || isLastAttempt) {\r\n\t\t\t\t\tthis.handleError(error, undefined, { ...context, attempt });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow lastError;\r\n\t}\r\n\r\n\t/**\r\n\t * Determines if an error is retryable\r\n\t * @private\r\n\t * @param error - The error to check\r\n\t * @returns True if the error is retryable\r\n\t */\r\n\tprivate static isRetryableError(error: unknown): boolean {\r\n\t\tif (error instanceof MongoNetworkError) return true;\r\n\t\tif (error instanceof Error) {\r\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\r\n\t\t\treturn code ? this.CONFIG.retryableErrors.has(code) : false;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Extracts metadata from an error for logging and analysis\r\n\t * @param error - The error to extract metadata from\r\n\t * @returns Object containing error type, original error, and additional details\r\n\t */\r\n\tpublic static extractErrorMetadata(error: unknown): {\r\n\t\ttype: string;\r\n\t\toriginalError: unknown;\r\n\t\tdetails?: Record<string, unknown>;\r\n\t} {\r\n\t\tif (error instanceof TRPCError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'TRPCError',\r\n\t\t\t\toriginalError: error.cause ?? error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tcode: error.code,\r\n\t\t\t\t\tmessage: error.message,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof ZodError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'ZodError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: error.flatten(),\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof MongoNetworkError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'MongoNetworkError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tmessage: error.message,\r\n\t\t\t\t\tisRetryable: true,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (this.isMongoError(error)) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'MongoError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tcode: (error as MongoServerError).code,\r\n\t\t\t\t\tcodeName: (error as MongoServerError).codeName,\r\n\t\t\t\t\tkeyPattern: (error as MongoServerError).keyPattern,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'NodeError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tname: error.name,\r\n\t\t\t\t\tcode: (error as NodeJS.ErrnoException).code,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn { type: 'UnknownError', originalError: error };\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\n * Provides centralized error handling, logging, and retry mechanisms.\n */\n\nimport { TRPCError } from '@trpc/server';\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\nimport { ZodError } from 'zod';\n\n/**\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\n * Provides error transformation, logging, and retry mechanisms.\n */\nexport class ErrorHandler {\n\t/**\n\t * Configuration options for error handling behavior\n\t * @private\n\t */\n\tprivate static readonly CONFIG = {\n\t\t/** Whether to log errors to console */\n\t\tshouldLogErrors: true,\n\t\t/** Maximum number of stack trace lines to include in logs */\n\t\tmaxStackTraceLines: 10,\n\t\t/** Set of error codes that are considered retryable */\n\t\tretryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\n\t};\n\n\t/**\n\t * Mapping of MongoDB error codes to TRPC error types and messages\n\t * @private\n\t */\n\tprivate static readonly MONGO_ERROR_CODES: Record<\n\t\tnumber,\n\t\t{\n\t\t\tcode: TRPCError['code'];\n\t\t\tmessage: string;\n\t\t}\n\t> = {\n\t\t11000: { code: 'CONFLICT', message: 'Duplicate key error: A record with this value already exists.' },\n\t\t11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\n\t\t121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\n\t\t7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\n\t\t89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\n\t\t91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\n\t\t189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\n\t\t50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\n\t};\n\n\t/**\n\t * Logs error information with metadata and stack trace\n\t * @private\n\t * @param error - The error to log\n\t * @param context - Additional context information for the error\n\t */\n\tprivate static logError(error: unknown, context: Record<string, unknown> = {}): void {\n\t\tif (!this.CONFIG.shouldLogErrors) return;\n\n\t\tconst errorMeta = this.extractErrorMetadata(error);\n\t\tconst timestamp = new Date().toISOString();\n\n\t\tconst logData = {\n\t\t\ttimestamp,\n\t\t\ttype: errorMeta.type,\n\t\t\tmessage: error instanceof Error ? error.message : 'Unknown error',\n\t\t\tstack:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\n\t\t\t\t\t: undefined,\n\t\t\tcontext,\n\t\t\tmetadata: errorMeta,\n\t\t};\n\n\t\tconsole.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\n\t}\n\n\t/**\n\t * Main error handling method that transforms various error types into TRPC errors\n\t * @param error - The error to handle\n\t * @param customMessage - Optional custom error message\n\t * @param context - Additional context information\n\t * @throws {TRPCError} Transformed error with appropriate error code and message\n\t */\n\tpublic static handleError(\n\t\terror: unknown,\n\t\tcustomMessage = 'An unexpected error occurred',\n\t\tcontext: Record<string, unknown> = {}\n\t): never {\n\t\tthis.logError(error, context);\n\n\t\tif (error instanceof TRPCError) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\ttry {\n\t\t\t\tconsole.log('ZodError:', error.flatten());\n\t\t\t\tconst formatted = error.errors.map(e => ({\n\t\t\t\t\tfield: e.path.join('.'),\n\t\t\t\t\tmessage: e.message,\n\t\t\t\t}));\n\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'BAD_REQUEST',\n\t\t\t\t\tmessage: 'Validation error',\n\t\t\t\t\tcause: formatted,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\t// Handle any issues with flattening or logging\n\t\t\t\tconsole.error('Error while processing ZodError:', err);\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'Error processing validation error',\n\t\t\t\t\tcause: err,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Database connection error',\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\tthrow this.createMongoTRPCError(error);\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: this.mapNodeErrorCode(error),\n\t\t\t\tmessage: error.message || customMessage,\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\n\t\tthrow new TRPCError({\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: customMessage,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Type guard to check if an error is a MongoDB error\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is a MongoDB error\n\t */\n\tprivate static isMongoError(error: unknown): error is MongoServerError {\n\t\treturn (\n\t\t\terror instanceof MongoServerError ||\n\t\t\terror instanceof MongoError ||\n\t\t\t(typeof error === 'object' &&\n\t\t\t\terror !== null &&\n\t\t\t\t'code' in error &&\n\t\t\t\t'name' in error &&\n\t\t\t\t((error as MongoServerError).name === 'MongoServerError' ||\n\t\t\t\t\t(error as MongoServerError).name === 'MongoError'))\n\t\t);\n\t}\n\n\t/**\n\t * Creates a TRPC error from a MongoDB error\n\t * @private\n\t * @param error - MongoDB error to transform\n\t * @returns Transformed TRPC error\n\t */\n\tprivate static createMongoTRPCError(error: MongoServerError): TRPCError {\n\t\tconst errorCode = typeof error.code === 'number' ? error.code : 0;\n\t\tconst errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\tmessage: `Database error occurred. Code: ${errorCode}`,\n\t\t};\n\n\t\treturn new TRPCError({\n\t\t\tcode: errorInfo.code,\n\t\t\tmessage: errorInfo.message,\n\t\t\tcause: error,\n\t\t});\n\t}\n\n\t/**\n\t * Maps Node.js error codes to TRPC error codes\n\t * @private\n\t * @param error - Node.js error to map\n\t * @returns Appropriate TRPC error code\n\t */\n\tprivate static mapNodeErrorCode(error: Error): TRPCError['code'] {\n\t\tconst nodeErrorMap: Record<string, TRPCError['code']> = {\n\t\t\tENOENT: 'NOT_FOUND',\n\t\t\tEACCES: 'FORBIDDEN',\n\t\t\tECONNREFUSED: 'INTERNAL_SERVER_ERROR',\n\t\t\tECONNRESET: 'INTERNAL_SERVER_ERROR',\n\t\t\tETIMEDOUT: 'TIMEOUT',\n\t\t\tEPIPE: 'INTERNAL_SERVER_ERROR',\n\t\t\tENOTFOUND: 'NOT_FOUND',\n\t\t\tEINVAL: 'BAD_REQUEST',\n\t\t\tEMFILE: 'INTERNAL_SERVER_ERROR',\n\t\t\tEPERM: 'FORBIDDEN',\n\t\t};\n\n\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\treturn code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\n\t}\n\n\t/**\n\t * Wraps an async function with error handling\n\t * @param fn - Async function to wrap\n\t * @param context - Additional context information\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If the function throws an error\n\t */\n\tpublic static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\n\t\ttry {\n\t\t\treturn await fn();\n\t\t} catch (error) {\n\t\t\tthis.handleError(error, undefined, context);\n\t\t}\n\t}\n\n\t/**\n\t * Executes an async function with retry mechanism for transient errors\n\t * @param fn - Async function to execute\n\t * @param options - Retry configuration options\n\t * @returns Promise resolving to the function's return type\n\t * @throws {TRPCError} If all retry attempts fail\n\t */\n\tpublic static async withRetry<T>(\n\t\tfn: () => Promise<T>,\n\t\toptions: {\n\t\t\tmaxAttempts?: number;\n\t\t\tdelayMs?: number;\n\t\t\tbackoffFactor?: number;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t} = {}\n\t): Promise<T> {\n\t\tconst { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\n\n\t\tlet lastError: unknown;\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\ttry {\n\t\t\t\treturn await fn();\n\t\t\t} catch (error) {\n\t\t\t\tlastError = error;\n\n\t\t\t\tconst isRetryable = this.isRetryableError(error);\n\t\t\t\tconst isLastAttempt = attempt === maxAttempts;\n\n\t\t\t\tif (!isRetryable || isLastAttempt) {\n\t\t\t\t\tthis.handleError(error, undefined, { ...context, attempt });\n\t\t\t\t}\n\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\n\t\t\t}\n\t\t}\n\n\t\tthrow lastError;\n\t}\n\n\t/**\n\t * Determines if an error is retryable\n\t * @private\n\t * @param error - The error to check\n\t * @returns True if the error is retryable\n\t */\n\tprivate static isRetryableError(error: unknown): boolean {\n\t\tif (error instanceof MongoNetworkError) return true;\n\t\tif (error instanceof Error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\treturn code ? this.CONFIG.retryableErrors.has(code) : false;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Extracts metadata from an error for logging and analysis\n\t * @param error - The error to extract metadata from\n\t * @returns Object containing error type, original error, and additional details\n\t */\n\tpublic static extractErrorMetadata(error: unknown): {\n\t\ttype: string;\n\t\toriginalError: unknown;\n\t\tdetails?: Record<string, unknown>;\n\t} {\n\t\tif (error instanceof TRPCError) {\n\t\t\treturn {\n\t\t\t\ttype: 'TRPCError',\n\t\t\t\toriginalError: error.cause ?? error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: error.code,\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof ZodError) {\n\t\t\treturn {\n\t\t\t\ttype: 'ZodError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: error.flatten(),\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof MongoNetworkError) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoNetworkError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tmessage: error.message,\n\t\t\t\t\tisRetryable: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (this.isMongoError(error)) {\n\t\t\treturn {\n\t\t\t\ttype: 'MongoError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tcode: (error as MongoServerError).code,\n\t\t\t\t\tcodeName: (error as MongoServerError).codeName,\n\t\t\t\t\tkeyPattern: (error as MongoServerError).keyPattern,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\ttype: 'NodeError',\n\t\t\t\toriginalError: error,\n\t\t\t\tdetails: {\n\t\t\t\t\tname: error.name,\n\t\t\t\t\tcode: (error as NodeJS.ErrnoException).code,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn { type: 'UnknownError', originalError: error };\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { ErrorHandler } from './error-handler';\r\nimport * as util from 'util';\r\n\r\n/**\r\n * Parameters for the tRPC error handler\r\n * @typedef {Object} ErrorHandlerParams\r\n * @property {TRPCError|Error|unknown} error - The error object to handle\r\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\r\n * @property {string|undefined} path - The path of the tRPC procedure\r\n * @property {Record<string,any>|undefined} ctx - The context of the request\r\n * @property {any} req - The request object\r\n * @property {unknown} input - The input parameters for the procedure\r\n */\r\ninterface ErrorHandlerParams {\r\n\terror: TRPCError | Error | unknown;\r\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\r\n\tpath: string | undefined;\r\n\tctx: Record<string, any> | undefined;\r\n\treq: any;\r\n\tinput: unknown;\r\n}\r\n\r\n/**\r\n * Structure of validation errors from zod validation\r\n * @typedef {Object} ValidationError\r\n * @property {string} code - The error code (e.g., 'invalid_type')\r\n * @property {string} expected - The expected type or value\r\n * @property {string} received - The received type or value\r\n * @property {(string|number)[]} path - The path to the field with the error\r\n * @property {string} message - The error message\r\n */\r\ninterface ValidationError {\r\n\tcode: string;\r\n\texpected: string;\r\n\treceived: string;\r\n\tpath: (string | number)[];\r\n\tmessage: string;\r\n}\r\n\r\n/**\r\n * Central error handler for tRPC HTTP server.\r\n *\r\n * This handler provides comprehensive error logging with structured, formatted output in the console.\r\n * It specializes in handling validation errors from zod schemas, presenting them in a readable format\r\n * both for console debugging and client response.\r\n *\r\n * Key features:\r\n * - Beautiful console formatting with box-styled outputs\r\n * - Special handling for validation errors with field-by-field breakdown\r\n * - Proper handling of nested error objects and stack traces\r\n * - Integration with ErrorHandler utility for extracting additional metadata\r\n * - Client-friendly error message formatting for validation errors\r\n *\r\n * @param {ErrorHandlerParams} params - The error handler parameters\r\n * @param {TRPCError|Error|unknown} params.error - The error that occurred\r\n * @param {'query'|'mutation'|'subscription'|'unknown'} params.type - Type of tRPC procedure\r\n * @param {string|undefined} params.path - Path of the tRPC procedure\r\n * @param {Record<string,any>|undefined} params.ctx - Request context\r\n * @param {any} params.req - The request object\r\n * @param {unknown} params.input - The input parameters\r\n *\r\n * @returns {void}\r\n */\r\nexport function handleTRPCError({ error, type, path, ctx }: ErrorHandlerParams): void {\r\n\tconst errorContext = {\r\n\t\tprocedurePath: path ?? 'unknown',\r\n\t\tprocedureType: type,\r\n\t\trequestId: ctx?.requestId ?? 'unknown',\r\n\t\ttimestamp: new Date().toISOString(),\r\n\t};\r\n\r\n\tconsole.error(error);\r\n\r\n\t// Print a clear error header with context\r\n\tconsole.error('\\n\\n');\r\n\tconsole.error('╔═══════════════════════════════════════════════════════════════════╗');\r\n\tconsole.error('║ 🔥 TRPC ERROR 🔥 ║');\r\n\tconsole.error('╚═══════════════════════════════════════════════════════════════════╝');\r\n\r\n\t// Print context information in a structured format\r\n\tconsole.error('\\n📋 Error Context:');\r\n\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\tconsole.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);\r\n\tconsole.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);\r\n\tconsole.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);\r\n\tconsole.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);\r\n\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\tif (error instanceof TRPCError) {\r\n\t\t// Print basic error info\r\n\t\tconsole.error('\\n🚨 Error Details:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Code: ${error.code.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Handle validation errors specially\r\n\t\tif (error.code === 'BAD_REQUEST') {\r\n\t\t\ttry {\r\n\t\t\t\tif (error.message.trim().startsWith('[') && error.message.includes('\"code\"')) {\r\n\t\t\t\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\r\n\r\n\t\t\t\t\tconsole.error('\\n📋 Validation Errors:');\r\n\r\n\t\t\t\t\tvalidationErrors.forEach((err, index) => {\r\n\t\t\t\t\t\tconst fieldPath = err.path.join('.');\r\n\t\t\t\t\t\tconsole.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Error: ${err.message.padEnd(53)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\r\n\t\t\t\t\t\t// Add a separator between errors, except for the last one\r\n\t\t\t\t\t\tif (index < validationErrors.length - 1) {\r\n\t\t\t\t\t\t\tconsole.error('│ │');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// Format field errors for the client response\r\n\t\t\t\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\r\n\r\n\t\t\t\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\r\n\r\n\t\t\t\t\t// Print the formatted client message\r\n\t\t\t\t\tconsole.error('\\n📤 Client Response Message:');\r\n\r\n\t\t\t\t\t// Split the message into multiple lines if it's too long\r\n\t\t\t\t\tconst message = error.message;\r\n\t\t\t\t\tconst chunkSize = 65;\r\n\r\n\t\t\t\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\t\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} catch (parseError) {\r\n\t\t\t\tconsole.error('\\n⚠️ Error Parsing Validation Error:');\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Print the error message\r\n\t\tconsole.error('\\n📝 Error Message:');\r\n\r\n\t\t// Split the message into multiple lines if it's too long\r\n\t\tconst message = error.message;\r\n\t\tconst chunkSize = 65;\r\n\r\n\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t}\r\n\r\n\t\t// Print the error cause if available\r\n\t\tif (error.cause) {\r\n\t\t\tconsole.error('\\n🔍 Error Cause:');\r\n\r\n\t\t\t// Use util.inspect to format the cause object nicely\r\n\t\t\tconst causeString = util.inspect(error.cause, { depth: 4, colors: true });\r\n\t\t\tconst causeLines = causeString.split('\\n');\r\n\r\n\t\t\tcauseLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)}`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else if (error instanceof Error) {\r\n\t\t// Handle standard errors\r\n\t\tconsole.error('\\n🚨 Standard Error:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Name: ${error.name.padEnd(54)} │`);\r\n\t\tconsole.error(`│ Message: ${error.message.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)} │`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)} │`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\t// Handle unknown errors\r\n\t\tconsole.error('\\n❓ Unknown Error:');\r\n\r\n\t\tconst errorString = util.inspect(error, { depth: 4, colors: true });\r\n\t\tconst errorLines = errorString.split('\\n');\r\n\r\n\t\terrorLines.forEach(line => {\r\n\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t});\r\n\t}\r\n\r\n\t// Use ErrorHandler's methods for additional metadata\r\n\ttry {\r\n\t\tconst errorMeta = ErrorHandler.extractErrorMetadata(error);\r\n\r\n\t\tif (errorMeta && Object.keys(errorMeta).length > 0) {\r\n\t\t\tconsole.error('\\n🔬 Additional Error Metadata:');\r\n\r\n\t\t\tconst metaString = util.inspect(errorMeta, { depth: 4, colors: true });\r\n\t\t\tconst metaLines = metaString.split('\\n');\r\n\r\n\t\t\tmetaLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (handlingError) {\r\n\t\tconsole.error('\\n⚠️ Error While Extracting Metadata:');\r\n\t\tconsole.error(\r\n\t\t\t`│ ${\r\n\t\t\t\thandlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)\r\n\t\t\t}`\r\n\t\t);\r\n\t}\r\n\r\n\tconsole.error('\\n\\n');\r\n}\r\n"]}
1
+ {"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\nimport { ErrorHandler } from './error-handler';\nimport * as util from 'util';\n\n/**\n * Parameters for the tRPC error handler\n * @typedef {Object} ErrorHandlerParams\n * @property {TRPCError|Error|unknown} error - The error object to handle\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\n * @property {string|undefined} path - The path of the tRPC procedure\n * @property {Record<string,any>|undefined} ctx - The context of the request\n * @property {any} req - The request object\n * @property {unknown} input - The input parameters for the procedure\n */\ninterface ErrorHandlerParams {\n\terror: TRPCError | Error | unknown;\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\n\tpath: string | undefined;\n\tctx: Record<string, any> | undefined;\n\treq: any;\n\tinput: unknown;\n}\n\n/**\n * Structure of validation errors from zod validation\n * @typedef {Object} ValidationError\n * @property {string} code - The error code (e.g., 'invalid_type')\n * @property {string} expected - The expected type or value\n * @property {string} received - The received type or value\n * @property {(string|number)[]} path - The path to the field with the error\n * @property {string} message - The error message\n */\ninterface ValidationError {\n\tcode: string;\n\texpected: string;\n\treceived: string;\n\tpath: (string | number)[];\n\tmessage: string;\n}\n\n/**\n * Central error handler for tRPC HTTP server.\n *\n * This handler provides comprehensive error logging with structured, formatted output in the console.\n * It specializes in handling validation errors from zod schemas, presenting them in a readable format\n * both for console debugging and client response.\n *\n * Key features:\n * - Beautiful console formatting with box-styled outputs\n * - Special handling for validation errors with field-by-field breakdown\n * - Proper handling of nested error objects and stack traces\n * - Integration with ErrorHandler utility for extracting additional metadata\n * - Client-friendly error message formatting for validation errors\n *\n * @param {ErrorHandlerParams} params - The error handler parameters\n * @param {TRPCError|Error|unknown} params.error - The error that occurred\n * @param {'query'|'mutation'|'subscription'|'unknown'} params.type - Type of tRPC procedure\n * @param {string|undefined} params.path - Path of the tRPC procedure\n * @param {Record<string,any>|undefined} params.ctx - Request context\n * @param {any} params.req - The request object\n * @param {unknown} params.input - The input parameters\n *\n * @returns {void}\n */\nexport function handleTRPCError({ error, type, path, ctx }: ErrorHandlerParams): void {\n\tconst errorContext = {\n\t\tprocedurePath: path ?? 'unknown',\n\t\tprocedureType: type,\n\t\trequestId: ctx?.requestId ?? 'unknown',\n\t\ttimestamp: new Date().toISOString(),\n\t};\n\n\tconsole.error(error);\n\n\t// Print a clear error header with context\n\tconsole.error('\\n\\n');\n\tconsole.error('╔═══════════════════════════════════════════════════════════════════╗');\n\tconsole.error('║ 🔥 TRPC ERROR 🔥 ║');\n\tconsole.error('╚═══════════════════════════════════════════════════════════════════╝');\n\n\t// Print context information in a structured format\n\tconsole.error('\\n📋 Error Context:');\n\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\tconsole.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);\n\tconsole.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);\n\tconsole.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);\n\tconsole.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);\n\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\tif (error instanceof TRPCError) {\n\t\t// Print basic error info\n\t\tconsole.error('\\n🚨 Error Details:');\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\t\tconsole.error(`│ Code: ${error.code.padEnd(54)} │`);\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\t\t// Handle validation errors specially\n\t\tif (error.code === 'BAD_REQUEST') {\n\t\t\ttry {\n\t\t\t\tif (error.message.trim().startsWith('[') && error.message.includes('\"code\"')) {\n\t\t\t\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\n\n\t\t\t\t\tconsole.error('\\n📋 Validation Errors:');\n\n\t\t\t\t\tvalidationErrors.forEach((err, index) => {\n\t\t\t\t\t\tconst fieldPath = err.path.join('.');\n\t\t\t\t\t\tconsole.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);\n\t\t\t\t\t\tconsole.error(`│ Error: ${err.message.padEnd(53)} │`);\n\t\t\t\t\t\tconsole.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);\n\t\t\t\t\t\tconsole.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);\n\n\t\t\t\t\t\t// Add a separator between errors, except for the last one\n\t\t\t\t\t\tif (index < validationErrors.length - 1) {\n\t\t\t\t\t\t\tconsole.error('│ │');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// Format field errors for the client response\n\t\t\t\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\n\n\t\t\t\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\n\n\t\t\t\t\t// Print the formatted client message\n\t\t\t\t\tconsole.error('\\n📤 Client Response Message:');\n\n\t\t\t\t\t// Split the message into multiple lines if it's too long\n\t\t\t\t\tconst message = error.message;\n\t\t\t\t\tconst chunkSize = 65;\n\n\t\t\t\t\tfor (let i = 0; i < message.length; i += chunkSize) {\n\t\t\t\t\t\tconst chunk = message.substring(i, i + chunkSize);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (parseError) {\n\t\t\t\tconsole.error('\\n⚠️ Error Parsing Validation Error:');\n\t\t\t\tconsole.error(\n\t\t\t\t\t`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Print the error message\n\t\tconsole.error('\\n📝 Error Message:');\n\n\t\t// Split the message into multiple lines if it's too long\n\t\tconst message = error.message;\n\t\tconst chunkSize = 65;\n\n\t\tfor (let i = 0; i < message.length; i += chunkSize) {\n\t\t\tconst chunk = message.substring(i, i + chunkSize);\n\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t}\n\n\t\t// Print the error cause if available\n\t\tif (error.cause) {\n\t\t\tconsole.error('\\n🔍 Error Cause:');\n\n\t\t\t// Use util.inspect to format the cause object nicely\n\t\t\tconst causeString = util.inspect(error.cause, { depth: 4, colors: true });\n\t\t\tconst causeLines = causeString.split('\\n');\n\n\t\t\tcauseLines.forEach(line => {\n\t\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t\t});\n\t\t}\n\n\t\t// Print stack trace if available\n\t\tif (error.stack) {\n\t\t\tconsole.error('\\n📚 Stack Trace:');\n\n\t\t\tconst stackLines = error.stack.split('\\n');\n\t\t\tstackLines.forEach(line => {\n\t\t\t\t// Truncate or split long lines\n\t\t\t\tif (line.length > 65) {\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)}`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else if (error instanceof Error) {\n\t\t// Handle standard errors\n\t\tconsole.error('\\n🚨 Standard Error:');\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\n\t\tconsole.error(`│ Name: ${error.name.padEnd(54)} │`);\n\t\tconsole.error(`│ Message: ${error.message.padEnd(54)} │`);\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\n\n\t\t// Print stack trace if available\n\t\tif (error.stack) {\n\t\t\tconsole.error('\\n📚 Stack Trace:');\n\n\t\t\tconst stackLines = error.stack.split('\\n');\n\t\t\tstackLines.forEach(line => {\n\t\t\t\t// Truncate or split long lines\n\t\t\t\tif (line.length > 65) {\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)} │`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)} │`);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// Handle unknown errors\n\t\tconsole.error('\\n❓ Unknown Error:');\n\n\t\tconst errorString = util.inspect(error, { depth: 4, colors: true });\n\t\tconst errorLines = errorString.split('\\n');\n\n\t\terrorLines.forEach(line => {\n\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t});\n\t}\n\n\t// Use ErrorHandler's methods for additional metadata\n\ttry {\n\t\tconst errorMeta = ErrorHandler.extractErrorMetadata(error);\n\n\t\tif (errorMeta && Object.keys(errorMeta).length > 0) {\n\t\t\tconsole.error('\\n🔬 Additional Error Metadata:');\n\n\t\t\tconst metaString = util.inspect(errorMeta, { depth: 4, colors: true });\n\t\t\tconst metaLines = metaString.split('\\n');\n\n\t\t\tmetaLines.forEach(line => {\n\t\t\t\t// Remove ANSI color codes for padding calculation\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\n\t\t\t});\n\t\t}\n\t} catch (handlingError) {\n\t\tconsole.error('\\n⚠️ Error While Extracting Metadata:');\n\t\tconsole.error(\n\t\t\t`│ ${\n\t\t\t\thandlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)\n\t\t\t}`\n\t\t);\n\t}\n\n\tconsole.error('\\n\\n');\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utilities/pagination.ts"],"names":[],"mappings":"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","sourcesContent":["import { DocumentType, ReturnModelType } from '@typegoose/typegoose';\r\nimport { FilterQuery, PopulateOptions } from 'mongoose';\r\nimport { z } from 'zod';\r\nimport { AnyParamConstructor } from '@typegoose/typegoose/lib/types';\r\nimport { FilterDTO, PaginatedResponse } from './validation';\r\n\r\n/**\r\n * A helper to create a paginated Zod schema for an item type.\r\n */\r\nexport function createPaginatedSchema<ItemType extends z.ZodTypeAny>(itemSchema: ItemType) {\r\n\treturn z.object({\r\n\t\tmetadata: z.object({\r\n\t\t\tpage: z.number(),\r\n\t\t\tsize: z.number(),\r\n\t\t\ttotalElements: z.number(),\r\n\t\t\ttotalPages: z.number(),\r\n\t\t}),\r\n\t\titems: z.array(itemSchema),\r\n\t});\r\n}\r\n\r\nexport interface RawPaginatedResult<T extends AnyParamConstructor<any>> {\r\n\tmetadata: {\r\n\t\tpage: number;\r\n\t\tsize: number;\r\n\t\ttotalElements: number;\r\n\t\ttotalPages: number;\r\n\t};\r\n\tdocuments: DocumentType<T>[];\r\n}\r\n\r\n/**\r\n * The common pagination options.\r\n */\r\nexport interface PaginatorOptions<TClass extends AnyParamConstructor<any>> {\r\n\tquery?: FilterQuery<DocumentType<TClass>>;\r\n\tpage?: number;\r\n\tsize?: number;\r\n\tsort?: Record<string, 1 | -1>;\r\n\tselect?: Record<string, 0 | 1>;\r\n\tpopulate?: PopulateOptions | (PopulateOptions | string)[];\r\n}\r\n\r\n/**\r\n * This internal function wraps the common query logic:\r\n * - filter, page, size, sort, populate\r\n * - fetch documents, count documents\r\n * - compute totalPages\r\n * Returns a standard object with `metadata` & `documents`.\r\n */\r\nasync function _basePaginate<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>,\r\n\toptions: PaginatorOptions<T>\r\n): Promise<RawPaginatedResult<T>> {\r\n\tconst { query = {}, page = 1, size = 10, sort = {}, select, populate } = options;\r\n\r\n\tconst skip = (page - 1) * size;\r\n\r\n\tlet result = model.find(query).sort(sort).skip(skip).limit(size);\r\n\r\n\tif (select) {\r\n\t\tresult = result.select(select) as any;\r\n\t}\r\n\tif (populate) {\r\n\t\tresult = result.populate(populate);\r\n\t}\r\n\r\n\tconst [documents, totalElements] = await Promise.all([result.exec(), model.countDocuments(query)]);\r\n\r\n\tconst totalPages = Math.ceil(totalElements / size);\r\n\r\n\treturn {\r\n\t\tmetadata: {\r\n\t\t\tpage,\r\n\t\t\tsize,\r\n\t\t\ttotalElements,\r\n\t\t\ttotalPages,\r\n\t\t},\r\n\t\tdocuments: documents as unknown as DocumentType<T>[],\r\n\t};\r\n}\r\n\r\n/**\r\n * Creates a paginator returning raw documents.\r\n *\r\n * @param model The Typegoose model\r\n * @returns A function that, when passed `PaginatorOptions`, returns raw docs + metadata.\r\n */\r\nexport function createRawDocumentPaginatorObject<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>\r\n) {\r\n\treturn async function paginate(options: PaginatorOptions<T>): Promise<RawPaginatedResult<T>> {\r\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\r\n\r\n\t\treturn {\r\n\t\t\tmetadata,\r\n\t\t\tdocuments,\r\n\t\t};\r\n\t};\r\n}\r\n\r\n/**\r\n * Creates a paginator that returns Zod-validated items.\r\n *\r\n * @param model The Typegoose model\r\n * @param itemSchema A Zod schema describing the shape of each item\r\n * @param transformFn Optional transform function to convert raw doc -> item\r\n */\r\nexport function createPaginatorObject<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>,\r\n\titemSchema: z.ZodTypeAny,\r\n\ttransformFn?: (doc: DocumentType<T>) => z.infer<typeof itemSchema>\r\n) {\r\n\tconst PaginatedSchema = createPaginatedSchema(itemSchema);\r\n\r\n\treturn async function paginate(options: PaginatorOptions<T>) {\r\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\r\n\r\n\t\tconst items = transformFn ? documents.map(transformFn) : documents;\r\n\r\n\t\tconst paginatedResult = {\r\n\t\t\tmetadata,\r\n\t\t\titems,\r\n\t\t};\r\n\r\n\t\treturn PaginatedSchema.parse(paginatedResult);\r\n\t};\r\n}\r\nexport async function paginateAggregation(\r\n\tmodel: any,\r\n\tpipeline: any[],\r\n\tpage: number = 1,\r\n\tsize: number = 10,\r\n\tsort: any = { createdAt: -1 }\r\n) {\r\n\t// Calculate skip and limit based on the page and size\r\n\tconst skip = (page - 1) * size;\r\n\tconst limit = size;\r\n\r\n\t// Copy the pipeline to avoid mutation\r\n\tconst pipelineWithCount = [...pipeline];\r\n\r\n\t// Step 1: Calculate total count\r\n\tpipelineWithCount.push({ $count: 'totalCount' });\r\n\r\n\t// Step 2: Execute to get total count\r\n\tconst totalCountResult = await model.aggregate(pipelineWithCount).exec();\r\n\tconst totalElements = totalCountResult?.[0]?.totalCount || 0;\r\n\tconst totalPages = Math.ceil(totalElements / size);\r\n\r\n\t// Step 3: Apply pagination to the original pipeline\r\n\tconst paginatedPipeline = [...pipeline];\r\n\tpaginatedPipeline.push({ $sort: sort });\r\n\tpaginatedPipeline.push({ $skip: skip });\r\n\tpaginatedPipeline.push({ $limit: limit });\r\n\r\n\t// Step 4: Execute the paginated pipeline\r\n\tconst data = await model.aggregate(paginatedPipeline).exec();\r\n\r\n\t// Return the paginated data with metadata\r\n\treturn {\r\n\t\tmetadata: {\r\n\t\t\tpage,\r\n\t\t\tsize,\r\n\t\t\ttotalElements,\r\n\t\t\ttotalPages,\r\n\t\t},\r\n\t\tdocuments: data,\r\n\t};\r\n}\r\n"]}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utilities/pagination.ts"],"names":[],"mappings":";;AASA,sDAUC;AAqED,4EAWC;AASD,sDAmBC;AACD,kDAyCC;AAvKD,6BAAwB;AAOxB,SAAgB,qBAAqB,CAAgC,UAAoB;IACxF,OAAO,OAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;YACzB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;SACtB,CAAC;QACF,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC;AACJ,CAAC;AA+BD,KAAK,UAAU,aAAa,CAC3B,KAAyB,EACzB,OAA4B;IAE5B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEjF,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/B,IAAI,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjE,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAQ,CAAC;IACvC,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEnD,OAAO;QACN,QAAQ,EAAE;YACT,IAAI;YACJ,IAAI;YACJ,aAAa;YACb,UAAU;SACV;QACD,SAAS,EAAE,SAAyC;KACpD,CAAC;AACH,CAAC;AAQD,SAAgB,gCAAgC,CAC/C,KAAyB;IAEzB,OAAO,KAAK,UAAU,QAAQ,CAAC,OAA4B;QAC1D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,OAAO;YACN,QAAQ;YACR,SAAS;SACT,CAAC;IACH,CAAC,CAAC;AACH,CAAC;AASD,SAAgB,qBAAqB,CACpC,KAAyB,EACzB,UAAwB,EACxB,WAAkE;IAElE,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,KAAK,UAAU,QAAQ,CAAC,OAA4B;QAC1D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnE,MAAM,eAAe,GAAG;YACvB,QAAQ;YACR,KAAK;SACL,CAAC;QAEF,OAAO,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC;AACH,CAAC;AACM,KAAK,UAAU,mBAAmB,CACxC,KAAU,EACV,QAAe,EACf,OAAe,CAAC,EAChB,OAAe,EAAE,EACjB,OAAY,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;IAG7B,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC;IAGnB,MAAM,iBAAiB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAGxC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAGjD,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAGnD,MAAM,iBAAiB,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IACxC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAG1C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IAG7D,OAAO;QACN,QAAQ,EAAE;YACT,IAAI;YACJ,IAAI;YACJ,aAAa;YACb,UAAU;SACV;QACD,SAAS,EAAE,IAAI;KACf,CAAC;AACH,CAAC","sourcesContent":["import { DocumentType, ReturnModelType } from '@typegoose/typegoose';\nimport { FilterQuery, PopulateOptions } from 'mongoose';\nimport { z } from 'zod';\nimport { AnyParamConstructor } from '@typegoose/typegoose/lib/types';\nimport { FilterDTO, PaginatedResponse } from './validation';\n\n/**\n * A helper to create a paginated Zod schema for an item type.\n */\nexport function createPaginatedSchema<ItemType extends z.ZodTypeAny>(itemSchema: ItemType) {\n\treturn z.object({\n\t\tmetadata: z.object({\n\t\t\tpage: z.number(),\n\t\t\tsize: z.number(),\n\t\t\ttotalElements: z.number(),\n\t\t\ttotalPages: z.number(),\n\t\t}),\n\t\titems: z.array(itemSchema),\n\t});\n}\n\nexport interface RawPaginatedResult<T extends AnyParamConstructor<any>> {\n\tmetadata: {\n\t\tpage: number;\n\t\tsize: number;\n\t\ttotalElements: number;\n\t\ttotalPages: number;\n\t};\n\tdocuments: DocumentType<T>[];\n}\n\n/**\n * The common pagination options.\n */\nexport interface PaginatorOptions<TClass extends AnyParamConstructor<any>> {\n\tquery?: FilterQuery<DocumentType<TClass>>;\n\tpage?: number;\n\tsize?: number;\n\tsort?: Record<string, 1 | -1>;\n\tselect?: Record<string, 0 | 1>;\n\tpopulate?: PopulateOptions | (PopulateOptions | string)[];\n}\n\n/**\n * This internal function wraps the common query logic:\n * - filter, page, size, sort, populate\n * - fetch documents, count documents\n * - compute totalPages\n * Returns a standard object with `metadata` & `documents`.\n */\nasync function _basePaginate<T extends AnyParamConstructor<any>>(\n\tmodel: ReturnModelType<T>,\n\toptions: PaginatorOptions<T>\n): Promise<RawPaginatedResult<T>> {\n\tconst { query = {}, page = 1, size = 10, sort = {}, select, populate } = options;\n\n\tconst skip = (page - 1) * size;\n\n\tlet result = model.find(query).sort(sort).skip(skip).limit(size);\n\n\tif (select) {\n\t\tresult = result.select(select) as any;\n\t}\n\tif (populate) {\n\t\tresult = result.populate(populate);\n\t}\n\n\tconst [documents, totalElements] = await Promise.all([result.exec(), model.countDocuments(query)]);\n\n\tconst totalPages = Math.ceil(totalElements / size);\n\n\treturn {\n\t\tmetadata: {\n\t\t\tpage,\n\t\t\tsize,\n\t\t\ttotalElements,\n\t\t\ttotalPages,\n\t\t},\n\t\tdocuments: documents as unknown as DocumentType<T>[],\n\t};\n}\n\n/**\n * Creates a paginator returning raw documents.\n *\n * @param model The Typegoose model\n * @returns A function that, when passed `PaginatorOptions`, returns raw docs + metadata.\n */\nexport function createRawDocumentPaginatorObject<T extends AnyParamConstructor<any>>(\n\tmodel: ReturnModelType<T>\n) {\n\treturn async function paginate(options: PaginatorOptions<T>): Promise<RawPaginatedResult<T>> {\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\n\n\t\treturn {\n\t\t\tmetadata,\n\t\t\tdocuments,\n\t\t};\n\t};\n}\n\n/**\n * Creates a paginator that returns Zod-validated items.\n *\n * @param model The Typegoose model\n * @param itemSchema A Zod schema describing the shape of each item\n * @param transformFn Optional transform function to convert raw doc -> item\n */\nexport function createPaginatorObject<T extends AnyParamConstructor<any>>(\n\tmodel: ReturnModelType<T>,\n\titemSchema: z.ZodTypeAny,\n\ttransformFn?: (doc: DocumentType<T>) => z.infer<typeof itemSchema>\n) {\n\tconst PaginatedSchema = createPaginatedSchema(itemSchema);\n\n\treturn async function paginate(options: PaginatorOptions<T>) {\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\n\n\t\tconst items = transformFn ? documents.map(transformFn) : documents;\n\n\t\tconst paginatedResult = {\n\t\t\tmetadata,\n\t\t\titems,\n\t\t};\n\n\t\treturn PaginatedSchema.parse(paginatedResult);\n\t};\n}\nexport async function paginateAggregation(\n\tmodel: any,\n\tpipeline: any[],\n\tpage: number = 1,\n\tsize: number = 10,\n\tsort: any = { createdAt: -1 }\n) {\n\t// Calculate skip and limit based on the page and size\n\tconst skip = (page - 1) * size;\n\tconst limit = size;\n\n\t// Copy the pipeline to avoid mutation\n\tconst pipelineWithCount = [...pipeline];\n\n\t// Step 1: Calculate total count\n\tpipelineWithCount.push({ $count: 'totalCount' });\n\n\t// Step 2: Execute to get total count\n\tconst totalCountResult = await model.aggregate(pipelineWithCount).exec();\n\tconst totalElements = totalCountResult?.[0]?.totalCount || 0;\n\tconst totalPages = Math.ceil(totalElements / size);\n\n\t// Step 3: Apply pagination to the original pipeline\n\tconst paginatedPipeline = [...pipeline];\n\tpaginatedPipeline.push({ $sort: sort });\n\tpaginatedPipeline.push({ $skip: skip });\n\tpaginatedPipeline.push({ $limit: limit });\n\n\t// Step 4: Execute the paginated pipeline\n\tconst data = await model.aggregate(paginatedPipeline).exec();\n\n\t// Return the paginated data with metadata\n\treturn {\n\t\tmetadata: {\n\t\t\tpage,\n\t\t\tsize,\n\t\t\ttotalElements,\n\t\t\ttotalPages,\n\t\t},\n\t\tdocuments: data,\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"response.js","sourceRoot":"/","sources":["utilities/response.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CAAI,OAAe,EAAE,IAAQ,EAAE,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,IAAI;IACb,OAAO;IACP,IAAI;CACJ,CAAC,CAAC;AAJU,QAAA,QAAQ,YAIlB","sourcesContent":["export const response = <T>(message: string, data?: T) => ({\r\n\tsuccess: true,\r\n\tmessage,\r\n\tdata,\r\n});\r\n"]}
1
+ {"version":3,"file":"response.js","sourceRoot":"/","sources":["utilities/response.ts"],"names":[],"mappings":";;;AAAO,MAAM,QAAQ,GAAG,CAAI,OAAe,EAAE,IAAQ,EAAE,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,IAAI;IACb,OAAO;IACP,IAAI;CACJ,CAAC,CAAC;AAJU,QAAA,QAAQ,YAIlB","sourcesContent":["export const response = <T>(message: string, data?: T) => ({\n\tsuccess: true,\n\tmessage,\n\tdata,\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"/","sources":["utilities/search.ts"],"names":[],"mappings":";;AAqBA,4CAYC;AAZD,SAAgB,gBAAgB,CAAC,SAAiB,EAAE,MAAgB;IACnE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEhF,OAAO;QACN,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;aAC9B,CAAC,CAAC;SACH,CAAC,CAAC;KACH,CAAC;AACH,CAAC","sourcesContent":["/**\r\n * Builds a MongoDB/Mongoose search query that searches across multiple fields\r\n *\r\n * @param searchKey - The search string to parse (space or comma separated terms)\r\n * @param fields - Array of field names to search against (default: ['name', 'email', 'phoneNumber'])\r\n * @returns A MongoDB query object that requires ALL terms to match in ANY of the specified fields\r\n *\r\n * @example\r\n * // Basic usage\r\n * const query = buildSearchQuery('john doe');\r\n * // Returns: {\r\n * // $and: [\r\n * // { $or: [{ name: /john/i }, { email: /john/i }, { phoneNumber: /john/i }] },\r\n * // { $or: [{ name: /doe/i }, { email: /doe/i }, { phoneNumber: /doe/i }] }\r\n * // ]\r\n * // }\r\n *\r\n * @example\r\n * // Custom fields\r\n * const query = buildSearchQuery('example', ['name', 'email']);\r\n */\r\nexport function buildSearchQuery(searchKey: string, fields: string[]): Record<string, any> {\r\n\tif (!searchKey?.trim()) return {};\r\n\r\n\tconst searchTerms = searchKey.split(/[ ,]+/).filter(term => term.trim() !== '');\r\n\r\n\treturn {\r\n\t\t$and: searchTerms.map(term => ({\r\n\t\t\t$or: fields.map(field => ({\r\n\t\t\t\t[field]: new RegExp(term, 'i'),\r\n\t\t\t})),\r\n\t\t})),\r\n\t};\r\n}\r\n"]}
1
+ {"version":3,"file":"search.js","sourceRoot":"/","sources":["utilities/search.ts"],"names":[],"mappings":";;AAqBA,4CAYC;AAZD,SAAgB,gBAAgB,CAAC,SAAiB,EAAE,MAAgB;IACnE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEhF,OAAO;QACN,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;aAC9B,CAAC,CAAC;SACH,CAAC,CAAC;KACH,CAAC;AACH,CAAC","sourcesContent":["/**\n * Builds a MongoDB/Mongoose search query that searches across multiple fields\n *\n * @param searchKey - The search string to parse (space or comma separated terms)\n * @param fields - Array of field names to search against (default: ['name', 'email', 'phoneNumber'])\n * @returns A MongoDB query object that requires ALL terms to match in ANY of the specified fields\n *\n * @example\n * // Basic usage\n * const query = buildSearchQuery('john doe');\n * // Returns: {\n * // $and: [\n * // { $or: [{ name: /john/i }, { email: /john/i }, { phoneNumber: /john/i }] },\n * // { $or: [{ name: /doe/i }, { email: /doe/i }, { phoneNumber: /doe/i }] }\n * // ]\n * // }\n *\n * @example\n * // Custom fields\n * const query = buildSearchQuery('example', ['name', 'email']);\n */\nexport function buildSearchQuery(searchKey: string, fields: string[]): Record<string, any> {\n\tif (!searchKey?.trim()) return {};\n\n\tconst searchTerms = searchKey.split(/[ ,]+/).filter(term => term.trim() !== '');\n\n\treturn {\n\t\t$and: searchTerms.map(term => ({\n\t\t\t$or: fields.map(field => ({\n\t\t\t\t[field]: new RegExp(term, 'i'),\n\t\t\t})),\n\t\t})),\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"transformers.js","sourceRoot":"/","sources":["utilities/transformers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuPA,8CAQC;AA9PD,iDAA4C;AAC5C,6BAAwB;AA4BjB,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAMT;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IASvC,oBAAoB,CAAC,MAAyC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;IAC7C,CAAC;IASM,yBAAyB,CAC/B,OAAmC;QAGnC,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC/F,MAAM,gBAAgB,GAAG,OAEI,CAAC;YAG9B,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC;gBACnE,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;gBACvE,CAAC,CAAC,EAAE,CAAC;YAGN,OAAO;gBACN,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;gBACnC,SAAS,EAAE,kBAAkB;aAC7B,CAAC;QACH,CAAC;QAGD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACN,SAAS,EAAE,EAAE;iBACb,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAGpF,OAAO;gBACN,SAAS,EAAE,kBAAkB;aAC7B,CAAC;QACH,CAAC;QAGD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrE,CAAC;IASM,sBAAsB,CAC5B,MAA+B,EAC/B,MAAyB;QAEzB,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,WAAW,GAAqB,EAAE,CAAC;QAEzC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,MAAM,GAAG,GAAG,QAAsC,CAAC;YACnD,WAAW,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACpB,CAAC;IASM,2BAA2B,CACjC,OAA+E,EAC/E,MAAyB;QAGzB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC/F,MAAM,gBAAgB,GAAG,OAAqD,CAAC;YAG/E,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC;gBACnE,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACjF,CAAC,CAAC,EAAE,CAAC;YAGN,OAAO;gBACN,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;gBACnC,SAAS,EAAE,kBAAkB;aAC7B,CAAC;QACH,CAAC;QAGD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;YACX,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,CAAC;QAGD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAQM,2BAA2B,CACjC,MAA+B,EAC/B,cAA4C;QAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,EAAE,GAAG,SAAS,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5C,CAAC;IAUM,oBAAoB,CAC1B,MAA+B,EAC/B,KAAqC;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAYM,uBAAuB,CAC7B,MAA+B,EAC/B,IAAY,EACZ,YAA4B;QAE5B,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAQ,MAAM,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;gBAChC,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACP,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,sBAAsB,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;QAED,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAClD,CAAC;IASM,qBAAqB,CAAC,MAA+B,EAAE,QAA0B;QACvF,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACtD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACxC,CAAC;CACD,CAAA;AA9MY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,gBAAO,GAAE;qCAOmB,OAAC,CAAC,OAAO;GANzB,iBAAiB,CA8M7B;AAWD,SAAgB,iBAAiB,CAChC,MAAsB;IAEtB,IAAI,CAAC;QACJ,OAAO,gBAAS,CAAC,GAAG,CAAC,iBAAiB,CAA0C,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,IAAI,iBAAiB,CAAqB,MAAM,CAAC,CAAC;IAC1D,CAAC;AACF,CAAC","sourcesContent":["import { DocumentType } from '@typegoose/typegoose';\r\nimport Container, { Service } from 'typedi';\r\nimport { z } from 'zod';\r\n\r\n/**\r\n * Type definition for pagination metadata\r\n */\r\ntype Metadata = {\r\n\tpage: number;\r\n\tsize: number;\r\n\ttotalElements: number;\r\n\ttotalPages: number;\r\n};\r\n\r\n/**\r\n * Type definition for paginated response\r\n */\r\ntype PaginatedResponse<T> = {\r\n\tmetadata?: Metadata;\r\n\tdocuments: T[];\r\n};\r\n\r\n/**\r\n * GlobalTransformer provides a reusable way to transform Mongoose documents\r\n * into DTOs using Zod schemas for validation and type safety.\r\n *\r\n * @template ModelType - The Mongoose model type\r\n * @template DTOType - The output DTO type\r\n */\r\n@Service()\r\nexport class GlobalTransformer<ModelType, DTOType> {\r\n\t/**\r\n\t * Creates a new GlobalTransformer\r\n\t *\r\n\t * @param {z.ZodType<any>} schema - Zod schema used for validation and transformation\r\n\t */\r\n\tconstructor(private schema: z.ZodType<any>) {}\r\n\r\n\t/**\r\n\t * Transforms a single document to a DTO\r\n\t *\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @returns {DTOType} The transformed DTO\r\n\t * @throws {Error} When record is not found\r\n\t */\r\n\tpublic transformToBasicView(record: DocumentType<ModelType> | DTOType): DTOType {\r\n\t\tif (!record) {\r\n\t\t\tthrow new Error('Record not found');\r\n\t\t}\r\n\r\n\t\treturn this.schema.parse(record) as DTOType;\r\n\t}\r\n\r\n\t/**\r\n\t * Transforms an array of documents or a paginated response to a paginated DTO response\r\n\t *\r\n\t * @param {DocumentType<ModelType>[] | DTOType[] | PaginatedResponse<DocumentType<ModelType>> | PaginatedResponse<DTOType>} records - Records to transform\r\n\t * @returns {PaginatedResponse<DTOType>} Paginated response with transformed DTOs\r\n\t * @throws {Error} When input type is invalid\r\n\t */\r\n\tpublic transformToBasicViewArray<T extends DocumentType<ModelType> | DTOType>(\r\n\t\trecords: T[] | PaginatedResponse<T>\r\n\t): PaginatedResponse<DTOType> {\r\n\t\t// Case 1: If records is already in the paginated format\r\n\t\tif (records && typeof records === 'object' && 'metadata' in records && 'documents' in records) {\r\n\t\t\tconst paginatedRecords = records as\r\n\t\t\t\t| PaginatedResponse<DocumentType<ModelType>>\r\n\t\t\t\t| PaginatedResponse<DTOType>;\r\n\r\n\t\t\t// Process the documents array\r\n\t\t\tconst processedDocuments = Array.isArray(paginatedRecords.documents)\r\n\t\t\t\t? paginatedRecords.documents.map(doc => this.transformToBasicView(doc))\r\n\t\t\t\t: [];\r\n\r\n\t\t\t// Return the entire paginated structure\r\n\t\t\treturn {\r\n\t\t\t\tmetadata: paginatedRecords.metadata,\r\n\t\t\t\tdocuments: processedDocuments,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// Case 2: If records is an array\r\n\t\tif (Array.isArray(records)) {\r\n\t\t\tif (records.length === 0) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tdocuments: [],\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tconst transformedRecords = records.map(record => this.transformToBasicView(record));\r\n\r\n\t\t\t// Return in paginated format with default metadata\r\n\t\t\treturn {\r\n\t\t\t\tdocuments: transformedRecords,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// Fallback for unexpected input\r\n\t\tthrow new Error('Invalid input type for transformToBasicViewArray');\r\n\t}\r\n\r\n\t/**r\r\n\t * Creates a partial view with only the specified fields\r\n\t *\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @param {(keyof DTOType)[]} fields - Fields to include in the output\r\n\t * @returns {Partial<DTOType>} Partial DTO with only the specified fields\r\n\t */\r\n\tpublic transformToPartialView(\r\n\t\trecord: DocumentType<ModelType>,\r\n\t\tfields: (keyof DTOType)[]\r\n\t): Partial<DTOType> {\r\n\t\tconst fullView = this.transformToBasicView(record);\r\n\t\tconst partialView: Partial<DTOType> = {};\r\n\r\n\t\tfields.forEach(field => {\r\n\t\t\tconst dto = fullView as Record<keyof DTOType, any>;\r\n\t\t\tpartialView[field] = dto[field];\r\n\t\t});\r\n\r\n\t\treturn partialView;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates partial views for an array of documents\r\n\t *\r\n\t * @param {DocumentType<ModelType>[]} records - Array of documents to transform\r\n\t * @param {(keyof DTOType)[]} fields - Fields to include in the output\r\n\t * @returns {Partial<DTOType>[]} Array of partial DTOs\r\n\t */\r\n\tpublic transformToPartialViewArray(\r\n\t\trecords: DocumentType<ModelType>[] | PaginatedResponse<DocumentType<ModelType>>,\r\n\t\tfields: (keyof DTOType)[]\r\n\t): Partial<DTOType>[] | PaginatedResponse<Partial<DTOType>> {\r\n\t\t// Case 1: If records is already in the paginated format\r\n\t\tif (records && typeof records === 'object' && 'metadata' in records && 'documents' in records) {\r\n\t\t\tconst paginatedRecords = records as PaginatedResponse<DocumentType<ModelType>>;\r\n\r\n\t\t\t// Process the documents array\r\n\t\t\tconst processedDocuments = Array.isArray(paginatedRecords.documents)\r\n\t\t\t\t? paginatedRecords.documents.map(doc => this.transformToPartialView(doc, fields))\r\n\t\t\t\t: [];\r\n\r\n\t\t\t// Return the entire paginated structure\r\n\t\t\treturn {\r\n\t\t\t\tmetadata: paginatedRecords.metadata,\r\n\t\t\t\tdocuments: processedDocuments,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// Case 2: If records is an array\r\n\t\tif (Array.isArray(records)) {\r\n\t\t\tif (records.length === 0) {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t\treturn records.map(record => this.transformToPartialView(record, fields));\r\n\t\t}\r\n\r\n\t\t// Fallback for unexpected input\r\n\t\tthrow new Error('Invalid input type for transformToPartialViewArray');\r\n\t}\r\n\t/**\r\n\t * Transforms a document and adds additional computed fields\r\n\t *\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @param {Partial<Record<string, any>>} additionalData - Additional fields to add\r\n\t * @returns {DTOType & Record<string, any>} DTO with additional fields\r\n\t */\r\n\tpublic transformWithAdditionalData(\r\n\t\trecord: DocumentType<ModelType>,\r\n\t\tadditionalData: Partial<Record<string, any>>\r\n\t): DTOType & Record<string, any> {\r\n\t\tconst basicView = this.transformToBasicView(record);\r\n\t\treturn { ...basicView, ...additionalData };\r\n\t}\r\n\r\n\t/**\r\n\t * Transforms a document using a custom mapping function\r\n\t *\r\n\t * @template OutputType - The output type after mapping\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @param {(input: DTOType) => OutputType} mapFn - Mapping function for custom transformation\r\n\t * @returns {OutputType} Custom transformed output\r\n\t */\r\n\tpublic transformWithMapping<OutputType = DTOType>(\r\n\t\trecord: DocumentType<ModelType>,\r\n\t\tmapFn: (input: DTOType) => OutputType\r\n\t): OutputType {\r\n\t\tconst basicView = this.transformToBasicView(record);\r\n\t\treturn mapFn(basicView);\r\n\t}\r\n\r\n\t/**\r\n\t * Transforms a nested property of the document\r\n\t *\r\n\t * @template NestedType - The type of the nested property\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @param {string} path - Dot-notation path to the nested property\r\n\t * @param {z.ZodType<any>} nestedSchema - Zod schema for the nested property\r\n\t * @returns {NestedType} The transformed nested property\r\n\t * @throws {Error} When path is not found in record\r\n\t */\r\n\tpublic transformNestedProperty<NestedType>(\r\n\t\trecord: DocumentType<ModelType>,\r\n\t\tpath: string,\r\n\t\tnestedSchema: z.ZodType<any>\r\n\t): NestedType {\r\n\t\tif (!record) {\r\n\t\t\tthrow new Error('Record not found');\r\n\t\t}\r\n\r\n\t\tconst parts = path.split('.');\r\n\t\tlet current: any = record;\r\n\r\n\t\tfor (const part of parts) {\r\n\t\t\tif (current && part in current) {\r\n\t\t\t\tcurrent = current[part];\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(`Path ${path} not found in record`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn nestedSchema.parse(current) as NestedType;\r\n\t}\r\n\r\n\t/**\r\n\t * Transforms a document with default values for missing fields\r\n\t *\r\n\t * @param {DocumentType<ModelType>} record - The document to transform\r\n\t * @param {Partial<DTOType>} defaults - Default values for fields\r\n\t * @returns {DTOType} DTO with defaults applied\r\n\t */\r\n\tpublic transformWithDefaults(record: DocumentType<ModelType>, defaults: Partial<DTOType>): DTOType {\r\n\t\tconst transformed = this.transformToBasicView(record);\r\n\t\treturn { ...defaults, ...transformed };\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates a transformer instance for the given schema.\r\n * Uses dependency injection if available, falls back to creating a new instance.\r\n *\r\n * @template ModelType - The Mongoose model type\r\n * @template DTOType - The output DTO type\r\n * @param {z.ZodType<any>} schema - Zod schema for validation and transformation\r\n * @returns {GlobalTransformer<ModelType, DTOType>} Instance of GlobalTransformer\r\n */\r\nexport function createTransformer<ModelType, DTOType>(\r\n\tschema: z.ZodType<any>\r\n): GlobalTransformer<ModelType, DTOType> {\r\n\ttry {\r\n\t\treturn Container.get(GlobalTransformer) as GlobalTransformer<ModelType, DTOType>;\r\n\t} catch (error) {\r\n\t\treturn new GlobalTransformer<ModelType, DTOType>(schema);\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"transformers.js","sourceRoot":"/","sources":["utilities/transformers.ts"],"names":[],"mappings":"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","sourcesContent":["import { DocumentType } from '@typegoose/typegoose';\nimport Container, { Service } from 'typedi';\nimport { z } from 'zod';\n\n/**\n * Type definition for pagination metadata\n */\ntype Metadata = {\n\tpage: number;\n\tsize: number;\n\ttotalElements: number;\n\ttotalPages: number;\n};\n\n/**\n * Type definition for paginated response\n */\ntype PaginatedResponse<T> = {\n\tmetadata?: Metadata;\n\tdocuments: T[];\n};\n\n/**\n * GlobalTransformer provides a reusable way to transform Mongoose documents\n * into DTOs using Zod schemas for validation and type safety.\n *\n * @template ModelType - The Mongoose model type\n * @template DTOType - The output DTO type\n */\n@Service()\nexport class GlobalTransformer<ModelType, DTOType> {\n\t/**\n\t * Creates a new GlobalTransformer\n\t *\n\t * @param {z.ZodType<any>} schema - Zod schema used for validation and transformation\n\t */\n\tconstructor(private schema: z.ZodType<any>) {}\n\n\t/**\n\t * Transforms a single document to a DTO\n\t *\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @returns {DTOType} The transformed DTO\n\t * @throws {Error} When record is not found\n\t */\n\tpublic transformToBasicView(record: DocumentType<ModelType> | DTOType): DTOType {\n\t\tif (!record) {\n\t\t\tthrow new Error('Record not found');\n\t\t}\n\n\t\treturn this.schema.parse(record) as DTOType;\n\t}\n\n\t/**\n\t * Transforms an array of documents or a paginated response to a paginated DTO response\n\t *\n\t * @param {DocumentType<ModelType>[] | DTOType[] | PaginatedResponse<DocumentType<ModelType>> | PaginatedResponse<DTOType>} records - Records to transform\n\t * @returns {PaginatedResponse<DTOType>} Paginated response with transformed DTOs\n\t * @throws {Error} When input type is invalid\n\t */\n\tpublic transformToBasicViewArray<T extends DocumentType<ModelType> | DTOType>(\n\t\trecords: T[] | PaginatedResponse<T>\n\t): PaginatedResponse<DTOType> {\n\t\t// Case 1: If records is already in the paginated format\n\t\tif (records && typeof records === 'object' && 'metadata' in records && 'documents' in records) {\n\t\t\tconst paginatedRecords = records as\n\t\t\t\t| PaginatedResponse<DocumentType<ModelType>>\n\t\t\t\t| PaginatedResponse<DTOType>;\n\n\t\t\t// Process the documents array\n\t\t\tconst processedDocuments = Array.isArray(paginatedRecords.documents)\n\t\t\t\t? paginatedRecords.documents.map(doc => this.transformToBasicView(doc))\n\t\t\t\t: [];\n\n\t\t\t// Return the entire paginated structure\n\t\t\treturn {\n\t\t\t\tmetadata: paginatedRecords.metadata,\n\t\t\t\tdocuments: processedDocuments,\n\t\t\t};\n\t\t}\n\n\t\t// Case 2: If records is an array\n\t\tif (Array.isArray(records)) {\n\t\t\tif (records.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tdocuments: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst transformedRecords = records.map(record => this.transformToBasicView(record));\n\n\t\t\t// Return in paginated format with default metadata\n\t\t\treturn {\n\t\t\t\tdocuments: transformedRecords,\n\t\t\t};\n\t\t}\n\n\t\t// Fallback for unexpected input\n\t\tthrow new Error('Invalid input type for transformToBasicViewArray');\n\t}\n\n\t/**r\n\t * Creates a partial view with only the specified fields\n\t *\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @param {(keyof DTOType)[]} fields - Fields to include in the output\n\t * @returns {Partial<DTOType>} Partial DTO with only the specified fields\n\t */\n\tpublic transformToPartialView(\n\t\trecord: DocumentType<ModelType>,\n\t\tfields: (keyof DTOType)[]\n\t): Partial<DTOType> {\n\t\tconst fullView = this.transformToBasicView(record);\n\t\tconst partialView: Partial<DTOType> = {};\n\n\t\tfields.forEach(field => {\n\t\t\tconst dto = fullView as Record<keyof DTOType, any>;\n\t\t\tpartialView[field] = dto[field];\n\t\t});\n\n\t\treturn partialView;\n\t}\n\n\t/**\n\t * Creates partial views for an array of documents\n\t *\n\t * @param {DocumentType<ModelType>[]} records - Array of documents to transform\n\t * @param {(keyof DTOType)[]} fields - Fields to include in the output\n\t * @returns {Partial<DTOType>[]} Array of partial DTOs\n\t */\n\tpublic transformToPartialViewArray(\n\t\trecords: DocumentType<ModelType>[] | PaginatedResponse<DocumentType<ModelType>>,\n\t\tfields: (keyof DTOType)[]\n\t): Partial<DTOType>[] | PaginatedResponse<Partial<DTOType>> {\n\t\t// Case 1: If records is already in the paginated format\n\t\tif (records && typeof records === 'object' && 'metadata' in records && 'documents' in records) {\n\t\t\tconst paginatedRecords = records as PaginatedResponse<DocumentType<ModelType>>;\n\n\t\t\t// Process the documents array\n\t\t\tconst processedDocuments = Array.isArray(paginatedRecords.documents)\n\t\t\t\t? paginatedRecords.documents.map(doc => this.transformToPartialView(doc, fields))\n\t\t\t\t: [];\n\n\t\t\t// Return the entire paginated structure\n\t\t\treturn {\n\t\t\t\tmetadata: paginatedRecords.metadata,\n\t\t\t\tdocuments: processedDocuments,\n\t\t\t};\n\t\t}\n\n\t\t// Case 2: If records is an array\n\t\tif (Array.isArray(records)) {\n\t\t\tif (records.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\treturn records.map(record => this.transformToPartialView(record, fields));\n\t\t}\n\n\t\t// Fallback for unexpected input\n\t\tthrow new Error('Invalid input type for transformToPartialViewArray');\n\t}\n\t/**\n\t * Transforms a document and adds additional computed fields\n\t *\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @param {Partial<Record<string, any>>} additionalData - Additional fields to add\n\t * @returns {DTOType & Record<string, any>} DTO with additional fields\n\t */\n\tpublic transformWithAdditionalData(\n\t\trecord: DocumentType<ModelType>,\n\t\tadditionalData: Partial<Record<string, any>>\n\t): DTOType & Record<string, any> {\n\t\tconst basicView = this.transformToBasicView(record);\n\t\treturn { ...basicView, ...additionalData };\n\t}\n\n\t/**\n\t * Transforms a document using a custom mapping function\n\t *\n\t * @template OutputType - The output type after mapping\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @param {(input: DTOType) => OutputType} mapFn - Mapping function for custom transformation\n\t * @returns {OutputType} Custom transformed output\n\t */\n\tpublic transformWithMapping<OutputType = DTOType>(\n\t\trecord: DocumentType<ModelType>,\n\t\tmapFn: (input: DTOType) => OutputType\n\t): OutputType {\n\t\tconst basicView = this.transformToBasicView(record);\n\t\treturn mapFn(basicView);\n\t}\n\n\t/**\n\t * Transforms a nested property of the document\n\t *\n\t * @template NestedType - The type of the nested property\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @param {string} path - Dot-notation path to the nested property\n\t * @param {z.ZodType<any>} nestedSchema - Zod schema for the nested property\n\t * @returns {NestedType} The transformed nested property\n\t * @throws {Error} When path is not found in record\n\t */\n\tpublic transformNestedProperty<NestedType>(\n\t\trecord: DocumentType<ModelType>,\n\t\tpath: string,\n\t\tnestedSchema: z.ZodType<any>\n\t): NestedType {\n\t\tif (!record) {\n\t\t\tthrow new Error('Record not found');\n\t\t}\n\n\t\tconst parts = path.split('.');\n\t\tlet current: any = record;\n\n\t\tfor (const part of parts) {\n\t\t\tif (current && part in current) {\n\t\t\t\tcurrent = current[part];\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Path ${path} not found in record`);\n\t\t\t}\n\t\t}\n\n\t\treturn nestedSchema.parse(current) as NestedType;\n\t}\n\n\t/**\n\t * Transforms a document with default values for missing fields\n\t *\n\t * @param {DocumentType<ModelType>} record - The document to transform\n\t * @param {Partial<DTOType>} defaults - Default values for fields\n\t * @returns {DTOType} DTO with defaults applied\n\t */\n\tpublic transformWithDefaults(record: DocumentType<ModelType>, defaults: Partial<DTOType>): DTOType {\n\t\tconst transformed = this.transformToBasicView(record);\n\t\treturn { ...defaults, ...transformed };\n\t}\n}\n\n/**\n * Creates a transformer instance for the given schema.\n * Uses dependency injection if available, falls back to creating a new instance.\n *\n * @template ModelType - The Mongoose model type\n * @template DTOType - The output DTO type\n * @param {z.ZodType<any>} schema - Zod schema for validation and transformation\n * @returns {GlobalTransformer<ModelType, DTOType>} Instance of GlobalTransformer\n */\nexport function createTransformer<ModelType, DTOType>(\n\tschema: z.ZodType<any>\n): GlobalTransformer<ModelType, DTOType> {\n\ttry {\n\t\treturn Container.get(GlobalTransformer) as GlobalTransformer<ModelType, DTOType>;\n\t} catch (error) {\n\t\treturn new GlobalTransformer<ModelType, DTOType>(schema);\n\t}\n}\n"]}
@@ -195,7 +195,7 @@ export declare const AddressSchema: z.ZodObject<{
195
195
  city?: string | null | undefined;
196
196
  zone?: string | import("mongoose").Types.ObjectId | undefined;
197
197
  }>;
198
- export declare const UserAddressSchema: z.ZodObject<z.objectUtil.extendShape<{
198
+ export declare const UserAddressSchema: z.ZodObject<{
199
199
  address: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
200
200
  description: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
201
201
  city: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -214,13 +214,13 @@ export declare const UserAddressSchema: z.ZodObject<z.objectUtil.extendShape<{
214
214
  latitude: z.ZodNumber;
215
215
  longitude: z.ZodNumber;
216
216
  zone: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("mongoose").Types.ObjectId, string>, z.ZodType<import("mongoose").Types.ObjectId, z.ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
217
- }, {
217
+ } & {
218
218
  addressLabel: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
219
219
  apartment: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
220
220
  buildingName: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
221
221
  deliveryOption: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
222
222
  instructions: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
223
- }>, "strip", z.ZodTypeAny, {
223
+ }, "strip", z.ZodTypeAny, {
224
224
  location: {
225
225
  type: GeoLocationType;
226
226
  coordinates: number[];
@@ -257,7 +257,7 @@ export declare const UserAddressSchema: z.ZodObject<z.objectUtil.extendShape<{
257
257
  deliveryOption?: string | null | undefined;
258
258
  instructions?: string | null | undefined;
259
259
  }>;
260
- export declare const CourierAddressSchema: z.ZodObject<z.objectUtil.extendShape<z.objectUtil.extendShape<{
260
+ export declare const CourierAddressSchema: z.ZodObject<{
261
261
  address: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
262
262
  description: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
263
263
  city: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -276,16 +276,16 @@ export declare const CourierAddressSchema: z.ZodObject<z.objectUtil.extendShape<
276
276
  latitude: z.ZodNumber;
277
277
  longitude: z.ZodNumber;
278
278
  zone: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("mongoose").Types.ObjectId, string>, z.ZodType<import("mongoose").Types.ObjectId, z.ZodTypeDef, import("mongoose").Types.ObjectId>]>>;
279
- }, {
279
+ } & {
280
280
  addressLabel: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
281
281
  apartment: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
282
282
  buildingName: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
283
283
  deliveryOption: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
284
284
  instructions: z.ZodOptional<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodString>> | z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
285
- }>, {
285
+ } & {
286
286
  name: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
287
287
  phoneNumber: z.ZodString | z.ZodOptional<z.ZodString> | z.ZodNullable<z.ZodString> | z.ZodOptional<z.ZodNullable<z.ZodString>>;
288
- }>, "strip", z.ZodTypeAny, {
288
+ }, "strip", z.ZodTypeAny, {
289
289
  location: {
290
290
  type: GeoLocationType;
291
291
  coordinates: number[];
@@ -1 +1 @@
1
- {"version":3,"file":"common-validation.js","sourceRoot":"/","sources":["utilities/validation/common-validation.ts"],"names":[],"mappings":";;;AAAA,6BAAmC;AACnC,2DAAyD;AACzD,kCAAkF;AAKlF,MAAM,gBAAgB,GAAmC,OAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACpE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,GAAG,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAClD,CAAC;AAKF,MAAM,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvB,GAAG,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvB,GAAG,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvB,IAAI,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACxB,GAAG,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACvB,IAAI,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACxB,GAAG,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjC,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IAC1C,GAAG,EAAE,OAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;IACzC,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACjC,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhF,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9E,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,OAAO,EAAE,OAAC;SACR,MAAM,CAAC;QACP,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;QAC3B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC3B,CAAC;SACD,QAAQ,EAAE;CACZ,CAAC,CAAC;AAKU,QAAA,YAAY,GAAG,OAAC;KAC3B,MAAM,CAAC;IACP,IAAI,EAAE,OAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;SACnD,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;SAChD,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACb,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IAClC,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9E,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,OAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvE,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACpG,CAAC;KACD,QAAQ,EAAE,CAAC;AAUA,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;AAc1F,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,iCAAa,CAAC,MAAM,CAAC,SAAS,CAAC;IACxC,WAAW,EAAE,iCAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAC3D,IAAI,EAAE,iCAAa,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,iCAAa,CAAC,MAAM,CAAC,OAAO,CAAC;IACpC,OAAO,EAAE,iCAAa,CAAC,MAAM,CAAC,SAAS,CAAC;IACxC,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,iCAAa,CAAC,QAAQ,CAAC,sBAAe,EAAE,iBAAiB,CAAC,CAAC,OAAO,CAAC,sBAAe,CAAC,KAAK,CAAC;QAC/F,WAAW,EAAE,iCAAa,CAAC,KAAK,CAAC,iCAAa,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;KACzF,CAAC;IACF,QAAQ,EAAE,iCAAa,CAAC,MAAM,CAAC,UAAU,CAAC;IAC1C,SAAS,EAAE,iCAAa,CAAC,MAAM,CAAC,WAAW,CAAC;IAC5C,IAAI,EAAE,iCAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC,CAAC;AAcU,QAAA,iBAAiB,GAAG,qBAAa,CAAC,MAAM,CAAC;IACrD,YAAY,EAAE,iCAAa,CAAC,MAAM,CAAC,eAAe,CAAC;IACnD,SAAS,EAAE,iCAAa,CAAC,MAAM,CAAC,WAAW,CAAC;IAC5C,YAAY,EAAE,iCAAa,CAAC,MAAM,CAAC,eAAe,CAAC;IACnD,cAAc,EAAE,iCAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IAClE,YAAY,EAAE,iCAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AAcU,QAAA,oBAAoB,GAAG,yBAAiB,CAAC,MAAM,CAAC;IAC5D,IAAI,EAAE,iCAAa,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,iCAAa,CAAC,MAAM,CAAC,cAAc,CAAC;CACjD,CAAC,CAAC;AAcU,QAAA,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,iCAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,GAAG,EAAE,iCAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAcH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,iCAAa,CAAC,MAAM,CAAC,OAAO,CAAC;IACpC,GAAG,EAAE,iCAAa,CAAC,MAAM,CAAC,KAAK,CAAC;CAChC,CAAC,CAAC;AAEU,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,GAAG,EAAE,iCAAa,CAAC,QAAQ,CAAC,cAAO,EAAE,KAAK,CAAC;IAC3C,MAAM,EAAE,iCAAa,CAAC,QAAQ,CAAC,iBAAU,EAAE,QAAQ,CAAC;IACpD,YAAY,EAAE,iCAAa,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACjE,CAAC,CAAC;AAEU,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,iCAAa,CAAC,IAAI,CAAC,MAAM,CAAC;IAChC,MAAM,EAAE,iCAAa,CAAC,QAAQ,CAAC,wBAAiB,EAAE,QAAQ,CAAC;IAC3D,WAAW,EAAE,kBAAkB;CAC/B,CAAC,CAAC;AAEU,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,WAAW,EAAE,iCAAa,CAAC,KAAK,CAAC,wBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D,YAAY,EAAE,iCAAa,CAAC,KAAK,CAAC,yBAAiB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChE,CAAC,CAAC;AAcU,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,KAAK,EAAE,iCAAa,CAAC,KAAK,CAAC,OAAO,EAAE;QACnC,eAAe,EAAE,qCAAqC;QACtD,cAAc,EAAE,qCAAqC;KACrD,CAAC;IACF,QAAQ,EAAE,iCAAa,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;CACxF,CAAC,CAAC;AAGH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,iCAAa,CAAC,MAAM,EAAE;IAC5B,IAAI,EAAE,iCAAa,CAAC,MAAM,EAAE;IAC5B,aAAa,EAAE,iCAAa,CAAC,MAAM,EAAE;IACrC,UAAU,EAAE,iCAAa,CAAC,MAAM,EAAE;CAClC,CAAC,CAAC;AACI,MAAM,qBAAqB,GAAG,CAAI,cAA8B,EAAE,EAAE,CAC1E,OAAC,CAAC,MAAM,CAAC;IACR,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,iCAAa,CAAC,KAAK,CAAC,cAAc,CAAC;CAC9C,CAAC,CAAC;AAJS,QAAA,qBAAqB,yBAI9B;AAEG,MAAM,oBAAoB,GAAG,CAAI,MAAsB,EAAE,EAAE,CACjE,OAAC,CAAC,MAAM,CAAC;IACR,OAAO,EAAE,iCAAa,CAAC,OAAO,EAAE;IAChC,OAAO,EAAE,iCAAa,CAAC,MAAM,EAAE;IAC/B,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,IAAA,6BAAqB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;CACjE,CAAC,CAAC;AALS,QAAA,oBAAoB,wBAK7B;AAcS,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,WAAW,EAAE,iCAAa,CAAC,MAAM,CAAC,aAAa,CAAC;IAChD,YAAY,EAAE,iCAAa,CAAC,MAAM,CAAC,cAAc,CAAC;CAClD,CAAC,CAAC;AAKU,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAChD,UAAU,EAAE,iCAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,IAAI,EAAE,iCAAa,CAAC,KAAK,CAAC,iCAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;CACnE,CAAC,CAAC;AAMU,QAAA,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,GAAG,EAAE,iCAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;IAClC,UAAU,EAAE,iCAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CAC9D,CAAC,CAAC;AAMU,QAAA,QAAQ,GAAG,iCAAa,CAAC,QAAQ,EAAE,CAAC","sourcesContent":["import { z, ZodSchema } from 'zod';\r\nimport { DTO, ZodValidation } from './global-validation';\r\nimport { GeoLocationType, HolidayWorkStatus, WeekDay, WorkStatus } from '../enum';\r\n\r\n/**\r\n * Define MongoDB query schema (fields + operators) using lazy evaluation to avoid circular dependency\r\n */\r\nconst MongoQuerySchema: z.ZodType<Record<string, any>> = z.lazy(() =>\r\n\tz.record(z.union([z.any(), MongoOperatorsSchema]))\r\n);\r\n\r\n/**\r\n * Define allowed MongoDB query operators\r\n */\r\nconst MongoOperatorsSchema = z.object({\r\n\t$eq: z.any().optional(),\r\n\t$ne: z.any().optional(),\r\n\t$gt: z.any().optional(),\r\n\t$gte: z.any().optional(),\r\n\t$lt: z.any().optional(),\r\n\t$lte: z.any().optional(),\r\n\t$in: z.array(z.any()).optional(),\r\n\t$nin: z.array(z.any()).optional(),\r\n\t$exists: z.boolean().optional(),\r\n\t$regex: z.string().optional(),\r\n\t$and: z.array(MongoQuerySchema).optional(),\r\n\t$or: z.array(MongoQuerySchema).optional(),\r\n\t$not: MongoQuerySchema.optional(),\r\n\t$nor: z.array(MongoQuerySchema).optional(),\r\n});\r\n\r\nconst sortSchema = z.record(z.string(), z.union([z.literal(1), z.literal(-1)]));\r\n\r\nconst populateSchema = z.object({\r\n\tpath: z.string(), // required\r\n\tselect: z.record(z.string(), z.union([z.literal(0), z.literal(1)])).optional(),\r\n\tmatch: z.record(z.string(), z.any()).optional(),\r\n\toptions: z\r\n\t\t.object({\r\n\t\t\tsort: sortSchema.optional(),\r\n\t\t\tlimit: z.number().optional(),\r\n\t\t\tskip: z.number().optional(),\r\n\t\t})\r\n\t\t.optional(),\r\n});\r\n\r\n/**\r\n * Define the filter schema using MongoQuerySchema\r\n */\r\nexport const FilterSchema = z\r\n\t.object({\r\n\t\tsize: z\r\n\t\t\t.number()\r\n\t\t\t.min(1, { message: 'Size must be greater than 0.' })\r\n\t\t\t.max(100, { message: 'Size cannot exceed 100.' })\r\n\t\t\t.optional()\r\n\t\t\t.default(10),\r\n\t\tpage: z.number().min(1, { message: 'Page number must be at least 1.' }).optional().default(1),\r\n\t\tsort: sortSchema.optional(),\r\n\t\tquery: MongoQuerySchema.optional(),\r\n\t\tselect: z.record(z.string(), z.union([z.literal(0), z.literal(1)])).optional(),\r\n\t\tpopulate: z.union([populateSchema, z.array(populateSchema)]).optional(),\r\n\t\tsearch: z.object({ searchKey: z.string(), searchFields: z.array(z.string()).optional() }).optional(),\r\n\t})\r\n\t.optional();\r\n\r\n/**\r\n * Infer TypeScript type from Zod schema\r\n */\r\nexport type FilterDTO = z.infer<typeof FilterSchema>;\r\n\r\n/**\r\n * Define String schema\r\n */\r\nexport const StringSchema = z.string().min(1, 'String cannot be empty').max(255, 'String is too long');\r\n\r\n/**\r\n * Common address validation schema that can be reused across models.\r\n * Provides validation for address-related fields.\r\n *\r\n * @example\r\n * ```typescript\r\n * const userSchema = z.object({\r\n * name: z.string(),\r\n * address: AddressSchema\r\n * });\r\n * ```\r\n */\r\nexport const AddressSchema = z.object({\r\n\taddress: ZodValidation.string('Address'),\r\n\tdescription: ZodValidation.string('Description').optional(),\r\n\tcity: ZodValidation.string('City'),\r\n\tstate: ZodValidation.string('State'),\r\n\tcountry: ZodValidation.string('Country'),\r\n\tlocation: z.object({\r\n\t\ttype: ZodValidation.enumType(GeoLocationType, 'GeoLocationType').default(GeoLocationType.POINT),\r\n\t\tcoordinates: ZodValidation.array(ZodValidation.number('Coordinate'), 'Coordinates', 2, 2),\r\n\t}),\r\n\tlatitude: ZodValidation.number('Latitude'),\r\n\tlongitude: ZodValidation.number('Longitude'),\r\n\tzone: ZodValidation.objectId('Zone').optional(),\r\n});\r\n\r\n/**\r\n * Common user address validation schema that can be reused across models.\r\n * Provides validation for address-related fields.\r\n *\r\n * @example\r\n * ```typescript\r\n * const userSchema = z.object({\r\n * name: z.string(),\r\n * address: UserAddressSchema\r\n * });\r\n * ```\r\n */\r\nexport const UserAddressSchema = AddressSchema.extend({\r\n\taddressLabel: ZodValidation.string('Address Label'),\r\n\tapartment: ZodValidation.string('Apartment'),\r\n\tbuildingName: ZodValidation.string('Building Name'),\r\n\tdeliveryOption: ZodValidation.string('Delivery Option').optional(),\r\n\tinstructions: ZodValidation.string('Instructions').optional(),\r\n});\r\n\r\n/**\r\n * Common courier address validation schema that can be reused across models.\r\n * Provides validation for address-related fields.\r\n *\r\n * @example\r\n * ```typescript\r\n * const courierAddressSchema = z.object({\r\n * name: z.string(),\r\n * address: courierAddressSchema\r\n * });\r\n * ```\r\n */\r\nexport const CourierAddressSchema = UserAddressSchema.extend({\r\n\tname: ZodValidation.string('Name'),\r\n\tphoneNumber: ZodValidation.string('Phone Number'),\r\n});\r\n\r\n/**\r\n * Common duration validation schema that can be reused across models.\r\n * Provides validation for duration fields.\r\n *\r\n * @example\r\n * ```typescript\r\n * const subscriptionSchema = z.object({\r\n * fee: z.number(),\r\n * duration: DurationSchema\r\n * });\r\n * ```\r\n */\r\nexport const DurationSchema = z.object({\r\n\tstart: ZodValidation.date('Start'),\r\n\tend: ZodValidation.date('End').optional(),\r\n});\r\n\r\n/**\r\n * Common Work Hour validation schema that can be reused across models.\r\n * Provides validation for workHourSetting fields.\r\n *\r\n * @example\r\n * ```typescript\r\n * const settingSchema = z.object({\r\n * vat: z.number(),\r\n * workHourSetting: WorkHourSettingSchema\r\n * });\r\n * ```\r\n */\r\nconst StartEndTimeSchema = z.object({\r\n\tstart: ZodValidation.string('Start'),\r\n\tend: ZodValidation.string('End'),\r\n});\r\n\r\nexport const NormalHourSchema = z.object({\r\n\tday: ZodValidation.enumType(WeekDay, 'Day'),\r\n\tstatus: ZodValidation.enumType(WorkStatus, 'Status'),\r\n\topeningHours: ZodValidation.array(StartEndTimeSchema).default([]),\r\n});\r\n\r\nexport const HolidayHourSchema = z.object({\r\n\tdate: ZodValidation.date('Date'),\r\n\tstatus: ZodValidation.enumType(HolidayWorkStatus, 'Status'),\r\n\tclosingHour: StartEndTimeSchema,\r\n});\r\n\r\nexport const WorkHourSettingSchema = z.object({\r\n\tnormalHours: ZodValidation.array(NormalHourSchema).default([]),\r\n\tholidayHours: ZodValidation.array(HolidayHourSchema).default([]),\r\n});\r\n\r\n/**\r\n * Schema for validating user login credentials.\r\n * This schema ensures that the provided email and password meet the required validation rules.\r\n *\r\n * @example\r\n * ```typescript\r\n * const credentials = {\r\n * email: 'user@example.com',\r\n * password: 'securePassword123',\r\n * };\r\n * ```\r\n */\r\nexport const LoginSchema = z.object({\r\n\temail: ZodValidation.email('Email', {\r\n\t\trequiredMessage: 'Please enter a valid email address.',\r\n\t\tinvalidMessage: 'Please enter a valid email address.',\r\n\t}),\r\n\tpassword: ZodValidation.string('Password', { requiredMessage: 'Please enter password' }),\r\n});\r\nexport type LoginDTO = DTO<typeof LoginSchema>;\r\n\r\nconst metadataSchema = z.object({\r\n\tpage: ZodValidation.number(),\r\n\tsize: ZodValidation.number(),\r\n\ttotalElements: ZodValidation.number(),\r\n\ttotalPages: ZodValidation.number(),\r\n});\r\nexport const createPaginatedSchema = <T>(documentSchema: z.ZodSchema<T>) =>\r\n\tz.object({\r\n\t\tmetadata: metadataSchema.optional(),\r\n\t\tdocuments: ZodValidation.array(documentSchema),\r\n\t});\r\n\r\nexport const createResponseSchema = <T>(schema: z.ZodSchema<T>) =>\r\n\tz.object({\r\n\t\tsuccess: ZodValidation.boolean(),\r\n\t\tmessage: ZodValidation.string(),\r\n\t\tdata: z.union([createPaginatedSchema(schema), schema]).optional(),\r\n\t});\r\n\r\n/**\r\n * Schema for validating token data, typically used for authentication.\r\n * This schema ensures that the provided access token and refresh token are valid strings.\r\n *\r\n * @example\r\n * ```typescript\r\n * const tokens = {\r\n * accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\r\n * refreshToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\r\n * };\r\n * ```\r\n */\r\nexport const TokenSchema = z.object({\r\n\taccessToken: ZodValidation.string('AccessToken'),\r\n\trefreshToken: ZodValidation.string('RefreshToken'),\r\n});\r\n\r\n/**\r\n * Schema validation for sorting order\r\n */\r\nexport const UpdateSortingOrderSchema = z.object({\r\n\tstartIndex: ZodValidation.number('StartIndex').default(1),\r\n\tlist: ZodValidation.array(ZodValidation.objectId('_id'), 'List', 1),\r\n});\r\nexport type UpdateSortingOrderDTO = DTO<typeof UpdateSortingOrderSchema>;\r\n\r\n/**\r\n * Schema validation for delete\r\n */\r\nexport const DeleteSchema = z.object({\r\n\t_id: ZodValidation.objectId('_id'),\r\n\tsoftDelete: ZodValidation.boolean('Soft Delete').default(true),\r\n});\r\nexport type DeleteDTO = DTO<typeof DeleteSchema>;\r\n\r\n/**\r\n * Schema validation for Id\r\n */\r\nexport const IdSchema = ZodValidation.objectId();\r\n"]}
1
+ {"version":3,"file":"common-validation.js","sourceRoot":"/","sources":["utilities/validation/common-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import { z, ZodSchema } from 'zod';\nimport { DTO, ZodValidation } from './global-validation';\nimport { GeoLocationType, HolidayWorkStatus, WeekDay, WorkStatus } from '../enum';\n\n/**\n * Define MongoDB query schema (fields + operators) using lazy evaluation to avoid circular dependency\n */\nconst MongoQuerySchema: z.ZodType<Record<string, any>> = z.lazy(() =>\n\tz.record(z.union([z.any(), MongoOperatorsSchema]))\n);\n\n/**\n * Define allowed MongoDB query operators\n */\nconst MongoOperatorsSchema = z.object({\n\t$eq: z.any().optional(),\n\t$ne: z.any().optional(),\n\t$gt: z.any().optional(),\n\t$gte: z.any().optional(),\n\t$lt: z.any().optional(),\n\t$lte: z.any().optional(),\n\t$in: z.array(z.any()).optional(),\n\t$nin: z.array(z.any()).optional(),\n\t$exists: z.boolean().optional(),\n\t$regex: z.string().optional(),\n\t$and: z.array(MongoQuerySchema).optional(),\n\t$or: z.array(MongoQuerySchema).optional(),\n\t$not: MongoQuerySchema.optional(),\n\t$nor: z.array(MongoQuerySchema).optional(),\n});\n\nconst sortSchema = z.record(z.string(), z.union([z.literal(1), z.literal(-1)]));\n\nconst populateSchema = z.object({\n\tpath: z.string(), // required\n\tselect: z.record(z.string(), z.union([z.literal(0), z.literal(1)])).optional(),\n\tmatch: z.record(z.string(), z.any()).optional(),\n\toptions: z\n\t\t.object({\n\t\t\tsort: sortSchema.optional(),\n\t\t\tlimit: z.number().optional(),\n\t\t\tskip: z.number().optional(),\n\t\t})\n\t\t.optional(),\n});\n\n/**\n * Define the filter schema using MongoQuerySchema\n */\nexport const FilterSchema = z\n\t.object({\n\t\tsize: z\n\t\t\t.number()\n\t\t\t.min(1, { message: 'Size must be greater than 0.' })\n\t\t\t.max(100, { message: 'Size cannot exceed 100.' })\n\t\t\t.optional()\n\t\t\t.default(10),\n\t\tpage: z.number().min(1, { message: 'Page number must be at least 1.' }).optional().default(1),\n\t\tsort: sortSchema.optional(),\n\t\tquery: MongoQuerySchema.optional(),\n\t\tselect: z.record(z.string(), z.union([z.literal(0), z.literal(1)])).optional(),\n\t\tpopulate: z.union([populateSchema, z.array(populateSchema)]).optional(),\n\t\tsearch: z.object({ searchKey: z.string(), searchFields: z.array(z.string()).optional() }).optional(),\n\t})\n\t.optional();\n\n/**\n * Infer TypeScript type from Zod schema\n */\nexport type FilterDTO = z.infer<typeof FilterSchema>;\n\n/**\n * Define String schema\n */\nexport const StringSchema = z.string().min(1, 'String cannot be empty').max(255, 'String is too long');\n\n/**\n * Common address validation schema that can be reused across models.\n * Provides validation for address-related fields.\n *\n * @example\n * ```typescript\n * const userSchema = z.object({\n * name: z.string(),\n * address: AddressSchema\n * });\n * ```\n */\nexport const AddressSchema = z.object({\n\taddress: ZodValidation.string('Address'),\n\tdescription: ZodValidation.string('Description').optional(),\n\tcity: ZodValidation.string('City'),\n\tstate: ZodValidation.string('State'),\n\tcountry: ZodValidation.string('Country'),\n\tlocation: z.object({\n\t\ttype: ZodValidation.enumType(GeoLocationType, 'GeoLocationType').default(GeoLocationType.POINT),\n\t\tcoordinates: ZodValidation.array(ZodValidation.number('Coordinate'), 'Coordinates', 2, 2),\n\t}),\n\tlatitude: ZodValidation.number('Latitude'),\n\tlongitude: ZodValidation.number('Longitude'),\n\tzone: ZodValidation.objectId('Zone').optional(),\n});\n\n/**\n * Common user address validation schema that can be reused across models.\n * Provides validation for address-related fields.\n *\n * @example\n * ```typescript\n * const userSchema = z.object({\n * name: z.string(),\n * address: UserAddressSchema\n * });\n * ```\n */\nexport const UserAddressSchema = AddressSchema.extend({\n\taddressLabel: ZodValidation.string('Address Label'),\n\tapartment: ZodValidation.string('Apartment'),\n\tbuildingName: ZodValidation.string('Building Name'),\n\tdeliveryOption: ZodValidation.string('Delivery Option').optional(),\n\tinstructions: ZodValidation.string('Instructions').optional(),\n});\n\n/**\n * Common courier address validation schema that can be reused across models.\n * Provides validation for address-related fields.\n *\n * @example\n * ```typescript\n * const courierAddressSchema = z.object({\n * name: z.string(),\n * address: courierAddressSchema\n * });\n * ```\n */\nexport const CourierAddressSchema = UserAddressSchema.extend({\n\tname: ZodValidation.string('Name'),\n\tphoneNumber: ZodValidation.string('Phone Number'),\n});\n\n/**\n * Common duration validation schema that can be reused across models.\n * Provides validation for duration fields.\n *\n * @example\n * ```typescript\n * const subscriptionSchema = z.object({\n * fee: z.number(),\n * duration: DurationSchema\n * });\n * ```\n */\nexport const DurationSchema = z.object({\n\tstart: ZodValidation.date('Start'),\n\tend: ZodValidation.date('End').optional(),\n});\n\n/**\n * Common Work Hour validation schema that can be reused across models.\n * Provides validation for workHourSetting fields.\n *\n * @example\n * ```typescript\n * const settingSchema = z.object({\n * vat: z.number(),\n * workHourSetting: WorkHourSettingSchema\n * });\n * ```\n */\nconst StartEndTimeSchema = z.object({\n\tstart: ZodValidation.string('Start'),\n\tend: ZodValidation.string('End'),\n});\n\nexport const NormalHourSchema = z.object({\n\tday: ZodValidation.enumType(WeekDay, 'Day'),\n\tstatus: ZodValidation.enumType(WorkStatus, 'Status'),\n\topeningHours: ZodValidation.array(StartEndTimeSchema).default([]),\n});\n\nexport const HolidayHourSchema = z.object({\n\tdate: ZodValidation.date('Date'),\n\tstatus: ZodValidation.enumType(HolidayWorkStatus, 'Status'),\n\tclosingHour: StartEndTimeSchema,\n});\n\nexport const WorkHourSettingSchema = z.object({\n\tnormalHours: ZodValidation.array(NormalHourSchema).default([]),\n\tholidayHours: ZodValidation.array(HolidayHourSchema).default([]),\n});\n\n/**\n * Schema for validating user login credentials.\n * This schema ensures that the provided email and password meet the required validation rules.\n *\n * @example\n * ```typescript\n * const credentials = {\n * email: 'user@example.com',\n * password: 'securePassword123',\n * };\n * ```\n */\nexport const LoginSchema = z.object({\n\temail: ZodValidation.email('Email', {\n\t\trequiredMessage: 'Please enter a valid email address.',\n\t\tinvalidMessage: 'Please enter a valid email address.',\n\t}),\n\tpassword: ZodValidation.string('Password', { requiredMessage: 'Please enter password' }),\n});\nexport type LoginDTO = DTO<typeof LoginSchema>;\n\nconst metadataSchema = z.object({\n\tpage: ZodValidation.number(),\n\tsize: ZodValidation.number(),\n\ttotalElements: ZodValidation.number(),\n\ttotalPages: ZodValidation.number(),\n});\nexport const createPaginatedSchema = <T>(documentSchema: z.ZodSchema<T>) =>\n\tz.object({\n\t\tmetadata: metadataSchema.optional(),\n\t\tdocuments: ZodValidation.array(documentSchema),\n\t});\n\nexport const createResponseSchema = <T>(schema: z.ZodSchema<T>) =>\n\tz.object({\n\t\tsuccess: ZodValidation.boolean(),\n\t\tmessage: ZodValidation.string(),\n\t\tdata: z.union([createPaginatedSchema(schema), schema]).optional(),\n\t});\n\n/**\n * Schema for validating token data, typically used for authentication.\n * This schema ensures that the provided access token and refresh token are valid strings.\n *\n * @example\n * ```typescript\n * const tokens = {\n * accessToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * refreshToken: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * };\n * ```\n */\nexport const TokenSchema = z.object({\n\taccessToken: ZodValidation.string('AccessToken'),\n\trefreshToken: ZodValidation.string('RefreshToken'),\n});\n\n/**\n * Schema validation for sorting order\n */\nexport const UpdateSortingOrderSchema = z.object({\n\tstartIndex: ZodValidation.number('StartIndex').default(1),\n\tlist: ZodValidation.array(ZodValidation.objectId('_id'), 'List', 1),\n});\nexport type UpdateSortingOrderDTO = DTO<typeof UpdateSortingOrderSchema>;\n\n/**\n * Schema validation for delete\n */\nexport const DeleteSchema = z.object({\n\t_id: ZodValidation.objectId('_id'),\n\tsoftDelete: ZodValidation.boolean('Soft Delete').default(true),\n});\nexport type DeleteDTO = DTO<typeof DeleteSchema>;\n\n/**\n * Schema validation for Id\n */\nexport const IdSchema = ZodValidation.objectId();\n"]}