arkos 1.4.0-canary.8 → 1.4.0-canary.80

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 (373) hide show
  1. package/cli.js +3 -5
  2. package/dist/cjs/app.js +104 -72
  3. package/dist/cjs/app.js.map +1 -1
  4. package/dist/cjs/exports/index.js.map +1 -1
  5. package/dist/cjs/exports/services/index.js +6 -1
  6. package/dist/cjs/exports/services/index.js.map +1 -1
  7. package/dist/cjs/modules/auth/auth.controller.js +9 -25
  8. package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
  9. package/dist/cjs/modules/auth/auth.router.js +30 -22
  10. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  11. package/dist/cjs/modules/auth/auth.service.js +35 -11
  12. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  13. package/dist/cjs/modules/auth/utils/services/auth-action.service.js +16 -10
  14. package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
  15. package/dist/cjs/modules/base/base.controller.js +3 -4
  16. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  17. package/dist/cjs/modules/base/base.middlewares.js +33 -8
  18. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  19. package/dist/cjs/modules/base/base.router.js +4 -3
  20. package/dist/cjs/modules/base/base.router.js.map +1 -1
  21. package/dist/cjs/modules/base/base.service.js +68 -66
  22. package/dist/cjs/modules/base/base.service.js.map +1 -1
  23. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +17 -40
  24. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  25. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +22 -6
  26. package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  27. package/dist/cjs/modules/debugger/debugger.service.js +11 -4
  28. package/dist/cjs/modules/debugger/debugger.service.js.map +1 -1
  29. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js +1 -1
  30. package/dist/cjs/modules/debugger/utils/loaded-components-logger.js.map +1 -1
  31. package/dist/cjs/modules/email/email.service.js +7 -5
  32. package/dist/cjs/modules/email/email.service.js.map +1 -1
  33. package/dist/cjs/modules/error-handler/error-handler.controller.js +22 -15
  34. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  35. package/dist/cjs/modules/error-handler/utils/app-error.js +14 -3
  36. package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
  37. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +1 -1
  38. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  39. package/dist/cjs/modules/file-upload/file-upload.controller.js +5 -6
  40. package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
  41. package/dist/cjs/modules/file-upload/file-upload.router.js +13 -5
  42. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  43. package/dist/cjs/modules/file-upload/file-upload.service.js +38 -48
  44. package/dist/cjs/modules/file-upload/file-upload.service.js.map +1 -1
  45. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js +134 -0
  46. package/dist/cjs/modules/file-upload/utils/helpers/file-extensions.js.map +1 -0
  47. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +10 -5
  48. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  49. package/dist/cjs/modules/swagger/swagger.router.js +11 -5
  50. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  51. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js +53 -0
  52. package/dist/cjs/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -0
  53. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +10 -10
  54. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  55. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +419 -0
  56. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -0
  57. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +3 -3
  58. package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
  59. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +4 -6
  60. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  61. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +4 -4
  62. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
  63. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -1
  64. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
  65. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +9 -9
  66. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  67. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +9 -9
  68. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  69. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +6 -8
  70. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  71. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +204 -0
  72. package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -0
  73. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +9 -9
  74. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  75. package/dist/cjs/server.js +33 -36
  76. package/dist/cjs/server.js.map +1 -1
  77. package/dist/cjs/types/arkos-config.js.map +1 -1
  78. package/dist/cjs/types/auth.js.map +1 -1
  79. package/dist/cjs/types/index.js.map +1 -1
  80. package/dist/cjs/types/new-arkos-config.js +3 -0
  81. package/dist/cjs/types/new-arkos-config.js.map +1 -0
  82. package/dist/cjs/types/router-config.js.map +1 -1
  83. package/dist/cjs/utils/arkos-router/index.js +91 -37
  84. package/dist/cjs/utils/arkos-router/index.js.map +1 -1
  85. package/dist/cjs/utils/arkos-router/route-config-validator.js +9 -8
  86. package/dist/cjs/utils/arkos-router/route-config-validator.js.map +1 -1
  87. package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
  88. package/dist/cjs/utils/arkos-router/types/openapi-config.js +3 -0
  89. package/dist/cjs/utils/arkos-router/types/openapi-config.js.map +1 -0
  90. package/dist/cjs/utils/arkos-router/types/upload-config.js +3 -0
  91. package/dist/cjs/utils/arkos-router/types/upload-config.js.map +1 -0
  92. package/dist/cjs/utils/arkos-router/utils/helpers/index.js +24 -6
  93. package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
  94. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +232 -0
  95. package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -0
  96. package/dist/cjs/utils/cli/build.js +9 -13
  97. package/dist/cjs/utils/cli/build.js.map +1 -1
  98. package/dist/cjs/utils/cli/dev.js +8 -7
  99. package/dist/cjs/utils/cli/dev.js.map +1 -1
  100. package/dist/cjs/utils/cli/export-auth-action.js +79 -0
  101. package/dist/cjs/utils/cli/export-auth-action.js.map +1 -0
  102. package/dist/cjs/utils/cli/generate.js +28 -12
  103. package/dist/cjs/utils/cli/generate.js.map +1 -1
  104. package/dist/cjs/utils/cli/index.js +32 -18
  105. package/dist/cjs/utils/cli/index.js.map +1 -1
  106. package/dist/cjs/utils/cli/prisma-generate.js +2 -2
  107. package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
  108. package/dist/cjs/utils/cli/start.js +13 -52
  109. package/dist/cjs/utils/cli/start.js.map +1 -1
  110. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  111. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +58 -0
  112. package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +1 -0
  113. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +38 -13
  114. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
  115. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +44 -17
  116. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
  117. package/dist/cjs/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +12 -2
  118. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
  119. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js +1 -34
  120. package/dist/cjs/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  121. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +97 -265
  122. package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  123. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js +16 -16
  124. package/dist/cjs/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  125. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +4 -1
  126. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  127. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js +8 -32
  128. package/dist/cjs/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  129. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +3 -5
  130. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +1 -1
  131. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +1 -1
  132. package/dist/cjs/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +1 -1
  133. package/dist/cjs/utils/cli/utils/template-generators.js +2 -2
  134. package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
  135. package/dist/cjs/utils/cli/utils/watermark-stamper.js +14 -5
  136. package/dist/cjs/utils/cli/utils/watermark-stamper.js.map +1 -1
  137. package/dist/cjs/utils/define-config.js +2 -0
  138. package/dist/cjs/utils/define-config.js.map +1 -0
  139. package/dist/cjs/utils/dotenv.helpers.js +2 -1
  140. package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
  141. package/dist/cjs/utils/dynamic-loader.js +6 -5
  142. package/dist/cjs/utils/dynamic-loader.js.map +1 -1
  143. package/dist/cjs/utils/features/port-and-host-allocator.js +28 -4
  144. package/dist/cjs/utils/features/port-and-host-allocator.js.map +1 -1
  145. package/dist/cjs/utils/helpers/arkos-config.helpers.js +45 -0
  146. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -0
  147. package/dist/cjs/utils/helpers/dynamic-loader.helpers.js +135 -46
  148. package/dist/cjs/utils/helpers/dynamic-loader.helpers.js.map +1 -1
  149. package/dist/cjs/utils/helpers/fs.helpers.js +1 -4
  150. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  151. package/dist/cjs/utils/helpers/routers.helpers.js +55 -4
  152. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
  153. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +20 -31
  154. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  155. package/dist/cjs/utils/prisma/prisma-schema-parser.js +3 -4
  156. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
  157. package/dist/cjs/utils/sheu.js.map +1 -1
  158. package/dist/cjs/utils/validate-schema.js +1 -1
  159. package/dist/cjs/utils/validate-schema.js.map +1 -1
  160. package/dist/esm/app.js +104 -72
  161. package/dist/esm/app.js.map +1 -1
  162. package/dist/esm/exports/index.js.map +1 -1
  163. package/dist/esm/exports/services/index.js +2 -1
  164. package/dist/esm/exports/services/index.js.map +1 -1
  165. package/dist/esm/modules/auth/auth.controller.js +10 -26
  166. package/dist/esm/modules/auth/auth.controller.js.map +1 -1
  167. package/dist/esm/modules/auth/auth.router.js +33 -25
  168. package/dist/esm/modules/auth/auth.router.js.map +1 -1
  169. package/dist/esm/modules/auth/auth.service.js +35 -11
  170. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  171. package/dist/esm/modules/auth/utils/services/auth-action.service.js +12 -9
  172. package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
  173. package/dist/esm/modules/base/base.controller.js +3 -4
  174. package/dist/esm/modules/base/base.controller.js.map +1 -1
  175. package/dist/esm/modules/base/base.middlewares.js +33 -8
  176. package/dist/esm/modules/base/base.middlewares.js.map +1 -1
  177. package/dist/esm/modules/base/base.router.js +4 -3
  178. package/dist/esm/modules/base/base.router.js.map +1 -1
  179. package/dist/esm/modules/base/base.service.js +68 -66
  180. package/dist/esm/modules/base/base.service.js.map +1 -1
  181. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js +19 -41
  182. package/dist/esm/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  183. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +22 -6
  184. package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
  185. package/dist/esm/modules/debugger/debugger.service.js +11 -4
  186. package/dist/esm/modules/debugger/debugger.service.js.map +1 -1
  187. package/dist/esm/modules/debugger/utils/loaded-components-logger.js +1 -1
  188. package/dist/esm/modules/debugger/utils/loaded-components-logger.js.map +1 -1
  189. package/dist/esm/modules/email/email.service.js +7 -5
  190. package/dist/esm/modules/email/email.service.js.map +1 -1
  191. package/dist/esm/modules/error-handler/error-handler.controller.js +22 -12
  192. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  193. package/dist/esm/modules/error-handler/utils/app-error.js +14 -3
  194. package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
  195. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +1 -1
  196. package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  197. package/dist/esm/modules/file-upload/file-upload.controller.js +5 -6
  198. package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
  199. package/dist/esm/modules/file-upload/file-upload.router.js +13 -5
  200. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  201. package/dist/esm/modules/file-upload/file-upload.service.js +37 -47
  202. package/dist/esm/modules/file-upload/file-upload.service.js.map +1 -1
  203. package/dist/esm/modules/file-upload/utils/helpers/file-extensions.js +131 -0
  204. package/dist/esm/modules/file-upload/utils/helpers/file-extensions.js.map +1 -0
  205. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js +9 -5
  206. package/dist/esm/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  207. package/dist/esm/modules/swagger/swagger.router.js +11 -5
  208. package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
  209. package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js +48 -0
  210. package/dist/esm/modules/swagger/utils/helpers/class-validator-to-json-schema.js.map +1 -0
  211. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +10 -10
  212. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  213. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +413 -0
  214. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -0
  215. package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +3 -3
  216. package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
  217. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +3 -5
  218. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -1
  219. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +4 -4
  220. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -1
  221. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js +1 -1
  222. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.js.map +1 -1
  223. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +9 -9
  224. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
  225. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js +9 -9
  226. package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.js.map +1 -1
  227. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +6 -8
  228. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  229. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +199 -0
  230. package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -0
  231. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +9 -9
  232. package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
  233. package/dist/esm/server.js +31 -34
  234. package/dist/esm/server.js.map +1 -1
  235. package/dist/esm/types/arkos-config.js.map +1 -1
  236. package/dist/esm/types/auth.js.map +1 -1
  237. package/dist/esm/types/index.js.map +1 -1
  238. package/dist/esm/types/new-arkos-config.js +2 -0
  239. package/dist/esm/types/new-arkos-config.js.map +1 -0
  240. package/dist/esm/types/router-config.js.map +1 -1
  241. package/dist/esm/utils/arkos-router/index.js +91 -37
  242. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  243. package/dist/esm/utils/arkos-router/route-config-validator.js +9 -8
  244. package/dist/esm/utils/arkos-router/route-config-validator.js.map +1 -1
  245. package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
  246. package/dist/esm/utils/arkos-router/types/openapi-config.js +2 -0
  247. package/dist/esm/utils/arkos-router/types/openapi-config.js.map +1 -0
  248. package/dist/esm/utils/arkos-router/types/upload-config.js +2 -0
  249. package/dist/esm/utils/arkos-router/types/upload-config.js.map +1 -0
  250. package/dist/esm/utils/arkos-router/utils/helpers/index.js +23 -5
  251. package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
  252. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +227 -0
  253. package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -0
  254. package/dist/esm/utils/cli/build.js +9 -13
  255. package/dist/esm/utils/cli/build.js.map +1 -1
  256. package/dist/esm/utils/cli/dev.js +8 -7
  257. package/dist/esm/utils/cli/dev.js.map +1 -1
  258. package/dist/esm/utils/cli/export-auth-action.js +73 -0
  259. package/dist/esm/utils/cli/export-auth-action.js.map +1 -0
  260. package/dist/esm/utils/cli/generate.js +28 -12
  261. package/dist/esm/utils/cli/generate.js.map +1 -1
  262. package/dist/esm/utils/cli/index.js +32 -18
  263. package/dist/esm/utils/cli/index.js.map +1 -1
  264. package/dist/esm/utils/cli/prisma-generate.js +2 -2
  265. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  266. package/dist/esm/utils/cli/start.js +13 -52
  267. package/dist/esm/utils/cli/start.js.map +1 -1
  268. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  269. package/dist/esm/utils/cli/utils/runtime-cli-commander.js +53 -0
  270. package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -0
  271. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +38 -13
  272. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
  273. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +44 -17
  274. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
  275. package/dist/esm/utils/cli/utils/template-generator/templates/{controller-template.js → generate-controller-template.js} +12 -2
  276. package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -0
  277. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js +1 -34
  278. package/dist/esm/utils/cli/utils/template-generator/templates/hooks-template.js.map +1 -1
  279. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +97 -265
  280. package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
  281. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js +16 -16
  282. package/dist/esm/utils/cli/utils/template-generator/templates/query-options-template.js.map +1 -1
  283. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +4 -1
  284. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  285. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js +8 -32
  286. package/dist/esm/utils/cli/utils/template-generator/templates/service-template.js.map +1 -1
  287. package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js +3 -5
  288. package/dist/esm/utils/cli/utils/template-generator/templates/zod/create-schema-template.js.map +1 -1
  289. package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js +1 -1
  290. package/dist/esm/utils/cli/utils/template-generator/templates/zod/update-schema-template.js.map +1 -1
  291. package/dist/esm/utils/cli/utils/template-generators.js +1 -1
  292. package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
  293. package/dist/esm/utils/cli/utils/watermark-stamper.js +11 -5
  294. package/dist/esm/utils/cli/utils/watermark-stamper.js.map +1 -1
  295. package/dist/esm/utils/define-config.js +2 -0
  296. package/dist/esm/utils/define-config.js.map +1 -0
  297. package/dist/esm/utils/dotenv.helpers.js +2 -1
  298. package/dist/esm/utils/dotenv.helpers.js.map +1 -1
  299. package/dist/esm/utils/dynamic-loader.js +7 -6
  300. package/dist/esm/utils/dynamic-loader.js.map +1 -1
  301. package/dist/esm/utils/features/port-and-host-allocator.js +28 -4
  302. package/dist/esm/utils/features/port-and-host-allocator.js.map +1 -1
  303. package/dist/esm/utils/helpers/arkos-config.helpers.js +38 -0
  304. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -0
  305. package/dist/esm/utils/helpers/dynamic-loader.helpers.js +134 -46
  306. package/dist/esm/utils/helpers/dynamic-loader.helpers.js.map +1 -1
  307. package/dist/esm/utils/helpers/fs.helpers.js +1 -4
  308. package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
  309. package/dist/esm/utils/helpers/routers.helpers.js +53 -4
  310. package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
  311. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +20 -31
  312. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  313. package/dist/esm/utils/prisma/prisma-schema-parser.js +3 -4
  314. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  315. package/dist/esm/utils/sheu.js.map +1 -1
  316. package/dist/esm/utils/validate-schema.js +1 -1
  317. package/dist/esm/utils/validate-schema.js.map +1 -1
  318. package/dist/types/app.d.ts +2 -2
  319. package/dist/types/exports/index.d.ts +3 -2
  320. package/dist/types/exports/services/index.d.ts +2 -1
  321. package/dist/types/modules/auth/auth.controller.d.ts +2 -2
  322. package/dist/types/modules/auth/auth.router.d.ts +2 -3
  323. package/dist/types/modules/auth/auth.service.d.ts +6 -0
  324. package/dist/types/modules/auth/utils/services/auth-action.service.d.ts +1 -0
  325. package/dist/types/modules/base/base.middlewares.d.ts +1 -1
  326. package/dist/types/modules/base/base.router.d.ts +2 -2
  327. package/dist/types/modules/base/base.service.d.ts +2 -1
  328. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +2 -4
  329. package/dist/types/modules/debugger/debugger.service.d.ts +1 -1
  330. package/dist/types/modules/email/email.service.d.ts +1 -1
  331. package/dist/types/modules/error-handler/utils/app-error.d.ts +1 -1
  332. package/dist/types/modules/file-upload/file-upload.router.d.ts +2 -2
  333. package/dist/types/modules/file-upload/file-upload.service.d.ts +24 -2
  334. package/dist/types/modules/file-upload/utils/helpers/file-extensions.d.ts +3 -0
  335. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
  336. package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
  337. package/dist/types/modules/swagger/utils/helpers/class-validator-to-json-schema.d.ts +3 -0
  338. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +2 -2
  339. package/dist/types/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.d.ts +3 -0
  340. package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +2 -45
  341. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -1
  342. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +1 -1
  343. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schemas.d.ts +1 -1
  344. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +1 -1
  345. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes-paths.d.ts +1 -1
  346. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +1 -1
  347. package/dist/types/modules/swagger/utils/helpers/openapi-schema-converter.d.ts +17 -0
  348. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +3 -3
  349. package/dist/types/server.d.ts +4 -6
  350. package/dist/types/types/arkos-config.d.ts +4 -181
  351. package/dist/types/types/auth.d.ts +1 -1
  352. package/dist/types/types/index.d.ts +5 -4
  353. package/dist/types/types/new-arkos-config.d.ts +167 -0
  354. package/dist/types/types/router-config.d.ts +16 -23
  355. package/dist/types/utils/arkos-router/types/index.d.ts +40 -10
  356. package/dist/types/utils/arkos-router/types/openapi-config.d.ts +35 -0
  357. package/dist/types/utils/arkos-router/types/upload-config.d.ts +21 -0
  358. package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +13 -0
  359. package/dist/types/utils/cli/export-auth-action.d.ts +4 -0
  360. package/dist/types/utils/cli/generate.d.ts +2 -1
  361. package/dist/types/utils/cli/utils/runtime-cli-commander.d.ts +11 -0
  362. package/dist/types/utils/cli/utils/watermark-stamper.d.ts +3 -3
  363. package/dist/types/utils/define-config.d.ts +0 -0
  364. package/dist/types/utils/features/port-and-host-allocator.d.ts +4 -2
  365. package/dist/types/utils/helpers/arkos-config.helpers.d.ts +7 -0
  366. package/dist/types/utils/helpers/dynamic-loader.helpers.d.ts +1 -0
  367. package/dist/types/utils/helpers/routers.helpers.d.ts +9 -0
  368. package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +1 -1
  369. package/dist/types/utils/validate-schema.d.ts +1 -1
  370. package/package.json +3 -2
  371. package/dist/cjs/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
  372. package/dist/esm/utils/cli/utils/template-generator/templates/controller-template.js.map +0 -1
  373. /package/dist/types/utils/cli/utils/template-generator/templates/{controller-template.d.ts → generate-controller-template.d.ts} +0 -0
