arkos 2.0.0-next.3 → 2.0.0-next.30

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 (655) hide show
  1. package/README.md +146 -145
  2. package/cli.js +11 -20
  3. package/dist/esm/app.js +37 -35
  4. package/dist/esm/app.js.map +1 -1
  5. package/dist/esm/components/arkos-gateway/arkos-gateway.js +362 -0
  6. package/dist/esm/components/arkos-gateway/arkos-gateway.js.map +1 -0
  7. package/dist/esm/components/arkos-gateway/socket-extensions.js +176 -0
  8. package/dist/esm/components/arkos-gateway/socket-extensions.js.map +1 -0
  9. package/dist/esm/components/arkos-gateway/types.js +3 -0
  10. package/dist/esm/components/arkos-gateway/types.js.map +1 -0
  11. package/dist/esm/components/arkos-gateway/utils/helpers.js +105 -0
  12. package/dist/esm/components/arkos-gateway/utils/helpers.js.map +1 -0
  13. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js +45 -0
  14. package/dist/esm/components/arkos-gateway/utils/memory-gateway-store.js.map +1 -0
  15. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js +40 -0
  16. package/dist/esm/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.js.map +1 -0
  17. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js +13 -0
  18. package/dist/esm/components/arkos-gateway/utils/rate-limiter.js.map +1 -0
  19. package/dist/esm/components/arkos-loadable-registry/index.js +1 -3
  20. package/dist/esm/components/arkos-loadable-registry/index.js.map +1 -1
  21. package/dist/esm/components/arkos-policy/index.js +3 -1
  22. package/dist/esm/components/arkos-policy/index.js.map +1 -1
  23. package/dist/esm/components/arkos-route-hook/index.js +30 -19
  24. package/dist/esm/components/arkos-route-hook/index.js.map +1 -1
  25. package/dist/esm/components/arkos-route-hook/reader.js.map +1 -1
  26. package/dist/esm/components/arkos-route-hook/types.js.map +1 -1
  27. package/dist/esm/exports/error-handler/index.js +1 -0
  28. package/dist/esm/exports/error-handler/index.js.map +1 -1
  29. package/dist/esm/exports/file-upload.js +2 -0
  30. package/dist/esm/exports/file-upload.js.map +1 -0
  31. package/dist/esm/exports/index.js +3 -3
  32. package/dist/esm/exports/index.js.map +1 -1
  33. package/dist/esm/exports/middlewares/index.js +1 -1
  34. package/dist/esm/exports/middlewares/index.js.map +1 -1
  35. package/dist/esm/exports/services/index.js +2 -2
  36. package/dist/esm/exports/services/index.js.map +1 -1
  37. package/dist/esm/exports/websockets.js +5 -0
  38. package/dist/esm/exports/websockets.js.map +1 -0
  39. package/dist/esm/generated.js.map +1 -1
  40. package/dist/esm/modules/auth/auth.controller.js +165 -230
  41. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  42. package/dist/esm/modules/auth/auth.router.js +28 -10
  43. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  44. package/dist/esm/modules/auth/auth.service.js +202 -136
  45. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  46. package/dist/esm/modules/auth/auth.types.js +2 -0
  47. package/dist/esm/modules/auth/auth.types.js.map +1 -0
  48. package/dist/esm/modules/auth/utils/auth-error-objects.js +2 -2
  49. package/dist/esm/modules/auth/utils/auth-error-objects.js.map +1 -1
  50. package/dist/esm/modules/auth/utils/auth-hooks-manager.js +148 -0
  51. package/dist/esm/modules/auth/utils/auth-hooks-manager.js.map +1 -0
  52. package/dist/esm/modules/auth/utils/auth-openapi-generator.js +367 -0
  53. package/dist/esm/modules/auth/utils/auth-openapi-generator.js.map +1 -0
  54. package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js +97 -0
  55. package/dist/esm/modules/auth/utils/auth-prisma-json-schema-generator.js.map +1 -0
  56. package/dist/esm/modules/auth/utils/docs-links.js +6 -0
  57. package/dist/esm/modules/auth/utils/docs-links.js.map +1 -0
  58. package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js +1 -0
  59. package/dist/esm/modules/auth/utils/helpers/auth.controller.helpers.js.map +1 -1
  60. package/dist/esm/modules/auth/utils/services/auth-action.service.js +20 -16
  61. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  62. package/dist/esm/modules/auth/utils/token-extraction.js +57 -0
  63. package/dist/esm/modules/auth/utils/token-extraction.js.map +1 -0
  64. package/dist/esm/modules/base/base.controller.js +228 -202
  65. package/dist/esm/modules/base/base.controller.js.map +1 -1
  66. package/dist/esm/modules/base/base.middlewares.js +69 -86
  67. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  68. package/dist/esm/modules/base/base.router.js +23 -9
  69. package/dist/esm/modules/base/base.router.js.map +1 -1
  70. package/dist/esm/modules/base/base.service.js +92 -197
  71. package/dist/esm/modules/base/base.service.js.map +1 -1
  72. package/dist/esm/modules/base/types/base.service.types.js.map +1 -1
  73. package/dist/esm/modules/base/utils/error-prettifier.js +90 -30
  74. package/dist/esm/modules/base/utils/error-prettifier.js.map +1 -1
  75. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +26 -5
  76. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  77. package/dist/esm/modules/base/utils/model-openapi-generator.js +438 -0
  78. package/dist/esm/modules/base/utils/model-openapi-generator.js.map +1 -0
  79. package/dist/esm/modules/email/email.service.js +21 -12
  80. package/dist/esm/modules/email/email.service.js.map +1 -1
  81. package/dist/esm/modules/error-handler/error-handler.controller.js +24 -113
  82. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  83. package/dist/esm/modules/error-handler/utils/app-error.js +5 -2
  84. package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
  85. package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
  86. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +60 -110
  87. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  88. package/dist/esm/modules/error-handler/utils/errors.js +127 -0
  89. package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
  90. package/dist/esm/modules/error-handler/utils/get-handled-error.js +73 -0
  91. package/dist/esm/modules/error-handler/utils/get-handled-error.js.map +1 -0
  92. package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
  93. package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
  94. package/dist/esm/modules/file-upload/file-upload.controller.js +227 -215
  95. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  96. package/dist/esm/modules/file-upload/file-upload.router.js +54 -15
  97. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  98. package/dist/esm/modules/file-upload/file-upload.service.js +41 -26
  99. package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
  100. package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js +371 -0
  101. package/dist/esm/modules/file-upload/utils/file-upload-json-schema-generator.js.map +1 -0
  102. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +73 -35
  103. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  104. package/dist/esm/modules/file-upload/utils/helpers/serve-upload-dir.js +206 -0
  105. package/dist/esm/modules/file-upload/utils/helpers/serve-upload-dir.js.map +1 -0
  106. package/dist/esm/modules/file-upload/utils/helpers/upload-path.helper.js +103 -0
  107. package/dist/esm/modules/file-upload/utils/helpers/upload-path.helper.js.map +1 -0
  108. package/dist/esm/modules/file-upload/utils/helpers/upload-serving-validation.js +212 -0
  109. package/dist/esm/modules/file-upload/utils/helpers/upload-serving-validation.js.map +1 -0
  110. package/dist/esm/modules/file-upload/utils/helpers/upload-serving.registry.js +30 -0
  111. package/dist/esm/modules/file-upload/utils/helpers/upload-serving.registry.js.map +1 -0
  112. package/dist/esm/modules/swagger/swagger.router.js +39 -22
  113. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  114. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +305 -0
  115. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
  116. package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -1
  117. package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +6 -7
  118. package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
  119. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +47 -43
  120. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
  121. package/dist/esm/server.js +1 -1
  122. package/dist/esm/server.js.map +1 -1
  123. package/dist/esm/types/arkos-config/utils.js +2 -0
  124. package/dist/esm/types/arkos-config/utils.js.map +1 -0
  125. package/dist/esm/types/arkos-prisma-input.js.map +1 -1
  126. package/dist/esm/types/arkos.js.map +1 -1
  127. package/dist/esm/types/auth.js.map +1 -1
  128. package/dist/esm/types/index.js.map +1 -1
  129. package/dist/esm/types/internal.js +2 -0
  130. package/dist/esm/types/internal.js.map +1 -0
  131. package/dist/esm/types/new-arkos-config.js.map +1 -1
  132. package/dist/esm/types/router-config.js.map +1 -1
  133. package/dist/esm/types/upload.js +2 -0
  134. package/dist/esm/types/upload.js.map +1 -0
  135. package/dist/esm/types/validation/validation-manager.js +57 -0
  136. package/dist/esm/types/validation/validation-manager.js.map +1 -0
  137. package/dist/esm/types/validation/validator.js +2 -0
  138. package/dist/esm/types/validation/validator.js.map +1 -0
  139. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +68 -34
  140. package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
  141. package/dist/esm/utils/arkos-router/index.js +58 -158
  142. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  143. package/dist/esm/utils/arkos-router/route-config-registry.js +2 -3
  144. package/dist/esm/utils/arkos-router/route-config-registry.js.map +1 -1
  145. package/dist/esm/utils/arkos-router/route-config-validator.js +11 -10
  146. package/dist/esm/utils/arkos-router/route-config-validator.js.map +1 -1
  147. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  148. package/dist/esm/utils/arkos-router/types/openapi-config.js.map +1 -1
  149. package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -1
  150. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +198 -0
  151. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
  152. package/dist/esm/utils/arkos-router/utils/helpers/index.js +92 -29
  153. package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
  154. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +683 -119
  155. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
  156. package/dist/esm/utils/bundler.js +6 -6
  157. package/dist/esm/utils/bundler.js.map +1 -1
  158. package/dist/esm/utils/cli/build.js +16 -9
  159. package/dist/esm/utils/cli/build.js.map +1 -1
  160. package/dist/esm/utils/cli/dev.js +33 -32
  161. package/dist/esm/utils/cli/dev.js.map +1 -1
  162. package/dist/esm/utils/cli/export-auth-action.js +7 -7
  163. package/dist/esm/utils/cli/export-auth-action.js.map +1 -1
  164. package/dist/esm/utils/cli/generate.js +77 -58
  165. package/dist/esm/utils/cli/generate.js.map +1 -1
  166. package/dist/esm/utils/cli/index.js +74 -56
  167. package/dist/esm/utils/cli/index.js.map +1 -1
  168. package/dist/esm/utils/cli/prisma-generate.js +66 -35
  169. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  170. package/dist/esm/utils/cli/start.js +27 -16
  171. package/dist/esm/utils/cli/start.js.map +1 -1
  172. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  173. package/dist/esm/utils/cli/utils/dependency-version-check.js +39 -0
  174. package/dist/esm/utils/cli/utils/dependency-version-check.js.map +1 -0
  175. package/dist/esm/utils/cli/utils/runtime-cli-commander.js +7 -3
  176. package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -1
  177. package/dist/esm/utils/cli/utils/smart-fs-watcher.js +3 -0
  178. package/dist/esm/utils/cli/utils/smart-fs-watcher.js.map +1 -1
  179. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +307 -11
  180. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  181. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js +16 -7
  182. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
  183. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +117 -65
  184. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  185. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +6 -8
  186. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
  187. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +13 -2
  188. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  189. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +2 -2
  190. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  191. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +213 -19
  192. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  193. package/dist/esm/utils/cli/utils/template-generators.js +31 -18
  194. package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
  195. package/dist/esm/utils/cli/utils/watermark-stamper.js +1 -1
  196. package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -1
  197. package/dist/esm/utils/define-config.js +15 -0
  198. package/dist/esm/utils/define-config.js.map +1 -1
  199. package/dist/esm/utils/docs-links.js +2 -0
  200. package/dist/esm/utils/docs-links.js.map +1 -0
  201. package/dist/esm/utils/dotenv.helpers.js +3 -7
  202. package/dist/esm/utils/dotenv.helpers.js.map +1 -1
  203. package/dist/esm/utils/dynamic-loader.js +6 -5
  204. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  205. package/dist/esm/utils/features/api.features.js +46 -27
  206. package/dist/esm/utils/features/api.features.js.map +1 -1
  207. package/dist/esm/utils/features/port-and-host-allocator.js +4 -3
  208. package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
  209. package/dist/esm/utils/helpers/api.features.helpers.js +20 -0
  210. package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
  211. package/dist/esm/utils/helpers/arkos-config.helpers.js +60 -24
  212. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  213. package/dist/esm/utils/helpers/exit-error.js +1 -0
  214. package/dist/esm/utils/helpers/exit-error.js.map +1 -1
  215. package/dist/esm/utils/helpers/fs.helpers.js +25 -32
  216. package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
  217. package/dist/esm/utils/helpers/global.helpers.js +1 -1
  218. package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
  219. package/dist/esm/utils/helpers/prisma.helpers.js +10 -7
  220. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
  221. package/dist/esm/utils/helpers/query-parser.helpers.js +7 -22
  222. package/dist/esm/utils/helpers/query-parser.helpers.js.map +1 -1
  223. package/dist/esm/utils/helpers/routers.helpers.js +2 -2
  224. package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
  225. package/dist/esm/utils/helpers/url-helpers.js +11 -0
  226. package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
  227. package/dist/esm/utils/initialize-app.js +43 -17
  228. package/dist/esm/utils/initialize-app.js.map +1 -1
  229. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +154 -226
  230. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  231. package/dist/esm/utils/prisma/prisma-schema-parser.js +37 -11
  232. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  233. package/dist/esm/utils/prisma/types.js.map +1 -1
  234. package/dist/esm/utils/remove-dir.js +1 -1
  235. package/dist/esm/utils/remove-dir.js.map +1 -1
  236. package/dist/esm/utils/setup-app.js +59 -42
  237. package/dist/esm/utils/setup-app.js.map +1 -1
  238. package/dist/esm/utils/validate-schema.js +25 -23
  239. package/dist/esm/utils/validate-schema.js.map +1 -1
  240. package/dist/types/app.d.ts +15 -10
  241. package/dist/types/components/arkos-gateway/arkos-gateway.d.ts +135 -0
  242. package/dist/types/components/arkos-gateway/socket-extensions.d.ts +80 -0
  243. package/dist/types/components/arkos-gateway/types.d.ts +467 -0
  244. package/dist/types/components/arkos-gateway/utils/helpers.d.ts +9 -0
  245. package/dist/types/components/arkos-gateway/utils/memory-gateway-store.d.ts +14 -0
  246. package/dist/types/components/arkos-gateway/utils/multi-tier-arkos-gateway-store.d.ts +20 -0
  247. package/dist/types/components/arkos-gateway/utils/rate-limiter.d.ts +11 -0
  248. package/dist/types/components/arkos-route-hook/index.d.ts +13 -6
  249. package/dist/types/components/arkos-route-hook/reader.d.ts +4 -7
  250. package/dist/types/components/arkos-route-hook/types.d.ts +12 -5
  251. package/dist/types/exports/error-handler/index.d.ts +1 -0
  252. package/dist/types/exports/file-upload.d.ts +1 -0
  253. package/dist/types/exports/index.d.ts +4 -5
  254. package/dist/types/exports/middlewares/index.d.ts +1 -1
  255. package/dist/types/exports/services/index.d.ts +3 -3
  256. package/dist/types/exports/websockets.d.ts +5 -0
  257. package/dist/types/modules/auth/auth.controller.d.ts +10 -3
  258. package/dist/types/modules/auth/auth.service.d.ts +170 -51
  259. package/dist/types/modules/auth/auth.types.d.ts +72 -0
  260. package/dist/types/modules/auth/utils/auth-hooks-manager.d.ts +63 -0
  261. package/dist/types/modules/auth/utils/auth-openapi-generator.d.ts +9 -0
  262. package/dist/types/modules/auth/utils/auth-prisma-json-schema-generator.d.ts +13 -0
  263. package/dist/types/modules/auth/utils/docs-links.d.ts +3 -0
  264. package/dist/types/modules/auth/utils/helpers/auth.controller.helpers.d.ts +1 -0
  265. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +2 -2
  266. package/dist/types/modules/auth/utils/token-extraction.d.ts +53 -0
  267. package/dist/types/modules/base/base.controller.d.ts +7 -6
  268. package/dist/types/modules/base/base.middlewares.d.ts +3 -9
  269. package/dist/types/modules/base/base.service.d.ts +18 -26
  270. package/dist/types/modules/base/types/base.service.types.d.ts +11 -0
  271. package/dist/types/modules/base/utils/error-prettifier.d.ts +8 -0
  272. package/dist/types/modules/base/utils/helpers/base.service.helpers.d.ts +1 -1
  273. package/dist/types/modules/base/utils/model-openapi-generator.d.ts +12 -0
  274. package/dist/types/modules/email/email.service.d.ts +3 -1
  275. package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
  276. package/dist/types/modules/error-handler/utils/catch-async.d.ts +2 -2
  277. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +2 -27
  278. package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
  279. package/dist/types/modules/error-handler/utils/get-handled-error.d.ts +1 -0
  280. package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
  281. package/dist/types/modules/file-upload/file-upload.controller.d.ts +7 -2
  282. package/dist/types/modules/file-upload/file-upload.service.d.ts +2 -6
  283. package/dist/types/modules/file-upload/utils/file-upload-json-schema-generator.d.ts +12 -0
  284. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +21 -1
  285. package/dist/types/modules/file-upload/utils/helpers/serve-upload-dir.d.ts +43 -0
  286. package/dist/types/modules/file-upload/utils/helpers/upload-path.helper.d.ts +14 -0
  287. package/dist/types/modules/file-upload/utils/helpers/upload-serving-validation.d.ts +5 -0
  288. package/dist/types/modules/file-upload/utils/helpers/upload-serving.registry.d.ts +31 -0
  289. package/dist/types/modules/swagger/swagger.router.d.ts +1 -2
  290. package/dist/types/modules/swagger/utils/get-open-api-login-html.d.ts +1 -0
  291. package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +48 -3
  292. package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +8 -3
  293. package/dist/types/types/arkos-config/utils.d.ts +68 -0
  294. package/dist/types/types/arkos-prisma-input.d.ts +7 -3
  295. package/dist/types/types/arkos.d.ts +5 -15
  296. package/dist/types/types/auth.d.ts +4 -4
  297. package/dist/types/types/index.d.ts +15 -58
  298. package/dist/types/types/internal.d.ts +25 -0
  299. package/dist/types/types/new-arkos-config.d.ts +374 -67
  300. package/dist/types/types/router-config.d.ts +3 -66
  301. package/dist/types/types/upload.d.ts +45 -0
  302. package/dist/types/types/validation/validation-manager.d.ts +25 -0
  303. package/dist/types/types/validation/validator.d.ts +2 -0
  304. package/dist/types/utils/arkos-router/arkos-router-openapi-manager.d.ts +14 -1
  305. package/dist/types/utils/arkos-router/index.d.ts +86 -11
  306. package/dist/types/utils/arkos-router/types/index.d.ts +83 -31
  307. package/dist/types/utils/arkos-router/types/openapi-config.d.ts +3 -2
  308. package/dist/types/utils/arkos-router/types/upload-config.d.ts +158 -10
  309. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +6 -0
  310. package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +4 -6
  311. package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +21 -36
  312. package/dist/types/utils/bundler.d.ts +1 -1
  313. package/dist/types/utils/cli/build.d.ts +1 -1
  314. package/dist/types/utils/cli/generate.d.ts +15 -6
  315. package/dist/types/utils/cli/start.d.ts +3 -1
  316. package/dist/types/utils/cli/utils/dependency-version-check.d.ts +15 -0
  317. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +11 -0
  318. package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +4 -0
  319. package/dist/types/utils/define-config.d.ts +57 -3
  320. package/dist/types/utils/docs-links.d.ts +1 -0
  321. package/dist/types/utils/dotenv.helpers.d.ts +1 -0
  322. package/dist/types/utils/dynamic-loader.d.ts +2 -2
  323. package/dist/types/utils/features/api.features.d.ts +1 -2
  324. package/dist/types/utils/helpers/arkos-config.helpers.d.ts +9 -1
  325. package/dist/types/utils/helpers/fs.helpers.d.ts +1 -16
  326. package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
  327. package/dist/types/utils/helpers/prisma.helpers.d.ts +1 -1
  328. package/dist/types/utils/helpers/query-parser.helpers.d.ts +1 -1
  329. package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
  330. package/dist/types/utils/initialize-app.d.ts +1 -0
  331. package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +12 -30
  332. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +4 -0
  333. package/dist/types/utils/prisma/types.d.ts +3 -2
  334. package/dist/types/utils/validate-schema.d.ts +1 -1
  335. package/package.json +84 -75
  336. package/dist/cjs/app.js +0 -79
  337. package/dist/cjs/app.js.map +0 -1
  338. package/dist/cjs/components/arkos-loadable-registry/index.js +0 -28
  339. package/dist/cjs/components/arkos-loadable-registry/index.js.map +0 -1
  340. package/dist/cjs/components/arkos-loadable-translator/index.js +0 -144
  341. package/dist/cjs/components/arkos-loadable-translator/index.js.map +0 -1
  342. package/dist/cjs/components/arkos-policy/index.js +0 -36
  343. package/dist/cjs/components/arkos-policy/index.js.map +0 -1
  344. package/dist/cjs/components/arkos-policy/types.js +0 -3
  345. package/dist/cjs/components/arkos-policy/types.js.map +0 -1
  346. package/dist/cjs/components/arkos-route-hook/index.js +0 -50
  347. package/dist/cjs/components/arkos-route-hook/index.js.map +0 -1
  348. package/dist/cjs/components/arkos-route-hook/reader.js +0 -47
  349. package/dist/cjs/components/arkos-route-hook/reader.js.map +0 -1
  350. package/dist/cjs/components/arkos-route-hook/types.js +0 -3
  351. package/dist/cjs/components/arkos-route-hook/types.js.map +0 -1
  352. package/dist/cjs/components/arkos-service-hook/index.js +0 -35
  353. package/dist/cjs/components/arkos-service-hook/index.js.map +0 -1
  354. package/dist/cjs/components/arkos-service-hook/reader.js +0 -30
  355. package/dist/cjs/components/arkos-service-hook/reader.js.map +0 -1
  356. package/dist/cjs/components/arkos-service-hook/types.js +0 -3
  357. package/dist/cjs/components/arkos-service-hook/types.js.map +0 -1
  358. package/dist/cjs/exports/auth/index.js +0 -6
  359. package/dist/cjs/exports/auth/index.js.map +0 -1
  360. package/dist/cjs/exports/config.js +0 -6
  361. package/dist/cjs/exports/config.js.map +0 -1
  362. package/dist/cjs/exports/controllers/index.js +0 -42
  363. package/dist/cjs/exports/controllers/index.js.map +0 -1
  364. package/dist/cjs/exports/error-handler/index.js +0 -11
  365. package/dist/cjs/exports/error-handler/index.js.map +0 -1
  366. package/dist/cjs/exports/index.js +0 -23
  367. package/dist/cjs/exports/index.js.map +0 -1
  368. package/dist/cjs/exports/middlewares/index.js +0 -7
  369. package/dist/cjs/exports/middlewares/index.js.map +0 -1
  370. package/dist/cjs/exports/prisma/index.js +0 -13
  371. package/dist/cjs/exports/prisma/index.js.map +0 -1
  372. package/dist/cjs/exports/services/index.js +0 -53
  373. package/dist/cjs/exports/services/index.js.map +0 -1
  374. package/dist/cjs/exports/utils/index.js +0 -26
  375. package/dist/cjs/exports/utils/index.js.map +0 -1
  376. package/dist/cjs/exports/validation/index.js +0 -11
  377. package/dist/cjs/exports/validation/index.js.map +0 -1
  378. package/dist/cjs/generated.js +0 -7
  379. package/dist/cjs/generated.js.map +0 -1
  380. package/dist/cjs/modules/auth/auth.controller.js +0 -254
  381. package/dist/cjs/modules/auth/auth.controller.js.map +0 -1
  382. package/dist/cjs/modules/auth/auth.router.js +0 -113
  383. package/dist/cjs/modules/auth/auth.router.js.map +0 -1
  384. package/dist/cjs/modules/auth/auth.service.js +0 -277
  385. package/dist/cjs/modules/auth/auth.service.js.map +0 -1
  386. package/dist/cjs/modules/auth/utils/auth-error-objects.js +0 -10
  387. package/dist/cjs/modules/auth/utils/auth-error-objects.js.map +0 -1
  388. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js +0 -83
  389. package/dist/cjs/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
  390. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +0 -150
  391. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +0 -1
  392. package/dist/cjs/modules/base/base.controller.js +0 -275
  393. package/dist/cjs/modules/base/base.controller.js.map +0 -1
  394. package/dist/cjs/modules/base/base.middlewares.js +0 -231
  395. package/dist/cjs/modules/base/base.middlewares.js.map +0 -1
  396. package/dist/cjs/modules/base/base.router.js +0 -112
  397. package/dist/cjs/modules/base/base.router.js.map +0 -1
  398. package/dist/cjs/modules/base/base.service.js +0 -432
  399. package/dist/cjs/modules/base/base.service.js.map +0 -1
  400. package/dist/cjs/modules/base/types/base.service.types.js +0 -3
  401. package/dist/cjs/modules/base/types/base.service.types.js.map +0 -1
  402. package/dist/cjs/modules/base/utils/error-prettifier.js +0 -188
  403. package/dist/cjs/modules/base/utils/error-prettifier.js.map +0 -1
  404. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js +0 -49
  405. package/dist/cjs/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
  406. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +0 -13
  407. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  408. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +0 -222
  409. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
  410. package/dist/cjs/modules/base/utils/router-validator.js +0 -13
  411. package/dist/cjs/modules/base/utils/router-validator.js.map +0 -1
  412. package/dist/cjs/modules/base/utils/service-hooks-manager.js +0 -19
  413. package/dist/cjs/modules/base/utils/service-hooks-manager.js.map +0 -1
  414. package/dist/cjs/modules/debugger/debugger.service.js +0 -59
  415. package/dist/cjs/modules/debugger/debugger.service.js.map +0 -1
  416. package/dist/cjs/modules/email/email.service.js +0 -106
  417. package/dist/cjs/modules/email/email.service.js.map +0 -1
  418. package/dist/cjs/modules/error-handler/error-handler.controller.js +0 -192
  419. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +0 -1
  420. package/dist/cjs/modules/error-handler/utils/app-error.js +0 -28
  421. package/dist/cjs/modules/error-handler/utils/app-error.js.map +0 -1
  422. package/dist/cjs/modules/error-handler/utils/catch-async.js +0 -21
  423. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +0 -1
  424. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +0 -218
  425. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  426. package/dist/cjs/modules/file-upload/file-upload.controller.js +0 -256
  427. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +0 -1
  428. package/dist/cjs/modules/file-upload/file-upload.router.js +0 -80
  429. package/dist/cjs/modules/file-upload/file-upload.router.js.map +0 -1
  430. package/dist/cjs/modules/file-upload/file-upload.service.js +0 -343
  431. package/dist/cjs/modules/file-upload/file-upload.service.js.map +0 -1
  432. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +0 -134
  433. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +0 -1
  434. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -100
  435. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  436. package/dist/cjs/modules/swagger/swagger.router.js +0 -65
  437. package/dist/cjs/modules/swagger/swagger.router.js.map +0 -1
  438. package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js +0 -7
  439. package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js.map +0 -1
  440. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +0 -53
  441. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +0 -1
  442. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +0 -473
  443. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +0 -1
  444. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +0 -491
  445. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +0 -1
  446. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +0 -73
  447. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +0 -1
  448. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +0 -37
  449. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +0 -1
  450. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -61
  451. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +0 -1
  452. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +0 -31
  453. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +0 -1
  454. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +0 -49
  455. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +0 -1
  456. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +0 -39
  457. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +0 -1
  458. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +0 -468
  459. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +0 -1
  460. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +0 -260
  461. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +0 -1
  462. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +0 -331
  463. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +0 -1
  464. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +0 -109
  465. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +0 -1
  466. package/dist/cjs/package.json +0 -3
  467. package/dist/cjs/server.js +0 -60
  468. package/dist/cjs/server.js.map +0 -1
  469. package/dist/cjs/types/arkos-prisma-input.js +0 -3
  470. package/dist/cjs/types/arkos-prisma-input.js.map +0 -1
  471. package/dist/cjs/types/arkos.js +0 -3
  472. package/dist/cjs/types/arkos.js.map +0 -1
  473. package/dist/cjs/types/auth.js +0 -3
  474. package/dist/cjs/types/auth.js.map +0 -1
  475. package/dist/cjs/types/index.js +0 -3
  476. package/dist/cjs/types/index.js.map +0 -1
  477. package/dist/cjs/types/new-arkos-config.js +0 -3
  478. package/dist/cjs/types/new-arkos-config.js.map +0 -1
  479. package/dist/cjs/types/router-config.js +0 -3
  480. package/dist/cjs/types/router-config.js.map +0 -1
  481. package/dist/cjs/utils/arkos-env.js +0 -9
  482. package/dist/cjs/utils/arkos-env.js.map +0 -1
  483. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +0 -126
  484. package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +0 -1
  485. package/dist/cjs/utils/arkos-router/index.js +0 -253
  486. package/dist/cjs/utils/arkos-router/index.js.map +0 -1
  487. package/dist/cjs/utils/arkos-router/route-config-registry.js +0 -16
  488. package/dist/cjs/utils/arkos-router/route-config-registry.js.map +0 -1
  489. package/dist/cjs/utils/arkos-router/route-config-validator.js +0 -56
  490. package/dist/cjs/utils/arkos-router/route-config-validator.js.map +0 -1
  491. package/dist/cjs/utils/arkos-router/types/body-parser-config.js +0 -3
  492. package/dist/cjs/utils/arkos-router/types/body-parser-config.js.map +0 -1
  493. package/dist/cjs/utils/arkos-router/types/index.js +0 -3
  494. package/dist/cjs/utils/arkos-router/types/index.js.map +0 -1
  495. package/dist/cjs/utils/arkos-router/types/openapi-config.js +0 -3
  496. package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +0 -1
  497. package/dist/cjs/utils/arkos-router/types/upload-config.js +0 -3
  498. package/dist/cjs/utils/arkos-router/types/upload-config.js.map +0 -1
  499. package/dist/cjs/utils/arkos-router/utils/helpers/index.js +0 -163
  500. package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +0 -1
  501. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +0 -283
  502. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +0 -1
  503. package/dist/cjs/utils/bundler.js +0 -163
  504. package/dist/cjs/utils/bundler.js.map +0 -1
  505. package/dist/cjs/utils/cli/build.js +0 -200
  506. package/dist/cjs/utils/cli/build.js.map +0 -1
  507. package/dist/cjs/utils/cli/dev.js +0 -128
  508. package/dist/cjs/utils/cli/dev.js.map +0 -1
  509. package/dist/cjs/utils/cli/export-auth-action.js +0 -79
  510. package/dist/cjs/utils/cli/export-auth-action.js.map +0 -1
  511. package/dist/cjs/utils/cli/generate.js +0 -229
  512. package/dist/cjs/utils/cli/generate.js.map +0 -1
  513. package/dist/cjs/utils/cli/index.js +0 -191
  514. package/dist/cjs/utils/cli/index.js.map +0 -1
  515. package/dist/cjs/utils/cli/prisma-generate.js +0 -112
  516. package/dist/cjs/utils/cli/prisma-generate.js.map +0 -1
  517. package/dist/cjs/utils/cli/start.js +0 -72
  518. package/dist/cjs/utils/cli/start.js.map +0 -1
  519. package/dist/cjs/utils/cli/utils/cli.helpers.js +0 -24
  520. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +0 -1
  521. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +0 -114
  522. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +0 -1
  523. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js +0 -73
  524. package/dist/cjs/utils/cli/utils/smart-fs-watcher.js.map +0 -1
  525. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +0 -550
  526. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +0 -1
  527. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -52
  528. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
  529. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +0 -139
  530. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +0 -1
  531. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +0 -53
  532. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +0 -1
  533. package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -39
  534. package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
  535. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +0 -19
  536. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +0 -1
  537. package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -32
  538. package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
  539. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +0 -50
  540. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +0 -1
  541. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +0 -351
  542. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +0 -1
  543. package/dist/cjs/utils/cli/utils/template-generators.js +0 -52
  544. package/dist/cjs/utils/cli/utils/template-generators.js.map +0 -1
  545. package/dist/cjs/utils/cli/utils/watermark-stamper.js +0 -26
  546. package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +0 -1
  547. package/dist/cjs/utils/define-config.js +0 -46
  548. package/dist/cjs/utils/define-config.js.map +0 -1
  549. package/dist/cjs/utils/dotenv.helpers.js +0 -52
  550. package/dist/cjs/utils/dotenv.helpers.js.map +0 -1
  551. package/dist/cjs/utils/dynamic-loader.js +0 -22
  552. package/dist/cjs/utils/dynamic-loader.js.map +0 -1
  553. package/dist/cjs/utils/expand-env.js +0 -72
  554. package/dist/cjs/utils/expand-env.js.map +0 -1
  555. package/dist/cjs/utils/features/api.features.js +0 -201
  556. package/dist/cjs/utils/features/api.features.js.map +0 -1
  557. package/dist/cjs/utils/features/port-and-host-allocator.js +0 -129
  558. package/dist/cjs/utils/features/port-and-host-allocator.js.map +0 -1
  559. package/dist/cjs/utils/helpers/api.features.helpers.js +0 -327
  560. package/dist/cjs/utils/helpers/api.features.helpers.js.map +0 -1
  561. package/dist/cjs/utils/helpers/arkos-config.helpers.js +0 -86
  562. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +0 -1
  563. package/dist/cjs/utils/helpers/change-case.helpers.js +0 -177
  564. package/dist/cjs/utils/helpers/change-case.helpers.js.map +0 -1
  565. package/dist/cjs/utils/helpers/deepmerge.helper.js +0 -115
  566. package/dist/cjs/utils/helpers/deepmerge.helper.js.map +0 -1
  567. package/dist/cjs/utils/helpers/exit-error.js +0 -12
  568. package/dist/cjs/utils/helpers/exit-error.js.map +0 -1
  569. package/dist/cjs/utils/helpers/fs.helpers.js +0 -60
  570. package/dist/cjs/utils/helpers/fs.helpers.js.map +0 -1
  571. package/dist/cjs/utils/helpers/global.helpers.js +0 -105
  572. package/dist/cjs/utils/helpers/global.helpers.js.map +0 -1
  573. package/dist/cjs/utils/helpers/prisma.helpers.js +0 -53
  574. package/dist/cjs/utils/helpers/prisma.helpers.js.map +0 -1
  575. package/dist/cjs/utils/helpers/query-parser.helpers.js +0 -69
  576. package/dist/cjs/utils/helpers/query-parser.helpers.js.map +0 -1
  577. package/dist/cjs/utils/helpers/routers.helpers.js +0 -36
  578. package/dist/cjs/utils/helpers/routers.helpers.js.map +0 -1
  579. package/dist/cjs/utils/helpers/text.helpers.js +0 -28
  580. package/dist/cjs/utils/helpers/text.helpers.js.map +0 -1
  581. package/dist/cjs/utils/initialize-app.js +0 -55
  582. package/dist/cjs/utils/initialize-app.js.map +0 -1
  583. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +0 -437
  584. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +0 -1
  585. package/dist/cjs/utils/prisma/prisma-schema-parser.js +0 -360
  586. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +0 -1
  587. package/dist/cjs/utils/prisma/types.js +0 -3
  588. package/dist/cjs/utils/prisma/types.js.map +0 -1
  589. package/dist/cjs/utils/remove-dir.js +0 -14
  590. package/dist/cjs/utils/remove-dir.js.map +0 -1
  591. package/dist/cjs/utils/setup-app.js +0 -119
  592. package/dist/cjs/utils/setup-app.js.map +0 -1
  593. package/dist/cjs/utils/sheu.js +0 -131
  594. package/dist/cjs/utils/sheu.js.map +0 -1
  595. package/dist/cjs/utils/validate-dto.js +0 -19
  596. package/dist/cjs/utils/validate-dto.js.map +0 -1
  597. package/dist/cjs/utils/validate-schema.js +0 -75
  598. package/dist/cjs/utils/validate-schema.js.map +0 -1
  599. package/dist/esm/components/arkos-loadable-translator/index.js +0 -138
  600. package/dist/esm/components/arkos-loadable-translator/index.js.map +0 -1
  601. package/dist/esm/components/arkos-service-hook/index.js +0 -32
  602. package/dist/esm/components/arkos-service-hook/index.js.map +0 -1
  603. package/dist/esm/components/arkos-service-hook/reader.js +0 -24
  604. package/dist/esm/components/arkos-service-hook/reader.js.map +0 -1
  605. package/dist/esm/components/arkos-service-hook/types.js +0 -2
  606. package/dist/esm/components/arkos-service-hook/types.js.map +0 -1
  607. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +0 -10
  608. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  609. package/dist/esm/modules/base/utils/service-hooks-manager.js +0 -17
  610. package/dist/esm/modules/base/utils/service-hooks-manager.js.map +0 -1
  611. package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js +0 -5
  612. package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js.map +0 -1
  613. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +0 -469
  614. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +0 -1
  615. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +0 -485
  616. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +0 -1
  617. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js +0 -34
  618. package/dist/esm/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +0 -1
  619. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +0 -55
  620. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +0 -1
  621. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +0 -25
  622. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +0 -1
  623. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js +0 -46
  624. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.js.map +0 -1
  625. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +0 -33
  626. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +0 -1
  627. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +0 -462
  628. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +0 -1
  629. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +0 -255
  630. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +0 -1
  631. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +0 -98
  632. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +0 -1
  633. package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -36
  634. package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
  635. package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -29
  636. package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
  637. package/dist/types/components/arkos-loadable-translator/index.d.ts +0 -53
  638. package/dist/types/components/arkos-service-hook/index.d.ts +0 -41
  639. package/dist/types/components/arkos-service-hook/reader.d.ts +0 -35
  640. package/dist/types/components/arkos-service-hook/types.d.ts +0 -240
  641. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +0 -3
  642. package/dist/types/modules/base/utils/service-hooks-manager.d.ts +0 -10
  643. package/dist/types/modules/swagger/utils/built-in-route-path-object-manager.d.ts +0 -4
  644. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +0 -5
  645. package/dist/types/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.d.ts +0 -3
  646. package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +0 -2
  647. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +0 -1
  648. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +0 -1
  649. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-system-json-schemas.d.ts +0 -4
  650. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.d.ts +0 -1
  651. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +0 -2
  652. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +0 -76
  653. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +0 -19
  654. package/dist/types/utils/cli/utils/template-generator/templates/route-hook.template.d.ts +0 -2
  655. package/dist/types/utils/cli/utils/template-generator/templates/service-hook.template.d.ts +0 -2
