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
@@ -0,0 +1,544 @@
1
+ import { Readable } from 'node:stream';
2
+
3
+ import { EntitySchema, EntitySchemaColumnOptions, EntitySchemaRelationOptions, QueryRunner, Table, TableColumn, TableColumnOptions, DataSource as TODataSource, EntityMetadata as TOEntityMetadata, Repository as TORepository, FindOptionsWhere as ToFindOptionsWhere } from 'typeorm';
4
+ import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata.js';
5
+
6
+ import { DataSourceInitializationError } from './data-source-initialization.error';
7
+ import { DataSourceInterface, IsolationLevel, RepositoryTypeForEntity } from './data-source.interface';
8
+ import { TypeOrmWhereFilterConverter } from './where-converter/typeorm-where-filter.converter';
9
+ import { type AuthServiceInterface } from '../../auth/auth-service.interface';
10
+ import { ChangeSetRepository } from '../../change-sets/change-set-repository';
11
+ import { ChangeSetEntity, isChangeSetEntityNewable } from '../../change-sets/models/change-set-entity.model';
12
+ import { ChangeSet } from '../../change-sets/models/change-set.model';
13
+ import { isSoftDeleteEntityNewable, SoftDeleteEntity } from '../../change-sets/models/soft-delete-entity.model';
14
+ import { SoftDeleteRepository } from '../../change-sets/soft-delete-repository';
15
+ import { repositoryTokenFor } from '../../di/decorators/inject-repository.decorator';
16
+ import { Inject } from '../../di/decorators/inject.decorator';
17
+ import { ZIBRI_DI_TOKENS } from '../../di/default/zibri-di-tokens.default';
18
+ import { inject } from '../../di/inject.function';
19
+ import { register } from '../../di/register.function';
20
+ import { BaseEntity } from '../../entity/base-entity.model';
21
+ import { EntityMetadata } from '../../entity/decorators/entity.decorator';
22
+ import { PropertyMetadata, PropertyMetadataInput, RelationMetadata } from '../../entity/decorators/property.decorator';
23
+ import { EntityMetadataMissingError } from '../../entity/entity-metadata-missing.error';
24
+ import { FilePropertyMetadata } from '../../entity/models/file-property-metadata.model';
25
+ import { Relation } from '../../entity/models/relation.enum';
26
+ import { GlobalRegistry } from '../../global/global-registry';
27
+ import { type LoggerInterface } from '../../logging/logger.interface';
28
+ import { ExcludeStrict } from '../../types/exclude-strict.type';
29
+ import { Newable } from '../../types/newable.type';
30
+ import { OmitStrict } from '../../types/omit-strict.type';
31
+ import { Version } from '../../types/version.type';
32
+ import { compareVersion } from '../../utilities/compare-versions.function';
33
+ import { MetadataUtilities } from '../../utilities/metadata.utilities';
34
+ import { ObjectUtilities } from '../../utilities/object.utilities';
35
+ import { TypeOrmUtilities } from '../../utilities/typeorm.utilities';
36
+ import { getDefaultBeforeReturnHook, getDefaultBeforeSaveHook } from '../hooks/hooks.default';
37
+ import { MigrationEntity } from '../migration/migration-entity.model';
38
+ import { Migration } from '../migration/migration.model';
39
+ import { ColumnType } from '../models/column-type.model';
40
+ import { DataSourceOptions } from '../models/data-source-options.model';
41
+ import { Where, WhereFilter } from '../models/where/where-filter.model';
42
+ import { Repository } from '../repository';
43
+ import { Transaction } from '../transaction/transaction.model';
44
+ import { TypeOrmTransaction } from '../transaction/typeorm-transaction.model';
45
+
46
+ // eslint-disable-next-line jsdoc/require-jsdoc
47
+ export type MigrationWithName = { migration: Migration, name: string };
48
+
49
+ // eslint-disable-next-line jsdoc/require-jsdoc
50
+ export type ToColumnMappableTypes = ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>['type'];
51
+
52
+ /**
53
+ * Base data source implementation of zibri.
54
+ * Uses typeorm under the hood.
55
+ */
56
+ export abstract class TypeOrmBaseDataSource<TOptions extends DataSourceOptions> implements DataSourceInterface {
57
+ abstract readonly entities: Newable<BaseEntity>[];
58
+
59
+ /**
60
+ * The type of the data source.
61
+ */
62
+ protected abstract readonly type: TOptions['type'];
63
+
64
+ /**
65
+ * Converter responsible for transforming a Zibri WhereFilter into a TypeORM FindOptionsWhere.
66
+ */
67
+ protected abstract whereFilterConverter: TypeOrmWhereFilterConverter | undefined;
68
+
69
+ /**
70
+ * The configuration options of the data source.
71
+ */
72
+ readonly options: Partial<OmitStrict<TOptions, 'type' | 'entities'>> = {};
73
+
74
+ /**
75
+ * The default configuration options of the data source.
76
+ */
77
+ protected abstract readonly defaultOptions: OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'>;
78
+
79
+ // eslint-disable-next-line jsdoc/require-returns
80
+ /**
81
+ * Combination of the default and user provided options.
82
+ */
83
+ protected get fullOptions(): OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'> {
84
+ return {
85
+ ...this.defaultOptions,
86
+ ...this.options
87
+ };
88
+ }
89
+
90
+ // eslint-disable-next-line jsdoc/require-jsdoc
91
+ readonly migrations: Newable<Migration>[] = [];
92
+
93
+ /**
94
+ * The internal typeorm data source.
95
+ */
96
+ protected ds?: TODataSource;
97
+
98
+ /**
99
+ * Mapping from a Zibri property type to a typeorm column type.
100
+ */
101
+ protected readonly columnTypeMapping: Partial<Record<ToColumnMappableTypes, ColumnType>> = {};
102
+
103
+ /**
104
+ * Default mapping from a Zibri property type to a typeorm column type.
105
+ */
106
+ protected abstract readonly defaultColumnTypeMapping: Record<ToColumnMappableTypes, ColumnType>;
107
+
108
+ // eslint-disable-next-line jsdoc/require-returns
109
+ /**
110
+ * Combination of the default and user provided column type mapping.
111
+ */
112
+ protected get fullColumnTypeMapping(): Record<ToColumnMappableTypes, ColumnType> {
113
+ return {
114
+ ...this.defaultColumnTypeMapping,
115
+ ...this.columnTypeMapping
116
+ };
117
+ }
118
+
119
+ private readonly repositories: Map<Newable<BaseEntity>, Repository<BaseEntity>> = new Map();
120
+
121
+ constructor(
122
+ @Inject(ZIBRI_DI_TOKENS.LOGGER)
123
+ protected readonly logger: LoggerInterface,
124
+ @Inject(ZIBRI_DI_TOKENS.AUTH_SERVICE)
125
+ protected readonly authService: AuthServiceInterface
126
+ ) {}
127
+
128
+ abstract createBackupData(): Readable;
129
+ abstract restoreBackup(backupData: Readable): void | Promise<void>;
130
+
131
+ /**
132
+ * Transforms the given Zibri where filter to typeorm's FindOptionsWhere.
133
+ * @param filter - The filter to transform.
134
+ * @param entityClass - The entity class that the where filter is for.
135
+ * @returns TypeOrm's FindOptionsWhere.
136
+ * @throws When the data source hasn't been initialized yet.
137
+ */
138
+ whereFilterToFindOptionsWhere<T extends object>(
139
+ filter: Where<T>,
140
+ entityClass: Newable<T>
141
+ ): Where<T> extends WhereFilter<T>[] ? ToFindOptionsWhere<T>[] : ToFindOptionsWhere<T> {
142
+ if (!this.whereFilterConverter) {
143
+ throw new Error('The data source needs to be initialized before it can be used.');
144
+ }
145
+ return this.whereFilterConverter.convert(filter, entityClass) as Where<T> extends WhereFilter<T>[]
146
+ ? ToFindOptionsWhere<T>[]
147
+ : ToFindOptionsWhere<T>;
148
+ }
149
+
150
+ // eslint-disable-next-line jsdoc/require-jsdoc
151
+ async init(): Promise<void> {
152
+ if (this.ds) {
153
+ throw new Error('The data source has already been initialized.');
154
+ }
155
+
156
+ await this.validateOptions(this.fullOptions);
157
+
158
+ for (const entityClass of this.entities) {
159
+ register({
160
+ token: repositoryTokenFor(entityClass),
161
+ useFactory: () => this.getRepository(entityClass)
162
+ });
163
+ }
164
+
165
+ const schemas: EntitySchema[] = this.getEntitySchemas();
166
+ this.ds = new TODataSource({
167
+ ...this.fullOptions,
168
+ entities: schemas,
169
+ type: this.type,
170
+ synchronize: false
171
+ } as DataSourceOptions);
172
+ await this.ds.initialize();
173
+
174
+ this.beforeMigrations();
175
+
176
+ await this.runMigrations();
177
+
178
+ // Only skip if synchronize has been explicitly set to false
179
+ if (this.options.synchronize === false) {
180
+ return;
181
+ }
182
+
183
+ await this.ds.synchronize();
184
+ }
185
+
186
+ protected abstract beforeMigrations(): void;
187
+
188
+ // eslint-disable-next-line jsdoc/require-jsdoc
189
+ async shutDown(): Promise<void> {
190
+ await this.ds?.destroy();
191
+ }
192
+
193
+ // eslint-disable-next-line jsdoc/require-jsdoc
194
+ async startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction> {
195
+ if (!this.ds) {
196
+ throw new DataSourceInitializationError();
197
+ }
198
+
199
+ const runner: QueryRunner = this.createQueryRunner();
200
+ try {
201
+ await runner.connect();
202
+ await runner.startTransaction(isolationLevel);
203
+ return new TypeOrmTransaction(runner);
204
+ }
205
+ catch (error) {
206
+ await runner.release();
207
+ throw error;
208
+ }
209
+ }
210
+
211
+ // eslint-disable-next-line jsdoc/require-jsdoc
212
+ async runMigrations(): Promise<void> {
213
+ await this.createMigrationTableIfNotExists();
214
+
215
+ // we need to dynamically inject here because the repositories aren't ready in the constructor.
216
+ const migrationsRepository: Repository<MigrationEntity> = inject(repositoryTokenFor(MigrationEntity));
217
+ const finishedMigrationVersions: string[] = (await migrationsRepository.findAll()).map(m => m.version);
218
+ const allMigrations: MigrationWithName[] = this.migrations.map(m => ({ migration: inject(m), name: m.name }));
219
+
220
+ const appVersion: Version | undefined = GlobalRegistry.getAppData('version');
221
+ if (!appVersion) {
222
+ throw new Error('Couldn\'t run migrations: No app version could be resolved');
223
+ }
224
+
225
+ const migrationsToRunUp: MigrationWithName[] = allMigrations.filter(m => {
226
+ return !finishedMigrationVersions.includes(m.migration.version)
227
+ && compareVersion(m.migration.version, appVersion) !== 'bigger';
228
+ });
229
+
230
+ const migrationsToRunDown: MigrationWithName[] = allMigrations.filter(m => {
231
+ return finishedMigrationVersions.includes(m.migration.version)
232
+ && compareVersion(m.migration.version, appVersion) === 'bigger';
233
+ });
234
+
235
+ for (const migration of migrationsToRunUp) {
236
+ await this.logger.info(` > runs up migration ${migration.name}`);
237
+ await migration.migration.runUp();
238
+ }
239
+
240
+ for (const migration of migrationsToRunDown) {
241
+ await this.logger.info(` > runs down migration ${migration.name}`);
242
+ await migration.migration.runDown();
243
+ }
244
+
245
+ const skipped: number = allMigrations.length - migrationsToRunDown.length - migrationsToRunUp.length;
246
+ if (skipped) {
247
+ await this.logger.info(` > skipped ${skipped} migrations that have already been applied`);
248
+ }
249
+ }
250
+
251
+ /**
252
+ * Creates a query runner.
253
+ * @returns A query runner.
254
+ * @throws When the data source has not been initialized yet.
255
+ */
256
+ createQueryRunner(): QueryRunner {
257
+ if (!this.ds) {
258
+ throw new DataSourceInitializationError();
259
+ }
260
+ return this.ds.createQueryRunner();
261
+ }
262
+
263
+ // eslint-disable-next-line jsdoc/require-jsdoc
264
+ getRepository<T extends BaseEntity>(cls: Newable<T>): RepositoryTypeForEntity<T> {
265
+ if (!this.ds) {
266
+ throw new DataSourceInitializationError();
267
+ }
268
+ if (!this.entities.find(e => e === cls)) {
269
+ throw new Error(`The entity "${cls.name}" is not in this database. Did you forget to include it in the entities array?`);
270
+ }
271
+
272
+ // eslint-disable-next-line stylistic/max-len
273
+ const existingRepository: RepositoryTypeForEntity<T> | undefined = this.repositories.get(cls) as RepositoryTypeForEntity<T> | undefined;
274
+ if (existingRepository) {
275
+ return existingRepository;
276
+ }
277
+
278
+ const repo: TORepository<T> = this.ds.getRepository(cls);
279
+
280
+ if (isSoftDeleteEntityNewable(cls)) {
281
+ const res: RepositoryTypeForEntity<T> = new SoftDeleteRepository(
282
+ cls,
283
+ repo as unknown as TORepository<SoftDeleteEntity>,
284
+ this.logger,
285
+ this,
286
+ getDefaultBeforeSaveHook(),
287
+ getDefaultBeforeReturnHook(),
288
+ this.authService,
289
+ this.getRepository(ChangeSet)
290
+ ) as RepositoryTypeForEntity<T>;
291
+ this.repositories.set(cls, res as Repository<BaseEntity>);
292
+ return res;
293
+ }
294
+ if (isChangeSetEntityNewable(cls)) {
295
+ const res: RepositoryTypeForEntity<T> = new ChangeSetRepository(
296
+ cls,
297
+ repo as unknown as TORepository<ChangeSetEntity>,
298
+ this.logger,
299
+ this,
300
+ getDefaultBeforeSaveHook(),
301
+ getDefaultBeforeReturnHook(),
302
+ this.authService,
303
+ this.getRepository(ChangeSet)
304
+ ) as RepositoryTypeForEntity<T>;
305
+ this.repositories.set(cls, res as Repository<BaseEntity>);
306
+ return res;
307
+ }
308
+ const res: RepositoryTypeForEntity<T> = new Repository<T>(
309
+ cls,
310
+ repo,
311
+ this.logger,
312
+ this,
313
+ getDefaultBeforeSaveHook(),
314
+ getDefaultBeforeReturnHook()
315
+ ) as RepositoryTypeForEntity<T>;
316
+ this.repositories.set(cls, res as Repository<BaseEntity>);
317
+ return res;
318
+ }
319
+
320
+ // eslint-disable-next-line jsdoc/require-jsdoc
321
+ async addPropertyToEntity<T extends BaseEntity>(
322
+ entity: Newable<T>,
323
+ key: keyof T,
324
+ transaction: Transaction
325
+ ): Promise<void> {
326
+ const col: TableColumnOptions = this.propertyToTableColumnOptions(entity, key);
327
+ await transaction.queryRunner.addColumn(
328
+ TypeOrmUtilities.getEntityMetadata(entity, transaction).tableName,
329
+ new TableColumn({ ...col, isNullable: true })
330
+ );
331
+ }
332
+
333
+ // eslint-disable-next-line jsdoc/require-jsdoc
334
+ async changePropertyOfEntity<T extends BaseEntity>(
335
+ entity: Newable<T>,
336
+ oldColumn: keyof T | string & {},
337
+ newColumn: PropertyMetadataInput & {
338
+ /**
339
+ * The name of the new column.
340
+ */
341
+ name?: keyof T,
342
+ /**
343
+ * The type of the new column.
344
+ */
345
+ type: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity> | FilePropertyMetadata>['type']
346
+ },
347
+ transaction: Transaction
348
+ ): Promise<void> {
349
+ const entityMetadata: TOEntityMetadata = TypeOrmUtilities.getEntityMetadata(entity, transaction);
350
+ const columnMetadata: ColumnMetadata = TypeOrmUtilities.getColumnMetadata(entity, oldColumn, transaction);
351
+
352
+ const col: TableColumnOptions = {
353
+ ...columnMetadata,
354
+ ...newColumn,
355
+ enum: 'enum' in newColumn && newColumn.enum
356
+ ? ObjectUtilities.values(newColumn.enum).map(v => String(v))
357
+ : columnMetadata.enum
358
+ ? columnMetadata.enum.map(v => String(v))
359
+ : undefined,
360
+ name: String(newColumn.name ?? oldColumn),
361
+ type: TypeOrmUtilities.normalizeColumnType(
362
+ this.ds,
363
+ {
364
+ precision: undefined,
365
+ scale: undefined,
366
+ ...columnMetadata,
367
+ ...newColumn,
368
+ type: this.fullColumnTypeMapping[newColumn.type]
369
+ }
370
+ )
371
+ };
372
+
373
+ await transaction.queryRunner.changeColumn(entityMetadata.tableName, String(oldColumn), new TableColumn(col));
374
+ }
375
+
376
+ /**
377
+ * Gets entity schemas for the entities of this data source.
378
+ * @returns TypeOrm entity schemas.
379
+ */
380
+ protected getEntitySchemas(): EntitySchema[] {
381
+ const schemas: EntitySchema[] = this.entities.map(e => this.createSchemaForEntity(e));
382
+ return schemas;
383
+ }
384
+
385
+ /**
386
+ * Transforms the property on the given entity class to typeorm column options.
387
+ * @param entity - The entity class which property should be transformed.
388
+ * @param property - The key of the actual property that should be transformed.
389
+ * @returns TypeOrm column options.
390
+ * @throws When no data source has been provided or no column metadata could be found.
391
+ */
392
+ protected propertyToTableColumnOptions<T extends BaseEntity>(entity: Newable<T>, property: keyof T): TableColumnOptions {
393
+ if (!this.ds) {
394
+ throw new DataSourceInitializationError();
395
+ }
396
+ const schema: EntitySchema = this.createSchemaForEntity(entity);
397
+ const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
398
+ const col: ColumnMetadata | undefined = metadata.columns.find(c => c.propertyName === property);
399
+
400
+ if (!col) {
401
+ throw new Error(`Could not determine column metadata for ${entity.name}.${String(property)}`);
402
+ }
403
+
404
+ return {
405
+ name: col.databaseName,
406
+ ...col,
407
+ enum: col.enum ? col.enum?.map(v => String(v)) : undefined,
408
+ type: TypeOrmUtilities.normalizeColumnType(
409
+ this.ds,
410
+ {
411
+ isArray: col.isArray,
412
+ length: col.length,
413
+ precision: col.precision,
414
+ scale: col.scale,
415
+ type: col.type
416
+ }
417
+ )
418
+ };
419
+ }
420
+
421
+ /**
422
+ * Creates a typeorm entity schema for a single entity.
423
+ * @param cls - The entity class to create the schema for.
424
+ * @returns A typeorm entity schema.
425
+ * @throws When the provided entity was configured incorrectly.
426
+ */
427
+ protected createSchemaForEntity(cls: Newable<BaseEntity>): EntitySchema {
428
+ const entityMetadata: EntityMetadata | undefined = MetadataUtilities.getEntityMetadata(cls);
429
+ if (!entityMetadata) {
430
+ throw new EntityMetadataMissingError(cls);
431
+ }
432
+ const props: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(cls);
433
+
434
+ this.validateEntityClassMetadata(entityMetadata, props);
435
+
436
+ const numberOfPrimaryKeys: number = ObjectUtilities
437
+ .values(props)
438
+ .filter(d => 'primary' in d && d.primary)
439
+ .length;
440
+ if (numberOfPrimaryKeys === 0) {
441
+ throw new Error(`no primary key specified for entity "${cls.name}".`);
442
+ }
443
+ if (numberOfPrimaryKeys > 1) {
444
+ throw new Error(`more than 1 primary key specified for entity "${cls.name}".`);
445
+ }
446
+
447
+ const columns: Record<string, EntitySchemaColumnOptions> = {};
448
+ const relations: Record<string, EntitySchemaRelationOptions> = {};
449
+ for (const [key, m] of ObjectUtilities.entries(props)) {
450
+ if (
451
+ m.type === Relation.MANY_TO_ONE
452
+ || m.type === Relation.ONE_TO_MANY
453
+ || m.type === Relation.HAS_ONE
454
+ || m.type === Relation.BELONGS_TO_ONE
455
+ || m.type === Relation.MANY_TO_MANY
456
+ ) {
457
+ relations[key] = this.propertyToRelationOptions(cls, key, m);
458
+ continue;
459
+ }
460
+ columns[key] = this.propertyToColumnOptions(m);
461
+ }
462
+
463
+ return new EntitySchema({
464
+ name: cls.name,
465
+ target: cls,
466
+ tableName: entityMetadata.tableName,
467
+ columns,
468
+ relations
469
+ });
470
+ }
471
+
472
+ /**
473
+ * Transforms the given relation metadata to typeorm relation options.
474
+ * @param cls
475
+ * @param key
476
+ * @param metadata - The relation metadata to transform.
477
+ * @returns TypeOrm relation options.
478
+ * @throws If a belongs to one or many to one relation hasn't specified a join column.
479
+ */
480
+ protected abstract propertyToRelationOptions<T extends BaseEntity>(
481
+ cls: Newable<T>,
482
+ key: string,
483
+ metadata: RelationMetadata<T>
484
+ ): EntitySchemaRelationOptions;
485
+
486
+ /**
487
+ * Transforms the given property metadata to typeorm column options.
488
+ * @param metadata - The property metadata to transform.
489
+ * @returns TypeOrm column options.
490
+ * @throws When the metadata is incorrect.
491
+ */
492
+ protected abstract propertyToColumnOptions(
493
+ metadata: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>
494
+ ): EntitySchemaColumnOptions;
495
+
496
+ /**
497
+ * Validates the entity class metadata and its properties.
498
+ * @param metadata - The entity class metadata.
499
+ * @param props - The properties of the entity class.
500
+ */
501
+ // eslint-disable-next-line unusedImports/no-unused-vars
502
+ protected validateEntityClassMetadata(metadata: EntityMetadata, props: Record<string, PropertyMetadata>): void {
503
+ // do nothing by default.
504
+ }
505
+
506
+ /**
507
+ * Validates the data source options.
508
+ * @param options - The full options to validate.
509
+ */
510
+ // eslint-disable-next-line unusedImports/no-unused-vars
511
+ protected validateOptions(options: OmitStrict<TOptions, 'type' | 'entities' | 'synchronize'>): void | Promise<void> {
512
+ // do nothing by default.
513
+ }
514
+
515
+ /**
516
+ * Creates a table for migrations if it does not exist already.
517
+ */
518
+ protected async createMigrationTableIfNotExists(): Promise<void> {
519
+ if (!this.ds) {
520
+ throw new DataSourceInitializationError();
521
+ }
522
+
523
+ const runner: QueryRunner = this.createQueryRunner();
524
+ try {
525
+ await runner.connect();
526
+ const schema: EntitySchema = this.createSchemaForEntity(MigrationEntity);
527
+ const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
528
+ const table: Table = new Table({
529
+ name: metadata.tablePath,
530
+ columns: metadata.columns.map(col => ({
531
+ name: col.databaseName,
532
+ ...col,
533
+ enum: col.enum?.map(v => String(v)),
534
+ type: TypeOrmUtilities.normalizeColumnType(this.ds, col)
535
+ }))
536
+ });
537
+ await runner.createTable(table, true);
538
+
539
+ }
540
+ finally {
541
+ await runner.release();
542
+ }
543
+ }
544
+ }