arkos 1.2.13-test → 1.2.13-test.1

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 (265) hide show
  1. package/README.md +22 -14
  2. package/cli.js +2 -11
  3. package/dist/cjs/app.js +138 -1
  4. package/dist/cjs/app.js.map +1 -1
  5. package/dist/cjs/index.js +22 -0
  6. package/dist/cjs/modules/auth/auth.router.js +9 -83
  7. package/dist/cjs/modules/auth/auth.router.js.map +1 -1
  8. package/dist/cjs/modules/auth/auth.service.js +0 -7
  9. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  10. package/dist/cjs/modules/base/base.controller.js +11 -12
  11. package/dist/cjs/modules/base/base.controller.js.map +1 -1
  12. package/dist/cjs/modules/base/base.middlewares.js +4 -4
  13. package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
  14. package/dist/cjs/modules/base/base.router.js.map +1 -1
  15. package/dist/cjs/modules/base/base.service.js.map +1 -1
  16. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js +43 -113
  17. package/dist/cjs/modules/base/utils/helpers/base.router.helpers.js.map +1 -1
  18. package/dist/cjs/modules/error-handler/error-handler.controller.js +2 -0
  19. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  20. package/dist/cjs/modules/error-handler/utils/catch-async.js +1 -1
  21. package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
  22. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +6 -0
  23. package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
  24. package/dist/cjs/modules/file-upload/file-upload.router.js +9 -21
  25. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  26. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js +7 -0
  27. package/dist/cjs/modules/file-upload/utils/helpers/file-upload.helpers.js.map +1 -1
  28. package/dist/cjs/modules/swagger/swagger.router.js +71 -93
  29. package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
  30. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +270 -0
  31. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -0
  32. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js +66 -0
  33. package/dist/cjs/modules/swagger/utils/helpers/get-system-json-schema-paths.js.map +1 -0
  34. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js +41 -0
  35. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.js.map +1 -0
  36. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js +29 -0
  37. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.js.map +1 -0
  38. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js +30 -0
  39. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.js.map +1 -0
  40. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js +471 -0
  41. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.js.map +1 -0
  42. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js +575 -0
  43. package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.js.map +1 -0
  44. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +253 -0
  45. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -0
  46. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +105 -0
  47. package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -0
  48. package/dist/cjs/paths.js +9 -1
  49. package/dist/cjs/server.js +85 -3
  50. package/dist/cjs/server.js.map +1 -1
  51. package/dist/cjs/types/arkos-config.js.map +1 -1
  52. package/dist/cjs/utils/cli/build.js +2 -19
  53. package/dist/cjs/utils/cli/build.js.map +1 -1
  54. package/dist/cjs/utils/cli/dev.js +35 -47
  55. package/dist/cjs/utils/cli/dev.js.map +1 -1
  56. package/dist/cjs/utils/cli/generate.js +6 -6
  57. package/dist/cjs/utils/cli/generate.js.map +1 -1
  58. package/dist/cjs/utils/cli/start.js +4 -3
  59. package/dist/cjs/utils/cli/start.js.map +1 -1
  60. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -3
  61. package/dist/cjs/utils/cli/utils/cli.helpers.js.map +1 -1
  62. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js +33 -66
  63. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +1 -1
  64. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +17 -11
  65. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +1 -1
  66. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js +5 -0
  67. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-router-template.js.map +1 -1
  68. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js +1 -1
  69. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-service-template.js.map +1 -1
  70. package/dist/cjs/utils/features/api.features.js +10 -4
  71. package/dist/cjs/utils/features/api.features.js.map +1 -1
  72. package/dist/cjs/utils/helpers/fs.helpers.js +12 -5
  73. package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
  74. package/dist/cjs/utils/helpers/global.helpers.js +51 -2
  75. package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
  76. package/dist/cjs/utils/helpers/models.helpers.js +81 -67
  77. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  78. package/dist/cjs/utils/helpers/prisma.helpers.js +7 -4
  79. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  80. package/dist/cjs/utils/helpers/routers.helpers.js +21 -0
  81. package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -0
  82. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js +451 -0
  83. package/dist/cjs/utils/prisma/enhaced-prisma-json-schema-generator.js.map +1 -0
  84. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +88 -0
  85. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -0
  86. package/dist/cjs/utils/prisma/prisma-schema-parser.js +158 -0
  87. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -0
  88. package/dist/cjs/utils/prisma/types.js +3 -0
  89. package/dist/cjs/utils/prisma/types.js.map +1 -0
  90. package/dist/cjs/utils/sheu.js +119 -0
  91. package/dist/cjs/utils/sheu.js.map +1 -0
  92. package/dist/esm/index.d.mts +280 -0
  93. package/dist/esm/index.mjs +22 -0
  94. package/dist/exports/index.js +1 -0
  95. package/dist/types/arkos-config.js +1 -0
  96. package/dist/types/auth.js +1 -0
  97. package/dist/types/index.js +1 -0
  98. package/dist/types/modules/base/base.middlewares.d.ts +4 -4
  99. package/dist/types/modules/base/base.service.d.ts +1 -1
  100. package/dist/types/modules/base/utils/helpers/base.router.helpers.d.ts +4 -1
  101. package/dist/types/modules/error-handler/utils/catch-async.d.ts +1 -0
  102. package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +4 -0
  103. package/dist/types/modules/file-upload/file-upload.router.d.ts +1 -1
  104. package/dist/types/modules/file-upload/utils/helpers/file-upload.helpers.d.ts +2 -1
  105. package/dist/types/modules/swagger/swagger.router.d.ts +1 -1
  106. package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +3 -0
  107. package/dist/types/modules/swagger/utils/helpers/get-system-json-schema-paths.d.ts +2 -0
  108. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-class-validator-json-schemas.d.ts +1 -0
  109. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-prisma-json-schemas.d.ts +2 -0
  110. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/generate-zod-json-schema.d.ts +1 -0
  111. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes.d.ts +3 -0
  112. package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-parent-routes.d.ts +3 -0
  113. package/dist/types/modules/swagger/utils/helpers/missing-json-schemas-generator.d.ts +34 -0
  114. package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +7 -0
  115. package/dist/types/router-config.js +1 -0
  116. package/dist/types/server.d.ts +3 -0
  117. package/dist/types/types/arkos-config.d.ts +10 -5
  118. package/dist/types/utils/cli/utils/cli.helpers.d.ts +1 -1
  119. package/dist/types/utils/features/api.features.d.ts +1 -0
  120. package/dist/types/utils/helpers/global.helpers.d.ts +6 -1
  121. package/dist/types/utils/helpers/models.helpers.d.ts +31 -5
  122. package/dist/types/utils/helpers/routers.helpers.d.ts +2 -0
  123. package/dist/types/utils/prisma/enhaced-prisma-json-schema-generator.d.ts +34 -0
  124. package/dist/types/utils/prisma/prisma-json-schema-generator.d.ts +10 -0
  125. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +18 -0
  126. package/dist/types/utils/prisma/types.d.ts +48 -0
  127. package/dist/types/utils/sheu.d.ts +70 -0
  128. package/dist/utils/arkos-env.js +1 -0
  129. package/dist/utils/dotenv.helpers.js +1 -0
  130. package/dist/utils/sheu.js +1 -0
  131. package/dist/utils/validate-dto.js +1 -0
  132. package/dist/utils/validate-schema.js +1 -0
  133. package/package.json +32 -34
  134. package/dist/es2020/app.js +0 -1
  135. package/dist/es2020/app.js.map +0 -1
  136. package/dist/es2020/exports/auth/index.js +0 -2
  137. package/dist/es2020/exports/auth/index.js.map +0 -1
  138. package/dist/es2020/exports/controllers/index.js +0 -4
  139. package/dist/es2020/exports/controllers/index.js.map +0 -1
  140. package/dist/es2020/exports/error-handler/index.js +0 -4
  141. package/dist/es2020/exports/error-handler/index.js.map +0 -1
  142. package/dist/es2020/exports/index.js +0 -8
  143. package/dist/es2020/exports/index.js.map +0 -1
  144. package/dist/es2020/exports/middlewares/index.js +0 -2
  145. package/dist/es2020/exports/middlewares/index.js.map +0 -1
  146. package/dist/es2020/exports/prisma/index.js +0 -3
  147. package/dist/es2020/exports/prisma/index.js.map +0 -1
  148. package/dist/es2020/exports/services/index.js +0 -9
  149. package/dist/es2020/exports/services/index.js.map +0 -1
  150. package/dist/es2020/exports/utils/index.js +0 -4
  151. package/dist/es2020/exports/utils/index.js.map +0 -1
  152. package/dist/es2020/exports/validation/index.js +0 -4
  153. package/dist/es2020/exports/validation/index.js.map +0 -1
  154. package/dist/es2020/modules/auth/auth.controller.js +0 -187
  155. package/dist/es2020/modules/auth/auth.controller.js.map +0 -1
  156. package/dist/es2020/modules/auth/auth.router.js +0 -118
  157. package/dist/es2020/modules/auth/auth.router.js.map +0 -1
  158. package/dist/es2020/modules/auth/auth.service.js +0 -185
  159. package/dist/es2020/modules/auth/auth.service.js.map +0 -1
  160. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js +0 -73
  161. package/dist/es2020/modules/auth/utils/helpers/auth.controller.helpers.js.map +0 -1
  162. package/dist/es2020/modules/base/base.controller.js +0 -151
  163. package/dist/es2020/modules/base/base.controller.js.map +0 -1
  164. package/dist/es2020/modules/base/base.middlewares.js +0 -81
  165. package/dist/es2020/modules/base/base.middlewares.js.map +0 -1
  166. package/dist/es2020/modules/base/base.router.js +0 -17
  167. package/dist/es2020/modules/base/base.router.js.map +0 -1
  168. package/dist/es2020/modules/base/base.service.js +0 -120
  169. package/dist/es2020/modules/base/base.service.js.map +0 -1
  170. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js +0 -77
  171. package/dist/es2020/modules/base/utils/helpers/base.controller.helpers.js.map +0 -1
  172. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js +0 -44
  173. package/dist/es2020/modules/base/utils/helpers/base.middlewares.helpers.js.map +0 -1
  174. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js +0 -161
  175. package/dist/es2020/modules/base/utils/helpers/base.router.helpers.js.map +0 -1
  176. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js +0 -165
  177. package/dist/es2020/modules/base/utils/helpers/base.service.helpers.js.map +0 -1
  178. package/dist/es2020/modules/email/email.service.js +0 -97
  179. package/dist/es2020/modules/email/email.service.js.map +0 -1
  180. package/dist/es2020/modules/error-handler/error-handler.controller.js +0 -105
  181. package/dist/es2020/modules/error-handler/error-handler.controller.js.map +0 -1
  182. package/dist/es2020/modules/error-handler/utils/app-error.js +0 -15
  183. package/dist/es2020/modules/error-handler/utils/app-error.js.map +0 -1
  184. package/dist/es2020/modules/error-handler/utils/catch-async.js +0 -10
  185. package/dist/es2020/modules/error-handler/utils/catch-async.js.map +0 -1
  186. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js +0 -155
  187. package/dist/es2020/modules/error-handler/utils/error-handler.helpers.js.map +0 -1
  188. package/dist/es2020/modules/file-upload/file-upload.controller.js +0 -266
  189. package/dist/es2020/modules/file-upload/file-upload.controller.js.map +0 -1
  190. package/dist/es2020/modules/file-upload/file-upload.router.js +0 -50
  191. package/dist/es2020/modules/file-upload/file-upload.router.js.map +0 -1
  192. package/dist/es2020/modules/file-upload/file-upload.service.js +0 -314
  193. package/dist/es2020/modules/file-upload/file-upload.service.js.map +0 -1
  194. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js +0 -81
  195. package/dist/es2020/modules/file-upload/utils/helpers/file-upload.helpers.js.map +0 -1
  196. package/dist/es2020/modules/swagger/swagger.router.js +0 -135
  197. package/dist/es2020/modules/swagger/swagger.router.js.map +0 -1
  198. package/dist/es2020/paths.js +0 -1
  199. package/dist/es2020/paths.js.map +0 -1
  200. package/dist/es2020/server.js +0 -3
  201. package/dist/es2020/server.js.map +0 -1
  202. package/dist/es2020/types/arkos-config.js +0 -2
  203. package/dist/es2020/types/arkos-config.js.map +0 -1
  204. package/dist/es2020/types/auth.js +0 -2
  205. package/dist/es2020/types/auth.js.map +0 -1
  206. package/dist/es2020/types/index.js +0 -8
  207. package/dist/es2020/types/index.js.map +0 -1
  208. package/dist/es2020/types/router-config.js +0 -2
  209. package/dist/es2020/types/router-config.js.map +0 -1
  210. package/dist/es2020/utils/arkos-env.js +0 -7
  211. package/dist/es2020/utils/arkos-env.js.map +0 -1
  212. package/dist/es2020/utils/cli/build.js +0 -223
  213. package/dist/es2020/utils/cli/build.js.map +0 -1
  214. package/dist/es2020/utils/cli/dev.js +0 -261
  215. package/dist/es2020/utils/cli/dev.js.map +0 -1
  216. package/dist/es2020/utils/cli/generate.js +0 -183
  217. package/dist/es2020/utils/cli/generate.js.map +0 -1
  218. package/dist/es2020/utils/cli/index.js +0 -74
  219. package/dist/es2020/utils/cli/index.js.map +0 -1
  220. package/dist/es2020/utils/cli/start.js +0 -86
  221. package/dist/es2020/utils/cli/start.js.map +0 -1
  222. package/dist/es2020/utils/cli/utils/cli.helpers.js +0 -18
  223. package/dist/es2020/utils/cli/utils/cli.helpers.js.map +0 -1
  224. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js +0 -33
  225. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-auth-configs-template.js.map +0 -1
  226. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js +0 -18
  227. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +0 -1
  228. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js +0 -265
  229. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-middlewares.js.map +0 -1
  230. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js +0 -55
  231. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-prisma-query-options.js.map +0 -1
  232. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js +0 -32
  233. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-router-template.js.map +0 -1
  234. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js +0 -32
  235. package/dist/es2020/utils/cli/utils/template-generator/templates/generate-service-template.js.map +0 -1
  236. package/dist/es2020/utils/cli/utils/template-generators.js +0 -25
  237. package/dist/es2020/utils/cli/utils/template-generators.js.map +0 -1
  238. package/dist/es2020/utils/dotenv.helpers.js +0 -37
  239. package/dist/es2020/utils/dotenv.helpers.js.map +0 -1
  240. package/dist/es2020/utils/features/api.features.js +0 -154
  241. package/dist/es2020/utils/features/api.features.js.map +0 -1
  242. package/dist/es2020/utils/features/change-case.features.js +0 -31
  243. package/dist/es2020/utils/features/change-case.features.js.map +0 -1
  244. package/dist/es2020/utils/helpers/api.features.helpers.js +0 -103
  245. package/dist/es2020/utils/helpers/api.features.helpers.js.map +0 -1
  246. package/dist/es2020/utils/helpers/change-case.helpers.js +0 -161
  247. package/dist/es2020/utils/helpers/change-case.helpers.js.map +0 -1
  248. package/dist/es2020/utils/helpers/deepmerge.helper.js +0 -113
  249. package/dist/es2020/utils/helpers/deepmerge.helper.js.map +0 -1
  250. package/dist/es2020/utils/helpers/fs.helpers.js +0 -45
  251. package/dist/es2020/utils/helpers/fs.helpers.js.map +0 -1
  252. package/dist/es2020/utils/helpers/global.helpers.js +0 -4
  253. package/dist/es2020/utils/helpers/global.helpers.js.map +0 -1
  254. package/dist/es2020/utils/helpers/models.helpers.js +0 -276
  255. package/dist/es2020/utils/helpers/models.helpers.js.map +0 -1
  256. package/dist/es2020/utils/helpers/prisma.helpers.js +0 -41
  257. package/dist/es2020/utils/helpers/prisma.helpers.js.map +0 -1
  258. package/dist/es2020/utils/helpers/query-parser.helpers.js +0 -40
  259. package/dist/es2020/utils/helpers/query-parser.helpers.js.map +0 -1
  260. package/dist/es2020/utils/helpers/text.helpers.js +0 -22
  261. package/dist/es2020/utils/helpers/text.helpers.js.map +0 -1
  262. package/dist/es2020/utils/validate-dto.js +0 -11
  263. package/dist/es2020/utils/validate-dto.js.map +0 -1
  264. package/dist/es2020/utils/validate-schema.js +0 -9
  265. package/dist/es2020/utils/validate-schema.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-generators.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/template-generators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6DAA6D,CAAC;AACzG,OAAO,EAAE,2BAA2B,EAAE,MAAM,+DAA+D,CAAC;AAC5G,OAAO,EAAE,2BAA2B,EAAE,MAAM,qDAAqD,CAAC;AAClG,OAAO,EAAE,4BAA4B,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,MAAM,yDAAyD,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,MAAM,0DAA0D,CAAC;AAoBnG,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,OAAwB;IAExB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAC7C,KAAK,SAAS;YACZ,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAC1C,KAAK,QAAQ;YACX,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACzC,KAAK,cAAc;YACjB,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,eAAe;YAClB,OAAO,4BAA4B,CAAC,OAAO,CAAC,CAAC;QAC/C,KAAK,aAAa;YAChB,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC9C;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC","sourcesContent":["import { generateControllerTemplate } from \"./template-generator/templates/generate-controller-template\";\nimport { generateAuthConfigsTemplate } from \"./template-generator/templates/generate-auth-configs-template\";\nimport { generateMiddlewaresTemplate } from \"./template-generator/templates/generate-middlewares\";\nimport { generateQueryOptionsTemplate } from \"./template-generator/templates/generate-prisma-query-options\";\nimport { generateRouterTemplate } from \"./template-generator/templates/generate-router-template\";\nimport { generateServiceTemplate } from \"./template-generator/templates/generate-service-template\";\n\ninterface ModelName {\n pascal: string;\n camel: string;\n kebab: string;\n}\n\ninterface MiddlewareName {\n pascal: string;\n camel: string;\n kebab: string;\n}\n\nexport interface TemplateOptions {\n modelName: ModelName;\n middlewareName?: MiddlewareName;\n imports?: Record<string, string>;\n}\n\nexport function generateTemplate(\n type: string,\n options: TemplateOptions\n): string {\n switch (type) {\n case \"controller\":\n return generateControllerTemplate(options);\n case \"service\":\n return generateServiceTemplate(options);\n case \"router\":\n return generateRouterTemplate(options);\n case \"auth-configs\":\n return generateAuthConfigsTemplate(options);\n case \"query-options\":\n return generateQueryOptionsTemplate(options);\n case \"middlewares\":\n return generateMiddlewaresTemplate(options);\n default:\n throw new Error(`\\n Unknown template type: ${type}`);\n }\n}\n"]}