@@ -9,18 +9,39 @@ import ArkosRouter from "../../utils/arkos-router/index.js";
9
9
  import loadableRegistry from "../../components/arkos-loadable-registry/index.js";
10
10
  import { routeHookReader, } from "../../components/arkos-route-hook/reader.js";
11
11
  import { getArkosConfig } from "../../server.js";
12
+ import fileUploadJsonSchemaGenerator from "./utils/file-upload-json-schema-generator.js";
13
+ import AppError from "../error-handler/utils/app-error.js";
14
+ import { DEFAULT_UPLOAD_DIRS } from "./utils/helpers/upload-path.helper.js";
15
+ import { uploadServingRegistry } from "./utils/helpers/upload-serving.registry.js";
12
16
  export function getFileUploadRouter() {
13
17
  const router = ArkosRouter();
14
- const { fileUpload } = getArkosConfig();
18
+ const { fileUpload, globalPrefix } = getArkosConfig();
19
+ if (fileUpload?.enabled === false) {
20
+ uploadServingRegistry.setFindFileServingEnabled(false);
21
+ return router;
22
+ }
15
23
  const routeHook = loadableRegistry.getItem("ArkosRouteHook", "file-upload");
16
- const op = (operation) => routeHook
17
- ? routeHookReader.forOperation("file-upload", operation)
18
- : {
19
- before: [],
20
- after: [],
21
- onError: [],
22
- routeConfig: {},
23
- };
24
+ const op = (operation) => {
25
+ let components = routeHook
26
+ ? routeHookReader.forOperation("file-upload", operation)
27
+ : {
28
+ before: [],
29
+ after: [],
30
+ onError: [],
31
+ routeConfig: {},
32
+ };
33
+ let endpointConfig = components.routeConfig || {};
34
+ if (endpointConfig?.experimental?.openapi !== false)
35
+ endpointConfig = {
36
+ ...(endpointConfig || {}),
37
+ experimental: {
38
+ ...(endpointConfig?.experimental || {}),
39
+ openapi: fileUploadJsonSchemaGenerator.getOpenApiConfig(endpointConfig, operation),
40
+ },
41
+ };
42
+ components.routeConfig = endpointConfig;
43
+ return components;
44
+ };
24
45
  let basePathname = fileUpload?.baseRoute || "/api/uploads/";
25
46
  if (!basePathname.startsWith("/"))
26
47
  basePathname = "/" + basePathname;
@@ -28,22 +49,40 @@ export function getFileUploadRouter() {
28
49
  basePathname = basePathname + "/";
29
50
  {
30
51
  const { before, onError, routeConfig } = op("findFile");
52
+ const servingMode = fileUpload?.serving || "all";
53
+ uploadServingRegistry.setFindFileServingEnabled(!routeConfig?.disabled);
31
54
  const baseUploadDirFullPath = path.resolve(path
32
55
  .join(process.cwd(), fileUpload?.baseUploadDir || "uploads")
33
56
  .replaceAll("//", "/"));
34
57
  router.get({
35
58
  authentication: { action: "View", resource: "file-upload" },
36
59
  ...routeConfig,
37
- path: `${basePathname}*`,
38
- }, ...processMiddleware(before), adjustRequestUrl, express.static(baseUploadDirFullPath, deepmerge({
60
+ path: servingMode === "registered"
61
+ ? `${basePathname}:fileType/*slug`
62
+ : `${basePathname}*slug`,
63
+ }, ...processMiddleware(before), adjustRequestUrl, ...(servingMode === "registered"
64
+ ? [
65
+ (req, _res, next) => {
66
+ if (!DEFAULT_UPLOAD_DIRS.includes(req.params.fileType))
67
+ return next(new AppError(`File ${req.path} was not found`, 404, "FileNotFound", { filepath: req.path }));
68
+ next();
69
+ },
70
+ ]
71
+ : []), express.static(baseUploadDirFullPath, deepmerge({
39
72
  maxAge: "1y",
40
73
  etag: true,
41
74
  lastModified: true,
42
75
  dotfiles: "ignore",
43
- fallthrough: true,
76
+ fallthrough: false,
44
77
  index: false,
45
78
  cacheControl: true,
46
- }, fileUpload?.expressStatic || {})), ...processMiddleware(onError, { type: "error" }));
79
+ }, fileUpload?.expressStatic || {})), (err, req, _res, next) => {
80
+ if (err.code === "ENOENT") {
81
+ const filepath = req.path.replace(`${globalPrefix}/${fileUpload?.baseRoute}`.replace("//", "/"), "");
82
+ throw new AppError(`File ${filepath} was not found`, 404, "FileNotFound", { filepath });
83
+ }
84
+ next(err);
85
+ }, ...processMiddleware(onError, { type: "error" }));
47
86
  }
