zibri 2.4.0 → 2.4.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 (517) hide show
  1. package/dist/cjs/application.d.ts.map +1 -1
  2. package/dist/cjs/application.js +8 -2
  3. package/dist/cjs/application.js.map +1 -1
  4. package/dist/cjs/auth/encryption/encryption-key.model.d.ts +5 -1
  5. package/dist/cjs/auth/encryption/encryption-key.model.d.ts.map +1 -1
  6. package/dist/cjs/auth/encryption/encryption-key.model.js +9 -1
  7. package/dist/cjs/auth/encryption/encryption-key.model.js.map +1 -1
  8. package/dist/cjs/auth/strategies/cookie/cookie-auth.auth-strategy.d.ts.map +1 -1
  9. package/dist/cjs/auth/strategies/cookie/cookie-auth.auth-strategy.js.map +1 -1
  10. package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.d.ts +5 -1
  11. package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.d.ts.map +1 -1
  12. package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.js +9 -1
  13. package/dist/cjs/auth/strategies/jwt/jwt-credentials.model.js.map +1 -1
  14. package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.d.ts.map +1 -1
  15. package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js +2 -1
  16. package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
  17. package/dist/cjs/backup/backup-resource-entity.model.d.ts +5 -1
  18. package/dist/cjs/backup/backup-resource-entity.model.d.ts.map +1 -1
  19. package/dist/cjs/backup/backup-resource-entity.model.js +9 -1
  20. package/dist/cjs/backup/backup-resource-entity.model.js.map +1 -1
  21. package/dist/cjs/backup/backup.service.js +2 -2
  22. package/dist/cjs/backup/backup.service.js.map +1 -1
  23. package/dist/cjs/caching/cache/base-cache.model.js.map +1 -1
  24. package/dist/cjs/caching/cache/multi-tier.cache.js.map +1 -1
  25. package/dist/cjs/caching/cache/read-aside/read-aside.cache.js.map +1 -1
  26. package/dist/cjs/caching/cache/read-aside/write-around-read-aside.cache.js.map +1 -1
  27. package/dist/cjs/caching/cache/read-aside/write-behind-read-aside.cache.js.map +1 -1
  28. package/dist/cjs/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.js.map +1 -1
  29. package/dist/cjs/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.js.map +1 -1
  30. package/dist/cjs/caching/cache/read-aside/write-through-read-aside.cache.js.map +1 -1
  31. package/dist/cjs/caching/cache/read-through/read-through.cache.js.map +1 -1
  32. package/dist/cjs/caching/cache/read-through/write-around-read-through.cache.js.map +1 -1
  33. package/dist/cjs/caching/cache/read-through/write-behind-read-through.cache.js.map +1 -1
  34. package/dist/cjs/caching/cache/read-through/write-invalidate-read-through-args-only.cache.js.map +1 -1
  35. package/dist/cjs/caching/cache/read-through/write-invalidate-read-through-with-result.cache.js.map +1 -1
  36. package/dist/cjs/caching/cache/read-through/write-through-read-through.cache.js.map +1 -1
  37. package/dist/cjs/change-sets/change-set-repository.d.ts +5 -3
  38. package/dist/cjs/change-sets/change-set-repository.d.ts.map +1 -1
  39. package/dist/cjs/change-sets/change-set-repository.js +16 -16
  40. package/dist/cjs/change-sets/change-set-repository.js.map +1 -1
  41. package/dist/cjs/change-sets/models/change-set-entity.model.d.ts +2 -2
  42. package/dist/cjs/change-sets/models/change-set-entity.model.d.ts.map +1 -1
  43. package/dist/cjs/change-sets/models/change-set-entity.model.js +29 -1
  44. package/dist/cjs/change-sets/models/change-set-entity.model.js.map +1 -1
  45. package/dist/cjs/change-sets/models/change-set.model.js +1 -1
  46. package/dist/cjs/change-sets/models/change-set.model.js.map +1 -1
  47. package/dist/cjs/change-sets/models/change.model.d.ts +5 -1
  48. package/dist/cjs/change-sets/models/change.model.d.ts.map +1 -1
  49. package/dist/cjs/change-sets/models/change.model.js +9 -1
  50. package/dist/cjs/change-sets/models/change.model.js.map +1 -1
  51. package/dist/cjs/change-sets/models/soft-delete-entity.model.d.ts +2 -2
  52. package/dist/cjs/change-sets/models/soft-delete-entity.model.d.ts.map +1 -1
  53. package/dist/cjs/change-sets/models/soft-delete-entity.model.js +26 -0
  54. package/dist/cjs/change-sets/models/soft-delete-entity.model.js.map +1 -1
  55. package/dist/cjs/change-sets/soft-delete-repository.d.ts +6 -5
  56. package/dist/cjs/change-sets/soft-delete-repository.d.ts.map +1 -1
  57. package/dist/cjs/change-sets/soft-delete-repository.js +22 -6
  58. package/dist/cjs/change-sets/soft-delete-repository.js.map +1 -1
  59. package/dist/cjs/context/als.utilities.d.ts +3 -3
  60. package/dist/cjs/context/als.utilities.d.ts.map +1 -1
  61. package/dist/cjs/context/als.utilities.js.map +1 -1
  62. package/dist/cjs/context/cache/cache.context.d.ts +27 -0
  63. package/dist/cjs/context/cache/cache.context.d.ts.map +1 -0
  64. package/dist/cjs/context/cache/cache.context.js +61 -0
  65. package/dist/cjs/context/cache/cache.context.js.map +1 -0
  66. package/dist/cjs/data-source/data-sources/data-source-initialization.error.d.ts +7 -0
  67. package/dist/cjs/data-source/data-sources/data-source-initialization.error.d.ts.map +1 -0
  68. package/dist/cjs/data-source/data-sources/data-source-initialization.error.js +14 -0
  69. package/dist/cjs/data-source/data-sources/data-source-initialization.error.js.map +1 -0
  70. package/dist/cjs/data-source/data-sources/data-source.interface.d.ts +9 -1
  71. package/dist/cjs/data-source/data-sources/data-source.interface.d.ts.map +1 -1
  72. package/dist/cjs/data-source/data-sources/data-source.interface.js.map +1 -1
  73. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts +44 -0
  74. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts.map +1 -0
  75. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js +289 -0
  76. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -0
  77. package/dist/cjs/data-source/data-sources/sql-data-source.interface.d.ts +32 -0
  78. package/dist/cjs/data-source/data-sources/sql-data-source.interface.d.ts.map +1 -0
  79. package/dist/cjs/{entity/models/one-to-one-property-metadata.model.js → data-source/data-sources/sql-data-source.interface.js} +1 -1
  80. package/dist/cjs/data-source/data-sources/sql-data-source.interface.js.map +1 -0
  81. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts +156 -0
  82. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts.map +1 -0
  83. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js +378 -0
  84. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -0
  85. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts +25 -0
  86. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts.map +1 -0
  87. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +353 -0
  88. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -0
  89. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts +70 -0
  90. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts.map +1 -0
  91. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +248 -0
  92. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -0
  93. package/dist/cjs/data-source/models/options/count-options.model.d.ts +2 -7
  94. package/dist/cjs/data-source/models/options/count-options.model.d.ts.map +1 -1
  95. package/dist/cjs/data-source/models/options/delete-all-options.model.d.ts +2 -4
  96. package/dist/cjs/data-source/models/options/delete-all-options.model.d.ts.map +1 -1
  97. package/dist/cjs/data-source/models/options/find-all-options.model.d.ts +2 -2
  98. package/dist/cjs/data-source/models/options/find-all-options.model.d.ts.map +1 -1
  99. package/dist/cjs/data-source/models/options/find-by-id-options.model.d.ts +1 -6
  100. package/dist/cjs/data-source/models/options/find-by-id-options.model.d.ts.map +1 -1
  101. package/dist/cjs/data-source/models/options/find-one-options.model.d.ts +2 -11
  102. package/dist/cjs/data-source/models/options/find-one-options.model.d.ts.map +1 -1
  103. package/dist/cjs/data-source/models/options/update-all-options.model.d.ts +1 -7
  104. package/dist/cjs/data-source/models/options/update-all-options.model.d.ts.map +1 -1
  105. package/dist/cjs/data-source/models/options/update-by-id-options.model.d.ts +1 -7
  106. package/dist/cjs/data-source/models/options/update-by-id-options.model.d.ts.map +1 -1
  107. package/dist/cjs/data-source/models/where/array-where-filter.model.d.ts +142 -3
  108. package/dist/cjs/data-source/models/where/array-where-filter.model.d.ts.map +1 -1
  109. package/dist/cjs/data-source/models/where/base-where-filter.model.d.ts +18 -1
  110. package/dist/cjs/data-source/models/where/base-where-filter.model.d.ts.map +1 -1
  111. package/dist/cjs/data-source/models/where/boolean-where-filter.model.d.ts +4 -2
  112. package/dist/cjs/data-source/models/where/boolean-where-filter.model.d.ts.map +1 -1
  113. package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts +8 -15
  114. package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts.map +1 -1
  115. package/dist/cjs/data-source/models/where/number-where-filter.model.d.ts +8 -15
  116. package/dist/cjs/data-source/models/where/number-where-filter.model.d.ts.map +1 -1
  117. package/dist/cjs/data-source/models/where/object-where-filter.model.d.ts +52 -7
  118. package/dist/cjs/data-source/models/where/object-where-filter.model.d.ts.map +1 -1
  119. package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts +8 -15
  120. package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts.map +1 -1
  121. package/dist/cjs/data-source/models/where/where-filter-keys.model.d.ts +46 -0
  122. package/dist/cjs/data-source/models/where/where-filter-keys.model.d.ts.map +1 -0
  123. package/dist/cjs/data-source/models/where/where-filter-keys.model.js +36 -0
  124. package/dist/cjs/data-source/models/where/where-filter-keys.model.js.map +1 -0
  125. package/dist/cjs/data-source/models/where/where-filter.model.d.ts +2 -2
  126. package/dist/cjs/data-source/models/where/where-filter.model.d.ts.map +1 -1
  127. package/dist/cjs/data-source/query-failed.error.js +27 -1
  128. package/dist/cjs/data-source/query-failed.error.js.map +1 -1
  129. package/dist/cjs/data-source/repository.d.ts +8 -3
  130. package/dist/cjs/data-source/repository.d.ts.map +1 -1
  131. package/dist/cjs/data-source/repository.js +42 -16
  132. package/dist/cjs/data-source/repository.js.map +1 -1
  133. package/dist/cjs/di/decorators/inject-repository.decorator.d.ts +2 -2
  134. package/dist/cjs/di/decorators/inject-repository.decorator.d.ts.map +1 -1
  135. package/dist/cjs/di/decorators/inject-repository.decorator.js.map +1 -1
  136. package/dist/cjs/di/default/zibri-di-tokens.default.d.ts +2 -2
  137. package/dist/cjs/di/default/zibri-di-tokens.default.d.ts.map +1 -1
  138. package/dist/cjs/di/default/zibri-di-tokens.default.js.map +1 -1
  139. package/dist/cjs/email/email.service.d.ts +2 -2
  140. package/dist/cjs/email/email.service.d.ts.map +1 -1
  141. package/dist/cjs/email/email.service.js +4 -6
  142. package/dist/cjs/email/email.service.js.map +1 -1
  143. package/dist/cjs/email/models/email.model.js +1 -1
  144. package/dist/cjs/email/models/email.model.js.map +1 -1
  145. package/dist/cjs/entity/decorators/entity.decorator.d.ts +28 -1
  146. package/dist/cjs/entity/decorators/entity.decorator.d.ts.map +1 -1
  147. package/dist/cjs/entity/decorators/entity.decorator.js +6 -3
  148. package/dist/cjs/entity/decorators/entity.decorator.js.map +1 -1
  149. package/dist/cjs/entity/decorators/property.decorator.d.ts +5 -8
  150. package/dist/cjs/entity/decorators/property.decorator.d.ts.map +1 -1
  151. package/dist/cjs/entity/decorators/property.decorator.js +34 -20
  152. package/dist/cjs/entity/decorators/property.decorator.js.map +1 -1
  153. package/dist/cjs/entity/entity-metadata-missing.error.d.ts +9 -0
  154. package/dist/cjs/entity/entity-metadata-missing.error.d.ts.map +1 -0
  155. package/dist/cjs/entity/entity-metadata-missing.error.js +17 -0
  156. package/dist/cjs/entity/entity-metadata-missing.error.js.map +1 -0
  157. package/dist/cjs/entity/models/base-relation-metadata.model.d.ts +1 -1
  158. package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.d.ts +28 -0
  159. package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.d.ts.map +1 -0
  160. package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.js +3 -0
  161. package/dist/cjs/entity/models/belongs-to-one-property-metadata.model.js.map +1 -0
  162. package/dist/cjs/entity/models/has-one-property-metadata.model.d.ts +18 -0
  163. package/dist/cjs/entity/models/has-one-property-metadata.model.d.ts.map +1 -0
  164. package/dist/{esm/entity/models/one-to-one-property-metadata.model.js → cjs/entity/models/has-one-property-metadata.model.js} +1 -1
  165. package/dist/cjs/entity/models/has-one-property-metadata.model.js.map +1 -0
  166. package/dist/cjs/entity/models/many-to-many-property-metadata.model.d.ts +3 -3
  167. package/dist/cjs/entity/models/many-to-many-property-metadata.model.d.ts.map +1 -1
  168. package/dist/cjs/entity/models/many-to-one-property-metadata.model.d.ts +11 -1
  169. package/dist/cjs/entity/models/many-to-one-property-metadata.model.d.ts.map +1 -1
  170. package/dist/cjs/entity/models/relation.enum.d.ts +2 -1
  171. package/dist/cjs/entity/models/relation.enum.d.ts.map +1 -1
  172. package/dist/cjs/entity/models/relation.enum.js +2 -1
  173. package/dist/cjs/entity/models/relation.enum.js.map +1 -1
  174. package/dist/cjs/entity/partial-class.model.js +1 -1
  175. package/dist/cjs/entity/partial-class.model.js.map +1 -1
  176. package/dist/cjs/event/event-cleanup.cron-job.d.ts.map +1 -1
  177. package/dist/cjs/event/event-cleanup.cron-job.js +4 -6
  178. package/dist/cjs/event/event-cleanup.cron-job.js.map +1 -1
  179. package/dist/cjs/event/event-subscriber-run.model.d.ts +6 -8
  180. package/dist/cjs/event/event-subscriber-run.model.d.ts.map +1 -1
  181. package/dist/cjs/event/event-subscriber-run.model.js +10 -17
  182. package/dist/cjs/event/event-subscriber-run.model.js.map +1 -1
  183. package/dist/cjs/event/event.model.js +1 -1
  184. package/dist/cjs/event/event.model.js.map +1 -1
  185. package/dist/cjs/event/event.service.d.ts.map +1 -1
  186. package/dist/cjs/event/event.service.js +6 -3
  187. package/dist/cjs/event/event.service.js.map +1 -1
  188. package/dist/cjs/global/model-registry/default-descriptor.d.ts.map +1 -1
  189. package/dist/cjs/global/model-registry/default-descriptor.js +2 -1
  190. package/dist/cjs/global/model-registry/default-descriptor.js.map +1 -1
  191. package/dist/cjs/global/model-registry/encryption-descriptor.d.ts.map +1 -1
  192. package/dist/cjs/global/model-registry/encryption-descriptor.js +2 -1
  193. package/dist/cjs/global/model-registry/encryption-descriptor.js.map +1 -1
  194. package/dist/cjs/global/model-registry/exclude-descriptor.d.ts.map +1 -1
  195. package/dist/cjs/global/model-registry/exclude-descriptor.js +2 -1
  196. package/dist/cjs/global/model-registry/exclude-descriptor.js.map +1 -1
  197. package/dist/cjs/global/model-registry/hash-descriptor.d.ts.map +1 -1
  198. package/dist/cjs/global/model-registry/hash-descriptor.js +2 -1
  199. package/dist/cjs/global/model-registry/hash-descriptor.js.map +1 -1
  200. package/dist/cjs/index.d.ts +12 -3
  201. package/dist/cjs/index.d.ts.map +1 -1
  202. package/dist/cjs/index.js +12 -3
  203. package/dist/cjs/index.js.map +1 -1
  204. package/dist/cjs/logging/log-context.model.d.ts +2 -27
  205. package/dist/cjs/logging/log-context.model.d.ts.map +1 -1
  206. package/dist/cjs/logging/log-context.model.js +3 -49
  207. package/dist/cjs/logging/log-context.model.js.map +1 -1
  208. package/dist/cjs/open-api/open-api.service.d.ts.map +1 -1
  209. package/dist/cjs/open-api/open-api.service.js +20 -11
  210. package/dist/cjs/open-api/open-api.service.js.map +1 -1
  211. package/dist/cjs/parsing/form-data/form-data.body-parser.d.ts.map +1 -1
  212. package/dist/cjs/parsing/form-data/form-data.body-parser.js +2 -1
  213. package/dist/cjs/parsing/form-data/form-data.body-parser.js.map +1 -1
  214. package/dist/cjs/parsing/functions/parse-boolean.function.d.ts.map +1 -1
  215. package/dist/cjs/parsing/functions/parse-boolean.function.js.map +1 -1
  216. package/dist/cjs/parsing/functions/parse-object.function.d.ts.map +1 -1
  217. package/dist/cjs/parsing/functions/parse-object.function.js +2 -1
  218. package/dist/cjs/parsing/functions/parse-object.function.js.map +1 -1
  219. package/dist/cjs/parsing/parser.d.ts.map +1 -1
  220. package/dist/cjs/parsing/parser.js +2 -1
  221. package/dist/cjs/parsing/parser.js.map +1 -1
  222. package/dist/cjs/routing/decorators/body.decorator.js +2 -1
  223. package/dist/cjs/routing/decorators/body.decorator.js.map +1 -1
  224. package/dist/cjs/routing/resolve-route-params.function.js +1 -1
  225. package/dist/cjs/routing/resolve-route-params.function.js.map +1 -1
  226. package/dist/cjs/routing/router.d.ts.map +1 -1
  227. package/dist/cjs/routing/router.js +38 -2
  228. package/dist/cjs/routing/router.js.map +1 -1
  229. package/dist/cjs/utilities/metadata-injection-keys.enum.d.ts +1 -0
  230. package/dist/cjs/utilities/metadata-injection-keys.enum.d.ts.map +1 -1
  231. package/dist/cjs/utilities/metadata-injection-keys.enum.js +1 -0
  232. package/dist/cjs/utilities/metadata-injection-keys.enum.js.map +1 -1
  233. package/dist/cjs/utilities/typeorm.utilities.d.ts +39 -0
  234. package/dist/cjs/utilities/typeorm.utilities.d.ts.map +1 -0
  235. package/dist/cjs/utilities/typeorm.utilities.js +47 -0
  236. package/dist/cjs/utilities/typeorm.utilities.js.map +1 -0
  237. package/dist/cjs/validation/validation-problem.model.d.ts.map +1 -1
  238. package/dist/cjs/validation/validation-problem.model.js +4 -7
  239. package/dist/cjs/validation/validation-problem.model.js.map +1 -1
  240. package/dist/cjs/validation/validation.service.d.ts.map +1 -1
  241. package/dist/cjs/validation/validation.service.js +6 -4
  242. package/dist/cjs/validation/validation.service.js.map +1 -1
  243. package/dist/cjs/websocket/models/websocket-message.model.js +1 -1
  244. package/dist/cjs/websocket/models/websocket-message.model.js.map +1 -1
  245. package/dist/cjs/websocket/models/websocket-request.model.d.ts +5 -11
  246. package/dist/cjs/websocket/models/websocket-request.model.d.ts.map +1 -1
  247. package/dist/cjs/websocket/models/websocket-request.model.js.map +1 -1
  248. package/dist/cjs/websocket/services/websocket.service.d.ts.map +1 -1
  249. package/dist/cjs/websocket/services/websocket.service.js +1 -2
  250. package/dist/cjs/websocket/services/websocket.service.js.map +1 -1
  251. package/dist/esm/application.js +8 -2
  252. package/dist/esm/application.js.map +1 -1
  253. package/dist/esm/auth/encryption/encryption-key.model.js +9 -1
  254. package/dist/esm/auth/encryption/encryption-key.model.js.map +1 -1
  255. package/dist/esm/auth/strategies/cookie/cookie-auth.auth-strategy.js.map +1 -1
  256. package/dist/esm/auth/strategies/jwt/jwt-credentials.model.js +9 -1
  257. package/dist/esm/auth/strategies/jwt/jwt-credentials.model.js.map +1 -1
  258. package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js +2 -1
  259. package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
  260. package/dist/esm/backup/backup-resource-entity.model.js +9 -1
  261. package/dist/esm/backup/backup-resource-entity.model.js.map +1 -1
  262. package/dist/esm/backup/backup.service.js +2 -2
  263. package/dist/esm/backup/backup.service.js.map +1 -1
  264. package/dist/esm/caching/cache/base-cache.model.js.map +1 -1
  265. package/dist/esm/caching/cache/multi-tier.cache.js.map +1 -1
  266. package/dist/esm/caching/cache/read-aside/read-aside.cache.js.map +1 -1
  267. package/dist/esm/caching/cache/read-aside/write-around-read-aside.cache.js.map +1 -1
  268. package/dist/esm/caching/cache/read-aside/write-behind-read-aside.cache.js.map +1 -1
  269. package/dist/esm/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.js.map +1 -1
  270. package/dist/esm/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.js.map +1 -1
  271. package/dist/esm/caching/cache/read-aside/write-through-read-aside.cache.js.map +1 -1
  272. package/dist/esm/caching/cache/read-through/read-through.cache.js.map +1 -1
  273. package/dist/esm/caching/cache/read-through/write-around-read-through.cache.js.map +1 -1
  274. package/dist/esm/caching/cache/read-through/write-behind-read-through.cache.js.map +1 -1
  275. package/dist/esm/caching/cache/read-through/write-invalidate-read-through-args-only.cache.js.map +1 -1
  276. package/dist/esm/caching/cache/read-through/write-invalidate-read-through-with-result.cache.js.map +1 -1
  277. package/dist/esm/caching/cache/read-through/write-through-read-through.cache.js.map +1 -1
  278. package/dist/esm/change-sets/change-set-repository.js +16 -16
  279. package/dist/esm/change-sets/change-set-repository.js.map +1 -1
  280. package/dist/esm/change-sets/models/change-set-entity.model.js +29 -1
  281. package/dist/esm/change-sets/models/change-set-entity.model.js.map +1 -1
  282. package/dist/esm/change-sets/models/change-set.model.js +1 -1
  283. package/dist/esm/change-sets/models/change-set.model.js.map +1 -1
  284. package/dist/esm/change-sets/models/change.model.js +9 -1
  285. package/dist/esm/change-sets/models/change.model.js.map +1 -1
  286. package/dist/esm/change-sets/models/soft-delete-entity.model.js +26 -0
  287. package/dist/esm/change-sets/models/soft-delete-entity.model.js.map +1 -1
  288. package/dist/esm/change-sets/soft-delete-repository.js +22 -6
  289. package/dist/esm/change-sets/soft-delete-repository.js.map +1 -1
  290. package/dist/esm/context/als.utilities.js.map +1 -1
  291. package/dist/esm/context/cache/cache.context.js +61 -0
  292. package/dist/esm/context/cache/cache.context.js.map +1 -0
  293. package/dist/esm/data-source/data-sources/data-source-initialization.error.js +14 -0
  294. package/dist/esm/data-source/data-sources/data-source-initialization.error.js.map +1 -0
  295. package/dist/esm/data-source/data-sources/data-source.interface.js.map +1 -1
  296. package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js +289 -0
  297. package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -0
  298. package/dist/esm/data-source/data-sources/sql-data-source.interface.js +3 -0
  299. package/dist/esm/data-source/data-sources/sql-data-source.interface.js.map +1 -0
  300. package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js +378 -0
  301. package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -0
  302. package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +353 -0
  303. package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -0
  304. package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +248 -0
  305. package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -0
  306. package/dist/esm/data-source/models/where/where-filter-keys.model.js +36 -0
  307. package/dist/esm/data-source/models/where/where-filter-keys.model.js.map +1 -0
  308. package/dist/esm/data-source/query-failed.error.js +27 -1
  309. package/dist/esm/data-source/query-failed.error.js.map +1 -1
  310. package/dist/esm/data-source/repository.js +42 -16
  311. package/dist/esm/data-source/repository.js.map +1 -1
  312. package/dist/esm/di/decorators/inject-repository.decorator.js.map +1 -1
  313. package/dist/esm/di/default/zibri-di-tokens.default.js.map +1 -1
  314. package/dist/esm/email/email.service.js +4 -6
  315. package/dist/esm/email/email.service.js.map +1 -1
  316. package/dist/esm/email/models/email.model.js +1 -1
  317. package/dist/esm/email/models/email.model.js.map +1 -1
  318. package/dist/esm/entity/decorators/entity.decorator.js +6 -3
  319. package/dist/esm/entity/decorators/entity.decorator.js.map +1 -1
  320. package/dist/esm/entity/decorators/property.decorator.js +34 -20
  321. package/dist/esm/entity/decorators/property.decorator.js.map +1 -1
  322. package/dist/esm/entity/entity-metadata-missing.error.js +17 -0
  323. package/dist/esm/entity/entity-metadata-missing.error.js.map +1 -0
  324. package/dist/esm/entity/models/belongs-to-one-property-metadata.model.js +3 -0
  325. package/dist/esm/entity/models/belongs-to-one-property-metadata.model.js.map +1 -0
  326. package/dist/esm/entity/models/has-one-property-metadata.model.js +3 -0
  327. package/dist/esm/entity/models/has-one-property-metadata.model.js.map +1 -0
  328. package/dist/esm/entity/models/relation.enum.js +2 -1
  329. package/dist/esm/entity/models/relation.enum.js.map +1 -1
  330. package/dist/esm/entity/partial-class.model.js +1 -1
  331. package/dist/esm/entity/partial-class.model.js.map +1 -1
  332. package/dist/esm/event/event-cleanup.cron-job.js +4 -6
  333. package/dist/esm/event/event-cleanup.cron-job.js.map +1 -1
  334. package/dist/esm/event/event-subscriber-run.model.js +10 -17
  335. package/dist/esm/event/event-subscriber-run.model.js.map +1 -1
  336. package/dist/esm/event/event.model.js +1 -1
  337. package/dist/esm/event/event.model.js.map +1 -1
  338. package/dist/esm/event/event.service.js +6 -3
  339. package/dist/esm/event/event.service.js.map +1 -1
  340. package/dist/esm/global/model-registry/default-descriptor.js +2 -1
  341. package/dist/esm/global/model-registry/default-descriptor.js.map +1 -1
  342. package/dist/esm/global/model-registry/encryption-descriptor.js +2 -1
  343. package/dist/esm/global/model-registry/encryption-descriptor.js.map +1 -1
  344. package/dist/esm/global/model-registry/exclude-descriptor.js +2 -1
  345. package/dist/esm/global/model-registry/exclude-descriptor.js.map +1 -1
  346. package/dist/esm/global/model-registry/hash-descriptor.js +2 -1
  347. package/dist/esm/global/model-registry/hash-descriptor.js.map +1 -1
  348. package/dist/esm/index.js +12 -3
  349. package/dist/esm/index.js.map +1 -1
  350. package/dist/esm/logging/log-context.model.js +3 -49
  351. package/dist/esm/logging/log-context.model.js.map +1 -1
  352. package/dist/esm/open-api/open-api.service.js +20 -11
  353. package/dist/esm/open-api/open-api.service.js.map +1 -1
  354. package/dist/esm/parsing/form-data/form-data.body-parser.js +2 -1
  355. package/dist/esm/parsing/form-data/form-data.body-parser.js.map +1 -1
  356. package/dist/esm/parsing/functions/parse-boolean.function.js.map +1 -1
  357. package/dist/esm/parsing/functions/parse-object.function.js +2 -1
  358. package/dist/esm/parsing/functions/parse-object.function.js.map +1 -1
  359. package/dist/esm/parsing/parser.js +2 -1
  360. package/dist/esm/parsing/parser.js.map +1 -1
  361. package/dist/esm/routing/decorators/body.decorator.js +2 -1
  362. package/dist/esm/routing/decorators/body.decorator.js.map +1 -1
  363. package/dist/esm/routing/resolve-route-params.function.js +1 -1
  364. package/dist/esm/routing/resolve-route-params.function.js.map +1 -1
  365. package/dist/esm/routing/router.js +38 -2
  366. package/dist/esm/routing/router.js.map +1 -1
  367. package/dist/esm/utilities/metadata-injection-keys.enum.js +1 -0
  368. package/dist/esm/utilities/metadata-injection-keys.enum.js.map +1 -1
  369. package/dist/esm/utilities/typeorm.utilities.js +47 -0
  370. package/dist/esm/utilities/typeorm.utilities.js.map +1 -0
  371. package/dist/esm/validation/validation-problem.model.js +4 -7
  372. package/dist/esm/validation/validation-problem.model.js.map +1 -1
  373. package/dist/esm/validation/validation.service.js +6 -4
  374. package/dist/esm/validation/validation.service.js.map +1 -1
  375. package/dist/esm/websocket/models/websocket-message.model.js +1 -1
  376. package/dist/esm/websocket/models/websocket-message.model.js.map +1 -1
  377. package/dist/esm/websocket/models/websocket-request.model.js.map +1 -1
  378. package/dist/esm/websocket/services/websocket.service.js +1 -2
  379. package/dist/esm/websocket/services/websocket.service.js.map +1 -1
  380. package/package.json +9 -9
  381. package/src/__testing__/mocks/entities/child.entity.ts +4 -1
  382. package/src/__testing__/mocks/entities/company.entity.ts +5 -2
  383. package/src/__testing__/mocks/entities/profile.entity.ts +5 -2
  384. package/src/__testing__/mocks/entities/role.entity.ts +1 -1
  385. package/src/__testing__/mocks/entities/user.entity.ts +1 -1
  386. package/src/__testing__/test-server/create-test-data-source.function.ts +5 -5
  387. package/src/__testing__/test-server/start-test-server.function.ts +8 -6
  388. package/src/__testing__/test-server/user-repository.ts +4 -3
  389. package/src/application.ts +8 -2
  390. package/src/auth/2fa/two-factor.service.test.ts +151 -0
  391. package/src/auth/auth.service.test.ts +381 -0
  392. package/src/auth/encryption/encryption-key.model.ts +7 -2
  393. package/src/auth/strategies/cookie/cookie-auth.auth-strategy.ts +3 -2
  394. package/src/auth/strategies/jwt/jwt-credentials.model.ts +7 -1
  395. package/src/auth/strategies/jwt/jwt.auth-strategy.ts +5 -3
  396. package/src/backup/backup-resource-entity.model.ts +7 -2
  397. package/src/backup/backup-service.test.ts +1 -1
  398. package/src/backup/backup.service.ts +1 -1
  399. package/src/caching/cache/base-cache.model.ts +3 -3
  400. package/src/caching/cache/multi-tier.cache.ts +3 -3
  401. package/src/caching/cache/read-aside/read-aside.cache.ts +2 -2
  402. package/src/caching/cache/read-aside/write-around-read-aside.cache.ts +2 -2
  403. package/src/caching/cache/read-aside/write-behind-read-aside.cache.ts +2 -2
  404. package/src/caching/cache/read-aside/write-invalidate-read-aside-args-only.cache.ts +2 -2
  405. package/src/caching/cache/read-aside/write-invalidate-read-aside-with-result.cache.ts +2 -2
  406. package/src/caching/cache/read-aside/write-through-read-aside.cache.ts +2 -2
  407. package/src/caching/cache/read-through/read-through.cache.ts +2 -2
  408. package/src/caching/cache/read-through/write-around-read-through.cache.ts +2 -2
  409. package/src/caching/cache/read-through/write-behind-read-through.cache.ts +2 -2
  410. package/src/caching/cache/read-through/write-invalidate-read-through-args-only.cache.ts +2 -2
  411. package/src/caching/cache/read-through/write-invalidate-read-through-with-result.cache.ts +2 -2
  412. package/src/caching/cache/read-through/write-through-read-through.cache.ts +2 -2
  413. package/src/change-sets/change-set-repository.test.ts +317 -0
  414. package/src/change-sets/change-set-repository.ts +17 -17
  415. package/src/change-sets/models/change-set-entity.model.ts +6 -4
  416. package/src/change-sets/models/change-set.model.ts +1 -1
  417. package/src/change-sets/models/change.model.ts +7 -2
  418. package/src/change-sets/models/soft-delete-entity.model.ts +5 -3
  419. package/src/change-sets/soft-delete-repository.test.ts +326 -0
  420. package/src/change-sets/soft-delete-repository.ts +29 -10
  421. package/src/context/als.utilities.ts +5 -5
  422. package/src/context/cache/cache.context.ts +33 -0
  423. package/src/cron/cron.test.ts +421 -0
  424. package/src/data-source/array-where-filter.test.ts +332 -0
  425. package/src/data-source/data-sources/data-source-initialization.error.ts +9 -0
  426. package/src/data-source/data-sources/data-source.interface.ts +14 -1
  427. package/src/data-source/data-sources/postgres-typeorm-data-source.model.ts +330 -0
  428. package/src/data-source/data-sources/sql-data-source.interface.ts +35 -0
  429. package/src/data-source/data-sources/typeorm-base-data-source.model.ts +544 -0
  430. package/src/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.ts +451 -0
  431. package/src/data-source/data-sources/where-converter/typeorm-where-filter.converter.ts +376 -0
  432. package/src/data-source/exclude-property.test.ts +4 -1
  433. package/src/data-source/hooks/hooks.test.ts +268 -0
  434. package/src/data-source/migration/migration.test.ts +4 -3
  435. package/src/data-source/models/options/count-options.model.ts +2 -7
  436. package/src/data-source/models/options/delete-all-options.model.ts +2 -4
  437. package/src/data-source/models/options/find-all-options.model.ts +2 -2
  438. package/src/data-source/models/options/find-by-id-options.model.ts +1 -6
  439. package/src/data-source/models/options/find-one-options.model.ts +2 -11
  440. package/src/data-source/models/options/update-all-options.model.ts +2 -5
  441. package/src/data-source/models/options/update-by-id-options.model.ts +2 -5
  442. package/src/data-source/models/where/array-where-filter.model.ts +147 -5
  443. package/src/data-source/models/where/base-where-filter.model.ts +19 -1
  444. package/src/data-source/models/where/boolean-where-filter.model.ts +7 -2
  445. package/src/data-source/models/where/date-where-filter.model.ts +9 -16
  446. package/src/data-source/models/where/number-where-filter.model.ts +9 -16
  447. package/src/data-source/models/where/object-where-filter.model.ts +66 -7
  448. package/src/data-source/models/where/string-where-filter.model.ts +9 -16
  449. package/src/data-source/models/where/where-filter-keys.model.ts +88 -0
  450. package/src/data-source/models/where/where-filter-to-find-options-where-function.test.ts +35 -13
  451. package/src/data-source/models/where/where-filter.model.ts +7 -4
  452. package/src/data-source/nested-where-filter.test.ts +344 -0
  453. package/src/data-source/query-failed.error.ts +38 -1
  454. package/src/data-source/repository-relation-pitfalls.test.ts +232 -0
  455. package/src/data-source/repository.test.ts +274 -37
  456. package/src/data-source/repository.ts +50 -16
  457. package/src/data-source/transaction/transaction.test.ts +1 -1
  458. package/src/data-source/where-filter.test.ts +479 -0
  459. package/src/di/decorators/inject-repository.decorator.ts +3 -2
  460. package/src/di/default/zibri-di-tokens.default.ts +2 -2
  461. package/src/email/email.service.test.ts +382 -0
  462. package/src/email/email.service.ts +4 -5
  463. package/src/email/models/email.model.ts +1 -1
  464. package/src/entity/decorators/entity.decorator.ts +44 -5
  465. package/src/entity/decorators/property.decorator.ts +54 -36
  466. package/src/entity/entity-metadata-missing.error.ts +15 -0
  467. package/src/entity/models/base-relation-metadata.model.ts +1 -1
  468. package/src/entity/models/belongs-to-one-property-metadata.model.ts +34 -0
  469. package/src/entity/models/has-one-property-metadata.model.ts +20 -0
  470. package/src/entity/models/many-to-many-property-metadata.model.ts +3 -3
  471. package/src/entity/models/many-to-one-property-metadata.model.ts +17 -3
  472. package/src/entity/models/relation.enum.ts +2 -1
  473. package/src/entity/partial-class.model.ts +1 -1
  474. package/src/event/event-cleanup.cron-job.ts +4 -6
  475. package/src/event/event-subscriber-run.model.ts +8 -9
  476. package/src/event/event.model.ts +1 -1
  477. package/src/event/event.service.ts +6 -3
  478. package/src/global/model-registry/default-descriptor.ts +2 -1
  479. package/src/global/model-registry/encryption-descriptor.ts +2 -1
  480. package/src/global/model-registry/exclude-descriptor.ts +2 -1
  481. package/src/global/model-registry/hash-descriptor.ts +2 -1
  482. package/src/index.ts +15 -3
  483. package/src/logging/log-context.model.ts +3 -34
  484. package/src/open-api/open-api.service.ts +32 -13
  485. package/src/parsing/form-data/form-data.body-parser.ts +2 -1
  486. package/src/parsing/functions/parse-boolean.function.ts +0 -1
  487. package/src/parsing/functions/parse-object.function.ts +2 -1
  488. package/src/parsing/parser.ts +2 -1
  489. package/src/routing/decorators/body.decorator.ts +2 -1
  490. package/src/routing/resolve-route-params.function.ts +1 -1
  491. package/src/routing/router.ts +41 -7
  492. package/src/utilities/metadata-injection-keys.enum.ts +1 -0
  493. package/src/utilities/typeorm.utilities.ts +75 -0
  494. package/src/validation/validation-problem.model.ts +7 -9
  495. package/src/validation/validation.service.ts +6 -4
  496. package/src/websocket/models/websocket-message.model.ts +1 -1
  497. package/src/websocket/models/websocket-request.model.ts +17 -9
  498. package/src/websocket/services/websocket.service.ts +1 -2
  499. package/dist/cjs/data-source/data-sources/postgres-data-source.model.d.ts +0 -129
  500. package/dist/cjs/data-source/data-sources/postgres-data-source.model.d.ts.map +0 -1
  501. package/dist/cjs/data-source/data-sources/postgres-data-source.model.js +0 -534
  502. package/dist/cjs/data-source/data-sources/postgres-data-source.model.js.map +0 -1
  503. package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.d.ts +0 -11
  504. package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.d.ts.map +0 -1
  505. package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.js +0 -229
  506. package/dist/cjs/data-source/models/where/where-filter-to-find-options-where.function.js.map +0 -1
  507. package/dist/cjs/entity/models/one-to-one-property-metadata.model.d.ts +0 -30
  508. package/dist/cjs/entity/models/one-to-one-property-metadata.model.d.ts.map +0 -1
  509. package/dist/cjs/entity/models/one-to-one-property-metadata.model.js.map +0 -1
  510. package/dist/esm/data-source/data-sources/postgres-data-source.model.js +0 -534
  511. package/dist/esm/data-source/data-sources/postgres-data-source.model.js.map +0 -1
  512. package/dist/esm/data-source/models/where/where-filter-to-find-options-where.function.js +0 -229
  513. package/dist/esm/data-source/models/where/where-filter-to-find-options-where.function.js.map +0 -1
  514. package/dist/esm/entity/models/one-to-one-property-metadata.model.js.map +0 -1
  515. package/src/data-source/data-sources/postgres-data-source.model.ts +0 -675
  516. package/src/data-source/models/where/where-filter-to-find-options-where.function.ts +0 -307
  517. package/src/entity/models/one-to-one-property-metadata.model.ts +0 -35