@@ -1,37 +0,0 @@
1
- import path from "path";
2
- import fs from "fs";
3
- import dotenv from "dotenv";
4
- export function loadEnvironmentVariables() {
5
- const ENV = process.env.NODE_ENV;
6
- const cwd = process.cwd();
7
- let loadedEnvs = [];
8
- const envFiles = [
9
- path.resolve(cwd, `.env.defaults`),
10
- path.resolve(cwd, `.env.${ENV}`),
11
- path.resolve(cwd, `.env.${ENV}.local`),
12
- path.resolve(cwd, ".env.local"),
13
- path.resolve(cwd, ".env"),
14
- ];
15
- envFiles.forEach((filePath) => {
16
- if (fs.existsSync(filePath)) {
17
- if (ENV === "production" && filePath.endsWith(".local"))
18
- console.info(`Skipping the local ${filePath.replace(cwd, "")} files in production`);
19
- else {
20
- const result = dotenv.config({ path: filePath, override: true });
21
- if (result.error) {
22
- console.warn(`Warning: Error loading ${filePath}`, result.error);
23
- }
24
- else
25
- loadedEnvs.push(filePath);
26
- }
27
- }
28
- });
29
- const requiredVars = ["DATABASE_URL"];
30
- const missingVars = requiredVars.filter((varName) => !process.env[varName]);
31
- if (missingVars.length > 0) {
32
- console.error("Missing required environment variables:", missingVars.join(", "));
33
- }
34
- if (loadedEnvs)
35
- return loadedEnvs;
36
- }
37
- //# sourceMappingURL=dotenv.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dotenv.helpers.js","sourceRoot":"","sources":["../../../src/utils/dotenv.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAW5B,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAa,EAAE,CAAC;IAG9B,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;KAC1B,CAAC;IAGF,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,GAAG,KAAK,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrD,OAAO,CAAC,IAAI,CACV,sBAAsB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CACtE,CAAC;iBACC,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAEjE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,CAAC;;oBAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAGH,MAAM,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CACX,yCAAyC,EACzC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;IAGJ,CAAC;IAED,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;AACpC,CAAC","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport dotenv from \"dotenv\";\n\n/**\n * Loads environment variables in a prioritized order\n * 1. Base defaults (.env.defaults) - lowest priority\n * 2. Environment-specific (.env.{NODE_ENV})\n * 3. Environment-specific local (.env.{NODE_ENV}.local)\n * 4. Local environment overrides (.env.local)\n * 5. Main .env file (.env)\n * 6. Process environment variables - highest priority (already loaded by Node)\n */\nexport function loadEnvironmentVariables() {\n const ENV = process.env.NODE_ENV;\n const cwd = process.cwd();\n let loadedEnvs: string[] = [];\n\n // Define files in order of increasing priority\n const envFiles = [\n path.resolve(cwd, `.env.defaults`),\n path.resolve(cwd, `.env.${ENV}`),\n path.resolve(cwd, `.env.${ENV}.local`), // Environment-specific local overrides\n path.resolve(cwd, \".env.local\"),\n path.resolve(cwd, \".env\"),\n ];\n\n // Load each file if it exists\n envFiles.forEach((filePath) => {\n if (fs.existsSync(filePath)) {\n if (ENV === \"production\" && filePath.endsWith(\".local\"))\n console.info(\n `Skipping the local ${filePath.replace(cwd, \"\")} files in production`\n );\n else {\n const result = dotenv.config({ path: filePath, override: true });\n\n if (result.error) {\n console.warn(`Warning: Error loading ${filePath}`, result.error);\n } else loadedEnvs.push(filePath);\n }\n }\n });\n\n // Validate required environment variables if needed\n const requiredVars = [\"DATABASE_URL\"]; // Add your required vars\n const missingVars = requiredVars.filter((varName) => !process.env[varName]);\n\n if (missingVars.length > 0) {\n console.error(\n \"Missing required environment variables:\",\n missingVars.join(\", \")\n );\n // Optionally throw an error based on your framework's needs\n // throw new Error(`Missing required environment variables: ${missingVars.join(', ')}`);\n }\n\n if (loadedEnvs) return loadedEnvs;\n}\n"]}
@@ -1,154 +0,0 @@
1
- import deepmerge from "../helpers/deepmerge.helper";
2
- import { parseQueryParamsWithModifiers } from "../helpers/api.features.helpers";
3
- import AppError from "../../modules/error-handler/utils/app-error";
4
- import { getPrismaInstance } from "../helpers/prisma.helpers";
5
- export default class APIFeatures {
6
- constructor(req, modelName) {
7
- this.filters = {};
8
- this.excludedFields = [
9
- "page",
10
- "sort",
11
- "limit",
12
- "fields",
13
- "addFields",
14
- "removeFields",
15
- "search",
16
- "include",
17
- "filterMode",
18
- "where",
19
- "prismaQueryOptions",
20
- "ignoredFields",
21
- ];
22
- if (req) {
23
- this.req = req;
24
- this.searchParams = parseQueryParamsWithModifiers(req.query);
25
- }
26
- if (modelName)
27
- this.modelName = modelName;
28
- this.filters = { ...this.filters };
29
- }
30
- setup(req, modelName) {
31
- this.req = req;
32
- this.searchParams = parseQueryParamsWithModifiers(req.query);
33
- if (modelName)
34
- this.modelName = modelName;
35
- this.filters = { ...this.filters };
36
- return this;
37
- }
38
- filter() {
39
- if (!this.req)
40
- throw new Error("Trying to use APIFeatures.filter() without passing request on class constructor or APIFeatures.setup() method. read more about at www.arkosjs.com/docs/advanced-guide/api-features-class");
41
- const searchableFields = [];
42
- const queryObj = { ...this.searchParams };
43
- this.excludedFields.forEach((el) => delete queryObj[el]);
44
- const whereObj = { ...this.req.params, ...queryObj };
45
- const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({
46
- [key]: whereObj[key],
47
- }));
48
- let whereOptions = whereLogicalOperatorFilters.length > 0
49
- ? {
50
- [this.req.query?.filterMode ?? "OR"]: whereLogicalOperatorFilters,
51
- }
52
- : {};
53
- if (!!this.searchParams.search) {
54
- const prisma = getPrismaInstance();
55
- if (this.modelName)
56
- Object.keys(prisma[this.modelName].fields).forEach((key) => {
57
- const field = prisma[this.modelName].fields[key];
58
- if (field.typeName === "String" &&
59
- key !== "id" &&
60
- key !== "password" &&
61
- !field.isList &&
62
- !key?.includes?.("Id") &&
63
- !key?.includes?.("ID")) {
64
- searchableFields.push({
65
- [`${key}`]: {
66
- contains: this.searchParams.search,
67
- mode: "insensitive",
68
- },
69
- });
70
- }
71
- });
72
- whereOptions = deepmerge({
73
- OR: searchableFields,
74
- }, whereOptions);
75
- }
76
- const firstMerge = deepmerge({
77
- where: whereOptions,
78
- }, this.req.prismaQueryOptions || {});
79
- this.filters = deepmerge(firstMerge, this.filters);
80
- return this;
81
- }
82
- search() {
83
- if (this.searchParams?.search) {
84
- this.filters = deepmerge(this.filters, {
85
- where: {
86
- OR: [],
87
- },
88
- });
89
- }
90
- }
91
- sort() {
92
- if (this.searchParams.sort) {
93
- const sortBy = this.searchParams?.sort
94
- ?.split(",")
95
- ?.map((field) => ({
96
- [field.startsWith("-") ? field.substring(1) : field]: field.startsWith("-") ? "desc" : "asc",
97
- }));
98
- this.filters = deepmerge(this.filters, { orderBy: sortBy });
99
- }
100
- return this;
101
- }
102
- limitFields() {
103
- if (this.searchParams?.fields) {
104
- const fields = this.searchParams.fields.split(",");
105
- const regularFields = fields.filter((field) => !field.startsWith("+") && !field.startsWith("-"));
106
- const includeFields = fields
107
- .filter((field) => field.startsWith("+"))
108
- .map((field) => field.substring(1));
109
- const excludeFields = fields
110
- .filter((field) => field.startsWith("-"))
111
- .map((field) => field.substring(1));
112
- let selection = {};
113
- if (regularFields.length > 0) {
114
- selection = regularFields.reduce((acc, field) => {
115
- acc[field] = true;
116
- return acc;
117
- }, {});
118
- }
119
- else {
120
- selection = this.filters.include || {};
121
- includeFields.forEach((field) => {
122
- selection[field] = true;
123
- });
124
- excludeFields.forEach((field) => {
125
- selection[field] = false;
126
- });
127
- }
128
- this.filters = {
129
- ...this.filters,
130
- select: selection,
131
- };
132
- if (this.filters.include) {
133
- delete this.filters.include;
134
- }
135
- }
136
- if (this.searchParams?.addFields || this.searchParams?.removeFields) {
137
- throw new AppError("The addFields and removeFields parameters are deprecated. Please use fields with + and - prefixes instead.", 400);
138
- }
139
- return this;
140
- }
141
- paginate() {
142
- const page = parseInt(this.searchParams.page, 10) || 1;
143
- const limit = parseInt(this.searchParams.limit, 10) || 30;
144
- const skip = (page - 1) * limit;
145
- this.filters = {
146
- ...this.filters,
147
- skip,
148
- take: limit,
149
- };
150
- return this;
151
- }
152
- }
153
- export const apiFeatures = new APIFeatures();
154
- //# sourceMappingURL=api.features.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.features.js","sourceRoot":"","sources":["../../../../src/utils/features/api.features.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,QAAQ,MAAM,6CAA6C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAK9D,MAAM,CAAC,OAAO,OAAO,WAAW;IAqB9B,YAAY,GAAa,EAAE,SAAqB;QAjBhD,YAAO,GAAQ,EAAE,CAAC;QAElB,mBAAc,GAAG;YACf,MAAM;YACN,MAAM;YACN,OAAO;YACP,QAAQ;YACR,WAAW;YACX,cAAc;YACd,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,OAAO;YACP,oBAAoB;YACpB,eAAe;SAChB,CAAC;QAGA,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAY,EAAE,SAAqB;QACvC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,YAAY,GAAG,6BAA6B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAEnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,GAAG;YACX,MAAM,IAAI,KAAK,CACb,0LAA0L,CAC3L,CAAC;QACJ,MAAM,gBAAgB,GAA0B,EAAE,CAAC;QAEnD,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACrD,MAAM,2BAA2B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;SACrB,CAAC,CAAC,CAAC;QAEJ,IAAI,YAAY,GACd,2BAA2B,CAAC,MAAM,GAAG,CAAC;YACpC,CAAC,CAAC;gBACE,CAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,UAAqB,IAAI,IAAI,CAAC,EAC9C,2BAA2B;aAC9B;YACH,CAAC,CAAC,EAAE,CAAC;QAET,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;YAEnC,IAAI,IAAI,CAAC,SAAS;gBAChB,MAAM,CAAC,IAAI,CAAE,MAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBAClE,MAAM,KAAK,GAAK,MAAc,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC,MAAc,CAAC,GAAG,CAAC,CAAC;oBACpE,IACE,KAAK,CAAC,QAAQ,KAAK,QAAQ;wBAC3B,GAAG,KAAK,IAAI;wBACZ,GAAG,KAAK,UAAU;wBAClB,CAAC,KAAK,CAAC,MAAM;wBACb,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC;wBACtB,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,EACtB,CAAC;wBACD,gBAAgB,CAAC,IAAI,CAAC;4BACpB,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;gCACV,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;gCAClC,IAAI,EAAE,aAAa;6BACpB;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YAEL,YAAY,GAAG,SAAS,CACtB;gBACE,EAAE,EAAE,gBAAgB;aACrB,EACD,YAAY,CACb,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAC1B;YACE,KAAK,EAAE,YAAY;SACpB,EACD,IAAI,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAClC,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE;gBACrC,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE;iBACP;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI;gBACpC,EAAE,KAAK,CAAC,GAAG,CAAC;gBACZ,EAAE,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;gBACxB,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAClD,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;aACzC,CAAC,CAAC,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAGnD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CACjC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CACpE,CAAC;YACF,MAAM,aAAa,GAAG,MAAM;iBACzB,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,MAAM;iBACzB,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAChD,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAG9C,IAAI,SAAS,GAAwB,EAAE,CAAC;YAGxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,SAAS,GAAG,aAAa,CAAC,MAAM,CAC9B,CAAC,GAAwB,EAAE,KAAa,EAAE,EAAE;oBAC1C,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBAClB,OAAO,GAAG,CAAC;gBACb,CAAC,EACD,EAAyB,CAC1B,CAAC;YACJ,CAAC;iBAEI,CAAC;gBAEJ,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBAGvC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACtC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBAC1B,CAAC,CAAC,CAAC;gBAGH,aAAa,CAAC,OAAO,CAAC,CAAC,KAAa,EAAE,EAAE;oBACtC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC;YAGD,IAAI,CAAC,OAAO,GAAG;gBACb,GAAG,IAAI,CAAC,OAAO;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC;YAGF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,CAAC;QACH,CAAC;QAGD,IAAI,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;YACpE,MAAM,IAAI,QAAQ,CAChB,4GAA4G,EAC5G,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;QAEhC,IAAI,CAAC,OAAO,GAAG;YACb,GAAG,IAAI,CAAC,OAAO;YACf,IAAI;YACJ,IAAI,EAAE,KAAK;SACZ,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC","sourcesContent":["import { Request } from \"express\";\nimport deepmerge from \"../helpers/deepmerge.helper\";\nimport { parseQueryParamsWithModifiers } from \"../helpers/api.features.helpers\";\nimport AppError from \"../../modules/error-handler/utils/app-error\";\nimport { getPrismaInstance } from \"../helpers/prisma.helpers\";\nimport { ArkosRequest } from \"../../types\";\n\ntype ModelName = string;\n\nexport default class APIFeatures {\n req?: ArkosRequest;\n searchParams: any; // The query string parameters from the request\n searchParamsWithModifiers: any; // The query string parameters from the request\n filters: any = {};\n modelName?: ModelName;\n excludedFields = [\n \"page\",\n \"sort\",\n \"limit\",\n \"fields\",\n \"addFields\",\n \"removeFields\",\n \"search\",\n \"include\",\n \"filterMode\",\n \"where\",\n \"prismaQueryOptions\",\n \"ignoredFields\",\n ];\n\n constructor(req?: Request, modelName?: ModelName) {\n if (req) {\n this.req = req;\n this.searchParams = parseQueryParamsWithModifiers(req.query);\n }\n if (modelName) this.modelName = modelName;\n this.filters = { ...this.filters };\n }\n\n setup(req: Request, modelName?: ModelName) {\n this.req = req;\n this.searchParams = parseQueryParamsWithModifiers(req.query);\n if (modelName) this.modelName = modelName;\n this.filters = { ...this.filters };\n\n return this;\n }\n\n filter() {\n if (!this.req)\n throw new Error(\n \"Trying to use APIFeatures.filter() without passing request on class constructor or APIFeatures.setup() method. read more about at www.arkosjs.com/docs/advanced-guide/api-features-class\"\n );\n const searchableFields: Record<string, any>[] = [];\n\n const queryObj = { ...this.searchParams };\n\n this.excludedFields.forEach((el) => delete queryObj[el]);\n\n const whereObj = { ...this.req.params, ...queryObj };\n const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({\n [key]: whereObj[key],\n }));\n\n let whereOptions =\n whereLogicalOperatorFilters.length > 0\n ? {\n [(this.req.query?.filterMode as string) ?? \"OR\"]:\n whereLogicalOperatorFilters,\n }\n : {};\n\n if (!!this.searchParams.search) {\n const prisma = getPrismaInstance();\n\n if (this.modelName)\n Object.keys((prisma as any)[this.modelName].fields).forEach((key) => {\n const field = ((prisma as any)[this.modelName!].fields as any)[key];\n if (\n field.typeName === \"String\" &&\n key !== \"id\" &&\n key !== \"password\" &&\n !field.isList &&\n !key?.includes?.(\"Id\") &&\n !key?.includes?.(\"ID\")\n ) {\n searchableFields.push({\n [`${key}`]: {\n contains: this.searchParams.search,\n mode: \"insensitive\",\n },\n });\n }\n });\n\n whereOptions = deepmerge(\n {\n OR: searchableFields,\n },\n whereOptions\n );\n }\n\n const firstMerge = deepmerge(\n {\n where: whereOptions,\n },\n this.req.prismaQueryOptions || {}\n );\n\n this.filters = deepmerge(firstMerge, this.filters);\n return this;\n }\n\n search() {\n if (this.searchParams?.search) {\n this.filters = deepmerge(this.filters, {\n where: {\n OR: [],\n },\n });\n }\n }\n\n sort() {\n if (this.searchParams.sort) {\n const sortBy = this.searchParams?.sort\n ?.split(\",\")\n ?.map((field: string) => ({\n [field.startsWith(\"-\") ? field.substring(1) : field]:\n field.startsWith(\"-\") ? \"desc\" : \"asc\",\n }));\n this.filters = deepmerge(this.filters, { orderBy: sortBy });\n }\n\n return this;\n }\n\n limitFields() {\n if (this.searchParams?.fields) {\n const fields = this.searchParams.fields.split(\",\");\n\n // Separate fields into includes, excludes, and regular fields\n const regularFields = fields.filter(\n (field: string) => !field.startsWith(\"+\") && !field.startsWith(\"-\")\n );\n const includeFields = fields\n .filter((field: string) => field.startsWith(\"+\"))\n .map((field: string) => field.substring(1));\n const excludeFields = fields\n .filter((field: string) => field.startsWith(\"-\"))\n .map((field: string) => field.substring(1));\n\n // Create selection object based on field type\n let selection: Record<string, any> = {};\n\n // If regular fields exist, use them as the base selection\n if (regularFields.length > 0) {\n selection = regularFields.reduce(\n (acc: Record<string, any>, field: string) => {\n acc[field] = true;\n return acc;\n },\n {} as Record<string, any>\n );\n }\n // Otherwise, use include fields as additions to any existing included fields\n else {\n // Start with current include fields if they exist\n selection = this.filters.include || {};\n\n // Add any explicitly included fields\n includeFields.forEach((field: string) => {\n selection[field] = true;\n });\n\n // Add any explicitly excluded fields\n excludeFields.forEach((field: string) => {\n selection[field] = false;\n });\n }\n\n // Apply the selection to filters\n this.filters = {\n ...this.filters,\n select: selection,\n };\n\n // Remove the include filter as it's now part of select\n if (this.filters.include) {\n delete this.filters.include;\n }\n }\n\n // Remove any references to the now-unused parameters\n if (this.searchParams?.addFields || this.searchParams?.removeFields) {\n throw new AppError(\n \"The addFields and removeFields parameters are deprecated. Please use fields with + and - prefixes instead.\",\n 400\n );\n }\n\n return this;\n }\n\n paginate() {\n const page = parseInt(this.searchParams.page, 10) || 1;\n const limit = parseInt(this.searchParams.limit, 10) || 30;\n const skip = (page - 1) * limit;\n\n this.filters = {\n ...this.filters,\n skip,\n take: limit,\n };\n return this;\n }\n}\n\nexport const apiFeatures = new APIFeatures();\n"]}
@@ -1,31 +0,0 @@
1
- import * as changeCase from "../helpers/change-case.helpers";
2
- const isObject = (object) => object !== null && typeof object === "object";
3
- function changeKeysFactory(changeCase) {
4
- return function changeKeys(object, depth = 1, options) {
5
- if (depth === 0 || !isObject(object))
6
- return object;
7
- if (Array.isArray(object)) {
8
- return object.map((item) => changeKeys(item, depth - 1, options));
9
- }
10
- const result = Object.create(Object.getPrototypeOf(object));
11
- Object.keys(object).forEach((key) => {
12
- const value = object[key];
13
- const changedKey = changeCase(key, options);
14
- const changedValue = changeKeys(value, depth - 1, options);
15
- result[changedKey] = changedValue;
16
- });
17
- return result;
18
- };
19
- }
20
- export const camelCase = changeKeysFactory(changeCase.camelCase);
21
- export const capitalCase = changeKeysFactory(changeCase.capitalCase);
22
- export const constantCase = changeKeysFactory(changeCase.constantCase);
23
- export const dotCase = changeKeysFactory(changeCase.dotCase);
24
- export const trainCase = changeKeysFactory(changeCase.trainCase);
25
- export const noCase = changeKeysFactory(changeCase.noCase);
26
- export const kebabCase = changeKeysFactory(changeCase.kebabCase);
27
- export const pascalCase = changeKeysFactory(changeCase.pascalCase);
28
- export const pathCase = changeKeysFactory(changeCase.pathCase);
29
- export const sentenceCase = changeKeysFactory(changeCase.sentenceCase);
30
- export const snakeCase = changeKeysFactory(changeCase.snakeCase);
31
- //# sourceMappingURL=change-case.features.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-case.features.js","sourceRoot":"","sources":["../../../../src/utils/features/change-case.features.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAC;AAE7D,MAAM,QAAQ,GAAG,CAAC,MAAe,EAAE,EAAE,CACnC,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC;AAEhD,SAAS,iBAAiB,CAGxB,UAAmE;IAEnE,OAAO,SAAS,UAAU,CACxB,MAAe,EACf,KAAK,GAAG,CAAC,EACT,OAAiB;QAEjB,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAEpD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAA4B,MAAM,CAAC,MAAM,CACnD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAC9B,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,MAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAI,MAAkC,CAAC,GAAG,CAAC,CAAC;YACvD,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CACxC,UAAU,CAAC,SAAS,CACrB,CAAC;AACF,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CACzC,UAAU,CAAC,UAAU,CACtB,CAAC;AACF,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC","sourcesContent":["import * as changeCase from \"../helpers/change-case.helpers\";\n\nconst isObject = (object: unknown) =>\n object !== null && typeof object === \"object\";\n\nfunction changeKeysFactory<\n Options extends changeCase.Options = changeCase.Options\n>(\n changeCase: (input: string, options?: changeCase.Options) => string\n): (object: unknown, depth?: number, options?: Options) => unknown {\n return function changeKeys(\n object: unknown,\n depth = 1,\n options?: Options\n ): unknown {\n if (depth === 0 || !isObject(object)) return object;\n\n if (Array.isArray(object)) {\n return object.map((item) => changeKeys(item, depth - 1, options));\n }\n\n const result: Record<string, unknown> = Object.create(\n Object.getPrototypeOf(object)\n );\n\n Object.keys(object as object).forEach((key) => {\n const value = (object as Record<string, unknown>)[key];\n const changedKey = changeCase(key, options);\n const changedValue = changeKeys(value, depth - 1, options);\n result[changedKey] = changedValue;\n });\n\n return result;\n };\n}\n\nexport const camelCase = changeKeysFactory<changeCase.PascalCaseOptions>(\n changeCase.camelCase\n);\nexport const capitalCase = changeKeysFactory(changeCase.capitalCase);\nexport const constantCase = changeKeysFactory(changeCase.constantCase);\nexport const dotCase = changeKeysFactory(changeCase.dotCase);\nexport const trainCase = changeKeysFactory(changeCase.trainCase);\nexport const noCase = changeKeysFactory(changeCase.noCase);\nexport const kebabCase = changeKeysFactory(changeCase.kebabCase);\nexport const pascalCase = changeKeysFactory<changeCase.PascalCaseOptions>(\n changeCase.pascalCase\n);\nexport const pathCase = changeKeysFactory(changeCase.pathCase);\nexport const sentenceCase = changeKeysFactory(changeCase.sentenceCase);\nexport const snakeCase = changeKeysFactory(changeCase.snakeCase);\n"]}
@@ -1,103 +0,0 @@
1
- const DEFAULT_FIELD_CONFIG = {
2
- dateFields: ["createdAt", "updatedAt", "deletedAt", "date"],
3
- booleanFields: ["isActive", "isDeleted", "isPublished", "isArchived"],
4
- numericFields: ["age", "price", "quantity", "amount", "rating"],
5
- };
6
- export function parseQueryParamsWithModifiers(query, fieldConfig = DEFAULT_FIELD_CONFIG) {
7
- return Object.entries(JSON.parse(JSON.stringify(query))).reduce((acc, [key, value]) => {
8
- const parts = key.split("__");
9
- if (!value && value !== false && value !== "false" && parts.length < 2)
10
- return acc;
11
- const stringValue = Array.isArray(value) ? value[0]?.toString() : value;
12
- if (parts.length < 2) {
13
- acc[key] =
14
- typeof value === "string" && !Number.isNaN(value)
15
- ? convertValue(stringValue, parts[0], fieldConfig)
16
- : value;
17
- return acc;
18
- }
19
- const fieldName = parts[0];
20
- if (fieldName === "orderBy" && parts.length === 2) {
21
- if (!acc.orderBy)
22
- acc.orderBy = {};
23
- acc.orderBy[parts[1]] = stringValue;
24
- return acc;
25
- }
26
- if (parts.length === 1) {
27
- acc[fieldName] = {
28
- equals: convertValue(stringValue, fieldName, fieldConfig),
29
- };
30
- return acc;
31
- }
32
- let currentLevel = acc;
33
- let currentKey = fieldName;
34
- for (let i = 1; i < parts.length - 1; i++) {
35
- if (!currentLevel[currentKey]) {
36
- currentLevel[currentKey] = {};
37
- }
38
- currentLevel = currentLevel[currentKey];
39
- currentKey = parts[i];
40
- }
41
- const lastOperator = parts[parts.length - 1];
42
- switch (lastOperator) {
43
- case "icontains":
44
- currentLevel[currentKey] = {
45
- contains: stringValue,
46
- mode: "insensitive",
47
- };
48
- break;
49
- case "contains":
50
- currentLevel[currentKey] = {
51
- contains: stringValue,
52
- mode: "sensitive",
53
- };
54
- break;
55
- case "in":
56
- case "notIn":
57
- currentLevel[currentKey] = {
58
- [lastOperator]: stringValue
59
- .split(",")
60
- .map((v) => convertValue(v.trim(), fieldName, fieldConfig)),
61
- };
62
- break;
63
- case "or":
64
- const values = stringValue.split(",");
65
- if (!acc.OR)
66
- acc.OR = [];
67
- acc.OR.push(...values.map((val) => ({
68
- [fieldName]: {
69
- equals: convertValue(val.trim(), fieldName, fieldConfig),
70
- },
71
- })));
72
- break;
73
- case "isNull":
74
- currentLevel[currentKey] = {
75
- equals: stringValue.toLowerCase() === "true" ? null : undefined,
76
- };
77
- break;
78
- case "isEmpty":
79
- currentLevel[currentKey] = {
80
- equals: stringValue.toLowerCase() === "true" ? "" : undefined,
81
- };
82
- break;
83
- default:
84
- currentLevel[currentKey] = {
85
- [lastOperator]: convertValue(stringValue, fieldName, fieldConfig),
86
- };
87
- }
88
- return acc;
89
- }, {});
90
- }
91
- function convertValue(value, fieldName, config) {
92
- if (config.dateFields?.includes?.(fieldName) && value) {
93
- return new Date(value);
94
- }
95
- if (config.booleanFields?.includes?.(fieldName) && value) {
96
- return value.toLowerCase() === "true";
97
- }
98
- if (config.numericFields?.includes?.(fieldName) && value) {
99
- return Number(value);
100
- }
101
- return value;
102
- }
103
- //# sourceMappingURL=api.features.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.features.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/api.features.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Configuration types for field type mapping\n */\ninterface FieldConfig {\n dateFields: string[];\n booleanFields: string[];\n numericFields: string[];\n}\n\n/**\n * Type for the structured filter object returned by the parser\n */\ntype ParsedFilter = {\n [key: string]: any;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n OR?: Record<string, any>[];\n};\n\n/**\n * Default configuration for field types\n */\nconst DEFAULT_FIELD_CONFIG: FieldConfig = {\n dateFields: [\"createdAt\", \"updatedAt\", \"deletedAt\", \"date\"],\n booleanFields: [\"isActive\", \"isDeleted\", \"isPublished\", \"isArchived\"],\n numericFields: [\"age\", \"price\", \"quantity\", \"amount\", \"rating\"],\n};\n\n/**\n * Parses query parameters into a structured filter object compatible with Prisma queries.\n * Supports various operators and data type conversions.\n *\n * @param query - Object containing query parameters\n * @param fieldConfig - Optional configuration for field type mapping\n * @returns Structured filter object for database queries\n *\n * @example\n * // Basic usage\n * parseQueryParamsWithModifiers({ name__contains: 'john' })\n * // => { name: { contains: 'john', mode: 'sensitive' } }\n *\n * @example\n * // Complex query\n * parseQueryParamsWithModifiers({\n * name__not__equals: 'john',\n * age__gt: '25',\n * tags__in: 'tag1,tag2',\n * orderBy__createdAt: 'desc'\n * })\n */\nexport function parseQueryParamsWithModifiers(\n query: Record<string, any>,\n // excludedFields: string[],\n fieldConfig: FieldConfig = DEFAULT_FIELD_CONFIG\n): ParsedFilter {\n return Object.entries(JSON.parse(JSON.stringify(query))).reduce(\n (acc, [key, value]) => {\n const parts = key.split(\"__\");\n if (!value && value !== false && value !== \"false\" && parts.length < 2)\n return acc;\n\n // Convert value to string if it's not already\n const stringValue = Array.isArray(value) ? value[0]?.toString() : value;\n\n if (parts.length < 2) {\n acc[key] =\n typeof value === \"string\" && !Number.isNaN(value)\n ? convertValue(stringValue, parts[0], fieldConfig)\n : value;\n return acc;\n }\n const fieldName = parts[0];\n\n // Handle ordering\n if (fieldName === \"orderBy\" && parts.length === 2) {\n if (!acc.orderBy) acc.orderBy = {};\n acc.orderBy[parts[1]] = stringValue as \"asc\" | \"desc\";\n return acc;\n }\n\n // Handle simple equals case\n if (parts.length === 1) {\n acc[fieldName] = {\n equals: convertValue(stringValue, fieldName, fieldConfig),\n };\n return acc;\n }\n\n let currentLevel = acc;\n let currentKey = fieldName;\n\n // Build nested structure\n for (let i = 1; i < parts.length - 1; i++) {\n if (!currentLevel[currentKey]) {\n currentLevel[currentKey] = {};\n }\n currentLevel = currentLevel[currentKey];\n currentKey = parts[i];\n }\n\n const lastOperator = parts[parts.length - 1];\n\n // Handle special operators\n switch (lastOperator) {\n case \"icontains\":\n currentLevel[currentKey] = {\n contains: stringValue,\n mode: \"insensitive\",\n };\n break;\n\n case \"contains\":\n currentLevel[currentKey] = {\n contains: stringValue,\n mode: \"sensitive\",\n };\n break;\n\n case \"in\":\n case \"notIn\":\n currentLevel[currentKey] = {\n [lastOperator]: stringValue\n .split(\",\")\n .map((v: string) =>\n convertValue(v.trim(), fieldName, fieldConfig)\n ),\n };\n break;\n\n case \"or\":\n const values: string[] = stringValue.split(\",\");\n if (!acc.OR) acc.OR = [];\n acc.OR.push(\n ...values.map((val) => ({\n [fieldName]: {\n equals: convertValue(val.trim(), fieldName, fieldConfig),\n },\n }))\n );\n break;\n\n case \"isNull\":\n currentLevel[currentKey] = {\n equals: stringValue.toLowerCase() === \"true\" ? null : undefined,\n };\n break;\n\n case \"isEmpty\":\n currentLevel[currentKey] = {\n equals: stringValue.toLowerCase() === \"true\" ? \"\" : undefined,\n };\n break;\n\n default:\n currentLevel[currentKey] = {\n [lastOperator]: convertValue(stringValue, fieldName, fieldConfig),\n };\n }\n\n return acc;\n },\n {} as ParsedFilter\n );\n}\n\n/**\n * Converts string values to appropriate types based on field configuration\n * \n * // Example usage:\n/*\n const query = {\n name__not__equals: 'uanela',\n email__contains: 'example.com',\n description__icontains: 'test',\n age__gt: '25',\n status: 'active',\n tags__in: 'tag1,tag2,tag3',\n createdAt__gt: '2024-01-01',\n isActive: 'true',\n orderBy__createdAt: 'desc'\n };\n \n const result = parseQueryParamsWithModifiers(query);\n */\nfunction convertValue(\n value: string,\n fieldName: string,\n config: FieldConfig\n): any {\n // Handle date fields\n if (config.dateFields?.includes?.(fieldName) && value) {\n return new Date(value);\n }\n\n // Handle boolean fields\n if (config.booleanFields?.includes?.(fieldName) && value) {\n return value.toLowerCase() === \"true\";\n }\n\n // Handle numeric fields\n if (config.numericFields?.includes?.(fieldName) && value) {\n return Number(value);\n }\n\n return value;\n}\n"]}
@@ -1,161 +0,0 @@
1
- const SPLIT_LOWER_UPPER_RE = /([\p{Ll}\d])(\p{Lu})/gu;
2
- const SPLIT_UPPER_UPPER_RE = /(\p{Lu})([\p{Lu}][\p{Ll}])/gu;
3
- const SPLIT_SEPARATE_NUMBER_RE = /(\d)\p{Ll}|(\p{L})\d/u;
4
- const DEFAULT_STRIP_REGEXP = /[^\p{L}\d]+/giu;
5
- const SPLIT_REPLACE_VALUE = "$1\0$2";
6
- const DEFAULT_PREFIX_SUFFIX_CHARACTERS = "";
7
- export function split(value) {
8
- let result = value.trim();
9
- result = result
10
- .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)
11
- .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);
12
- result = result.replace(DEFAULT_STRIP_REGEXP, "\0");
13
- let start = 0;
14
- let end = result.length;
15
- while (result.charAt(start) === "\0")
16
- start++;
17
- if (start === end)
18
- return [];
19
- while (result.charAt(end - 1) === "\0")
20
- end--;
21
- return result.slice(start, end).split(/\0/g);
22
- }
23
- export function splitSeparateNumbers(value) {
24
- const words = split(value);
25
- for (let i = 0; i < words.length; i++) {
26
- const word = words[i];
27
- const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);
28
- if (match) {
29
- const offset = match.index + (match[1] ?? match[2]).length;
30
- words.splice(i, 1, word.slice(0, offset), word.slice(offset));
31
- }
32
- }
33
- return words;
34
- }
35
- export function noCase(input, options) {
36
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
37
- return (prefix +
38
- words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? " ") +
39
- suffix);
40
- }
41
- export function camelCase(input, options) {
42
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
43
- const lower = lowerFactory(options?.locale);
44
- const upper = upperFactory(options?.locale);
45
- const transform = options?.mergeAmbiguousCharacters
46
- ? capitalCaseTransformFactory(lower, upper)
47
- : pascalCaseTransformFactory(lower, upper);
48
- return (prefix +
49
- words
50
- .map((word, index) => {
51
- if (index === 0)
52
- return lower(word);
53
- return transform(word, index);
54
- })
55
- .join(options?.delimiter ?? "") +
56
- suffix);
57
- }
58
- export function pascalCase(input, options) {
59
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
60
- const lower = lowerFactory(options?.locale);
61
- const upper = upperFactory(options?.locale);
62
- const transform = options?.mergeAmbiguousCharacters
63
- ? capitalCaseTransformFactory(lower, upper)
64
- : pascalCaseTransformFactory(lower, upper);
65
- return prefix + words.map(transform).join(options?.delimiter ?? "") + suffix;
66
- }
67
- export function pascalSnakeCase(input, options) {
68
- return capitalCase(input, { delimiter: "_", ...options });
69
- }
70
- export function capitalCase(input, options) {
71
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
72
- const lower = lowerFactory(options?.locale);
73
- const upper = upperFactory(options?.locale);
74
- return (prefix +
75
- words
76
- .map(capitalCaseTransformFactory(lower, upper))
77
- .join(options?.delimiter ?? " ") +
78
- suffix);
79
- }
80
- export function constantCase(input, options) {
81
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
82
- return (prefix +
83
- words.map(upperFactory(options?.locale)).join(options?.delimiter ?? "_") +
84
- suffix);
85
- }
86
- export function dotCase(input, options) {
87
- return noCase(input, { delimiter: ".", ...options });
88
- }
89
- export function kebabCase(input, options) {
90
- return noCase(input, { delimiter: "-", ...options });
91
- }
92
- export function pathCase(input, options) {
93
- return noCase(input, { delimiter: "/", ...options });
94
- }
95
- export function sentenceCase(input, options) {
96
- const [prefix, words, suffix] = splitPrefixSuffix(input, options);
97
- const lower = lowerFactory(options?.locale);
98
- const upper = upperFactory(options?.locale);
99
- const transform = capitalCaseTransformFactory(lower, upper);
100
- return (prefix +
101
- words
102
- .map((word, index) => {
103
- if (index === 0)
104
- return transform(word);
105
- return lower(word);
106
- })
107
- .join(options?.delimiter ?? " ") +
108
- suffix);
109
- }
110
- export function snakeCase(input, options) {
111
- return noCase(input, { delimiter: "_", ...options });
112
- }
113
- export function trainCase(input, options) {
114
- return capitalCase(input, { delimiter: "-", ...options });
115
- }
116
- function lowerFactory(locale) {
117
- return locale === false
118
- ? (input) => input.toLowerCase()
119
- : (input) => input.toLocaleLowerCase(locale);
120
- }
121
- function upperFactory(locale) {
122
- return locale === false
123
- ? (input) => input.toUpperCase()
124
- : (input) => input.toLocaleUpperCase(locale);
125
- }
126
- function capitalCaseTransformFactory(lower, upper) {
127
- return (word) => `${upper(word[0])}${lower(word.slice(1))}`;
128
- }
129
- function pascalCaseTransformFactory(lower, upper) {
130
- return (word, index) => {
131
- const char0 = word[0];
132
- const initial = index > 0 && char0 >= "0" && char0 <= "9" ? "_" + char0 : upper(char0);
133
- return initial + lower(word.slice(1));
134
- };
135
- }
136
- function splitPrefixSuffix(input, options = {}) {
137
- const splitFn = options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);
138
- const prefixCharacters = options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;
139
- const suffixCharacters = options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;
140
- let prefixIndex = 0;
141
- let suffixIndex = input.length;
142
- while (prefixIndex < input.length) {
143
- const char = input.charAt(prefixIndex);
144
- if (!prefixCharacters?.includes?.(char))
145
- break;
146
- prefixIndex++;
147
- }
148
- while (suffixIndex > prefixIndex) {
149
- const index = suffixIndex - 1;
150
- const char = input.charAt(index);
151
- if (!suffixCharacters?.includes?.(char))
152
- break;
153
- suffixIndex = index;
154
- }
155
- return [
156
- input.slice(0, prefixIndex),
157
- splitFn(input.slice(prefixIndex, suffixIndex)),
158
- input.slice(suffixIndex),
159
- ];
160
- }
161
- //# sourceMappingURL=change-case.helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"change-case.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/change-case.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["// Regexps involved with splitting words in various case formats.\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\n\n// Used to iterate over the initial split result and separate numbers.\nconst SPLIT_SEPARATE_NUMBER_RE = /(\\d)\\p{Ll}|(\\p{L})\\d/u;\n\n// Regexp involved with stripping non-word characters from the result.\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\n\n// The replacement value for splits.\nconst SPLIT_REPLACE_VALUE = \"$1\\0$2\";\n\n// The default characters to keep after transforming case.\nconst DEFAULT_PREFIX_SUFFIX_CHARACTERS = \"\";\n\n/**\n * Supported locale values. Use `false` to ignore locale.\n * Defaults to `undefined`, which uses the host environment.\n */\nexport type Locale = string[] | string | false | undefined;\n\n/**\n * Options used for converting strings to pascal/camel case.\n */\nexport interface PascalCaseOptions extends Options {\n mergeAmbiguousCharacters?: boolean;\n}\n\n/**\n * Options used for converting strings to any case.\n */\nexport interface Options {\n locale?: Locale;\n split?: (value: string) => string[];\n /** @deprecated Pass `split: splitSeparateNumbers` instead. */\n separateNumbers?: boolean;\n delimiter?: string;\n prefixCharacters?: string;\n suffixCharacters?: string;\n}\n\n/**\n * Split any cased input strings into an array of words.\n */\nexport function split(value: string) {\n let result = value.trim();\n\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n\n result = result.replace(DEFAULT_STRIP_REGEXP, \"\\0\");\n\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\") start++;\n if (start === end) return [];\n while (result.charAt(end - 1) === \"\\0\") end--;\n\n return result.slice(start, end).split(/\\0/g);\n}\n\n/**\n * Split the input string into an array of words, separating numbers.\n */\nexport function splitSeparateNumbers(value: string) {\n const words = split(value);\n for (let i = 0; i < words.length; i++) {\n const word = words[i];\n const match = SPLIT_SEPARATE_NUMBER_RE.exec(word);\n if (match) {\n const offset = match.index + (match[1] ?? match[2]).length;\n words.splice(i, 1, word.slice(0, offset), word.slice(offset));\n }\n }\n return words;\n}\n\n/**\n * Convert a string to space separated lower case (`foo bar`).\n */\nexport function noCase(input: string, options?: Options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (\n prefix +\n words.map(lowerFactory(options?.locale)).join(options?.delimiter ?? \" \") +\n suffix\n );\n}\n\n/**\n * Convert a string to camel case (`fooBar`).\n */\nexport function camelCase(input: string, options?: PascalCaseOptions) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return (\n prefix +\n words\n .map((word, index) => {\n if (index === 0) return lower(word);\n return transform(word, index);\n })\n .join(options?.delimiter ?? \"\") +\n suffix\n );\n}\n\n/**\n * Convert a string to pascal case (`FooBar`).\n */\nexport function pascalCase(input: string, options?: PascalCaseOptions) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = options?.mergeAmbiguousCharacters\n ? capitalCaseTransformFactory(lower, upper)\n : pascalCaseTransformFactory(lower, upper);\n return prefix + words.map(transform).join(options?.delimiter ?? \"\") + suffix;\n}\n\n/**\n * Convert a string to pascal snake case (`Foo_Bar`).\n */\nexport function pascalSnakeCase(input: string, options?: Options) {\n return capitalCase(input, { delimiter: \"_\", ...options });\n}\n\n/**\n * Convert a string to capital case (`Foo Bar`).\n */\nexport function capitalCase(input: string, options?: Options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n return (\n prefix +\n words\n .map(capitalCaseTransformFactory(lower, upper))\n .join(options?.delimiter ?? \" \") +\n suffix\n );\n}\n\n/**\n * Convert a string to constant case (`FOO_BAR`).\n */\nexport function constantCase(input: string, options?: Options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n return (\n prefix +\n words.map(upperFactory(options?.locale)).join(options?.delimiter ?? \"_\") +\n suffix\n );\n}\n\n/**\n * Convert a string to dot case (`foo.bar`).\n */\nexport function dotCase(input: string, options?: Options) {\n return noCase(input, { delimiter: \".\", ...options });\n}\n\n/**\n * Convert a string to kebab case (`foo-bar`).\n */\nexport function kebabCase(input: string, options?: Options) {\n return noCase(input, { delimiter: \"-\", ...options });\n}\n\n/**\n * Convert a string to path case (`foo/bar`).\n */\nexport function pathCase(input: string, options?: Options) {\n return noCase(input, { delimiter: \"/\", ...options });\n}\n\n/**\n * Convert a string to path case (`Foo bar`).\n */\nexport function sentenceCase(input: string, options?: Options) {\n const [prefix, words, suffix] = splitPrefixSuffix(input, options);\n const lower = lowerFactory(options?.locale);\n const upper = upperFactory(options?.locale);\n const transform = capitalCaseTransformFactory(lower, upper);\n return (\n prefix +\n words\n .map((word, index) => {\n if (index === 0) return transform(word);\n return lower(word);\n })\n .join(options?.delimiter ?? \" \") +\n suffix\n );\n}\n\n/**\n * Convert a string to snake case (`foo_bar`).\n */\nexport function snakeCase(input: string, options?: Options) {\n return noCase(input, { delimiter: \"_\", ...options });\n}\n\n/**\n * Convert a string to header case (`Foo-Bar`).\n */\nexport function trainCase(input: string, options?: Options) {\n return capitalCase(input, { delimiter: \"-\", ...options });\n}\n\nfunction lowerFactory(locale: Locale): (input: string) => string {\n return locale === false\n ? (input: string) => input.toLowerCase()\n : (input: string) => input.toLocaleLowerCase(locale);\n}\n\nfunction upperFactory(locale: Locale): (input: string) => string {\n return locale === false\n ? (input: string) => input.toUpperCase()\n : (input: string) => input.toLocaleUpperCase(locale);\n}\n\nfunction capitalCaseTransformFactory(\n lower: (input: string) => string,\n upper: (input: string) => string\n) {\n return (word: string) => `${upper(word[0])}${lower(word.slice(1))}`;\n}\n\nfunction pascalCaseTransformFactory(\n lower: (input: string) => string,\n upper: (input: string) => string\n) {\n return (word: string, index: number) => {\n const char0 = word[0];\n const initial =\n index > 0 && char0 >= \"0\" && char0 <= \"9\" ? \"_\" + char0 : upper(char0);\n return initial + lower(word.slice(1));\n };\n}\n\nfunction splitPrefixSuffix(\n input: string,\n options: Options = {}\n): [string, string[], string] {\n const splitFn =\n options.split ?? (options.separateNumbers ? splitSeparateNumbers : split);\n const prefixCharacters =\n options.prefixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n const suffixCharacters =\n options.suffixCharacters ?? DEFAULT_PREFIX_SUFFIX_CHARACTERS;\n let prefixIndex = 0;\n let suffixIndex = input.length;\n\n while (prefixIndex < input.length) {\n const char = input.charAt(prefixIndex);\n if (!prefixCharacters?.includes?.(char)) break;\n prefixIndex++;\n }\n\n while (suffixIndex > prefixIndex) {\n const index = suffixIndex - 1;\n const char = input.charAt(index);\n if (!suffixCharacters?.includes?.(char)) break;\n suffixIndex = index;\n }\n\n return [\n input.slice(0, prefixIndex),\n splitFn(input.slice(prefixIndex, suffixIndex)),\n input.slice(suffixIndex),\n ];\n}\n"]}