48
87
  {
49
88
  const { before, after, onError, routeConfig } = op("uploadFile");
@@ -58,7 +97,7 @@ export function getFileUploadRouter() {
58
97
  router.patch({
59
98
  authentication: { action: "Update", resource: "file-upload" },
60
99
  ...routeConfig,
61
- path: `${basePathname}:fileType/:fileName`,
100
+ path: `${basePathname}:fileType/*fileName`,
62
101
  }, ...processMiddleware(before), fileUploadController.updateFile, ...processMiddleware(after), sendResponse, ...processMiddleware(onError, { type: "error" }));
63
102
  }
64
103
  {
@@ -66,7 +105,7 @@ export function getFileUploadRouter() {
66
105
  router.delete({
67
106
  authentication: { action: "Delete", resource: "file-upload" },
68
107
  ...routeConfig,
69
- path: `${basePathname}:fileType/:fileName`,
108
+ path: `${basePathname}:fileType/*fileName`,
70
109
  }, ...processMiddleware(before), fileUploadController.deleteFile, ...processMiddleware(after), sendResponse, ...processMiddleware(onError, { type: "error" }));
71
110
  }
72
111
  return router;
@@ -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 fileUploadController from \"./file-upload.controller\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\nimport path from \"path\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n OperationByModule,\n routeHookReader,\n} from \"../../components/arkos-route-hook/reader\";\nimport { getArkosConfig } from \"../../server\";\n\nexport function getFileUploadRouter() {\n const router = ArkosRouter();\n const { fileUpload } = getArkosConfig();\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"file-upload\");\n\n const op = (operation: OperationByModule<\"file-upload\">) =>\n routeHook\n ? routeHookReader.forOperation(\"file-upload\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n routeConfig: {},\n };\n\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // FIND FILE\n {\n const { before, onError, routeConfig } = op(\"findFile\");\n const baseUploadDirFullPath = path.resolve(\n path\n .join(process.cwd(), fileUpload?.baseUploadDir || \"uploads\")\n .replaceAll(\"//\", \"/\")\n );\n router.get(\n {\n authentication: { action: \"View\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}*`,\n },\n ...processMiddleware(before),\n adjustRequestUrl,\n express.static(\n baseUploadDirFullPath,\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?.expressStatic || {}\n )\n ),\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // UPLOAD FILE\n {\n const { before, after, onError, routeConfig } = op(\"uploadFile\");\n router.post(\n {\n authentication: { action: \"Create\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType`,\n },\n ...processMiddleware(before),\n fileUploadController.uploadFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // UPDATE FILE\n {\n const { before, after, onError, routeConfig } = op(\"updateFile\");\n router.patch(\n {\n authentication: { action: \"Update\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType/:fileName`,\n },\n ...processMiddleware(before),\n fileUploadController.updateFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE FILE\n {\n const { before, after, onError, routeConfig } = op(\"deleteFile\");\n router.delete(\n {\n authentication: { action: \"Delete\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType/:fileName`,\n },\n ...processMiddleware(before),\n fileUploadController.deleteFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\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 fileUploadController from \"./file-upload.controller\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport { processMiddleware } from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../exports\";\nimport path from \"path\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport loadableRegistry from \"../../components/arkos-loadable-registry\";\nimport {\n OperationByModule,\n routeHookReader,\n} from \"../../components/arkos-route-hook/reader\";\nimport { getArkosConfig } from \"../../server\";\nimport fileUploadJsonSchemaGenerator from \"./utils/file-upload-json-schema-generator\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { DEFAULT_UPLOAD_DIRS } from \"./utils/helpers/upload-path.helper\";\nimport { uploadServingRegistry } from \"./utils/helpers/upload-serving.registry\";\n\nexport function getFileUploadRouter() {\n const router = ArkosRouter();\n const { fileUpload, globalPrefix } = getArkosConfig();\n\n if (fileUpload?.enabled === false) {\n uploadServingRegistry.setFindFileServingEnabled(false);\n return router;\n }\n\n const routeHook = loadableRegistry.getItem(\"ArkosRouteHook\", \"file-upload\");\n\n const op = (operation: OperationByModule<\"file-upload\">) => {\n let components = routeHook\n ? routeHookReader.forOperation(\"file-upload\", operation)\n : {\n before: [],\n after: [],\n onError: [],\n routeConfig: {},\n };\n\n let endpointConfig = components.routeConfig || {};\n if (endpointConfig?.experimental?.openapi !== false)\n endpointConfig = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: fileUploadJsonSchemaGenerator.getOpenApiConfig(\n endpointConfig,\n operation\n ),\n },\n };\n\n components.routeConfig = endpointConfig;\n return components;\n };\n\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // FIND FILE\n {\n const { before, onError, routeConfig } = op(\"findFile\");\n const servingMode = fileUpload?.serving || \"all\";\n uploadServingRegistry.setFindFileServingEnabled(!routeConfig?.disabled);\n const baseUploadDirFullPath = path.resolve(\n path\n .join(process.cwd(), fileUpload?.baseUploadDir || \"uploads\")\n .replaceAll(\"//\", \"/\")\n );\n router.get(\n {\n authentication: { action: \"View\", resource: \"file-upload\" },\n ...routeConfig,\n path:\n servingMode === \"registered\"\n ? `${basePathname}:fileType/*slug`\n : `${basePathname}*slug`,\n },\n ...processMiddleware(before),\n adjustRequestUrl,\n ...(servingMode === \"registered\"\n ? [\n (req: ArkosRequest, _res: ArkosResponse, next: ArkosNextFunction) => {\n if (\n !(DEFAULT_UPLOAD_DIRS as readonly string[]).includes(\n req.params.fileType\n )\n )\n return next(\n new AppError(\n `File ${req.path} was not found`,\n 404,\n \"FileNotFound\",\n { filepath: req.path }\n )\n );\n\n next();\n },\n ]\n : []),\n express.static(\n baseUploadDirFullPath,\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: false,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStatic || {}\n )\n ),\n (\n err: any,\n req: ArkosRequest,\n _res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (err.code === \"ENOENT\") {\n const filepath = req.path.replace(\n `${globalPrefix}/${fileUpload?.baseRoute}`.replace(\"//\", \"/\"),\n \"\"\n );\n throw new AppError(\n `File ${filepath} was not found`,\n 404,\n \"FileNotFound\",\n { filepath }\n );\n }\n\n next(err);\n },\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // UPLOAD FILE\n {\n const { before, after, onError, routeConfig } = op(\"uploadFile\");\n router.post(\n {\n authentication: { action: \"Create\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType`,\n },\n ...processMiddleware(before),\n fileUploadController.uploadFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // UPDATE FILE\n {\n const { before, after, onError, routeConfig } = op(\"updateFile\");\n router.patch(\n {\n authentication: { action: \"Update\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType/*fileName`,\n },\n ...processMiddleware(before),\n fileUploadController.updateFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n // DELETE FILE\n {\n const { before, after, onError, routeConfig } = op(\"deleteFile\");\n router.delete(\n {\n authentication: { action: \"Delete\", resource: \"file-upload\" },\n ...routeConfig,\n path: `${basePathname}:fileType/*fileName`,\n },\n ...processMiddleware(before),\n fileUploadController.deleteFile,\n ...processMiddleware(after),\n sendResponse,\n ...processMiddleware(onError, { type: \"error\" })\n );\n }\n\n return router;\n}\n"]}
@@ -5,10 +5,24 @@ import AppError from "../error-handler/utils/app-error.js";
5
5
  import { promisify } from "util";
