arkos 2.0.0-next.16 → 2.0.0-next.18

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 (434) hide show
  1. package/README.md +33 -31
  2. package/cli.js +1 -8
  3. package/dist/esm/app.js +5 -12
  4. package/dist/esm/app.js.map +1 -1
  5. package/dist/esm/components/arkos-gateway/arkos-gateway.js +337 -0
  6. package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -0
  7. package/dist/esm/components/arkos-gateway/socket-extensions.js +161 -0
  8. package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -0
  9. package/dist/esm/components/arkos-gateway/types.js +3 -0
  10. package/dist/esm/components/arkos-gateway/types.js.map +1 -0
  11. package/dist/esm/components/arkos-gateway/utils/helpers.js +105 -0
  12. package/dist/esm/components/arkos-gateway/utils/helpers.js.map +1 -0
  13. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +47 -0
  14. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -0
  15. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +39 -0
  16. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -0
  17. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js +13 -0
  18. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js.map +1 -0
  19. package/dist/esm/components/arkos-policy/index.js.map +1 -1
  20. package/dist/esm/components/arkos-route-hook/index.js +2 -1
  21. package/dist/esm/components/arkos-route-hook/index.js.map +1 -1
  22. package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
  23. package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
  24. package/dist/esm/exports/index.js +2 -2
  25. package/dist/esm/exports/index.js.map +1 -1
  26. package/dist/esm/exports/services/index.js +2 -2
  27. package/dist/esm/exports/services/index.js.map +1 -1
  28. package/dist/esm/exports/websockets.js +5 -0
  29. package/dist/esm/exports/websockets.js.map +1 -0
  30. package/dist/esm/generated.js.map +1 -1
  31. package/dist/esm/modules/auth/auth.controller.js +2 -2
  32. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  33. package/dist/esm/modules/auth/auth.service.js +83 -204
  34. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  35. package/dist/esm/modules/auth/utils/auth-error-objects.js +2 -2
  36. package/dist/esm/modules/auth/utils/auth-error-objects.js.map +1 -1
  37. package/dist/esm/modules/auth/utils/auth-hooks-manager.js +148 -0
  38. package/dist/esm/modules/auth/utils/auth-hooks-manager.js.map +1 -0
  39. package/dist/esm/modules/auth/utils/docs-links.js +6 -0
  40. package/dist/esm/modules/auth/utils/docs-links.js.map +1 -0
  41. package/dist/esm/modules/auth/utils/services/auth-action.service.js +6 -4
  42. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  43. package/dist/esm/modules/base/base.controller.js +11 -5
  44. package/dist/esm/modules/base/base.controller.js.map +1 -1
  45. package/dist/esm/modules/base/base.middlewares.js +12 -21
  46. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  47. package/dist/esm/modules/base/base.service.js +16 -128
  48. package/dist/esm/modules/base/base.service.js.map +1 -1
  49. package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
  50. package/dist/esm/modules/email/email.service.js +14 -7
  51. package/dist/esm/modules/email/email.service.js.map +1 -1
  52. package/dist/esm/modules/error-handler/error-handler.controller.js +6 -66
  53. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  54. package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
  55. package/dist/esm/modules/error-handler/utils/get-handled-error.js +68 -0
  56. package/dist/esm/modules/error-handler/utils/get-handled-error.js.map +1 -0
  57. package/dist/esm/modules/file-upload/file-upload.router.js +9 -2
  58. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  59. package/dist/esm/modules/file-upload/file-upload.service.js +1 -1
  60. package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
  61. package/dist/esm/modules/swagger/swagger.router.js +11 -10
  62. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  63. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +3 -1
  64. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
  65. package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
  66. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +4 -2
  67. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  68. package/dist/esm/server.js +1 -1
  69. package/dist/esm/server.js.map +1 -1
  70. package/dist/esm/types/arkos.js.map +1 -1
  71. package/dist/esm/types/index.js.map +1 -1
  72. package/dist/esm/types/new-arkos-config.js.map +1 -1
  73. package/dist/esm/types/upload.js +2 -0
  74. package/dist/esm/types/upload.js.map +1 -0
  75. package/dist/esm/types/validation/validation-manager.js +50 -0
  76. package/dist/esm/types/validation/validation-manager.js.map +1 -0
  77. package/dist/esm/types/validation/validator.js +2 -0
  78. package/dist/esm/types/validation/validator.js.map +1 -0
  79. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +9 -33
  80. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
  81. package/dist/esm/utils/arkos-router/index.js +15 -3
  82. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  83. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  84. package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
  85. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +45 -9
  86. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
  87. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +26 -6
  88. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
  89. package/dist/esm/utils/cli/build.js +11 -2
  90. package/dist/esm/utils/cli/build.js.map +1 -1
  91. package/dist/esm/utils/cli/dev.js +4 -6
  92. package/dist/esm/utils/cli/dev.js.map +1 -1
  93. package/dist/esm/utils/cli/generate.js +0 -90
  94. package/dist/esm/utils/cli/generate.js.map +1 -1
  95. package/dist/esm/utils/cli/index.js +10 -74
  96. package/dist/esm/utils/cli/index.js.map +1 -1
  97. package/dist/esm/utils/cli/start.js +20 -11
  98. package/dist/esm/utils/cli/start.js.map +1 -1
  99. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  100. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +53 -17
  101. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  102. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +3 -54
  103. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  104. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +11 -4
  105. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  106. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +2 -2
  107. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  108. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +18 -18
  109. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  110. package/dist/esm/utils/cli/utils/template-generators.js +27 -24
  111. package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
  112. package/dist/esm/utils/docs-links.js +2 -0
  113. package/dist/esm/utils/docs-links.js.map +1 -0
  114. package/dist/esm/utils/features/api.features.js.map +1 -1
  115. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  116. package/dist/esm/utils/helpers/exit-error.js +1 -1
  117. package/dist/esm/utils/helpers/exit-error.js.map +1 -1
  118. package/dist/esm/utils/initialize-app.js +3 -3
  119. package/dist/esm/utils/initialize-app.js.map +1 -1
  120. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -18
  121. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  122. package/dist/esm/utils/remove-dir.js +1 -1
  123. package/dist/esm/utils/remove-dir.js.map +1 -1
  124. package/dist/esm/utils/setup-app.js.map +1 -1
  125. package/dist/types/app.d.ts +4 -0
  126. package/dist/types/components/arkos-gateway/arkos-gateway.d.ts +121 -0
  127. package/dist/types/components/arkos-gateway/socket-extensions.d.ts +79 -0
  128. package/dist/types/components/arkos-gateway/types.d.ts +364 -0
  129. package/dist/types/components/arkos-gateway/utils/helpers.d.ts +9 -0
  130. package/dist/types/components/arkos-gateway/utils/memory-gateway-store.d.ts +14 -0
  131. package/dist/types/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.d.ts +20 -0
  132. package/dist/types/components/arkos-gateway/utils/rate-limiter.d.ts +11 -0
  133. package/dist/types/components/arkos-route-hook/index.d.ts +11 -5
  134. package/dist/types/components/arkos-route-hook/reader.d.ts +2 -2
  135. package/dist/types/components/arkos-route-hook/types.d.ts +5 -1
  136. package/dist/types/exports/index.d.ts +3 -2
  137. package/dist/types/exports/services/index.d.ts +3 -3
  138. package/dist/types/exports/websockets.d.ts +5 -0
  139. package/dist/types/modules/auth/auth.service.d.ts +12 -36
  140. package/dist/types/modules/auth/utils/auth-hooks-manager.d.ts +63 -0
  141. package/dist/types/modules/auth/utils/docs-links.d.ts +3 -0
  142. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +2 -2
  143. package/dist/types/modules/base/base.controller.d.ts +2 -2
  144. package/dist/types/modules/base/base.service.d.ts +5 -15
  145. package/dist/types/modules/base/types/base.service.types.d.ts +11 -0
  146. package/dist/types/modules/error-handler/utils/catch-async.d.ts +2 -2
  147. package/dist/types/modules/error-handler/utils/get-handled-error.d.ts +1 -0
  148. package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +6 -1
  149. package/dist/types/types/arkos.d.ts +2 -15
  150. package/dist/types/types/index.d.ts +6 -5
  151. package/dist/types/types/new-arkos-config.d.ts +1 -1
  152. package/dist/types/types/upload.d.ts +10 -0
  153. package/dist/types/types/validation/validation-manager.d.ts +27 -0
  154. package/dist/types/types/validation/validator.d.ts +2 -0
  155. package/dist/types/utils/arkos-router/index.d.ts +7 -0
  156. package/dist/types/utils/arkos-router/types/index.d.ts +35 -21
  157. package/dist/types/utils/arkos-router/types/upload-config.d.ts +2 -1
  158. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +6 -7
  159. package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +1 -0
  160. package/dist/types/utils/cli/build.d.ts +1 -1
  161. package/dist/types/utils/cli/generate.d.ts +11 -10
  162. package/dist/types/utils/cli/start.d.ts +2 -0
  163. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +7 -0
  164. package/dist/types/utils/docs-links.d.ts +1 -0
  165. package/dist/types/utils/features/api.features.d.ts +1 -2
  166. package/dist/types/utils/helpers/arkos-config.helpers.d.ts +5 -0
  167. package/package.json +61 -30
  168. package/dist/cjs/app.js +0 -121
  169. package/dist/cjs/app.js.map +0 -1
  170. package/dist/cjs/components/arkos-loadable-registry/index.js +0 -28
  171. package/dist/cjs/components/arkos-loadable-registry/index.js.map +0 -1
  172. package/dist/cjs/components/arkos-loadable-translator/index.js +0 -144
  173. package/dist/cjs/components/arkos-loadable-translator/index.js.map +0 -1
  174. package/dist/cjs/components/arkos-policy/index.js +0 -38
  175. package/dist/cjs/components/arkos-policy/index.js.map +0 -1
  176. package/dist/cjs/components/arkos-policy/types.js +0 -3
  177. package/dist/cjs/components/arkos-policy/types.js.map +0 -1
  178. package/dist/cjs/components/arkos-route-hook/index.js +0 -50
  179. package/dist/cjs/components/arkos-route-hook/index.js.map +0 -1
  180. package/dist/cjs/components/arkos-route-hook/reader.js +0 -47
  181. package/dist/cjs/components/arkos-route-hook/reader.js.map +0 -1
  182. package/dist/cjs/components/arkos-route-hook/types.js +0 -3
  183. package/dist/cjs/components/arkos-route-hook/types.js.map +0 -1
  184. package/dist/cjs/components/arkos-service-hook/index.js +0 -35
  185. package/dist/cjs/components/arkos-service-hook/index.js.map +0 -1
  186. package/dist/cjs/components/arkos-service-hook/reader.js +0 -30
  187. package/dist/cjs/components/arkos-service-hook/reader.js.map +0 -1
  188. package/dist/cjs/components/arkos-service-hook/types.js +0 -3
  189. package/dist/cjs/components/arkos-service-hook/types.js.map +0 -1
  190. package/dist/cjs/exports/auth/index.js +0 -6
  191. package/dist/cjs/exports/auth/index.js.map +0 -1
  192. package/dist/cjs/exports/config.js +0 -6
  193. package/dist/cjs/exports/config.js.map +0 -1
  194. package/dist/cjs/exports/controllers/index.js +0 -42
  195. package/dist/cjs/exports/controllers/index.js.map +0 -1
  196. package/dist/cjs/exports/error-handler/index.js +0 -26
  197. package/dist/cjs/exports/error-handler/index.js.map +0 -1
  198. package/dist/cjs/exports/index.js +0 -23
  199. package/dist/cjs/exports/index.js.map +0 -1
  200. package/dist/cjs/exports/middlewares/index.js +0 -7
  201. package/dist/cjs/exports/middlewares/index.js.map +0 -1
  202. package/dist/cjs/exports/prisma/index.js +0 -13
  203. package/dist/cjs/exports/prisma/index.js.map +0 -1
  204. package/dist/cjs/exports/services/index.js +0 -53
  205. package/dist/cjs/exports/services/index.js.map +0 -1
  206. package/dist/cjs/exports/utils/index.js +0 -26
  207. package/dist/cjs/exports/utils/index.js.map +0 -1
  208. package/dist/cjs/exports/validation/index.js +0 -11
  209. package/dist/cjs/exports/validation/index.js.map +0 -1
  210. package/dist/cjs/generated.js +0 -7
  211. package/dist/cjs/generated.js.map +0 -1
  212. package/dist/cjs/modules/auth/auth.controller.js +0 -254
  213. package/dist/cjs/modules/auth/auth.controller.js.map +0 -1
  214. package/dist/cjs/modules/auth/auth.router.js +0 -130
  215. package/dist/cjs/modules/auth/auth.router.js.map +0 -1
  216. package/dist/cjs/modules/auth/auth.service.js +0 -433
  217. package/dist/cjs/modules/auth/auth.service.js.map +0 -1
  218. package/dist/cjs/modules/auth/utils/auth-error-objects.js +0 -10
  219. package/dist/cjs/modules/auth/utils/auth-error-objects.js.map +0 -1
  220. package/dist/cjs/modules/auth/utils/auth-openapi-generator.js +0 -372
  221. package/dist/cjs/modules/auth/utils/auth-openapi-generator.js.map +0 -1
  222. package/dist/cjs/modules/auth/utils/auth-prisma-json-schema-generator.js +0 -101
  223. package/dist/cjs/modules/auth/utils/auth-prisma-json-schema-generator.js.map +0 -1
  224. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +0 -83
  225. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
  226. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +0 -154
  227. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +0 -1
  228. package/dist/cjs/modules/base/base.controller.js +0 -287
  229. package/dist/cjs/modules/base/base.controller.js.map +0 -1
  230. package/dist/cjs/modules/base/base.middlewares.js +0 -238
  231. package/dist/cjs/modules/base/base.middlewares.js.map +0 -1
  232. package/dist/cjs/modules/base/base.router.js +0 -126
  233. package/dist/cjs/modules/base/base.router.js.map +0 -1
  234. package/dist/cjs/modules/base/base.service.js +0 -436
  235. package/dist/cjs/modules/base/base.service.js.map +0 -1
  236. package/dist/cjs/modules/base/types/base.service.types.js +0 -3
  237. package/dist/cjs/modules/base/types/base.service.types.js.map +0 -1
  238. package/dist/cjs/modules/base/utils/error-prettifier.js +0 -188
  239. package/dist/cjs/modules/base/utils/error-prettifier.js.map +0 -1
  240. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +0 -49
  241. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
  242. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +0 -243
  243. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
  244. package/dist/cjs/modules/base/utils/model-openapi-generator.js +0 -443
  245. package/dist/cjs/modules/base/utils/model-openapi-generator.js.map +0 -1
  246. package/dist/cjs/modules/base/utils/router-validator.js +0 -13
  247. package/dist/cjs/modules/base/utils/router-validator.js.map +0 -1
  248. package/dist/cjs/modules/base/utils/service-hooks-manager.js +0 -19
  249. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +0 -1
  250. package/dist/cjs/modules/debugger/debugger.service.js +0 -59
  251. package/dist/cjs/modules/debugger/debugger.service.js.map +0 -1
  252. package/dist/cjs/modules/email/email.service.js +0 -106
  253. package/dist/cjs/modules/email/email.service.js.map +0 -1
  254. package/dist/cjs/modules/error-handler/error-handler.controller.js +0 -166
  255. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +0 -1
  256. package/dist/cjs/modules/error-handler/utils/app-error.js +0 -27
  257. package/dist/cjs/modules/error-handler/utils/app-error.js.map +0 -1
  258. package/dist/cjs/modules/error-handler/utils/catch-async.js +0 -21
  259. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +0 -1
  260. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +0 -104
  261. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  262. package/dist/cjs/modules/error-handler/utils/errors.js +0 -158
  263. package/dist/cjs/modules/error-handler/utils/errors.js.map +0 -1
  264. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +0 -39
  265. package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +0 -1
  266. package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -252
  267. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
  268. package/dist/cjs/modules/file-upload/file-upload.router.js +0 -96
  269. package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
  270. package/dist/cjs/modules/file-upload/file-upload.service.js +0 -343
  271. package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
  272. package/dist/cjs/modules/file-upload/utils/file-upload-json-schema-generator.js +0 -351
  273. package/dist/cjs/modules/file-upload/utils/file-upload-json-schema-generator.js.map +0 -1
  274. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +0 -134
  275. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +0 -1
  276. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -100
  277. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  278. package/dist/cjs/modules/swagger/swagger.router.js +0 -81
  279. package/dist/cjs/modules/swagger/swagger.router.js.map +0 -1
  280. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +0 -306
  281. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +0 -1
  282. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +0 -53
  283. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +0 -1
  284. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +0 -72
  285. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +0 -1
  286. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +0 -331
  287. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +0 -1
  288. package/dist/cjs/package.json +0 -3
  289. package/dist/cjs/server.js +0 -60
  290. package/dist/cjs/server.js.map +0 -1
  291. package/dist/cjs/types/arkos-config/utils.js +0 -3
  292. package/dist/cjs/types/arkos-config/utils.js.map +0 -1
  293. package/dist/cjs/types/arkos-prisma-input.js +0 -3
  294. package/dist/cjs/types/arkos-prisma-input.js.map +0 -1
  295. package/dist/cjs/types/arkos.js +0 -3
  296. package/dist/cjs/types/arkos.js.map +0 -1
  297. package/dist/cjs/types/auth.js +0 -3
  298. package/dist/cjs/types/auth.js.map +0 -1
  299. package/dist/cjs/types/index.js +0 -3
  300. package/dist/cjs/types/index.js.map +0 -1
  301. package/dist/cjs/types/new-arkos-config.js +0 -3
  302. package/dist/cjs/types/new-arkos-config.js.map +0 -1
  303. package/dist/cjs/types/router-config.js +0 -3
  304. package/dist/cjs/types/router-config.js.map +0 -1
  305. package/dist/cjs/utils/arkos-env.js +0 -9
  306. package/dist/cjs/utils/arkos-env.js.map +0 -1
  307. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +0 -184
  308. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +0 -1
  309. package/dist/cjs/utils/arkos-router/index.js +0 -153
  310. package/dist/cjs/utils/arkos-router/index.js.map +0 -1
  311. package/dist/cjs/utils/arkos-router/route-config-registry.js +0 -16
  312. package/dist/cjs/utils/arkos-router/route-config-registry.js.map +0 -1
  313. package/dist/cjs/utils/arkos-router/route-config-validator.js +0 -56
  314. package/dist/cjs/utils/arkos-router/route-config-validator.js.map +0 -1
  315. package/dist/cjs/utils/arkos-router/types/body-parser-config.js +0 -3
  316. package/dist/cjs/utils/arkos-router/types/body-parser-config.js.map +0 -1
  317. package/dist/cjs/utils/arkos-router/types/index.js +0 -3
  318. package/dist/cjs/utils/arkos-router/types/index.js.map +0 -1
  319. package/dist/cjs/utils/arkos-router/types/openapi-config.js +0 -3
  320. package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +0 -1
  321. package/dist/cjs/utils/arkos-router/types/upload-config.js +0 -3
  322. package/dist/cjs/utils/arkos-router/types/upload-config.js.map +0 -1
  323. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +0 -158
  324. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +0 -1
  325. package/dist/cjs/utils/arkos-router/utils/helpers/index.js +0 -179
  326. package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +0 -1
  327. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +0 -540
  328. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +0 -1
  329. package/dist/cjs/utils/bundler.js +0 -163
  330. package/dist/cjs/utils/bundler.js.map +0 -1
  331. package/dist/cjs/utils/cli/build.js +0 -199
  332. package/dist/cjs/utils/cli/build.js.map +0 -1
  333. package/dist/cjs/utils/cli/dev.js +0 -133
  334. package/dist/cjs/utils/cli/dev.js.map +0 -1
  335. package/dist/cjs/utils/cli/export-auth-action.js +0 -80
  336. package/dist/cjs/utils/cli/export-auth-action.js.map +0 -1
  337. package/dist/cjs/utils/cli/generate.js +0 -333
  338. package/dist/cjs/utils/cli/generate.js.map +0 -1
  339. package/dist/cjs/utils/cli/index.js +0 -259
  340. package/dist/cjs/utils/cli/index.js.map +0 -1
  341. package/dist/cjs/utils/cli/prisma-generate.js +0 -112
  342. package/dist/cjs/utils/cli/prisma-generate.js.map +0 -1
  343. package/dist/cjs/utils/cli/start.js +0 -74
  344. package/dist/cjs/utils/cli/start.js.map +0 -1
  345. package/dist/cjs/utils/cli/utils/cli.helpers.js +0 -24
  346. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +0 -1
  347. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +0 -118
  348. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +0 -1
  349. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +0 -73
  350. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js.map +0 -1
  351. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +0 -810
  352. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +0 -1
  353. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -64
  354. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
  355. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +0 -242
  356. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +0 -1
  357. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +0 -51
  358. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +0 -1
  359. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +0 -23
  360. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +0 -1
  361. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +0 -50
  362. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +0 -1
  363. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +0 -545
  364. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +0 -1
  365. package/dist/cjs/utils/cli/utils/template-generators.js +0 -62
  366. package/dist/cjs/utils/cli/utils/template-generators.js.map +0 -1
  367. package/dist/cjs/utils/cli/utils/watermark-stamper.js +0 -26
  368. package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +0 -1
  369. package/dist/cjs/utils/define-config.js +0 -60
  370. package/dist/cjs/utils/define-config.js.map +0 -1
  371. package/dist/cjs/utils/dotenv.helpers.js +0 -46
  372. package/dist/cjs/utils/dotenv.helpers.js.map +0 -1
  373. package/dist/cjs/utils/dynamic-loader.js +0 -22
  374. package/dist/cjs/utils/dynamic-loader.js.map +0 -1
  375. package/dist/cjs/utils/expand-env.js +0 -72
  376. package/dist/cjs/utils/expand-env.js.map +0 -1
  377. package/dist/cjs/utils/features/api.features.js +0 -216
  378. package/dist/cjs/utils/features/api.features.js.map +0 -1
  379. package/dist/cjs/utils/features/port-and-host-allocator.js +0 -129
  380. package/dist/cjs/utils/features/port-and-host-allocator.js.map +0 -1
  381. package/dist/cjs/utils/helpers/api.features.helpers.js +0 -347
  382. package/dist/cjs/utils/helpers/api.features.helpers.js.map +0 -1
  383. package/dist/cjs/utils/helpers/arkos-config.helpers.js +0 -106
  384. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +0 -1
  385. package/dist/cjs/utils/helpers/change-case.helpers.js +0 -177
  386. package/dist/cjs/utils/helpers/change-case.helpers.js.map +0 -1
  387. package/dist/cjs/utils/helpers/deepmerge.helper.js +0 -115
  388. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +0 -1
  389. package/dist/cjs/utils/helpers/exit-error.js +0 -13
  390. package/dist/cjs/utils/helpers/exit-error.js.map +0 -1
  391. package/dist/cjs/utils/helpers/fs.helpers.js +0 -52
  392. package/dist/cjs/utils/helpers/fs.helpers.js.map +0 -1
  393. package/dist/cjs/utils/helpers/global.helpers.js +0 -106
  394. package/dist/cjs/utils/helpers/global.helpers.js.map +0 -1
  395. package/dist/cjs/utils/helpers/prisma.helpers.js +0 -56
  396. package/dist/cjs/utils/helpers/prisma.helpers.js.map +0 -1
  397. package/dist/cjs/utils/helpers/query-parser.helpers.js +0 -69
  398. package/dist/cjs/utils/helpers/query-parser.helpers.js.map +0 -1
  399. package/dist/cjs/utils/helpers/routers.helpers.js +0 -36
  400. package/dist/cjs/utils/helpers/routers.helpers.js.map +0 -1
  401. package/dist/cjs/utils/helpers/text.helpers.js +0 -28
  402. package/dist/cjs/utils/helpers/text.helpers.js.map +0 -1
  403. package/dist/cjs/utils/helpers/url-helpers.js +0 -14
  404. package/dist/cjs/utils/helpers/url-helpers.js.map +0 -1
  405. package/dist/cjs/utils/initialize-app.js +0 -80
  406. package/dist/cjs/utils/initialize-app.js.map +0 -1
  407. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +0 -366
  408. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +0 -1
  409. package/dist/cjs/utils/prisma/prisma-schema-parser.js +0 -380
  410. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +0 -1
  411. package/dist/cjs/utils/prisma/types.js +0 -3
  412. package/dist/cjs/utils/prisma/types.js.map +0 -1
  413. package/dist/cjs/utils/remove-dir.js +0 -14
  414. package/dist/cjs/utils/remove-dir.js.map +0 -1
  415. package/dist/cjs/utils/setup-app.js +0 -136
  416. package/dist/cjs/utils/setup-app.js.map +0 -1
  417. package/dist/cjs/utils/sheu.js +0 -131
  418. package/dist/cjs/utils/sheu.js.map +0 -1
  419. package/dist/cjs/utils/validate-dto.js +0 -19
  420. package/dist/cjs/utils/validate-dto.js.map +0 -1
  421. package/dist/cjs/utils/validate-schema.js +0 -75
  422. package/dist/cjs/utils/validate-schema.js.map +0 -1
  423. package/dist/esm/components/arkos-service-hook/index.js +0 -32
  424. package/dist/esm/components/arkos-service-hook/index.js.map +0 -1
  425. package/dist/esm/components/arkos-service-hook/reader.js +0 -24
  426. package/dist/esm/components/arkos-service-hook/reader.js.map +0 -1
  427. package/dist/esm/components/arkos-service-hook/types.js +0 -2
  428. package/dist/esm/components/arkos-service-hook/types.js.map +0 -1
  429. package/dist/esm/modules/base/utils/service-hooks-manager.js +0 -17
  430. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +0 -1
  431. package/dist/types/components/arkos-service-hook/index.d.ts +0 -41
  432. package/dist/types/components/arkos-service-hook/reader.d.ts +0 -35
  433. package/dist/types/components/arkos-service-hook/types.d.ts +0 -240
  434. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +0 -10
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { PrismaClient } from \"../../generated\";\nimport {\n CountFilters,\n CreateData,\n CreateManyData,\n CreateManyOptions,\n CreateOptions,\n Delegate,\n DeleteManyFilters,\n DeleteOneFilters,\n FindManyFilters,\n FindManyOptions,\n FindOneFilters,\n FindOneOptions,\n GetPayload,\n Models,\n UpdateManyData,\n UpdateManyFilters,\n UpdateManyOptions,\n UpdateOneData,\n UpdateOneFilters,\n UpdateOneOptions,\n} from \"./types/base.service.types\";\nimport serviceHooksManager from \"./utils/service-hooks-manager\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n ArkosServiceHookInstance,\n ArkosServiceHookMethodConfigs,\n ServiceHookContext,\n} from \"../../components/arkos-service-hook/types\";\nimport { serviceHookReader } from \"../../components/arkos-service-hook/reader\";\n\nexport interface ServiceOperationHooks {\n beforeOperation?: (params: any) => void | Promise<void>;\n afterOperation?: (result: any, params: any) => void | Promise<void>;\n beforePrisma?: (prismaArgs: any, params: any) => any | Promise<any>;\n afterPrisma?: (result: any, params: any) => any | Promise<any>;\n}\n\ninterface ServiceOperationConfig {\n operationType:\n | keyof ArkosServiceHookMethodConfigs<any, any>\n | \"batchDelete\"\n | \"batchUpdate\";\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: PrismaClient,\n config: ServiceOperationConfig,\n context: BaseService<any>\n ) => Promise<any>;\n hooks?: ServiceOperationHooks;\n}\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @example\n * ```ts\n * import { BaseService } from \"arkos/services\";\n *\n * export class UserService extends BaseService<\"user\"> {}\n *\n * const userService = new UserService(\"user\");\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/reference/base-service}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n */\nexport class BaseService<TModelName extends keyof Models = keyof Models> {\n modelName: TModelName;\n relationFields: ModelGroupRelationFields;\n private prismaInstace?: PrismaClient;\n\n constructor(modelName: TModelName) {\n this.modelName = camelCase(modelName as string) as TModelName;\n const modelFields = prismaSchemaParser?.getModelRelations?.(\n modelName as string\n );\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n get prisma() {\n if (!this.prismaInstace) this.prismaInstace = getPrismaInstance();\n return this.prismaInstace!;\n }\n\n private getServiceHook() {\n return loadableRegistry.getItem(\n \"ArkosServiceHook\",\n kebabCase(this.modelName)\n ) as ArkosServiceHookInstance<TModelName>;\n }\n\n private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceHookContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildHookParams(argsWithRelationFieldsHandled, config),\n context\n );\n\n if (config.hooks?.beforeOperation)\n await config.hooks.beforeOperation(\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n\n if (config.hooks?.beforePrisma) {\n argsWithRelationFieldsHandled = await config.hooks.beforePrisma(\n argsWithRelationFieldsHandled,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n argsWithRelationFieldsHandled,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);\n result = await (\n prisma[this.modelName as string] as Delegate<TModelName>\n )[config.prismaMethod](prismaArgs);\n }\n\n if (config.hooks?.afterPrisma) {\n result = await config.hooks.afterPrisma(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildHookParams(argsWithRelationFieldsHandled, config),\n result,\n },\n context\n );\n\n if (config.hooks?.afterOperation) {\n await config.hooks.afterOperation(\n result,\n this.buildHookParams(argsWithRelationFieldsHandled, config)\n );\n }\n\n return result;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n const context = args[args.length - 1] as ServiceHookContext;\n\n try {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n await this.executeHooks(\n \"before\",\n config.operationType,\n this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n context\n );\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n prismaFinalArgs,\n config,\n prisma\n );\n\n await this.executeHooks(\n \"after\",\n config.operationType,\n {\n ...this.buildTransactionHookParams(\n argsWithRelationFieldsHandled,\n config\n ),\n results,\n },\n context\n );\n return results;\n } catch (err: any) {\n await this.executeHooks(\n \"error\",\n config.operationType,\n { ...this.buildTransactionHookParams(args, config), error: err },\n context\n );\n if (context?.throwOnError !== false) throw err;\n return config.returnsFallback;\n }\n };\n };\n\n private async executeHooks(\n hookType: \"before\" | \"after\" | \"error\",\n operationType:\n | keyof ArkosServiceHookMethodConfigs<any, any>\n | \"batchUpdate\"\n | \"batchDelete\",\n params: any,\n context?: ServiceHookContext\n ): Promise<void> {\n const serviceHook = this.getServiceHook();\n if (!serviceHook) return;\n\n const skipCondition =\n context?.skip === hookType ||\n context?.skip === \"all\" ||\n (Array.isArray(context?.skip) && context.skip.includes(hookType));\n\n if (skipCondition || [\"batchDelete\", \"batchUpdate\"].includes(operationType))\n return;\n\n const hooks = serviceHookReader.getHooks(\n this.modelName,\n operationType as any\n );\n if (!hooks) return;\n\n const handlers =\n hookType === \"before\"\n ? hooks.before\n : hookType === \"after\"\n ? hooks.after\n : hooks.onError;\n\n if (handlers?.length)\n await serviceHooksManager.handleHook(handlers, params);\n }\n\n private buildHookParams(args: any[], config: ServiceOperationConfig): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return { data: args[0], queryOptions: args[1], context };\n case \"findMany\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"findById\":\n return { id: args[0], queryOptions: args[1], context };\n case \"findOne\":\n return { filters: args[0], queryOptions: args[1], context };\n case \"updateOne\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"updateMany\":\n return {\n filters: args[0],\n data: args[1],\n queryOptions: args[2],\n context,\n };\n case \"deleteOne\":\n return { filters: args[0], context };\n case \"deleteMany\":\n return { filters: args[0], context };\n case \"count\":\n return { filters: args[0], context };\n default:\n return { context };\n }\n }\n\n private buildTransactionHookParams(\n args: any[],\n config: ServiceOperationConfig\n ): any {\n const context = args[args.length - 1];\n\n switch (config.operationType) {\n case \"batchUpdate\":\n return { data: args[0], queryOptions: args[1], context };\n case \"batchDelete\":\n return { batchFilters: args[0], context };\n default:\n return { context };\n }\n }\n\n private async handlePasswordHashing(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n const data = processedArgs[dataIndex];\n\n if (Array.isArray(data)) {\n for (const i in data) {\n if (this.shouldHashPassword(data[i]))\n processedArgs[dataIndex][i] = await this.processPasswordHashing(\n data[i]\n );\n }\n } else if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private async processRelationFieldsInBody(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.relationFieldsHandling) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n\n if (config.operationType === \"batchUpdate\") {\n const dataArray = processedArgs[0];\n if (Array.isArray(dataArray)) {\n processedArgs[0] = dataArray.map((data) =>\n handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else if (config.operationType === \"batchDelete\") {\n const batchFilters = processedArgs[0];\n if (Array.isArray(batchFilters)) {\n processedArgs[0] = batchFilters.map((filters) =>\n handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\n )\n );\n }\n } else if (config.operationType === \"createMany\") {\n const data = processedArgs[dataIndex];\n if (Array.isArray(data)) {\n processedArgs[dataIndex] = data.map((item) =>\n handleRelationFieldsInBody(\n item as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else {\n const data = processedArgs[dataIndex];\n if (data) {\n processedArgs[dataIndex] = handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n );\n }\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return deepmerge({ data: args[0] }, args[1] || {});\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"updateOne\":\n return deepmerge({ where: args[0], data: args[1] }, args[2] || {});\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n case \"count\":\n return { where: args[0] };\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: PrismaClient\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName as string),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await tx[this.modelName as string].update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n return await tx[this.modelName as string].delete({ where: filters });\n });\n\n return await Promise.all(deletePromises);\n });\n }\n\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName as string) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray: any[] = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n // ─── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Creates a single record in the database.\n *\n * @param data - The data for creating the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.createOne({\n * name: \"John Doe\",\n * email: \"john@example.com\"\n * });\n * ```\n */\n async createOne<TOptions extends CreateOptions<TModelName>>(\n data: CreateData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param data - Array of data objects or object with data array\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.createMany([\n * { name: \"John Doe\", email: \"john@example.com\" },\n * { name: \"Jane Smith\", email: \"jane@example.com\" }\n * ]);\n * ```\n */\n async createMany<TOptions extends CreateManyOptions<TModelName>>(\n data: CreateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Counts records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const total = await userService.count({ status: \"active\" });\n * ```\n */\n async count(\n filters?: CountFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n /**\n * Finds multiple records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options (select, include, orderBy, skip, take, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const users = await userService.findMany(\n * { status: \"active\" },\n * { orderBy: { createdAt: \"desc\" }, take: 10 }\n * );\n * ```\n */\n async findMany<TOptions extends FindManyOptions<TModelName>>(\n filters?: FindManyFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findById(\"user-123\");\n * ```\n */\n async findById<TOptions extends FindOneOptions<TModelName>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n /**\n * Finds the first record matching the specified filters.\n *\n * @param filters - Where conditions to filter records\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findOne({ email: \"john@example.com\" });\n * ```\n */\n async findOne<TOptions extends FindOneOptions<TModelName>>(\n filters: FindOneFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n ) {\n return await (prisma as any)[serviceContext.modelName].findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma as any)[serviceContext.modelName].findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateOne(\n * { id: \"user-123\" },\n * { name: \"John Updated\" }\n * );\n * ```\n */\n async updateOne<TOptions extends UpdateOneOptions<TModelName>>(\n filters: UpdateOneFilters<TModelName>,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified id.\n *\n * @param id - The unique identifier of the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateById(\"user-123\", { name: \"John Updated\" });\n * ```\n */\n async updateById<TOptions extends UpdateOneOptions<TModelName>>(\n id: string | number,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })({ id }, data, queryOptions, context);\n }\n\n /**\n * Updates multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.updateMany(\n * { status: \"pending\" },\n * { status: \"active\" }\n * );\n * ```\n */\n async updateMany<TOptions extends UpdateManyOptions<TModelName>>(\n filters: UpdateManyFilters<TModelName>,\n data: UpdateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteById(\"user-123\");\n * ```\n */\n async deleteById(\n id: string | number,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })({ id }, context);\n }\n\n /**\n * Deletes a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteOne({ id: \"user-123\" });\n * ```\n */\n async deleteOne(\n filters: DeleteOneFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Deletes multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.deleteMany({ status: \"inactive\" });\n * ```\n */\n async deleteMany(\n filters: DeleteManyFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Performs multiple update operations in a single transaction.\n *\n * @param dataArray - Array of update objects each containing filter criteria and data\n * @param queryOptions - Optional Prisma query options applied to all updates\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const results = await userService.batchUpdate([\n * { id: \"user-1\", status: \"active\" },\n * { id: \"user-2\", status: \"inactive\" }\n * ]);\n * ```\n */\n async batchUpdate<TOptions extends UpdateOneOptions<TModelName>>(\n dataArray: UpdateOneData<TModelName>[],\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n /**\n * Performs multiple delete operations in a single transaction.\n *\n * @param batchFilters - Array of where conditions each identifying a record to delete\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.batchDelete([\n * { id: \"user-1\" },\n * { id: \"user-2\" }\n * ]);\n * ```\n */\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<TModelName>>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(batchFilters, context);\n }\n}\n"]}
1
+ {"version":3,"file":"base.service.js","sourceRoot":"","sources":["../../../../src/modules/base/base.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,yCAAyC,CAAC;AACjD,OAAO,SAAS,MAAM,sCAAsC,CAAC;AAC7D,OAAO,EACL,0BAA0B,GAE3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAwB/C,OAAO,kBAAkB,MAAM,yCAAyC,CAAC;AAuCzE,MAAM,OAAO,kBAAkB;IAK7B,YAAY,SAAqB;QAoBzB,qBAAgB,GAAG,CAAC,MAA8B,EAAE,EAAE;YAC5D,OAAO,KAAK,EAAE,GAAG,IAAW,EAAgB,EAAE;gBAC5C,IAAI,6BAA6B,GAC/B,MAAM,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACvD,IAAI,eAAe,GAAG,MAAM,IAAI,CAAC,qBAAqB,CACpD,6BAA6B,EAC7B,MAAM,CACP,CAAC;gBAKF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACnC,IAAI,MAAW,CAAC;gBAEhB,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBAC7B,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CACrC,6BAA6B,EAC7B,MAAM,EACN,MAAM,EACN,IAAI,CACL,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACjE,MAAM,GAAG,MACP,MAAM,CAAC,IAAI,CAAC,SAAmB,CAChC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;gBACrC,CAAC;gBAED,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC,CAAC;QAEM,gCAA2B,GAAG,CAAC,MAA8B,EAAE,EAAE;YACvE,OAAO,KAAK,EAAE,GAAG,IAAW,EAAgB,EAAE;gBAE5C,IAAI,6BAA6B,GAC/B,MAAM,IAAI,CAAC,2BAA2B,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACvD,IAAI,eAAe,GAAG,MAAM,IAAI,CAAC,qBAAqB,CACpD,6BAA6B,EAC7B,MAAM,CACP,CAAC;gBAGF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAChD,eAAe,EACf,MAAM,EACN,MAAM,CACP,CAAC;gBAEF,OAAO,OAAO,CAAC;YACjB,CAAC,CAAA;QACH,CAAC,CAAC;QAxEA,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAmB,CAAe,CAAC;QAC9D,MAAM,WAAW,GAAG,kBAAkB,EAAE,iBAAiB,EAAE,CACzD,SAAmB,CACpB,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG;YACpB,QAAQ,EACN,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAClE,EAAE;YACJ,IAAI,EACF,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;SAC1E,CAAC;IACJ,CAAC;IAED,IAAI,MAAM;QACR,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,aAAc,CAAC;IAC7B,CAAC;IA0DO,KAAK,CAAC,qBAAqB,CACjC,IAAW,EACX,MAA8B;QAE9B,IAAI,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAE9B,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;YAEtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBAClC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC7D,IAAI,CAAC,CAAC,CAAC,CACR,CAAC;gBACN,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,aAAa,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,2BAA2B,CACvC,IAAW,EACX,MAA8B;QAE9B,IAAI,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QAE9B,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAElE,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,0BAA0B,CACxB,IAA2B,EAC3B,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,sBAAsB,CAC9B,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;gBAClD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;oBAChC,aAAa,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC9C,0BAA0B,CACxB,OAA8B,EAC9B,IAAI,CAAC,cAAc,CACpB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,aAAa,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC3C,0BAA0B,CACxB,IAA2B,EAC3B,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,sBAAsB,CAC9B,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;gBACtC,IAAI,IAAI,EAAE,CAAC;oBACT,aAAa,CAAC,SAAS,CAAC,GAAG,0BAA0B,CACnD,IAA2B,EAC3B,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,sBAAsB,CAC9B,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,eAAe,CAAC,IAAW,EAAE,MAA8B;QACjE,QAAQ,MAAM,CAAC,aAAa,EAAE,CAAC;YAC7B,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,KAAK,WAAW;gBACd,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,KAAK,YAAY;gBACf,MAAM,UAAU,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC/D,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACnD,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACf,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,OAAO;gBACV,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,IAAW,EACX,MAA8B,EAC9B,MAAoB;QAEpB,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,OAAO,MAAO,MAAc,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;gBAC1D,MAAM,cAAc,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAS,EAAE,EAAE;oBACvD,IAAI,aAAa,GAAG,IAAI,CAAC;oBACzB,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,aAAa,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;oBAC1D,CAAC;oBAED,MAAM,sBAAsB,GAAG,0BAA0B,CACvD;wBACE,WAAW,EAAE;4BACX,GAAG,aAAa;4BAChB,SAAS,EAAE,QAAQ;yBACpB;qBACqB,EACxB;wBACE,QAAQ,EAAE;4BACR;gCACE,GAAG,kBAAkB,CAAC,QAAQ,CAAC;oCAC7B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,SAAmB,CAAC;iCAC3C,CAAE;gCACH,IAAI,EAAE,aAAa;6BACpB;yBACF;wBACD,IAAI,EAAE,EAAE;qBACT,CACF,CAAC;oBAEF,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,MAAM,CAC9C,SAAS,CACP,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAC1C,YAAY,IAAI,EAAE,CACU,CAC/B,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,aAAa,KAAK,aAAa,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE7B,OAAO,MAAO,MAAc,CAAC,YAAY,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE;gBAC1D,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAY,EAAE,EAAE;oBAC7D,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvE,CAAC,CAAC,CAAC;gBAEH,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEO,kBAAkB,CAAC,IAAS;QAClC,OAAO,SAAS,CAAC,IAAI,CAAC,SAAmB,CAAC,KAAK,MAAM,IAAI,IAAI,EAAE,QAAQ,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,IAAS;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,cAAc,GAAU,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACrB,IACE,UAAU,IAAI,IAAI;oBAClB,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,CAAC,EAC7C,CAAC;oBACD,cAAc,CAAC,CAAC,CAAC,GAAG;wBAClB,GAAG,IAAI;wBACP,QAAQ,EAAE,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAS,CAAC;qBACzD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBAC3B,CAAC;YACH,CAAC;YACD,OAAO,cAAc,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClE,OAAO;oBACL,GAAG,IAAI;oBACP,QAAQ,EAAE,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACxD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAmBD,KAAK,CAAC,SAAS,CACb,IAA4B,EAC5B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC1D,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAiBD,KAAK,CAAC,UAAU,CACd,IAAgC,EAChC,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC;YAC1D,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IAcD,KAAK,CAAC,KAAK,CACT,OAAkC,EAClC,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,OAAO;YACtB,YAAY,EAAE,OAAO;YACrB,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAiBD,KAAK,CAAC,QAAQ,CACZ,OAAqC,EACrC,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,UAAU;YACzB,YAAY,EAAE,UAAU;YACxB,eAAe,EAAE,EAAE;SACpB,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAcD,KAAK,CAAC,QAAQ,CACZ,EAAmB,EACnB,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,UAAU;YACzB,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAcD,KAAK,CAAC,OAAO,CACX,OAAmC,EACnC,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,SAAS;YACxB,YAAY,EAAE,WAAW;YACzB,eAAe,EAAE,SAAS;YAC1B,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE;gBAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAE7B,IACE,MAAM,CAAC,IAAI,CAAC,OAA8B,CAAC,CAAC,MAAM,KAAK,CAAC;oBACxD,IAAI,IAAK,OAA+B;oBACvC,OAAe,CAAC,EAAE,KAAK,IAAI,EAC5B,CAAC;oBACD,OAAO,MAAO,MAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,UAAU,CAC/D,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAClD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,MAAO,MAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,SAAS,CAC9D,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,CAClD,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAkBD,KAAK,CAAC,SAAS,CACb,OAAqC,EACrC,IAA+B,EAC/B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAeD,KAAK,CAAC,UAAU,CACd,EAAmB,EACnB,IAA+B,EAC/B,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAkBD,KAAK,CAAC,UAAU,CACd,OAAsC,EACtC,IAAgC,EAChC,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAaD,KAAK,CAAC,UAAU,CACd,EAAmB,EACnB,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACtB,CAAC;IAaD,KAAK,CAAC,SAAS,CACb,OAAqC,EACrC,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,WAAW;YAC1B,YAAY,EAAE,QAAQ;YACtB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAaD,KAAK,CAAC,UAAU,CACd,OAAsC,EACtC,OAA4B;QAE5B,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,YAAY;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvB,CAAC;IAiBD,KAAK,CAAC,WAAW,CACf,SAAsC,EACtC,YAAuB,EACvB,OAA4B;QAE5B,OAAO,IAAI,CAAC,2BAA2B,CAAC;YACtC,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,QAAQ;YACtB,uBAAuB,EAAE,IAAI;YAC7B,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAgBD,KAAK,CAAC,WAAW,CACf,YAAiD,EACjD,OAA4B;QAE5B,OAAO,IAAI,CAAC,2BAA2B,CAAC;YACtC,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,QAAQ;YACtB,sBAAsB,EAAE,EAAE;YAC1B,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n handleRelationFieldsInBody,\n ModelGroupRelationFields,\n} from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { PrismaClient } from \"../../generated\";\nimport {\n CountFilters,\n CreateData,\n CreateManyData,\n CreateManyOptions,\n CreateOptions,\n Delegate,\n DeleteManyFilters,\n DeleteOneFilters,\n FindManyFilters,\n FindManyOptions,\n FindOneFilters,\n FindOneOptions,\n GetPayload,\n Models,\n UpdateManyData,\n UpdateManyFilters,\n UpdateManyOptions,\n UpdateOneData,\n UpdateOneFilters,\n UpdateOneOptions,\n} from \"./types/base.service.types\";\nimport prismaSchemaParser from \"../../utils/prisma/prisma-schema-parser\";\nimport { ServiceHookContext } from \"./types/base.service.types\";\n\ninterface ServiceOperationConfig {\n operationType:\n | keyof ArkosPrismaService\n | \"batchDelete\"\n | \"batchUpdate\";\n prismaMethod: string;\n requiresPasswordHashing?: boolean;\n relationFieldsHandling?: string[];\n returnsFallback?: any;\n customPrismaLogic?: (\n args: any[],\n prisma: PrismaClient,\n config: ServiceOperationConfig,\n context: ArkosPrismaService<any>\n ) => Promise<any>;\n}\n\n/**\n * Base service class for handling CRUD operations on a specific model.\n * This class provides standard implementation of data operations that can be extended\n * by model-specific service classes.\n *\n * @class ArkosPrismaService\n *\n * @example\n * ```ts\n * import { ArkosPrismaService } from \"arkos/services\";\n *\n * export class UserService extends ArkosPrismaService<\"user\"> {}\n *\n * const userService = new UserService(\"user\");\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/reference/base-service}\n * @see {@link https://www.arkosjs.com/docs/guide/accessing-request-context-in-services}\n */\nexport class ArkosPrismaService<TModelName extends keyof Models = keyof Models> {\n modelName: TModelName;\n relationFields: ModelGroupRelationFields;\n private prismaInstace?: PrismaClient;\n\n constructor(modelName: TModelName) {\n this.modelName = camelCase(modelName as string) as TModelName;\n const modelFields = prismaSchemaParser?.getModelRelations?.(\n modelName as string\n );\n\n this.relationFields = {\n singular:\n modelFields?.filter((field) => field.isRelation && !field.isArray) ||\n [],\n list:\n modelFields?.filter((field) => field.isRelation && field.isArray) || [],\n };\n }\n\n get prisma() {\n if (!this.prismaInstace) this.prismaInstace = getPrismaInstance();\n return this.prismaInstace!;\n }\n\n private executeOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n\n\n\n const prisma = getPrismaInstance();\n let result: any;\n\n if (config.customPrismaLogic) {\n result = await config.customPrismaLogic(\n argsWithRelationFieldsHandled,\n prisma,\n config,\n this\n );\n } else {\n const prismaArgs = this.buildPrismaArgs(prismaFinalArgs, config);\n result = await (\n prisma[this.modelName as string] as Delegate<TModelName>\n )[config.prismaMethod](prismaArgs);\n }\n\n return result;\n };\n };\n\n private executeTransactionOperation = (config: ServiceOperationConfig) => {\n return async (...args: any[]): Promise<any> => {\n\n let argsWithRelationFieldsHandled =\n await this.processRelationFieldsInBody(args, config);\n let prismaFinalArgs = await this.handlePasswordHashing(\n argsWithRelationFieldsHandled,\n config\n );\n\n\n const prisma = getPrismaInstance();\n const results = await this.executeTransactionLogic(\n prismaFinalArgs,\n config,\n prisma\n );\n\n return results;\n }\n };\n\n\n private async handlePasswordHashing(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.requiresPasswordHashing) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n const data = processedArgs[dataIndex];\n\n if (Array.isArray(data)) {\n for (const i in data) {\n if (this.shouldHashPassword(data[i]))\n processedArgs[dataIndex][i] = await this.processPasswordHashing(\n data[i]\n );\n }\n } else if (this.shouldHashPassword(data)) {\n processedArgs[dataIndex] = await this.processPasswordHashing(data);\n }\n }\n\n return processedArgs;\n }\n\n private async processRelationFieldsInBody(\n args: any[],\n config: ServiceOperationConfig\n ): Promise<any[]> {\n let processedArgs = [...args];\n\n if (config.relationFieldsHandling) {\n const dataIndex = config.operationType.includes(\"update\") ? 1 : 0;\n\n if (config.operationType === \"batchUpdate\") {\n const dataArray = processedArgs[0];\n if (Array.isArray(dataArray)) {\n processedArgs[0] = dataArray.map((data) =>\n handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else if (config.operationType === \"batchDelete\") {\n const batchFilters = processedArgs[0];\n if (Array.isArray(batchFilters)) {\n processedArgs[0] = batchFilters.map((filters) =>\n handleRelationFieldsInBody(\n filters as Record<string, any>,\n this.relationFields\n )\n );\n }\n } else if (config.operationType === \"createMany\") {\n const data = processedArgs[dataIndex];\n if (Array.isArray(data)) {\n processedArgs[dataIndex] = data.map((item) =>\n handleRelationFieldsInBody(\n item as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n )\n );\n }\n } else {\n const data = processedArgs[dataIndex];\n if (data) {\n processedArgs[dataIndex] = handleRelationFieldsInBody(\n data as Record<string, any>,\n this.relationFields,\n config.relationFieldsHandling\n );\n }\n }\n }\n\n return processedArgs;\n }\n\n private buildPrismaArgs(args: any[], config: ServiceOperationConfig): any {\n switch (config.operationType) {\n case \"createOne\":\n case \"createMany\":\n return deepmerge({ data: args[0] }, args[1] || {});\n case \"findMany\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"findById\":\n return deepmerge({ where: { id: args[0] } }, args[1] || {});\n case \"findOne\":\n return deepmerge({ where: args[0] }, args[1] || {});\n case \"updateOne\":\n return deepmerge({ where: args[0], data: args[1] }, args[2] || {});\n case \"updateMany\":\n const firstMerge = deepmerge({ data: args[1] }, args[2] || {});\n return deepmerge({ where: args[0] }, firstMerge);\n case \"deleteOne\":\n case \"deleteMany\":\n return { where: args[0] };\n case \"count\":\n return { where: args[0] };\n default:\n return {};\n }\n }\n\n private async executeTransactionLogic(\n args: any[],\n config: ServiceOperationConfig,\n prisma: PrismaClient\n ): Promise<any> {\n if (config.operationType === \"batchUpdate\") {\n const dataArray = args[0];\n const queryOptions = args[1];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const updatePromises = dataArray.map(async (data: any) => {\n let processedData = data;\n if (this.shouldHashPassword(data)) {\n processedData = await this.processPasswordHashing(data);\n }\n\n const finalPrismaQueryParams = handleRelationFieldsInBody(\n {\n batchedData: {\n ...processedData,\n apiAction: \"update\",\n },\n } as Record<string, any>,\n {\n singular: [\n {\n ...prismaSchemaParser.getField({\n type: pascalCase(this.modelName as string),\n })!,\n name: \"batchedData\",\n },\n ],\n list: [],\n }\n );\n\n return await tx[this.modelName as string].update(\n deepmerge(\n finalPrismaQueryParams.batchedData?.update,\n queryOptions || {}\n ) as { where: any; data: any }\n );\n });\n\n return await Promise.all(updatePromises);\n });\n }\n\n if (config.operationType === \"batchDelete\") {\n const batchFilters = args[0];\n\n return await (prisma as any).$transaction(async (tx: any) => {\n const deletePromises = batchFilters.map(async (filters: any) => {\n return await tx[this.modelName as string].delete({ where: filters });\n });\n\n return await Promise.all(deletePromises);\n });\n }\n\n throw new Error(`Unknown transaction operation: ${config.operationType}`);\n }\n\n private shouldHashPassword(data: any): boolean {\n return kebabCase(this.modelName as string) === \"user\" && data?.password;\n }\n\n private async processPasswordHashing(data: any): Promise<any> {\n if (Array.isArray(data)) {\n const processedArray: any[] = [];\n for (let i = 0; i < data.length; i++) {\n const curr = data[i];\n if (\n \"password\" in curr &&\n !authService.isPasswordHashed(curr.password!)\n ) {\n processedArray[i] = {\n ...curr,\n password: await authService.hashPassword(curr.password!),\n };\n } else {\n processedArray[i] = curr;\n }\n }\n return processedArray;\n } else {\n if (data.password && !authService.isPasswordHashed(data.password)) {\n return {\n ...data,\n password: await authService.hashPassword(data.password),\n };\n }\n }\n return data;\n }\n\n // ─── Public API ─────────────────────────────────────────────────────────────\n\n /**\n * Creates a single record in the database.\n *\n * @param data - The data for creating the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.createOne({\n * name: \"John Doe\",\n * email: \"john@example.com\"\n * });\n * ```\n */\n async createOne<TOptions extends CreateOptions<TModelName>>(\n data: CreateData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"createOne\",\n prismaMethod: \"create\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param data - Array of data objects or object with data array\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.createMany([\n * { name: \"John Doe\", email: \"john@example.com\" },\n * { name: \"Jane Smith\", email: \"jane@example.com\" }\n * ]);\n * ```\n */\n async createMany<TOptions extends CreateManyOptions<TModelName>>(\n data: CreateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"createMany\",\n prismaMethod: \"createMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [\"delete\", \"disconnect\", \"update\"],\n returnsFallback: undefined,\n })(data, queryOptions, context);\n }\n\n /**\n * Counts records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const total = await userService.count({ status: \"active\" });\n * ```\n */\n async count(\n filters?: CountFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<number> {\n return this.executeOperation({\n operationType: \"count\",\n prismaMethod: \"count\",\n returnsFallback: 0,\n })(filters, context);\n }\n\n /**\n * Finds multiple records matching the specified filters.\n *\n * @param filters - Optional where conditions\n * @param queryOptions - Optional Prisma query options (select, include, orderBy, skip, take, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const users = await userService.findMany(\n * { status: \"active\" },\n * { orderBy: { createdAt: \"desc\" }, take: 10 }\n * );\n * ```\n */\n async findMany<TOptions extends FindManyOptions<TModelName>>(\n filters?: FindManyFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeOperation({\n operationType: \"findMany\",\n prismaMethod: \"findMany\",\n returnsFallback: [],\n })(filters, queryOptions, context);\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param queryOptions - Optional Prisma query options (select, include, etc.)\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findById(\"user-123\");\n * ```\n */\n async findById<TOptions extends FindOneOptions<TModelName>>(\n id: string | number,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findById\",\n prismaMethod: \"findUnique\",\n returnsFallback: undefined,\n })(id, queryOptions, context);\n }\n\n /**\n * Finds the first record matching the specified filters.\n *\n * @param filters - Where conditions to filter records\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const user = await userService.findOne({ email: \"john@example.com\" });\n * ```\n */\n async findOne<TOptions extends FindOneOptions<TModelName>>(\n filters: FindOneFilters<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions> | null> {\n return this.executeOperation({\n operationType: \"findOne\",\n prismaMethod: \"findFirst\",\n returnsFallback: undefined,\n customPrismaLogic: async (args, prisma, _, serviceContext) => {\n const filters = args[0];\n const queryOptions = args[1];\n\n if (\n Object.keys(filters as Record<string, any>).length === 1 &&\n \"id\" in (filters as Record<string, any>) &&\n (filters as any).id !== \"me\"\n ) {\n return await (prisma as any)[serviceContext.modelName].findUnique(\n deepmerge({ where: filters }, queryOptions || {})\n );\n } else {\n return await (prisma as any)[serviceContext.modelName].findFirst(\n deepmerge({ where: filters }, queryOptions || {})\n );\n }\n },\n })(filters, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateOne(\n * { id: \"user-123\" },\n * { name: \"John Updated\" }\n * );\n * ```\n */\n async updateOne<TOptions extends UpdateOneOptions<TModelName>>(\n filters: UpdateOneFilters<TModelName>,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Updates a single record matching the specified id.\n *\n * @param id - The unique identifier of the record\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const updated = await userService.updateById(\"user-123\", { name: \"John Updated\" });\n * ```\n */\n async updateById<TOptions extends UpdateOneOptions<TModelName>>(\n id: string | number,\n data: UpdateOneData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>> {\n return this.executeOperation({\n operationType: \"updateOne\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })({ id }, data, queryOptions, context);\n }\n\n /**\n * Updates multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param data - The data to update\n * @param queryOptions - Optional Prisma query options\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.updateMany(\n * { status: \"pending\" },\n * { status: \"active\" }\n * );\n * ```\n */\n async updateMany<TOptions extends UpdateManyOptions<TModelName>>(\n filters: UpdateManyFilters<TModelName>,\n data: UpdateManyData<TModelName>,\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"updateMany\",\n prismaMethod: \"updateMany\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(filters, data, queryOptions, context);\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param id - The unique identifier of the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteById(\"user-123\");\n * ```\n */\n async deleteById(\n id: string | number,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })({ id }, context);\n }\n\n /**\n * Deletes a single record matching the specified filters.\n *\n * @param filters - Where conditions to identify the record\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.deleteOne({ id: \"user-123\" });\n * ```\n */\n async deleteOne(\n filters: DeleteOneFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>> {\n return this.executeOperation({\n operationType: \"deleteOne\",\n prismaMethod: \"delete\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Deletes multiple records matching the specified filters.\n *\n * @param filters - Where conditions to identify records\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const result = await userService.deleteMany({ status: \"inactive\" });\n * ```\n */\n async deleteMany(\n filters: DeleteManyFilters<TModelName>,\n context?: ServiceHookContext\n ): Promise<{ count: number }> {\n return this.executeOperation({\n operationType: \"deleteMany\",\n prismaMethod: \"deleteMany\",\n returnsFallback: undefined,\n })(filters, context);\n }\n\n /**\n * Performs multiple update operations in a single transaction.\n *\n * @param dataArray - Array of update objects each containing filter criteria and data\n * @param queryOptions - Optional Prisma query options applied to all updates\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const results = await userService.batchUpdate([\n * { id: \"user-1\", status: \"active\" },\n * { id: \"user-2\", status: \"inactive\" }\n * ]);\n * ```\n */\n async batchUpdate<TOptions extends UpdateOneOptions<TModelName>>(\n dataArray: UpdateOneData<TModelName>[],\n queryOptions?: TOptions,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, TOptions>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchUpdate\",\n prismaMethod: \"update\",\n requiresPasswordHashing: true,\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(dataArray, queryOptions, context);\n }\n\n /**\n * Performs multiple delete operations in a single transaction.\n *\n * @param batchFilters - Array of where conditions each identifying a record to delete\n * @param context - Optional service execution context\n *\n * @example\n * ```ts\n * const deleted = await userService.batchDelete([\n * { id: \"user-1\" },\n * { id: \"user-2\" }\n * ]);\n * ```\n */\n async batchDelete(\n batchFilters: Array<DeleteOneFilters<TModelName>>,\n context?: ServiceHookContext\n ): Promise<GetPayload<TModelName, any>[]> {\n return this.executeTransactionOperation({\n operationType: \"batchDelete\",\n prismaMethod: \"delete\",\n relationFieldsHandling: [],\n returnsFallback: undefined,\n })(batchFilters, context);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import {\n ExtractPrismaData,\n ExtractPrismaFilters,\n ExtractPrismaQueryOptions,\n PrismaModels,\n} from \"../../../generated\";\n\nexport type Models = PrismaModels<any>;\n\nexport type Delegate<TModelName extends keyof Models> =\n Models[TModelName][\"Delegate\"];\n\nexport type CreateData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateArgs\"]\n>;\nexport type CreateOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateArgs\"], \"data\">;\nexport type CreateResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type CreateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateManyArgs\"]\n>;\nexport type CreateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateManyArgs\"], \"data\">;\nexport type CreateManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type CountFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"CountArgs\"]>;\n\nexport type FindManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindManyArgs\"]>;\nexport type FindManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindManyArgs\"], \"where\">;\nexport type FindManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type FindOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindFirstArgs\"]>;\nexport type FindOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindFirstArgs\"], \"where\">;\nexport type FindOneResult<TModelName extends keyof Models> =\n | Models[TModelName][\"GetPayload\"]\n | null;\n\nexport type UpdateOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateArgs\"]>;\nexport type UpdateOneData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateArgs\"]\n>;\nexport type UpdateOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"UpdateArgs\"], \"where\" | \"data\">;\nexport type UpdateOneResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type UpdateManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateManyArgs\"]>;\nexport type UpdateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateManyArgs\"]\n>;\nexport type UpdateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<\n Models[TModelName][\"UpdateManyArgs\"],\n \"where\" | \"data\"\n >;\n\nexport type DeleteOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteArgs\"]>;\n\nexport type DeleteManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteManyArgs\"]>;\n\nexport type GetPayload<\n TModelName extends keyof Models,\n TOptions extends Record<string, any>,\n> = PrismaModels<TOptions>[TModelName][\"GetPayload\"];\n"]}
1
+ {"version":3,"file":"base.service.types.js","sourceRoot":"","sources":["../../../../../src/modules/base/types/base.service.types.ts"],"names":[],"mappings":"","sourcesContent":["import {\n ExtractPrismaData,\n ExtractPrismaFilters,\n ExtractPrismaQueryOptions,\n PrismaModels,\n} from \"../../../generated\";\nimport { User } from \"../../../types\";\n\nexport type Models = PrismaModels<any>;\n\n\nexport interface ServiceHookContext {\n /**\n * The authenticated user making the request.\n */\n user?: User;\n /**\n * The access token from the request for authorization.\n */\n accessToken?: string;\n}\n\nexport type Delegate<TModelName extends keyof Models> =\n Models[TModelName][\"Delegate\"];\n\nexport type CreateData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateArgs\"]\n>;\nexport type CreateOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateArgs\"], \"data\">;\nexport type CreateResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type CreateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"CreateManyArgs\"]\n>;\nexport type CreateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"CreateManyArgs\"], \"data\">;\nexport type CreateManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type CountFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"CountArgs\"]>;\n\nexport type FindManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindManyArgs\"]>;\nexport type FindManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindManyArgs\"], \"where\">;\nexport type FindManyResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"][];\n\nexport type FindOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"FindFirstArgs\"]>;\nexport type FindOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"FindFirstArgs\"], \"where\">;\nexport type FindOneResult<TModelName extends keyof Models> =\n | Models[TModelName][\"GetPayload\"]\n | null;\n\nexport type UpdateOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateArgs\"]>;\nexport type UpdateOneData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateArgs\"]\n>;\nexport type UpdateOneOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<Models[TModelName][\"UpdateArgs\"], \"where\" | \"data\">;\nexport type UpdateOneResult<TModelName extends keyof Models> =\n Models[TModelName][\"GetPayload\"];\n\nexport type UpdateManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"UpdateManyArgs\"]>;\nexport type UpdateManyData<TModelName extends keyof Models> = ExtractPrismaData<\n Models[TModelName][\"UpdateManyArgs\"]\n>;\nexport type UpdateManyOptions<TModelName extends keyof Models> =\n ExtractPrismaQueryOptions<\n Models[TModelName][\"UpdateManyArgs\"],\n \"where\" | \"data\"\n >;\n\nexport type DeleteOneFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteArgs\"]>;\n\nexport type DeleteManyFilters<TModelName extends keyof Models> =\n ExtractPrismaFilters<Models[TModelName][\"DeleteManyArgs\"]>;\n\nexport type GetPayload<\n TModelName extends keyof Models,\n TOptions extends Record<string, any>,\n> = PrismaModels<TOptions>[TModelName][\"GetPayload\"];\n"]}
@@ -26,20 +26,23 @@ export class EmailService {
26
26
  const user = emailConfigs?.auth?.user || process.env.EMAIL_USER;
27
27
  const pass = emailConfigs?.auth?.pass || process.env.EMAIL_PASSWORD;
28
28
  const name = emailConfigs?.name || process.env.EMAIL_NAME;
29
- if (!host || !user || !pass) {
29
+ if (!host) {
30
30
  throw new AppError("You are trying to use emailService without setting email configurations. " +
31
- "Please configure either arkosConfig.email or environment variables (EMAIL_HOST, EMAIL_USER, EMAIL_PASSWORD)", 500, {
31
+ "Please configure either arkosConfig.email or environment variables (EMAIL_HOST)", 500, {
32
32
  docs: "Read more about emailService at https://www.arkosjs.com/docs/guides/email-service",
33
33
  });
34
34
  }
35
35
  return {
36
+ ...emailConfigs,
36
37
  host,
37
38
  port: port || 465,
38
39
  secure: secure !== undefined ? secure : true,
39
- auth: {
40
- user,
41
- pass,
42
- },
40
+ auth: user && pass
41
+ ? {
42
+ user,
43
+ pass,
44
+ }
45
+ : undefined,
43
46
  name,
44
47
  };
45
48
  }
@@ -67,7 +70,11 @@ export class EmailService {
67
70
  }
68
71
  const info = await transporter.sendMail({
69
72
  ...options,
70
- from: fromAddress,
73
+ from: fromAddress
74
+ ? config.name
75
+ ? `${config.name}<${fromAddress}>`
76
+ : fromAddress
77
+ : undefined,
71
78
  text: options?.text ||
72
79
  (typeof options.html === "string" && options.html
73
80
  ? convert(options.html)
@@ -1 +1 @@
1
- {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../../src/modules/email/email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import nodemailer, { SendMailOptions, Transporter } from \"nodemailer\";\nimport { convert } from \"html-to-text\";\nimport { getArkosConfig } from \"../../server\";\nimport AppError from \"../error-handler/utils/app-error\";\n\n/**\n * Defines the options for sending an email.\n */\nexport type EmailOptions = {\n subject: string;\n} & SendMailOptions;\n\n/**\n * Defines the authentication options for SMTP.\n */\nexport type SMTPAuthOptions = {\n user: string;\n pass: string;\n};\n\n/**\n * Defines the connection options for SMTP server.\n */\nexport type SMTPConnectionOptions = {\n host?: string;\n port?: number;\n secure?: boolean;\n auth?: SMTPAuthOptions;\n name?: string;\n};\n\n/**\n * A service class to handle email-related tasks, including sending emails.\n *\n * See the api reference [www.arkosjs.com/docs/reference/the-email-service-class](https://www.arkosjs.com/docs/reference/the-email-service-class)\n */\nexport class EmailService {\n transporter: Transporter | null = null;\n private customConfig: SMTPConnectionOptions | null = null;\n\n /**\n * Creates an instance of the EmailService class.\n *\n * @param {SMTPConnectionOptions} [config] - Optional custom SMTP configuration.\n * If provided, these settings will be used instead of the Arkos config.\n */\n constructor(config?: SMTPConnectionOptions) {\n if (config) {\n this.customConfig = config;\n }\n }\n\n /**\n * Gets the email configuration from multiple sources with priority:\n * 1. Constructor customConfig\n * 2. ArkosConfig\n * 3. Environment variables\n * @returns Configuration object with host, port, and auth details\n * @throws AppError if required email configuration is not set\n */\n private getEmailConfig(): SMTPConnectionOptions {\n if (this.customConfig) {\n return this.customConfig;\n }\n\n const { email: emailConfigs } = getArkosConfig();\n const host = emailConfigs?.host || process.env.EMAIL_HOST;\n const port =\n emailConfigs?.port ||\n (process.env.EMAIL_PORT ? parseInt(process.env.EMAIL_PORT) : undefined);\n const secure =\n emailConfigs?.secure !== undefined\n ? emailConfigs.secure\n : process.env.EMAIL_SECURE\n ? process.env.EMAIL_SECURE === \"true\"\n : undefined;\n const user = emailConfigs?.auth?.user || process.env.EMAIL_USER;\n const pass = emailConfigs?.auth?.pass || process.env.EMAIL_PASSWORD;\n const name = emailConfigs?.name || process.env.EMAIL_NAME;\n\n if (!host || !user || !pass) {\n throw new AppError(\n \"You are trying to use emailService without setting email configurations. \" +\n \"Please configure either arkosConfig.email or environment variables (EMAIL_HOST, EMAIL_USER, EMAIL_PASSWORD)\",\n 500,\n {\n docs: \"Read more about emailService at https://www.arkosjs.com/docs/guides/email-service\",\n }\n );\n }\n\n return {\n host,\n port: port || 465,\n secure: secure !== undefined ? secure : true,\n auth: {\n user,\n pass,\n },\n name,\n };\n }\n\n /**\n * Gets or creates a transporter using the email configuration\n * @param customConfig Optional override connection settings (takes full priority if provided)\n * @returns A configured nodemailer transporter\n */\n private getTransporter(customConfig?: SMTPConnectionOptions): Transporter {\n if (customConfig) {\n const { name, ...config } = customConfig;\n return nodemailer.createTransport(config);\n }\n\n if (!this.transporter) {\n const { name, ...config } = this.getEmailConfig() || {};\n this.transporter = nodemailer.createTransport(config);\n }\n return this.transporter;\n }\n\n /**\n * Sends an email with the provided options.\n * Can use either the default configuration or custom connection options.\n *\n * @param {EmailOptions} options - The options for the email to be sent.\n * @param {SMTPConnectionOptions} [connectionOptions] - Optional custom connection settings.\n * @param {boolean} [skipVerification=false] - Whether to skip connection verification.\n * @returns {Promise<{ success: boolean; messageId?: string } & Record<string, any>>} Result with message ID on success.\n */\n public async send(\n options: EmailOptions & SendMailOptions,\n connectionOptions?: SMTPConnectionOptions,\n skipVerification: boolean = true\n ): Promise<{ success: boolean; messageId?: string } & Record<string, any>> {\n const config = this.getEmailConfig();\n const transporter = connectionOptions\n ? this.getTransporter(connectionOptions)\n : this.getTransporter();\n\n const fromAddress =\n options.from || connectionOptions?.auth?.user || config.auth?.user;\n\n if (connectionOptions || !skipVerification) {\n const isConnected = await this.verifyConnection(transporter);\n if (!isConnected) throw new Error(\"Failed to connect to email server\");\n }\n\n const info = await transporter.sendMail({\n ...options,\n from: fromAddress,\n text:\n options?.text ||\n (typeof options.html === \"string\" && options.html\n ? convert(options.html as string)\n : undefined),\n });\n\n return { success: true, ...info };\n }\n\n /**\n * Verifies the connection to the email server.\n * @param {Transporter} [transporterToVerify] - Optional transporter to verify.\n * @returns {Promise<boolean>} A promise that resolves to true if connection is valid.\n */\n public async verifyConnection(\n transporterToVerify?: Transporter\n ): Promise<boolean> {\n try {\n const transporter = transporterToVerify || this.getTransporter();\n await transporter.verify();\n return true;\n } catch (error) {\n console.error(\"Email Server Connection Failed\", error);\n return false;\n }\n }\n\n /**\n * Updates the custom configuration for this email service instance.\n * @param {SMTPConnectionOptions} config - The new connection options.\n */\n public updateConfig(config: SMTPConnectionOptions): void {\n this.customConfig = config;\n this.transporter = null; // Reset transporter so it will be recreated with new config\n }\n\n /**\n * Creates a new instance of EmailService with custom configuration.\n * @param {SMTPConnectionOptions} config - The connection options for the new instance.\n * @returns {EmailService} A new EmailService instance.\n */\n public static create(config: SMTPConnectionOptions): EmailService {\n return new EmailService(config);\n }\n}\n\nconst emailService = new EmailService();\n\nexport default emailService;\n"]}
1
+ {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../../src/modules/email/email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import nodemailer, { SendMailOptions, Transporter } from \"nodemailer\";\nimport { convert } from \"html-to-text\";\nimport { getArkosConfig } from \"../../server\";\nimport AppError from \"../error-handler/utils/app-error\";\n\n/**\n * Defines the options for sending an email.\n */\nexport type EmailOptions = {\n subject: string;\n} & SendMailOptions;\n\n/**\n * Defines the authentication options for SMTP.\n */\nexport type SMTPAuthOptions = {\n user: string;\n pass: string;\n};\n\n/**\n * Defines the connection options for SMTP server.\n */\nexport type SMTPConnectionOptions = {\n host?: string;\n port?: number;\n secure?: boolean;\n auth?: SMTPAuthOptions;\n name?: string;\n};\n\n/**\n * A service class to handle email-related tasks, including sending emails.\n *\n * See the api reference [www.arkosjs.com/docs/reference/the-email-service-class](https://www.arkosjs.com/docs/reference/the-email-service-class)\n */\nexport class EmailService {\n transporter: Transporter | null = null;\n private customConfig: SMTPConnectionOptions | null = null;\n\n /**\n * Creates an instance of the EmailService class.\n *\n * @param {SMTPConnectionOptions} [config] - Optional custom SMTP configuration.\n * If provided, these settings will be used instead of the Arkos config.\n */\n constructor(config?: SMTPConnectionOptions) {\n if (config) {\n this.customConfig = config;\n }\n }\n\n /**\n * Gets the email configuration from multiple sources with priority:\n * 1. Constructor customConfig\n * 2. ArkosConfig\n * 3. Environment variables\n * @returns Configuration object with host, port, and auth details\n * @throws AppError if required email configuration is not set\n */\n private getEmailConfig(): SMTPConnectionOptions {\n if (this.customConfig) {\n return this.customConfig;\n }\n\n const { email: emailConfigs } = getArkosConfig();\n const host = emailConfigs?.host || process.env.EMAIL_HOST;\n const port =\n emailConfigs?.port ||\n (process.env.EMAIL_PORT ? parseInt(process.env.EMAIL_PORT) : undefined);\n const secure =\n emailConfigs?.secure !== undefined\n ? emailConfigs.secure\n : process.env.EMAIL_SECURE\n ? process.env.EMAIL_SECURE === \"true\"\n : undefined;\n const user = emailConfigs?.auth?.user || process.env.EMAIL_USER;\n const pass = emailConfigs?.auth?.pass || process.env.EMAIL_PASSWORD;\n const name = emailConfigs?.name || process.env.EMAIL_NAME;\n\n if (!host) {\n throw new AppError(\n \"You are trying to use emailService without setting email configurations. \" +\n \"Please configure either arkosConfig.email or environment variables (EMAIL_HOST)\",\n 500,\n {\n docs: \"Read more about emailService at https://www.arkosjs.com/docs/guides/email-service\",\n }\n );\n }\n\n return {\n ...emailConfigs,\n host,\n port: port || 465,\n secure: secure !== undefined ? secure : true,\n auth:\n user && pass\n ? {\n user,\n pass,\n }\n : undefined,\n name,\n };\n }\n\n /**\n * Gets or creates a transporter using the email configuration\n * @param customConfig Optional override connection settings (takes full priority if provided)\n * @returns A configured nodemailer transporter\n */\n private getTransporter(customConfig?: SMTPConnectionOptions): Transporter {\n if (customConfig) {\n const { name, ...config } = customConfig;\n return nodemailer.createTransport(config);\n }\n\n if (!this.transporter) {\n const { name, ...config } = this.getEmailConfig() || {};\n this.transporter = nodemailer.createTransport(config);\n }\n return this.transporter;\n }\n\n /**\n * Sends an email with the provided options.\n * Can use either the default configuration or custom connection options.\n *\n * @param {EmailOptions} options - The options for the email to be sent.\n * @param {SMTPConnectionOptions} [connectionOptions] - Optional custom connection settings.\n * @param {boolean} [skipVerification=false] - Whether to skip connection verification.\n * @returns {Promise<{ success: boolean; messageId?: string } & Record<string, any>>} Result with message ID on success.\n */\n public async send(\n options: EmailOptions & SendMailOptions,\n connectionOptions?: SMTPConnectionOptions,\n skipVerification: boolean = true\n ): Promise<{ success: boolean; messageId?: string } & Record<string, any>> {\n const config = this.getEmailConfig();\n const transporter = connectionOptions\n ? this.getTransporter(connectionOptions)\n : this.getTransporter();\n\n const fromAddress =\n options.from || connectionOptions?.auth?.user || config.auth?.user;\n\n if (connectionOptions || !skipVerification) {\n const isConnected = await this.verifyConnection(transporter);\n if (!isConnected) throw new Error(\"Failed to connect to email server\");\n }\n\n const info = await transporter.sendMail({\n ...options,\n from: fromAddress\n ? config.name\n ? `${config.name}<${fromAddress}>`\n : fromAddress\n : undefined,\n text:\n options?.text ||\n (typeof options.html === \"string\" && options.html\n ? convert(options.html as string)\n : undefined),\n });\n\n return { success: true, ...info };\n }\n\n /**\n * Verifies the connection to the email server.\n * @param {Transporter} [transporterToVerify] - Optional transporter to verify.\n * @returns {Promise<boolean>} A promise that resolves to true if connection is valid.\n */\n public async verifyConnection(\n transporterToVerify?: Transporter\n ): Promise<boolean> {\n try {\n const transporter = transporterToVerify || this.getTransporter();\n await transporter.verify();\n return true;\n } catch (error) {\n console.error(\"Email Server Connection Failed\", error);\n return false;\n }\n }\n\n /**\n * Updates the custom configuration for this email service instance.\n * @param {SMTPConnectionOptions} config - The new connection options.\n */\n public updateConfig(config: SMTPConnectionOptions): void {\n this.customConfig = config;\n this.transporter = null; // Reset transporter so it will be recreated with new config\n }\n\n /**\n * Creates a new instance of EmailService with custom configuration.\n * @param {SMTPConnectionOptions} config - The connection options for the new instance.\n * @returns {EmailService} A new EmailService instance.\n */\n public static create(config: SMTPConnectionOptions): EmailService {\n return new EmailService(config);\n }\n}\n\nconst emailService = new EmailService();\n\nexport default emailService;\n"]}
@@ -1,10 +1,9 @@
1
- import * as errorControllerHelper from "./utils/error-handler.helpers.js";
2
1
  import { getAppServer } from "../../app.js";
3
- import multerErrorHandler from "./utils/multer-error-handler.js";
2
+ import { getHandledError } from "./utils/get-handled-error.js";
4
3
  export default function errorHandler(err, req, res, _) {
5
4
  console.error("[\x1b[31mError\x1b[0m]:", err);
6
- err.statusCode = err.statusCode || 500;
7
- err.status = err.status || "error";
5
+ err.statusCode = err.isOperational ? err.statusCode : 500;
6
+ err.status = err.isOperational ? err.status : "error";
8
7
  let error = {
9
8
  ...err,
10
9
  message: err.message,
@@ -12,67 +11,7 @@ export default function errorHandler(err, req, res, _) {
12
11
  };
13
12
  if (process.env.ARKOS_BUILD === "true")
14
13
  delete error?.stack;
15
- switch (err.name) {
16
- case "JsonWebTokenError":
17
- error = errorControllerHelper.handleJWTError();
18
- break;
19
- case "TokenExpiredError":
20
- error = errorControllerHelper.handleJWTExpired();
21
- break;
22
- case "PrismaClientValidationError":
23
- error = errorControllerHelper.handlePrismaClientValidationError(err);
24
- break;
25
- case "PrismaClientInitializationError":
26
- error = errorControllerHelper.handlePrismaClientInitializationError(err);
27
- break;
28
- case "MulterError":
29
- error = multerErrorHandler.handle(err);
30
- break;
31
- }
32
- switch (err.code) {
33
- case "P1000":
34
- error = errorControllerHelper.handleAuthenticationError(err);
35
- break;
36
- case "P1001":
37
- error = errorControllerHelper.handleServerNotReachableError(err);
38
- break;
39
- case "P1002":
40
- error = errorControllerHelper.handleConnectionTimeoutError(err);
41
- break;
42
- case "P1003":
43
- error = errorControllerHelper.handleDatabaseNotFoundError(err);
44
- break;
45
- case "P2000":
46
- error = errorControllerHelper.handleFieldValueTooLargeError(err);
47
- break;
48
- case "P2001":
49
- error = errorControllerHelper.handleRecordNotFoundError(err);
50
- break;
51
- case "P2002":
52
- error = errorControllerHelper.handleUniqueConstraintError(err);
53
- break;
54
- case "P2003":
55
- error = errorControllerHelper.handleForeignKeyConstraintError(err);
56
- break;
57
- case "P2004":
58
- error = errorControllerHelper.handleConstraintFailedError(err);
59
- break;
60
- case "P2025":
61
- error = errorControllerHelper.handleNonExistingRecord(err);
62
- break;
63
- case "P3000":
64
- error = errorControllerHelper.handleSchemaCreationFailedError(err);
65
- break;
66
- case "P3001":
67
- error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);
68
- break;
69
- case "P3002":
70
- error = errorControllerHelper.handleMigrationScriptFailedError(err);
71
- break;
72
- case "P3003":
73
- error = errorControllerHelper.handleVersionMismatchError(err);
74
- break;
75
- }
14
+ error = getHandledError(error);
76
15
  const { message, ...rest } = error;
77
16
  if (process.env.ARKOS_BUILD !== "true")
78
17
  return sendDevelopmentError({
@@ -107,7 +46,8 @@ function sendProductionError(err, _, res) {
107
46
  });
108
47
  }
109
48
  process.on("SIGTERM", () => {
110
- if (process.env.ARKOS_BUILD !== "true") {
49
+ if (process.env.ARKOS_BUILD !== "true" ||
50
+ process.env.__SKIP_LISTEN === "true") {
111
51
  process.exit();
112
52
  }
113
53
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport * as errorControllerHelper from \"./utils/error-handler.helpers\";\nimport { getAppServer } from \"../../app\";\nimport multerErrorHandler from \"./utils/multer-error-handler\";\nimport { MulterError } from \"multer\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n case \"MulterError\":\n error = multerErrorHandler.handle(err as unknown as MulterError);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, _: Request, res: Response): void {\n res.status(err.statusCode).json({\n ...err,\n message: err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, _: Request, res: Response): void {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"InternalServerError\",\n meta: {},\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (process.env.ARKOS_BUILD !== \"true\") {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
1
+ {"version":3,"file":"error-handler.controller.js","sourceRoot":"","sources":["../../../../src/modules/error-handler/error-handler.controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport AppError from \"./utils/app-error\";\nimport { getAppServer } from \"../../app\";\nimport { getHandledError } from \"./utils/get-handled-error\";\n\n/**\n * Error handling middleware for Express.\n *\n * This middleware function handles all errors in the Express application.\n * It checks for the environment (development or production) and sends appropriate error responses\n * based on whether the environment is production or not. It also maps specific errors such as\n * JWT errors, Prisma client errors, and database-related errors to specific helper functions for handling.\n *\n * @param {AppError} err - The error object thrown by the application.\n * @param {Request} req - The Express request object.\n * @param {Response} res - The Express response object.\n * @param {NextFunction} _ - The next middleware function in the chain.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nexport default function errorHandler(\n err: AppError,\n req: Request,\n res: Response,\n _: NextFunction\n): void {\n console.error(\"[\\x1b[31mError\\x1b[0m]:\", err);\n\n err.statusCode = err.isOperational ? err.statusCode : 500;\n err.status = err.isOperational ? err.status : \"error\";\n\n let error: any = {\n ...err,\n message: err.message,\n stack: err?.stack || undefined,\n };\n\n if (process.env.ARKOS_BUILD === \"true\") delete error?.stack;\n\n error = getHandledError(error);\n\n const { message, ...rest } = error;\n if (process.env.ARKOS_BUILD !== \"true\")\n return sendDevelopmentError(\n {\n message: error.message,\n ...rest,\n stack: err.stack,\n originalError: err,\n },\n req,\n res\n );\n\n sendProductionError({ message, ...rest }, req, res);\n}\n\n/**\n * Sends a detailed error response in development mode.\n *\n * In development, the error response includes full error details, including\n * the stack trace and the complete error message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendDevelopmentError(err: any, _: Request, res: Response): void {\n res.status(err.statusCode).json({\n ...err,\n message: err.message?.split?.(\"\\n\")[err.message?.split?.(\"\\n\").length - 1],\n stack: err?.originalError?.stack?.split?.(\"\\n\"),\n });\n}\n\n/**\n * Sends a generic error response in production mode.\n *\n * In production, sensitive error details (such as stack traces) are not exposed\n * to the client. Only operational errors are shown with a generic message.\n *\n * @param {AppError} err - The error object.\n * @param {Request} _ - The Express request object.\n * @param {Response} res - The Express response object.\n *\n * @returns {void} - Sends the response with the error details to the client.\n */\nfunction sendProductionError(err: AppError, _: Request, res: Response): void {\n if (err.isOperational)\n res.status(err.statusCode).json({\n status: err.status,\n message: err.message,\n meta: err.meta || {},\n code: err.code || \"Unknown\",\n });\n else\n res.status(500).json({\n status: \"error\",\n message: \"Internal server error, please try again later.\",\n code: \"InternalServerError\",\n meta: {},\n });\n}\n\n/**\n * Gracefully handles process termination by listening for SIGTERM signal.\n *\n * - In production and staging environments, it will log a shutdown message\n * and attempt to close the server gracefully.\n * - In development or non-production environments, it will immediately exit the process.\n *\n * @returns {void}\n */\nprocess.on(\"SIGTERM\", () => {\n if (\n process.env.ARKOS_BUILD !== \"true\" ||\n process.env.__SKIP_LISTEN === \"true\"\n ) {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n const server = getAppServer();\n\n if (server?.close)\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n }\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"catch-async.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/catch-async.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,GAAG,CACjB,EAAkD,EAClD,UAAwC,EAAE,IAAI,EAAE,QAAQ,EAAE,EACrD,EAAE,CACP,OAAO,EAAE,IAAI,KAAK,OAAO;IACvB,CAAC,CAAC,KAAK,EACH,GAAQ,EACR,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACT,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,CAAC,MAAO,EAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAS,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACH,CAAC,CAAC,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACT,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,CAAC,MAAO,EAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAS,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AAIR,eAAe,UAAU,CAAC","sourcesContent":["import {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n ArkosErrorRequestHandler,\n} from \"../../../types\";\n\n/**\n * Used to wrap request handlers and middleware for automatic catch async errors and throw to next to invoke the global error handler\n *\n * @param {ArkosRequestHandler} fn - an express request handler or middleware that will be called with req, res, next, with catch attached for error handling\n * @returns\n *\n * @example\n * ```typescript\n * import { ArkosRequest, ArkosResponse, ArkosNextFunction } from 'arkos'\n *\n * export const getManyPosts = catchAsync(async\n * (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n * const posts = await getSomePosts()\n * res.status(200).json({ data: posts })\n * })\n * ```\n */\nconst catchAsync = (\n fn: ArkosRequestHandler | ArkosErrorRequestHandler,\n options: { type: \"error\" | \"normal\" } = { type: \"normal\" }\n): any =>\n options?.type === \"error\"\n ? async (\n err: any,\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ): Promise<any> => {\n try {\n return (await (fn as any)(err, req, res, next)) as void;\n } catch (err) {\n next(err);\n }\n }\n : async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ): Promise<any> => {\n try {\n return (await (fn as ArkosRequestHandler)(req, res, next)) as void;\n } catch (err) {\n next(err);\n }\n };\n\nexport type CatchAsyncReturnType = ReturnType<typeof catchAsync>;\n\nexport default catchAsync;\n"]}
1
+ {"version":3,"file":"catch-async.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/catch-async.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,GAAG,CACjB,EAA0B,EAC1B,UAAwC,EAAE,IAAI,EAAE,QAAQ,EAAE,EACrD,EAAE,CACP,OAAO,EAAE,IAAI,KAAK,OAAO;IACvB,CAAC,CAAC,KAAK,EACH,GAAQ,EACR,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACT,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,CAAC,MAAO,EAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAS,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC;IACH,CAAC,CAAC,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACT,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,CAAC,MAAO,EAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAS,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;AAIR,eAAe,UAAU,CAAC","sourcesContent":["import {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\n ArkosAnyRequestHandler,\n} from \"../../../types\";\n\n/**\n * Used to wrap request handlers and middleware for automatic catch async errors and throw to next to invoke the global error handler\n *\n * @param {ArkosRequestHandler} fn - an express request handler or middleware that will be called with req, res, next, with catch attached for error handling\n * @returns\n *\n * @example\n * ```typescript\n * import { ArkosRequest, ArkosResponse, ArkosNextFunction } from 'arkos'\n *\n * export const getManyPosts = catchAsync(async\n * (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n * const posts = await getSomePosts()\n * res.status(200).json({ data: posts })\n * })\n * ```\n */\nconst catchAsync = (\n fn: ArkosAnyRequestHandler,\n options: { type: \"error\" | \"normal\" } = { type: \"normal\" }\n): any =>\n options?.type === \"error\"\n ? async (\n err: any,\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ): Promise<any> => {\n try {\n return (await (fn as any)(err, req, res, next)) as void;\n } catch (err) {\n next(err);\n }\n }\n : async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ): Promise<any> => {\n try {\n return (await (fn as ArkosRequestHandler)(req, res, next)) as void;\n } catch (err) {\n next(err);\n }\n };\n\nexport type CatchAsyncReturnType = ReturnType<typeof catchAsync>;\n\nexport default catchAsync;\n"]}
@@ -0,0 +1,68 @@
1
+ import multerErrorHandler from "../utils/multer-error-handler.js";
2
+ import * as errorControllerHelper from "../utils/error-handler.helpers.js";
3
+ export function getHandledError(err) {
4
+ let error = err;
5
+ switch (err.name) {
6
+ case "JsonWebTokenError":
7
+ error = errorControllerHelper.handleJWTError();
8
+ break;
9
+ case "TokenExpiredError":
10
+ error = errorControllerHelper.handleJWTExpired();
11
+ break;
12
+ case "PrismaClientValidationError":
13
+ error = errorControllerHelper.handlePrismaClientValidationError(err);
14
+ break;
15
+ case "PrismaClientInitializationError":
16
+ error = errorControllerHelper.handlePrismaClientInitializationError(err);
17
+ break;
18
+ case "MulterError":
19
+ error = multerErrorHandler.handle(err);
20
+ break;
21
+ }
22
+ switch (err.code) {
23
+ case "P1000":
24
+ error = errorControllerHelper.handleAuthenticationError(err);
25
+ break;
26
+ case "P1001":
27
+ error = errorControllerHelper.handleServerNotReachableError(err);
28
+ break;
29
+ case "P1002":
30
+ error = errorControllerHelper.handleConnectionTimeoutError(err);
31
+ break;
32
+ case "P1003":
33
+ error = errorControllerHelper.handleDatabaseNotFoundError(err);
34
+ break;
35
+ case "P2000":
36
+ error = errorControllerHelper.handleFieldValueTooLargeError(err);
37
+ break;
38
+ case "P2001":
39
+ error = errorControllerHelper.handleRecordNotFoundError(err);
40
+ break;
41
+ case "P2002":
42
+ error = errorControllerHelper.handleUniqueConstraintError(err);
43
+ break;
44
+ case "P2003":
45
+ error = errorControllerHelper.handleForeignKeyConstraintError(err);
46
+ break;
47
+ case "P2004":
48
+ error = errorControllerHelper.handleConstraintFailedError(err);
49
+ break;
50
+ case "P2025":
51
+ error = errorControllerHelper.handleNonExistingRecord(err);
52
+ break;
53
+ case "P3000":
54
+ error = errorControllerHelper.handleSchemaCreationFailedError(err);
55
+ break;
56
+ case "P3001":
57
+ error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);
58
+ break;
59
+ case "P3002":
60
+ error = errorControllerHelper.handleMigrationScriptFailedError(err);
61
+ break;
62
+ case "P3003":
63
+ error = errorControllerHelper.handleVersionMismatchError(err);
64
+ break;
65
+ }
66
+ return error;
67
+ }
68
+ //# sourceMappingURL=get-handled-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-handled-error.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/get-handled-error.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,gCAAgC,CAAC;AAExE,MAAM,UAAU,eAAe,CAAC,GAAQ;IACtC,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,mBAAmB;YACtB,KAAK,GAAG,qBAAqB,CAAC,cAAc,EAAE,CAAC;YAC/C,MAAM;QACR,KAAK,mBAAmB;YACtB,KAAK,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;YACjD,MAAM;QACR,KAAK,6BAA6B;YAChC,KAAK,GAAG,qBAAqB,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC;YACrE,MAAM;QACR,KAAK,iCAAiC;YACpC,KAAK,GAAG,qBAAqB,CAAC,qCAAqC,CAAC,GAAG,CAAC,CAAC;YACzE,MAAM;QACR,KAAK,aAAa;YAChB,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAA6B,CAAC,CAAC;YACjE,MAAM;IACV,CAAC;IAED,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC;YACnE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC;YAC/D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,+BAA+B,CAAC,GAAG,CAAC,CAAC;YACnE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,kCAAkC,CAAC,GAAG,CAAC,CAAC;YACtE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,gCAAgC,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM;QACR,KAAK,OAAO;YACV,KAAK,GAAG,qBAAqB,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;YAC9D,MAAM;IACV,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { MulterError } from \"multer\";\nimport multerErrorHandler from \"../utils/multer-error-handler\";\nimport * as errorControllerHelper from \"../utils/error-handler.helpers\";\n\nexport function getHandledError(err: any): any {\n let error = err;\n\n switch (err.name) {\n case \"JsonWebTokenError\":\n error = errorControllerHelper.handleJWTError();\n break;\n case \"TokenExpiredError\":\n error = errorControllerHelper.handleJWTExpired();\n break;\n case \"PrismaClientValidationError\":\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n break;\n case \"PrismaClientInitializationError\":\n error = errorControllerHelper.handlePrismaClientInitializationError(err);\n break;\n case \"MulterError\":\n error = multerErrorHandler.handle(err as unknown as MulterError);\n break;\n }\n\n switch (err.code) {\n case \"P1000\":\n error = errorControllerHelper.handleAuthenticationError(err);\n break;\n case \"P1001\":\n error = errorControllerHelper.handleServerNotReachableError(err);\n break;\n case \"P1002\":\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n break;\n case \"P1003\":\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n break;\n case \"P2000\":\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n break;\n case \"P2001\":\n error = errorControllerHelper.handleRecordNotFoundError(err);\n break;\n case \"P2002\":\n error = errorControllerHelper.handleUniqueConstraintError(err);\n break;\n case \"P2003\":\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n break;\n case \"P2004\":\n error = errorControllerHelper.handleConstraintFailedError(err);\n break;\n case \"P2025\":\n error = errorControllerHelper.handleNonExistingRecord(err);\n break;\n case \"P3000\":\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n break;\n case \"P3001\":\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n break;\n case \"P3002\":\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n break;\n case \"P3003\":\n error = errorControllerHelper.handleVersionMismatchError(err);\n break;\n }\n\n return error;\n}\n"]}
@@ -10,6 +10,7 @@ import loadableRegistry from "../../components/arkos-loadable-registry/index.js"
10
10
  import { routeHookReader, } from "../../components/arkos-route-hook/reader.js";
11
11
  import { getArkosConfig } from "../../server.js";
12
12
  import fileUploadJsonSchemaGenerator from "./utils/file-upload-json-schema-generator.js";
13
+ import AppError from "../error-handler/utils/app-error.js";
13
14
  export function getFileUploadRouter() {
14
15
  const router = ArkosRouter();
15
16
  const { fileUpload } = getArkosConfig();
@@ -56,10 +57,16 @@ export function getFileUploadRouter() {
56
57
  etag: true,
57
58
  lastModified: true,
58
59
  dotfiles: "ignore",
59
- fallthrough: true,
60
+ fallthrough: false,
60
61
  index: false,
61
62
  cacheControl: true,
62
- }, fileUpload?.expressStatic || {})), ...processMiddleware(onError, { type: "error" }));
63
+ }, fileUpload?.expressStatic || {})), (err, req, _res, next) => {
64
+ if (err.code === "ENOENT") {
65
+ const filepath = req.path.replace(`/api/${fileUpload?.baseRoute}`.replace("//", "/"), "");
66
+ throw new AppError(`File ${filepath} was not found`, 404, "FileNotFound", { filepath });
67
+ }
68
+ next(err);
69
+ }, ...processMiddleware(onError, { type: "error" }));
63
70
  }
64
71
  {
65
72
  const { before, after, onError, routeConfig } = op("uploadFile");