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
@@ -7,10 +7,12 @@ import { removeBothSlashes } from "../../../helpers/text.helpers.js";
7
7
  import { promisify } from "util";
8
8
  import sheu from "../../../sheu.js";
9
9
  import AppError from "../../../../modules/error-handler/utils/app-error.js";
10
- import { extractRequestInfo, generateRelativePath, } from "../../../../modules/file-upload/utils/helpers/file-upload.helpers.js";
10
+ import { extractRequestInfo, optimizeImage, } from "../../../../modules/file-upload/utils/helpers/file-upload.helpers.js";
11
11
  import deepmerge from "../../../helpers/deepmerge.helper.js";
12
12
  import { catchAsync } from "../../../../exports/error-handler/index.js";
13
- import { pascalCase } from "../../../helpers/change-case.helpers.js";
13
+ import { isSafeUploadParam, normalizeUploadDir, normalizeUploadUrlPath, resolveUploadPath, } from "../../../../modules/file-upload/utils/helpers/upload-path.helper.js";
14
+ import { uploadServingRegistry } from "../../../../modules/file-upload/utils/helpers/upload-serving.registry.js";
15
+ import { ConflictError } from "../../../../modules/error-handler/utils/errors.js";
14
16
  function determineUploadDir(file) {
15
17
  if (file.mimetype.includes?.("image"))
16
18
  return "/images";
@@ -24,38 +26,396 @@ function determineUploadDir(file) {
24
26
  return "/documents";
25
27
  return "/files";
26
28
  }
29
+ function getTemplateParams(template) {
30
+ return template
31
+ .split("/")
32
+ .filter((segment) => segment.startsWith(":"))
33
+ .map((segment) => segment.slice(1).replace(/\(.*\)$/, ""));
34
+ }
35
+ function substituteUploadTemplate(template, values, label) {
36
+ const missing = [];
37
+ const result = template
38
+ .split("/")
39
+ .map((segment) => {
40
+ if (!segment.startsWith(":"))
41
+ return segment;
42
+ const name = segment.slice(1).replace(/\(.*\)$/, "");
43
+ const value = values[name];
44
+ if (value === undefined) {
45
+ missing.push(name);
46
+ return segment;
47
+ }
48
+ if (!isSafeUploadParam(value))
49
+ throw new Error(`Invalid upload param ":${name}" for ${label}`);
50
+ return value;
51
+ })
52
+ .join("/");
53
+ if (missing.length > 0)
54
+ throw new Error(`Missing required upload param(s) ${missing
55
+ .map((name) => `":${name}"`)
56
+ .join(", ")} for ${label}.`);
57
+ return result;
58
+ }
59
+ function stripExtension(filename) {
60
+ const ext = path.extname(filename);
61
+ return ext ? filename.slice(0, -ext.length) : filename;
62
+ }
63
+ const RESERVED_FILE_NAMES = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])$/i;
64
+ function isSafeFileName(filename) {
65
+ return (typeof filename === "string" &&
66
+ filename.length > 0 &&
67
+ filename.length <= 255 &&
68
+ !filename.includes("/") &&
69
+ !filename.includes("\\") &&
70
+ !filename.includes("\0") &&
71
+ filename !== "." &&
72
+ filename !== ".." &&
73
+ !/[. ]$/.test(filename) &&
74
+ !RESERVED_FILE_NAMES.test(filename));
75
+ }
76
+ function isInside(base, target) {
77
+ const relative = path.relative(base, target);
78
+ return (relative === "" ||
79
+ (!relative.startsWith(`..${path.sep}`) &&
80
+ relative !== ".." &&
81
+ !path.isAbsolute(relative)));
82
+ }
83
+ function safeOriginalBaseName(file) {
84
+ const ext = path.extname(file.originalname);
85
+ const base = path
86
+ .basename(file.originalname, ext)
87
+ .replace(/[^A-Za-z0-9._ -]/g, "-")
88
+ .replace(/^[. ]+/, "");
89
+ return base || "file";
90
+ }
27
91
  const storage = multer.diskStorage({
28
92
  destination: (req, file, cb) => {
29
- const arkosConfig = getArkosConfig();
30
- const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || "/uploads";
31
- let uploadDir = req.headers["x-upload-dir"] || determineUploadDir(file);
32
- req.headers["x-upload-dir"] = uploadDir;
33
- const fullUploadDir = path.resolve(path.join(process.cwd(), baseUploadDir.replaceAll("//", "/"), uploadDir.replaceAll("//", "/")));
34
- if (!fs.existsSync(fullUploadDir))
35
- fs.mkdirSync(fullUploadDir, { recursive: true });
36
- cb(null, fullUploadDir);
93
+ void (async () => {
94
+ try {
95
+ const arkosReq = req;
96
+ const arkosConfig = getArkosConfig();
97
+ const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || "/uploads";
98
+ const settings = uploadManager.getUploadSettingsForFile(arkosReq.__arkos?.uploadConfig, file);
99
+ const resolved = await uploadManager.resolveUploadSettings(arkosReq, file, settings);
100
+ const basePath = path.resolve(process.cwd(), baseUploadDir.replaceAll("//", "/"));
101
+ const fullUploadDir = resolveUploadPath(basePath, resolved.uploadDir, { strictSegments: true });
102
+ if (!fullUploadDir)
103
+ throw new Error(`Invalid upload directory "${resolved.uploadDir}"`);
104
+ file.__arkos = {
105
+ uploadDir: resolved.uploadDir,
106
+ urlPath: resolved.urlPath,
107
+ urlPathExact: resolved.urlPathExact,
108
+ dirParams: resolved.dirParams,
109
+ uploadPath: fullUploadDir,
110
+ };
111
+ if (!fs.existsSync(fullUploadDir))
112
+ fs.mkdirSync(fullUploadDir, { recursive: true });
113
+ cb(null, fullUploadDir);
114
+ }
115
+ catch (error) {
116
+ cb(error, "");
117
+ }
118
+ })();
37
119
  },
38
- filename: (_, file, cb) => {
39
- const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
40
- const ext = path.extname(file.originalname);
41
- cb(null, `${file.originalname.replace(ext, "")}-${uniqueSuffix}${ext}`);
120
+ filename: (req, file, cb) => {
121
+ void (async () => {
122
+ try {
123
+ const arkosReq = req;
124
+ const settings = uploadManager.getUploadSettingsForFile(arkosReq.__arkos?.uploadConfig, file);
125
+ const meta = file.__arkos;
126
+ const index = uploadManager.nextFileIndex(arkosReq, file);
127
+ let preparedBase;
128
+ if (settings.prepareFile) {
129
+ const result = await settings.prepareFile({
130
+ file: file,
131
+ dirParams: meta?.dirParams || {},
132
+ index,
133
+ }, arkosReq, arkosReq.res?.locals || {});
134
+ if (result?.filename !== undefined) {
135
+ if (typeof result.filename !== "string")
136
+ throw new Error("prepareFile must return a string filename");
137
+ preparedBase = stripExtension(result.filename);
138
+ if (!isSafeFileName(preparedBase))
139
+ throw new Error(`Invalid file name "${result.filename}" returned by prepareFile`);
140
+ }
141
+ }
142
+ const ext = path.extname(file.originalname);
143
+ const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
144
+ const finalName = preparedBase
145
+ ? `${preparedBase}${ext}`
146
+ : `${safeOriginalBaseName(file)}-${uniqueSuffix}${ext}`;
147
+ const uploadPath = meta?.uploadPath || "";
148
+ if (!uploadPath)
149
+ throw new Error(`Unable to resolve the upload directory for file "${file.originalname}"`);
150
+ const targetPath = path.resolve(uploadPath, finalName);
151
+ if (!isInside(uploadPath, targetPath))
152
+ throw new Error(`Invalid file name "${finalName}"`);
153
+ const targets = (arkosReq.__arkos.uploadTargetPaths ??= new Set());
154
+ if (targets.has(targetPath))
155
+ throw new ConflictError(`Duplicate upload target "${finalName}" in the same request`, "UploadConflict", { filename: finalName });
156
+ if (settings.overwrite === false && fs.existsSync(targetPath))
157
+ throw new ConflictError(`File "${finalName}" already exists and overwrite is disabled`, "UploadConflict", { filename: finalName });
158
+ targets.add(targetPath);
159
+ (arkosReq.__arkos.uploadWrittenPaths ??= []).push(targetPath);
160
+ file.__arkos = {
161
+ ...meta,
162
+ targetPath,
163
+ };
164
+ cb(null, finalName);
165
+ }
166
+ catch (error) {
167
+ cb(error, "");
168
+ }
169
+ })();
42
170
  },
43
171
  });
172
+ function isNestedArrayPath(fieldPath) {
173
+ return fieldPath.includes("[]");
174
+ }
175
+ function buildPathMatcher(pattern) {
176
+ const escaped = pattern
177
+ .replace(/\[]/g, "\x00")
178
+ .replace(/[\[\]]/g, "\\$&")
179
+ .replace(/\x00/g, "\\[\\d+\\]");
180
+ return new RegExp(`^${escaped}$`);
181
+ }
182
+ function extractIndex(segment) {
183
+ return parseInt(segment.replace(/\[|\]/g, ""), 10);
184
+ }
185
+ function extractIndices(key, pattern) {
186
+ const patternParts = pattern.match(/\[[^\]]*\]/g) || [];
187
+ const keyParts = key.match(/\[[^\]]*\]/g) || [];
188
+ const indices = [];
189
+ for (let i = 0; i < patternParts.length; i++) {
190
+ if (patternParts[i] === "[]") {
191
+ indices.push(extractIndex(keyParts[i]));
192
+ }
193
+ }
194
+ return indices;
195
+ }
196
+ function groupFilesByPattern(files, pattern) {
197
+ const matcher = buildPathMatcher(pattern);
198
+ const groups = new Map();
199
+ for (const key of Object.keys(files)) {
200
+ if (!matcher.test(key))
201
+ continue;
202
+ const indices = extractIndices(key, pattern);
203
+ const groupKey = indices.join(",");
204
+ if (!groups.has(groupKey))
205
+ groups.set(groupKey, []);
206
+ groups.get(groupKey).push(...files[key]);
207
+ }
208
+ return groups;
209
+ }
210
+ function validateFileConstraints(file, allowedFileTypes, maxSize) {
211
+ if (maxSize && file.size > maxSize) {
212
+ return `File '${file.originalname}' exceeds the maximum allowed size of ${maxSize} bytes`;
213
+ }
214
+ if (allowedFileTypes) {
215
+ const ext = path.extname(file.originalname).toLowerCase();
216
+ const allowed = Array.isArray(allowedFileTypes)
217
+ ? allowedFileTypes.includes(ext)
218
+ : allowedFileTypes.test(ext);
219
+ if (!allowed) {
220
+ return `File type '${ext}' is not allowed for '${file.originalname}'`;
221
+ }
222
+ }
223
+ return null;
224
+ }
225
+ function flattenFieldsForMulter(fields) {
226
+ return fields.map((field) => ({
227
+ name: field.name,
228
+ maxCount: "type" in field && field.type === "single" ? 1 : (field.maxCount ?? 5),
229
+ }));
230
+ }
231
+ function configHasNestedArrayPaths(config) {
232
+ if (config.type === "single" || config.type === "array") {
233
+ return isNestedArrayPath(config.field);
234
+ }
235
+ if (config.type === "fields") {
236
+ return config.fields.some((f) => isNestedArrayPath(f.name));
237
+ }
238
+ return false;
239
+ }
240
+ const isImageFile = (file) => !!file?.mimetype?.includes?.("image");
241
+ const collectUploadedFiles = (req) => {
242
+ if (req.file)
243
+ return [req.file];
244
+ if (Array.isArray(req.files))
245
+ return req.files;
246
+ if (req.files && typeof req.files === "object")
247
+ return Object.values(req.files).flat();
248
+ return [];
249
+ };
250
+ const getImageOptionsForFile = (config, file) => {
251
+ const baseOptions = config.image;
252
+ if (config.type !== "fields")
253
+ return baseOptions;
254
+ const field = config.fields.find((entry) => {
255
+ if (entry.name === file.fieldname)
256
+ return true;
257
+ try {
258
+ return buildPathMatcher(entry.name).test(file.fieldname);
259
+ }
260
+ catch {
261
+ return false;
262
+ }
263
+ });
264
+ return field?.image ?? baseOptions;
265
+ };
266
+ const optimizeUploadedImages = async (config, files) => {
267
+ for (const file of files) {
268
+ try {
269
+ const optimizedPath = await optimizeImage(file.path, getImageOptionsForFile(config, file));
270
+ file.path = optimizedPath;
271
+ file.filename = path.basename(optimizedPath);
272
+ try {
273
+ file.size = (await promisify(fs.stat)(optimizedPath)).size;
274
+ }
275
+ catch { }
276
+ }
277
+ catch (error) {
278
+ if (error?.message === "Input file contains unsupported image format")
279
+ continue;
280
+ throw new Error(`Cannot process uploaded image: ${error.message}`);
281
+ }
282
+ }
283
+ };
284
+ function resolveFieldEntry(field, config = {}) {
285
+ const isLegacy = !("type" in field) || field.type === undefined;
286
+ if (isLegacy) {
287
+ return {
288
+ ...config,
289
+ name: field.name,
290
+ type: "array",
291
+ required: !!config.required,
292
+ minCount: field.minCount,
293
+ maxCount: field.maxCount,
294
+ allowedFileTypes: config.allowedFileTypes,
295
+ maxSize: config.maxSize,
296
+ attachToBody: config.attachToBody,
297
+ };
298
+ }
299
+ if (field.type === "single") {
300
+ return {
301
+ name: field.name,
302
+ type: "single",
303
+ required: field.required !== false,
304
+ minCount: undefined,
305
+ maxCount: undefined,
306
+ allowedFileTypes: field.allowedFileTypes,
307
+ maxSize: field.maxSize,
308
+ attachToBody: field.attachToBody,
309
+ };
310
+ }
311
+ return {
312
+ name: field.name,
313
+ type: "array",
314
+ required: field.required !== false,
315
+ minCount: field.minCount,
316
+ maxCount: field.maxCount,
317
+ allowedFileTypes: field.allowedFileTypes,
318
+ maxSize: field.maxSize,
319
+ attachToBody: field.attachToBody,
320
+ };
321
+ }
44
322
  class UploadManager {
45
- constructor() {
46
- this.fileFilter = (_, file, cb, allowedFileTypes) => {
47
- const ext = path.extname(file.originalname).toLowerCase();
48
- let isAllowed = false;
49
- if (Array.isArray(allowedFileTypes))
50
- isAllowed = allowedFileTypes.includes(ext);
51
- else
52
- isAllowed = allowedFileTypes.test(ext);
53
- if (isAllowed)
54
- cb(null, true);
55
- else
56
- cb(new AppError(`File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll("/", "").split("|").join(", ")}`, 400, "FileTypeNotAllowed", { filename: file.originalname }));
323
+ getUploadSettingsForFile(config, file) {
324
+ if (!config)
325
+ return { key: "config" };
326
+ if (config.type === "fields") {
327
+ const field = config.fields.find((entry) => {
328
+ if (entry.name === file.fieldname)
329
+ return true;
330
+ try {
331
+ return buildPathMatcher(entry.name).test(file.fieldname);
332
+ }
333
+ catch {
334
+ return false;
335
+ }
336
+ });
337
+ const typedField = field && "type" in field && field.type !== undefined ? field : undefined;
338
+ return {
339
+ uploadDir: typedField?.uploadDir ?? config.uploadDir,
340
+ urlPath: typedField?.urlPath ?? config.urlPath,
341
+ prepare: typedField?.prepare ?? config.prepare,
342
+ prepareFile: typedField?.prepareFile ?? config.prepareFile,
343
+ overwrite: typedField?.overwrite ?? config.overwrite,
344
+ key: `field:${field?.name ?? file.fieldname}`,
345
+ };
346
+ }
347
+ return {
348
+ uploadDir: config.uploadDir,
349
+ urlPath: config.urlPath,
350
+ prepare: config.prepare,
351
+ prepareFile: config.prepareFile,
352
+ overwrite: config.overwrite,
353
+ key: `config:${config.type}`,
57
354
  };
58
355
  }
356
+ async resolveUploadSettings(req, file, settings) {
357
+ req.__arkos ??= {};
358
+ const cached = req.__arkos.preparedUploads?.get(settings.key);
359
+ if (cached)
360
+ return cached;
361
+ const prepared = settings.prepare
362
+ ? await settings.prepare(req, req.res?.locals || {})
363
+ : undefined;
364
+ const dirParams = {};
365
+ for (const [key, value] of Object.entries(prepared?.dirParams || {})) {
366
+ if (typeof value !== "string")
367
+ throw new Error(`prepare returned a non-string value for ":${key}"`);
368
+ dirParams[key] = value;
369
+ }
370
+ const values = {};
371
+ for (const [key, value] of Object.entries(req.params || {}))
372
+ if (typeof value === "string")
373
+ values[key] = value;
374
+ Object.assign(values, dirParams);
375
+ const uploadDir = normalizeUploadDir(substituteUploadTemplate(settings.uploadDir || determineUploadDir(file), values, "upload directory"));
376
+ let urlPath;
377
+ let urlPathExact = false;
378
+ if (settings.urlPath && typeof settings.urlPath === "object") {
379
+ urlPath = normalizeUploadUrlPath(settings.urlPath.exact);
380
+ urlPathExact = true;
381
+ }
382
+ else {
383
+ urlPath = normalizeUploadUrlPath(substituteUploadTemplate(settings.urlPath || `/${uploadDir}`, values, "upload URL path"));
384
+ }
385
+ const resolved = {
386
+ dirParams,
387
+ uploadDir,
388
+ urlPath,
389
+ urlPathExact,
390
+ };
391
+ (req.__arkos.preparedUploads ??= new Map()).set(settings.key, resolved);
392
+ return resolved;
393
+ }
394
+ nextFileIndex(req, file) {
395
+ req.__arkos ??= {};
396
+ const indexes = (req.__arkos.uploadFileIndexes ??= {});
397
+ const index = indexes[file.fieldname] ?? 0;
398
+ indexes[file.fieldname] = index + 1;
399
+ return index;
400
+ }
401
+ async cleanupRequestFiles(req) {
402
+ const paths = req.__arkos?.uploadWrittenPaths || [];
403
+ for (const filePath of paths) {
404
+ try {
405
+ await fs.promises.unlink(filePath);
406
+ }
407
+ catch (error) {
408
+ if (error?.code !== "ENOENT")
409
+ sheu.warn(`Failed to delete file: ${filePath} because ${error.message}`, { timestamp: true });
410
+ }
411
+ }
412
+ if (req.__arkos) {
413
+ req.__arkos.uploadWrittenPaths = [];
414
+ req.__arkos.uploadTargetPaths = new Set();
415
+ }
416
+ delete req.file;
417
+ delete req.files;
418
+ }
59
419
  getUpload({ maxSize = 1024 * 1024 * 5, allowedFileTypes = /.*/, }) {
60
420
  return multer({
61
421
  storage,
@@ -64,22 +424,67 @@ class UploadManager {
64
424
  });
65
425
  }
66
426
  getMiddleware(config) {
67
- let upload;
68
- if (config.type === "single")
69
- upload = this.getUpload(config)[config.type](config.field);
70
- else if (config.type === "array")
71
- upload = this.getUpload(config)[config.type](config.field, config.maxCount || 5);
72
- else
73
- upload = this.getUpload(config)[config.type](config.fields);
74
- return upload;
427
+ if (configHasNestedArrayPaths(config)) {
428
+ return multer({ storage }).any();
429
+ }
430
+ if (config.type === "single") {
431
+ return this.getUpload(config).single(config.field);
432
+ }
433
+ else if (config.type === "array") {
434
+ return this.getUpload(config).array(config.field, config.maxCount ?? 5);
435
+ }
436
+ else {
437
+ const multerOptions = "maxSize" in config || "allowedFileTypes" in config
438
+ ? {
439
+ maxSize: config.maxSize,
440
+ allowedFileTypes: config.allowedFileTypes,
441
+ }
442
+ : {};
443
+ return this.getUpload(multerOptions).fields(flattenFieldsForMulter(config.fields));
444
+ }
445
+ }
446
+ registerUploadConfig(config, route) {
447
+ const register = (dir, urlPath, serve, hasPrepare, type) => uploadServingRegistry.registerWrite({
448
+ dir,
449
+ urlPath,
450
+ serve,
451
+ route,
452
+ hasPrepare,
453
+ type,
454
+ });
455
+ if (config.type === "single" || config.type === "array") {
456
+ register(config.uploadDir, config.urlPath, config.serve, !!config.prepare, config.type);
457
+ return;
458
+ }
459
+ for (const field of config.fields) {
460
+ const isLegacy = !("type" in field) || field.type === undefined;
461
+ if (isLegacy) {
462
+ register(config.uploadDir, config.urlPath, config.serve, !!config.prepare, "array");
463
+ continue;
464
+ }
465
+ register(field.uploadDir ?? config.uploadDir, field.urlPath ?? config.urlPath, field.serve ?? config.serve, !!(field.prepare ?? config.prepare), field.type ?? "array");
466
+ }
75
467
  }
76
468
  handleUpload(config, oldFilePath) {
77
469
  return catchAsync((req, res, next) => {
78
470
  const middleware = this.getMiddleware(config);
79
- req.headers["x-upload-dir"] = config.uploadDir;
471
+ req.__arkos = { ...req.__arkos, uploadConfig: config };
80
472
  middleware(req, res, async (err) => {
81
- if (err)
473
+ if (err) {
474
+ if (err instanceof ConflictError ||
475
+ err?.code === "UploadConflict")
476
+ await this.cleanupRequestFiles(req);
82
477
  return next(err);
478
+ }
479
+ if (configHasNestedArrayPaths(config) && Array.isArray(req.files)) {
480
+ const normalized = {};
481
+ for (const file of req.files) {
482
+ if (!normalized[file.fieldname])
483
+ normalized[file.fieldname] = [];
484
+ normalized[file.fieldname].push(file);
485
+ }
486
+ req.files = normalized;
487
+ }
83
488
  if (oldFilePath) {
84
489
  const { fileUpload: configs } = getArkosConfig();
85
490
  const filePath = path.resolve(process.cwd(), removeBothSlashes(configs?.baseUploadDir), removeBothSlashes(oldFilePath));
@@ -100,43 +505,98 @@ class UploadManager {
100
505
  return catchAsync((req, _, next) => {
101
506
  const errors = [];
102
507
  const errorCodes = [];
103
- if (uploadConfig.required === false)
104
- return next();
105
- if (uploadConfig.type === "single") {
106
- if (!req.file) {
107
- errors.push(`Required upload field '${uploadConfig.field}' is missing`);
108
- errorCodes.push(uploadConfig.field);
508
+ const addError = (msg, code) => {
509
+ errors.push(msg);
510
+ errorCodes.push(code);
511
+ };
512
+ const validateField = (field, type, required, minCount, maxCount, allowedFileTypes, maxSize) => {
513
+ const isNested = isNestedArrayPath(field);
514
+ if (isNested) {
515
+ const filesObj = req.files;
516
+ if (!filesObj || Array.isArray(filesObj)) {
517
+ if (required)
518
+ addError(`Required field '${field}' is missing`, field);
519
+ return;
520
+ }
521
+ const groups = groupFilesByPattern(filesObj, field);
522
+ if (groups.size === 0) {
523
+ if (required)
524
+ addError(`Required field '${field}' is missing`, field);
525
+ return;
526
+ }
527
+ for (const [groupKey, groupFiles] of groups) {
528
+ const label = `'${field}' (group ${groupKey})`;
529
+ if (type === "single" && groupFiles.length !== 1) {
530
+ addError(`Field ${label} must have exactly 1 file`, field);
531
+ }
532
+ if (type === "array") {
533
+ if (minCount && groupFiles.length < minCount) {
534
+ addError(`Field ${label} requires at least ${minCount} files, got ${groupFiles.length}`, field);
535
+ }
536
+ if (maxCount && groupFiles.length > maxCount) {
537
+ addError(`Field ${label} allows at most ${maxCount} files, got ${groupFiles.length}`, field);
538
+ }
539
+ }
540
+ for (const file of groupFiles) {
541
+ const err = validateFileConstraints(file, allowedFileTypes, maxSize);
542
+ if (err)
543
+ addError(err, field);
544
+ }
545
+ }
109
546
  }
547
+ else {
548
+ if (type === "single") {
549
+ if (required && !req.file) {
550
+ addError(`Required upload field '${field}' is missing`, field);
551
+ }
552
+ }
553
+ else {
554
+ const filesObj = req.files;
555
+ const files = Array.isArray(req.files)
556
+ ? req.files
557
+ : filesObj?.[field];
558
+ if (!files || files.length === 0) {
559
+ if (required)
560
+ addError(`Required upload field '${field}' is missing or empty`, field);
561
+ }
562
+ else if (!Array.isArray(files)) {
563
+ if (required)
564
+ addError(`Malformed upload field '${field}'`, field);
565
+ }
566
+ else {
567
+ if (minCount && files.length < minCount) {
568
+ addError(`Field '${field}' requires at least ${minCount} files, got ${files.length}`, field);
569
+ }
570
+ }
571
+ }
572
+ }
573
+ };
574
+ if (uploadConfig.type === "single") {
575
+ validateField(uploadConfig.field, "single", uploadConfig.required !== false, undefined, undefined, isNestedArrayPath(uploadConfig.field)
576
+ ? uploadConfig.allowedFileTypes
577
+ : undefined, isNestedArrayPath(uploadConfig.field)
578
+ ? uploadConfig.maxSize
579
+ : undefined);
110
580
  }
111
581
  else if (uploadConfig.type === "array") {
112
- if (!req.files || !Array.isArray(req.files) || req.files.length === 0) {
113
- errors.push(`Required upload field '${uploadConfig.field}' is missing or empty`);
114
- errorCodes.push(uploadConfig.field);
115
- }
582
+ validateField(uploadConfig.field, "array", uploadConfig.required !== false, uploadConfig.minCount, uploadConfig.maxCount, isNestedArrayPath(uploadConfig.field)
583
+ ? uploadConfig.allowedFileTypes
584
+ : undefined, isNestedArrayPath(uploadConfig.field)
585
+ ? uploadConfig.maxSize
586
+ : undefined);
116
587
  }
117
588
  else if (uploadConfig.type === "fields") {
118
- if (!req.files ||
119
- typeof req.files !== "object" ||
120
- Array.isArray(req.files)) {
121
- errors.push(`Required upload fields are missing. Expected an object with fields: ${uploadConfig.fields.map((f) => f.name).join(", ")}`);
122
- errorCodes.push(...uploadConfig.fields.map((f) => f.name));
123
- }
124
- else {
125
- for (const field of uploadConfig.fields) {
126
- const filesForField = req.files[field.name];
127
- if (!filesForField ||
128
- !Array.isArray(filesForField) ||
129
- filesForField.length === 0) {
130
- errors.push(`Required upload field '${field.name}' is missing or empty`);
131
- errorCodes.push(field.name);
132
- }
133
- }
589
+ for (const fieldEntry of uploadConfig.fields) {
590
+ const resolved = resolveFieldEntry(fieldEntry, uploadConfig);
591
+ validateField(resolved.name, resolved.type, resolved.required, resolved.minCount, resolved.maxCount, isNestedArrayPath(resolved.name)
592
+ ? resolved.allowedFileTypes
593
+ : undefined, isNestedArrayPath(resolved.name) ? resolved.maxSize : undefined);
134
594
  }
135
595
  }
136
596
  if (errors.length > 0) {
137
- throw new AppError(errors[0], 400, `Missing${pascalCase(errorCodes[0]).replaceAll("_", "")}FileField`, {
138
- errors,
139
- });
597
+ throw new AppError(errors[0], 400, uploadConfig.type !== "single"
598
+ ? `MissingUploadFields`
599
+ : `MissingUploadField`, { errors });
140
600
  }
141
601
  next();
142
602
  });
@@ -156,7 +616,8 @@ class UploadManager {
156
616
  await deleteFile(req.file);
157
617
  delete req.file;
158
618
  }
159
- else if (config.type === "array" && Array.isArray(req.files)) {
619
+ else if ((config.type === "array" || configHasNestedArrayPaths(config)) &&
620
+ Array.isArray(req.files)) {
160
621
  for (const file of req.files) {
161
622
  await deleteFile(file);
162
623
  }
@@ -180,39 +641,33 @@ class UploadManager {
180
641
  };
181
642
  }
182
643
  handlePostUpload(config) {
183
- return catchAsync((req, _, next) => {
644
+ return catchAsync(async (req, _, next) => {
184
645
  const { baseURL, baseRoute } = extractRequestInfo(req);
185
- const arkosConfig = getArkosConfig();
186
- const normalizePath = (filePath) => {
187
- let fullBaseUploadDir = path.resolve(path.join(process.cwd(), arkosConfig.fileUpload?.baseUploadDir));
188
- fullBaseUploadDir = fullBaseUploadDir.replace(process.cwd(), "");
189
- return filePath
190
- .replaceAll(process.cwd(), "")
191
- .replace(`/${fullBaseUploadDir}`, "")
192
- .replace(fullBaseUploadDir, "")
193
- .replace(/\\/g, "/");
646
+ const baseRoutePath = baseRoute === "/" ? "" : normalizeUploadUrlPath(baseRoute);
647
+ const getPublicRelativePath = (file) => {
648
+ if (file.__arkos?.urlPathExact)
649
+ return normalizeUploadUrlPath(file.__arkos.urlPath || "/");
650
+ const publicDir = file.__arkos?.urlPath ||
651
+ `/${normalizeUploadDir(file.__arkos?.uploadDir || "")}`;
652
+ return `${normalizeUploadUrlPath(publicDir)}/${file.filename || path.basename(file.path)}`.replace(/\/+/g, "/");
194
653
  };
195
- const buildFileURL = (file) => {
196
- const relativePath = generateRelativePath(file.path, req.headers["x-upload-dir"]);
197
- return `${baseURL}${baseRoute === "/" ? "" : baseRoute}${relativePath.startsWith("/") ? relativePath : `/${relativePath}`}`;
198
- };
199
- const getAttachValue = (file) => {
654
+ const buildFileURL = (file) => `${baseURL}${baseRoutePath}${getPublicRelativePath(file)}`;
655
+ const getAttachValue = (file, attachToBody) => {
200
656
  const url = buildFileURL(file);
201
657
  file.url = url;
202
- file.pathname = normalizePath(file.path);
203
- if (config.attachToBody === false)
658
+ file.pathname = `${baseRoutePath}${getPublicRelativePath(file)}`;
659
+ if (attachToBody === false)
204
660
  return undefined;
205
- if (config.attachToBody === "pathname" || !config.attachToBody)
206
- return ((baseRoute === "/"
207
- ? ""
208
- : baseRoute.startsWith("/")
209
- ? baseRoute
210
- : `/${baseRoute}`) + normalizePath(file.path));
211
- if (config.attachToBody === "url")
661
+ if (attachToBody === "url")
212
662
  return url;
213
- if (config.attachToBody === "file")
663
+ if (attachToBody === "file")
214
664
  return file;
215
- return undefined;
665
+ if (typeof attachToBody === "function") {
666
+ const result = attachToBody(file);
667
+ if (result)
668
+ return result;
669
+ }
670
+ return file.pathname;
216
671
  };
217
672
  const setNestedValue = (obj, path, value) => {
218
673
  const keys = path.match(/[^\[\]]+/g) || [];
@@ -228,50 +683,159 @@ class UploadManager {
228
683
  const lastKey = keys[keys.length - 1];
229
684
  current[lastKey] = value;
230
685
  };
231
- try {
232
- if (config.type === "single" && req.file) {
233
- const value = getAttachValue(req.file);
234
- if (value !== undefined && config.field) {
235
- const bodyUpdate = {};
236
- setNestedValue(bodyUpdate, config.field, value);
237
- req.body = deepmerge(req.body || {}, bodyUpdate);
686
+ const reconstructNestedArrayPath = (pattern, filesObj, attachToBody, type, sharedBodyUpdate) => {
687
+ const groups = groupFilesByPattern(filesObj, pattern);
688
+ if (groups.size === 0)
689
+ return;
690
+ const segments = pattern.match(/[^\[\]]+|\[\]/g) || [];
691
+ const sortedGroups = [...groups.entries()].sort((a, b) => {
692
+ const ai = a[0].split(",").map(Number);
693
+ const bi = b[0].split(",").map(Number);
694
+ for (let i = 0; i < Math.min(ai.length, bi.length); i++) {
695
+ if (ai[i] !== bi[i])
696
+ return ai[i] - bi[i];
238
697
  }
239
- }
240
- else if (config.type === "array" && Array.isArray(req.files)) {
241
- const values = req.files
242
- .map((file) => getAttachValue(file))
698
+ return 0;
699
+ });
700
+ const bodyUpdate = sharedBodyUpdate ?? {};
701
+ for (const [groupKey, groupFiles] of sortedGroups) {
702
+ const indices = groupKey.split(",").map(Number);
703
+ let indexCounter = 0;
704
+ const concretePath = segments
705
+ .map((seg) => {
706
+ if (seg === "[]")
707
+ return `[${indices[indexCounter++]}]`;
708
+ return seg;
709
+ })
710
+ .reduce((acc, seg, i) => {
711
+ if (i === 0)
712
+ return seg;
713
+ if (seg.startsWith("["))
714
+ return acc + seg;
715
+ return acc + `[${seg}]`;
716
+ }, "");
717
+ const values = groupFiles
718
+ .map((f) => getAttachValue(f, attachToBody))
243
719
  .filter((v) => v !== undefined);
244
- if (values.length > 0 && config.field) {
245
- const bodyUpdate = {};
246
- setNestedValue(bodyUpdate, config.field, values);
247
- req.body = deepmerge(req.body || {}, bodyUpdate);
720
+ if (values.length === 0)
721
+ continue;
722
+ const valueToSet = type === "single" ? values[0] : values;
723
+ setNestedValue(bodyUpdate, concretePath, valueToSet);
724
+ }
725
+ if (!sharedBodyUpdate) {
726
+ req.body = deepmerge(req.body || {}, bodyUpdate);
727
+ }
728
+ };
729
+ try {
730
+ const imageFiles = collectUploadedFiles(req).filter(isImageFile);
731
+ if (imageFiles.length > 0)
732
+ await optimizeUploadedImages(config, imageFiles);
733
+ if (config.type === "single") {
734
+ if (isNestedArrayPath(config.field)) {
735
+ const filesObj = req.files;
736
+ if (filesObj && !Array.isArray(filesObj)) {
737
+ reconstructNestedArrayPath(config.field, filesObj, config.attachToBody, "single");
738
+ }
739
+ }
740
+ else if (req.file) {
741
+ const value = getAttachValue(req.file, config.attachToBody);
742
+ if (value !== undefined) {
743
+ const bodyUpdate = {};
744
+ setNestedValue(bodyUpdate, config.field, value);
745
+ req.body = deepmerge(req.body || {}, bodyUpdate);
746
+ }
248
747
  }
249
748
  }
250
- else if (config.type === "fields" &&
251
- req.files &&
252
- !Array.isArray(req.files)) {
253
- const bodyUpdate = {};
254
- for (const fieldName in req.files) {
255
- const files = req.files[fieldName];
256
- const values = files
257
- .map((file) => getAttachValue(file))
749
+ else if (config.type === "array") {
750
+ if (isNestedArrayPath(config.field)) {
751
+ const filesObj = req.files;
752
+ if (filesObj && !Array.isArray(filesObj)) {
753
+ reconstructNestedArrayPath(config.field, filesObj, config.attachToBody, "array");
754
+ }
755
+ }
756
+ else if (Array.isArray(req.files)) {
757
+ const values = req.files
758
+ .map((file) => getAttachValue(file, config.attachToBody))
258
759
  .filter((v) => v !== undefined);
259
760
  if (values.length > 0) {
260
- const valueToAttach = values.length === 1 ? values[0] : values;
261
- setNestedValue(bodyUpdate, fieldName, valueToAttach);
761
+ const bodyUpdate = {};
762
+ setNestedValue(bodyUpdate, config.field, values);
763
+ req.body = deepmerge(req.body || {}, bodyUpdate);
764
+ }
765
+ }
766
+ }
767
+ else if (config.type === "fields") {
768
+ const filesObj = req.files;
769
+ if (!filesObj || Array.isArray(filesObj))
770
+ return next();
771
+ const bodyUpdate = {};
772
+ const configAttachToBody = "attachToBody" in config ? config.attachToBody : undefined;
773
+ for (const fieldEntry of config.fields) {
774
+ const resolved = resolveFieldEntry(fieldEntry);
775
+ if (isNestedArrayPath(resolved.name)) {
776
+ reconstructNestedArrayPath(resolved.name, filesObj, resolved.attachToBody ?? configAttachToBody, resolved.type, bodyUpdate);
777
+ }
778
+ else {
779
+ const files = filesObj[resolved.name];
780
+ if (!files || files.length === 0)
781
+ continue;
782
+ const attachTo = resolved.attachToBody ?? configAttachToBody;
783
+ const values = files
784
+ .map((f) => getAttachValue(f, attachTo))
785
+ .filter((v) => v !== undefined);
786
+ if (values.length === 0)
787
+ continue;
788
+ const valueToAttach = resolved.type === "single" ? values[0] : values;
789
+ setNestedValue(bodyUpdate, resolved.name, valueToAttach);
262
790
  }
263
791
  }
264
792
  if (Object.keys(bodyUpdate).length > 0) {
265
- req.body = deepmerge(req.body || {}, bodyUpdate);
793
+ req.body = deepmerge(req.body || {}, bodyUpdate, {
794
+ arrayMerge: (target, source) => {
795
+ const result = [...target];
796
+ source.forEach((item, i) => {
797
+ result[i] = result[i] ? deepmerge(result[i], item) : item;
798
+ });
799
+ return result;
800
+ },
801
+ });
266
802
  }
267
803
  }
268
804
  }
269
805
  catch (err) {
270
- throw new AppError(`File uploads post processing failed ${err.message}`, 500, "FileUploadPostProcessError");
806
+ if (err instanceof AppError)
807
+ throw err;
808
+ throw new Error(`File uploads post processing failed: ${err.message}`);
271
809
  }
272
810
  next();
273
811
  });
274
812
  }
813
+ fileFilter = (_, file, cb, allowedFileTypes) => {
814
+ const ext = path.extname(file.originalname).toLowerCase();
815
+ let isAllowed = false;
816
+ if (Array.isArray(allowedFileTypes))
817
+ isAllowed = allowedFileTypes.includes(ext);
818
+ else
819
+ isAllowed = allowedFileTypes.test(ext);
820
+ if (isAllowed)
821
+ cb(null, true);
822
+ else
823
+ cb(new AppError(`File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll("/", "").split("|").join(", ")}`, 400, "FileTypeNotAllowed", { filename: file.originalname }));
824
+ };
825
+ isAllFieldRequired(uploadConfig) {
826
+ let isRequired = false;
827
+ if (!uploadConfig)
828
+ return false;
829
+ if (uploadConfig.type !== "fields")
830
+ isRequired = uploadConfig.required !== false;
831
+ else {
832
+ isRequired =
833
+ uploadConfig.required !== undefined
834
+ ? uploadConfig.required
835
+ : uploadConfig.fields.every((field) => field.required || field.required === undefined);
836
+ }
837
+ return isRequired;
838
+ }
275
839
  }
276
840
  const uploadManager = new UploadManager();
277
841
  export default uploadManager;