6
6
  import { getArkosConfig } from "../../server.js";
7
7
  import deepmerge from "../../utils/helpers/deepmerge.helper.js";
8
- import { processFile, processImage } from "./utils/helpers/file-upload.helpers.js";
8
+ import { processFile, processImage, } from "./utils/helpers/file-upload.helpers.js";
9
9
  import { removeBothSlashes } from "../../utils/helpers/text.helpers.js";
10
10
  import { pascalCase } from "../../exports/utils/index.js";
11
+ import { resolveUploadPath } from "./utils/helpers/upload-path.helper.js";
12
+ function decodeUploadFileName(fileName) {
13
+ try {
14
+ return decodeURIComponent(fileName);
15
+ }
16
+ catch {
17
+ return fileName;
18
+ }
19
+ }
11
20
  export class FileUploadService {
21
+ uploadDir;
22
+ fileSizeLimit;
23
+ allowedFileTypes;
24
+ storage;
25
+ maxCount;
12
26
  handleUploadError(err, next) {
13
27
  if (err instanceof MulterError)
14
28
  return next(new AppError(err.message, 400, pascalCase(err.code || "FileUploadError")));
@@ -16,13 +30,6 @@ export class FileUploadService {
16
30
  return next(err);
17
31
  }
18
32
  constructor(uploadDir, fileSizeLimit = 1024 * 1024 * 5, allowedFileTypes = /.*/, maxCount = 30) {
19
- this.fileFilter = (_, file, cb) => {
20
- const extName = this.allowedFileTypes.test(path.extname(file.originalname).toLowerCase());
21
- if (extName)
22
- cb(null, true);
23
- else
24
- cb(new AppError(`File type not allowed, allowed files are ${String(this.allowedFileTypes).replaceAll("/", "").split("|").join(", ")}`, 400, "FileTypeNotAllowed", { filename: file.originalname }));
25
- };
26
33
  uploadDir = uploadDir.startsWith("/") ? uploadDir.substring(1) : uploadDir;
27
34
  uploadDir = uploadDir.endsWith("/") ? uploadDir.slice(0, -1) : uploadDir;
28
35
  this.uploadDir = path.resolve(process.cwd(), `${uploadDir}/`);
@@ -42,6 +49,13 @@ export class FileUploadService {
42
49
  },
43
50
  });
44
51
  }