@@ -1,60 +1,297 @@
1
- import { beforeAll, afterAll, describe, it, expect } from '@jest/globals';
1
+ import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
2
+ import { type Relation } from 'typeorm';
2
3
 
3
4
  import { Repository } from './repository';
4
5
  import { createTestDataSource, defaultTestServerEntities } from '../__testing__/test-server/create-test-data-source.function';
5
- import { StartedTestServer, startTestServer } from '../__testing__/test-server/start-test-server.function';
6
+ import { startTestServer, StartedTestServer } from '../__testing__/test-server/start-test-server.function';
6
7
  import { repositoryTokenFor } from '../di/decorators/inject-repository.decorator';
7
8
  import { inject } from '../di/inject.function';
8
9
  import { BaseEntity } from '../entity/base-entity.model';
9
10
  import { Entity } from '../entity/decorators/entity.decorator';
10
11
  import { Property } from '../entity/decorators/property.decorator';
11
- import { OmitStrict } from '../types/omit-strict.type';
12
+
13
+ // ==================== ENTITIES ====================
14
+
15
+ @Entity()
16
+ class Company extends BaseEntity {
17
+ @Property.string()
18
+ name!: string;
19
+
20
+ @Property.oneToMany({ target: () => User, inverseSide: 'company' })
21
+ employees!: User[];
22
+ }
23
+
24
+ @Entity()
25
+ class Profile extends BaseEntity {
26
+ @Property.string()
27
+ bio!: string;
28
+
29
+ @Property.hasOne({ target: () => User, inverseSide: 'profile' })
30
+ user!: Relation<User>;
31
+ }
12
32
 