@@ -2,14 +2,15 @@ import path from "path";
2
2
  import fs from "fs";
3
3
  import { spawn } from "child_process";
4
4
  import { loadEnvironmentVariables } from "../dotenv.helpers.js";
5
- import { importModule } from "../helpers/global.helpers.js";
6
5
  import { fullCleanCwd } from "../helpers/fs.helpers.js";
7
6
  import portAndHostAllocator from "../features/port-and-host-allocator.js";
8
7
  import watermarkStamper from "./utils/watermark-stamper.js";
9
8
  let child = null;
10
9
  let envFiles;
11
10
  export async function startCommand(options = {}) {
12
- process.env.NODE_ENV = "production";
11
+ if (process.env.NODE_ENV === "test" || !process.env.NODE_ENV)
12
+ process.env.NODE_ENV = "production";
13
+ process.env.ARKOS_BUILD = "true";
13
14
  envFiles = loadEnvironmentVariables();
14
15
  try {
15
16
  const { port, host } = options;
@@ -19,11 +20,12 @@ export async function startCommand(options = {}) {
19
20
  process.exit(1);
20
21
  }
21
22
  const env = {
22
- ...process.env,
23
23
  NODE_ENV: "production",
24
+ ...process.env,
24
25
  ...(port && { CLI_PORT: port }),
25
26
  ...(host && { CLI_HOST: host }),
26
27
  ARKOS_BUILD: "true",
28
+ CLI: "false",
27
29
  };
28
30
  child = spawn("node", [entryPoint], {
29
31
  stdio: "inherit",
@@ -31,58 +33,17 @@ export async function startCommand(options = {}) {
31
33
  shell: true,
32
34
  });
33
35
  process.on("SIGINT", () => {
34
- if (child) {
36
+ if (child)
35
37
  child.kill();
36
- }
37
38
  process.exit(0);
38
39
  });
39
- const checkConfig = async () => {
40
- try {
41
- const { getArkosConfig } = await importModule("../../server");
42
- const config = getArkosConfig();
43
- if (config && config.available) {
44
- const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(env, {
45
- ...config,
46
- logWarning: true,
47
- });
48
- watermarkStamper.stamp({
49
- envFiles,
50
- port: "port" in config && config?.port !== undefined
51
- ? hostAndPort.port
52
- : undefined,
53
- host: hostAndPort.host,
54
- });
55
- return true;
56
- }
57
- return false;
58
- }
59
- catch (err) {
60
- if (!err?.message?.includes("../../server"))
61
- console.error(err);
62
- return false;
63
- }
64
- };
65
- const waitForConfig = async () => {
66
- let attempts = 0;
67
- const maxAttempts = 15;
68
- while (attempts < maxAttempts) {
69
- const ready = await checkConfig();
70
- if (ready)
71
- break;
72
- await new Promise((resolve) => setTimeout(resolve, 100));
73
- attempts++;
74
- }
75
- if (attempts >= maxAttempts) {
76
- if (env.CLI_PORT || env.PORT)
77
- portAndHostAllocator.logWarnings();
78
- watermarkStamper.stamp({
79
- envFiles,
80
- host: env.CLI_HOST || env.HOST,
81
- port: env.CLI_PORT || env.PORT,
82
- });
83
- }
84
- };
85
- waitForConfig();
40
+ const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(env, {
41
+ logWarning: true,
42
+ });
43
+ watermarkStamper.stamp({
44
+ envFiles,
45
+ ...hostAndPort,
46
+ });
86
47
  }
87
48
  catch (error) {
88
49
  console.error("❌ Production server failed to start:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { ChildProcess, spawn } from \"child_process\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport { importModule } from \"../helpers/global.helpers\";\nimport { fullCleanCwd } from \"../helpers/fs.helpers\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface StartOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Production start command for the arkos CLI\n */\nexport async function startCommand(options: StartOptions = {}) {\n process.env.NODE_ENV = \"production\";\n envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n // Check for built app file\n const entryPoint = path.join(process.cwd(), \".build\", \"src\", \"app.js\");\n\n if (!fs.existsSync(path.join(entryPoint))) {\n console.error(\n `❌ Could not find built application entry point at ${fullCleanCwd(entryPoint)}`\n );\n process.exit(1);\n }\n\n // Set environment variables\n const env: { [x: string]: string } = {\n ...process.env,\n NODE_ENV: \"production\",\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n ARKOS_BUILD: \"true\",\n };\n\n // Start the application\n child = spawn(\"node\", [entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n\n // Handle process exit\n process.on(\"SIGINT\", () => {\n if (child) {\n child.kill();\n }\n process.exit(0);\n });\n\n const checkConfig = async () => {\n try {\n const { getArkosConfig } = await importModule(\"../../server\");\n\n const config = getArkosConfig();\n\n if (config && config.available) {\n const hostAndPort =\n await portAndHostAllocator.getHostAndAvailablePort(env, {\n ...config,\n logWarning: true,\n });\n\n watermarkStamper.stamp({\n envFiles,\n port:\n \"port\" in config && config?.port !== undefined\n ? hostAndPort.port\n : undefined,\n host: hostAndPort.host,\n });\n return true;\n }\n return false;\n } catch (err: any) {\n if (!err?.message?.includes(\"../../server\")) console.error(err);\n return false;\n }\n };\n\n // Try to get config periodically\n const waitForConfig = async () => {\n let attempts = 0;\n const maxAttempts = 15;\n\n while (attempts < maxAttempts) {\n const ready = await checkConfig();\n if (ready) break;\n await new Promise((resolve) => setTimeout(resolve, 100));\n attempts++;\n }\n\n // Fall back to defaults if config never became available\n if (attempts >= maxAttempts) {\n if (env.CLI_PORT || env.PORT) portAndHostAllocator.logWarnings();\n\n watermarkStamper.stamp({\n envFiles,\n host: env.CLI_HOST || env.HOST,\n port: env.CLI_PORT || env.PORT,\n });\n }\n };\n\n waitForConfig();\n } catch (error) {\n console.error(\"❌ Production server failed to start:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the production server child process\n */\nexport function killProductionServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAgB,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,oBAAoB,MAAM,qCAAqC,CAAC;AACvE,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AAOzD,IAAI,KAAK,GAAwB,IAAI,CAAC;AACtC,IAAI,QAA8B,CAAC;AAKnC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,UAAwB,EAAE;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ;QAC1D,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC;IAEjC,QAAQ,GAAG,wBAAwB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAEvE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CACX,qDAAqD,YAAY,CAAC,UAAU,CAAC,EAAE,CAChF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAA4B;YACnC,QAAQ,EAAE,YAAY;YACtB,GAAG,OAAO,CAAC,GAAG;YACd,GAAG,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAC/B,WAAW,EAAE,MAAM;YACnB,GAAG,EAAE,OAAO;SACb,CAAC;QAEF,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE;YAClC,KAAK,EAAE,SAAS;YAChB,GAAG;YACH,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAExB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,uBAAuB,CACpE,GAAG,EACH;YACE,UAAU,EAAE,IAAI;SACjB,CACF,CAAC;QAEF,gBAAgB,CAAC,KAAK,CAAC;YACrB,QAAQ;YACR,GAAG,WAAW;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,gCAAgC;IAC7C,KAAsB,EAAE,IAAI,EAAE,EAAE,CAAC;IAClC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { ChildProcess, spawn } from \"child_process\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport { fullCleanCwd } from \"../helpers/fs.helpers\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface StartOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Production start command for the arkos CLI\n */\nexport async function startCommand(options: StartOptions = {}) {\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"production\";\n process.env.ARKOS_BUILD = \"true\";\n\n envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n const entryPoint = path.join(process.cwd(), \".build\", \"src\", \"app.js\");\n\n if (!fs.existsSync(path.join(entryPoint))) {\n console.error(\n `❌ Could not find built application entry point at ${fullCleanCwd(entryPoint)}`\n );\n process.exit(1);\n }\n\n const env: { [x: string]: string } = {\n NODE_ENV: \"production\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n ARKOS_BUILD: \"true\",\n CLI: \"false\",\n };\n\n child = spawn(\"node\", [entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n\n process.on(\"SIGINT\", () => {\n if (child) child.kill();\n\n process.exit(0);\n });\n\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n {\n logWarning: true,\n }\n );\n\n watermarkStamper.stamp({\n envFiles,\n ...hostAndPort,\n });\n } catch (error) {\n console.error(\"❌ Production server failed to start:\", error);\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the production server child process\n */\nexport function killProductionServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
@@ -11,6 +11,6 @@ export function killServerChildProcess() {
11
11
  killProductionServerChildProcess();
12
12
  }
13
13
  export function getVersion() {
14
- return "1.4.0-canary.8";
14
+ return "1.4.0-canary.80";
15
15
  }
16
16
  //# sourceMappingURL=cli.helpers.js.map
@@ -0,0 +1,53 @@
1
+ import { authActionService } from "../../../exports/services/index.js";
2
+ import fs from "fs/promises";
3
+ import path from "path";
4
+ import sheu from "../../sheu.js";
5
+ import { getUserFileExtension } from "../../helpers/fs.helpers.js";
6
+ import { importModule } from "../../helpers/global.helpers.js";
7
+ import deepmerge from "../../helpers/deepmerge.helper.js";
8
+ import { killDevelopmentServerChildProcess } from "../dev.js";
9
+ class RuntimeCliCommander {
10
+ getOptions() {
11
+ return JSON.parse(process.env.CLI_COMMAND_OPTIONS || "{}");
12
+ }
13
+ end() {
14
+ killDevelopmentServerChildProcess();
15
+ process.exit(1);
16
+ }
17
+ async handle() {
18
+ const command = process.env.CLI_COMMAND;
19
+ if (command === "EXPORT_AUTH_ACTION")
20
+ await this.exportAuthAction();
21
+ }
22
+ async exportAuthAction() {
23
+ const options = this.getOptions();
24
+ const authActions = authActionService.getAll();
25
+ const targetPath = path.join(process.cwd(), options.path || "", `auth-actions.${getUserFileExtension()}`);
26
+ let finalAuthActions = authActions;
27
+ let isUpdate = false;
28
+ if (!options.overwrite) {
29
+ try {
30
+ const existingModule = await importModule(targetPath);
31
+ const existingActions = existingModule.default || existingModule;
32
+ finalAuthActions = deepmerge(existingActions, authActions);
33
+ isUpdate = true;
34
+ }
35
+ catch (error) { }
36
+ }
37
+ const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)};
38
+
39
+ export default authActions;
40
+ `;
41
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
42
+ await fs.writeFile(targetPath, fileContent, "utf-8");
43
+ console.info("");
44
+ if (isUpdate)
45
+ sheu.done("Auth actions updated and exported successfully!");
46
+ else
47
+ sheu.done("Auth actions exported successfully!");
48
+ this.end();
49
+ }
50
+ }
51
+ const runtimeCliCommander = new RuntimeCliCommander();
52
+ export default runtimeCliCommander;
53
+ //# sourceMappingURL=runtime-cli-commander.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-cli-commander.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/runtime-cli-commander.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,SAAS,MAAM,gCAAgC,CAAC;AACvD,OAAO,EAAE,iCAAiC,EAAE,MAAM,QAAQ,CAAC;AAS3D,MAAM,mBAAmB;IAUvB,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC;IAC7D,CAAC;IAOD,GAAG;QACD,iCAAiC,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAYD,KAAK,CAAC,MAAM;QACV,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACxC,IAAI,OAAO,KAAK,oBAAoB;YAAE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACtE,CAAC;IAmBD,KAAK,CAAC,gBAAgB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAA4C,CAAC;QAC5E,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC;QAE/C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,IAAI,IAAI,EAAE,EAClB,gBAAgB,oBAAoB,EAAE,EAAE,CACzC,CAAC;QAEF,IAAI,gBAAgB,GAAG,WAAW,CAAC;QACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC;gBACjE,gBAAgB,GAAG,SAAS,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;gBAC3D,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,GAAG,uBAAuB,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;;;CAGvF,CAAC;QAEE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAErD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;;YACtE,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAEtD,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;CACF;AAOD,MAAM,mBAAmB,GAAwB,IAAI,mBAAmB,EAAE,CAAC;AAE3E,eAAe,mBAAmB,CAAC","sourcesContent":["import { authActionService } from \"../../../exports/services\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport sheu from \"../../sheu\";\nimport { getUserFileExtension } from \"../../helpers/fs.helpers\";\nimport { importModule } from \"../../helpers/global.helpers\";\nimport deepmerge from \"../../helpers/deepmerge.helper\";\nimport { killDevelopmentServerChildProcess } from \"../dev\";\n\n/**\n * Runtime CLI Commander class for handling command-line interface commands\n * during runtime execution. Provides methods for executing various CLI commands\n * and managing their lifecycle.\n *\n * @class RuntimeCliCommander\n */\nclass RuntimeCliCommander {\n /**\n * Parses and returns CLI command options from environment variables\n *\n * @returns {Object} Parsed CLI command options object\n *\n * @example\n * // Returns { overwrite: true, path: './exports' }\n * getOptions();\n */\n getOptions(): { overwrite?: boolean; path: string } {\n return JSON.parse(process.env.CLI_COMMAND_OPTIONS || \"{}\");\n }\n\n /**\n * Terminates the development server child process and exits the current process\n *\n * @returns {void}\n */\n end(): void {\n killDevelopmentServerChildProcess();\n process.exit(1);\n }\n\n /**\n * Main command handler that routes to specific command implementations\n * based on the CLI_COMMAND environment variable\n *\n * @returns {Promise<void>}\n *\n * @example\n * // Handles EXPORT_AUTH_ACTION command\n * await handle();\n */\n async handle(): Promise<void> {\n const command = process.env.CLI_COMMAND;\n if (command === \"EXPORT_AUTH_ACTION\") await this.exportAuthAction();\n }\n\n /**\n * Exports authentication actions to a file, with options for merging with existing\n * actions and specifying output path\n *\n * @param {Object} [options] - Export configuration options\n * @param {boolean} [options.overwrite] - Whether to overwrite existing file (default: false)\n * @param {string} [options.path] - Custom output directory path\n * @returns {Promise<void>}\n *\n * @example\n * // Export with default options (merge if exists)\n * await exportAuthAction();\n *\n * @example\n * // Export with overwrite and custom path\n * await exportAuthAction({ overwrite: true, path: './custom-exports' });\n */\n async exportAuthAction(): Promise<void> {\n const options = this.getOptions() as { overwrite?: boolean; path?: string };\n const authActions = authActionService.getAll();\n\n const targetPath = path.join(\n process.cwd(),\n options.path || \"\",\n `auth-actions.${getUserFileExtension()}`\n );\n\n let finalAuthActions = authActions;\n let isUpdate = false;\n\n if (!options.overwrite) {\n try {\n const existingModule = await importModule(targetPath);\n const existingActions = existingModule.default || existingModule;\n finalAuthActions = deepmerge(existingActions, authActions);\n isUpdate = true;\n } catch (error) {}\n }\n\n const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)};\n\nexport default authActions;\n`;\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, fileContent, \"utf-8\");\n\n console.info(\"\");\n if (isUpdate) sheu.done(\"Auth actions updated and exported successfully!\");\n else sheu.done(\"Auth actions exported successfully!\");\n\n this.end();\n }\n}\n\n/**\n * Singleton instance of RuntimeCliCommander\n *\n * @type {RuntimeCliCommander}\n */\nconst runtimeCliCommander: RuntimeCliCommander = new RuntimeCliCommander();\n\nexport default runtimeCliCommander;\n"]}
@@ -13,11 +13,15 @@ export function generateCreateDtoTemplate(options) {
13
13
  const isUserModule = modelName.kebab === "user";
14
14
  const enumsUsed = new Set();
15
15
  const validatorsUsed = new Set();
16
- const nestedDtosUsed = new Set();
16
+ const transformersUsed = new Set();
17
+ const nestedDtoClasses = [];
17
18
  let dtoFields = [];
18
19
  for (const field of model.fields) {
20
+ if (field.isId || restrictedFields.includes(field.name)) {
21
+ continue;
22
+ }
19
23
  const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
20
- if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {
24
+ if (isForeignKey) {
21
25
  continue;
22
26
  }
23
27
  if (field.isRelation) {
@@ -25,15 +29,16 @@ export function generateCreateDtoTemplate(options) {
25
29
  continue;
26
30
  const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
27
31
  if (referencedModel) {
28
- const refField = field.foreignReferenceField || "id";
29
32
  const isOptional = field.isOptional || field.defaultValue !== undefined;
30
33
  const optionalDecorator = isOptional ? " @IsOptional()\n" : "";
31
34
  const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
32
35
  validatorsUsed.add("IsOptional");
33
36
  validatorsUsed.add("ValidateNested");
34
- validatorsUsed.add("Type");
35
- nestedDtosUsed.add("OnlyIdDto");
36
- dtoFields.push(`${optionalDecorator} @ValidateNested()\n @Type(() => OnlyIdDto)\n ${field.name}${typeModifier}: OnlyIdDto;`);
37
+ transformersUsed.add("Type");
38
+ const relationDtoName = `${referencedModel.name}ForCreate${modelName.pascal}Dto`;
39
+ const nestedDtoClass = generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
40
+ nestedDtoClasses.push(nestedDtoClass);
41
+ dtoFields.push(`${optionalDecorator} @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
37
42
  }
38
43
  continue;
39
44
  }
@@ -48,15 +53,33 @@ export function generateCreateDtoTemplate(options) {
48
53
  const enumImports = enumsUsed.size > 0
49
54
  ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
50
55
  : "";
51
- const nestedDtoImports = nestedDtosUsed.size > 0
52
- ? `import { ${Array.from(nestedDtosUsed).join(", ")} } from "../../utils/dtos/only-id-dto.js";\n`
56
+ const validatorImports = validatorsUsed.size > 0
57
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
58
+ : "";
59
+ const transformerImports = transformersUsed.size > 0
60
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
53
61
  : "";
54
- const validatorImports = `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\nimport { Type } from "class-transformer";\n`;
55
- return `${validatorImports}${nestedDtoImports}${enumImports}
62
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
63
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
56
64
  export default class Create${modelName.pascal}Dto {
57
65
  ${dtoFields.join("\n\n")}
58
66
  }`;
59
67
  }
68
+ function generateNestedDtoClass(field, referencedModel, dtoName, validatorsUsed, enumsUsed, isTypeScript) {
69
+ const fields = [];
70
+ const refFieldName = field.foreignReferenceField || "id";
71
+ const refFieldAsPrismaField = referencedModel.fields.find((f) => f.name === refFieldName);
72
+ if (refFieldAsPrismaField) {
73
+ if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))
74
+ enumsUsed.add(refFieldAsPrismaField.type);
75
+ const { decorators, type } = generateClassValidatorField(refFieldAsPrismaField, false, validatorsUsed);
76
+ const typeModifier = isTypeScript ? "!" : "";
77
+ fields.push(`${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`);
78
+ }
79
+ return `class ${dtoName} {
80
+ ${fields.join("\n\n")}
81
+ }`;
82
+ }
60
83
  function generateClassValidatorField(field, isUserModule, validatorsUsed) {
61
84
  let decorators = [];
62
85
  let type = mapPrismaTypeToTS(field.type);
@@ -112,7 +135,7 @@ function getValidatorsForType(field, isUserModule) {
112
135
  case "Int":
113
136
  case "Float":
114
137
  case "Decimal":
115
- validators.push(`@IsNumber({}, ${arrayEach})`);
138
+ validators.push(`@IsNumber({}${arrayEach})`);
116
139
  break;
117
140
  case "Boolean":
118
141
  validators.push(`@IsBoolean(${arrayEach})`);
@@ -121,11 +144,13 @@ function getValidatorsForType(field, isUserModule) {
121
144
  validators.push(`@IsDate(${arrayEach})`);
122
145
  break;
123
146
  case "BigInt":
124
- validators.push(`@IsNumber({}, ${arrayEach})`);
147
+ validators.push(`@IsNumber({}${arrayEach})`);
125
148
  break;
126
149
  case "Json":
127
150
  validators.push(`@IsObject(${arrayEach})`);
128
151
  break;
152
+ case "Bytes":
153
+ break;
129
154
  default:
130
155
  break;
131
156
  }
@@ -150,7 +175,7 @@ function mapPrismaTypeToTS(prismaType) {
150
175
  case "BigInt":
151
176
  return "bigint";
152
177
  default:
153
- return "any";
178
+ return prismaSchemaParser.isEnum(prismaType) ? prismaType : "any";
154
179
  }
155
180
  }
156
181
  //# sourceMappingURL=create-dto-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateCreateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for create-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const nestedDtosUsed = new Set<string>();\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n\n if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const refField = field.foreignReferenceField || \"id\";\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const optionalDecorator = isOptional ? \" @IsOptional()\\n\" : \"\";\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n validatorsUsed.add(\"Type\");\n nestedDtosUsed.add(\"OnlyIdDto\");\n\n dtoFields.push(\n `${optionalDecorator} @ValidateNested()\\n @Type(() => OnlyIdDto)\\n ${field.name}${typeModifier}: OnlyIdDto;`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const nestedDtoImports =\n nestedDtosUsed.size > 0\n ? `import { ${Array.from(nestedDtosUsed).join(\", \")} } from \"../../utils/dtos/only-id-dto\";\\n`\n : \"\";\n\n const validatorImports = `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\nimport { Type } from \"class-transformer\";\\n`;\n\n return `${validatorImports}${nestedDtoImports}${enumImports}\nexport default class Create${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n if (isOptional) {\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n }\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \", { each: true }\" : \"\";\n\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"];\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber({}, ${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber({}, ${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n return \"any\";\n }\n}\n"]}
1
+ {"version":3,"file":"create-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateCreateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for create-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const optionalDecorator = isOptional ? \" @IsOptional()\\n\" : \"\";\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForCreate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n dtoFields.push(\n `${optionalDecorator} @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n const typeModifier = isTypeScript ? (isOptional ? \"?\" : \"!\") : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Create${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n const isOptional = field.isOptional || field.defaultValue !== undefined;\n if (isOptional) {\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n }\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \", { each: true }\" : \"\";\n\n // User module special cases - return early to override default validators\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
@@ -13,11 +13,15 @@ export function generateUpdateDtoTemplate(options) {
13
13
  const isUserModule = modelName.kebab === "user";
14
14
  const enumsUsed = new Set();
15
15
  const validatorsUsed = new Set();
16
- const nestedDtosUsed = new Set();
16
+ const transformersUsed = new Set();
17
+ const nestedDtoClasses = [];
17
18
  let dtoFields = [];
18
19
  for (const field of model.fields) {
20
+ if (field.isId || restrictedFields.includes(field.name)) {
21
+ continue;
22
+ }
19
23
  const isForeignKey = model.fields.some((f) => f.foreignKeyField === field.name);
20
- if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {
24
+ if (isForeignKey) {
21
25
  continue;
22
26
  }
23
27
  if (field.isRelation) {
@@ -25,12 +29,14 @@ export function generateUpdateDtoTemplate(options) {
25
29
  continue;
26
30
  const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
27
31
  if (referencedModel) {
28
- const typeModifier = isTypeScript ? "?" : "";
29
32
  validatorsUsed.add("IsOptional");
30
33
  validatorsUsed.add("ValidateNested");
31
- validatorsUsed.add("Type");
32
- nestedDtosUsed.add("OnlyIdDto");
33
- dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => OnlyIdDto)\n ${field.name}${typeModifier}: OnlyIdDto;`);
34
+ transformersUsed.add("Type");
35
+ const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;
36
+ const nestedDtoClass = generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
37
+ nestedDtoClasses.push(nestedDtoClass);
38
+ const typeModifier = isTypeScript ? "?" : "";
39
+ dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
34
40
  }
35
41
  continue;
36
42
  }
@@ -44,15 +50,33 @@ export function generateUpdateDtoTemplate(options) {
44
50
  const enumImports = enumsUsed.size > 0
45
51
  ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
46
52
  : "";
47
- const nestedDtoImports = nestedDtosUsed.size > 0
48
- ? `import { ${Array.from(nestedDtosUsed).join(", ")} } from "../../utils/dtos/only-id-dto.js";\n`
53
+ const validatorImports = validatorsUsed.size > 0
54
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
55
+ : "";
56
+ const transformerImports = transformersUsed.size > 0
57
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
49
58
  : "";
50
- const validatorImports = `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\nimport { Type } from "class-transformer";\n`;
51
- return `${validatorImports}${nestedDtoImports}${enumImports}
59
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
60
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
52
61
  export default class Update${modelName.pascal}Dto {
53
62
  ${dtoFields.join("\n\n")}
54
63
  }`;
55
64
  }
65
+ function generateNestedDtoClass(field, referencedModel, dtoName, validatorsUsed, enumsUsed, isTypeScript) {
66
+ const fields = [];
67
+ const refFieldName = field.foreignReferenceField || "id";
68
+ const refFieldAsPrismaField = referencedModel.fields.find((f) => f.name === refFieldName);
69
+ if (refFieldAsPrismaField) {
70
+ if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))
71
+ enumsUsed.add(refFieldAsPrismaField.type);
72
+ const { decorators, type } = generateClassValidatorField(refFieldAsPrismaField, false, validatorsUsed);
73
+ const typeModifier = isTypeScript ? "!" : "";
74
+ fields.push(`${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`);
75
+ }
76
+ return `class ${dtoName} {
77
+ ${fields.join("\n\n")}
78
+ }`;
79
+ }
56
80
  function generateClassValidatorField(field, isUserModule, validatorsUsed) {
57
81
  let decorators = [];
58
82
  let type = mapPrismaTypeToTS(field.type);
@@ -85,6 +109,7 @@ function generateClassValidatorField(field, isUserModule, validatorsUsed) {
85
109
  }
86
110
  function getValidatorsForType(field, isUserModule) {
87
111
  const validators = [];
112
+ const arrayEach = field.isArray ? ", { each: true }" : "";
88
113
  if (isUserModule) {
89
114
  if (field.name === "email") {
90
115
  return ["@IsEmail()"];
@@ -99,24 +124,26 @@ function getValidatorsForType(field, isUserModule) {
99
124
  }
100
125
  switch (field.type) {
101
126
  case "String":
102
- validators.push(field.isArray ? "@IsString({ each: true })" : "@IsString()");
127
+ validators.push(`@IsString(${arrayEach})`);
103
128
  break;
104
129
  case "Int":
105
130
  case "Float":
106
131
  case "Decimal":
107
- validators.push(field.isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()");
132
+ validators.push(`@IsNumber({}${arrayEach})`);
108
133
  break;
109
134
  case "Boolean":
110
- validators.push(field.isArray ? "@IsBoolean({ each: true })" : "@IsBoolean()");
135
+ validators.push(`@IsBoolean(${arrayEach})`);
111
136
  break;
112
137
  case "DateTime":
113
- validators.push(field.isArray ? "@IsDate({ each: true })" : "@IsDate()");
138
+ validators.push(`@IsDate(${arrayEach})`);
114
139
  break;
115
140
  case "BigInt":
116
- validators.push(field.isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()");
141
+ validators.push(`@IsNumber({}${arrayEach})`);
117
142
  break;
118
143
  case "Json":
119
- validators.push(field.isArray ? "@IsObject({ each: true })" : "@IsObject()");
144
+ validators.push(`@IsObject(${arrayEach})`);
145
+ break;
146
+ case "Bytes":
120
147
  break;
121
148
  default:
122
149
  break;
@@ -142,7 +169,7 @@ function mapPrismaTypeToTS(prismaType) {
142
169
  case "BigInt":
143
170
  return "bigint";
144
171
  default:
145
- return "any";
172
+ return prismaSchemaParser.isEnum(prismaType) ? prismaType : "any";
146
173
  }
147
174
  }
148
175
  //# sourceMappingURL=update-dto-template.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const nestedDtosUsed = new Set<string>();\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n\n if (field.isId || restrictedFields.includes(field.name) || isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n const typeModifier = isTypeScript ? \"?\" : \"\";\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n validatorsUsed.add(\"Type\");\n nestedDtosUsed.add(\"OnlyIdDto\");\n\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => OnlyIdDto)\\n ${field.name}${typeModifier}: OnlyIdDto;`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const nestedDtoImports =\n nestedDtosUsed.size > 0\n ? `import { ${Array.from(nestedDtosUsed).join(\", \")} } from \"../../utils/dtos/only-id-dto\";\\n`\n : \"\";\n\n const validatorImports = `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\nimport { Type } from \"class-transformer\";\\n`;\n\n return `${validatorImports}${nestedDtoImports}${enumImports}\nexport default class Update${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n // All fields in update DTO are optional\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"];\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(\n field.isArray ? \"@IsString({ each: true })\" : \"@IsString()\"\n );\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(\n field.isArray ? \"@IsNumber({}, { each: true })\" : \"@IsNumber()\"\n );\n break;\n case \"Boolean\":\n validators.push(\n field.isArray ? \"@IsBoolean({ each: true })\" : \"@IsBoolean()\"\n );\n break;\n case \"DateTime\":\n validators.push(field.isArray ? \"@IsDate({ each: true })\" : \"@IsDate()\");\n break;\n case \"BigInt\":\n validators.push(\n field.isArray ? \"@IsNumber({}, { each: true })\" : \"@IsNumber()\"\n );\n break;\n case \"Json\":\n validators.push(\n field.isArray ? \"@IsObject({ each: true })\" : \"@IsObject()\"\n );\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n return \"any\";\n }\n}\n"]}
1
+ {"version":3,"file":"update-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n // ALL relations are optional in update DTO\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n // ALL fields are optional in update DTO\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Update${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n // ALL fields in update DTO are optional\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \", { each: true }\" : \"\";\n\n // User module special cases - keep validations even though optional\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
@@ -27,11 +27,21 @@ export function generateControllerTemplate(options) {
27
27
  controllerImport = imports?.baseController || "arkos/controllers";
28
28
  }
29
29
  const controllerClassImport = `import { ${controllerName} } from "${controllerImport}";`;
30
- return `${controllerClassImport}
30
+ if (["email", "auth"].includes(camelName))
31
+ return `class ${modelName.pascal}Controller {}
32
+
33
+ const ${modelName.camel}Controller = new ${modelName.pascal}Controller(${controllerType === "base" ? `"${modelName.kebab}"` : ""});
34
+
35
+ export default ${modelName.camel}Controller;
36
+ `;
37
+ else
38
+ return `${controllerClassImport}
31
39
 
32
40
  class ${modelName.pascal}Controller extends ${controllerName} {}
41
+
33
42
  const ${modelName.camel}Controller = new ${modelName.pascal}Controller(${controllerType === "base" ? `"${modelName.kebab}"` : ""});
43
+
34
44
  export default ${modelName.camel}Controller;
35
45
  `;
36
46
  }
37
- //# sourceMappingURL=controller-template.js.map
47
+ //# sourceMappingURL=generate-controller-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-controller-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/generate-controller-template.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,0BAA0B,CAAC,OAAwB;IACjE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,cAAwD,CAAC;IAC7D,IAAI,cAAsB,CAAC;IAC3B,IAAI,gBAAwB,CAAC;IAE7B,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QAC/B,cAAc,GAAG,YAAY,CAAC;QAC9B,cAAc,GAAG,sBAAsB,CAAC;QACxC,gBAAgB,GAAG,OAAO,EAAE,oBAAoB,IAAI,mBAAmB,CAAC;IAC1E,CAAC;SAAM,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAChC,cAAc,GAAG,MAAM,CAAC;QACxB,cAAc,GAAG,gBAAgB,CAAC;QAClC,gBAAgB,GAAG,OAAO,EAAE,cAAc,IAAI,mBAAmB,CAAC;IACpE,CAAC;SAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACjC,cAAc,GAAG,OAAO,CAAC;QACzB,cAAc,GAAG,iBAAiB,CAAC;QACnC,gBAAgB,GAAG,OAAO,EAAE,eAAe,IAAI,mBAAmB,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,MAAM,CAAC;QACxB,cAAc,GAAG,gBAAgB,CAAC;QAClC,gBAAgB,GAAG,OAAO,EAAE,cAAc,IAAI,mBAAmB,CAAC;IACpE,CAAC;IAED,MAAM,qBAAqB,GAAG,YAAY,cAAc,YAAY,gBAAgB,IAAI,CAAC;IAEzF,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvC,OAAO,SAAS,SAAS,CAAC,MAAM;;QAE5B,SAAS,CAAC,KAAK,oBAAoB,SAAS,CAAC,MAAM,cAAc,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAE/G,SAAS,CAAC,KAAK;CAC/B,CAAC;;QAEE,OAAO,GAAG,qBAAqB;;QAE3B,SAAS,CAAC,MAAM,sBAAsB,cAAc;;QAEpD,SAAS,CAAC,KAAK,oBAAoB,SAAS,CAAC,MAAM,cAAc,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;;iBAE/G,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { TemplateOptions } from \"../../template-generators\";\n\nexport function generateControllerTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for controller template\");\n\n const camelName = modelName.camel.toLowerCase();\n let controllerType: \"fileUpload\" | \"auth\" | \"email\" | \"base\";\n let controllerName: string;\n let controllerImport: string;\n\n if (camelName === \"fileupload\") {\n controllerType = \"fileUpload\";\n controllerName = \"FileUploadController\";\n controllerImport = imports?.fileUploadController || \"arkos/controllers\";\n } else if (camelName === \"auth\") {\n controllerType = \"auth\";\n controllerName = \"AuthController\";\n controllerImport = imports?.authController || \"arkos/controllers\";\n } else if (camelName === \"email\") {\n controllerType = \"email\";\n controllerName = \"EmailController\";\n controllerImport = imports?.emailController || \"arkos/controllers\";\n } else {\n controllerType = \"base\";\n controllerName = \"BaseController\";\n controllerImport = imports?.baseController || \"arkos/controllers\";\n }\n\n const controllerClassImport = `import { ${controllerName} } from \"${controllerImport}\";`;\n\n if ([\"email\", \"auth\"].includes(camelName))\n return `class ${modelName.pascal}Controller {}\n\nconst ${modelName.camel}Controller = new ${modelName.pascal}Controller(${controllerType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Controller;\n`;\n else\n return `${controllerClassImport}\n \nclass ${modelName.pascal}Controller extends ${controllerName} {}\n\nconst ${modelName.camel}Controller = new ${modelName.pascal}Controller(${controllerType === \"base\" ? `\"${modelName.kebab}\"` : \"\"});\n\nexport default ${modelName.camel}Controller;\n`;\n}\n"]}