arkos 1.2.14-test → 1.2.14-test.2

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 (421) hide show
  1. package/README.md +22 -14
  2. package/cli.js +2 -11
  3. package/dist/cjs/app.js +1 -1
  4. package/dist/cjs/app.js.map +1 -1
  5. package/dist/cjs/exports/auth/index.js +1 -6
  6. package/dist/cjs/exports/controllers/index.js +1 -11
  7. package/dist/cjs/exports/error-handler/index.js +1 -11
  8. package/dist/cjs/exports/index.js +1 -12
  9. package/dist/cjs/exports/middlewares/index.js +1 -7
  10. package/dist/cjs/exports/prisma/index.js +1 -6
  11. package/dist/cjs/exports/services/index.js +1 -49
  12. package/dist/cjs/exports/utils/index.js +1 -44
  13. package/dist/cjs/exports/validation/index.js +1 -11
  14. package/dist/cjs/modules/auth/auth.controller.js +1 -194
  15. package/dist/cjs/modules/auth/auth.router.js +1 -124
  16. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  17. package/dist/cjs/modules/auth/auth.service.js +1 -192
  18. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  19. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +1 -83
  20. package/dist/cjs/modules/base/base.controller.js +1 -159
  21. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  22. package/dist/cjs/modules/base/base.middlewares.js +1 -92
  23. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  24. package/dist/cjs/modules/base/base.router.js +1 -24
  25. package/dist/cjs/modules/base/base.router.js.map +1 -1
  26. package/dist/cjs/modules/base/base.service.js +1 -128
  27. package/dist/cjs/modules/base/base.service.js.map +1 -1
  28. package/dist/cjs/modules/base/utils/helpers/base.controller.helpers.js +1 -82
  29. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +1 -50
  30. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +1 -167
  31. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  32. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +1 -171
  33. package/dist/cjs/modules/email/email.service.js +1 -104
  34. package/dist/cjs/modules/error-handler/error-handler.controller.js +4 -144
  35. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  36. package/dist/cjs/modules/error-handler/utils/app-error.js +1 -17
  37. package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -12
  38. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  39. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +3 -195
  40. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  41. package/dist/cjs/modules/file-upload/file-upload.controller.js +1 -271
  42. package/dist/cjs/modules/file-upload/file-upload.router.js +1 -56
  43. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  44. package/dist/cjs/modules/file-upload/file-upload.service.js +1 -322
  45. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -90
  46. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  47. package/dist/cjs/modules/swagger/swagger.router.js +1 -141
  48. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  49. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -0
  50. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  51. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
  52. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  53. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  54. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  55. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
  56. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  57. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
  58. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  59. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
  60. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  61. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
  62. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  63. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
  64. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  65. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -0
  66. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  67. package/dist/cjs/package.json +3 -0
  68. package/dist/cjs/server.js +4 -2
  69. package/dist/cjs/server.js.map +1 -1
  70. package/dist/cjs/types/arkos-config.js +1 -3
  71. package/dist/cjs/types/arkos-config.js.map +1 -1
  72. package/dist/cjs/types/auth.js +1 -3
  73. package/dist/cjs/types/index.js +1 -11
  74. package/dist/cjs/types/router-config.js +1 -3
  75. package/dist/cjs/utils/arkos-env.js +1 -9
  76. package/dist/cjs/utils/cli/build.js +5 -229
  77. package/dist/cjs/utils/cli/build.js.map +1 -1
  78. package/dist/cjs/utils/cli/dev.js +5 -271
  79. package/dist/cjs/utils/cli/dev.js.map +1 -1
  80. package/dist/cjs/utils/cli/generate.js +12 -189
  81. package/dist/cjs/utils/cli/generate.js.map +1 -1
  82. package/dist/cjs/utils/cli/index.js +1 -81
  83. package/dist/cjs/utils/cli/start.js +1 -93
  84. package/dist/cjs/utils/cli/start.js.map +1 -1
  85. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -26
  86. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +1 -1
  87. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +5 -20
  88. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +6 -15
  89. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +71 -133
  90. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  91. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +24 -46
  92. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  93. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +12 -32
  94. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  95. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +7 -27
  96. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  97. package/dist/cjs/utils/cli/utils/template-generators.js +2 -28
  98. package/dist/cjs/utils/cli/utils/watermark-stamper.js +3 -0
  99. package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +1 -0
  100. package/dist/cjs/utils/dotenv.helpers.js +1 -43
  101. package/dist/cjs/utils/features/api.features.js +1 -161
  102. package/dist/cjs/utils/features/api.features.js.map +1 -1
  103. package/dist/cjs/utils/features/change-case.features.js +1 -67
  104. package/dist/cjs/utils/features/port-and-host-allocator.js +1 -0
  105. package/dist/cjs/utils/features/port-and-host-allocator.js.map +1 -0
  106. package/dist/cjs/utils/helpers/api.features.helpers.js +1 -106
  107. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  108. package/dist/cjs/utils/helpers/change-case.helpers.js +1 -177
  109. package/dist/cjs/utils/helpers/deepmerge.helper.js +1 -115
  110. package/dist/cjs/utils/helpers/fs.helpers.js +1 -54
  111. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  112. package/dist/cjs/utils/helpers/global.helpers.js +1 -40
  113. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  114. package/dist/cjs/utils/helpers/models.helpers.js +11 -325
  115. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  116. package/dist/cjs/utils/helpers/prisma.helpers.js +1 -49
  117. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  118. package/dist/cjs/utils/helpers/query-parser.helpers.js +1 -45
  119. package/dist/cjs/utils/helpers/routers.helpers.js +1 -0
  120. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -0
  121. package/dist/cjs/utils/helpers/text.helpers.js +1 -28
  122. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
  123. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  124. package/dist/cjs/utils/prisma/prisma-schema-parser.js +3 -0
  125. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -0
  126. package/dist/cjs/utils/prisma/types.js +1 -0
  127. package/dist/cjs/utils/prisma/types.js.map +1 -0
  128. package/dist/cjs/utils/sheu.js +1 -0
  129. package/dist/cjs/utils/sheu.js.map +1 -0
  130. package/dist/cjs/utils/validate-dto.js +1 -17
  131. package/dist/cjs/utils/validate-schema.js +1 -15
  132. package/dist/esm/app.js +1 -0
  133. package/dist/esm/app.js.map +1 -0
  134. package/dist/esm/exports/auth/index.js +1 -0
  135. package/dist/esm/exports/controllers/index.js +1 -0
  136. package/dist/esm/exports/error-handler/index.js +1 -0
  137. package/dist/esm/exports/index.js +1 -0
  138. package/dist/esm/exports/middlewares/index.js +1 -0
  139. package/dist/esm/exports/prisma/index.js +1 -0
  140. package/dist/esm/exports/services/index.js +1 -0
  141. package/dist/esm/exports/utils/index.js +1 -0
  142. package/dist/esm/exports/validation/index.js +1 -0
  143. package/dist/esm/modules/auth/auth.controller.js +1 -0
  144. package/dist/esm/modules/auth/auth.router.js +1 -0
  145. package/dist/esm/modules/auth/auth.router.js.map +1 -0
  146. package/dist/esm/modules/auth/auth.service.js +1 -0
  147. package/dist/esm/modules/auth/auth.service.js.map +1 -0
  148. package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -0
  149. package/dist/esm/modules/base/base.controller.js +1 -0
  150. package/dist/esm/modules/base/base.controller.js.map +1 -0
  151. package/dist/esm/modules/base/base.middlewares.js +1 -0
  152. package/dist/esm/modules/base/base.middlewares.js.map +1 -0
  153. package/dist/esm/modules/base/base.router.js +1 -0
  154. package/dist/esm/modules/base/base.router.js.map +1 -0
  155. package/dist/esm/modules/base/base.service.js +1 -0
  156. package/dist/{es2020 → esm}/modules/base/base.service.js.map +1 -1
  157. package/dist/esm/modules/base/utils/helpers/base.controller.helpers.js +1 -0
  158. package/dist/esm/modules/base/utils/helpers/base.middlewares.helpers.js +1 -0
  159. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +1 -0
  160. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -0
  161. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +1 -0
  162. package/dist/esm/modules/email/email.service.js +1 -0
  163. package/dist/esm/modules/error-handler/error-handler.controller.js +4 -0
  164. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -0
  165. package/dist/esm/modules/error-handler/utils/app-error.js +1 -0
  166. package/dist/esm/modules/error-handler/utils/catch-async.js +1 -0
  167. package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -0
  168. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +3 -0
  169. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
  170. package/dist/esm/modules/file-upload/file-upload.controller.js +1 -0
  171. package/dist/esm/modules/file-upload/file-upload.router.js +1 -0
  172. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -0
  173. package/dist/esm/modules/file-upload/file-upload.service.js +1 -0
  174. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +1 -0
  175. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -0
  176. package/dist/esm/modules/swagger/swagger.router.js +1 -0
  177. package/dist/esm/modules/swagger/swagger.router.js.map +1 -0
  178. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +1 -0
  179. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  180. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +1 -0
  181. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  182. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +1 -0
  183. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  184. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +1 -0
  185. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  186. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +1 -0
  187. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  188. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +1 -0
  189. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  190. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +1 -0
  191. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  192. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +1 -0
  193. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  194. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +1 -0
  195. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  196. package/dist/esm/package.json +3 -0
  197. package/dist/esm/server.js +5 -0
  198. package/dist/esm/server.js.map +1 -0
  199. package/dist/esm/types/arkos-config.js +1 -0
  200. package/dist/esm/types/arkos-config.js.map +1 -0
  201. package/dist/esm/types/auth.js +1 -0
  202. package/dist/esm/types/index.js +1 -0
  203. package/dist/esm/types/router-config.js +1 -0
  204. package/dist/esm/utils/arkos-env.js +1 -0
  205. package/dist/esm/utils/cli/build.js +5 -0
  206. package/dist/esm/utils/cli/build.js.map +1 -0
  207. package/dist/esm/utils/cli/dev.js +5 -0
  208. package/dist/esm/utils/cli/dev.js.map +1 -0
  209. package/dist/esm/utils/cli/generate.js +12 -0
  210. package/dist/{es2020 → esm}/utils/cli/generate.js.map +1 -1
  211. package/dist/esm/utils/cli/index.js +1 -0
  212. package/dist/esm/utils/cli/start.js +1 -0
  213. package/dist/esm/utils/cli/start.js.map +1 -0
  214. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -0
  215. package/dist/esm/utils/cli/utils/cli.helpers.js.map +1 -0
  216. package/dist/esm/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +21 -0
  217. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +12 -0
  218. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js +206 -0
  219. package/dist/esm/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -0
  220. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +36 -0
  221. package/dist/esm/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -0
  222. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js +18 -0
  223. package/dist/esm/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -0
  224. package/dist/esm/utils/cli/utils/template-generator/templates/generate-service-template.js +15 -0
  225. package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  226. package/dist/esm/utils/cli/utils/template-generators.js +2 -0
  227. package/dist/esm/utils/cli/utils/watermark-stamper.js +3 -0
  228. package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -0
  229. package/dist/esm/utils/dotenv.helpers.js +1 -0
  230. package/dist/esm/utils/features/api.features.js +1 -0
  231. package/dist/esm/utils/features/api.features.js.map +1 -0
  232. package/dist/esm/utils/features/change-case.features.js +1 -0
  233. package/dist/esm/utils/features/port-and-host-allocator.js +1 -0
  234. package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -0
  235. package/dist/esm/utils/helpers/api.features.helpers.js +1 -0
  236. package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -0
  237. package/dist/esm/utils/helpers/change-case.helpers.js +1 -0
  238. package/dist/esm/utils/helpers/deepmerge.helper.js +1 -0
  239. package/dist/esm/utils/helpers/fs.helpers.js +1 -0
  240. package/dist/esm/utils/helpers/fs.helpers.js.map +1 -0
  241. package/dist/esm/utils/helpers/global.helpers.js +1 -0
  242. package/dist/esm/utils/helpers/global.helpers.js.map +1 -0
  243. package/dist/esm/utils/helpers/models.helpers.js +11 -0
  244. package/dist/esm/utils/helpers/models.helpers.js.map +1 -0
  245. package/dist/esm/utils/helpers/prisma.helpers.js +1 -0
  246. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -0
  247. package/dist/esm/utils/helpers/query-parser.helpers.js +1 -0
  248. package/dist/esm/utils/helpers/routers.helpers.js +1 -0
  249. package/dist/esm/utils/helpers/routers.helpers.js.map +1 -0
  250. package/dist/esm/utils/helpers/text.helpers.js +1 -0
  251. package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js +1 -0
  252. package/dist/esm/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  253. package/dist/esm/utils/prisma/prisma-schema-parser.js +3 -0
  254. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -0
  255. package/dist/esm/utils/prisma/types.js +1 -0
  256. package/dist/esm/utils/prisma/types.js.map +1 -0
  257. package/dist/esm/utils/sheu.js +1 -0
  258. package/dist/esm/utils/sheu.js.map +1 -0
  259. package/dist/esm/utils/validate-dto.js +1 -0
  260. package/dist/esm/utils/validate-schema.js +1 -0
  261. package/dist/types/modules/base/base.middlewares.d.ts +4 -4
  262. package/dist/types/modules/base/base.service.d.ts +1 -1
  263. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +4 -1
  264. package/dist/types/modules/error-handler/error-handler.controller.d.ts +1 -1
  265. package/dist/types/modules/error-handler/utils/catch-async.d.ts +1 -0
  266. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +4 -0
  267. package/dist/types/modules/file-upload/file-upload.router.d.ts +1 -1
  268. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
  269. package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
  270. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -0
  271. package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +2 -0
  272. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -0
  273. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -0
  274. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +1 -0
  275. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +3 -0
  276. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.d.ts +3 -0
  277. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +34 -0
  278. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +7 -0
  279. package/dist/types/server.d.ts +3 -0
  280. package/dist/types/types/arkos-config.d.ts +10 -5
  281. package/dist/types/utils/cli/utils/cli.helpers.d.ts +1 -1
  282. package/dist/types/utils/cli/utils/watermark-stamper.d.ts +9 -0
  283. package/dist/types/utils/features/api.features.d.ts +1 -0
  284. package/dist/types/utils/features/port-and-host-allocator.d.ts +21 -0
  285. package/dist/types/utils/helpers/global.helpers.d.ts +6 -1
  286. package/dist/types/utils/helpers/models.helpers.d.ts +31 -5
  287. package/dist/types/utils/helpers/routers.helpers.d.ts +2 -0
  288. package/dist/types/utils/prisma/enhaced-prisma-json-schema-generator.d.ts +34 -0
  289. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +18 -0
  290. package/dist/types/utils/prisma/types.d.ts +48 -0
  291. package/dist/types/utils/sheu.d.ts +70 -0
  292. package/package.json +40 -40
  293. package/dist/es2020/app.js +0 -1
  294. package/dist/es2020/app.js.map +0 -1
  295. package/dist/es2020/exports/auth/index.js +0 -2
  296. package/dist/es2020/exports/controllers/index.js +0 -4
  297. package/dist/es2020/exports/error-handler/index.js +0 -4
  298. package/dist/es2020/exports/index.js +0 -8
  299. package/dist/es2020/exports/middlewares/index.js +0 -2
  300. package/dist/es2020/exports/prisma/index.js +0 -3
  301. package/dist/es2020/exports/services/index.js +0 -9
  302. package/dist/es2020/exports/utils/index.js +0 -4
  303. package/dist/es2020/exports/validation/index.js +0 -4
  304. package/dist/es2020/modules/auth/auth.controller.js +0 -187
  305. package/dist/es2020/modules/auth/auth.router.js +0 -118
  306. package/dist/es2020/modules/auth/auth.router.js.map +0 -1
  307. package/dist/es2020/modules/auth/auth.service.js +0 -185
  308. package/dist/es2020/modules/auth/auth.service.js.map +0 -1
  309. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +0 -73
  310. package/dist/es2020/modules/base/base.controller.js +0 -151
  311. package/dist/es2020/modules/base/base.controller.js.map +0 -1
  312. package/dist/es2020/modules/base/base.middlewares.js +0 -81
  313. package/dist/es2020/modules/base/base.middlewares.js.map +0 -1
  314. package/dist/es2020/modules/base/base.router.js +0 -17
  315. package/dist/es2020/modules/base/base.router.js.map +0 -1
  316. package/dist/es2020/modules/base/base.service.js +0 -120
  317. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +0 -77
  318. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js +0 -44
  319. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +0 -161
  320. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  321. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +0 -165
  322. package/dist/es2020/modules/email/email.service.js +0 -97
  323. package/dist/es2020/modules/error-handler/error-handler.controller.js +0 -105
  324. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +0 -1
  325. package/dist/es2020/modules/error-handler/utils/app-error.js +0 -15
  326. package/dist/es2020/modules/error-handler/utils/catch-async.js +0 -10
  327. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +0 -1
  328. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +0 -155
  329. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  330. package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -266
  331. package/dist/es2020/modules/file-upload/file-upload.router.js +0 -50
  332. package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
  333. package/dist/es2020/modules/file-upload/file-upload.service.js +0 -314
  334. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -81
  335. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  336. package/dist/es2020/modules/swagger/swagger.router.js +0 -135
  337. package/dist/es2020/modules/swagger/swagger.router.js.map +0 -1
  338. package/dist/es2020/server.js +0 -3
  339. package/dist/es2020/server.js.map +0 -1
  340. package/dist/es2020/types/arkos-config.js +0 -2
  341. package/dist/es2020/types/arkos-config.js.map +0 -1
  342. package/dist/es2020/types/auth.js +0 -2
  343. package/dist/es2020/types/index.js +0 -8
  344. package/dist/es2020/types/router-config.js +0 -2
  345. package/dist/es2020/utils/arkos-env.js +0 -7
  346. package/dist/es2020/utils/cli/build.js +0 -223
  347. package/dist/es2020/utils/cli/build.js.map +0 -1
  348. package/dist/es2020/utils/cli/dev.js +0 -264
  349. package/dist/es2020/utils/cli/dev.js.map +0 -1
  350. package/dist/es2020/utils/cli/generate.js +0 -183
  351. package/dist/es2020/utils/cli/index.js +0 -74
  352. package/dist/es2020/utils/cli/start.js +0 -86
  353. package/dist/es2020/utils/cli/start.js.map +0 -1
  354. package/dist/es2020/utils/cli/utils/cli.helpers.js +0 -18
  355. package/dist/es2020/utils/cli/utils/cli.helpers.js.map +0 -1
  356. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -33
  357. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -18
  358. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -265
  359. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +0 -1
  360. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -55
  361. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
  362. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -32
  363. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
  364. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -32
  365. package/dist/es2020/utils/cli/utils/template-generators.js +0 -25
  366. package/dist/es2020/utils/dotenv.helpers.js +0 -37
  367. package/dist/es2020/utils/features/api.features.js +0 -154
  368. package/dist/es2020/utils/features/api.features.js.map +0 -1
  369. package/dist/es2020/utils/features/change-case.features.js +0 -31
  370. package/dist/es2020/utils/helpers/api.features.helpers.js +0 -103
  371. package/dist/es2020/utils/helpers/api.features.helpers.js.map +0 -1
  372. package/dist/es2020/utils/helpers/change-case.helpers.js +0 -161
  373. package/dist/es2020/utils/helpers/deepmerge.helper.js +0 -113
  374. package/dist/es2020/utils/helpers/fs.helpers.js +0 -45
  375. package/dist/es2020/utils/helpers/fs.helpers.js.map +0 -1
  376. package/dist/es2020/utils/helpers/global.helpers.js +0 -4
  377. package/dist/es2020/utils/helpers/global.helpers.js.map +0 -1
  378. package/dist/es2020/utils/helpers/models.helpers.js +0 -276
  379. package/dist/es2020/utils/helpers/models.helpers.js.map +0 -1
  380. package/dist/es2020/utils/helpers/prisma.helpers.js +0 -41
  381. package/dist/es2020/utils/helpers/prisma.helpers.js.map +0 -1
  382. package/dist/es2020/utils/helpers/query-parser.helpers.js +0 -40
  383. package/dist/es2020/utils/helpers/text.helpers.js +0 -22
  384. package/dist/es2020/utils/validate-dto.js +0 -11
  385. package/dist/es2020/utils/validate-schema.js +0 -9
  386. /package/dist/{es2020 → esm}/exports/auth/index.js.map +0 -0
  387. /package/dist/{es2020 → esm}/exports/controllers/index.js.map +0 -0
  388. /package/dist/{es2020 → esm}/exports/error-handler/index.js.map +0 -0
  389. /package/dist/{es2020 → esm}/exports/index.js.map +0 -0
  390. /package/dist/{es2020 → esm}/exports/middlewares/index.js.map +0 -0
  391. /package/dist/{es2020 → esm}/exports/prisma/index.js.map +0 -0
  392. /package/dist/{es2020 → esm}/exports/services/index.js.map +0 -0
  393. /package/dist/{es2020 → esm}/exports/utils/index.js.map +0 -0
  394. /package/dist/{es2020 → esm}/exports/validation/index.js.map +0 -0
  395. /package/dist/{es2020 → esm}/modules/auth/auth.controller.js.map +0 -0
  396. /package/dist/{es2020 → esm}/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -0
  397. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.controller.helpers.js.map +0 -0
  398. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -0
  399. /package/dist/{es2020 → esm}/modules/base/utils/helpers/base.service.helpers.js.map +0 -0
  400. /package/dist/{es2020 → esm}/modules/email/email.service.js.map +0 -0
  401. /package/dist/{es2020 → esm}/modules/error-handler/utils/app-error.js.map +0 -0
  402. /package/dist/{es2020 → esm}/modules/file-upload/file-upload.controller.js.map +0 -0
  403. /package/dist/{es2020 → esm}/modules/file-upload/file-upload.service.js.map +0 -0
  404. /package/dist/{es2020 → esm}/paths.js +0 -0
  405. /package/dist/{es2020 → esm}/paths.js.map +0 -0
  406. /package/dist/{es2020 → esm}/types/auth.js.map +0 -0
  407. /package/dist/{es2020 → esm}/types/index.js.map +0 -0
  408. /package/dist/{es2020 → esm}/types/router-config.js.map +0 -0
  409. /package/dist/{es2020 → esm}/utils/arkos-env.js.map +0 -0
  410. /package/dist/{es2020 → esm}/utils/cli/index.js.map +0 -0
  411. /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -0
  412. /package/dist/{es2020 → esm}/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -0
  413. /package/dist/{es2020 → esm}/utils/cli/utils/template-generators.js.map +0 -0
  414. /package/dist/{es2020 → esm}/utils/dotenv.helpers.js.map +0 -0
  415. /package/dist/{es2020 → esm}/utils/features/change-case.features.js.map +0 -0
  416. /package/dist/{es2020 → esm}/utils/helpers/change-case.helpers.js.map +0 -0
  417. /package/dist/{es2020 → esm}/utils/helpers/deepmerge.helper.js.map +0 -0
  418. /package/dist/{es2020 → esm}/utils/helpers/query-parser.helpers.js.map +0 -0
  419. /package/dist/{es2020 → esm}/utils/helpers/text.helpers.js.map +0 -0
  420. /package/dist/{es2020 → esm}/utils/validate-dto.js.map +0 -0
  421. /package/dist/{es2020 → esm}/utils/validate-schema.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.middlewares.js","sourceRoot":"","sources":["../../../../src/modules/base/base.middlewares.ts"],"names":[],"mappings":"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","sourcesContent":["import { NextFunction, Request, Response } from \"express\";\nimport {\n PrismaQueryOptions,\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n AuthPrismaQueryOptions,\n} from \"../../types\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport validateDto from \"../../utils/validate-dto\";\nimport validateSchema from \"../../utils/validate-schema\";\nimport { ZodSchema } from \"zod\";\nimport { ClassConstructor } from \"class-transformer\";\nimport { ValidatorOptions } from \"class-validator\";\nimport { resolvePrismaQueryOptions } from \"./utils/helpers/base.middlewares.helpers\";\n\nexport function callNext(_: Request, _1: Response, next: NextFunction) {\n next();\n}\n\nexport function sendResponse(req: ArkosRequest, res: ArkosResponse) {\n if (Number(req?.responseStatus) === 204)\n res.status(Number(req?.responseStatus)).send();\n else if (req.responseData && req?.responseStatus)\n res.status(Number(req?.responseStatus)).json(req.responseData);\n else if (Number(req?.responseStatus) && !req.responseData)\n res.status(Number(req?.responseStatus)).send();\n else\n res\n .status(500)\n .json({ message: \"No status or data attached to the response\" });\n}\n\nexport function addRouteMiddlwaresAndConfigs() {}\n\n/**\n * Type representing all possible actions that can be performed on a controller\n * Combines both standard CRUD operations and auth-specific operations\n */\nexport type ControllerActions =\n | keyof PrismaQueryOptions<any>\n | keyof Omit<AuthPrismaQueryOptions<any>, keyof PrismaQueryOptions<any>>;\n\n/**\n * Middleware to add Prisma query options to the request's query parameters.\n *\n * @template T - The type of the Prisma model.\n * @param {PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>} prismaQueryOptions - The Prisma query options to attach.\n * @param {ControllerActions} action - The controller action to apply.\n * @returns A middleware function that attaches the query options to the request.\n */\nexport function addPrismaQueryOptionsToRequest<T extends Record<string, any>>(\n prismaQueryOptions: PrismaQueryOptions<T> | AuthPrismaQueryOptions<T>,\n action: ControllerActions\n) {\n return (req: ArkosRequest, _: ArkosResponse, next: NextFunction) => {\n const configs = getArkosConfig();\n\n // Resolve and merge all applicable options using the helper\n const resolvedOptions = resolvePrismaQueryOptions(\n prismaQueryOptions,\n action\n );\n\n // Parse and merge any dangerous query options from request if allowed\n const requestQueryOptions = configs?.request?.parameters\n ?.allowDangerousPrismaQueryOptions\n ? JSON.parse((req.query?.prismaQueryOptions as string) || \"{}\")\n : {};\n\n // Final merge with request options having the highest priority\n req.prismaQueryOptions = deepmerge(resolvedOptions, requestQueryOptions);\n\n next();\n };\n}\n\n/**\n * Logs request events with colored text such as errors, requests responses.\n *\n */\nexport function handleRequestLogs(\n req: Request,\n res: Response,\n next: NextFunction\n) {\n const startTime = Date.now(); // Capture the start time\n\n // Define colors for each HTTP method\n const methodColors = {\n GET: \"\\x1b[36m\", // Cyan\n POST: \"\\x1b[32m\", // Green\n PUT: \"\\x1b[33m\", // Orange/Yellow\n PATCH: \"\\x1b[33m\", // Orange/Yellow\n DELETE: \"\\x1b[31m\", // Red\n HEAD: \"\\x1b[34m\", // Blue\n OPTIONS: \"\\x1b[34m\", // Blue\n };\n\n // Function to determine status code color\n const getStatusColor = (statusCode: number) => {\n if (statusCode >= 200 && statusCode < 300) return \"\\x1b[32m\"; // Green\n if (statusCode >= 300 && statusCode < 400) return \"\\x1b[33m\"; // Orange/Yellow\n if (statusCode >= 400 && statusCode < 500) return \"\\x1b[33m\"; // Red\n if (statusCode >= 500) return \"\\x1b[31m\"; // White on Red background\n return \"\\x1b[0m\"; // Default (no color)\n };\n\n res.on(\"finish\", () => {\n const duration = Date.now() - startTime; // Calculate the time taken to process the request\n\n // Get the current date and time\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0]; // Format as HH:MM:SS\n\n const methodColor =\n methodColors[req.method as keyof typeof methodColors] || \"\\x1b[0m\"; // Default to no color\n const statusColor = getStatusColor(res.statusCode); // Get the color for the status code\n\n console.info(\n `[\\x1b[36mInfo\\x1b[0m] \\x1b[90m${time}\\x1b[0m ${methodColor}${\n req.method\n }\\x1b[0m ${decodeURIComponent(req.originalUrl)} ${statusColor}${\n res.statusCode\n }\\x1b[0m \\x1b[35m${duration}ms\\x1b[0m`\n );\n });\n\n next(); // Pass control to the next middleware or route handler\n}\n\n// Overload for 'auth'\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n): ArkosRequestHandler;\n\n// Overload for other models\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T>\n): ArkosRequestHandler;\n\n// Implementation\nexport function handleRequestBodyValidationAndTransformation<T extends object>(\n schemaOrDtoClass?: ZodSchema<T> | ClassConstructor<T>,\n classValidatorValidationOptions?: ValidatorOptions\n) {\n return catchAsync(\n async (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const validationConfigs = getArkosConfig()?.validation;\n let body = req.body;\n\n if (validationConfigs?.resolver === \"class-validator\" && schemaOrDtoClass)\n req.body = await validateDto(\n schemaOrDtoClass as ClassConstructor<T>,\n body,\n deepmerge(\n {\n whitelist: true,\n ...classValidatorValidationOptions,\n },\n validationConfigs?.validationOptions || {}\n )\n );\n else if (validationConfigs?.resolver === \"zod\" && schemaOrDtoClass)\n req.body = await validateSchema(schemaOrDtoClass as ZodSchema<T>, body);\n\n next();\n }\n );\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{Router as r}from"express";import{getAvalibleRoutes as a,getAvailableResources as u}from"./base.controller.js";import{getModels as i}from"../../utils/helpers/models.helpers.js";import o from"../auth/auth.service.js";import{setupRouters as s}from"./utils/helpers/base.router.helpers.js";export async function getPrismaModelsRouter(e){const t=r();return await Promise.all(s(i(),t,e)),t}export function getAvailableResourcesAndRoutesRouter(){const e=r();return e.get("/available-routes",o?.authenticate,a),e.get("/available-resources",o?.authenticate,u),e}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.router.js","sourceRoot":"","sources":["../../../../src/modules/base/base.router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,YAAyB;IACnE,MAAM,MAAM,GAAW,MAAM,EAAE,CAAC;IAEhC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oCAAoC;IAClD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CACR,mBAAmB,EACnB,WAAW,EAAE,YAAY,EAEzB,iBAAiB,CAClB,CAAC;IAEF,MAAM,CAAC,GAAG,CACR,sBAAsB,EACtB,WAAW,EAAE,YAAY,EAEzB,qBAAqB,CACtB,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { getAvalibleRoutes, getAvailableResources } from \"./base.controller\";\nimport { getModels } from \"../../utils/helpers/models.helpers\";\nimport authService from \"../auth/auth.service\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport { setupRouters } from \"./utils/helpers/base.router.helpers\";\n\nexport async function getPrismaModelsRouter(arkosConfigs: ArkosConfig) {\n const router: Router = Router();\n\n await Promise.all(setupRouters(getModels(), router, arkosConfigs));\n\n return router;\n}\n\nexport function getAvailableResourcesAndRoutesRouter(): Router {\n const router = Router();\n //\n router.get(\n \"/available-routes\",\n authService?.authenticate,\n // authService?.handleAccessControl({}, \"view\", \"\"),\n getAvalibleRoutes\n );\n\n router.get(\n \"/available-resources\",\n authService?.authenticate,\n // authService?.handleAccessControl({}, \"view\", \"\"),\n getAvailableResources\n );\n\n return router;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{camelCase as l,kebabCase as p,pascalCase as f}from"../../utils/helpers/change-case.helpers.js";import{getModels as u,getPrismaModelRelations as y}from"../../utils/helpers/models.helpers.js";import r from"../../utils/helpers/deepmerge.helper.js";import{handleRelationFieldsInBody as w}from"./utils/helpers/base.service.helpers.js";import{getPrismaInstance as i}from"../../utils/helpers/prisma.helpers.js";import n from"../auth/auth.service.js";export class BaseService{constructor(e){this.modelName=l(e),this.relationFields=y(f(e))}async createOne(e,s){p(this.modelName)==="user"&&e.password&&(n.isPasswordHashed(e.password)||(e.password=await n.hashPassword(e.password)));const a=i(),t=w(e,{...this.relationFields},["delete","disconnect","update"]);return await a[this.modelName].create(r({data:t},s||{}))}async createMany(e,s){const a=i(),t=[];return Array.isArray(e)&&await new Promise(d=>{e.forEach(async(m,o)=>{"password"in m&&this.modelName==="user"&&(n.isPasswordHashed(m.password)||(e[o].password=await n.hashPassword(m?.password))),t[o]=w(e[o],{...this.relationFields},["delete","disconnect","update"]),o===e.length-1&&d(null)})}),await a[this.modelName].createMany(r({data:t},s||{}))}async count(e){return await i()[this.modelName].count({where:e})}async findMany(e,s){return await i()[this.modelName].findMany(r({where:e},s||{}))}async findById(e,s){return await i()[this.modelName].findUnique(r({where:{id:e}},s||{}))}async findOne(e,s){const a=i();return Object.keys(e).length===1&&"id"in e&&e.id!=="me"?a[this.modelName].findUnique(r({where:e},s||{})):await a[this.modelName].findFirst(r({where:e},s||{}))}async updateOne(e,s,a){const t=i();p(this.modelName)==="user"&&s?.password&&(n.isPasswordHashed(s.password)||(s.password=await n.hashPassword(s?.password)));const d=w(s,{...this.relationFields});return await t[this.modelName].update(r({where:e,data:d},a||{}))}async updateMany(e,s,a){const t=i();Array.isArray(s)&&this.modelName==="user"&&await new Promise(m=>{s.forEach(async(o,h)=>{"password"in s[h]&&(n.isPasswordHashed(o.password)||(s[h].password=await n.hashPassword(o.password))),h===s.length-1&&m(void 0)})});const d=r({data:s},a||{});return await t[this.modelName].updateMany(r({where:e},d))}async deleteOne(e){return await i()[this.modelName].delete({where:e})}async deleteMany(e){return await i()[this.modelName].deleteMany({where:e})}}export function getBaseServices(){const c=u(),e={};return c.forEach(s=>{e[`${l(s)}`]=new BaseService(s)}),e}
@@ -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 {\n getModels,\n getPrismaModelRelations,\n RelationFields,\n} from \"../../utils/helpers/models.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { handleRelationFieldsInBody } from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\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 *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import { prisma } from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n *\n */\nexport class BaseService<ModelDelegate extends Record<string, any> = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: RelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n this.relationFields = getPrismaModelRelations(pascalCase(modelName))!;\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {Parameters<ModelDelegate[\"create\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to create the record with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"create\"]>>} The created record.\n */\n async createOne<\n TOptions extends Omit<Parameters<ModelDelegate[\"create\"]>[0], \"data\">,\n >(\n data: Parameters<ModelDelegate[\"create\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"create\"] extends (args: { data: any }) => infer R ? R : any\n > {\n // user uer Password123 true false Promise { true }\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n return await (prisma[this.modelName] as ModelDelegate).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {Parameters<ModelDelegate[\"createMany\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - An array of data to create records with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"createMany\"]>>} The result of the createMany operation.\n */\n async createMany<\n TOptions extends Omit<Parameters<ModelDelegate[\"createMany\"]>[0], \"data\">,\n >(\n data: Parameters<ModelDelegate[\"createMany\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"createMany\"] extends (args: { data: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data))\n await new Promise((resolve) => {\n (data as { [x: string]: any; password?: string }[]).forEach(\n async (curr, i) => {\n if (\"password\" in curr && this.modelName === \"user\")\n if (!authService.isPasswordHashed(curr.password!))\n data[i].password = await authService.hashPassword(\n curr?.password!\n );\n\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n if (i === data.length - 1) resolve(null);\n }\n );\n });\n\n return await (prisma[this.modelName] as ModelDelegate).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {Parameters<ModelDelegate[\"count\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters: Parameters<ModelDelegate[\"count\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any\n ): Promise<number> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).count({\n where: filters,\n });\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {Parameters<ModelDelegate[\"findMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to apply to the query.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findMany\"]>>} The found data.\n */\n async findMany<\n TOptions extends Omit<Parameters<ModelDelegate[\"findMany\"]>[0], \"where\">,\n >(\n filters: Parameters<ModelDelegate[\"findMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findMany\"] extends (\n args: { where: any } & TOptions\n ) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findUnique\"]>>} The found record or null if not found.\n */\n async findById<\n TOptions extends Omit<Parameters<ModelDelegate[\"findUnique\"]>[0], \"where\">,\n >(\n id: string | number,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findUnique\"] extends (args: { where: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {Parameters<ModelDelegate[\"findFirst\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any | Parameters<TModel[\"findUnique\"]>[0] extends { where: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findFirst\"]> | ReturnType<TModel[\"findUnique\"]>>} The found record or null if not found.\n */\n async findOne<\n TOptions extends\n | Omit<Parameters<ModelDelegate[\"findFirst\"]>[0], \"where\">\n | Omit<Parameters<ModelDelegate[\"findUnique\"]>[0], \"where\">,\n >(\n filters: Parameters<ModelDelegate[\"findFirst\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any | Parameters<ModelDelegate[\"findUnique\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findFirst\"] extends (args: { where: any }) => infer R\n ? R\n : ModelDelegate[\"findUnique\"] extends (args: { where: any }) => infer R2\n ? R2\n : any\n > {\n const prisma = getPrismaInstance();\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 (prisma[this.modelName] as ModelDelegate).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n return await (prisma[this.modelName] as ModelDelegate).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {Parameters<ModelDelegate[\"update\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @param {Parameters<ModelDelegate[\"update\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to update the record with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"update\"]>>} The updated record or null if not found.\n */\n async updateOne<\n TOptions extends Omit<\n Parameters<ModelDelegate[\"update\"]>[0],\n \"where\" | \"data\"\n >,\n >(\n filters: Parameters<ModelDelegate[\"update\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n data: Parameters<ModelDelegate[\"update\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"update\"] extends (args: { where: any; data: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n return await (prisma[this.modelName] as ModelDelegate).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {Parameters<ModelDelegate[\"updateMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to identify records to update.\n * @param {Parameters<ModelDelegate[\"updateMany\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to update the records with.\n * @param {TOptions} [queryOptions] - Additional query options.\n * @returns {Promise<ReturnType<ModelDelegate[\"updateMany\"]>>} The result of the updateMany operation.\n */\n async updateMany<\n TOptions extends Omit<\n Parameters<ModelDelegate[\"updateMany\"]>[0],\n \"where\" | \"data\"\n >,\n >(\n filters: Parameters<ModelDelegate[\"updateMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n data: Parameters<ModelDelegate[\"updateMany\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"updateMany\"] extends (args: {\n where: any;\n data: any;\n }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n if (Array.isArray(data) && this.modelName === \"user\")\n await new Promise((resolve) => {\n (data as { [x: string]: any; password?: string }[]).forEach(\n async (curr, i) => {\n if (\"password\" in data[i])\n if (!authService.isPasswordHashed(curr.password!))\n (data[i] as any).password = await authService.hashPassword(\n curr.password!\n );\n\n if (i === data.length - 1) resolve(undefined);\n }\n );\n });\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n return await (prisma[this.modelName] as ModelDelegate).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {Parameters<ModelDelegate[\"delete\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @returns {Promise<ReturnType<ModelDelegate[\"delete\"]>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: Parameters<ModelDelegate[\"delete\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any\n ): Promise<ReturnType<ModelDelegate[\"delete\"]>> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).delete({\n where: filters,\n });\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {Parameters<ModelDelegate[\"deleteMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : Record<string, any>} filters - The filter to identify records to delete.\n * @returns {Promise<ReturnType<ModelDelegate[\"deleteMany\"]>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: Parameters<ModelDelegate[\"deleteMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : Record<string, any>\n ): Promise<ReturnType<ModelDelegate[\"deleteMany\"]>> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).deleteMany({\n where: filters,\n });\n }\n}\n\n/**\n * Generates a set of base service instances for all available models.\n *\n * @returns {Record<string, BaseService>} A dictionary of base service instances, keyed by model name.\n */\nexport function getBaseServices(): Record<string, BaseService<any>> {\n const models = getModels();\n const baseServices: Record<string, BaseService<any>> = {};\n models.forEach((model) => {\n baseServices[`${camelCase(model)}`] = new BaseService(model);\n });\n return baseServices;\n}\n"]}
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 {\n getModels,\n getPrismaModelRelations,\n RelationFields,\n} from \"../../utils/helpers/models.helpers\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { handleRelationFieldsInBody } from \"./utils/helpers/base.service.helpers\";\nimport { getPrismaInstance } from \"../../utils/helpers/prisma.helpers\";\nimport authService from \"../auth/auth.service\";\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 *\n * by model-specific service classes.\n *\n * @class BaseService\n *\n * @usage\n *\n * **Example:** creating a simple service\n *\n * ```ts\n * import { prisma } from '../../utils/prisma'\n *\n * const userService = new BaseService<typeof prisma.user>(\"user\")\n * ```\n *\n * @see {@link https://www.arkosjs.com/docs/api-reference/the-base-service-class}\n *\n */\nexport class BaseService<ModelDelegate extends Record<string, any> = any> {\n /**\n * The camelCase name of the model\n * @public\n */\n modelName: string;\n\n /**\n * Object containing singular and list relation fields for the model\n * @public\n */\n relationFields: RelationFields;\n\n /**\n * Instance of the Prisma client\n * @public\n */\n prisma: any;\n\n /**\n * Creates an instance of BaseService.\n * @param {string} modelName - The name of the model to perform operations on.\n */\n constructor(modelName: string) {\n this.modelName = camelCase(modelName);\n this.relationFields = getPrismaModelRelations(pascalCase(modelName))!;\n }\n\n /**\n * Creates a single record in the database.\n *\n * @param {Parameters<ModelDelegate[\"create\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to create the record with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"create\"]>>} The created record.\n */\n async createOne<\n TOptions extends Omit<Parameters<ModelDelegate[\"create\"]>[0], \"data\">,\n >(\n data: Parameters<ModelDelegate[\"create\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"create\"] extends (args: { data: any }) => infer R ? R : any\n > {\n // user uer Password123 true false Promise { true }\n if (kebabCase(this.modelName) === \"user\" && (data as any).password)\n if (!authService.isPasswordHashed((data as any).password))\n (data as any).password = await authService.hashPassword(\n (data as any).password\n );\n\n const prisma = getPrismaInstance();\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n return await (prisma[this.modelName] as ModelDelegate).create(\n deepmerge(\n {\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { data: any }\n );\n }\n\n /**\n * Creates multiple records in the database.\n *\n * @param {Parameters<ModelDelegate[\"createMany\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - An array of data to create records with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"createMany\"]>>} The result of the createMany operation.\n */\n async createMany<\n TOptions extends Omit<Parameters<ModelDelegate[\"createMany\"]>[0], \"data\">,\n >(\n data: Parameters<ModelDelegate[\"createMany\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"createMany\"] extends (args: { data: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n const dataWithRelationFieldsHandled: any[] = [];\n\n if (Array.isArray(data))\n await new Promise((resolve) => {\n (data as { [x: string]: any; password?: string }[]).forEach(\n async (curr, i) => {\n if (\"password\" in curr && this.modelName === \"user\")\n if (!authService.isPasswordHashed(curr.password!))\n data[i].password = await authService.hashPassword(\n curr?.password!\n );\n\n dataWithRelationFieldsHandled[i] = handleRelationFieldsInBody(\n data[i] as Record<string, any>,\n {\n ...this.relationFields,\n },\n [\"delete\", \"disconnect\", \"update\"]\n );\n\n if (i === data.length - 1) resolve(null);\n }\n );\n });\n\n return await (prisma[this.modelName] as ModelDelegate).createMany(\n deepmerge(\n { data: dataWithRelationFieldsHandled },\n (queryOptions as {}) || {}\n ) as {\n data: any;\n }\n );\n }\n\n /**\n * Counts records based on provided filters.\n *\n * @param {Parameters<ModelDelegate[\"count\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to apply to the query.\n * @returns {Promise<number>} The count of records matching the filters.\n */\n async count(\n filters: Parameters<ModelDelegate[\"count\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any\n ): Promise<number> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).count({\n where: filters,\n });\n }\n\n /**\n * Finds multiple records based on provided filters.\n *\n * @param {Parameters<ModelDelegate[\"findMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to apply to the query.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findMany\"]>>} The found data.\n */\n async findMany<\n TOptions extends Omit<Parameters<ModelDelegate[\"findMany\"]>[0], \"where\">,\n >(\n filters?: Parameters<ModelDelegate[\"findMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findMany\"] extends (\n args: { where: any } & TOptions\n ) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).findMany(\n deepmerge({ where: filters }, (queryOptions as {}) || {}) as {\n where: any;\n } & TOptions\n );\n }\n\n /**\n * Finds a single record by its ID.\n *\n * @param {string | number} id - The ID of the record to find.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findUnique\"]>>} The found record or null if not found.\n */\n async findById<\n TOptions extends Omit<Parameters<ModelDelegate[\"findUnique\"]>[0], \"where\">,\n >(\n id: string | number,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findUnique\"] extends (args: { where: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).findUnique(\n deepmerge(\n {\n where: { id },\n },\n queryOptions || {}\n ) as { where: { id: string | number } }\n );\n }\n\n /**\n * Finds a single record by its parameters.\n *\n * @param {Parameters<ModelDelegate[\"findFirst\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any | Parameters<TModel[\"findUnique\"]>[0] extends { where: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"findFirst\"]> | ReturnType<TModel[\"findUnique\"]>>} The found record or null if not found.\n */\n async findOne<\n TOptions extends\n | Omit<Parameters<ModelDelegate[\"findFirst\"]>[0], \"where\">\n | Omit<Parameters<ModelDelegate[\"findUnique\"]>[0], \"where\">,\n >(\n filters: Parameters<ModelDelegate[\"findFirst\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any | Parameters<ModelDelegate[\"findUnique\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"findFirst\"] extends (args: { where: any }) => infer R\n ? R\n : ModelDelegate[\"findUnique\"] extends (args: { where: any }) => infer R2\n ? R2\n : any\n > {\n const prisma = getPrismaInstance();\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 (prisma[this.modelName] as ModelDelegate).findUnique(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n\n return await (prisma[this.modelName] as ModelDelegate).findFirst(\n deepmerge(\n {\n where: filters,\n },\n (queryOptions as {}) || {}\n ) as { where: any }\n );\n }\n\n /**\n * Updates a single record by its ID.\n *\n * @param {Parameters<ModelDelegate[\"update\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @param {Parameters<ModelDelegate[\"update\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to update the record with.\n * @param {TOptions} [queryOptions] - Additional query options to modify the Prisma query.\n * @returns {Promise<ReturnType<ModelDelegate[\"update\"]>>} The updated record or null if not found.\n */\n async updateOne<\n TOptions extends Omit<\n Parameters<ModelDelegate[\"update\"]>[0],\n \"where\" | \"data\"\n >,\n >(\n filters: Parameters<ModelDelegate[\"update\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n data: Parameters<ModelDelegate[\"update\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"update\"] extends (args: { where: any; data: any }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n if (kebabCase(this.modelName) === \"user\" && (data as any)?.password) {\n if (!authService.isPasswordHashed((data as any).password!))\n (data as any).password = await authService.hashPassword(\n (data as any)?.password\n );\n }\n\n const dataWithRelationFieldsHandled = handleRelationFieldsInBody(\n data as Record<string, any>,\n {\n ...this.relationFields,\n }\n );\n\n return await (prisma[this.modelName] as ModelDelegate).update(\n deepmerge(\n {\n where: filters,\n data: dataWithRelationFieldsHandled,\n },\n (queryOptions as {}) || {}\n ) as { where: any; data: any }\n );\n }\n\n /**\n * Updates multiple records based on the provided filter and data.\n *\n * @param {Parameters<ModelDelegate[\"updateMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The filters to identify records to update.\n * @param {Parameters<ModelDelegate[\"updateMany\"]>[0] extends { data: infer D; [x: string]: any } ? D : any} data - The data to update the records with.\n * @param {TOptions} [queryOptions] - Additional query options.\n * @returns {Promise<ReturnType<ModelDelegate[\"updateMany\"]>>} The result of the updateMany operation.\n */\n async updateMany<\n TOptions extends Omit<\n Parameters<ModelDelegate[\"updateMany\"]>[0],\n \"where\" | \"data\"\n >,\n >(\n filters: Parameters<ModelDelegate[\"updateMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any,\n data: Parameters<ModelDelegate[\"updateMany\"]>[0] extends {\n data: infer D;\n [x: string]: any;\n }\n ? D\n : any,\n queryOptions?: TOptions\n ): Promise<\n ModelDelegate[\"updateMany\"] extends (args: {\n where: any;\n data: any;\n }) => infer R\n ? R\n : any\n > {\n const prisma = getPrismaInstance();\n\n if (Array.isArray(data) && this.modelName === \"user\")\n await new Promise((resolve) => {\n (data as { [x: string]: any; password?: string }[]).forEach(\n async (curr, i) => {\n if (\"password\" in data[i])\n if (!authService.isPasswordHashed(curr.password!))\n (data[i] as any).password = await authService.hashPassword(\n curr.password!\n );\n\n if (i === data.length - 1) resolve(undefined);\n }\n );\n });\n\n const firstMerge = deepmerge({ data }, (queryOptions as {}) || {});\n\n return await (prisma[this.modelName] as ModelDelegate).updateMany(\n deepmerge({ where: filters }, firstMerge) as {\n where: any;\n data: any;\n }\n );\n }\n\n /**\n * Deletes a single record by its ID.\n *\n * @param {Parameters<ModelDelegate[\"delete\"]>[0] extends { where?: infer W; [x: string]: any } ? W : any} filters - The parameters to find the record by.\n * @returns {Promise<ReturnType<ModelDelegate[\"delete\"]>>} The deleted record or null if an error occurs.\n */\n async deleteOne(\n filters: Parameters<ModelDelegate[\"delete\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : any\n ): Promise<ReturnType<ModelDelegate[\"delete\"]>> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).delete({\n where: filters,\n });\n }\n\n /**\n * Deletes multiple records based on the provided filter.\n *\n * @param {Parameters<ModelDelegate[\"deleteMany\"]>[0] extends { where?: infer W; [x: string]: any } ? W : Record<string, any>} filters - The filter to identify records to delete.\n * @returns {Promise<ReturnType<ModelDelegate[\"deleteMany\"]>>} The result of the deleteMany operation.\n */\n async deleteMany(\n filters: Parameters<ModelDelegate[\"deleteMany\"]>[0] extends {\n where?: infer W;\n [x: string]: any;\n }\n ? W\n : Record<string, any>\n ): Promise<ReturnType<ModelDelegate[\"deleteMany\"]>> {\n const prisma = getPrismaInstance();\n\n return await (prisma[this.modelName] as ModelDelegate).deleteMany({\n where: filters,\n });\n }\n}\n\n/**\n * Generates a set of base service instances for all available models.\n *\n * @returns {Record<string, BaseService>} A dictionary of base service instances, keyed by model name.\n */\nexport function getBaseServices(): Record<string, BaseService<any>> {\n const models = getModels();\n const baseServices: Record<string, BaseService<any>> = {};\n models.forEach((model) => {\n baseServices[`${camelCase(model)}`] = new BaseService(model);\n });\n return baseServices;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{getExpressApp as f}from"../../../../server.js";export const getAppRoutes=()=>{const r=f(),h=[];return r._router.stack.forEach(e=>{if(e.route)Object.keys(e.route.methods).forEach(c=>{h.push({method:c.toUpperCase(),path:e.route.path})});else if(e.handle&&e.handle.stack){let c="";if(e.regexp){const a=e.regexp.toString();if(a.includes?.("/?(?=")){const p=a.match(/\/\^(\\\/[^?]+)/);p&&(c=p[1].replace(/\\\//g,"/"))}else{const p=a.match(/\/\^(\\\/[^\\]+)/);p&&(c=p[1].replace(/\\\//g,"/"))}}e.handle.stack.forEach(a=>{a.route&&Object.keys(a.route.methods).forEach(p=>{let s=a.route.path,t;if(s.includes?.("/?(?=")){const n=s.match(/\/\^?(\\\/[^?]+|\/[^?]+)/);if(n){const o=n[1].replace(/\\\//g,"/");t=c?c+o:o}else{const o=s.match(/\?\(\?=([^)]+)/);o?t=o[1]:t=s}}else t=c?c.replace(/\/$/,"")+(s.startsWith("/")?s:"/"+s):s;t=t.replace(/\\\//g,"/").replace(/\^/g,"").replace(/\$/g,""),t.includes?.("/?(?=")&&(t=t.replace(/\/\?\(\?=[^)]*\)/g,"")),h.push({method:p.toUpperCase(),path:t})})})}}),h};export function parseAndGetPrismaQueryOptions(r){}
@@ -0,0 +1 @@
1
+ "use strict";import r from"../../../../utils/helpers/deepmerge.helper.js";export function resolvePrismaQueryOptions(t,s){if(!t)return{};const n=t,o=n[s]||{};let e=n.queryOptions||{};n.global&&(e=r(e,n.global));const a=i(n,s);return a&&(e=r(e,a)),o&&(e=r(e,o)),e}function i(t,s){const o={findMany:["find"],findOne:["find"],create:["create","save"],createOne:["create","save","saveOne"],createMany:["create","save","saveMany"],update:["update","save"],updateOne:["update","save","saveOne"],updateMany:["update","save","saveMany"],delete:["delete"],deleteOne:["delete"],deleteMany:["delete"]}[s]||[];let e={};for(const a of o)t[a]&&(e=r(e,t[a]));return Object.keys(e).length>0?e:null}
@@ -0,0 +1 @@
1
+ "use strict";import d from"pluralize";import{kebabCase as c}from"../../../../exports/utils/index.js";import{importPrismaModelModules as R}from"../../../../utils/helpers/models.helpers.js";import a from"../../../auth/auth.service.js";import{BaseController as V}from"../../base.controller.js";import{addPrismaQueryOptionsToRequest as h,handleRequestBodyValidationAndTransformation as M,sendResponse as C}from"../../base.middlewares.js";import{processMiddleware as o}from"../../../../utils/helpers/routers.helpers.js";export function setupRouters(l,r,O){return l.map(async g=>{const i=c(g),w=await R(i,O),{middlewares:t,authConfigs:n,prismaQueryOptions:u,router:A,dtos:D,schemas:U}=w,e=d.plural(i),p=new V(g),s=A?.config||{},v=A||{},f=(y,b)=>v.stack?.some($=>($.path===`/api/${y}`||$.path===`api/${y}`||$.path===`api/${y}/`||$.path===`/api/${y}/`)&&$.method.toLowerCase()===b.toLowerCase()),m=y=>{const b=O?.validation;if(b?.resolver==="class-validator")return D?.[y];if(b?.resolver==="zod")return U?.[y]};A?.default&&!s?.disable&&r.use(`/${e}`,A.default),!isEndpointDisabled(s,"createOne")&&!f(`/${e}`,"post")&&r.post(`/${e}`,a.handleAuthenticationControl("Create",n?.authenticationControl),a.handleAccessControl("Create",c(d.singular(i)),n?.accessControl||{}),M(m("create")),h(u,"createOne"),...o(t?.beforeCreateOne),p.createOne,...o(t?.afterCreateOne),C),!isEndpointDisabled(s,"findMany")&&!f(`/${e}`,"get")&&r.get(`/${e}`,a.handleAuthenticationControl("View",n?.authenticationControl),a.handleAccessControl("View",c(d.singular(i)),n?.accessControl||{}),h(u,"findMany"),...o(t?.beforeFindMany),p.findMany,...o(t?.afterFindMany),C),!isEndpointDisabled(s,"createMany")&&!f(`/${e}/many`,"post")&&r.post(`/${e}/many`,a.handleAuthenticationControl("Create",n?.authenticationControl),a.handleAccessControl("Create",c(d.singular(i)),n?.accessControl||{}),M(m("createMany")),h(u,"createMany"),...o(t?.beforeCreateMany),p.createMany,...o(t?.afterCreateMany),C),!isEndpointDisabled(s,"updateMany")&&!f(`/${e}/many`,"patch")&&r.patch(`/${e}/many`,a.handleAuthenticationControl("Update",n?.authenticationControl),a.handleAccessControl("Update",c(d.singular(i)),n?.accessControl||{}),M(m("updateMany")),h(u,"updateMany"),...o(t?.beforeUpdateMany),p.updateMany,...o(t?.afterUpdateMany),C),!isEndpointDisabled(s,"deleteMany")&&!f(`/${e}/many`,"delete")&&r.delete(`/${e}/many`,a.handleAuthenticationControl("Delete",n?.authenticationControl),a.handleAccessControl("Delete",c(d.singular(i)),n?.accessControl||{}),M(m("deleteMany")),h(u,"deleteMany"),...o(t?.beforeDeleteMany),p.deleteMany,...o(t?.afterDeleteMany),C),!isEndpointDisabled(s,"findOne")&&!f(`/${e}/:id`,"get")&&r.get(`/${e}/:id`,a.handleAuthenticationControl("View",n?.authenticationControl),a.handleAccessControl("View",c(d.singular(i)),n?.accessControl||{}),M(m("findOne")),h(u,"findOne"),...o(t?.beforeFindOne),p.findOne,...o(t?.afterFindOne),C),!isEndpointDisabled(s,"updateOne")&&!f(`/${e}/:id`,"patch")&&r.patch(`/${e}/:id`,a.handleAuthenticationControl("Update",n?.authenticationControl),a.handleAccessControl("Update",c(d.singular(i)),n?.accessControl||{}),M(m("update")),h(u,"updateOne"),...o(t?.beforeUpdateOne),p.updateOne,...o(t?.afterUpdateOne),C),!isEndpointDisabled(s,"deleteOne")&&!f(`/${e}/:id`,"delete")&&r.delete(`/${e}/:id`,a.handleAuthenticationControl("Delete",n?.authenticationControl),a.handleAccessControl("Delete",c(d.singular(i)),n?.accessControl||{}),M(m("delete")),h(u,"deleteOne"),...o(t?.beforeDeleteOne),p.deleteOne,...o(t?.afterDeleteOne),C)})}export function isEndpointDisabled(l,r){return l?.disable?l.disable===!0?!0:typeof l.disable=="object"?l.disable[r]===!0:!1:!1}export function isParentEndpointAllowed(l,r){if(!l?.parent)return!1;const O=l.parent.endpoints;return O==="*"?!0:Array.isArray(O)?O.includes(r):!0}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.router.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/base/utils/helpers/base.router.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport pluralize from \"pluralize\";\nimport { ArkosConfig, RouterConfig } from \"../../../../exports\";\nimport { kebabCase } from \"../../../../exports/utils\";\nimport { PrismaQueryOptions } from \"../../../../types\";\nimport { RouterEndpoint } from \"../../../../types/router-config\";\nimport { importPrismaModelModules } from \"../../../../utils/helpers/models.helpers\";\nimport authService from \"../../../auth/auth.service\";\nimport { BaseController } from \"../../base.controller\";\nimport {\n addPrismaQueryOptionsToRequest,\n handleRequestBodyValidationAndTransformation,\n sendResponse,\n} from \"../../base.middlewares\";\nimport { processMiddleware } from \"../../../../utils/helpers/routers.helpers\";\n\nexport function setupRouters(\n models: string[],\n router: Router,\n arkosConfigs: ArkosConfig\n) {\n return models.map(async (model) => {\n const modelNameInKebab = kebabCase(model);\n const modelModules = await importPrismaModelModules(\n modelNameInKebab,\n arkosConfigs\n );\n const {\n middlewares,\n authConfigs,\n prismaQueryOptions,\n router: customRouterModule,\n dtos,\n schemas,\n } = modelModules;\n\n const routeName = pluralize.plural(modelNameInKebab);\n const controller = new BaseController(model);\n\n const routerConfig: RouterConfig = customRouterModule?.config || {};\n\n // Check if custom implementation exists\n const customRouter = (customRouterModule as Router) || {};\n const hasCustomImplementation = (path: string, method: string) => {\n return customRouter.stack?.some(\n (layer) =>\n (layer.path === `/api/${path}` ||\n layer.path === `api/${path}` ||\n layer.path === `api/${path}/` ||\n layer.path === `/api/${path}/`) &&\n layer.method.toLowerCase() === method.toLowerCase()\n );\n };\n\n // Helper to get the correct schema or DTO based on Arkos Config\n const getValidationSchemaOrDto = (key: string) => {\n const validationConfigs = arkosConfigs?.validation;\n if (validationConfigs?.resolver === \"class-validator\") {\n return dtos?.[key];\n } else if (validationConfigs?.resolver === \"zod\") {\n return schemas?.[key];\n }\n return undefined;\n };\n\n // If the custom router has its own routes, add them\n if (customRouterModule?.default && !routerConfig?.disable)\n router.use(`/${routeName}`, customRouterModule.default);\n\n // POST /{routeName} - Create One\n if (\n !isEndpointDisabled(routerConfig, \"createOne\") &&\n !hasCustomImplementation(`/${routeName}`, \"post\")\n ) {\n router.post(\n `/${routeName}`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"create\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createOne\"\n ),\n ...processMiddleware(middlewares?.beforeCreateOne),\n controller.createOne,\n ...processMiddleware(middlewares?.afterCreateOne),\n sendResponse\n );\n }\n\n // GET /{routeName} - Find Many\n if (\n !isEndpointDisabled(routerConfig, \"findMany\") &&\n !hasCustomImplementation(`/${routeName}`, \"get\")\n ) {\n router.get(\n `/${routeName}`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findMany\"\n ),\n ...processMiddleware(middlewares?.beforeFindMany),\n controller.findMany,\n ...processMiddleware(middlewares?.afterFindMany),\n sendResponse\n );\n }\n\n // POST /{routeName}/many - Create Many\n if (\n !isEndpointDisabled(routerConfig, \"createMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"post\")\n ) {\n router.post(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"createMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"createMany\"\n ),\n ...processMiddleware(middlewares?.beforeCreateMany),\n controller.createMany,\n ...processMiddleware(middlewares?.afterCreateMany),\n sendResponse\n );\n }\n\n // PATCH /{routeName}/many - Update Many\n if (\n !isEndpointDisabled(routerConfig, \"updateMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"updateMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateMany\"\n ),\n ...processMiddleware(middlewares?.beforeUpdateMany),\n controller.updateMany,\n ...processMiddleware(middlewares?.afterUpdateMany),\n sendResponse\n );\n }\n\n // DELETE /{routeName}/many - Delete Many\n if (\n !isEndpointDisabled(routerConfig, \"deleteMany\") &&\n !hasCustomImplementation(`/${routeName}/many`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/many`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"deleteMany\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteMany\"\n ),\n ...processMiddleware(middlewares?.beforeDeleteMany),\n controller.deleteMany,\n ...processMiddleware(middlewares?.afterDeleteMany),\n sendResponse\n );\n }\n\n // GET /{routeName}/:id - Find One\n if (\n !isEndpointDisabled(routerConfig, \"findOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"get\")\n ) {\n router.get(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"findOne\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"findOne\"\n ),\n ...processMiddleware(middlewares?.beforeFindOne),\n controller.findOne,\n ...processMiddleware(middlewares?.afterFindOne),\n sendResponse\n );\n }\n\n // PATCH /{routeName}/:id - Update One\n if (\n !isEndpointDisabled(routerConfig, \"updateOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"patch\")\n ) {\n router.patch(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"update\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"updateOne\"\n ),\n ...processMiddleware(middlewares?.beforeUpdateOne),\n controller.updateOne,\n ...processMiddleware(middlewares?.afterUpdateOne),\n sendResponse\n );\n }\n\n // DELETE /{routeName}/:id - Delete One\n if (\n !isEndpointDisabled(routerConfig, \"deleteOne\") &&\n !hasCustomImplementation(`/${routeName}/:id`, \"delete\")\n ) {\n router.delete(\n `/${routeName}/:id`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs?.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n kebabCase(pluralize.singular(modelNameInKebab)),\n authConfigs?.accessControl || {}\n ),\n handleRequestBodyValidationAndTransformation(\n getValidationSchemaOrDto(\"delete\")\n ),\n addPrismaQueryOptionsToRequest<any>(\n prismaQueryOptions as PrismaQueryOptions<any>,\n \"deleteOne\"\n ),\n ...processMiddleware(middlewares?.beforeDeleteOne),\n controller.deleteOne,\n ...processMiddleware(middlewares?.afterDeleteOne),\n sendResponse\n );\n }\n });\n}\n\nexport function isEndpointDisabled(\n routerConfig: RouterConfig,\n endpoint: RouterEndpoint\n): boolean {\n if (!routerConfig?.disable) return false;\n\n if (routerConfig.disable === true) return true;\n\n if (typeof routerConfig.disable === \"object\")\n return routerConfig.disable[endpoint] === true;\n\n return false;\n}\n\nexport function isParentEndpointAllowed(\n routerConfig: any,\n endpoint: string\n): boolean {\n if (!routerConfig?.parent) return false;\n\n const parentEndpoints = routerConfig.parent.endpoints;\n if (parentEndpoints === \"*\") return true;\n if (Array.isArray(parentEndpoints)) return parentEndpoints.includes(endpoint);\n\n return true; // Default to allow if not specified\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{getPrismaModelRelations as A,getModelUniqueFields as R}from"../../../../utils/helpers/models.helpers.js";export function removeApiAction(e){if(!e||typeof e!="object")return e;const n={};for(const[c,a]of Object.entries(e))c!=="apiAction"&&(Array.isArray(a)?n[c]=a.map(t=>typeof t=="object"&&t!==null?removeApiAction(t):t):typeof a=="object"&&a!==null?n[c]=removeApiAction(a):n[c]=a);return n}export function isPrismaRelationFormat(e){return!e||typeof e!="object"?!1:["create","connect","update","delete","disconnect","deleteMany","connectOrCreate","upsert","set"].some(c=>c in e)}export function handleRelationFieldsInBody(e,n,c=[]){let a={...e};if(n?.list?.forEach(t=>{if(!e[t.name]||isPrismaRelationFormat(e[t.name])||!Array.isArray(e[t.name]))return;const s=[],p=[],i=[],f=[],u=[];e[t.name]?.forEach(r=>{if(c?.includes?.(r?.apiAction))return;const D=r?.apiAction;if(D==="delete")u.push(r.id);else if(D==="disconnect")f.push({id:r.id});else if(canBeUsedToConnect(t.type,r)){const{apiAction:l,...o}=r;p.push(o)}else if(r?.id){const{id:l,apiAction:o,...h}=r;let m=A(t.type),O=h;m&&(O=handleRelationFieldsInBody(h,m,c)),i.push({where:{id:l},data:O})}else{let l=A(t.type),o={...r};if(l&&(o=handleRelationFieldsInBody(o,l,c)),"apiAction"in o){const{apiAction:h,...m}=o;o=m}s.push(o)}}),a[t.name]={...s.length?{create:s}:{},...p.length?{connect:p}:{},...i.length?{update:i}:{},...f.length?{disconnect:f}:{},...u.length?{deleteMany:{id:{in:u}}}:{}}}),n?.singular?.forEach(t=>{if(!e[t.name]||c?.includes?.(e[t.name]?.apiAction)||isPrismaRelationFormat(e[t.name]))return;const s=e[t.name];let p=A(t.type);if(canBeUsedToConnect(t.type,s)){const{apiAction:i,...f}=s;a[t.name]={connect:f}}else if(s?.id){const{id:i,apiAction:f,...u}=s;let r=u;p&&(r=handleRelationFieldsInBody(u,p,c)),a[t.name]={update:{data:r}}}else{let i={...s};if("apiAction"in i){const{apiAction:f,...u}=i;i=u}p&&(i=handleRelationFieldsInBody(i,p,c)),a[t.name]={create:i}}}),"apiAction"in a){const{apiAction:t,...s}=a;a=s}return removeApiAction(a)}export function canBeUsedToConnect(e,n){if(!n||n.apiAction&&!["connect"].includes?.(n.apiAction))return!1;if(n.apiAction==="connect"||Object.keys(n)?.length===1&&n?.id)return!0;const c=R(e);if(Object.keys(n).length===1){const a=Object.keys(n)[0];return c?.some(t=>t.name===a)}return!1}
@@ -0,0 +1 @@
1
+ "use strict";import s from"nodemailer";import{convert as i}from"html-to-text";import{getArkosConfig as u}from"../../server.js";import c from"../error-handler/utils/app-error.js";export class EmailService{constructor(r){this.transporter=null,this.customConfig=null,r&&(this.customConfig=r)}getEmailConfig(){if(this.customConfig)return this.customConfig;const{email:r}=u();if(!r)throw new c("You are trying to use emailService without setting arkosConfig.email configurations",500,{docs:"Read more about emailService at https://www.arkosjs.com/docs/core-concepts/sending-emails"});return{host:r.host,port:r.port||465,secure:r.secure!==void 0?r.secure:!0,auth:{user:r.auth?.user,pass:r.auth?.pass},name:r.name}}getTransporter(r){if(r){const t=this.getEmailConfig();return s.createTransport({host:r.host||t.host,port:r.port||t.port,secure:r.secure!==void 0?r.secure:t.secure,auth:r.auth||t.auth})}if(!this.transporter){const t=this.getEmailConfig();this.transporter=s.createTransport({host:t.host,port:t.port,secure:t.secure,auth:t.auth})}return this.transporter}async send(r,t,o=!1){const a=this.getEmailConfig(),e=t?this.getTransporter(t):this.getTransporter(),n=r.from||t?.auth?.user||a.auth?.user;if((t||!o)&&!await this.verifyConnection(e))throw new Error("Failed to connect to email server");return{success:!0,messageId:(await e.sendMail({...r,from:n,text:r?.text||i(r.html)})).messageId}}async verifyConnection(r){try{return await(r||this.getTransporter()).verify(),!0}catch(t){return console.error("Email Server Connection Failed",t),!1}}updateConfig(r){this.customConfig=r,this.transporter=null}static create(r){return new EmailService(r)}}const h=new EmailService;export default h;
@@ -0,0 +1,4 @@
1
+ "use strict";import a from"./utils/app-error.js";import*as e from"./utils/error-handler.helpers.js";import{server as i}from"../../server.js";export default function d(o,s,n,c){if(console.error("[\x1B[31mError\x1B[0m]:",o),o.statusCode=o.statusCode||500,o.status=o.status||"error",process.env.NODE_ENV!=="production"){l(o,s,n);return}let t={...o,message:o.message};o.name==="JsonWebTokenError"&&(t=e.handleJWTError()),o.name==="TokenExpiredError"&&(t=e.handleJWTExpired()),o.name==="PrismaClientValidationError"&&(t=e.handlePrismaClientValidationError(o)),o.code==="P1000"&&(t=e.handleAuthenticationError(o)),o.code==="P1001"&&(t=e.handleServerNotReachableError(o)),o.code==="P1002"&&(t=e.handleConnectionTimeoutError(o)),o.code==="P1003"&&(t=e.handleDatabaseNotFoundError(o)),o.code==="P2000"&&(t=e.handleFieldValueTooLargeError(o)),o.code==="P2001"&&(t=e.handleRecordNotFoundError(o)),o.code==="P2002"&&(t=e.handleUniqueConstraintError(o)),o.code==="P2003"&&(t=e.handleForeignKeyConstraintError(o)),o.code==="P2004"&&(t=e.handleConstraintFailedError(o)),o.code==="P2025"&&(t=e.handleNonExistingRecord(o)),o.code==="P3000"&&(t=e.handleSchemaCreationFailedError(o)),o.code==="P3001"&&(t=e.handleMigrationAlreadyAppliedError(o)),o.code==="P3002"&&(t=e.handleMigrationScriptFailedError(o)),o.code==="P3003"&&(t=e.handleVersionMismatchError(o)),o.name==="NetworkError"&&(t=e.handleNetworkError(o)),t.isOperational||(t=new a("Something went wrong!",500)),r(t,s,n)}function l(o,s,n){s.originalUrl.startsWith("/api")?n.status(o.statusCode).json({...o,message:o.message.split(`
2
+ `)[o.message.split(`
3
+ `).length-1],stack:o.stack?.split(`
4
+ `)}):n.status(o.statusCode).json({title:"Something went wrong!",message:o.message})}function r(o,s,n){if(s.originalUrl.startsWith("/api")){o.isOperational?n.status(o.statusCode).json({status:o.status,message:o.message,meta:o.meta||{},code:o.code||"unknown"}):n.status(500).json({status:"error",message:"Something went wrong!"});return}if(o.isOperational){n.status(o.statusCode).json({title:"Something went wrong!",message:o.message});return}n.status(o.statusCode).json({title:"Something went wrong!",message:"Please try again later."})}process.on("SIGTERM",()=>{process.env.NODE_ENV!=="production"&&process.env.NODE_ENV!=="staging"?process.exit():(console.error("SIGTERM RECEIVED in Production. Shutting down gracefully!"),i.close(()=>{console.error("Process terminated!!!"),process.exit()}))});
@@ -0,0 +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 { server } from \"../../server\";\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} next - 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 // Default error status\n err.statusCode = err.statusCode || 500;\n err.status = err.status || \"error\";\n\n // If the environment is not production, send detailed error information\n if (process.env.NODE_ENV !== \"production\") {\n sendDevelopmentError(err, req, res);\n return;\n }\n\n // Prepare error object for response, copying the original error's properties\n let error = { ...err, message: err.message };\n\n // Handle specific error cases (JWT errors, Prisma validation errors, etc.)\n if (err.name === \"JsonWebTokenError\")\n error = errorControllerHelper.handleJWTError();\n if (err.name === \"TokenExpiredError\")\n error = errorControllerHelper.handleJWTExpired();\n\n // Handle specific Prisma client validation errors\n if (err.name === \"PrismaClientValidationError\")\n error = errorControllerHelper.handlePrismaClientValidationError(err);\n\n // Handle Prisma database-specific error codes (P1000 to P3005)\n if (err.code === \"P1000\")\n error = errorControllerHelper.handleAuthenticationError(err);\n if (err.code === \"P1001\")\n error = errorControllerHelper.handleServerNotReachableError(err);\n if (err.code === \"P1002\")\n error = errorControllerHelper.handleConnectionTimeoutError(err);\n if (err.code === \"P1003\")\n error = errorControllerHelper.handleDatabaseNotFoundError(err);\n if (err.code === \"P2000\")\n error = errorControllerHelper.handleFieldValueTooLargeError(err);\n if (err.code === \"P2001\")\n error = errorControllerHelper.handleRecordNotFoundError(err);\n if (err.code === \"P2002\")\n error = errorControllerHelper.handleUniqueConstraintError(err);\n if (err.code === \"P2003\")\n error = errorControllerHelper.handleForeignKeyConstraintError(err);\n if (err.code === \"P2004\")\n error = errorControllerHelper.handleConstraintFailedError(err);\n if (err.code === \"P2025\")\n error = errorControllerHelper.handleNonExistingRecord(err);\n if (err.code === \"P3000\")\n error = errorControllerHelper.handleSchemaCreationFailedError(err);\n if (err.code === \"P3001\")\n error = errorControllerHelper.handleMigrationAlreadyAppliedError(err);\n if (err.code === \"P3002\")\n error = errorControllerHelper.handleMigrationScriptFailedError(err);\n if (err.code === \"P3003\")\n error = errorControllerHelper.handleVersionMismatchError(err);\n\n if (err.name === \"NetworkError\")\n error = errorControllerHelper.handleNetworkError(err);\n if (!error.isOperational) error = new AppError(\"Something went wrong!\", 500);\n\n // Send the error response for production environment\n sendProductionError(error, 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} req - 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(\n err: AppError,\n req: Request,\n res: Response\n): void {\n if (req.originalUrl.startsWith(\"/api\"))\n res.status(err.statusCode).json({\n ...err,\n message: err.message.split(\"\\n\")[err.message.split(\"\\n\").length - 1],\n stack: err.stack?.split(\"\\n\"),\n });\n else\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\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} req - 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, req: Request, res: Response): void {\n if (req.originalUrl.startsWith(\"/api\")) {\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: \"Something went wrong!\",\n });\n\n return;\n }\n\n if (err.isOperational) {\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: err.message,\n });\n return;\n }\n\n res.status(err.statusCode).json({\n title: \"Something went wrong!\",\n message: \"Please try again later.\",\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.NODE_ENV !== \"production\" &&\n process.env.NODE_ENV !== \"staging\"\n ) {\n process.exit();\n } else {\n console.error(\"SIGTERM RECEIVED in Production. Shutting down gracefully!\");\n\n server.close(() => {\n console.error(\"Process terminated!!!\");\n process.exit();\n });\n }\n});\n"]}
@@ -0,0 +1 @@
1
+ "use strict";class e extends Error{constructor(t,r,s,i){super(t),this.message=t,this.statusCode=r,this.status=`${r}`.startsWith("4")?"fail":"error",this.isOperational=!0,this.code=i,this.meta=s,this.missing=!1,Error.captureStackTrace(this,this.constructor)}}export default e;
@@ -0,0 +1 @@
1
+ "use strict";const n=t=>async(a,r,c)=>{try{return await t(a,r,c)}catch(e){c(e)}};export default n;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catch-async.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/catch-async.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,GACd,CAAC,EAAuB,EAAE,EAAE,CAC5B,KAAK,EACH,GAAiB,EACjB,GAAkB,EAClB,IAAuB,EACR,EAAE;IACjB,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAS,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAIJ,eAAe,UAAU,CAAC","sourcesContent":["import {\n ArkosRequest,\n ArkosResponse,\n ArkosNextFunction,\n ArkosRequestHandler,\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) =>\n async (\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction\n ): Promise<void> => {\n try {\n return (await fn(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,3 @@
1
+ "use strict";import n from"./app-error.js";export function handleJWTError(){return new n("Invalid token. Please log in again!",401)}export function handleJWTExpired(){return new n("Your token has expired, Please log again!",401)}export function handlePrismaClientValidationError(r){const e=r?.message.split(`
2
+ `)[r?.message.split(`
3
+ `).length-1];return new n(e,400)}export function handleAuthenticationError(r){const e="Authentication failed against the database server. Please check your credentials.";return new n(e,401)}export function handleServerNotReachableError(r){const e="The database server is not reachable. Verify your connection string or ensure the server is online.";return new n(e,503)}export function handleConnectionTimeoutError(r){const e="Connection to the database timed out. Please check server performance or network connectivity.";return new n(e,504)}export function handleDatabaseNotFoundError(r){const e="The specified database does not exist on the server.";return new n(e,404)}export function handleEnvironmentVariableError(r){const t=`Missing or invalid environment variables: ${r?.missing||"unknown environment variables"}. Please check your configuration.`;return new n(t,500)}export function handleFieldValueTooLargeError(r){const e=`The value for the field "${r?.meta?.field_name}" is too large. Please provide a smaller value.`;return new n(e,400)}export function handleRecordNotFoundError(r){const e="No record found for the given query. Ensure the query parameters are correct.";return new n(e,404)}export function handleUniqueConstraintError(r){const t=`Duplicate value detected for the unique field(s): ${r?.meta?.target||"unknown field"}. Please use a different value.`;return new n(t,409)}export function handleForeignKeyConstraintError(r){const e="Foreign key constraint violation. Ensure that the referenced record exists.";return new n(e,400)}export function handleConstraintFailedError(r){const t=`A database constraint "${r?.meta?.constraint||"unknown constraint"}" failed. Please review your input data.`;return new n(t,400)}export function handleInvalidFieldValueError(r){const t=`Invalid value provided for the field "${r?.meta?.field_name||"unknown field"}". Please provide a valid value.`;return new n(t,400)}export function handleInvalidFieldProvidedError(r){const t=`The field "${r?.meta?.field_name||"unknown field"}" has been provided with an invalid value. Check the data and try again.`;return new n(t,400)}export function handleDataValidationError(r){const e="Data validation error occurred. Please ensure all fields meet the required criteria.";return new n(e,400)}export function handleQueryParsingError(r){const t=`Failed to parse the query: "${r?.meta?.query||"unknown query"}". Check the syntax and structure.`;return new n(t,400)}export function handleInvalidQueryFormatError(r){const t=`The query format is invalid: "${r?.meta?.query||"unknown query"}". Ensure the query adheres to the expected format.`;return new n(t,400)}export function handleRawQueryExecutionError(r){const e="An error occurred during the execution of a raw query. Verify the query and try again.";return new n(e,500)}export function handleNullConstraintViolationError(r){const t=`The field "${r?.meta?.field_name||"unknown field"}" cannot be null. Please provide a value.`;return new n(t,400)}export function handleSchemaCreationFailedError(r){const e="Failed to create the database schema. Verify the schema definition and try again.";return new n(e,500)}export function handleMigrationAlreadyAppliedError(r){const t=`The migration "${r?.meta?.migration||"unknown migration"}" has already been applied to the database.`;return new n(t,409)}export function handleMigrationScriptFailedError(r){const t=`The migration script "${r?.meta?.migration||"unknown migration"}" failed. Review the script and resolve any issues.`;return new n(t,500)}export function handleVersionMismatchError(r){const e="Version mismatch: The database schema and migration versions are inconsistent. Please check and resolve this issue.";return new n(e,400)}export function handleMigrationFileReadError(r){const t=`Failed to read the migration file "${r?.meta?.migration_file||"unknown file"}". Ensure the file exists and is accessible.`;return new n(t,500)}export function handleSchemaDriftError(r){const e="Schema drift detected: The database schema differs from the expected state. Run migrations or sync schema to resolve.";return new n(e,400)}export function handleSchemaSyntaxError(r){const e="Syntax error in the schema file. Please check for typos or invalid syntax in your schema definition.";return new n(e,500)}export function handleClientTypeError(r){const e="Type error, Ensure proper usage of methods and correct data types.";return new n(e,400)}export function handleDynamicQueryError(r){const e="Error constructing or executing a dynamic query. Verify query structure and parameters.";return new n(e,400)}export function handleRelationLoadingError(r){const t=`Error loading relation "${r?.meta?.relation||"unknown relation"}". Ensure it is correctly defined and included in the query.`;return new n(t,400)}export function handleBinaryError(r){const t=`Error with Prisma binary "${r?.meta?.binary||"unknown binary"}". Ensure the binary is properly installed and compatible.`;return new n(t,500)}export function handleNetworkError(r){const e="Network error: Unable to connect to the database or internet. Please check your network connection.";return new n(e,500)}export function handleUnhandledPromiseError(r){const e="Unhandled promise rejection detected. Please check asynchronous code for proper error handling.";return new n(e,500)}export function handleDataTypeError(r){const e=r?.meta?.field||"unknown field",t=r?.meta?.expected_type||"unknown type",a=`Invalid data type for field "${e}". Expected type: ${t}.`;return new n(a,400)}export function handleEmptyResultError(r){const e="Empty result: No data was found for the given query. Ensure the query criteria are correct.";return new n(e,404)}export function handleNonExistingRecord(r){const e=r?.meta?.cause||"Operation could not be completed as the required record was not found";return new n(e,404,r.meta||{},"PrismaRecordNotFound")}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.helpers.js","sourceRoot":"","sources":["../../../../../src/modules/error-handler/utils/error-handler.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AASnC,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,QAAQ,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,QAAQ,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,GAAa;IAC7D,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAa;IACrD,MAAM,OAAO,GACX,mFAAmF,CAAC;IACtF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAa;IACzD,MAAM,OAAO,GACX,qGAAqG,CAAC;IACxG,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAa;IACxD,MAAM,OAAO,GACX,gGAAgG,CAAC;IACnG,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAa;IACvD,MAAM,OAAO,GAAG,sDAAsD,CAAC;IACvE,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAAa;IAC1D,MAAM,WAAW,GAAG,GAAG,EAAE,OAAO,IAAI,+BAA+B,CAAC;IACpE,MAAM,OAAO,GAAG,6CAA6C,WAAW,oCAAoC,CAAC;IAC7G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAa;IACzD,MAAM,OAAO,GAAG,4BAA4B,GAAG,EAAE,IAAI,EAAE,UAAU,iDAAiD,CAAC;IACnH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAa;IACrD,MAAM,OAAO,GACX,+EAA+E,CAAC;IAClF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAa;IACvD,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,eAAe,CAAC;IACnD,MAAM,OAAO,GAAG,qDAAqD,KAAK,iCAAiC,CAAC;IAC5G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,GAAa;IAC3D,MAAM,OAAO,GACX,6EAA6E,CAAC;IAChF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAa;IACvD,MAAM,UAAU,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,oBAAoB,CAAC;IACjE,MAAM,OAAO,GAAG,0BAA0B,UAAU,0CAA0C,CAAC;IAC/F,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAa;IACxD,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,eAAe,CAAC;IAC3D,MAAM,OAAO,GAAG,yCAAyC,SAAS,kCAAkC,CAAC;IACrG,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,GAAa;IAC3D,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,eAAe,CAAC;IAC3D,MAAM,OAAO,GAAG,cAAc,SAAS,0EAA0E,CAAC;IAClH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAa;IACrD,MAAM,OAAO,GACX,sFAAsF,CAAC;IACzF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAa;IACnD,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,eAAe,CAAC;IAClD,MAAM,OAAO,GAAG,+BAA+B,KAAK,oCAAoC,CAAC;IACzF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAa;IACzD,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,eAAe,CAAC;IAClD,MAAM,OAAO,GAAG,iCAAiC,KAAK,qDAAqD,CAAC;IAC5G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAa;IACxD,MAAM,OAAO,GACX,wFAAwF,CAAC;IAC3F,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,GAAa;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,IAAI,eAAe,CAAC;IAC3D,MAAM,OAAO,GAAG,cAAc,SAAS,2CAA2C,CAAC;IACnF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,GAAa;IAC3D,MAAM,OAAO,GACX,mFAAmF,CAAC;IACtF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,GAAa;IAC9D,MAAM,aAAa,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,mBAAmB,CAAC;IAClE,MAAM,OAAO,GAAG,kBAAkB,aAAa,6CAA6C,CAAC;IAC7F,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,GAAa;IAC5D,MAAM,aAAa,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,mBAAmB,CAAC;IAClE,MAAM,OAAO,GAAG,yBAAyB,aAAa,qDAAqD,CAAC;IAC5G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAa;IACtD,MAAM,OAAO,GAAG,qHAAqH,CAAC;IACtI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,GAAa;IACxD,MAAM,aAAa,GAAG,GAAG,EAAE,IAAI,EAAE,cAAc,IAAI,cAAc,CAAC;IAClE,MAAM,OAAO,GAAG,sCAAsC,aAAa,8CAA8C,CAAC;IAClH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAa;IAClD,MAAM,OAAO,GAAG,uHAAuH,CAAC;IACxI,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAa;IACnD,MAAM,OAAO,GAAG,sGAAsG,CAAC;IACvH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAa;IACjD,MAAM,OAAO,GAAG,oEAAoE,CAAC;IACrF,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAa;IACnD,MAAM,OAAO,GAAG,yFAAyF,CAAC;IAC1G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,GAAa;IACtD,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,QAAQ,IAAI,kBAAkB,CAAC;IAC3D,MAAM,OAAO,GAAG,2BAA2B,QAAQ,8DAA8D,CAAC;IAClH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAa;IAC7C,MAAM,UAAU,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,gBAAgB,CAAC;IACzD,MAAM,OAAO,GAAG,6BAA6B,UAAU,4DAA4D,CAAC;IACpH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAa;IAC9C,MAAM,OAAO,GAAG,qGAAqG,CAAC;IACtH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,GAAa;IACvD,MAAM,OAAO,GAAG,iGAAiG,CAAC;IAClH,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,GAAa;IAC/C,MAAM,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,KAAK,IAAI,eAAe,CAAC;IAClD,MAAM,YAAY,GAAG,GAAG,EAAE,IAAI,EAAE,aAAa,IAAI,cAAc,CAAC;IAChE,MAAM,OAAO,GAAG,gCAAgC,KAAK,qBAAqB,YAAY,GAAG,CAAC;IAC1F,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAa;IAClD,MAAM,OAAO,GAAG,6FAA6F,CAAC;IAC9G,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAGvC;IACC,MAAM,OAAO,GACX,GAAG,EAAE,IAAI,EAAE,KAAK;QAChB,uEAAuE,CAAC;IAC1E,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,sBAAsB,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import AppError from \"./app-error\";\n\nexport interface PrismaError {\n code?: string; // Prisma-specific error code\n message: string; // Error message\n meta?: Record<string, any>; // Metadata provided by Prisma\n name?: string; // Error name\n}\n\nexport function handleJWTError() {\n return new AppError(\"Invalid token. Please log in again!\", 401);\n}\n\nexport function handleJWTExpired() {\n return new AppError(\"Your token has expired, Please log again!\", 401);\n}\n\nexport function handlePrismaClientValidationError(err: AppError) {\n const message = err?.message.split(\"\\n\")[err?.message.split(\"\\n\").length - 1];\n return new AppError(message, 400);\n}\n\nexport function handleAuthenticationError(err: AppError) {\n const message =\n \"Authentication failed against the database server. Please check your credentials.\";\n return new AppError(message, 401);\n}\n\nexport function handleServerNotReachableError(err: AppError) {\n const message =\n \"The database server is not reachable. Verify your connection string or ensure the server is online.\";\n return new AppError(message, 503);\n}\n\nexport function handleConnectionTimeoutError(err: AppError) {\n const message =\n \"Connection to the database timed out. Please check server performance or network connectivity.\";\n return new AppError(message, 504);\n}\n\nexport function handleDatabaseNotFoundError(err: AppError) {\n const message = \"The specified database does not exist on the server.\";\n return new AppError(message, 404);\n}\n\nexport function handleEnvironmentVariableError(err: AppError) {\n const missingVars = err?.missing || \"unknown environment variables\";\n const message = `Missing or invalid environment variables: ${missingVars}. Please check your configuration.`;\n return new AppError(message, 500);\n}\n\nexport function handleFieldValueTooLargeError(err: AppError) {\n const message = `The value for the field \"${err?.meta?.field_name}\" is too large. Please provide a smaller value.`;\n return new AppError(message, 400);\n}\n\nexport function handleRecordNotFoundError(err: AppError) {\n const message =\n \"No record found for the given query. Ensure the query parameters are correct.\";\n return new AppError(message, 404);\n}\n\nexport function handleUniqueConstraintError(err: AppError) {\n const field = err?.meta?.target || \"unknown field\";\n const message = `Duplicate value detected for the unique field(s): ${field}. Please use a different value.`;\n return new AppError(message, 409);\n}\n\nexport function handleForeignKeyConstraintError(err: AppError) {\n const message =\n \"Foreign key constraint violation. Ensure that the referenced record exists.\";\n return new AppError(message, 400);\n}\n\nexport function handleConstraintFailedError(err: AppError) {\n const constraint = err?.meta?.constraint || \"unknown constraint\";\n const message = `A database constraint \"${constraint}\" failed. Please review your input data.`;\n return new AppError(message, 400);\n}\n\nexport function handleInvalidFieldValueError(err: AppError) {\n const fieldName = err?.meta?.field_name || \"unknown field\";\n const message = `Invalid value provided for the field \"${fieldName}\". Please provide a valid value.`;\n return new AppError(message, 400);\n}\n\nexport function handleInvalidFieldProvidedError(err: AppError) {\n const fieldName = err?.meta?.field_name || \"unknown field\";\n const message = `The field \"${fieldName}\" has been provided with an invalid value. Check the data and try again.`;\n return new AppError(message, 400);\n}\n\nexport function handleDataValidationError(err: AppError) {\n const message =\n \"Data validation error occurred. Please ensure all fields meet the required criteria.\";\n return new AppError(message, 400);\n}\n\nexport function handleQueryParsingError(err: AppError) {\n const query = err?.meta?.query || \"unknown query\";\n const message = `Failed to parse the query: \"${query}\". Check the syntax and structure.`;\n return new AppError(message, 400);\n}\n\nexport function handleInvalidQueryFormatError(err: AppError) {\n const query = err?.meta?.query || \"unknown query\";\n const message = `The query format is invalid: \"${query}\". Ensure the query adheres to the expected format.`;\n return new AppError(message, 400);\n}\n\nexport function handleRawQueryExecutionError(err: AppError) {\n const message =\n \"An error occurred during the execution of a raw query. Verify the query and try again.\";\n return new AppError(message, 500);\n}\n\nexport function handleNullConstraintViolationError(err: AppError) {\n const fieldName = err?.meta?.field_name || \"unknown field\";\n const message = `The field \"${fieldName}\" cannot be null. Please provide a value.`;\n return new AppError(message, 400);\n}\n\nexport function handleSchemaCreationFailedError(err: AppError) {\n const message =\n \"Failed to create the database schema. Verify the schema definition and try again.\";\n return new AppError(message, 500);\n}\n\nexport function handleMigrationAlreadyAppliedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration \"${migrationName}\" has already been applied to the database.`;\n return new AppError(message, 409);\n}\n\nexport function handleMigrationScriptFailedError(err: AppError) {\n const migrationName = err?.meta?.migration || \"unknown migration\";\n const message = `The migration script \"${migrationName}\" failed. Review the script and resolve any issues.`;\n return new AppError(message, 500);\n}\n\nexport function handleVersionMismatchError(err: AppError) {\n const message = `Version mismatch: The database schema and migration versions are inconsistent. Please check and resolve this issue.`;\n return new AppError(message, 400);\n}\n\nexport function handleMigrationFileReadError(err: AppError) {\n const migrationFile = err?.meta?.migration_file || \"unknown file\";\n const message = `Failed to read the migration file \"${migrationFile}\". Ensure the file exists and is accessible.`;\n return new AppError(message, 500);\n}\n\nexport function handleSchemaDriftError(err: AppError) {\n const message = `Schema drift detected: The database schema differs from the expected state. Run migrations or sync schema to resolve.`;\n return new AppError(message, 400);\n}\n\nexport function handleSchemaSyntaxError(err: AppError) {\n const message = `Syntax error in the schema file. Please check for typos or invalid syntax in your schema definition.`;\n return new AppError(message, 500);\n}\n\nexport function handleClientTypeError(err: AppError) {\n const message = `Type error, Ensure proper usage of methods and correct data types.`;\n return new AppError(message, 400);\n}\n\nexport function handleDynamicQueryError(err: AppError) {\n const message = `Error constructing or executing a dynamic query. Verify query structure and parameters.`;\n return new AppError(message, 400);\n}\n\nexport function handleRelationLoadingError(err: AppError) {\n const relation = err?.meta?.relation || \"unknown relation\";\n const message = `Error loading relation \"${relation}\". Ensure it is correctly defined and included in the query.`;\n return new AppError(message, 400);\n}\n\nexport function handleBinaryError(err: AppError) {\n const binaryName = err?.meta?.binary || \"unknown binary\";\n const message = `Error with Prisma binary \"${binaryName}\". Ensure the binary is properly installed and compatible.`;\n return new AppError(message, 500);\n}\n\nexport function handleNetworkError(err: AppError) {\n const message = `Network error: Unable to connect to the database or internet. Please check your network connection.`;\n return new AppError(message, 500);\n}\n\nexport function handleUnhandledPromiseError(err: AppError) {\n const message = `Unhandled promise rejection detected. Please check asynchronous code for proper error handling.`;\n return new AppError(message, 500);\n}\n\nexport function handleDataTypeError(err: AppError) {\n const field = err?.meta?.field || \"unknown field\";\n const expectedType = err?.meta?.expected_type || \"unknown type\";\n const message = `Invalid data type for field \"${field}\". Expected type: ${expectedType}.`;\n return new AppError(message, 400);\n}\n\nexport function handleEmptyResultError(err: AppError) {\n const message = `Empty result: No data was found for the given query. Ensure the query criteria are correct.`;\n return new AppError(message, 404);\n}\n\nexport function handleNonExistingRecord(err: {\n meta?: Record<string, any>;\n [x: string]: any;\n}) {\n const message =\n err?.meta?.cause ||\n `Operation could not be completed as the required record was not found`;\n return new AppError(message, 404, err.meta || {}, \"PrismaRecordNotFound\");\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import g from"../error-handler/utils/app-error.js";import{getFileUploadServices as P}from"./file-upload.service.js";import k from"path";import E from"fs";import F from"../error-handler/utils/catch-async.js";import{getArkosConfig as C}from"../../server.js";import{processFile as $,processImage as A}from"./utils/helpers/file-upload.helpers.js";import{accessAsync as R,mkdirAsync as N,statAsync as j}from"../../utils/helpers/fs.helpers.js";import{getModelModules as D}from"../../utils/helpers/models.helpers.js";class I{constructor(){this.uploadFile=F(async(e,l,s)=>{this.middlewares=D("file-upload")?.middlewares||{};const{fileType:t}=e.params,{format:a,width:p,height:U,resizeTo:n}=e.query,u={format:a,width:p,height:U,resizeTo:n},{documentUploadService:i,fileUploadService:c,imageUploadService:f,videoUploadService:m}=P(),{fileUpload:b}=C(),v=b?.baseUploadDir||"/uploads",S=k.resolve(process.cwd(),v,t);try{await R(S)}catch{await N(S,{recursive:!0})}let w;switch(t){case"images":w=f;break;case"videos":w=m;break;case"documents":w=i;break;case"files":w=c;break;default:return s(new g("Invalid file type",400))}w.handleMultipleUpload()(e,l,async d=>{if(d)return s(d);let o;if(e.files&&Array.isArray(e.files)&&e.files.length>0)t==="images"?o=await Promise.all(e.files.map(y=>A(e,y.path,u))):o=await Promise.all(e.files.map(y=>$(e,y.path))),o=o.filter(y=>y!==null);else if(e.file)t==="images"?o=await A(e,e.file.path,u):o=await $(e,e.file.path);else return s(new g("No file uploaded",400));const r={success:!0,data:o,message:Array.isArray(o)?`${o.length} files uploaded successfully`:"File uploaded successfully"};if(this.middlewares?.afterUploadFile)return e.responseData=r,e.responseStatus=200,s();l.status(200).json(r)})}),this.deleteFile=F(async(e,l,s)=>{this.middlewares=D("file-upload")?.middlewares||{};const{fileType:t,fileName:a}=e.params,{documentUploadService:p,fileUploadService:U,imageUploadService:n,videoUploadService:u}=P();let i;switch(t){case"images":i=n;break;case"videos":i=u;break;case"documents":i=p;break;case"files":i=U;break;default:return s(new g("Invalid file type",400))}try{const{fileUpload:c}=C(),f=c?.baseRoute||"/api/uploads";if(new RegExp(`${f}/${t}/${a}`).test(e.originalUrl)){const v=`${e.protocol}://${e.get("host")}${e.originalUrl}`;await i.deleteFileByUrl(v)}else await i.deleteFileByName(a,t);if(this.middlewares.afterDeleteFile)return e.responseStatus=204,s();l.status(204).json()}catch(c){return c instanceof g?s(c):s(new g("File not found",404))}}),this.updateFile=F(async(e,l,s)=>{this.middlewares=D("file-upload")?.middlewares||{};const{fileType:t,fileName:a}=e.params,{format:p,width:U,height:n,resizeTo:u}=e.query,i={format:p,width:U,height:n,resizeTo:u},{documentUploadService:c,fileUploadService:f,imageUploadService:m,videoUploadService:b}=P(),{fileUpload:v}=C(),S=v?.baseUploadDir||"/uploads",w=k.resolve(process.cwd(),S,t);try{await R(w)}catch{await N(w,{recursive:!0})}let d;switch(t){case"images":d=m;break;case"videos":d=b;break;case"documents":d=c;break;case"files":d=f;break;default:return s(new g("Invalid file type",400))}d.handleMultipleUpload()(e,l,async o=>{if(o)return s(o);if(!e.file&&(!e.files||!Array.isArray(e.files)||e.files.length===0))return s(new g("No new file uploaded",400));if(a&&a.trim()!=="")try{const h=v?.baseRoute||"/api/uploads";if(new RegExp(`${h}/${t}/${a}`).test(e.originalUrl)){const T=`${e.protocol}://${e.get("host")}${e.originalUrl}`;await d.deleteFileByUrl(T)}else await d.deleteFileByName(a,t)}catch(h){console.warn(`Could not delete old file: ${a}`,h)}let r;e.files&&Array.isArray(e.files)&&e.files.length>0?(t==="images"?r=await Promise.all(e.files.map(h=>A(e,h.path,i))):r=await Promise.all(e.files.map(h=>$(e,h.path))),r=r.filter(h=>h!==null)):e.file&&(t==="images"?r=await A(e,e.file.path,i):r=await $(e,e.file.path));const y={success:!0,data:r,message:Array.isArray(r)?a&&a.trim()!==""?`File updated successfully. ${r.length} new files uploaded`:`${r.length} files uploaded successfully`:a&&a.trim()!==""?"File updated successfully":"File uploaded successfully"};if(this.middlewares.afterUpdateFile)return e.responseData=y,e.responseStatus=200,s();l.status(200).json(y)})}),this.streamFile=F(async(e,l,s)=>{const{fileName:t,fileType:a}=e.params,p=k.join(".","uploads",a,t);try{await R(p)}catch{throw new g("File not found",404)}const n=(await j(p)).size,u=e.headers.range;if(u){const[i,c]=u.replace(/bytes=/,"").split("-"),f=parseInt(i,10)||0,m=c?parseInt(c,10):n-1;if(f>=n||m>=n){l.status(416).json({error:"Range Not Satisfiable"});return}l.writeHead(206,{"Content-Range":`bytes ${f}-${m}/${n}`,"Accept-Ranges":"bytes","Content-Length":m-f+1,"Content-Type":"application/octet-stream","Content-Disposition":`inline; filename="${t}"`}),E.createReadStream(p,{start:f,end:m}).pipe(l)}else l.writeHead(200,{"Content-Length":n,"Content-Type":"application/octet-stream","Content-Disposition":`inline; filename="${t}"`}),E.createReadStream(p).pipe(l)})}}const z=new I;export default z;
@@ -0,0 +1 @@
1
+ "use strict";import{Router as c}from"express";import{importPrismaModelModules as f}from"../../utils/helpers/models.helpers.js";import l from"../auth/auth.service.js";import n from"./file-upload.controller.js";import u from"path";import m from"express";import h from"../../utils/helpers/deepmerge.helper.js";import{sendResponse as s}from"../base/base.middlewares.js";import{processMiddleware as a}from"../../utils/helpers/routers.helpers.js";import{adjustRequestUrl as C}from"./utils/helpers/file-upload.helpers.js";const i=c();export async function getFileUploadRouter(d){const{fileUpload:r}=d,p=await f("file-upload",d);let{middlewares:o={},authConfigs:t={}}={};p&&({middlewares:o={},authConfigs:t={}}=p);let e=r?.baseRoute||"/api/uploads/";return e.startsWith("/")||(e="/"+e),e.endsWith("/")||(e=e+"/"),i.get(`${e}*`,l.handleAuthenticationControl("View",t.authenticationControl),l.handleAccessControl("View","file-upload",t.accessControl),...a(o?.beforeFindFile),C,m.static(u.resolve(process.cwd(),r?.baseUploadDir||"uploads"),h({maxAge:"1y",etag:!0,lastModified:!0,dotfiles:"ignore",fallthrough:!0,index:!1,cacheControl:!0},r?.expressStaticOptions||{}))),i.post(`${e}:fileType`,l.handleAuthenticationControl("Create",t.authenticationControl),l.handleAccessControl("Create","file-upload",t.accessControl),...a(o?.beforeUploadFile),n.uploadFile,...a(o?.afterUploadFile),s),i.patch(`${e}:fileType/:fileName`,l.handleAuthenticationControl("Update",t.authenticationControl),l.handleAccessControl("Update","file-upload",t.accessControl),...a(o?.beforeUpdateFile),n.updateFile,...a(o?.afterUpdateFile),s),i.delete(`${e}:fileType/:fileName`,l.handleAuthenticationControl("Delete",t.authenticationControl),l.handleAccessControl("Delete","file-upload",t.accessControl),...a(o?.beforeDeleteFile),n.deleteFile,...a(o?.afterDeleteFile),s),i}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { importPrismaModelModules } from \"../../utils/helpers/models.helpers\";\nimport authService from \"../auth/auth.service\";\nimport fileUploadController from \"./file-upload.controller\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport path from \"path\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthConfigs } from \"../../types/auth\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\n\nconst router: Router = Router();\n\nexport async function getFileUploadRouter(arkosConfig: ArkosConfig) {\n const { fileUpload } = arkosConfig;\n\n const modelModules = await importPrismaModelModules(\n \"file-upload\",\n arkosConfig\n );\n let { middlewares = {} as any, authConfigs = {} as AuthConfigs } = {};\n\n if (modelModules) {\n ({ middlewares = {}, authConfigs = {} } = modelModules);\n }\n\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // Static file serving route\n router.get(\n `${basePathname}*`,\n authService.handleAuthenticationControl(\n \"View\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"View\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(middlewares?.beforeFindFile),\n adjustRequestUrl,\n express.static(\n path.resolve(process.cwd(), fileUpload?.baseUploadDir || \"uploads\"),\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: true,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStaticOptions || {}\n )\n )\n );\n\n // POST /{basePathname}:fileType - Upload File\n router.post(\n `${basePathname}:fileType`,\n authService.handleAuthenticationControl(\n \"Create\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Create\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(middlewares?.beforeUploadFile),\n fileUploadController.uploadFile,\n ...processMiddleware(middlewares?.afterUploadFile),\n sendResponse\n );\n\n // PATCH /{basePathname}:fileType/:fileName - Update File\n router.patch(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Update\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Update\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(middlewares?.beforeUpdateFile),\n fileUploadController.updateFile,\n ...processMiddleware(middlewares?.afterUpdateFile),\n sendResponse\n );\n\n // DELETE /{basePathname}:fileType/:fileName - Delete File\n router.delete(\n `${basePathname}:fileType/:fileName`,\n authService.handleAuthenticationControl(\n \"Delete\",\n authConfigs.authenticationControl\n ),\n authService.handleAccessControl(\n \"Delete\",\n \"file-upload\",\n authConfigs.accessControl\n ),\n ...processMiddleware(middlewares?.beforeDeleteFile),\n fileUploadController.deleteFile,\n ...processMiddleware(middlewares?.afterDeleteFile),\n sendResponse\n );\n\n return router;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import y from"multer";import m from"path";import c from"fs";import d from"../error-handler/utils/app-error.js";import{promisify as h}from"util";import{getArkosConfig as U}from"../../server.js";import D from"../../utils/helpers/deepmerge.helper.js";import{processFile as F,processImage as k}from"./utils/helpers/file-upload.helpers.js";import{removeBothSlashes as R}from"../../utils/helpers/text.helpers.js";export class FileUploadService{constructor(e,i=1024*1024*5,t=/.*/,o=30){this.fileFilter=(a,s,l)=>{const n=this.allowedFileTypes.test(m.extname(s.originalname).toLowerCase());this.allowedFileTypes.test(s.mimetype)&&n?l(null,!0):l(new d("Invalid file type",400))},e=e.startsWith("/")?e.substring(1):e,e=e.endsWith("/")?e.slice(0,-1):e,this.uploadDir=m.resolve(process.cwd(),`${e}/`),this.fileSizeLimit=i,this.allowedFileTypes=t,this.maxCount=o,c.existsSync(this.uploadDir)||c.mkdirSync(this.uploadDir,{recursive:!0}),this.storage=y.diskStorage({destination:(a,s,l)=>{l(null,this.uploadDir)},filename:(a,s,l)=>{const n=Date.now()+"-"+Math.round(Math.random()*1e9);l(null,`${n}${m.extname(s.originalname)}`)}})}getUpload(){return y({storage:this.storage,fileFilter:this.fileFilter,limits:{fileSize:this.fileSizeLimit}})}handleSingleUpload(e){return(i,t,o)=>{this.getUpload().single(this.getFieldName())(i,t,async s=>{if(s instanceof y.MulterError)return o(s);if(s)return o(s);if(e){const{fileUpload:l}=U(),n=m.resolve(process.cwd(),R(l?.baseUploadDir),R(e));try{await h(c.stat)(n)&&await h(c.unlink)(n)}catch(p){console.error(p)}}o()})}}handleMultipleUpload(){return(e,i,t)=>{this.getUpload().array(this.getFieldName(),this.maxCount)(e,i,a=>{if(a instanceof y.MulterError)return t(a);if(a)return t(a);t()})}}handleDeleteSingleFile(e){return async(i,t,o)=>{const a=m.join(e);try{await h(c.stat)(a)&&await h(c.unlink)(a)}catch(s){console.error(s)}o()}}async deleteFileByUrl(e){try{const{fileUpload:i}=U(),t=i?.baseRoute||"/api/uploads";let o;e.startsWith("http")?o=new URL(e).pathname:o=e;const a=o.indexOf(t);if(a===-1)throw new d("Invalid file URL: base route not found",400);const s=o.substring(a+t.length),l=s.startsWith("/")?s.substring(1):s,n=["images","videos","documents","files"];let p=null,u=null;for(const w of n){const f=l.indexOf(w+"/");if(f!==-1){p=w,u=l.substring(f+w.length+1);break}}if(!p||!u)throw new d("Unable to determine file type or file name from URL",400);const{documentUploadService:x,fileUploadService:b,imageUploadService:g,videoUploadService:S}=getFileUploadServices();let r;switch(p){case"images":r=m.join(g.uploadDir,u);break;case"videos":r=m.join(S.uploadDir,u);break;case"documents":r=m.join(x.uploadDir,u);break;case"files":r=m.join(b.uploadDir,u);break;default:throw new d(`Unsupported file type: ${p}`,400)}return await h(c.stat)(r),await h(c.unlink)(r),!0}catch(i){throw i instanceof d?i:i.code==="ENOENT"?new d("File not found",404):new d(`Failed to delete file: ${i.message}`,500)}}getFieldName(){let e="files";return(this.uploadDir.endsWith("images")||this.uploadDir.endsWith("images/"))&&(e="images"),(this.uploadDir.endsWith("videos")||this.uploadDir.endsWith("videos/"))&&(e="videos"),(this.uploadDir.endsWith("documents")||this.uploadDir.endsWith("documents/"))&&(e="documents"),(this.uploadDir.endsWith("files")||this.uploadDir.endsWith("files/"))&&(e="files"),e}async upload(e,i,t={}){const{fileUpload:o}=U(),a=o?.baseRoute||"/api/uploads";return new Promise((s,l)=>{((Array.isArray(e.query.multiple)?e.query.multiple[0]=="true":e.query.multiple=="true")?this.getUpload().array(this.getFieldName(),this.maxCount):this.getUpload().single(this.getFieldName()))(e,i,async u=>{if(u)return l(u);try{const b=`${e.get("host")?.includes?.("localhost")?"http":"https"}://${e.get("host")}`,g=this.uploadDir.split("/"),S=(this.uploadDir.endsWith("/")?g[g.length-2]:g[g.length-1])||"files";let r;if(e.files&&Array.isArray(e.files)&&e.files.length>0)this.uploadDir?.includes?.("/images")?r=await Promise.all(e.files.map(f=>k(e,f.path,t))):r=await Promise.all(e.files.map(f=>F(e,f.path))),r=r.filter(f=>f!==null);else if(e.file)this.uploadDir?.includes?.("/images")?r=await k(e,e.file.path,t):r=await F(e,e.file.path);else return l(new d("No file uploaded",400));s(r)}catch(x){l(x)}})})}async deleteFileByName(e,i){try{if(!i)throw new d("File type parameter is required",400);const t=["images","videos","documents","files"];if(!t.includes(i))throw new d(`Invalid file type: ${i}. Must be one of: ${t.join(", ")}`,400);const{documentUploadService:o,fileUploadService:a,imageUploadService:s,videoUploadService:l}=getFileUploadServices();let n;switch(i){case"images":n=s;break;case"videos":n=l;break;case"documents":n=o;break;case"files":n=a;break;default:throw new d(`Unsupported file type: ${i}`,400)}const p=m.join(n.uploadDir,e);return await h(c.stat)(p),await h(c.unlink)(p),!0}catch(t){throw t instanceof d?t:t.code==="ENOENT"?new d("File not found",404):new d(`Failed to delete file: ${t.message}`,500)}}}export const getFileUploadServices=()=>{const{fileUpload:v}=U(),e=v?.baseUploadDir||"/uploads",i={images:{maxCount:30,maxSize:1024*1024*15,supportedFilesRegex:/jpeg|jpg|png|gif|webp|svg|bmp|tiff|heif|heic|ico|jfif|raw|cr2|nef|orf|sr2|arw|dng|pef|raf|rw2|psd|ai|eps|xcf|jxr|wdp|hdp|jp2|j2k|jpf|jpx|jpm|mj2|avif/},videos:{maxCount:10,maxSize:1024*1024*5096,supportedFilesRegex:/mp4|avi|mov|mkv|flv|wmv|webm|mpg|mpeg|3gp|m4v|ts|rm|rmvb|vob|ogv|dv|qt|asf|m2ts|mts|divx|f4v|swf|mxf|roq|nsv|mvb|svi|mpe|m2v|mp2|mpv|h264|h265|hevc/},documents:{maxCount:30,maxSize:1024*1024*50,supportedFilesRegex:/pdf|doc|docx|xls|xlsx|ppt|pptx|odt|ods|odg|odp|txt|rtf|csv|epub|md|tex|pages|numbers|key|xml|json|yaml|yml|ini|cfg|conf|log|html|htm|xhtml|djvu|mobi|azw|azw3|fb2|lit|ps|wpd|wps|dot|dotx|xlt|xltx|pot|potx|oft|one|onetoc2|opf|oxps|hwp/},files:{maxCount:10,maxSize:1024*1024*5096,supportedFilesRegex:/.*/}},t=v?.restrictions?D(i,v.restrictions):i,o=new FileUploadService(`${e}/images`,t.images.maxSize,t.images.supportedFilesRegex,t.images.maxCount),a=new FileUploadService(`${e}/videos`,t.videos.maxSize,t.videos.supportedFilesRegex,t.videos.maxCount),s=new FileUploadService(`${e}/documents`,t.documents.maxSize,t.documents.supportedFilesRegex,t.documents.maxCount),l=new FileUploadService(`${e}/files`,t.files.maxSize,t.files.supportedFilesRegex,t.files.maxCount);return{imageUploadService:o,videoUploadService:a,documentUploadService:s,fileUploadService:l}};
@@ -0,0 +1 @@
1
+ "use strict";import m from"fs";import n from"path";import y from"sharp";import{promisify as u}from"util";import{getArkosConfig as h}from"../../../../server.js";import U from"mimetype";import{fullCleanCwd as x}from"../../../../utils/helpers/fs.helpers.js";export function adjustRequestUrl(t,a,o){const{fileUpload:e}=h();t.url=t.url.replace(e?.baseRoute+"/"||"/api/uploads/","/"),t.url=t.url.replace(e?.baseRoute||"/api/uploads/","/"),o()}export function extractRequestInfo(t){const{fileUpload:a}=h(),e=`${t.headers["x-forwarded-proto"]==="https"?"https":"http"}://${t.get?.("host")}`,i=a?.baseRoute||"/api/uploads";return{baseURL:e,baseRoute:i}}const d=(t,a)=>{const{fileUpload:o}=h(),e=o?.baseUploadDir||"/uploads";return e.startsWith("..")?n.join(a,n.basename(t)):x(t.replace(`${e}/`,"").replace(`/${e}/`,"").replace(`/${e}`,"").replace(`${e}`,""))};export const processFile=async(t,a)=>{const{baseURL:o,baseRoute:e}=extractRequestInfo(t),i=d(a,t.params.fileType);return`${o}${e==="/"?"":e}/${i}`},processImage=async(t,a,o)=>{const{baseURL:e,baseRoute:i}=extractRequestInfo(t),p=n.extname(a).toLowerCase(),w=p.replace(".",""),l=o.format||w;if(!U.lookup(p)?.includes?.("image")){const r=d(a,t.params.fileType);return`${e}${i}/${r}`}const g=`${n.basename(a,p)}_${Date.now()}${p}`,c=n.join(n.dirname(a),g);try{let r=y(a);const s=await r.metadata();if(o.resizeTo&&s.width&&s.height){const f=o.resizeTo/Math.min(s.width,s.height),b=Math.round(s.width*f),R=Math.round(s.height*f);r=r.resize(b,R)}else(o.width||o.height)&&(r=r.resize(o.width||null,o.height||null,{fit:"inside"}));l==="webp"?r=r.toFormat("webp"):(l==="jpeg"||l==="jpg")&&(r=r.toFormat("jpeg")),await r.toFile(c),await u(m.rename)(c,a);const $=d(a,t?.params.fileType);return`${e}${i}/${$}`}catch(r){try{await u(m.stat)(c),await u(m.unlink)(c)}catch{}throw r}};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/file-upload/utils/helpers/file-upload.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport sharp from \"sharp\";\nimport { promisify } from \"util\";\nimport { getArkosConfig } from \"../../../../server\";\nimport mimetype from \"mimetype\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n} from \"../../../../types\";\nimport { fullCleanCwd } from \"../../../../utils/helpers/fs.helpers\";\n\nexport function adjustRequestUrl(\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n) {\n const { fileUpload } = getArkosConfig();\n req.url = req.url.replace(\n fileUpload?.baseRoute + \"/\" || \"/api/uploads/\",\n \"/\"\n );\n req.url = req.url.replace(fileUpload?.baseRoute || \"/api/uploads/\", \"/\");\n next();\n}\n\nexport function extractRequestInfo(req: ArkosRequest) {\n const { fileUpload } = getArkosConfig();\n\n // Determine the base URL for file access\n const protocol =\n req.headers[\"x-forwarded-proto\"] === \"https\" ? \"https\" : \"http\";\n const baseURL = `${protocol}://${req.get?.(\"host\")}`;\n const baseRoute = fileUpload?.baseRoute || \"/api/uploads\";\n return { baseURL, baseRoute };\n}\n\n/**\n * Generates the correct relative path regardless of upload directory location\n */\nconst generateRelativePath = (filePath: string, fileType: string) => {\n const { fileUpload } = getArkosConfig();\n\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n if (baseUploadDir.startsWith(\"..\")) {\n // For paths outside project directory\n return path.join(fileType, path.basename(filePath));\n } else {\n // For paths within project\n return fullCleanCwd(\n filePath\n .replace(`${baseUploadDir}/`, \"\")\n .replace(`/${baseUploadDir}/`, \"\")\n .replace(`/${baseUploadDir}`, \"\")\n .replace(`${baseUploadDir}`, \"\")\n );\n }\n};\n\n/**\n * Handles basic file processing for non-image files\n */\nexport const processFile = async (\n req: ArkosRequest,\n filePath: string\n): Promise<string> => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n\n const relativePath = generateRelativePath(filePath, req.params!.fileType);\n return `${baseURL}${baseRoute === \"/\" ? \"\" : baseRoute}/${relativePath}`;\n};\n\n/**\n * Processes image files using Sharp for resizing and format conversion\n */\nexport const processImage = async (\n req: ArkosRequest,\n filePath: string,\n options: Record<string, any>\n): Promise<string | null> => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n\n const ext = path.extname(filePath).toLowerCase();\n const originalFormat = ext.replace(\".\", \"\");\n const outputFormat = options.format || originalFormat;\n\n if (!mimetype.lookup(ext)?.includes?.(\"image\")) {\n const relativePath = generateRelativePath(filePath, req.params!.fileType);\n return `${baseURL}${baseRoute}/${relativePath}`;\n }\n\n // Create a temp filename with original name + random string\n const tempName = `${path.basename(filePath, ext)}_${Date.now()}${ext}`;\n const tempPath = path.join(path.dirname(filePath), tempName);\n\n try {\n let transformer = sharp(filePath);\n const metadata = await transformer.metadata();\n\n // Apply resize transformations if requested\n if (options.resizeTo && metadata.width && metadata.height) {\n const targetSize = options.resizeTo;\n const scaleFactor =\n targetSize / Math.min(metadata.width, metadata.height);\n const newWidth = Math.round(metadata.width * scaleFactor);\n const newHeight = Math.round(metadata.height * scaleFactor);\n transformer = transformer.resize(newWidth, newHeight);\n } else if (options.width || options.height) {\n transformer = transformer.resize(\n options.width || null,\n options.height || null,\n {\n fit: \"inside\",\n }\n );\n }\n\n // Apply format transformations if requested\n if (outputFormat === \"webp\") {\n transformer = transformer.toFormat(\"webp\");\n } else if (outputFormat === \"jpeg\" || outputFormat === \"jpg\") {\n transformer = transformer.toFormat(\"jpeg\");\n }\n\n // Save to temp file first\n await transformer.toFile(tempPath);\n\n // Rename temp file to original filename\n await promisify(fs.rename)(tempPath, filePath);\n\n // Return the public URL for the file\n const relativePath = generateRelativePath(filePath, req?.params!.fileType);\n\n return `${baseURL}${baseRoute}/${relativePath}`;\n } catch (error) {\n // Clean up temp file if it exists\n try {\n await promisify(fs.stat)(tempPath);\n await promisify(fs.unlink)(tempPath);\n } catch (err) {\n // If temp file doesn't exist, no need to clean up\n }\n throw error;\n }\n};\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{Router as m}from"express";import d from"swagger-jsdoc";import u from"../../utils/helpers/deepmerge.helper.js";import{generatePathsForModels as l,getOpenAPIJsonSchemasByConfigMode as g}from"./utils/helpers/swagger.router.helpers.js";import{capitalize as f}from"../../utils/helpers/text.helpers.js";import h from"./utils/helpers/missing-json-schemas-generator.js";const s=m();export async function getSwaggerRouter(e){let t=await g(e);const r=await l(e);t={...t,...await h.generateMissingJsonSchemas(r,t,e)};const a={endpoint:"/docs",mode:"prisma",strict:!1,options:{definition:{openapi:"3.0.0",info:{title:"Powered By Arkos.js",version:"1.0.0",description:"This API was automatically generated by Arkos.js, read more about at www.arkosjs.com"},servers:[{url:`http://${e.host}:${e.port}`,description:`Local ${f(process.env.NODE_ENV||"development")} Server`}],paths:r,components:{schemas:t||{},securitySchemes:{BearerAuth:{type:"http",scheme:"bearer",bearerFormat:"JWT"}}},security:[]},apis:["./src/routers/*.router.{ts,js}","./src/modules/**/*.router.{ts,js}"],deepLinking:!0,tryItOutEnabled:!0,persistAuthorization:!1},scalarApiReferenceConfiguration:{theme:"deepSpace",darkMode:!0,layout:"modern",showSidebar:!0,hideDownloadButton:!1,metaData:{title:"Arkos.js API Documentation",description:"API documentation generated by Arkos.js"},pageTitle:"Arkos.js API Documentation"}},o=u(a||{},e.swagger||{}),{definition:n,...i}=o?.options,c=d({definition:n,...i}),p=await new Function("path","return import(path)")("@scalar/express-api-reference");return s.use(o.endpoint,p.apiReference({content:c,...o?.scalarApiReferenceConfiguration})),s}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.router.js","sourceRoot":"","sources":["../../../../src/modules/swagger/swagger.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\n// import * as scalar from \"@scalar/express-api-reference\";\nimport swaggerJsdoc from \"swagger-jsdoc\";\nimport { ArkosConfig } from \"../../types/arkos-config\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n generatePathsForModels,\n getOpenAPIJsonSchemasByConfigMode,\n} from \"./utils/helpers/swagger.router.helpers\";\nimport { capitalize } from \"../../utils/helpers/text.helpers\";\nimport missingJsonSchemaGenerator from \"./utils/helpers/missing-json-schemas-generator\";\n\nconst swaggerRouter = Router();\n\nexport async function getSwaggerRouter(\n arkosConfig: ArkosConfig\n): Promise<Router> {\n let defaultJsonSchemas = await getOpenAPIJsonSchemasByConfigMode(arkosConfig);\n const defaultModelsPaths = await generatePathsForModels(arkosConfig);\n defaultJsonSchemas = {\n ...defaultJsonSchemas,\n ...(await missingJsonSchemaGenerator.generateMissingJsonSchemas(\n defaultModelsPaths,\n defaultJsonSchemas,\n arkosConfig\n )),\n };\n\n const defaultSwaggerConfig: ArkosConfig[\"swagger\"] = {\n endpoint: \"/docs\",\n mode: \"prisma\",\n strict: false,\n options: {\n definition: {\n openapi: \"3.0.0\",\n info: {\n title: \"Powered By Arkos.js\",\n version: \"1.0.0\",\n description:\n \"This API was automatically generated by Arkos.js, read more about at www.arkosjs.com\",\n },\n servers: [\n {\n url: `http://${arkosConfig.host}:${arkosConfig.port}`,\n description: `Local ${capitalize(process.env.NODE_ENV || \"development\")} Server`,\n },\n ],\n paths: defaultModelsPaths,\n components: {\n schemas: defaultJsonSchemas || {},\n securitySchemes: {\n BearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n bearerFormat: \"JWT\",\n },\n },\n },\n security: [],\n },\n apis: [\n \"./src/routers/*.router.{ts,js}\",\n \"./src/modules/**/*.router.{ts,js}\",\n ],\n deepLinking: true,\n tryItOutEnabled: true,\n persistAuthorization: false,\n },\n scalarApiReferenceConfiguration: {\n theme: \"deepSpace\",\n darkMode: true,\n layout: \"modern\",\n showSidebar: true,\n hideDownloadButton: false,\n metaData: {\n title: \"Arkos.js API Documentation\",\n description: \"API documentation generated by Arkos.js\",\n },\n pageTitle: \"Arkos.js API Documentation\",\n },\n };\n\n // Merge default config with user config\n const swaggerConfigs = deepmerge(\n defaultSwaggerConfig || {},\n arkosConfig.swagger || {}\n ) as ArkosConfig[\"swagger\"];\n\n const { definition, ...options } = swaggerConfigs?.options!;\n\n // Generate OpenAPI specification using swagger-jsdoc\n const swaggerSpecification = swaggerJsdoc({\n definition: definition as swaggerJsdoc.SwaggerDefinition,\n ...options,\n });\n\n const importFn = new Function(\"path\", \"return import(path)\");\n const scalar = await importFn(\"@scalar/express-api-reference\");\n\n // Serve Scalar API documentation\n swaggerRouter.use(\n swaggerConfigs!.endpoint!,\n scalar.apiReference({\n content: swaggerSpecification,\n ...swaggerConfigs?.scalarApiReferenceConfiguration,\n })\n );\n\n return swaggerRouter;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{getSchemaRef as t}from"./swagger.router.helpers.js";import{localValidatorFileExists as m}from"../../../../utils/helpers/models.helpers.js";export async function getAuthenticationJsonSchemaPaths(i){const e={},s=async d=>{const r=i.swagger?.mode,l=i.swagger?.strict;return r&&(l||await m(d,"user",i))?r:"prisma"};if(!i.swagger?.mode)return e;const n=await s("login");e["/api/auth/login"]={post:{tags:["Authentication"],summary:"Login to the system",description:"Authenticates a user and returns an access token",operationId:"login",requestBody:{description:"User credentials",required:!0,content:{"application/json":{schema:{$ref:t("Login",n)}}}},responses:{200:{description:"Login successful",content:{"application/json":{schema:{type:"object",properties:{accessToken:{type:"string",description:"JWT access token"}}}}}},400:{description:"Invalid input data"},401:{description:"Invalid credentials"}}}},e["/api/auth/logout"]={delete:{tags:["Authentication"],summary:"Logout from the system",description:"Invalidates the current user's JWT token",operationId:"logout",security:[{BearerAuth:[]}],responses:{204:{description:"Logout successful"},401:{description:"Authentication required"}}}};const o=await s("signup"),a=await s("user");e["/api/auth/signup"]={post:{tags:["Authentication"],summary:"Register a new user",description:"Creates a new user account",operationId:"signup",requestBody:{description:"User registration data",required:!0,content:{"application/json":{schema:{$ref:t("Signup",o)}}}},responses:{201:{description:"User created successfully",content:{"application/json":{schema:{$ref:t("User",a)}}}},400:{description:"Invalid input data"},409:{description:"User already exists"}}}};const c=await s("updatePassword");e["/api/auth/update-password"]={post:{tags:["Authentication"],summary:"Update user password",description:"Changes the password for the authenticated user",operationId:"updatePassword",security:[{BearerAuth:[]}],requestBody:{description:"Current and new password",required:!0,content:{"application/json":{schema:{$ref:t("UpdatePassword",c)}}}},responses:{200:{description:"Password updated successfully",content:{"application/json":{schema:{type:"object",properties:{status:{type:"string",example:"success"},message:{type:"string",example:"Password updated successfully!"}}}}}},400:{description:"Invalid input data or current password incorrect"},401:{description:"Authentication required"}}}};const u=await s("getMe");e["/api/users/me"]={get:{tags:["Authentication"],summary:"Get current user information",description:"Retrieves information about the currently authenticated user",operationId:"getMe",security:[{BearerAuth:[]}],responses:{200:{description:"User information retrieved successfully",content:{"application/json":{schema:{$ref:t("GetMe",u)}}}},401:{description:"Authentication required"}}}};const p=await s("updateMe");return e["/api/users/me"]||(e["/api/users/me"]={}),e["/api/users/me"].patch={tags:["Authentication"],summary:"Update current user information",description:"Updates information for the currently authenticated user",operationId:"updateMe",security:[{BearerAuth:[]}],requestBody:{description:"User data to update",required:!0,content:{"application/json":{schema:{$ref:t("UpdateMe",p)}}}},responses:{200:{description:"User updated successfully",content:{"application/json":{schema:{$ref:t("User",a)}}}},400:{description:"Invalid input data"},401:{description:"Authentication required"}}},e["/api/users/me"]||(e["/api/users/me"]={}),e["/api/users/me"].delete={tags:["Authentication"],summary:"Delete current user account",description:"Marks the current user's account as deleted",operationId:"deleteMe",security:[{BearerAuth:[]}],responses:{200:{description:"Account deleted successfully",content:{"application/json":{schema:{type:"object",properties:{message:{type:"string",example:"Account deleted successfully"}}}}}},401:{description:"Authentication required"}}},e}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-authentication-json-schema-paths.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/get-authentication-json-schema-paths.ts"],"names":[],"mappings":"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","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\nimport { getSchemaRef } from \"./swagger.router.helpers\";\nimport { ArkosConfig } from \"../../../../exports\";\nimport { localValidatorFileExists } from \"../../../../utils/helpers/models.helpers\";\n\nexport async function getAuthenticationJsonSchemaPaths(\n arkosConfig: ArkosConfig\n) {\n const paths: OpenAPIV3.PathsObject = {};\n\n // Helper function to determine the correct mode for schema ref\n const getSchemaMode = async (\n action: string\n ): Promise<\"prisma\" | \"zod\" | \"class-validator\"> => {\n const swaggerMode = arkosConfig.swagger?.mode;\n const isStrict = arkosConfig.swagger?.strict;\n\n if (!swaggerMode) return \"prisma\";\n\n if (isStrict) {\n return swaggerMode;\n }\n\n const actionKey = action as any;\n // For auth endpoints, we don't have a specific model, so we use \"user\" as the model name\n const localFileExists = await localValidatorFileExists(\n actionKey,\n \"user\",\n arkosConfig\n );\n\n if (!localFileExists) {\n return \"prisma\";\n }\n\n return swaggerMode;\n };\n\n if (!arkosConfig.swagger?.mode) return paths;\n\n // Add login endpoint\n const loginMode = await getSchemaMode(\"login\");\n paths[\"/api/auth/login\"] = {\n post: {\n tags: [\"Authentication\"],\n summary: \"Login to the system\",\n description: \"Authenticates a user and returns an access token\",\n operationId: \"login\",\n requestBody: {\n description: \"User credentials\",\n required: true,\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"Login\", loginMode),\n },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Login successful\",\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n accessToken: {\n type: \"string\",\n description: \"JWT access token\",\n },\n },\n },\n },\n },\n },\n \"400\": {\n description: \"Invalid input data\",\n },\n \"401\": {\n description: \"Invalid credentials\",\n },\n },\n },\n };\n\n // Add logout endpoint\n paths[\"/api/auth/logout\"] = {\n delete: {\n tags: [\"Authentication\"],\n summary: \"Logout from the system\",\n description: \"Invalidates the current user's JWT token\",\n operationId: \"logout\",\n security: [{ BearerAuth: [] }],\n responses: {\n \"204\": {\n description: \"Logout successful\",\n },\n \"401\": {\n description: \"Authentication required\",\n },\n },\n },\n };\n\n // Add signup endpoint\n const signupMode = await getSchemaMode(\"signup\");\n const userMode = await getSchemaMode(\"user\");\n paths[\"/api/auth/signup\"] = {\n post: {\n tags: [\"Authentication\"],\n summary: \"Register a new user\",\n description: \"Creates a new user account\",\n operationId: \"signup\",\n requestBody: {\n description: \"User registration data\",\n required: true,\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"Signup\", signupMode),\n },\n },\n },\n },\n responses: {\n \"201\": {\n description: \"User created successfully\",\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"User\", userMode),\n },\n },\n },\n },\n \"400\": {\n description: \"Invalid input data\",\n },\n \"409\": {\n description: \"User already exists\",\n },\n },\n },\n };\n\n // Add update password endpoint\n const updatePasswordMode = await getSchemaMode(\"updatePassword\");\n paths[\"/api/auth/update-password\"] = {\n post: {\n tags: [\"Authentication\"],\n summary: \"Update user password\",\n description: \"Changes the password for the authenticated user\",\n operationId: \"updatePassword\",\n security: [{ BearerAuth: [] }],\n requestBody: {\n description: \"Current and new password\",\n required: true,\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"UpdatePassword\", updatePasswordMode),\n },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"Password updated successfully\",\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n example: \"success\",\n },\n message: {\n type: \"string\",\n example: \"Password updated successfully!\",\n },\n },\n },\n },\n },\n },\n \"400\": {\n description: \"Invalid input data or current password incorrect\",\n },\n \"401\": {\n description: \"Authentication required\",\n },\n },\n },\n };\n\n // Add get current user endpoint\n const findMeMode = await getSchemaMode(\"getMe\");\n paths[\"/api/users/me\"] = {\n get: {\n tags: [\"Authentication\"],\n summary: \"Get current user information\",\n description:\n \"Retrieves information about the currently authenticated user\",\n operationId: \"getMe\",\n security: [{ BearerAuth: [] }],\n responses: {\n \"200\": {\n description: \"User information retrieved successfully\",\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"GetMe\", findMeMode),\n },\n },\n },\n },\n \"401\": {\n description: \"Authentication required\",\n },\n },\n },\n };\n\n // Add update current user endpoint\n const updateMeMode = await getSchemaMode(\"updateMe\");\n if (!paths[\"/api/users/me\"]) paths[\"/api/users/me\"] = {};\n paths[\"/api/users/me\"]!.patch = {\n tags: [\"Authentication\"],\n summary: \"Update current user information\",\n description: \"Updates information for the currently authenticated user\",\n operationId: \"updateMe\",\n security: [{ BearerAuth: [] }],\n requestBody: {\n description: \"User data to update\",\n required: true,\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"UpdateMe\", updateMeMode),\n },\n },\n },\n },\n responses: {\n \"200\": {\n description: \"User updated successfully\",\n content: {\n \"application/json\": {\n schema: {\n $ref: getSchemaRef(\"User\", userMode),\n },\n },\n },\n },\n \"400\": {\n description: \"Invalid input data\",\n },\n \"401\": {\n description: \"Authentication required\",\n },\n },\n };\n\n // Add delete current user endpoint\n if (!paths[\"/api/users/me\"]) paths[\"/api/users/me\"] = {};\n paths[\"/api/users/me\"]!.delete = {\n tags: [\"Authentication\"],\n summary: \"Delete current user account\",\n description: \"Marks the current user's account as deleted\",\n operationId: \"deleteMe\",\n security: [{ BearerAuth: [] }],\n responses: {\n \"200\": {\n description: \"Account deleted successfully\",\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n message: {\n type: \"string\",\n example: \"Account deleted successfully\",\n },\n },\n },\n },\n },\n },\n \"401\": {\n description: \"Authentication required\",\n },\n },\n };\n\n return paths;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";export function getSystemJsonSchemaPaths(){const e={};return e["/api/available-resources"]={get:{tags:["System"],summary:"Get available resources",description:"Returns a comprehensive list of all available API resource endpoints",operationId:"getAvailableResources",responses:{200:{description:"List of available resources retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{data:{type:"array",items:{type:"string"},description:"Array of available resource endpoints"}}}}}}}}},e["/api/available-routes"]={get:{tags:["System"],summary:"Get available routes",description:"Returns a comprehensive list of all registered API routes and their methods",operationId:"getAvailableRoutes",responses:{200:{description:"List of available routes retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{routes:{type:"array",items:{type:"string"},description:"Array of available API routes"}}}}}}}}},e}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-system-json-schema-paths.js","sourceRoot":"","sources":["../../../../../../src/modules/swagger/utils/helpers/get-system-json-schema-paths.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB;IACtC,MAAM,KAAK,GAA0B,EAAE,CAAC;IAExC,KAAK,CAAC,0BAA0B,CAAC,GAAG;QAClC,GAAG,EAAE;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,OAAO,EAAE,yBAAyB;YAClC,WAAW,EACT,sEAAsE;YACxE,WAAW,EAAE,uBAAuB;YACpC,SAAS,EAAE;gBACT,KAAK,EAAE;oBACL,WAAW,EAAE,oDAAoD;oBACjE,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,IAAI,EAAE;wCACJ,IAAI,EAAE,OAAO;wCACb,KAAK,EAAE;4CACL,IAAI,EAAE,QAAQ;yCACf;wCACD,WAAW,EAAE,uCAAuC;qCACrD;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,KAAK,CAAC,uBAAuB,CAAC,GAAG;QAC/B,GAAG,EAAE;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,OAAO,EAAE,sBAAsB;YAC/B,WAAW,EACT,6EAA6E;YAC/E,WAAW,EAAE,oBAAoB;YACjC,SAAS,EAAE;gBACT,KAAK,EAAE;oBACL,WAAW,EAAE,iDAAiD;oBAC9D,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE;oCACV,MAAM,EAAE;wCACN,IAAI,EAAE,OAAO;wCACb,KAAK,EAAE;4CACL,IAAI,EAAE,QAAQ;yCACf;wCACD,WAAW,EAAE,+BAA+B;qCAC7C;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { OpenAPIV3 } from \"openapi-types\";\n\nexport function getSystemJsonSchemaPaths() {\n const paths: OpenAPIV3.PathsObject = {};\n\n paths[\"/api/available-resources\"] = {\n get: {\n tags: [\"System\"],\n summary: \"Get available resources\",\n description:\n \"Returns a comprehensive list of all available API resource endpoints\",\n operationId: \"getAvailableResources\",\n responses: {\n \"200\": {\n description: \"List of available resources retrieved successfully\",\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n data: {\n type: \"array\",\n items: {\n type: \"string\",\n },\n description: \"Array of available resource endpoints\",\n },\n },\n },\n },\n },\n },\n },\n },\n };\n\n paths[\"/api/available-routes\"] = {\n get: {\n tags: [\"System\"],\n summary: \"Get available routes\",\n description:\n \"Returns a comprehensive list of all registered API routes and their methods\",\n operationId: \"getAvailableRoutes\",\n responses: {\n \"200\": {\n description: \"List of available routes retrieved successfully\",\n content: {\n \"application/json\": {\n schema: {\n type: \"object\",\n properties: {\n routes: {\n type: \"array\",\n items: {\n type: \"string\",\n },\n description: \"Array of available API routes\",\n },\n },\n },\n },\n },\n },\n },\n },\n };\n\n return paths;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{validationMetadatasToSchemas as i}from"class-validator-jsonschema";import{importModule as f}from"../../../../../utils/helpers/global.helpers.js";import{getMetadataStorage as d}from"class-validator";import{getModelModules as l,getModels as h}from"../../../../../utils/helpers/models.helpers.js";import{getCorrectJsonSchemaName as g}from"../swagger.router.helpers.js";export async function generateClassValidatorJsonSchemas(){const n=h(),e={},{defaultMetadataStorage:m}=await f("class-transformer/cjs/storage.js"),s=i({classValidatorMetadataStorage:d(),classTransformerMetadataStorage:m,refPointerPrefix:"#/components/schemas/"});return Object.entries(s).forEach(([a,t])=>{e[a]=t}),n.forEach(a=>{const t=l(a);t?.dtos&&Object.entries(t.dtos).forEach(([c,o])=>{if(o)try{const r=g(c,a,"Dto");e[r]=s[o.name]||{},e[o.name]&&delete e[o.name]}catch(r){console.warn(`Failed to generate schema for ${c} ${a}:`,r)}})}),e}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-class-validator-json-schemas.js","sourceRoot":"","sources":["../../../../../../../src/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,SAAS,GACV,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,iCAAiC;IACrD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,YAAY,CACnD,kCAAkC,CACnC,CAAC;IAEF,MAAM,UAAU,GAAG,4BAA4B,CAAC;QAC9C,6BAA6B,EAAE,kBAAkB,EAAE;QACnD,+BAA+B,EAAE,sBAAsB;QACvD,gBAAgB,EAAE,uBAAuB;KAC1C,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE;QACzD,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,YAAY,EAAE,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAChE,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,wBAAwB,CACzC,OAAO,EACP,SAAS,EACT,KAAK,CACN,CAAC;wBACF,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACtD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CACV,iCAAiC,OAAO,IAAI,SAAS,GAAG,EACxD,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { validationMetadatasToSchemas } from \"class-validator-jsonschema\";\nimport { importModule } from \"../../../../../utils/helpers/global.helpers\";\nimport { getMetadataStorage } from \"class-validator\";\nimport {\n getModelModules,\n getModels,\n} from \"../../../../../utils/helpers/models.helpers\";\nimport { getCorrectJsonSchemaName } from \"../swagger.router.helpers\";\n\nexport async function generateClassValidatorJsonSchemas() {\n const models = getModels();\n const schemas: Record<string, any> = {};\n\n const { defaultMetadataStorage } = await importModule(\n \"class-transformer/cjs/storage.js\"\n );\n\n const jsonSchema = validationMetadatasToSchemas({\n classValidatorMetadataStorage: getMetadataStorage(),\n classTransformerMetadataStorage: defaultMetadataStorage,\n refPointerPrefix: \"#/components/schemas/\",\n });\n\n Object.entries(jsonSchema).forEach(([className, schema]) => {\n schemas[className] = schema;\n });\n\n models.forEach((modelName) => {\n const modelModules = getModelModules(modelName);\n\n if (modelModules?.dtos) {\n Object.entries(modelModules.dtos).forEach(([dtoType, dtoClass]) => {\n if (dtoClass) {\n try {\n const schemaName = getCorrectJsonSchemaName(\n dtoType,\n modelName,\n \"Dto\"\n );\n schemas[schemaName] = jsonSchema[dtoClass.name] || {};\n if (schemas[dtoClass.name]) delete schemas[dtoClass.name];\n } catch (error) {\n console.warn(\n `Failed to generate schema for ${dtoType} ${modelName}:`,\n error\n );\n }\n }\n });\n }\n });\n\n return schemas;\n}\n"]}
@@ -0,0 +1 @@
1
+ "use strict";import{getModels as m}from"../../../../../utils/helpers/models.helpers.js";import c from"../../../../../utils/prisma/enhaced-prisma-json-schema-generator.js";export async function generatePrismaJsonSchemas(o){const s=[...m(),"auth"];try{return(await Promise.all(s.map(async r=>await c.generateModelSchemas({modelName:r,arkosConfig:o})))).reduce((r,a)=>({...r,...a}),{})}catch(e){throw console.error(e),e}}