13
33
  @Entity()
14
- class VisitStats extends BaseEntity {
15
- @Property.number()
16
- count!: number;
34
+ class Tag extends BaseEntity {
35
+ @Property.string()
36
+ name!: string;
17
37
 
18
- @Property.number()
19
- countFirstVisit!: number;
38
+ @Property.manyToMany({ target: () => Post, inverseSide: 'tags', joinTable: false })
39
+ posts!: Post[];
40
+ }
20
41
 
42
+ @Entity()
43
+ class Group extends BaseEntity {
21
44
  @Property.string()
22
- targetSite!: string;
45
+ name!: string;
23
46
 
24
- @Property.string({ required: false })
25
- referrer: string | undefined;
47
+ @Property.manyToMany({ target: () => User, inverseSide: 'groups', joinTable: false })
48
+ members!: User[];
49
+ }
26
50
 
51
+ @Entity()
52
+ class Post extends BaseEntity {
27
53
  @Property.string()
28
- domain!: string;
54
+ title!: string;
55
+
56
+ @Property.manyToOne({ target: () => User, inverseSide: 'posts', joinColumn: 'userId' })
57
+ author!: Relation<User>;
58
+
59
+ @Property.oneToMany({ target: () => Comment, inverseSide: 'post' })
60
+ comments!: Relation<Comment>;
61
+
62
+ @Property.string({ format: 'uuid' })
63
+ userId!: string;
64
+
65
+ @Property.manyToMany({ target: () => Tag, inverseSide: 'posts', joinTable: true })
66
+ tags!: Tag[];
67
+ }
68
+
69
+ @Entity()
70
+ class Comment extends BaseEntity {
71
+ @Property.string()
72
+ text!: string;
73
+
74
+ @Property.manyToOne({ target: () => Post, inverseSide: 'comments', joinColumn: 'postId' })
75
+ post!: Post;
76
+
77
+ @Property.string({ format: 'uuid' })
78
+ postId!: string;
79
+ }
80
+
81
+ @Entity()
82
+ class User extends BaseEntity {
83
+ @Property.string()
84
+ name!: string;
85
+
86
+ @Property.manyToOne({ target: () => Company, inverseSide: 'employees', joinColumn: 'companyId' })
87
+ company!: Company;
88
+
89
+ @Property.string({ format: 'uuid', required: false })
90
+ companyId!: string;
91
+
92
+ @Property.oneToMany({ target: () => Post, inverseSide: 'author' })
93
+ posts!: Post[];
94
+
95
+ @Property.belongsToOne({ target: () => Profile, inverseSide: 'user', joinColumn: 'profileId' })
96
+ profile!: Profile;
97
+
98
+ @Property.string({ format: 'uuid', required: false })
99
+ profileId!: string;
29
100
 
30
- @Property.date()
31
- date!: Date;
101
+ @Property.manyToMany({ target: () => Group, inverseSide: 'members', joinTable: true })
102
+ groups!: Group[];
32
103
  }
33
104
 
34
- describe('repository', () => {
35
- let server: StartedTestServer;
105
+ // ==================== TEST SUITE ====================
36
106
 
37
- beforeAll(async () => {
38
- server = await startTestServer({
39
- dataSources: [createTestDataSource({ entities: [...defaultTestServerEntities, VisitStats] })]
107
+ let server: StartedTestServer;
108
+ let userRepo: Repository<User>;
109
+ let companyRepo: Repository<Company>;
110
+ let profileRepo: Repository<Profile>;
111
+ let postRepo: Repository<Post>;
112
+ let tagRepo: Repository<Tag>;
113
+ let groupRepo: Repository<Group>;
114
+ let commentRepo: Repository<Comment>;
115
+
116
+ beforeAll(async () => {
117
+ server = await startTestServer({
118
+ dataSources: [createTestDataSource({ entities: [...defaultTestServerEntities, Company, Profile, Tag, Group, Post, Comment, User] })]
119
+ });
120
+ userRepo = inject(repositoryTokenFor(User));
121
+ companyRepo = inject(repositoryTokenFor(Company));
122
+ profileRepo = inject(repositoryTokenFor(Profile));
123
+ postRepo = inject(repositoryTokenFor(Post));
124
+ tagRepo = inject(repositoryTokenFor(Tag));
125
+ groupRepo = inject(repositoryTokenFor(Group));
126
+ commentRepo = inject(repositoryTokenFor(Comment));
127
+ }, 15000);
128
+
129
+ afterAll(async () => {
130
+ await server.shutdown();
131
+ });
132
+
133
+ beforeEach(async () => {
134
+ // Clean all data in reverse dependency order
135
+ await commentRepo.deleteAll({});
136
+ await postRepo.deleteAll({});
137
+ await tagRepo.deleteAll({});
138
+ await userRepo.deleteAll({});
139
+ await groupRepo.deleteAll({});
140
+ await profileRepo.deleteAll({});
141
+ await companyRepo.deleteAll({});
142
+ });
143
+
144
+ // ==================== TESTS ====================
145
+
146
+ describe('Repository – create with relations', () => {
147
+ it('create with many-to-one (company)', async () => {
148
+ const company: Company = await companyRepo.create({ name: 'Acme' });
149
+ const user: User = await userRepo.create({
150
+ name: 'Alice',
151
+ company: company,
152
+ companyId: company.id
40
153
  });
41
- }, 15000);
42
-
43
- afterAll(async () => {
44
- await server?.shutdown();
45
- });
46
-
47
- it('create', async () => {
48
- const repo: Repository<VisitStats> = inject(repositoryTokenFor(VisitStats));
49
- const visitStats: OmitStrict<VisitStats, 'id'> = {
50
- count: 1,
51
- countFirstVisit: 0,
52
- targetSite: '/test',
53
- referrer: 'google.de',
54
- date: new Date(),
55
- domain: 'localhost'
56
- };
57
- await repo.create(visitStats);
58
- expect((await repo.findAll()).length).toBe(1);
154
+ const fetched: User = await userRepo.findById(user.id);
155
+ expect(fetched.companyId).toBe(company.id);
156
+ });
157
+
158
+ it('create with one-to-many (posts)', async () => {
159
+ const user: User = await userRepo.create({ name: 'Bob' });
160
+ await postRepo.create({ title: 'Post 1', author: user, userId: user.id });
161
+ await postRepo.create({ title: 'Post 2', author: user, userId: user.id });
162
+ const fetchedUser: User = await userRepo.findById(user.id, { relations: ['posts'] });
163
+ expect(fetchedUser.posts).toHaveLength(2);
164
+ });
165
+
166
+ it('create with many-to-many (tags on post)', async () => {
167
+ const user: User = await userRepo.create({ name: 'Carol' });
168
+ const tag1: Tag = await tagRepo.create({ name: 'tech' });
169
+ const tag2: Tag = await tagRepo.create({ name: 'news' });
170
+ const post: Post = await postRepo.create({
171
+ title: 'Article',
172
+ author: user,
173
+ userId: user.id,
174
+ tags: [tag1, tag2] // many-to-many via relation array
175
+ });
176
+ const fetchedPost: Post = await postRepo.findById(post.id, { relations: ['tags'] });
177
+ expect(fetchedPost.tags).toHaveLength(2);
178
+ });
179
+
180
+ it('create with has-one (profile)', async () => {
181
+ const profile: Profile = await profileRepo.create({ bio: 'Hello' });
182
+ const user: User = await userRepo.create({
183
+ name: 'Dan',
184
+ profile: profile,
185
+ profileId: profile.id
186
+ });
187
+ const fetched: User = await userRepo.findById(user.id, { relations: ['profile'] });
188
+ expect(fetched.profile).toBeDefined();
189
+ expect(fetched.profile.bio).toBe('Hello');
190
+ });
191
+
192
+ it('create with nested relations', async () => {
193
+ // User -> Post -> Comment
194
+ const user: User = await userRepo.create({ name: 'Eve' });
195
+ const post: Post = await postRepo.create({ title: 'Nested', author: user, userId: user.id });
196
+ const comment: Comment = await commentRepo.create({ text: 'Nice!', post: post, postId: post.id });
197
+ const fetchedComment: Comment = await commentRepo.findById(comment.id, { relations: { post: { author: true } } });
198
+ expect(fetchedComment.post).toBeDefined();
199
+ expect(fetchedComment.post.author).toBeDefined();
200
+ });
201
+ });
202
+
203
+ describe('Repository – update relations', () => {
204
+ it('updateById – change many-to-one', async () => {
205
+ const company1: Company = await companyRepo.create({ name: 'A' });
206
+ const company2: Company = await companyRepo.create({ name: 'B' });
207
+ const user: User = await userRepo.create({ name: 'Frank', company: company1, companyId: company1.id });
208
+ await userRepo.updateById(user.id, { company: company2, companyId: company2.id });
209
+ const updated: User = await userRepo.findById(user.id);
210
+ expect(updated.companyId).toBe(company2.id);
211
+ });
212
+
213
+ it('updateById – modify many-to-many array', async () => {
214
+ const user: User = await userRepo.create({ name: 'Grace' });
215
+ const group1: Group = await groupRepo.create({ name: 'Admin' });
216
+ const group2: Group = await groupRepo.create({ name: 'Editor' });
217
+ // Set initial groups via create (known working path)
218
+ await userRepo.updateById(user.id, { groups: [group1] });
219
+ // Now update to add group2
220
+ await userRepo.updateById(user.id, { groups: [group1, group2] });
221
+ const fetched: User = await userRepo.findById(user.id, { relations: ['groups'] });
222
+ expect(fetched.groups).toHaveLength(2);
223
+ });
224
+
225
+ it('updateAll – change many-to-one for multiple entities', async () => {
226
+ const companyA: Company = await companyRepo.create({ name: 'Alpha' });
227
+ const companyB: Company = await companyRepo.create({ name: 'Beta' });
228
+ await userRepo.create({ name: 'User1', company: companyA, companyId: companyA.id });
229
+ await userRepo.create({ name: 'User2', company: companyA, companyId: companyA.id });
230
+ await userRepo.updateAll({ companyId: companyA.id }, { company: companyB, companyId: companyB.id });
231
+ const users: User[] = await userRepo.findAll({ where: { companyId: companyB.id } });
232
+ expect(users).toHaveLength(2);
233
+ });
234
+
235
+ it('updateAll – modify many-to-many arrays', async () => {
236
+ const group: Group = await groupRepo.create({ name: 'Everyone' });
237
+ const user1: User = await userRepo.create({ name: 'Huey' });
238
+ const user2: User = await userRepo.create({ name: 'Dewey' });
239
+ await userRepo.updateAll({ id: user1.id }, { groups: [group] });
240
+ await userRepo.updateAll({ id: user2.id }, { groups: [group] });
241
+ const fetched: User[] = await userRepo.findAll({ where: { groups: { includes: [group] } } });
242
+ expect(fetched).toHaveLength(2);
243
+ });
244
+ });
245
+
246
+ describe('Repository – delete with relations', () => {
247
+ it('deleteById – with cascade on one-to-many', async () => {
248
+ const user: User = await userRepo.create({ name: 'Ivy' });
249
+ const post: Post = await postRepo.create({ title: 'To be deleted', author: user, userId: user.id });
250
+ // Deleting post should not delete user, but we'll check cascade configuration later
251
+ await postRepo.deleteById(post.id);
252
+ const found: Post | undefined = await postRepo.findOne({ where: { id: post.id } }, false);
253
+ expect(found).toBeUndefined();
254
+ const userStill: User = await userRepo.findById(user.id);
255
+ expect(userStill).toBeDefined();
256
+ });
257
+
258
+ it('deleteAll – many-to-many relations are detached, not deleted', async () => {
259
+ const group: Group = await groupRepo.create({ name: 'Temp' });
260
+ const user: User = await userRepo.create({ name: 'Jack', groups: [group] });
261
+ await userRepo.deleteAll({ id: user.id });
262
+ const foundUser: User | undefined = await userRepo.findOne({ where: { id: user.id } }, false);
263
+ expect(foundUser).toBeUndefined();
264
+ const foundGroup: Group = await groupRepo.findById(group.id);
265
+ expect(foundGroup).toBeDefined(); // group not deleted
266
+ });
267
+ });
268
+
269
+ describe('Repository – querying relations', () => {
270
+ it('findById with nested relations', async () => {
271
+ const user: User = await userRepo.create({ name: 'Kate' });
272
+ const post: Post = await postRepo.create({ title: 'Post', author: user, userId: user.id });
273
+ const comment: Comment = await commentRepo.create({ text: 'Yep', post: post, postId: post.id });
274
+ const fetched: Comment = await commentRepo.findById(comment.id, { relations: { post: { author: true } } });
275
+ expect(fetched.post.title).toBe('Post');
276
+ expect(fetched.post.author.name).toBe('Kate');
277
+ });
278
+
279
+ it('findAll with where filter on relation property', async () => {
280
+ const company: Company = await companyRepo.create({ name: 'Target' });
281
+ const user: User = await userRepo.create({ name: 'Liam', company: company, companyId: company.id });
282
+ const results: User[] = await userRepo.findAll({ where: { company: { where: { name: 'Target' } } } });
283
+ expect(results.map(u => u.id)).toEqual([user.id]);
284
+ });
285
+ });
286
+
287
+ describe('Repository – combined operations', () => {
288
+ it('createAll with multiple entities and relations', async () => {
289
+ const company: Company = await companyRepo.create({ name: 'MultiCorp' });
290
+ const users: User[] = await userRepo.createAll([
291
+ { name: 'Moe', company: company, companyId: company.id },
292
+ { name: 'Larry', company: company, companyId: company.id },
293
+ { name: 'Curly', company: company, companyId: company.id }
294
+ ]);
295
+ expect(users).toHaveLength(3);
59
296
  });
60
297
  });
@@ -1,4 +1,4 @@
1
- import { Repository as TORepository, FindOptionsWhere, EntityManager, QueryFailedError as TOQueryFailedError, DeepPartial as ToDeepPartial } from 'typeorm';
1
+ import { Repository as TORepository, FindOptionsWhere, EntityManager, QueryFailedError as TOQueryFailedError, DeepPartial as ToDeepPartial, FindOptionsOrder, FindOptionsRelations } from 'typeorm';
2
2
 
3
3
  import { BaseEntity } from '../entity/base-entity.model';
4
4
  import { LoggerInterface } from '../logging/logger.interface';
@@ -18,12 +18,16 @@ import { FindByIdOptions } from './models/options/find-by-id-options.model';
18
18
  import { FindOneOptions } from './models/options/find-one-options.model';
19
19
  import { UpdateAllOptions } from './models/options/update-all-options.model';
20
20
  import { UpdateByIdOptions } from './models/options/update-by-id-options.model';
21
- import { whereFilterToFindOptionsWhere } from './models/where/where-filter-to-find-options-where.function';
22
21
  import { Where } from './models/where/where-filter.model';
23
22
  import { QueryFailedError } from './query-failed.error';
24
23
  import { Transaction } from './transaction/transaction.model';
24
+ import { EntityMetadata } from '../entity/decorators/entity.decorator';
25
25
  import { NotFoundError } from '../error-handling/errors/not-found.error';
26
26
  import { ModelRegistry } from '../global/model-registry/model.registry';
27
+ import { MetadataUtilities } from '../utilities/metadata.utilities';
28
+ import { type TypeOrmBaseDataSource } from './data-sources/typeorm-base-data-source.model';
29
+ import { DataSourceOptions } from './models/data-source-options.model';
30
+ import { EntityMetadataMissingError } from '../entity/entity-metadata-missing.error';
27
31
 
28
32
  /**
29
33
  * A repository that handles data source related things for its entity.
@@ -35,6 +39,13 @@ export class Repository<
35
39
  > {
36
40
  private readonly typeOrmRepository: TORepository<T>;
37
41
 
42
+ private readonly _dataSource: TypeOrmBaseDataSource<DataSourceOptions>;
43
+
44
+ /**
45
+ * The metadata of entity that this repository manages.
46
+ */
47
+ protected readonly entityMetadata: EntityMetadata;
48
+
38
49
  // eslint-disable-next-line jsdoc/require-returns
39
50
  /**
40
51
  * The data source that this repository is connected to.
@@ -47,12 +58,21 @@ export class Repository<
47
58
  protected readonly entityClass: Newable<T>,
48
59
  repo: TORepository<T> | Repository<T>,
49
60
  protected readonly logger: LoggerInterface,
50
- private readonly _dataSource: DataSourceInterface,
61
+ dataSource: DataSourceInterface,
51
62
  private readonly beforeSave: BeforeSaveHook<T, CreateData, UpdateData>,
52
63
  private readonly beforeReturn: BeforeReturnHook<T>
53
64
  ) {
54
65
  this.typeOrmRepository = repo instanceof Repository ? repo.typeOrmRepository : repo;
55
66
  ModelRegistry.get(this.entityClass);
67
+ const metadata: EntityMetadata | undefined = MetadataUtilities.getEntityMetadata(this.entityClass);
68
+ if (!metadata) {
69
+ throw new EntityMetadataMissingError(this.entityClass);
70
+ }
71
+ if (!('whereFilterToFindOptionsWhere' in dataSource)) {
72
+ throw new Error('Zibri\'s default repositories only work with TypeOrmBaseDataSource');
73
+ }
74
+ this._dataSource = dataSource as TypeOrmBaseDataSource<DataSourceOptions>;
75
+ this.entityMetadata = metadata;
56
76
  }
57
77
 
58
78
  private getManager(transaction: Transaction | undefined): EntityManager {
@@ -63,7 +83,7 @@ export class Repository<
63
83
  if (!where) {
64
84
  return undefined;
65
85
  }
66
- return whereFilterToFindOptionsWhere(where, this.entityClass);
86
+ return this._dataSource.whereFilterToFindOptionsWhere(where, this.entityClass);
67
87
  }
68
88
 
69
89
  /**
@@ -156,13 +176,21 @@ export class Repository<
156
176
  required: B = true as B
157
177
  ): Promise<B extends false ? T | undefined : T> {
158
178
  const where: FindOptionsWhere<T> | FindOptionsWhere<T>[] | undefined = this.resolveFindOptionsWhere(options.where);
179
+ // eslint-disable-next-line typescript/no-explicit-any
180
+ const relations: (keyof T)[] | FindOptionsRelations<any> | undefined = options.relations ?? this.entityMetadata.defaultRelations;
159
181
 
160
182
  const manager: EntityManager = this.getManager(options?.transaction);
161
183
  let res: T | null;
162
184
  try {
163
185
  res = await manager.findOne(
164
186
  this.entityClass,
165
- { ...options, relations: options.relations as string[], where, transaction: undefined }
187
+ {
188
+ order: this.entityMetadata.defaultOrder as FindOptionsOrder<T> | undefined,
189
+ ...options,
190
+ relations: relations as FindOptionsRelations<T> | string[] | undefined,
191
+ where,
192
+ transaction: undefined
193
+ }
166
194
  );
167
195
  }
168
196
  catch (error) {
@@ -189,10 +217,19 @@ export class Repository<
189
217
  async findAll(options?: FindAllOptions<T>): Promise<T[]> {
190
218
  const manager: EntityManager = this.getManager(options?.transaction);
191
219
  const where: FindOptionsWhere<T> | FindOptionsWhere<T>[] | undefined = this.resolveFindOptionsWhere(options?.where);
220
+ // eslint-disable-next-line typescript/no-explicit-any
221
+ const relations: (keyof T)[] | FindOptionsRelations<any> | undefined = options?.relations ?? this.entityMetadata.defaultRelations;
222
+
192
223
  try {
193
224
  const res: T[] = await manager.find(
194
225
  this.entityClass,
195
- { ...options, where, relations: options?.relations as string[], transaction: undefined }
226
+ {
227
+ order: this.entityMetadata.defaultOrder as FindOptionsOrder<T> | undefined,
228
+ ...options,
229
+ where,
230
+ relations: relations as FindOptionsRelations<T> | string[] | undefined,
231
+ transaction: undefined
232
+ }
196
233
  );
197
234
  await Promise.all(res.map(r => this.beforeReturn(r, this.entityClass)));
198
235
  return res;
@@ -244,18 +281,16 @@ export class Repository<
244
281
  * @returns The updated entity.
245
282
  */
246
283
  async updateById(id: T['id'], data: UpdateData, options?: UpdateByIdOptions): Promise<T> {
247
- if (data.id != undefined && options?.allowId != true) {
284
+ if (data.id != undefined) {
248
285
  await this.logger.warn('Found an id on the update data, it will be ignored.');
249
- delete data.id;
250
286
  }
251
287
  const manager: EntityManager = this.getManager(options?.transaction);
252
288
  data.id = id;
253
289
  await this.beforeSave(data, false, this.entityClass);
254
290
 
255
291
  try {
256
- const res: T = await manager.save(this.entityClass, data as ToDeepPartial<T>);
257
- await this.beforeReturn(res, this.entityClass);
258
- return res;
292
+ await manager.save(this.entityClass, data as ToDeepPartial<T>, { reload: false });
293
+ return await this.findById(id, options);
259
294
  }
260
295
  catch (error) {
261
296
  if (error instanceof TOQueryFailedError) {
@@ -277,7 +312,7 @@ export class Repository<
277
312
  data: UpdateData,
278
313
  options?: UpdateAllOptions
279
314
  ): Promise<T[]> {
280
- if (data.id != undefined && options?.allowId != true) {
315
+ if (data.id != undefined) {
281
316
  await this.logger.warn('Found an id on the update data, it will be ignored.');
282
317
  delete data.id;
283
318
  }
@@ -287,9 +322,8 @@ export class Repository<
287
322
  const manager: EntityManager = this.getManager(options?.transaction);
288
323
 
289
324
  try {
290
- const res: T[] = await manager.save(this.entityClass, toUpdate as ToDeepPartial<T>[]);
291
- await Promise.all(res.map(r => this.beforeReturn(r, this.entityClass)));
292
- return res;
325
+ await manager.save(this.entityClass, toUpdate as ToDeepPartial<T>[]);
326
+ return await this.findAll({ where, ...options });
293
327
  }
294
328
  catch (error) {
295
329
  if (error instanceof TOQueryFailedError) {
@@ -330,7 +364,7 @@ export class Repository<
330
364
  */
331
365
  async deleteAll(
332
366
  where: Where<T>,
333
- options?: DeleteAllOptions<T>
367
+ options?: DeleteAllOptions
334
368
  ): Promise<T[]> {
335
369
  const toDelete: T[] = await this.findAll({ where, ...options });
336
370
  await Promise.all(toDelete.map(r => this.beforeSave(r, false, this.entityClass)));
@@ -10,7 +10,7 @@ import { Entity } from '../../entity/decorators/entity.decorator';
10
10
  import { Property } from '../../entity/decorators/property.decorator';
11
11
  import { Newable } from '../../types/newable.type';
12
12
  import { DataSourceInterface } from '../data-sources/data-source.interface';
13
- import { PostgresDataSource } from '../data-sources/postgres-data-source.model';
13
+ import { PostgresDataSource } from '../data-sources/postgres-typeorm-data-source.model';
14
14
 
15
15
  @Entity()
16
16
  class Item {