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
@@ -1 +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\";\n\nconst router: Router = Router();\n\nexport async function getFileUploadRouter({ fileUpload }: ArkosConfig) {\n const modelModules = await importPrismaModelModules(\"file-upload\");\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 ...(middlewares?.beforeFindFile ? [middlewares?.beforeFindFile] : []),\n (req, res, next) => {\n req.url = req.url.replace(basePathname, \"/\");\n next();\n },\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 middlewares?.beforeUploadFile || fileUploadController.uploadFile,\n middlewares?.beforeUploadFile\n ? fileUploadController.uploadFile\n : middlewares?.afterUploadFile || sendResponse,\n middlewares?.beforeUploadFile && middlewares?.afterUploadFile\n ? middlewares?.afterUploadFile\n : sendResponse,\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 middlewares?.beforeUpdateFile || fileUploadController.updateFile,\n middlewares?.beforeUpdateFile\n ? fileUploadController.updateFile\n : middlewares?.afterUpdateFile || sendResponse,\n middlewares?.beforeUpdateFile && middlewares?.afterUpdateFile\n ? middlewares?.afterUpdateFile\n : sendResponse,\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 middlewares?.beforeDeleteFile || fileUploadController.deleteFile,\n middlewares?.beforeDeleteFile\n ? fileUploadController.deleteFile\n : middlewares?.afterDeleteFile || sendResponse,\n middlewares?.beforeDeleteFile && middlewares?.afterDeleteFile\n ? middlewares?.afterDeleteFile\n : sendResponse,\n sendResponse\n );\n\n return router;\n}\n"]}
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"]}
@@ -1,322 +1 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getFileUploadServices = exports.FileUploadService = void 0;
7
- const multer_1 = __importDefault(require("multer"));
8
- const path_1 = __importDefault(require("path"));
9
- const fs_1 = __importDefault(require("fs"));
10
- const app_error_1 = __importDefault(require("../error-handler/utils/app-error"));
11
- const util_1 = require("util");
12
- const server_1 = require("../../server");
13
- const deepmerge_helper_1 = __importDefault(require("../../utils/helpers/deepmerge.helper"));
14
- const file_upload_helpers_1 = require("./utils/helpers/file-upload.helpers");
15
- const text_helpers_1 = require("../../utils/helpers/text.helpers");
16
- class FileUploadService {
17
- constructor(uploadDir, fileSizeLimit = 1024 * 1024 * 5, allowedFileTypes = /.*/, maxCount = 30) {
18
- this.fileFilter = (req, file, cb) => {
19
- const extName = this.allowedFileTypes.test(path_1.default.extname(file.originalname).toLowerCase());
20
- const mimeType = this.allowedFileTypes.test(file.mimetype);
21
- if (mimeType && extName) {
22
- cb(null, true);
23
- }
24
- else {
25
- cb(new app_error_1.default("Invalid file type", 400));
26
- }
27
- };
28
- uploadDir = uploadDir.startsWith("/") ? uploadDir.substring(1) : uploadDir;
29
- uploadDir = uploadDir.endsWith("/") ? uploadDir.slice(0, -1) : uploadDir;
30
- this.uploadDir = path_1.default.resolve(process.cwd(), `${uploadDir}/`);
31
- this.fileSizeLimit = fileSizeLimit;
32
- this.allowedFileTypes = allowedFileTypes;
33
- this.maxCount = maxCount;
34
- if (!fs_1.default.existsSync(this.uploadDir)) {
35
- fs_1.default.mkdirSync(this.uploadDir, { recursive: true });
36
- }
37
- this.storage = multer_1.default.diskStorage({
38
- destination: (req, file, cb) => {
39
- cb(null, this.uploadDir);
40
- },
41
- filename: (req, file, cb) => {
42
- const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
43
- cb(null, `${uniqueSuffix}${path_1.default.extname(file.originalname)}`);
44
- },
45
- });
46
- }
47
- getUpload() {
48
- return (0, multer_1.default)({
49
- storage: this.storage,
50
- fileFilter: this.fileFilter,
51
- limits: { fileSize: this.fileSizeLimit },
52
- });
53
- }
54
- handleSingleUpload(oldFilePath) {
55
- return (req, res, next) => {
56
- const upload = this.getUpload().single(this.getFieldName());
57
- upload(req, res, async (err) => {
58
- if (err instanceof multer_1.default.MulterError) {
59
- return next(err);
60
- }
61
- else if (err) {
62
- return next(err);
63
- }
64
- if (oldFilePath) {
65
- const { fileUpload: configs } = (0, server_1.getArkosConfig)();
66
- const filePath = path_1.default.resolve(process.cwd(), (0, text_helpers_1.removeBothSlashes)(configs?.baseUploadDir), (0, text_helpers_1.removeBothSlashes)(oldFilePath));
67
- try {
68
- const stats = await (0, util_1.promisify)(fs_1.default.stat)(filePath);
69
- if (stats)
70
- await (0, util_1.promisify)(fs_1.default.unlink)(filePath);
71
- }
72
- catch (err) {
73
- console.error(err);
74
- }
75
- }
76
- next();
77
- });
78
- };
79
- }
80
- handleMultipleUpload() {
81
- return (req, res, next) => {
82
- const upload = this.getUpload().array(this.getFieldName(), this.maxCount);
83
- upload(req, res, (err) => {
84
- if (err instanceof multer_1.default.MulterError)
85
- return next(err);
86
- else if (err)
87
- return next(err);
88
- next();
89
- });
90
- };
91
- }
92
- handleDeleteSingleFile(oldFilePath) {
93
- return async (req, res, next) => {
94
- const filePath = path_1.default.join(oldFilePath);
95
- try {
96
- const stats = await (0, util_1.promisify)(fs_1.default.stat)(filePath);
97
- if (stats) {
98
- await (0, util_1.promisify)(fs_1.default.unlink)(filePath);
99
- }
100
- }
101
- catch (err) {
102
- console.error(err);
103
- }
104
- next();
105
- };
106
- }
107
- async deleteFileByUrl(fileUrl) {
108
- try {
109
- const { fileUpload } = (0, server_1.getArkosConfig)();
110
- const baseRoute = fileUpload?.baseRoute || "/api/uploads";
111
- let urlPath;
112
- if (fileUrl.startsWith("http")) {
113
- const url = new URL(fileUrl);
114
- urlPath = url.pathname;
115
- }
116
- else {
117
- urlPath = fileUrl;
118
- }
119
- const baseRouteIndex = urlPath.indexOf(baseRoute);
120
- if (baseRouteIndex === -1) {
121
- throw new app_error_1.default("Invalid file URL: base route not found", 400);
122
- }
123
- const pathAfterBaseRoute = urlPath.substring(baseRouteIndex + baseRoute.length);
124
- const cleanPath = pathAfterBaseRoute.startsWith("/")
125
- ? pathAfterBaseRoute.substring(1)
126
- : pathAfterBaseRoute;
127
- const fileTypes = ["images", "videos", "documents", "files"];
128
- let fileType = null;
129
- let fileName = null;
130
- for (const type of fileTypes) {
131
- const typeIndex = cleanPath.indexOf(type + "/");
132
- if (typeIndex !== -1) {
133
- fileType = type;
134
- fileName = cleanPath.substring(typeIndex + type.length + 1);
135
- break;
136
- }
137
- }
138
- if (!fileType || !fileName) {
139
- throw new app_error_1.default("Unable to determine file type or file name from URL", 400);
140
- }
141
- const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = (0, exports.getFileUploadServices)();
142
- let filePath;
143
- switch (fileType) {
144
- case "images":
145
- filePath = path_1.default.join(imageUploadService.uploadDir, fileName);
146
- break;
147
- case "videos":
148
- filePath = path_1.default.join(videoUploadService.uploadDir, fileName);
149
- break;
150
- case "documents":
151
- filePath = path_1.default.join(documentUploadService.uploadDir, fileName);
152
- break;
153
- case "files":
154
- filePath = path_1.default.join(fileUploadService.uploadDir, fileName);
155
- break;
156
- default:
157
- throw new app_error_1.default(`Unsupported file type: ${fileType}`, 400);
158
- }
159
- await (0, util_1.promisify)(fs_1.default.stat)(filePath);
160
- await (0, util_1.promisify)(fs_1.default.unlink)(filePath);
161
- return true;
162
- }
163
- catch (error) {
164
- if (error instanceof app_error_1.default) {
165
- throw error;
166
- }
167
- if (error.code === "ENOENT") {
168
- throw new app_error_1.default("File not found", 404);
169
- }
170
- throw new app_error_1.default(`Failed to delete file: ${error.message}`, 500);
171
- }
172
- }
173
- getFieldName() {
174
- let fieldName = "files";
175
- if (this.uploadDir.endsWith("images") || this.uploadDir.endsWith("images/"))
176
- fieldName = "images";
177
- if (this.uploadDir.endsWith("videos") || this.uploadDir.endsWith("videos/"))
178
- fieldName = "videos";
179
- if (this.uploadDir.endsWith("documents") ||
180
- this.uploadDir.endsWith("documents/"))
181
- fieldName = "documents";
182
- if (this.uploadDir.endsWith("files") || this.uploadDir.endsWith("files/"))
183
- fieldName = "files";
184
- return fieldName;
185
- }
186
- async upload(req, res, options = {}) {
187
- const { fileUpload } = (0, server_1.getArkosConfig)();
188
- const baseRoute = fileUpload?.baseRoute || "/api/uploads";
189
- return new Promise((resolve, reject) => {
190
- const isMultiple = Array.isArray(req.query.multiple)
191
- ? req.query.multiple[0] == "true"
192
- : req.query.multiple == "true";
193
- const uploadHandler = isMultiple
194
- ? this.getUpload().array(this.getFieldName(), this.maxCount)
195
- : this.getUpload().single(this.getFieldName());
196
- uploadHandler(req, res, async (err) => {
197
- if (err)
198
- return reject(err);
199
- try {
200
- const protocol = req.get("host")?.includes?.("localhost")
201
- ? "http"
202
- : "https";
203
- const baseURL = `${protocol}://${req.get("host")}`;
204
- const dirParts = this.uploadDir.split("/");
205
- const fileType = (this.uploadDir.endsWith("/")
206
- ? dirParts[dirParts.length - 2]
207
- : dirParts[dirParts.length - 1]) || "files";
208
- let data;
209
- if (req.files && Array.isArray(req.files) && req.files.length > 0) {
210
- const isImageUpload = this.uploadDir?.includes?.("/images");
211
- if (isImageUpload) {
212
- data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processImage)(req, file.path, options)));
213
- }
214
- else {
215
- data = await Promise.all(req.files.map((file) => (0, file_upload_helpers_1.processFile)(req, file.path)));
216
- }
217
- data = data.filter((url) => url !== null);
218
- }
219
- else if (req.file) {
220
- const isImageUpload = this.uploadDir?.includes?.("/images");
221
- if (isImageUpload) {
222
- data = await (0, file_upload_helpers_1.processImage)(req, req.file.path, options);
223
- }
224
- else {
225
- data = await (0, file_upload_helpers_1.processFile)(req, req.file.path);
226
- }
227
- }
228
- else {
229
- return reject(new app_error_1.default("No file uploaded", 400));
230
- }
231
- resolve(data);
232
- }
233
- catch (error) {
234
- reject(error);
235
- }
236
- });
237
- });
238
- }
239
- async deleteFileByName(fileName, fileType) {
240
- try {
241
- if (!fileType)
242
- throw new app_error_1.default("File type parameter is required", 400);
243
- const validFileTypes = ["images", "videos", "documents", "files"];
244
- if (!validFileTypes.includes(fileType)) {
245
- throw new app_error_1.default(`Invalid file type: ${fileType}. Must be one of: ${validFileTypes.join(", ")}`, 400);
246
- }
247
- const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = (0, exports.getFileUploadServices)();
248
- let targetService;
249
- switch (fileType) {
250
- case "images":
251
- targetService = imageUploadService;
252
- break;
253
- case "videos":
254
- targetService = videoUploadService;
255
- break;
256
- case "documents":
257
- targetService = documentUploadService;
258
- break;
259
- case "files":
260
- targetService = fileUploadService;
261
- break;
262
- default:
263
- throw new app_error_1.default(`Unsupported file type: ${fileType}`, 400);
264
- }
265
- const filePath = path_1.default.join(targetService.uploadDir, fileName);
266
- await (0, util_1.promisify)(fs_1.default.stat)(filePath);
267
- await (0, util_1.promisify)(fs_1.default.unlink)(filePath);
268
- return true;
269
- }
270
- catch (error) {
271
- if (error instanceof app_error_1.default) {
272
- throw error;
273
- }
274
- if (error.code === "ENOENT") {
275
- throw new app_error_1.default("File not found", 404);
276
- }
277
- throw new app_error_1.default(`Failed to delete file: ${error.message}`, 500);
278
- }
279
- }
280
- }
281
- exports.FileUploadService = FileUploadService;
282
- const getFileUploadServices = () => {
283
- const { fileUpload } = (0, server_1.getArkosConfig)();
284
- const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
285
- const defaultRestrictions = {
286
- images: {
287
- maxCount: 30,
288
- maxSize: 1024 * 1024 * 15,
289
- 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/,
290
- },
291
- videos: {
292
- maxCount: 10,
293
- maxSize: 1024 * 1024 * 5096,
294
- 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/,
295
- },
296
- documents: {
297
- maxCount: 30,
298
- maxSize: 1024 * 1024 * 50,
299
- 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/,
300
- },
301
- files: {
302
- maxCount: 10,
303
- maxSize: 1024 * 1024 * 5096,
304
- supportedFilesRegex: /.*/,
305
- },
306
- };
307
- const restrictions = fileUpload?.restrictions
308
- ? (0, deepmerge_helper_1.default)(defaultRestrictions, fileUpload.restrictions)
309
- : defaultRestrictions;
310
- const imageUploadService = new FileUploadService(`${baseUploadDir}/images`, restrictions.images.maxSize, restrictions.images.supportedFilesRegex, restrictions.images.maxCount);
311
- const videoUploadService = new FileUploadService(`${baseUploadDir}/videos`, restrictions.videos.maxSize, restrictions.videos.supportedFilesRegex, restrictions.videos.maxCount);
312
- const documentUploadService = new FileUploadService(`${baseUploadDir}/documents`, restrictions.documents.maxSize, restrictions.documents.supportedFilesRegex, restrictions.documents.maxCount);
313
- const fileUploadService = new FileUploadService(`${baseUploadDir}/files`, restrictions.files.maxSize, restrictions.files.supportedFilesRegex, restrictions.files.maxCount);
314
- return {
315
- imageUploadService,
316
- videoUploadService,
317
- documentUploadService,
318
- fileUploadService,
319
- };
320
- };
321
- exports.getFileUploadServices = getFileUploadServices;
322
- //# sourceMappingURL=file-upload.service.js.map
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getFileUploadServices=exports.FileUploadService=void 0;const multer_1=__importDefault(require("multer")),path_1=__importDefault(require("path")),fs_1=__importDefault(require("fs")),app_error_1=__importDefault(require("../error-handler/utils/app-error")),util_1=require("util"),server_1=require("../../server"),deepmerge_helper_1=__importDefault(require("../../utils/helpers/deepmerge.helper")),file_upload_helpers_1=require("./utils/helpers/file-upload.helpers"),text_helpers_1=require("../../utils/helpers/text.helpers");class FileUploadService{constructor(e,i=1024*1024*5,t=/.*/,l=30){this.fileFilter=(a,s,o)=>{const r=this.allowedFileTypes.test(path_1.default.extname(s.originalname).toLowerCase());this.allowedFileTypes.test(s.mimetype)&&r?o(null,!0):o(new app_error_1.default("Invalid file type",400))},e=e.startsWith("/")?e.substring(1):e,e=e.endsWith("/")?e.slice(0,-1):e,this.uploadDir=path_1.default.resolve(process.cwd(),`${e}/`),this.fileSizeLimit=i,this.allowedFileTypes=t,this.maxCount=l,fs_1.default.existsSync(this.uploadDir)||fs_1.default.mkdirSync(this.uploadDir,{recursive:!0}),this.storage=multer_1.default.diskStorage({destination:(a,s,o)=>{o(null,this.uploadDir)},filename:(a,s,o)=>{const r=Date.now()+"-"+Math.round(Math.random()*1e9);o(null,`${r}${path_1.default.extname(s.originalname)}`)}})}getUpload(){return(0,multer_1.default)({storage:this.storage,fileFilter:this.fileFilter,limits:{fileSize:this.fileSizeLimit}})}handleSingleUpload(e){return(i,t,l)=>{this.getUpload().single(this.getFieldName())(i,t,async s=>{if(s instanceof multer_1.default.MulterError)return l(s);if(s)return l(s);if(e){const{fileUpload:o}=(0,server_1.getArkosConfig)(),r=path_1.default.resolve(process.cwd(),(0,text_helpers_1.removeBothSlashes)(o?.baseUploadDir),(0,text_helpers_1.removeBothSlashes)(e));try{await(0,util_1.promisify)(fs_1.default.stat)(r)&&await(0,util_1.promisify)(fs_1.default.unlink)(r)}catch(d){console.error(d)}}l()})}}handleMultipleUpload(){return(e,i,t)=>{this.getUpload().array(this.getFieldName(),this.maxCount)(e,i,a=>{if(a instanceof multer_1.default.MulterError)return t(a);if(a)return t(a);t()})}}handleDeleteSingleFile(e){return async(i,t,l)=>{const a=path_1.default.join(e);try{await(0,util_1.promisify)(fs_1.default.stat)(a)&&await(0,util_1.promisify)(fs_1.default.unlink)(a)}catch(s){console.error(s)}l()}}async deleteFileByUrl(e){try{const{fileUpload:i}=(0,server_1.getArkosConfig)(),t=i?.baseRoute||"/api/uploads";let l;e.startsWith("http")?l=new URL(e).pathname:l=e;const a=l.indexOf(t);if(a===-1)throw new app_error_1.default("Invalid file URL: base route not found",400);const s=l.substring(a+t.length),o=s.startsWith("/")?s.substring(1):s,r=["images","videos","documents","files"];let d=null,p=null;for(const m of r){const f=o.indexOf(m+"/");if(f!==-1){d=m,p=o.substring(f+m.length+1);break}}if(!d||!p)throw new app_error_1.default("Unable to determine file type or file name from URL",400);const{documentUploadService:h,fileUploadService:g,imageUploadService:c,videoUploadService:v}=(0,exports.getFileUploadServices)();let n;switch(d){case"images":n=path_1.default.join(c.uploadDir,p);break;case"videos":n=path_1.default.join(v.uploadDir,p);break;case"documents":n=path_1.default.join(h.uploadDir,p);break;case"files":n=path_1.default.join(g.uploadDir,p);break;default:throw new app_error_1.default(`Unsupported file type: ${d}`,400)}return await(0,util_1.promisify)(fs_1.default.stat)(n),await(0,util_1.promisify)(fs_1.default.unlink)(n),!0}catch(i){throw i instanceof app_error_1.default?i:i.code==="ENOENT"?new app_error_1.default("File not found",404):new app_error_1.default(`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:l}=(0,server_1.getArkosConfig)(),a=l?.baseRoute||"/api/uploads";return new Promise((s,o)=>{((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 p=>{if(p)return o(p);try{const g=`${e.get("host")?.includes?.("localhost")?"http":"https"}://${e.get("host")}`,c=this.uploadDir.split("/"),v=(this.uploadDir.endsWith("/")?c[c.length-2]:c[c.length-1])||"files";let n;if(e.files&&Array.isArray(e.files)&&e.files.length>0)this.uploadDir?.includes?.("/images")?n=await Promise.all(e.files.map(f=>(0,file_upload_helpers_1.processImage)(e,f.path,t))):n=await Promise.all(e.files.map(f=>(0,file_upload_helpers_1.processFile)(e,f.path))),n=n.filter(f=>f!==null);else if(e.file)this.uploadDir?.includes?.("/images")?n=await(0,file_upload_helpers_1.processImage)(e,e.file.path,t):n=await(0,file_upload_helpers_1.processFile)(e,e.file.path);else return o(new app_error_1.default("No file uploaded",400));s(n)}catch(h){o(h)}})})}async deleteFileByName(e,i){try{if(!i)throw new app_error_1.default("File type parameter is required",400);const t=["images","videos","documents","files"];if(!t.includes(i))throw new app_error_1.default(`Invalid file type: ${i}. Must be one of: ${t.join(", ")}`,400);const{documentUploadService:l,fileUploadService:a,imageUploadService:s,videoUploadService:o}=(0,exports.getFileUploadServices)();let r;switch(i){case"images":r=s;break;case"videos":r=o;break;case"documents":r=l;break;case"files":r=a;break;default:throw new app_error_1.default(`Unsupported file type: ${i}`,400)}const d=path_1.default.join(r.uploadDir,e);return await(0,util_1.promisify)(fs_1.default.stat)(d),await(0,util_1.promisify)(fs_1.default.unlink)(d),!0}catch(t){throw t instanceof app_error_1.default?t:t.code==="ENOENT"?new app_error_1.default("File not found",404):new app_error_1.default(`Failed to delete file: ${t.message}`,500)}}}exports.FileUploadService=FileUploadService;const getFileUploadServices=()=>{const{fileUpload:u}=(0,server_1.getArkosConfig)(),e=u?.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=u?.restrictions?(0,deepmerge_helper_1.default)(i,u.restrictions):i,l=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),o=new FileUploadService(`${e}/files`,t.files.maxSize,t.files.supportedFilesRegex,t.files.maxCount);return{imageUploadService:l,videoUploadService:a,documentUploadService:s,fileUploadService:o}};exports.getFileUploadServices=getFileUploadServices;
@@ -1,90 +1 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.processImage = exports.processFile = void 0;
7
- exports.extractRequestInfo = extractRequestInfo;
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const sharp_1 = __importDefault(require("sharp"));
11
- const util_1 = require("util");
12
- const server_1 = require("../../../../server");
13
- const mimetype_1 = __importDefault(require("mimetype"));
14
- const fs_helpers_1 = require("../../../../utils/helpers/fs.helpers");
15
- function extractRequestInfo(req) {
16
- const { fileUpload } = (0, server_1.getArkosConfig)();
17
- const protocol = req.headers["x-forwarded-proto"] === "https" ? "https" : "http";
18
- const baseURL = `${protocol}://${req.get?.("host")}`;
19
- const baseRoute = fileUpload?.baseRoute || "/api/uploads";
20
- return { baseURL, baseRoute };
21
- }
22
- const generateRelativePath = (filePath, fileType) => {
23
- const { fileUpload } = (0, server_1.getArkosConfig)();
24
- const baseUploadDir = fileUpload?.baseUploadDir || "/uploads";
25
- if (baseUploadDir.startsWith("..")) {
26
- return path_1.default.join(fileType, path_1.default.basename(filePath));
27
- }
28
- else {
29
- return (0, fs_helpers_1.fullCleanCwd)(filePath
30
- .replace(`${baseUploadDir}/`, "")
31
- .replace(`/${baseUploadDir}/`, "")
32
- .replace(`/${baseUploadDir}`, "")
33
- .replace(`${baseUploadDir}`, ""));
34
- }
35
- };
36
- const processFile = async (req, filePath) => {
37
- const { baseURL, baseRoute } = extractRequestInfo(req);
38
- const relativePath = generateRelativePath(filePath, req.params.fileType);
39
- return `${baseURL}${baseRoute === "/" ? "" : baseRoute}/${relativePath}`;
40
- };
41
- exports.processFile = processFile;
42
- const processImage = async (req, filePath, options) => {
43
- const { baseURL, baseRoute } = extractRequestInfo(req);
44
- const ext = path_1.default.extname(filePath).toLowerCase();
45
- const originalFormat = ext.replace(".", "");
46
- const outputFormat = options.format || originalFormat;
47
- if (!mimetype_1.default.lookup(ext)?.includes?.("image")) {
48
- const relativePath = generateRelativePath(filePath, req.params.fileType);
49
- return `${baseURL}${baseRoute}/${relativePath}`;
50
- }
51
- const tempName = `${path_1.default.basename(filePath, ext)}_${Date.now()}${ext}`;
52
- const tempPath = path_1.default.join(path_1.default.dirname(filePath), tempName);
53
- try {
54
- let transformer = (0, sharp_1.default)(filePath);
55
- const metadata = await transformer.metadata();
56
- if (options.resizeTo && metadata.width && metadata.height) {
57
- const targetSize = options.resizeTo;
58
- const scaleFactor = targetSize / Math.min(metadata.width, metadata.height);
59
- const newWidth = Math.round(metadata.width * scaleFactor);
60
- const newHeight = Math.round(metadata.height * scaleFactor);
61
- transformer = transformer.resize(newWidth, newHeight);
62
- }
63
- else if (options.width || options.height) {
64
- transformer = transformer.resize(options.width || null, options.height || null, {
65
- fit: "inside",
66
- });
67
- }
68
- if (outputFormat === "webp") {
69
- transformer = transformer.toFormat("webp");
70
- }
71
- else if (outputFormat === "jpeg" || outputFormat === "jpg") {
72
- transformer = transformer.toFormat("jpeg");
73
- }
74
- await transformer.toFile(tempPath);
75
- await (0, util_1.promisify)(fs_1.default.rename)(tempPath, filePath);
76
- const relativePath = generateRelativePath(filePath, req?.params.fileType);
77
- return `${baseURL}${baseRoute}/${relativePath}`;
78
- }
79
- catch (error) {
80
- try {
81
- await (0, util_1.promisify)(fs_1.default.stat)(tempPath);
82
- await (0, util_1.promisify)(fs_1.default.unlink)(tempPath);
83
- }
84
- catch (err) {
85
- }
86
- throw error;
87
- }
88
- };
89
- exports.processImage = processImage;
90
- //# sourceMappingURL=file-upload.helpers.js.map
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.processImage=exports.processFile=void 0,exports.adjustRequestUrl=adjustRequestUrl,exports.extractRequestInfo=extractRequestInfo;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),sharp_1=__importDefault(require("sharp")),util_1=require("util"),server_1=require("../../../../server"),mimetype_1=__importDefault(require("mimetype")),fs_helpers_1=require("../../../../utils/helpers/fs.helpers");function adjustRequestUrl(e,a,r){const{fileUpload:t}=(0,server_1.getArkosConfig)();e.url=e.url.replace(t?.baseRoute+"/"||"/api/uploads/","/"),e.url=e.url.replace(t?.baseRoute||"/api/uploads/","/"),r()}function extractRequestInfo(e){const{fileUpload:a}=(0,server_1.getArkosConfig)(),t=`${e.headers["x-forwarded-proto"]==="https"?"https":"http"}://${e.get?.("host")}`,i=a?.baseRoute||"/api/uploads";return{baseURL:t,baseRoute:i}}const generateRelativePath=(e,a)=>{const{fileUpload:r}=(0,server_1.getArkosConfig)(),t=r?.baseUploadDir||"/uploads";return t.startsWith("..")?path_1.default.join(a,path_1.default.basename(e)):(0,fs_helpers_1.fullCleanCwd)(e.replace(`${t}/`,"").replace(`/${t}/`,"").replace(`/${t}`,"").replace(`${t}`,""))},processFile=async(e,a)=>{const{baseURL:r,baseRoute:t}=extractRequestInfo(e),i=generateRelativePath(a,e.params.fileType);return`${r}${t==="/"?"":t}/${i}`};exports.processFile=processFile;const processImage=async(e,a,r)=>{const{baseURL:t,baseRoute:i}=extractRequestInfo(e),l=path_1.default.extname(a).toLowerCase(),p=l.replace(".",""),u=r.format||p;if(!mimetype_1.default.lookup(l)?.includes?.("image")){const s=generateRelativePath(a,e.params.fileType);return`${t}${i}/${s}`}const d=`${path_1.default.basename(a,l)}_${Date.now()}${l}`,n=path_1.default.join(path_1.default.dirname(a),d);try{let s=(0,sharp_1.default)(a);const o=await s.metadata();if(r.resizeTo&&o.width&&o.height){const c=r.resizeTo/Math.min(o.width,o.height),h=Math.round(o.width*c),m=Math.round(o.height*c);s=s.resize(h,m)}else(r.width||r.height)&&(s=s.resize(r.width||null,r.height||null,{fit:"inside"}));u==="webp"?s=s.toFormat("webp"):(u==="jpeg"||u==="jpg")&&(s=s.toFormat("jpeg")),await s.toFile(n),await(0,util_1.promisify)(fs_1.default.rename)(n,a);const f=generateRelativePath(a,e?.params.fileType);return`${t}${i}/${f}`}catch(s){try{await(0,util_1.promisify)(fs_1.default.stat)(n),await(0,util_1.promisify)(fs_1.default.unlink)(n)}catch{}throw s}};exports.processImage=processImage;
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.helpers.js","sourceRoot":"","sources":["../../../../../../src/modules/file-upload/utils/helpers/file-upload.helpers.ts"],"names":[],"mappings":";;;;;;AASA,gDASC;AAlBD,4CAAoB;AACpB,gDAAwB;AACxB,kDAA0B;AAC1B,+BAAiC;AACjC,+CAAoD;AACpD,wDAAgC;AAEhC,qEAAoE;AAEpE,SAAgB,kBAAkB,CAAC,GAAiB;IAClD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAc,GAAE,CAAC;IAGxC,MAAM,QAAQ,GACZ,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,OAAO,GAAG,GAAG,QAAQ,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IACrD,MAAM,SAAS,GAAG,UAAU,EAAE,SAAS,IAAI,cAAc,CAAC;IAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAKD,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE;IAClE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,uBAAc,GAAE,CAAC;IAExC,MAAM,aAAa,GAAG,UAAU,EAAE,aAAa,IAAI,UAAU,CAAC;IAC9D,IAAI,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAEnC,OAAO,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QAEN,OAAO,IAAA,yBAAY,EACjB,QAAQ;aACL,OAAO,CAAC,GAAG,aAAa,GAAG,EAAE,EAAE,CAAC;aAChC,OAAO,CAAC,IAAI,aAAa,GAAG,EAAE,EAAE,CAAC;aACjC,OAAO,CAAC,IAAI,aAAa,EAAE,EAAE,EAAE,CAAC;aAChC,OAAO,CAAC,GAAG,aAAa,EAAE,EAAE,EAAE,CAAC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAKK,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAiB,EACjB,QAAgB,EACC,EAAE;IACnB,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC;IAC1E,OAAO,GAAG,OAAO,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,YAAY,EAAE,CAAC;AAC3E,CAAC,CAAC;AARW,QAAA,WAAW,eAQtB;AAKK,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAiB,EACjB,QAAgB,EAChB,OAA4B,EACJ,EAAE;IAC1B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC;IAEtD,IAAI,CAAC,kBAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC;QAC1E,OAAO,GAAG,OAAO,GAAG,SAAS,IAAI,YAAY,EAAE,CAAC;IAClD,CAAC;IAGD,MAAM,QAAQ,GAAG,GAAG,cAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,IAAI,WAAW,GAAG,IAAA,eAAK,EAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;QAG9C,IAAI,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;YACpC,MAAM,WAAW,GACf,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;YAC5D,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3C,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,OAAO,CAAC,KAAK,IAAI,IAAI,EACrB,OAAO,CAAC,MAAM,IAAI,IAAI,EACtB;gBACE,GAAG,EAAE,QAAQ;aACd,CACF,CAAC;QACJ,CAAC;QAGD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC5B,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;YAC7D,WAAW,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7C,CAAC;QAGD,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAGnC,MAAM,IAAA,gBAAS,EAAC,YAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAG/C,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAO,CAAC,QAAQ,CAAC,CAAC;QAE3E,OAAO,GAAG,OAAO,GAAG,SAAS,IAAI,YAAY,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAEf,IAAI,CAAC;YACH,MAAM,IAAA,gBAAS,EAAC,YAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,IAAA,gBAAS,EAAC,YAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;QAEf,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AArEW,QAAA,YAAY,gBAqEvB","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 { ArkosRequest } from \"../../../../types\";\nimport { fullCleanCwd } from \"../../../../utils/helpers/fs.helpers\";\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"]}
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"]}