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,675 +0,0 @@
1
- import { ChildProcessByStdio, spawn } from 'node:child_process';
2
- import { PassThrough, Readable, Writable } from 'node:stream';
3
-
4
- import { DataSource as TODataSource, Repository as TORepository, EntityMetadata as TOEntityMetadata, EntitySchema, EntitySchemaColumnOptions, QueryRunner, EntitySchemaRelationOptions, Table, TableColumnOptions, TableColumn, EntityTarget } from 'typeorm';
5
- import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions.js';
6
- import { ColumnMetadata } from 'typeorm/metadata/ColumnMetadata.js';
7
- import { OnDeleteType } from 'typeorm/metadata/types/OnDeleteType.js';
8
- import { OnUpdateType } from 'typeorm/metadata/types/OnUpdateType.js';
9
-
10
- import { DataSourceInterface, IsolationLevel } from './data-source.interface';
11
- import { ChangeSetRepository } from '../../change-sets/change-set-repository';
12
- import { isChangeSetEntityNewable, ChangeSetEntity } from '../../change-sets/models/change-set-entity.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 { FilePropertyMetadata } from '../../entity/models/file-property-metadata.model';
24
- import { Relation } from '../../entity/models/relation.enum';
25
- import { StringPropertyMetadata } from '../../entity/models/string-property-metadata.model';
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 { getDefaultBeforeReturnHook, getDefaultBeforeSaveHook } from '../hooks/hooks.default';
36
- import { MigrationEntity } from '../migration/migration-entity.model';
37
- import { Migration } from '../migration/migration.model';
38
- import { ColumnType } from '../models/column-type.model';
39
- import { DataSourceOptions } from '../models/data-source-options.model';
40
- import { Repository } from '../repository';
41
- import { Transaction } from '../transaction/transaction.model';
42
- import { TypeOrmTransaction } from '../transaction/typeorm-transaction.model';
43
-
44
- // eslint-disable-next-line jsdoc/require-jsdoc
45
- type ToColumnMappableTypes = ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>['type'];
46
-
47
- // eslint-disable-next-line jsdoc/require-jsdoc
48
- type MigrationWithName = { migration: Migration, name: string };
49
-
50
- /**
51
- * Postgres-specific connection options.
52
- */
53
- export type PostgresOptions = OmitStrict<PostgresConnectionOptions, 'entities' | 'type'>;
54
-
55
- /**
56
- * A base postgres data source definition.
57
- */
58
- export abstract class PostgresDataSource implements DataSourceInterface {
59
- /**
60
- * Mapping from a Zibri property type to a typeorm column type.
61
- */
62
- protected readonly columnTypeMappingOverride: Partial<Record<ToColumnMappableTypes, ColumnType>> = {};
63
-
64
- private get columnTypeMapping(): Record<ToColumnMappableTypes, ColumnType> {
65
- return {
66
- array: 'array',
67
- number: 'decimal',
68
- string: 'varchar',
69
- object: 'jsonb',
70
- date: 'timestamptz',
71
- boolean: 'boolean',
72
- unknown: 'jsonb',
73
- file: 'bytea',
74
- ...this.columnTypeMappingOverride
75
- };
76
- }
77
-
78
- abstract readonly options: PostgresOptions;
79
- abstract readonly entities: Newable<BaseEntity>[];
80
- /**
81
- * The optional root password.
82
- */
83
- readonly rootPw: string | undefined;
84
- /**
85
- * The optional root username.
86
- */
87
- readonly rootUsername: string | undefined;
88
-
89
- // eslint-disable-next-line jsdoc/require-jsdoc
90
- readonly migrations: Newable<Migration>[] = [];
91
-
92
- /**
93
- * The internal typeorm data source.
94
- */
95
- protected ds?: TODataSource;
96
-
97
- constructor(
98
- @Inject(ZIBRI_DI_TOKENS.LOGGER)
99
- private readonly logger: LoggerInterface
100
- ) { }
101
-
102
- // eslint-disable-next-line jsdoc/require-jsdoc
103
- createBackupData(): Readable {
104
- const dumpCommand: string = 'pg_dumpall';
105
- const { host, port } = this.options;
106
- if (!this.rootUsername || !host || !port) {
107
- throw new Error('Could not create a backup, missing this.rootUsername, this.options.host or this.options.port');
108
- }
109
- const args: string[] = ['-U', this.rootUsername, '-h', host, '-p', port.toString()];
110
-
111
- const child: ChildProcessByStdio<null, Readable, null> = spawn(dumpCommand, args, {
112
- stdio: ['ignore', 'pipe', 'inherit'],
113
- env: { ...process.env, PGPASSWORD: this.rootPw }
114
- });
115
-
116
- const out: PassThrough = new PassThrough();
117
- child.stdout.pipe(out);
118
- child.on('error', err => {
119
- out.destroy(err);
120
- });
121
- child.on('exit', code => {
122
- if (code !== 0) {
123
- out.destroy(new Error(`${dumpCommand} exited with code ${code}`));
124
- }
125
- else {
126
- out.end();
127
- }
128
- });
129
-
130
- return out;
131
- }
132
-
133
- // eslint-disable-next-line jsdoc/require-jsdoc
134
- async restoreBackup(backupData: Readable): Promise<void> {
135
- const { host, port, database } = this.options;
136
- if (!this.rootUsername || !host || !port || !database) {
137
- throw new Error('Missing rootUsername, host, port, or database for restore');
138
- }
139
-
140
- const args: string[] = ['-U', this.rootUsername, '-h', host, '-p', port.toString(), '-d', database];
141
- const child: ChildProcessByStdio<Writable, null, null> = spawn('psql', args, {
142
- stdio: ['pipe', 'inherit', 'inherit'],
143
- env: { ...process.env, PGPASSWORD: this.rootPw }
144
- });
145
-
146
- return new Promise((resolve, reject) => {
147
- backupData.pipe(child.stdin);
148
-
149
- child.on('error', reject);
150
- child.on('close', code => {
151
- if (code !== 0) {
152
- reject(new Error(`psql exited with code ${code}`));
153
- }
154
- else {
155
- resolve();
156
- }
157
- });
158
- });
159
- }
160
-
161
- // eslint-disable-next-line jsdoc/require-jsdoc
162
- async init(): Promise<void> {
163
- if (this.ds) {
164
- throw new Error('The postgres data source has already been initialized.');
165
- }
166
-
167
- if (this.options.username === 'postgres' && this.options.password === 'password') {
168
- await this.logger.warn(
169
- `The data source "${this.constructor.name}" uses the default credentials, you probably want to change that.`
170
- );
171
- }
172
-
173
- for (const entityClass of this.entities) {
174
- register({
175
- token: repositoryTokenFor(entityClass),
176
- useFactory: () => this.getRepository(entityClass)
177
- });
178
- }
179
-
180
- const schemas: EntitySchema[] = this.getEntitySchemas();
181
- this.ds = new TODataSource({
182
- entities: schemas,
183
- poolSize: 100,
184
- type: 'postgres',
185
- ...this.options,
186
- synchronize: false
187
- } as DataSourceOptions);
188
- await this.ds.initialize();
189
-
190
- await this.runMigrations();
191
-
192
- if (this.options.synchronize !== false) {
193
- await this.ds.synchronize();
194
- }
195
- }
196
-
197
- // eslint-disable-next-line jsdoc/require-jsdoc
198
- async shutDown(): Promise<void> {
199
- await this.ds?.destroy();
200
- }
201
-
202
- /**
203
- * Gets entity schemas for the entities of this data source.
204
- * @returns Typeorm entity schemas.
205
- */
206
- protected getEntitySchemas(): EntitySchema[] {
207
- const schemas: EntitySchema[] = this.entities.map(e => this.createSchemaForEntity(e));
208
- return schemas;
209
- }
210
-
211
- /**
212
- * Creates a typeorm entity schema for a single entity.
213
- * @param cls - The entity class to create the schema for.
214
- * @returns A typeorm entity schema.
215
- * @throws When the provided entity was configured incorrectly.
216
- */
217
- protected createSchemaForEntity(cls: Newable<BaseEntity>): EntitySchema {
218
- const entityMetadata: EntityMetadata | undefined = MetadataUtilities.getEntityMetadata(cls);
219
- if (!entityMetadata) {
220
- throw new Error(`Could not find metadata for entity "${cls.name}". Did you forget to decorate it with @Entity?`);
221
- }
222
- const props: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(cls);
223
-
224
- const numberOfPrimaryKeys: number = ObjectUtilities
225
- .values(props)
226
- // eslint-disable-next-line typescript/no-explicit-any
227
- .filter(d => (d as StringPropertyMetadata<any, any, any, any, any>).primary)
228
- .length;
229
- if (numberOfPrimaryKeys === 0) {
230
- throw new Error(`no primary key specified for entity "${cls.name}".`);
231
- }
232
- if (numberOfPrimaryKeys > 1) {
233
- throw new Error(`more than 1 primary key specified for entity "${cls.name}".`);
234
- }
235
-
236
- const columns: Record<string, EntitySchemaColumnOptions> = {};
237
- const relations: Record<string, EntitySchemaRelationOptions> = {};
238
- for (const [key, m] of ObjectUtilities.entries(props)) {
239
- if (
240
- m.type === Relation.MANY_TO_ONE
241
- || m.type === Relation.ONE_TO_MANY
242
- || m.type === Relation.ONE_TO_ONE
243
- || m.type === Relation.MANY_TO_MANY
244
- ) {
245
- relations[key] = this.propertyToRelationOptions(m);
246
- continue;
247
- }
248
- columns[key] = this.propertyToColumnOptions(m);
249
- }
250
-
251
- return new EntitySchema({
252
- name: cls.name,
253
- target: cls,
254
- tableName: entityMetadata.tableName,
255
- columns,
256
- relations
257
- });
258
- }
259
-
260
- /**
261
- * Transforms the given relation metadata to typeorm relation options.
262
- * @param metadata - The relation metadata to transform.
263
- * @returns Typeorm relation options.
264
- */
265
- protected propertyToRelationOptions<T extends BaseEntity>(metadata: RelationMetadata<T>): EntitySchemaRelationOptions {
266
- const thisHasRemove: boolean = this.hasCascadeFlag(metadata.cascade, 'remove');
267
- const thisHasUpdate: boolean = this.hasCascadeFlag(metadata.cascade, 'update');
268
- const thisHasInsert: boolean = this.hasCascadeFlag(metadata.cascade, 'insert');
269
-
270
- // try to inspect inverse property's cascade (if inverseSide provided)
271
- const targetClass: Newable<T> = metadata.target();
272
- const targetProps: Record<string, PropertyMetadata> = MetadataUtilities.getModelProperties(targetClass);
273
- const inv: RelationMetadata<BaseEntity> = targetProps[metadata.inverseSide] as RelationMetadata<BaseEntity>;
274
- const inverseHasRemove: boolean = this.hasCascadeFlag(inv.cascade, 'remove');
275
- const inverseHasUpdate: boolean = this.hasCascadeFlag(inv.cascade, 'update');
276
- const inverseHasInsert: boolean = this.hasCascadeFlag(inv.cascade, 'insert');
277
-
278
- const onDelete: OnDeleteType | undefined = thisHasRemove || inverseHasRemove ? 'CASCADE' : undefined;
279
- const onUpdate: OnUpdateType | undefined = thisHasUpdate || inverseHasUpdate ? 'CASCADE' : undefined;
280
- const persistence: boolean = 'persistence' in metadata ? metadata.persistence : thisHasInsert || inverseHasInsert;
281
- const nullable: boolean = typeof metadata.required === 'boolean' ? !metadata.required : true;
282
-
283
- switch (metadata.type) {
284
- case Relation.ONE_TO_ONE:
285
- case Relation.ONE_TO_MANY:
286
- case Relation.MANY_TO_MANY: {
287
- return {
288
- nullable,
289
- ...metadata,
290
- inverseSide: metadata.inverseSide as string,
291
- onDelete,
292
- onUpdate,
293
- persistence
294
- };
295
- }
296
- case Relation.MANY_TO_ONE: {
297
- return {
298
- nullable,
299
- joinColumn: true,
300
- ...metadata,
301
- inverseSide: metadata.inverseSide as string,
302
- onDelete,
303
- onUpdate,
304
- persistence
305
- };
306
- }
307
- }
308
- }
309
-
310
- private hasCascadeFlag(c: RelationMetadata<BaseEntity>['cascade'], flag: 'remove' | 'update' | 'insert'): boolean {
311
- if (c === true) {
312
- return true;
313
- }
314
- if (Array.isArray(c)) {
315
- return c.includes(flag);
316
- }
317
- return false;
318
- }
319
-
320
- /**
321
- * Transforms the given property metadata to typeorm column options.
322
- * @param metadata - The property metadata to transform.
323
- * @returns Typeorm column options.
324
- * @throws When the metadata is incorrect.
325
- */
326
- protected propertyToColumnOptions(
327
- metadata: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity>>
328
- ): EntitySchemaColumnOptions {
329
- const nullable: boolean = typeof metadata.required === 'boolean' ? !metadata.required : true;
330
- switch (metadata.type) {
331
- case 'file':
332
- case 'boolean':
333
- case 'object':
334
- case 'unknown':
335
- case 'date': {
336
- return {
337
- nullable,
338
- ...metadata,
339
- type: this.columnTypeMapping[metadata.type],
340
- default: undefined
341
- };
342
- }
343
- case 'array': {
344
- if (metadata.items.type === 'object') {
345
- return {
346
- nullable,
347
- ...metadata,
348
- type: this.columnTypeMapping[metadata.items.type],
349
- default: undefined
350
- };
351
- }
352
- return {
353
- nullable,
354
- ...metadata,
355
- type: this.columnTypeMapping[metadata.items.type],
356
- array: true,
357
- default: undefined
358
- };
359
- }
360
- case 'number': {
361
- return {
362
- nullable,
363
- generated: metadata.primary ? 'increment' : undefined,
364
- ...metadata,
365
- type: metadata.format ?? this.columnTypeMapping[metadata.type],
366
- default: undefined,
367
- transformer: {
368
- // eslint-disable-next-line unicorn/no-null
369
- to: (v: number | bigint | null) => v != null ? String(v) : null,
370
- from: (v: string | null) => {
371
- if (v == undefined) {
372
- return v;
373
- }
374
- if (metadata.format === 'bigint') {
375
- return BigInt(v);
376
- }
377
- return Number(v);
378
- }
379
- }
380
- };
381
- }
382
- case 'string': {
383
- return {
384
- nullable,
385
- generated: metadata.primary ? 'uuid' : undefined,
386
- ...metadata,
387
- type: metadata.format === 'uuid' || metadata.primary ? 'uuid' : this.columnTypeMapping[metadata.type],
388
- length: metadata.maxLength,
389
- enum: metadata.enum ? ObjectUtilities.values(metadata.enum) : undefined,
390
- default: undefined
391
- };
392
- }
393
- }
394
- }
395
-
396
- // eslint-disable-next-line jsdoc/require-jsdoc
397
- getRepository<T extends BaseEntity>(cls: Newable<T>): Repository<T> {
398
- if (!this.ds) {
399
- // eslint-disable-next-line sonar/no-duplicate-string
400
- throw new Error('The postgres data source needs to be initialized before it can be used.');
401
- }
402
- if (!this.entities.find(e => e === cls)) {
403
- throw new Error(`The entity "${cls.name}" is not in this database. Did you forget to include it in the entities array?`);
404
- }
405
- const repo: TORepository<T> = this.ds.getRepository(cls);
406
-
407
- if (isSoftDeleteEntityNewable(cls)) {
408
- return new SoftDeleteRepository(
409
- cls,
410
- repo as unknown as TORepository<SoftDeleteEntity>,
411
- this.logger,
412
- this,
413
- getDefaultBeforeSaveHook(),
414
- getDefaultBeforeReturnHook()
415
- ) as unknown as Repository<T>;
416
- }
417
- if (isChangeSetEntityNewable(cls)) {
418
- return new ChangeSetRepository(
419
- cls,
420
- repo as unknown as TORepository<ChangeSetEntity>,
421
- this.logger,
422
- this,
423
- getDefaultBeforeSaveHook(),
424
- getDefaultBeforeReturnHook()
425
- ) as unknown as Repository<T>;
426
- }
427
- return new Repository<T>(
428
- cls,
429
- repo,
430
- this.logger,
431
- this,
432
- getDefaultBeforeSaveHook(),
433
- getDefaultBeforeReturnHook()
434
- );
435
- }
436
-
437
- // eslint-disable-next-line jsdoc/require-jsdoc
438
- async startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction> {
439
- if (!this.ds) {
440
- throw new Error('The postgres data source needs to be initialized before it can be used.');
441
- }
442
-
443
- const runner: QueryRunner = this.createQueryRunner();
444
- try {
445
- await runner.connect();
446
- await runner.startTransaction(isolationLevel);
447
- return new TypeOrmTransaction(runner);
448
- }
449
- catch (error) {
450
- await runner.release();
451
- throw error;
452
- }
453
- }
454
-
455
- /**
456
- * Creates a query runner.
457
- * @returns A query runner.
458
- * @throws When the data source has not been initialized yet.
459
- */
460
- createQueryRunner(): QueryRunner {
461
- if (!this.ds) {
462
- throw new Error('The postgres data source needs to be initialized before it can be used.');
463
- }
464
- return this.ds.createQueryRunner();
465
- }
466
-
467
- // eslint-disable-next-line jsdoc/require-jsdoc
468
- async runMigrations(): Promise<void> {
469
- await this.createMigrationTableIfNotExists();
470
-
471
- // we need to dynamically inject here because the repositories aren't ready in the constructor.
472
- const migrationsRepository: Repository<MigrationEntity> = inject(repositoryTokenFor(MigrationEntity));
473
- const finishedMigrationVersions: string[] = (await migrationsRepository.findAll()).map(m => m.version);
474
- const allMigrations: MigrationWithName[] = this.migrations.map(m => ({ migration: inject(m), name: m.name }));
475
-
476
- const migrationsToRunUp: MigrationWithName[] = allMigrations.filter(m => {
477
- return !finishedMigrationVersions.includes(m.migration.version)
478
- && compareVersion(m.migration.version, GlobalRegistry.getAppData('version') as Version) !== 'bigger';
479
- });
480
-
481
- const migrationsToRunDown: MigrationWithName[] = allMigrations.filter(m => {
482
- return finishedMigrationVersions.includes(m.migration.version)
483
- && compareVersion(m.migration.version, GlobalRegistry.getAppData('version') as Version) === 'bigger';
484
- });
485
-
486
- for (const migration of migrationsToRunUp) {
487
- await this.logger.info(` > runs up migration ${migration.name}`);
488
- await migration.migration.runUp();
489
- }
490
-
491
- for (const migration of migrationsToRunDown) {
492
- await this.logger.info(` > runs down migration ${migration.name}`);
493
- await migration.migration.runDown();
494
- }
495
-
496
- const skipped: number = allMigrations.length - migrationsToRunDown.length - migrationsToRunUp.length;
497
- if (skipped) {
498
- await this.logger.info(` > skipped ${skipped} migrations that have already been applied`);
499
- }
500
- }
501
-
502
- // eslint-disable-next-line jsdoc/require-jsdoc
503
- async addPropertyToEntity<T extends BaseEntity>(
504
- entity: Newable<T>,
505
- key: keyof T,
506
- transaction: Transaction
507
- ): Promise<void> {
508
- const col: TableColumnOptions = this.propertyToTableColumnOptions(entity, key);
509
- await transaction.queryRunner.addColumn(
510
- this.getEntityMetadata(entity, transaction).tableName,
511
- new TableColumn({ ...col, isNullable: true })
512
- );
513
- }
514
-
515
- // eslint-disable-next-line jsdoc/require-jsdoc
516
- async changePropertyOfEntity<T extends BaseEntity>(
517
- entity: Newable<T>,
518
- oldColumn: keyof T | string & {},
519
- newColumn: PropertyMetadataInput & {
520
- /**
521
- * The name of the new column.
522
- */
523
- name?: keyof T,
524
- /**
525
- * The type of the new column.
526
- */
527
- type: ExcludeStrict<PropertyMetadata, RelationMetadata<BaseEntity> | FilePropertyMetadata>['type']
528
- },
529
- transaction: Transaction
530
- ): Promise<void> {
531
- const entityMetadata: TOEntityMetadata = this.getEntityMetadata(entity, transaction);
532
- const columnMetadata: ColumnMetadata = this.getColumnMetadata(entity, oldColumn, transaction);
533
-
534
- const col: TableColumnOptions = {
535
- ...columnMetadata,
536
- ...newColumn,
537
- enum: 'enum' in newColumn && newColumn.enum
538
- ? ObjectUtilities.values(newColumn.enum).map(v => String(v))
539
- : columnMetadata.enum
540
- ? columnMetadata.enum.map(v => String(v))
541
- : undefined,
542
- name: String(newColumn.name ?? oldColumn),
543
- type: this.normalizeColumnType({
544
- precision: undefined,
545
- scale: undefined,
546
- ...columnMetadata,
547
- ...newColumn,
548
- type: this.columnTypeMapping[newColumn.type]
549
- })
550
- };
551
-
552
- await transaction.queryRunner.changeColumn(entityMetadata.tableName, String(oldColumn), new TableColumn(col));
553
- }
554
-
555
- /**
556
- * Gets the typeorm metadata for a given entity.
557
- * @param target - The target entity.
558
- * @param transaction - The transaction to run this command with.
559
- * @returns The typeorm metadata.
560
- */
561
- protected getEntityMetadata<T extends BaseEntity>(target: EntityTarget<T>, transaction: Transaction): TOEntityMetadata {
562
- return transaction.queryRunner.connection.getMetadata(target);
563
- }
564
-
565
- /**
566
- * Gets the metadata for a typeorm column.
567
- * @param target - The entity.
568
- * @param propertyName - The name of the property to get the column metadata for.
569
- * @param transaction - The transaction to use to get the column metadata.
570
- * @returns The typeorm column metadata.
571
- * @throws When the provided propertyName could not be found as a column.
572
- */
573
- protected getColumnMetadata<T extends BaseEntity>(
574
- target: EntityTarget<T>,
575
- propertyName: keyof T | string & {},
576
- transaction: Transaction
577
- ): ColumnMetadata {
578
- const metadata: TOEntityMetadata = this.getEntityMetadata(target, transaction);
579
- const column: ColumnMetadata | undefined = metadata.columns.find(
580
- (col) => col.propertyName === propertyName
581
- );
582
-
583
- if (!column) {
584
- throw new Error(
585
- `Column ${propertyName.toString()} not found in model`
586
- );
587
- }
588
-
589
- return column;
590
- }
591
-
592
- /**
593
- * Creates a table for migrations if it does not exist already.
594
- */
595
- protected async createMigrationTableIfNotExists(): Promise<void> {
596
- if (!this.ds) {
597
- throw new Error('The postgres data source needs to be initialized before it can be used.');
598
- }
599
-
600
- const runner: QueryRunner = this.createQueryRunner();
601
- try {
602
- await runner.connect();
603
- const schema: EntitySchema = this.createSchemaForEntity(MigrationEntity);
604
- const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
605
- const table: Table = new Table({
606
- name: metadata.tablePath,
607
- columns: metadata.columns.map(col => ({
608
- name: col.databaseName,
609
- ...col,
610
- enum: col.enum?.map(v => String(v)),
611
- // eslint-disable-next-line typescript/no-non-null-assertion
612
- type: this.ds!.driver.normalizeType(col)
613
- }))
614
- });
615
- await runner.createTable(table, true);
616
-
617
- }
618
- finally {
619
- await runner.release();
620
- }
621
- }
622
-
623
- /**
624
- * Transforms the property on the given entity class to typeorm column options.
625
- * @param entity - The entity class which property should be transformed.
626
- * @param property - The key of the actual property that should be transformed.
627
- * @returns Typeorm column options.
628
- * @throws When no data source has been provided or no column metadata could be found.
629
- */
630
- protected propertyToTableColumnOptions<T extends BaseEntity>(entity: Newable<T>, property: keyof T): TableColumnOptions {
631
- if (!this.ds) {
632
- throw new Error('The postgres data source needs to be initialized before it can be used.');
633
- }
634
- const schema: EntitySchema = this.createSchemaForEntity(entity);
635
- const metadata: TOEntityMetadata = this.ds.getMetadata(schema);
636
- const col: ColumnMetadata | undefined = metadata.columns.find(c => c.propertyName === property);
637
-
638
- if (!col) {
639
- throw new Error(`Could not determine column metadata for ${entity.name}.${String(property)}`);
640
- }
641
-
642
- return {
643
- name: col.databaseName,
644
- ...col,
645
- enum: col.enum ? col.enum?.map(v => String(v)) : undefined,
646
- type: this.normalizeColumnType({
647
- isArray: col.isArray,
648
- length: col.length,
649
- precision: col.precision,
650
- scale: col.scale,
651
- type: col.type
652
- })
653
- };
654
- }
655
-
656
- private normalizeColumnType(
657
- column: {
658
- // eslint-disable-next-line jsdoc/require-jsdoc
659
- type: ColumnType | string & {} | undefined,
660
- // eslint-disable-next-line jsdoc/require-jsdoc
661
- length: number | string | undefined,
662
- // eslint-disable-next-line jsdoc/require-jsdoc
663
- precision: number | null | undefined,
664
- // eslint-disable-next-line jsdoc/require-jsdoc
665
- scale: number | undefined,
666
- // eslint-disable-next-line jsdoc/require-jsdoc
667
- isArray: boolean | undefined
668
- }
669
- ): string {
670
- if (!this.ds) {
671
- throw new Error('The postgres data source needs to be initialized before it can be used.');
672
- }
673
- return this.ds.driver.normalizeType(column);
674
- }
675
- }