52
+ fileFilter = (_, file, cb) => {
53
+ const extName = this.allowedFileTypes.test(path.extname(file.originalname).toLowerCase());
54
+ if (extName)
55
+ cb(null, true);
56
+ else
57
+ cb(new AppError(`File type not allowed, allowed files are ${String(this.allowedFileTypes).replaceAll("/", "").split("|").join(", ")}`, 400, "FileTypeNotAllowed", { filename: file.originalname }));
58
+ };
45
59
  getUpload() {
46
60
  return multer({
47
61
  storage: this.storage,
@@ -111,37 +125,36 @@ export class FileUploadService {
111
125
  ? pathAfterBaseRoute.substring(1)
112
126
  : pathAfterBaseRoute;
113
127
  const fileTypes = ["images", "videos", "documents", "files"];
114
- let fileType = null;
115
- let fileName = null;
116
- for (const type of fileTypes) {
117
- const typeIndex = cleanPath.indexOf(type + "/");
118
- if (typeIndex !== -1) {
119
- fileType = type;
120
- fileName = cleanPath.substring(typeIndex + type.length + 1);
121
- break;
122
- }
123
- }
124
- if (!fileType || !fileName) {
128
+ const [fileType, ...fileNameSegments] = cleanPath.split("/");
129
+ if (!fileType ||
130
+ !fileTypes.includes(fileType) ||
131
+ fileNameSegments.length === 0) {
125
132
  throw new AppError("Unable to determine file type or file name from URL", 400, "UnableToProcessFileURL");
126
133
  }
134
+ const fileName = fileNameSegments
135
+ .map(decodeUploadFileName)
136
+ .join("/");
127
137
  const { documentUploadService, fileUploadService, imageUploadService, videoUploadService, } = getFileUploadServices();
128
- let filePath;
138
+ let targetService;
129
139
  switch (fileType) {
130
140
  case "images":
131
- filePath = path.join(imageUploadService.uploadDir, fileName);
141
+ targetService = imageUploadService;
132
142
  break;
133
143
  case "videos":
134
- filePath = path.join(videoUploadService.uploadDir, fileName);
144
+ targetService = videoUploadService;
135
145
  break;
136
146
  case "documents":
137
- filePath = path.join(documentUploadService.uploadDir, fileName);
147
+ targetService = documentUploadService;
138
148
  break;
139
149
  case "files":
140
- filePath = path.join(fileUploadService.uploadDir, fileName);
150
+ targetService = fileUploadService;
141
151
  break;
142
152
  default:
143
153
  throw new AppError(`Unsupported file type: ${fileType}`, 400, "UnsupportedFileType");
144
154
  }
155
+ const filePath = resolveUploadPath(targetService.uploadDir, fileName);
156
+ if (!filePath)
157
+ throw new AppError("File not found", 404, "FileNotFound");
145
158
  await promisify(fs.stat)(filePath);
146
159
  await promisify(fs.unlink)(filePath);
147
160
  return true;
@@ -205,7 +218,7 @@ export class FileUploadService {
205
218
  data = await processImage(req, next, req.file.path, options);
206
219
  }
207
220
  else {
208
- data = await processFile(req, req.file.path);
221
+ data = processFile(req, req.file.path);
209
222
  }
210
223
  }
211
224
  else {
@@ -245,7 +258,9 @@ export class FileUploadService {
245
258
  default:
246
259
  throw new AppError(`Unsupported file type: ${fileType}`, 400);
247
260
  }
248
- const filePath = path.join(targetService.uploadDir, fileName);
261
+ const filePath = resolveUploadPath(targetService.uploadDir, fileName);
262
+ if (!filePath)
263
+ throw new AppError("File not found", 404, "FileNotFound");
249
264
  await promisify(fs.stat)(filePath);
250
265
  await promisify(fs.unlink)(filePath);
251
266
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.service.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.service.ts"],"names":[],"mappings":"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","sourcesContent":["import multer, { MulterError, StorageEngine } from \"multer\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { NextFunction } from \"express\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { promisify } from \"util\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n} from \"../../types\";\nimport { processFile, processImage } from \"./utils/helpers/file-upload.helpers\";\nimport { removeBothSlashes } from \"../../utils/helpers/text.helpers\";\nimport { pascalCase } from \"../../exports/utils\";\n\n/**\n * Service to handle file uploads, including single and multiple file uploads,\n * file validation (type, size), and file deletion.\n */\nexport class FileUploadService {\n public readonly uploadDir: string;\n private fileSizeLimit: number;\n private allowedFileTypes: RegExp;\n private storage: StorageEngine;\n private maxCount: number;\n\n private handleUploadError(err: any, next: ArkosNextFunction) {\n if (err instanceof MulterError)\n return next(\n new AppError(\n err.message,\n 400,\n pascalCase(err.code || \"FileUploadError\")\n )\n );\n else return next(err);\n }\n\n /**\n * Constructor to initialize the file uploader service.\n * @param {string} uploadDir - The directory where files will be uploaded.\n * @param {number} fileSizeLimit - The maximum allowed file size.\n * @param {RegExp} allowedFileTypes - The regular expression for allowed file types.\n */\n constructor(\n uploadDir: string,\n fileSizeLimit: number = 1024 * 1024 * 5,\n allowedFileTypes: RegExp = /.*/,\n maxCount: number = 30\n ) {\n uploadDir = uploadDir.startsWith(\"/\") ? uploadDir.substring(1) : uploadDir;\n uploadDir = uploadDir.endsWith(\"/\") ? uploadDir.slice(0, -1) : uploadDir;\n\n this.uploadDir = path.resolve(process.cwd(), `${uploadDir}/`);\n this.fileSizeLimit = fileSizeLimit;\n this.allowedFileTypes = allowedFileTypes;\n this.maxCount = maxCount;\n\n if (!fs.existsSync(this.uploadDir))\n fs.mkdirSync(this.uploadDir, { recursive: true });\n\n this.storage = multer.diskStorage({\n destination: (_, _1, cb) => {\n cb(null, this.uploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n });\n }\n\n /**\n * Validates the file's type and MIME type.\n * @param {Express.Multer.File} file - The uploaded file.\n * @param {Function} cb - The callback function to indicate if file is valid.\n */\n private fileFilter = (_: any, file: any, cb: any) => {\n const extName = this.allowedFileTypes.test(\n path.extname(file.originalname).toLowerCase()\n );\n\n if (extName) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(this.allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n\n /**\n * Returns the multer upload configuration.\n * @returns {multer.Multer} The multer instance configured for file uploads.\n */\n public getUpload(): multer.Multer {\n return multer({\n storage: this.storage,\n fileFilter: this.fileFilter,\n limits: { fileSize: this.fileSizeLimit },\n });\n }\n\n /**\n * Middleware to handle single file upload.\n * @param {string} [oldFilePath] - The path to the file to delete before uploading.\n * @returns {Function} Middleware function for handling file upload.\n */\n public handleSingleUpload(oldFilePath?: string): ArkosRequestHandler {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const upload = this.getUpload().single(this.getFieldName());\n upload(req, res, async (err) => {\n if (err) return this.handleUploadError(err, next);\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n console.error(err);\n }\n }\n\n next();\n });\n };\n }\n\n /**\n * Middleware to handle multiple file uploads.\n * @returns {Function} Middleware function for handling multiple file uploads.\n */\n public handleMultipleUpload(): ArkosRequestHandler {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const upload = this.getUpload().array(this.getFieldName(), this.maxCount);\n upload(req, res, next);\n };\n }\n\n /**\n * Middleware to handle deletion of a single file from the filesystem.\n * @param {string} oldFilePath - The path to the file to be deleted.\n * @returns {Function} Middleware function for handling file deletion.\n */\n public handleDeleteSingleFile(oldFilePath: string): ArkosRequestHandler {\n return async (_: ArkosRequest, _1: ArkosResponse, next: NextFunction) => {\n const filePath = path.join(oldFilePath);\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) {\n await promisify(fs.unlink)(filePath);\n }\n } catch (err) {\n console.error(err);\n }\n\n next();\n };\n }\n\n /**\n * Deletes a file based on its URL by identifying the appropriate uploader service\n * @param {string} fileUrl - The URL of the file to delete\n * @returns {Promise<boolean>} - True if deletion successful, false otherwise\n */\n public async deleteFileByUrl(fileUrl: string): Promise<boolean> {\n try {\n const { fileUpload } = getArkosConfig();\n const baseRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n let urlPath: string;\n if (fileUrl.startsWith(\"http\")) {\n const url = new URL(fileUrl);\n urlPath = url.pathname;\n } else urlPath = fileUrl;\n\n const baseRouteIndex = urlPath.indexOf(baseRoute);\n if (baseRouteIndex === -1)\n throw new AppError(\n \"Invalid file URL: base route not found\",\n 400,\n \"InvalidFileUrl\"\n );\n\n const pathAfterBaseRoute = urlPath.substring(\n baseRouteIndex + baseRoute.length\n );\n const cleanPath = pathAfterBaseRoute.startsWith(\"/\")\n ? pathAfterBaseRoute.substring(1)\n : pathAfterBaseRoute;\n\n const fileTypes = [\"images\", \"videos\", \"documents\", \"files\"];\n let fileType: string | null = null;\n let fileName: string | null = null;\n\n for (const type of fileTypes) {\n const typeIndex = cleanPath.indexOf(type + \"/\");\n if (typeIndex !== -1) {\n fileType = type;\n fileName = cleanPath.substring(typeIndex + type.length + 1);\n break;\n }\n }\n\n if (!fileType || !fileName) {\n throw new AppError(\n \"Unable to determine file type or file name from URL\",\n 400,\n \"UnableToProcessFileURL\"\n );\n }\n\n // Get the appropriate uploader service based on file type\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let filePath: string;\n switch (fileType) {\n case \"images\":\n filePath = path.join(imageUploadService.uploadDir, fileName);\n break;\n case \"videos\":\n filePath = path.join(videoUploadService.uploadDir, fileName);\n break;\n case \"documents\":\n filePath = path.join(documentUploadService.uploadDir, fileName);\n break;\n case \"files\":\n filePath = path.join(fileUploadService.uploadDir, fileName);\n break;\n default:\n throw new AppError(\n `Unsupported file type: ${fileType}`,\n 400,\n \"UnsupportedFileType\"\n );\n }\n\n await promisify(fs.stat)(filePath);\n await promisify(fs.unlink)(filePath);\n\n return true;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n if (error.code === \"ENOENT\")\n throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n throw new AppError(\n `Failed to delete file: ${error.message}`,\n 500,\n \"UnableToDeleteFile\"\n );\n }\n }\n\n private getFieldName() {\n let fieldName = \"files\";\n if (this.uploadDir.endsWith(\"images\") || this.uploadDir.endsWith(\"images/\"))\n fieldName = \"images\";\n if (this.uploadDir.endsWith(\"videos\") || this.uploadDir.endsWith(\"videos/\"))\n fieldName = \"videos\";\n if (\n this.uploadDir.endsWith(\"documents\") ||\n this.uploadDir.endsWith(\"documents/\")\n )\n fieldName = \"documents\";\n if (this.uploadDir.endsWith(\"files\") || this.uploadDir.endsWith(\"files/\"))\n fieldName = \"files\";\n return fieldName;\n }\n\n /**\n * Handles the upload process and returns the full URLs of uploaded files\n * @param {ArkosRequest} req - Arkos request object containing the files\n * @param {ArkosResponse} res - Arkos response object\n * @param {object} options - Optional parameters for image processing\n * @returns {Promise<string|string[]>} URL or array of URLs to the uploaded files\n */\n public async upload(\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction,\n options: {\n format?: string;\n width?: number;\n height?: number;\n resizeTo?: number;\n } = {}\n ): Promise<string | string[] | null> {\n const { fileUpload } = getArkosConfig();\n fileUpload?.baseRoute || \"/api/uploads\";\n\n return new Promise((resolve, reject) => {\n const isMultiple = Array.isArray(req.query.multiple)\n ? req.query.multiple[0] == \"true\"\n : req.query.multiple == \"true\";\n\n const uploadHandler = isMultiple\n ? this.getUpload().array(this.getFieldName(), this.maxCount)\n : this.getUpload().single(this.getFieldName());\n\n uploadHandler(req, res, async (err) => {\n if (err && err instanceof MulterError)\n return reject(\n new AppError(\n err.message,\n 400,\n pascalCase(err.code || \"FileUploadError\")\n )\n );\n else if (err) reject(err);\n\n try {\n const dirParts = this.uploadDir.split(\"/\");\n (this.uploadDir.endsWith(\"/\")\n ? dirParts[dirParts.length - 2]\n : dirParts[dirParts.length - 1]) || \"files\";\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n const isImageUpload = this.uploadDir?.includes?.(\"/images\");\n if (isImageUpload) {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n const isImageUpload = this.uploadDir?.includes?.(\"/images\");\n if (isImageUpload) {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = await processFile(req, req.file.path);\n }\n } else {\n return reject(\n new AppError(\n `No file or files were attached on field ${req.params.fileType} on the request body as form data.`,\n 400,\n \"NoFileOrFilesAttached\"\n )\n );\n }\n\n resolve(data);\n } catch (error) {\n reject(error);\n }\n });\n });\n }\n\n /**\n * Deletes a file based on filename and file type from request parameters\n * @param {string} fileName - The name of the file to delete\n * @returns {Promise<boolean>} - True if deletion successful, false otherwise\n */\n public async deleteFileByName(\n fileName: string,\n fileType: \"images\" | \"videos\" | \"documents\" | \"files\"\n ): Promise<boolean> {\n try {\n if (!fileType)\n throw new AppError(\n \"File type parameter is required\",\n 400,\n \"MissingFileType\"\n );\n\n const validFileTypes = [\"images\", \"videos\", \"documents\", \"files\"];\n if (!validFileTypes.includes(fileType)) {\n throw new AppError(\n `Invalid file type: ${fileType}. Must be one of: ${validFileTypes.join(\n \", \"\n )}`,\n 400\n );\n }\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let targetService: FileUploadService;\n switch (fileType) {\n case \"images\":\n targetService = imageUploadService;\n break;\n case \"videos\":\n targetService = videoUploadService;\n break;\n case \"documents\":\n targetService = documentUploadService;\n break;\n case \"files\":\n targetService = fileUploadService;\n break;\n default:\n throw new AppError(`Unsupported file type: ${fileType}`, 400);\n }\n\n // Construct the full file path\n const filePath = path.join(targetService.uploadDir, fileName);\n\n // Check if file exists and delete it\n await promisify(fs.stat)(filePath);\n await promisify(fs.unlink)(filePath);\n\n return true;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n if (error.code === \"ENOENT\")\n throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n throw new AppError(\n `Failed to delete file: ${error.message}`,\n 500,\n \"UnableToDeleteFile\"\n );\n }\n }\n}\n\n/**\n * Creates and returns all file uploader services based on config\n * @returns Object containing all specialized file uploader services\n */\nexport const getFileUploadServices = () => {\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const restrictions = fileUpload?.restrictions\n ? deepmerge(fileUploadDefaultRestrictions, fileUpload.restrictions)\n : fileUploadDefaultRestrictions;\n\n /**\n * Specialized file uploader service for handling image uploads.\n */\n const imageUploadService = new FileUploadService(\n `${baseUploadDir}/images`,\n restrictions.images.maxSize,\n restrictions.images.supportedFilesRegex,\n restrictions.images.maxCount\n );\n\n /**\n * Specialized file uploader service for handling video uploads.\n */\n const videoUploadService = new FileUploadService(\n `${baseUploadDir}/videos`,\n restrictions.videos.maxSize,\n restrictions.videos.supportedFilesRegex,\n restrictions.videos.maxCount\n );\n\n /**\n * Specialized file uploader service for handling document uploads.\n */\n const documentUploadService = new FileUploadService(\n `${baseUploadDir}/documents`,\n restrictions.documents.maxSize,\n restrictions.documents.supportedFilesRegex,\n restrictions.documents.maxCount\n );\n\n /**\n * Generic file uploader service for handling all file uploads.\n */\n const fileUploadService = new FileUploadService(\n `${baseUploadDir}/files`,\n restrictions.files.maxSize,\n restrictions.files.supportedFilesRegex,\n restrictions.files.maxCount\n );\n\n return {\n imageUploadService,\n videoUploadService,\n documentUploadService,\n fileUploadService,\n };\n};\n\nexport const fileUploadDefaultRestrictions = {\n images: {\n maxCount: 30,\n maxSize: 1024 * 1024 * 15, // 15 MB\n supportedFilesRegex:\n /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/,\n },\n videos: {\n maxCount: 10,\n maxSize: 1024 * 1024 * 5096, // 5 GB\n supportedFilesRegex:\n /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/,\n },\n documents: {\n maxCount: 30,\n maxSize: 1024 * 1024 * 50, // 50 MB\n supportedFilesRegex:\n /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/,\n },\n files: {\n maxCount: 10,\n maxSize: 1024 * 1024 * 5096, // 5 GB\n supportedFilesRegex: /.*/,\n },\n};\n"]}
1
+ {"version":3,"file":"file-upload.service.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.service.ts"],"names":[],"mappings":"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","sourcesContent":["import multer, { MulterError, StorageEngine } from \"multer\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { NextFunction } from \"express\";\nimport AppError from \"../error-handler/utils/app-error\";\nimport { promisify } from \"util\";\nimport { getArkosConfig } from \"../../server\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosRequestHandler,\n ArkosResponse,\n} from \"../../types\";\nimport {\n ImageOptimizationOptions,\n processFile,\n processImage,\n} from \"./utils/helpers/file-upload.helpers\";\nimport { removeBothSlashes } from \"../../utils/helpers/text.helpers\";\nimport { pascalCase } from \"../../exports/utils\";\nimport { resolveUploadPath } from \"./utils/helpers/upload-path.helper\";\n\nfunction decodeUploadFileName(fileName: string): string {\n try {\n return decodeURIComponent(fileName);\n } catch {\n return fileName;\n }\n}\n\n/**\n * Service to handle file uploads, including single and multiple file uploads,\n * file validation (type, size), and file deletion.\n */\nexport class FileUploadService {\n public readonly uploadDir: string;\n private fileSizeLimit: number;\n private allowedFileTypes: RegExp;\n private storage: StorageEngine;\n private maxCount: number;\n\n private handleUploadError(err: any, next: ArkosNextFunction) {\n if (err instanceof MulterError)\n return next(\n new AppError(\n err.message,\n 400,\n pascalCase(err.code || \"FileUploadError\")\n )\n );\n else return next(err);\n }\n\n /**\n * Constructor to initialize the file uploader service.\n * @param {string} uploadDir - The directory where files will be uploaded.\n * @param {number} fileSizeLimit - The maximum allowed file size.\n * @param {RegExp} allowedFileTypes - The regular expression for allowed file types.\n */\n constructor(\n uploadDir: string,\n fileSizeLimit: number = 1024 * 1024 * 5,\n allowedFileTypes: RegExp = /.*/,\n maxCount: number = 30\n ) {\n uploadDir = uploadDir.startsWith(\"/\") ? uploadDir.substring(1) : uploadDir;\n uploadDir = uploadDir.endsWith(\"/\") ? uploadDir.slice(0, -1) : uploadDir;\n\n this.uploadDir = path.resolve(process.cwd(), `${uploadDir}/`);\n this.fileSizeLimit = fileSizeLimit;\n this.allowedFileTypes = allowedFileTypes;\n this.maxCount = maxCount;\n\n if (!fs.existsSync(this.uploadDir))\n fs.mkdirSync(this.uploadDir, { recursive: true });\n\n this.storage = multer.diskStorage({\n destination: (_, _1, cb) => {\n cb(null, this.uploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n });\n }\n\n /**\n * Validates the file's type and MIME type.\n * @param {Express.Multer.File} file - The uploaded file.\n * @param {Function} cb - The callback function to indicate if file is valid.\n */\n private fileFilter = (_: any, file: any, cb: any) => {\n const extName = this.allowedFileTypes.test(\n path.extname(file.originalname).toLowerCase()\n );\n\n if (extName) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(this.allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n\n /**\n * Returns the multer upload configuration.\n * @returns {multer.Multer} The multer instance configured for file uploads.\n */\n public getUpload(): multer.Multer {\n return multer({\n storage: this.storage,\n fileFilter: this.fileFilter,\n limits: { fileSize: this.fileSizeLimit },\n });\n }\n\n /**\n * Middleware to handle single file upload.\n * @param {string} [oldFilePath] - The path to the file to delete before uploading.\n * @returns {Function} Middleware function for handling file upload.\n */\n public handleSingleUpload(oldFilePath?: string): ArkosRequestHandler {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const upload = this.getUpload().single(this.getFieldName());\n upload(req, res, async (err) => {\n if (err) return this.handleUploadError(err, next);\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n console.error(err);\n }\n }\n\n next();\n });\n };\n }\n\n /**\n * Middleware to handle multiple file uploads.\n * @returns {Function} Middleware function for handling multiple file uploads.\n */\n public handleMultipleUpload(): ArkosRequestHandler {\n return (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => {\n const upload = this.getUpload().array(this.getFieldName(), this.maxCount);\n upload(req, res, next);\n };\n }\n\n /**\n * Middleware to handle deletion of a single file from the filesystem.\n * @param {string} oldFilePath - The path to the file to be deleted.\n * @returns {Function} Middleware function for handling file deletion.\n */\n public handleDeleteSingleFile(oldFilePath: string): ArkosRequestHandler {\n return async (_: ArkosRequest, _1: ArkosResponse, next: NextFunction) => {\n const filePath = path.join(oldFilePath);\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) {\n await promisify(fs.unlink)(filePath);\n }\n } catch (err) {\n console.error(err);\n }\n\n next();\n };\n }\n\n /**\n * Deletes a file based on its URL by identifying the appropriate uploader service\n * @param {string} fileUrl - The URL of the file to delete\n * @returns {Promise<boolean>} - True if deletion successful, false otherwise\n */\n public async deleteFileByUrl(fileUrl: string): Promise<boolean> {\n try {\n const { fileUpload } = getArkosConfig();\n const baseRoute = fileUpload?.baseRoute || \"/api/uploads\";\n\n let urlPath: string;\n if (fileUrl.startsWith(\"http\")) {\n const url = new URL(fileUrl);\n urlPath = url.pathname;\n } else urlPath = fileUrl;\n\n const baseRouteIndex = urlPath.indexOf(baseRoute);\n if (baseRouteIndex === -1)\n throw new AppError(\n \"Invalid file URL: base route not found\",\n 400,\n \"InvalidFileUrl\"\n );\n\n const pathAfterBaseRoute = urlPath.substring(\n baseRouteIndex + baseRoute.length\n );\n const cleanPath = pathAfterBaseRoute.startsWith(\"/\")\n ? pathAfterBaseRoute.substring(1)\n : pathAfterBaseRoute;\n\n const fileTypes = [\"images\", \"videos\", \"documents\", \"files\"];\n const [fileType, ...fileNameSegments] = cleanPath.split(\"/\");\n\n if (\n !fileType ||\n !fileTypes.includes(fileType) ||\n fileNameSegments.length === 0\n ) {\n throw new AppError(\n \"Unable to determine file type or file name from URL\",\n 400,\n \"UnableToProcessFileURL\"\n );\n }\n\n const fileName = fileNameSegments\n .map(decodeUploadFileName)\n .join(\"/\");\n\n // Get the appropriate uploader service based on file type\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let targetService: FileUploadService;\n switch (fileType) {\n case \"images\":\n targetService = imageUploadService;\n break;\n case \"videos\":\n targetService = videoUploadService;\n break;\n case \"documents\":\n targetService = documentUploadService;\n break;\n case \"files\":\n targetService = fileUploadService;\n break;\n default:\n throw new AppError(\n `Unsupported file type: ${fileType}`,\n 400,\n \"UnsupportedFileType\"\n );\n }\n\n const filePath = resolveUploadPath(targetService.uploadDir, fileName);\n\n if (!filePath) throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n await promisify(fs.stat)(filePath);\n await promisify(fs.unlink)(filePath);\n\n return true;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n if (error.code === \"ENOENT\")\n throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n throw new AppError(\n `Failed to delete file: ${error.message}`,\n 500,\n \"UnableToDeleteFile\"\n );\n }\n }\n\n private getFieldName() {\n let fieldName = \"files\";\n if (this.uploadDir.endsWith(\"images\") || this.uploadDir.endsWith(\"images/\"))\n fieldName = \"images\";\n if (this.uploadDir.endsWith(\"videos\") || this.uploadDir.endsWith(\"videos/\"))\n fieldName = \"videos\";\n if (\n this.uploadDir.endsWith(\"documents\") ||\n this.uploadDir.endsWith(\"documents/\")\n )\n fieldName = \"documents\";\n if (this.uploadDir.endsWith(\"files\") || this.uploadDir.endsWith(\"files/\"))\n fieldName = \"files\";\n return fieldName;\n }\n\n /**\n * Handles the upload process and returns the full URLs of uploaded files\n * @param {ArkosRequest} req - Arkos request object containing the files\n * @param {ArkosResponse} res - Arkos response object\n * @param {object} options - Optional parameters for image processing\n * @returns {Promise<string|string[]>} URL or array of URLs to the uploaded files\n */\n public async upload(\n req: ArkosRequest,\n res: ArkosResponse,\n next: ArkosNextFunction,\n options: ImageOptimizationOptions = {}\n ): Promise<string | string[] | null> {\n const { fileUpload } = getArkosConfig();\n fileUpload?.baseRoute || \"/api/uploads\";\n\n return new Promise((resolve, reject) => {\n const isMultiple = Array.isArray(req.query.multiple)\n ? req.query.multiple[0] == \"true\"\n : req.query.multiple == \"true\";\n\n const uploadHandler = isMultiple\n ? this.getUpload().array(this.getFieldName(), this.maxCount)\n : this.getUpload().single(this.getFieldName());\n\n uploadHandler(req, res, async (err) => {\n if (err && err instanceof MulterError)\n return reject(\n new AppError(\n err.message,\n 400,\n pascalCase(err.code || \"FileUploadError\")\n )\n );\n else if (err) reject(err);\n\n try {\n const dirParts = this.uploadDir.split(\"/\");\n (this.uploadDir.endsWith(\"/\")\n ? dirParts[dirParts.length - 2]\n : dirParts[dirParts.length - 1]) || \"files\";\n\n let data;\n if (req.files && Array.isArray(req.files) && req.files.length > 0) {\n const isImageUpload = this.uploadDir?.includes?.(\"/images\");\n if (isImageUpload) {\n data = await Promise.all(\n req.files.map((file) =>\n processImage(req, next, file.path, options)\n )\n );\n } else {\n data = await Promise.all(\n req.files.map((file) => processFile(req, file.path))\n );\n }\n\n data = data.filter((url) => url !== null);\n } else if (req.file) {\n const isImageUpload = this.uploadDir?.includes?.(\"/images\");\n if (isImageUpload) {\n data = await processImage(req, next, req.file.path, options);\n } else {\n data = processFile(req, req.file.path);\n }\n } else {\n return reject(\n new AppError(\n `No file or files were attached on field ${req.params.fileType} on the request body as form data.`,\n 400,\n \"NoFileOrFilesAttached\"\n )\n );\n }\n\n resolve(data);\n } catch (error) {\n reject(error);\n }\n });\n });\n }\n\n /**\n * Deletes a file based on filename and file type from request parameters\n * @param {string} fileName - The name of the file to delete\n * @returns {Promise<boolean>} - True if deletion successful, false otherwise\n */\n public async deleteFileByName(\n fileName: string,\n fileType: \"images\" | \"videos\" | \"documents\" | \"files\"\n ): Promise<boolean> {\n try {\n if (!fileType)\n throw new AppError(\n \"File type parameter is required\",\n 400,\n \"MissingFileType\"\n );\n\n const validFileTypes = [\"images\", \"videos\", \"documents\", \"files\"];\n if (!validFileTypes.includes(fileType)) {\n throw new AppError(\n `Invalid file type: ${fileType}. Must be one of: ${validFileTypes.join(\n \", \"\n )}`,\n 400\n );\n }\n\n const {\n documentUploadService,\n fileUploadService,\n imageUploadService,\n videoUploadService,\n } = getFileUploadServices();\n\n let targetService: FileUploadService;\n switch (fileType) {\n case \"images\":\n targetService = imageUploadService;\n break;\n case \"videos\":\n targetService = videoUploadService;\n break;\n case \"documents\":\n targetService = documentUploadService;\n break;\n case \"files\":\n targetService = fileUploadService;\n break;\n default:\n throw new AppError(`Unsupported file type: ${fileType}`, 400);\n }\n\n const filePath = resolveUploadPath(targetService.uploadDir, fileName);\n\n if (!filePath) throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n // Check if file exists and delete it\n await promisify(fs.stat)(filePath);\n await promisify(fs.unlink)(filePath);\n\n return true;\n } catch (error: any) {\n if (error instanceof AppError) {\n throw error;\n }\n\n if (error.code === \"ENOENT\")\n throw new AppError(\"File not found\", 404, \"FileNotFound\");\n\n throw new AppError(\n `Failed to delete file: ${error.message}`,\n 500,\n \"UnableToDeleteFile\"\n );\n }\n }\n}\n\n/**\n * Creates and returns all file uploader services based on config\n * @returns Object containing all specialized file uploader services\n */\nexport const getFileUploadServices = () => {\n const { fileUpload } = getArkosConfig();\n const baseUploadDir = fileUpload?.baseUploadDir || \"/uploads\";\n\n const restrictions = fileUpload?.restrictions\n ? deepmerge(fileUploadDefaultRestrictions, fileUpload.restrictions)\n : fileUploadDefaultRestrictions;\n\n /**\n * Specialized file uploader service for handling image uploads.\n */\n const imageUploadService = new FileUploadService(\n `${baseUploadDir}/images`,\n restrictions.images.maxSize,\n restrictions.images.supportedFilesRegex,\n restrictions.images.maxCount\n );\n\n /**\n * Specialized file uploader service for handling video uploads.\n */\n const videoUploadService = new FileUploadService(\n `${baseUploadDir}/videos`,\n restrictions.videos.maxSize,\n restrictions.videos.supportedFilesRegex,\n restrictions.videos.maxCount\n );\n\n /**\n * Specialized file uploader service for handling document uploads.\n */\n const documentUploadService = new FileUploadService(\n `${baseUploadDir}/documents`,\n restrictions.documents.maxSize,\n restrictions.documents.supportedFilesRegex,\n restrictions.documents.maxCount\n );\n\n /**\n * Generic file uploader service for handling all file uploads.\n */\n const fileUploadService = new FileUploadService(\n `${baseUploadDir}/files`,\n restrictions.files.maxSize,\n restrictions.files.supportedFilesRegex,\n restrictions.files.maxCount\n );\n\n return {\n imageUploadService,\n videoUploadService,\n documentUploadService,\n fileUploadService,\n };\n};\n\nexport const fileUploadDefaultRestrictions = {\n images: {\n maxCount: 30,\n maxSize: 1024 * 1024 * 15, // 15 MB\n supportedFilesRegex:\n /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/,\n },\n videos: {\n maxCount: 10,\n maxSize: 1024 * 1024 * 5096, // 5 GB\n supportedFilesRegex:\n /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/,\n },\n documents: {\n maxCount: 30,\n maxSize: 1024 * 1024 * 50, // 50 MB\n supportedFilesRegex:\n /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/,\n },\n files: {\n maxCount: 10,\n maxSize: 1024 * 1024 * 5096, // 5 GB\n supportedFilesRegex: /.*/,\n },\n};\n"]}