zibri 2.4.1 → 2.5.0

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 (496) hide show
  1. package/dist/cjs/application-options.model.d.ts +2 -2
  2. package/dist/cjs/application-options.model.d.ts.map +1 -1
  3. package/dist/cjs/application.d.ts.map +1 -1
  4. package/dist/cjs/application.js +0 -1
  5. package/dist/cjs/application.js.map +1 -1
  6. package/dist/cjs/assets/asset.service.d.ts.map +1 -1
  7. package/dist/cjs/assets/asset.service.js +3 -1
  8. package/dist/cjs/assets/asset.service.js.map +1 -1
  9. package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.d.ts +1 -1
  10. package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.d.ts.map +1 -1
  11. package/dist/cjs/auth/2fa/methods/otp/otp-credentials.model.js.map +1 -1
  12. package/dist/cjs/auth/2fa/methods/otp/otp.two-factor-method.js +1 -1
  13. package/dist/cjs/auth/2fa/methods/otp/otp.two-factor-method.js.map +1 -1
  14. package/dist/cjs/auth/strategies/cookie/cookie-auth.controller.js +1 -1
  15. package/dist/cjs/auth/strategies/cookie/cookie-auth.controller.js.map +1 -1
  16. package/dist/cjs/auth/strategies/jwt/jwt-auth.controller.js +1 -1
  17. package/dist/cjs/auth/strategies/jwt/jwt-auth.controller.js.map +1 -1
  18. package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js +1 -1
  19. package/dist/cjs/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
  20. package/dist/cjs/backup/backup-resource-entity.model.d.ts +1 -1
  21. package/dist/cjs/backup/backup-resource-entity.model.d.ts.map +1 -1
  22. package/dist/cjs/backup/backup-resource-entity.model.js.map +1 -1
  23. package/dist/cjs/change-sets/models/change-set.model.d.ts +1 -1
  24. package/dist/cjs/change-sets/models/change-set.model.d.ts.map +1 -1
  25. package/dist/cjs/change-sets/models/change-set.model.js +1 -1
  26. package/dist/cjs/change-sets/models/change-set.model.js.map +1 -1
  27. package/dist/cjs/change-sets/models/change.model.d.ts +2 -2
  28. package/dist/cjs/change-sets/models/change.model.d.ts.map +1 -1
  29. package/dist/cjs/change-sets/models/change.model.js.map +1 -1
  30. package/dist/cjs/context/cache/cache.context.d.ts +2 -2
  31. package/dist/cjs/context/cache/cache.context.d.ts.map +1 -1
  32. package/dist/cjs/context/cache/cache.context.js +2 -2
  33. package/dist/cjs/context/cache/cache.context.js.map +1 -1
  34. package/dist/cjs/context/request/request-context-token.model.js +1 -1
  35. package/dist/cjs/context/request/request-context-token.model.js.map +1 -1
  36. package/dist/cjs/cron/cron-job-entity.model.d.ts +2 -2
  37. package/dist/cjs/cron/cron-job-entity.model.d.ts.map +1 -1
  38. package/dist/cjs/cron/cron-job-entity.model.js.map +1 -1
  39. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts +1 -0
  40. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.d.ts.map +1 -1
  41. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js +9 -0
  42. package/dist/cjs/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -1
  43. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.d.ts.map +1 -1
  44. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js +3 -3
  45. package/dist/cjs/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -1
  46. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts +2 -1
  47. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.d.ts.map +1 -1
  48. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +20 -0
  49. package/dist/cjs/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -1
  50. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts +4 -0
  51. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.d.ts.map +1 -1
  52. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +3 -1
  53. package/dist/cjs/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -1
  54. package/dist/cjs/data-source/migration/migration-entity.model.d.ts +2 -2
  55. package/dist/cjs/data-source/migration/migration-entity.model.d.ts.map +1 -1
  56. package/dist/cjs/data-source/migration/migration-entity.model.js.map +1 -1
  57. package/dist/cjs/data-source/migration/migration.model.d.ts +2 -2
  58. package/dist/cjs/data-source/migration/migration.model.d.ts.map +1 -1
  59. package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts +10 -2
  60. package/dist/cjs/data-source/models/where/date-where-filter.model.d.ts.map +1 -1
  61. package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts +17 -0
  62. package/dist/cjs/data-source/models/where/string-where-filter.model.d.ts.map +1 -1
  63. package/dist/cjs/data-source/models/where/where-filter-keys.model.d.ts.map +1 -1
  64. package/dist/cjs/data-source/models/where/where-filter-keys.model.js +3 -0
  65. package/dist/cjs/data-source/models/where/where-filter-keys.model.js.map +1 -1
  66. package/dist/cjs/di/default/zibri-di-providers.default.d.ts.map +1 -1
  67. package/dist/cjs/di/default/zibri-di-providers.default.js +4 -0
  68. package/dist/cjs/di/default/zibri-di-providers.default.js.map +1 -1
  69. package/dist/cjs/di/default/zibri-di-tokens.default.d.ts +3 -0
  70. package/dist/cjs/di/default/zibri-di-tokens.default.d.ts.map +1 -1
  71. package/dist/cjs/di/default/zibri-di-tokens.default.js +2 -0
  72. package/dist/cjs/di/default/zibri-di-tokens.default.js.map +1 -1
  73. package/dist/cjs/email/email.service.d.ts +1 -1
  74. package/dist/cjs/email/email.service.d.ts.map +1 -1
  75. package/dist/cjs/email/email.service.js +4 -4
  76. package/dist/cjs/email/email.service.js.map +1 -1
  77. package/dist/cjs/email/models/email.model.d.ts +4 -4
  78. package/dist/cjs/email/models/email.model.d.ts.map +1 -1
  79. package/dist/cjs/email/models/email.model.js +4 -4
  80. package/dist/cjs/email/models/email.model.js.map +1 -1
  81. package/dist/cjs/entity/generation/generate-entity-file.function.js +1 -1
  82. package/dist/cjs/entity/generation/generate-entity-file.function.js.map +1 -1
  83. package/dist/cjs/event/event-subscriber-run.model.d.ts +1 -1
  84. package/dist/cjs/event/event-subscriber-run.model.d.ts.map +1 -1
  85. package/dist/cjs/event/event-subscriber-run.model.js +1 -1
  86. package/dist/cjs/event/event-subscriber-run.model.js.map +1 -1
  87. package/dist/cjs/global/global-registry.d.ts +2 -2
  88. package/dist/cjs/global/global-registry.d.ts.map +1 -1
  89. package/dist/cjs/http/http-request.model.d.ts +2 -2
  90. package/dist/cjs/http/http-request.model.d.ts.map +1 -1
  91. package/dist/cjs/http/known-header.enum.d.ts +1 -0
  92. package/dist/cjs/http/known-header.enum.d.ts.map +1 -1
  93. package/dist/cjs/http/known-header.enum.js +1 -0
  94. package/dist/cjs/http/known-header.enum.js.map +1 -1
  95. package/dist/cjs/http-client/http-client.d.ts.map +1 -1
  96. package/dist/cjs/http-client/http-client.js.map +1 -1
  97. package/dist/cjs/index.d.ts +7 -3
  98. package/dist/cjs/index.d.ts.map +1 -1
  99. package/dist/cjs/index.js +8 -3
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/localization/formatting/format-price.function.d.ts.map +1 -1
  102. package/dist/cjs/localization/formatting/format-price.function.js.map +1 -1
  103. package/dist/cjs/logging/log-context.model.d.ts +6 -6
  104. package/dist/cjs/logging/log-context.model.d.ts.map +1 -1
  105. package/dist/cjs/logging/log-context.model.js +6 -6
  106. package/dist/cjs/logging/log-context.model.js.map +1 -1
  107. package/dist/cjs/logging/logger.js +1 -1
  108. package/dist/cjs/logging/logger.js.map +1 -1
  109. package/dist/cjs/multithreading/models/thread-job-entity.model.d.ts +5 -5
  110. package/dist/cjs/multithreading/models/thread-job-entity.model.d.ts.map +1 -1
  111. package/dist/cjs/multithreading/models/thread-job-entity.model.js +4 -4
  112. package/dist/cjs/multithreading/models/thread-job-entity.model.js.map +1 -1
  113. package/dist/cjs/multithreading/services/thread-job.d.ts +4 -4
  114. package/dist/cjs/multithreading/services/thread-job.d.ts.map +1 -1
  115. package/dist/cjs/multithreading/services/thread-job.js.map +1 -1
  116. package/dist/cjs/open-api/open-api-service.interface.d.ts +2 -1
  117. package/dist/cjs/open-api/open-api-service.interface.d.ts.map +1 -1
  118. package/dist/cjs/open-api/open-api.service.d.ts +5 -2
  119. package/dist/cjs/open-api/open-api.service.d.ts.map +1 -1
  120. package/dist/cjs/open-api/open-api.service.js +256 -139
  121. package/dist/cjs/open-api/open-api.service.js.map +1 -1
  122. package/dist/cjs/parsing/html/csp-options.model.d.ts +1 -1
  123. package/dist/cjs/parsing/html/csp-options.model.d.ts.map +1 -1
  124. package/dist/cjs/parsing/html/csp-options.model.js.map +1 -1
  125. package/dist/cjs/parsing/parser.js +3 -3
  126. package/dist/cjs/parsing/parser.js.map +1 -1
  127. package/dist/cjs/plugin/invoicing/models/invoice-address.model.d.ts +2 -2
  128. package/dist/cjs/plugin/invoicing/models/invoice-address.model.d.ts.map +1 -1
  129. package/dist/cjs/plugin/invoicing/models/invoice-address.model.js +2 -2
  130. package/dist/cjs/plugin/invoicing/models/invoice-address.model.js.map +1 -1
  131. package/dist/cjs/plugin/invoicing/models/vat.model.d.ts +1 -1
  132. package/dist/cjs/plugin/invoicing/models/vat.model.d.ts.map +1 -1
  133. package/dist/cjs/plugin/invoicing/models/vat.model.js +1 -1
  134. package/dist/cjs/plugin/invoicing/models/vat.model.js.map +1 -1
  135. package/dist/cjs/plugin/mailing-list/mailing-list.controller.js +1 -1
  136. package/dist/cjs/plugin/mailing-list/mailing-list.controller.js.map +1 -1
  137. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.d.ts +1 -1
  138. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.d.ts.map +1 -1
  139. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.js +1 -1
  140. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscriber.model.js.map +1 -1
  141. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.d.ts +1 -1
  142. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.d.ts.map +1 -1
  143. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js +1 -1
  144. package/dist/cjs/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js.map +1 -1
  145. package/dist/cjs/plugin/payment/models/payment.model.d.ts +2 -2
  146. package/dist/cjs/plugin/payment/models/payment.model.d.ts.map +1 -1
  147. package/dist/cjs/plugin/payment/models/payment.model.js +1 -1
  148. package/dist/cjs/plugin/payment/models/payment.model.js.map +1 -1
  149. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.d.ts +17 -17
  150. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.d.ts.map +1 -1
  151. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.js +17 -17
  152. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal-client.js.map +1 -1
  153. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js +1 -1
  154. package/dist/cjs/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js.map +1 -1
  155. package/dist/cjs/preact/preact.utilities.js +1 -1
  156. package/dist/cjs/preact/preact.utilities.js.map +1 -1
  157. package/dist/cjs/preact/validate-email-templates.function.js +1 -1
  158. package/dist/cjs/preact/validate-email-templates.function.js.map +1 -1
  159. package/dist/cjs/rate-limiting/rate-limiter.d.ts +10 -5
  160. package/dist/cjs/rate-limiting/rate-limiter.d.ts.map +1 -1
  161. package/dist/cjs/rate-limiting/rate-limiter.js +22 -12
  162. package/dist/cjs/rate-limiting/rate-limiter.js.map +1 -1
  163. package/dist/cjs/routing/controller-route-configuration.model.d.ts +5 -0
  164. package/dist/cjs/routing/controller-route-configuration.model.d.ts.map +1 -1
  165. package/dist/cjs/routing/decorators/controller.decorator.d.ts +5 -0
  166. package/dist/cjs/routing/decorators/controller.decorator.d.ts.map +1 -1
  167. package/dist/cjs/routing/decorators/controller.decorator.js +3 -2
  168. package/dist/cjs/routing/decorators/controller.decorator.js.map +1 -1
  169. package/dist/cjs/routing/decorators/create-http-decorator.function.d.ts +2 -1
  170. package/dist/cjs/routing/decorators/create-http-decorator.function.d.ts.map +1 -1
  171. package/dist/cjs/routing/decorators/create-http-decorator.function.js +2 -2
  172. package/dist/cjs/routing/decorators/create-http-decorator.function.js.map +1 -1
  173. package/dist/cjs/routing/decorators/delete.decorator.d.ts +3 -1
  174. package/dist/cjs/routing/decorators/delete.decorator.d.ts.map +1 -1
  175. package/dist/cjs/routing/decorators/delete.decorator.js +3 -2
  176. package/dist/cjs/routing/decorators/delete.decorator.js.map +1 -1
  177. package/dist/cjs/routing/decorators/get.decorator.d.ts +3 -1
  178. package/dist/cjs/routing/decorators/get.decorator.d.ts.map +1 -1
  179. package/dist/cjs/routing/decorators/get.decorator.js +3 -2
  180. package/dist/cjs/routing/decorators/get.decorator.js.map +1 -1
  181. package/dist/cjs/routing/decorators/http-decorator-option-input.model.d.ts +11 -0
  182. package/dist/cjs/routing/decorators/http-decorator-option-input.model.d.ts.map +1 -0
  183. package/dist/cjs/routing/decorators/http-decorator-option-input.model.js +3 -0
  184. package/dist/cjs/routing/decorators/http-decorator-option-input.model.js.map +1 -0
  185. package/dist/cjs/routing/decorators/patch.decorator.d.ts +3 -1
  186. package/dist/cjs/routing/decorators/patch.decorator.d.ts.map +1 -1
  187. package/dist/cjs/routing/decorators/patch.decorator.js +3 -2
  188. package/dist/cjs/routing/decorators/patch.decorator.js.map +1 -1
  189. package/dist/cjs/routing/decorators/post.decorator.d.ts +3 -1
  190. package/dist/cjs/routing/decorators/post.decorator.d.ts.map +1 -1
  191. package/dist/cjs/routing/decorators/post.decorator.js +3 -2
  192. package/dist/cjs/routing/decorators/post.decorator.js.map +1 -1
  193. package/dist/cjs/routing/resolve-route-params.function.js +1 -0
  194. package/dist/cjs/routing/resolve-route-params.function.js.map +1 -1
  195. package/dist/cjs/routing/route-configuration.model.d.ts +11 -1
  196. package/dist/cjs/routing/route-configuration.model.d.ts.map +1 -1
  197. package/dist/cjs/routing/router.d.ts +6 -2
  198. package/dist/cjs/routing/router.d.ts.map +1 -1
  199. package/dist/cjs/routing/router.js +173 -88
  200. package/dist/cjs/routing/router.js.map +1 -1
  201. package/dist/cjs/utilities/fs.utilities.d.ts +1 -1
  202. package/dist/cjs/utilities/fs.utilities.js +1 -1
  203. package/dist/cjs/utilities/sem-ver.utilities.d.ts +46 -0
  204. package/dist/cjs/utilities/sem-ver.utilities.d.ts.map +1 -0
  205. package/dist/cjs/utilities/sem-ver.utilities.js +204 -0
  206. package/dist/cjs/utilities/sem-ver.utilities.js.map +1 -0
  207. package/dist/cjs/utilities/uuid.utilities.js +2 -2
  208. package/dist/cjs/utilities/uuid.utilities.js.map +1 -1
  209. package/dist/cjs/versioning/route-with-version-data.model.d.ts +15 -0
  210. package/dist/cjs/versioning/route-with-version-data.model.d.ts.map +1 -0
  211. package/dist/cjs/versioning/route-with-version-data.model.js +3 -0
  212. package/dist/cjs/versioning/route-with-version-data.model.js.map +1 -0
  213. package/dist/cjs/versioning/supported-versions-options.model.d.ts +17 -0
  214. package/dist/cjs/versioning/supported-versions-options.model.d.ts.map +1 -0
  215. package/dist/cjs/versioning/supported-versions-options.model.js +3 -0
  216. package/dist/cjs/versioning/supported-versions-options.model.js.map +1 -0
  217. package/dist/cjs/versioning/version.model.d.ts +29 -0
  218. package/dist/cjs/versioning/version.model.d.ts.map +1 -0
  219. package/dist/{esm/types/version.type.js → cjs/versioning/version.model.js} +1 -1
  220. package/dist/cjs/versioning/version.model.js.map +1 -0
  221. package/dist/cjs/versioning/versioning-service.interface.d.ts +31 -0
  222. package/dist/cjs/versioning/versioning-service.interface.d.ts.map +1 -0
  223. package/dist/cjs/versioning/versioning-service.interface.js +3 -0
  224. package/dist/cjs/versioning/versioning-service.interface.js.map +1 -0
  225. package/dist/cjs/versioning/versioning.service.d.ts +41 -0
  226. package/dist/cjs/versioning/versioning.service.d.ts.map +1 -0
  227. package/dist/cjs/versioning/versioning.service.js +366 -0
  228. package/dist/cjs/versioning/versioning.service.js.map +1 -0
  229. package/dist/cjs/websocket/decorators/websocket-controller.decorator.d.ts +10 -0
  230. package/dist/cjs/websocket/decorators/websocket-controller.decorator.d.ts.map +1 -1
  231. package/dist/cjs/websocket/decorators/websocket-controller.decorator.js +2 -2
  232. package/dist/cjs/websocket/decorators/websocket-controller.decorator.js.map +1 -1
  233. package/dist/cjs/websocket/decorators/websocket-route.decorator.d.ts +13 -1
  234. package/dist/cjs/websocket/decorators/websocket-route.decorator.d.ts.map +1 -1
  235. package/dist/cjs/websocket/decorators/websocket-route.decorator.js +3 -2
  236. package/dist/cjs/websocket/decorators/websocket-route.decorator.js.map +1 -1
  237. package/dist/cjs/websocket/models/connection/base-websocket-connection.model.d.ts +5 -0
  238. package/dist/cjs/websocket/models/connection/base-websocket-connection.model.d.ts.map +1 -1
  239. package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.d.ts +3 -1
  240. package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.d.ts.map +1 -1
  241. package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.js +3 -1
  242. package/dist/cjs/websocket/models/connection/socket-io-websocket-connection.model.js.map +1 -1
  243. package/dist/cjs/websocket/models/websocket-controller-route-configuration.model.d.ts +6 -0
  244. package/dist/cjs/websocket/models/websocket-controller-route-configuration.model.d.ts.map +1 -1
  245. package/dist/cjs/websocket/models/websocket-message.model.d.ts +2 -2
  246. package/dist/cjs/websocket/models/websocket-message.model.d.ts.map +1 -1
  247. package/dist/cjs/websocket/models/websocket-message.model.js.map +1 -1
  248. package/dist/cjs/websocket/models/websocket-request.model.d.ts +3 -3
  249. package/dist/cjs/websocket/models/websocket-request.model.d.ts.map +1 -1
  250. package/dist/cjs/websocket/models/websocket-request.model.js +1 -1
  251. package/dist/cjs/websocket/models/websocket-request.model.js.map +1 -1
  252. package/dist/cjs/websocket/services/websocket.service.d.ts +6 -4
  253. package/dist/cjs/websocket/services/websocket.service.d.ts.map +1 -1
  254. package/dist/cjs/websocket/services/websocket.service.js +121 -33
  255. package/dist/cjs/websocket/services/websocket.service.js.map +1 -1
  256. package/dist/esm/application.js +0 -1
  257. package/dist/esm/application.js.map +1 -1
  258. package/dist/esm/assets/asset.service.js +3 -1
  259. package/dist/esm/assets/asset.service.js.map +1 -1
  260. package/dist/esm/auth/2fa/methods/otp/otp-credentials.model.js.map +1 -1
  261. package/dist/esm/auth/2fa/methods/otp/otp.two-factor-method.js +1 -1
  262. package/dist/esm/auth/2fa/methods/otp/otp.two-factor-method.js.map +1 -1
  263. package/dist/esm/auth/strategies/cookie/cookie-auth.controller.js +1 -1
  264. package/dist/esm/auth/strategies/cookie/cookie-auth.controller.js.map +1 -1
  265. package/dist/esm/auth/strategies/jwt/jwt-auth.controller.js +1 -1
  266. package/dist/esm/auth/strategies/jwt/jwt-auth.controller.js.map +1 -1
  267. package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js +1 -1
  268. package/dist/esm/auth/strategies/jwt/jwt.auth-strategy.js.map +1 -1
  269. package/dist/esm/backup/backup-resource-entity.model.js.map +1 -1
  270. package/dist/esm/change-sets/models/change-set.model.js +1 -1
  271. package/dist/esm/change-sets/models/change-set.model.js.map +1 -1
  272. package/dist/esm/change-sets/models/change.model.js.map +1 -1
  273. package/dist/esm/context/cache/cache.context.js +2 -2
  274. package/dist/esm/context/cache/cache.context.js.map +1 -1
  275. package/dist/esm/context/request/request-context-token.model.js +1 -1
  276. package/dist/esm/context/request/request-context-token.model.js.map +1 -1
  277. package/dist/esm/cron/cron-job-entity.model.js.map +1 -1
  278. package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js +9 -0
  279. package/dist/esm/data-source/data-sources/postgres-typeorm-data-source.model.js.map +1 -1
  280. package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js +3 -3
  281. package/dist/esm/data-source/data-sources/typeorm-base-data-source.model.js.map +1 -1
  282. package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js +20 -0
  283. package/dist/esm/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.js.map +1 -1
  284. package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js +3 -1
  285. package/dist/esm/data-source/data-sources/where-converter/typeorm-where-filter.converter.js.map +1 -1
  286. package/dist/esm/data-source/migration/migration-entity.model.js.map +1 -1
  287. package/dist/esm/data-source/models/where/where-filter-keys.model.js +3 -0
  288. package/dist/esm/data-source/models/where/where-filter-keys.model.js.map +1 -1
  289. package/dist/esm/di/default/zibri-di-providers.default.js +4 -0
  290. package/dist/esm/di/default/zibri-di-providers.default.js.map +1 -1
  291. package/dist/esm/di/default/zibri-di-tokens.default.js +2 -0
  292. package/dist/esm/di/default/zibri-di-tokens.default.js.map +1 -1
  293. package/dist/esm/email/email.service.js +4 -4
  294. package/dist/esm/email/email.service.js.map +1 -1
  295. package/dist/esm/email/models/email.model.js +4 -4
  296. package/dist/esm/email/models/email.model.js.map +1 -1
  297. package/dist/esm/entity/generation/generate-entity-file.function.js +1 -1
  298. package/dist/esm/entity/generation/generate-entity-file.function.js.map +1 -1
  299. package/dist/esm/event/event-subscriber-run.model.js +1 -1
  300. package/dist/esm/event/event-subscriber-run.model.js.map +1 -1
  301. package/dist/esm/http/known-header.enum.js +1 -0
  302. package/dist/esm/http/known-header.enum.js.map +1 -1
  303. package/dist/esm/http-client/http-client.js.map +1 -1
  304. package/dist/esm/index.js +8 -3
  305. package/dist/esm/index.js.map +1 -1
  306. package/dist/esm/localization/formatting/format-price.function.js.map +1 -1
  307. package/dist/esm/logging/log-context.model.js +6 -6
  308. package/dist/esm/logging/log-context.model.js.map +1 -1
  309. package/dist/esm/logging/logger.js +1 -1
  310. package/dist/esm/logging/logger.js.map +1 -1
  311. package/dist/esm/multithreading/models/thread-job-entity.model.js +4 -4
  312. package/dist/esm/multithreading/models/thread-job-entity.model.js.map +1 -1
  313. package/dist/esm/multithreading/services/thread-job.js.map +1 -1
  314. package/dist/esm/open-api/open-api.service.js +256 -139
  315. package/dist/esm/open-api/open-api.service.js.map +1 -1
  316. package/dist/esm/parsing/html/csp-options.model.js.map +1 -1
  317. package/dist/esm/parsing/parser.js +3 -3
  318. package/dist/esm/parsing/parser.js.map +1 -1
  319. package/dist/esm/plugin/invoicing/models/invoice-address.model.js +2 -2
  320. package/dist/esm/plugin/invoicing/models/invoice-address.model.js.map +1 -1
  321. package/dist/esm/plugin/invoicing/models/vat.model.js +1 -1
  322. package/dist/esm/plugin/invoicing/models/vat.model.js.map +1 -1
  323. package/dist/esm/plugin/mailing-list/mailing-list.controller.js +1 -1
  324. package/dist/esm/plugin/mailing-list/mailing-list.controller.js.map +1 -1
  325. package/dist/esm/plugin/mailing-list/models/mailing-list-subscriber.model.js +1 -1
  326. package/dist/esm/plugin/mailing-list/models/mailing-list-subscriber.model.js.map +1 -1
  327. package/dist/esm/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js +1 -1
  328. package/dist/esm/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.js.map +1 -1
  329. package/dist/esm/plugin/payment/models/payment.model.js +1 -1
  330. package/dist/esm/plugin/payment/models/payment.model.js.map +1 -1
  331. package/dist/esm/plugin/payment/providers/pay-pal/pay-pal-client.js +17 -17
  332. package/dist/esm/plugin/payment/providers/pay-pal/pay-pal-client.js.map +1 -1
  333. package/dist/esm/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js +1 -1
  334. package/dist/esm/plugin/payment/providers/pay-pal/pay-pal.payment-provider.js.map +1 -1
  335. package/dist/esm/preact/preact.utilities.js +1 -1
  336. package/dist/esm/preact/preact.utilities.js.map +1 -1
  337. package/dist/esm/preact/validate-email-templates.function.js +1 -1
  338. package/dist/esm/preact/validate-email-templates.function.js.map +1 -1
  339. package/dist/esm/rate-limiting/rate-limiter.js +22 -12
  340. package/dist/esm/rate-limiting/rate-limiter.js.map +1 -1
  341. package/dist/esm/routing/decorators/controller.decorator.js +3 -2
  342. package/dist/esm/routing/decorators/controller.decorator.js.map +1 -1
  343. package/dist/esm/routing/decorators/create-http-decorator.function.js +2 -2
  344. package/dist/esm/routing/decorators/create-http-decorator.function.js.map +1 -1
  345. package/dist/esm/routing/decorators/delete.decorator.js +3 -2
  346. package/dist/esm/routing/decorators/delete.decorator.js.map +1 -1
  347. package/dist/esm/routing/decorators/get.decorator.js +3 -2
  348. package/dist/esm/routing/decorators/get.decorator.js.map +1 -1
  349. package/dist/esm/routing/decorators/http-decorator-option-input.model.js +3 -0
  350. package/dist/esm/routing/decorators/http-decorator-option-input.model.js.map +1 -0
  351. package/dist/esm/routing/decorators/patch.decorator.js +3 -2
  352. package/dist/esm/routing/decorators/patch.decorator.js.map +1 -1
  353. package/dist/esm/routing/decorators/post.decorator.js +3 -2
  354. package/dist/esm/routing/decorators/post.decorator.js.map +1 -1
  355. package/dist/esm/routing/resolve-route-params.function.js +1 -0
  356. package/dist/esm/routing/resolve-route-params.function.js.map +1 -1
  357. package/dist/esm/routing/router.js +173 -88
  358. package/dist/esm/routing/router.js.map +1 -1
  359. package/dist/esm/utilities/fs.utilities.js +1 -1
  360. package/dist/esm/utilities/sem-ver.utilities.js +204 -0
  361. package/dist/esm/utilities/sem-ver.utilities.js.map +1 -0
  362. package/dist/esm/utilities/uuid.utilities.js +2 -2
  363. package/dist/esm/utilities/uuid.utilities.js.map +1 -1
  364. package/dist/esm/versioning/route-with-version-data.model.js +3 -0
  365. package/dist/esm/versioning/route-with-version-data.model.js.map +1 -0
  366. package/dist/esm/versioning/supported-versions-options.model.js +3 -0
  367. package/dist/esm/versioning/supported-versions-options.model.js.map +1 -0
  368. package/dist/{cjs/types/version.type.js → esm/versioning/version.model.js} +1 -1
  369. package/dist/esm/versioning/version.model.js.map +1 -0
  370. package/dist/esm/versioning/versioning-service.interface.js +3 -0
  371. package/dist/esm/versioning/versioning-service.interface.js.map +1 -0
  372. package/dist/esm/versioning/versioning.service.js +366 -0
  373. package/dist/esm/versioning/versioning.service.js.map +1 -0
  374. package/dist/esm/websocket/decorators/websocket-controller.decorator.js +2 -2
  375. package/dist/esm/websocket/decorators/websocket-controller.decorator.js.map +1 -1
  376. package/dist/esm/websocket/decorators/websocket-route.decorator.js +3 -2
  377. package/dist/esm/websocket/decorators/websocket-route.decorator.js.map +1 -1
  378. package/dist/esm/websocket/models/connection/socket-io-websocket-connection.model.js +3 -1
  379. package/dist/esm/websocket/models/connection/socket-io-websocket-connection.model.js.map +1 -1
  380. package/dist/esm/websocket/models/websocket-message.model.js.map +1 -1
  381. package/dist/esm/websocket/models/websocket-request.model.js +1 -1
  382. package/dist/esm/websocket/models/websocket-request.model.js.map +1 -1
  383. package/dist/esm/websocket/services/websocket.service.js +121 -33
  384. package/dist/esm/websocket/services/websocket.service.js.map +1 -1
  385. package/package.json +17 -19
  386. package/src/__testing__/test-server/providers.ts +25 -1
  387. package/src/__testing__/test-server/start-test-server.function.ts +76 -8
  388. package/src/application-options.model.ts +2 -2
  389. package/src/application.ts +0 -1
  390. package/src/assets/asset.service.ts +3 -1
  391. package/src/auth/2fa/methods/otp/otp-credentials.model.ts +1 -1
  392. package/src/auth/2fa/methods/otp/otp.two-factor-method.ts +1 -1
  393. package/src/auth/strategies/cookie/cookie-auth.controller.ts +1 -1
  394. package/src/auth/strategies/jwt/jwt-auth.controller.ts +1 -1
  395. package/src/auth/strategies/jwt/jwt.auth-strategy.ts +1 -1
  396. package/src/backup/backup-resource-entity.model.ts +1 -1
  397. package/src/backup/backup-service.test.ts +2 -1
  398. package/src/change-sets/models/change-set.model.ts +1 -1
  399. package/src/change-sets/models/change.model.ts +2 -2
  400. package/src/context/cache/cache.context.ts +2 -2
  401. package/src/context/request/request-context-token.model.ts +1 -1
  402. package/src/cron/cron-job-entity.model.ts +2 -2
  403. package/src/data-source/data-sources/postgres-typeorm-data-source.model.ts +10 -0
  404. package/src/data-source/data-sources/typeorm-base-data-source.model.ts +4 -5
  405. package/src/data-source/data-sources/where-converter/postgres-typeorm-where-filter.converter.ts +35 -2
  406. package/src/data-source/data-sources/where-converter/typeorm-where-filter.converter.ts +14 -1
  407. package/src/data-source/hooks/hooks.test.ts +1 -1
  408. package/src/data-source/migration/migration-entity.model.ts +2 -2
  409. package/src/data-source/migration/migration.model.ts +2 -2
  410. package/src/data-source/migration/migration.test.ts +2 -2
  411. package/src/data-source/models/where/date-where-filter.model.ts +11 -3
  412. package/src/data-source/models/where/string-where-filter.model.ts +18 -1
  413. package/src/data-source/models/where/where-filter-keys.model.ts +3 -0
  414. package/src/data-source/nested-where-filter.test.ts +8 -3
  415. package/src/data-source/repository.test.ts +2 -2
  416. package/src/data-source/where-filter.test.ts +17 -7
  417. package/src/di/default/zibri-di-providers.default.ts +4 -0
  418. package/src/di/default/zibri-di-tokens.default.ts +3 -0
  419. package/src/email/email.service.ts +5 -5
  420. package/src/email/models/email.model.ts +4 -4
  421. package/src/entity/generation/generate-entity-file.function.ts +1 -1
  422. package/src/event/event-subscriber-run.model.ts +1 -1
  423. package/src/global/global-registry.ts +2 -2
  424. package/src/http/http-request.model.ts +2 -2
  425. package/src/http/known-header.enum.ts +1 -0
  426. package/src/http-client/http-client.ts +0 -1
  427. package/src/index.ts +9 -3
  428. package/src/localization/formatting/format-price.function.ts +2 -3
  429. package/src/logging/log-context.model.ts +6 -6
  430. package/src/logging/logger.ts +1 -1
  431. package/src/multithreading/models/thread-job-entity.model.ts +5 -5
  432. package/src/multithreading/services/thread-job.ts +4 -4
  433. package/src/open-api/open-api-service.interface.ts +2 -1
  434. package/src/open-api/open-api.service.ts +263 -141
  435. package/src/parsing/html/csp-options.model.ts +3 -0
  436. package/src/parsing/parser.ts +3 -3
  437. package/src/plugin/invoicing/models/invoice-address.model.ts +2 -2
  438. package/src/plugin/invoicing/models/vat.model.ts +1 -1
  439. package/src/plugin/mailing-list/mailing-list.controller.ts +1 -1
  440. package/src/plugin/mailing-list/models/mailing-list-subscriber.model.ts +1 -1
  441. package/src/plugin/mailing-list/models/mailing-list-subscription-confirmation-token.model.ts +1 -1
  442. package/src/plugin/payment/models/payment.model.ts +2 -2
  443. package/src/plugin/payment/providers/pay-pal/pay-pal-client.ts +17 -17
  444. package/src/plugin/payment/providers/pay-pal/pay-pal.payment-provider.test.ts +1 -1
  445. package/src/plugin/payment/providers/pay-pal/pay-pal.payment-provider.ts +1 -1
  446. package/src/preact/preact.utilities.ts +1 -1
  447. package/src/preact/validate-email-templates.function.ts +1 -1
  448. package/src/rate-limiting/rate-limiter.ts +23 -12
  449. package/src/routing/controller-route-configuration.model.ts +6 -1
  450. package/src/routing/decorators/controller.decorator.ts +8 -2
  451. package/src/routing/decorators/create-http-decorator.function.ts +3 -2
  452. package/src/routing/decorators/delete.decorator.ts +4 -2
  453. package/src/routing/decorators/get.decorator.ts +4 -2
  454. package/src/routing/decorators/http-decorator-option-input.model.ts +11 -0
  455. package/src/routing/decorators/patch.decorator.ts +4 -2
  456. package/src/routing/decorators/post.decorator.ts +4 -2
  457. package/src/routing/resolve-route-params.function.ts +1 -0
  458. package/src/routing/route-configuration.model.ts +13 -3
  459. package/src/routing/router.ts +265 -134
  460. package/src/utilities/fs.utilities.ts +1 -1
  461. package/src/utilities/sem-ver.utilities.ts +270 -0
  462. package/src/utilities/uuid.utilities.ts +2 -2
  463. package/src/versioning/route-with-version-data.model.ts +15 -0
  464. package/src/versioning/supported-versions-options.model.ts +25 -0
  465. package/src/versioning/version.model.ts +30 -0
  466. package/src/versioning/versioning-service.interface.ts +39 -0
  467. package/src/versioning/versioning-websocket.test.ts +351 -0
  468. package/src/versioning/versioning.service.test.ts +582 -0
  469. package/src/versioning/versioning.service.ts +496 -0
  470. package/src/websocket/decorators/websocket-controller.decorator.ts +13 -3
  471. package/src/websocket/decorators/websocket-route.decorator.ts +15 -2
  472. package/src/websocket/models/connection/base-websocket-connection.model.ts +6 -0
  473. package/src/websocket/models/connection/socket-io-websocket-connection.model.ts +8 -1
  474. package/src/websocket/models/websocket-controller-route-configuration.model.ts +8 -1
  475. package/src/websocket/models/websocket-message.model.ts +2 -2
  476. package/src/websocket/models/websocket-request.model.ts +4 -3
  477. package/src/websocket/services/websocket.service.ts +143 -38
  478. package/dist/cjs/types/version.type.d.ts +0 -5
  479. package/dist/cjs/types/version.type.d.ts.map +0 -1
  480. package/dist/cjs/types/version.type.js.map +0 -1
  481. package/dist/cjs/utilities/compare-versions.function.d.ts +0 -9
  482. package/dist/cjs/utilities/compare-versions.function.d.ts.map +0 -1
  483. package/dist/cjs/utilities/compare-versions.function.js +0 -33
  484. package/dist/cjs/utilities/compare-versions.function.js.map +0 -1
  485. package/dist/cjs/utilities/is-version.function.d.ts +0 -7
  486. package/dist/cjs/utilities/is-version.function.d.ts.map +0 -1
  487. package/dist/cjs/utilities/is-version.function.js +0 -18
  488. package/dist/cjs/utilities/is-version.function.js.map +0 -1
  489. package/dist/esm/types/version.type.js.map +0 -1
  490. package/dist/esm/utilities/compare-versions.function.js +0 -33
  491. package/dist/esm/utilities/compare-versions.function.js.map +0 -1
  492. package/dist/esm/utilities/is-version.function.js +0 -18
  493. package/dist/esm/utilities/is-version.function.js.map +0 -1
  494. package/src/types/version.type.ts +0 -4
  495. package/src/utilities/compare-versions.function.ts +0 -33
  496. package/src/utilities/is-version.function.ts +0 -16
@@ -58,7 +58,9 @@ export class AssetService implements AssetServiceInterface, OnAppInit {
58
58
  await inject(ZIBRI_DI_TOKENS.ROUTER).registerRoute({
59
59
  httpMethod: HttpMethod.GET,
60
60
  route: '/favicon.ico',
61
- handler: () => FileResponse.fromPath(FsUtilities.getPath(this.publicAssetsPath, 'favicon.png'))
61
+ handler: () => FileResponse.fromPath(FsUtilities.getPath(this.publicAssetsPath, 'favicon.png')),
62
+ versions: 'all',
63
+ openApi: { useInOpenApi: false }
62
64
  });
63
65
 
64
66
  }
@@ -27,7 +27,7 @@ export class OtpCredentials extends BaseEntity {
27
27
  * The two factor url that is needed to display a qr code.
28
28
  */
29
29
  @Property.string({ required: false })
30
- qrCodeUrl: string | undefined;
30
+ qrCodeUrl: string | undefined | null;
31
31
  }
32
32
 
33
33
  /**
@@ -84,7 +84,7 @@ export class OtpTwoFactorMethod implements TwoFactorMethod<never, OtpConfirmRegi
84
84
  }
85
85
 
86
86
  private extractTokenFromRequestContext(context: HttpRequestContext | WebsocketRequestContext): string {
87
- const code: string | undefined = context.request.headers[this.otpHeader];
87
+ const code: string | undefined = context.request.headers?.[this.otpHeader];
88
88
  if (!code) {
89
89
  throw new UnauthorizedError(`"${this.otpHeader}" header not found`);
90
90
  }
@@ -43,7 +43,7 @@ class CookieAuthRefreshLoginDto extends OmitClass(CookieAuthRefreshLoginData, ['
43
43
 
44
44
  class CookieAuthLogoutDto extends OmitClass(CookieAuthLogoutData, ['transaction']) {}
45
45
 
46
- @Controller('/auth', { allowOrphan: true })
46
+ @Controller('/auth', { allowOrphan: true, versions: 'all' })
47
47
  export class CookieAuthController implements AuthControllerInterface<
48
48
  CookieAuthCredentialsDto,
49
49
  CookieAuthData<string>,
@@ -56,7 +56,7 @@ class JwtConfirmPasswordResetDto extends OmitClass(JwtConfirmPasswordResetData,
56
56
 
57
57
  class JwtRefreshLoginDto extends OmitClass(JwtRefreshLoginData, ['transaction']) {}
58
58
 
59
- @Controller('/auth', { allowOrphan: true })
59
+ @Controller('/auth', { allowOrphan: true, versions: 'all' })
60
60
  export class JwtAuthController implements AuthControllerInterface<
61
61
  JwtCredentialsDto,
62
62
  JwtAuthData<string>,
@@ -383,7 +383,7 @@ implements AuthStrategyInterface<
383
383
  private extractAccessTokenFromRequestContext(
384
384
  context: HttpRequestContext | WebsocketRequestContext
385
385
  ): string | undefined {
386
- const authHeader: string | string[] | undefined = context.request.headers.authorization;
386
+ const authHeader: string | string[] | undefined = context.request.headers?.authorization;
387
387
  if (authHeader == undefined || typeof authHeader !== 'string') {
388
388
  return undefined;
389
389
  }
@@ -18,7 +18,7 @@ export class BackupResourceEntity extends BaseEntity {
18
18
  * The size of the resource in bytes.
19
19
  */
20
20
  @Property.number({ required: false })
21
- size: number | undefined;
21
+ size: number | undefined | null;
22
22
  /**
23
23
  * Whether or not the backup of this resource has been completed.
24
24
  */
@@ -17,6 +17,7 @@ import { BaseEntity } from '../entity/base-entity.model';
17
17
  import { Entity } from '../entity/decorators/entity.decorator';
18
18
  import { Property } from '../entity/decorators/property.decorator';
19
19
  import { Newable } from '../types/newable.type';
20
+ import { OmitStrict } from '../types/omit-strict.type';
20
21
  import { FsUtilities, FsPath } from '../utilities/fs.utilities';
21
22
 
22
23
  const backupFsFolder: FsPath = FsUtilities.getPath(testFileFolder, 'backups');
@@ -42,7 +43,7 @@ class Item {
42
43
  class DbDataSource extends PostgresDataSource {
43
44
  rootPw: string = 'password';
44
45
  rootUsername: string = 'postgres';
45
- options: PostgresOptions = {
46
+ options: OmitStrict<PostgresOptions, 'type'> = {
46
47
  host: 'localhost',
47
48
  username: 'postgres',
48
49
  password: 'password',
@@ -26,7 +26,7 @@ export class ChangeSet extends BaseEntity {
26
26
  * The id of the user that changed something.
27
27
  */
28
28
  @Property.string({ format: 'uuid', required: false })
29
- createdBy?: string;
29
+ createdBy?: string | null;
30
30
  /**
31
31
  * The things that have been changed.
32
32
  */
@@ -18,12 +18,12 @@ export class Change<T = unknown> extends BaseEntity {
18
18
  * The value before it was changed.
19
19
  */
20
20
  @Property.unknown({ required: false })
21
- previousValue?: T;
21
+ previousValue?: T | null;
22
22
  /**
23
23
  * The value after it was changed.
24
24
  */
25
25
  @Property.unknown({ required: false })
26
- newValue?: T;
26
+ newValue?: T | null;
27
27
  /**
28
28
  * The change set that this change belongs to.
29
29
  */
@@ -24,10 +24,10 @@ export class CacheContext {
24
24
  * Whether or not the cache has been hit.
25
25
  */
26
26
  @Property.boolean({ required: false })
27
- hit?: boolean;
27
+ hit?: boolean | null;
28
28
  /**
29
29
  * The duration that the original function took.
30
30
  */
31
31
  @Property.number({ required: false })
32
- durationInMs?: number;
32
+ durationInMs?: number | null;
33
33
  }
@@ -51,7 +51,7 @@ export const ZIBRI_REQUEST_CONTEXT_TOKENS = {
51
51
  'correlation_id',
52
52
  ctx => {
53
53
  const correlationIdHeader: string = inject(ZIBRI_DI_TOKENS.CORRELATION_ID_HEADER);
54
- return ctx.request.headers[correlationIdHeader as KnownHeader] ?? UUIDUtilities.generate();
54
+ return ctx.request.headers?.[correlationIdHeader as KnownHeader] ?? UUIDUtilities.generate();
55
55
  }
56
56
  ),
57
57
  CURRENT_USER: new RequestContextToken(
@@ -43,13 +43,13 @@ export class CronJobEntity extends BaseEntity {
43
43
  * The timestamp at which this cron job has been last run.
44
44
  */
45
45
  @Property.date({ required: false })
46
- lastRun!: Date | undefined;
46
+ lastRun?: Date | null;
47
47
 
48
48
  /**
49
49
  * The error message that this cron job failed with.
50
50
  */
51
51
  @Property.string({ required: false })
52
- errorMessage!: string | undefined;
52
+ errorMessage?: string | null;
53
53
  }
54
54
 
55
55
  /**
@@ -73,6 +73,16 @@ export abstract class PostgresDataSource extends TypeOrmBaseDataSource<PostgresO
73
73
  super(logger, authService);
74
74
  }
75
75
 
76
+ // eslint-disable-next-line jsdoc/require-jsdoc
77
+ async init(): Promise<void> {
78
+ await super.init();
79
+ if (!this.ds) {
80
+ throw new DataSourceInitializationError();
81
+ }
82
+ // eslint-disable-next-line cspell/spellchecker
83
+ await this.ds.query('CREATE EXTENSION IF NOT EXISTS pg_trgm');
84
+ }
85
+
76
86
  // eslint-disable-next-line jsdoc/require-jsdoc
77
87
  query<T extends BaseEntity>(entityClass: Newable<T>, options?: QueryOptions): QueryBuilder<T> {
78
88
  if (!this.ds) {
@@ -28,10 +28,9 @@ import { type LoggerInterface } from '../../logging/logger.interface';
28
28
  import { ExcludeStrict } from '../../types/exclude-strict.type';
29
29
  import { Newable } from '../../types/newable.type';
30
30
  import { OmitStrict } from '../../types/omit-strict.type';
31
- import { Version } from '../../types/version.type';
32
- import { compareVersion } from '../../utilities/compare-versions.function';
33
31
  import { MetadataUtilities } from '../../utilities/metadata.utilities';
34
32
  import { ObjectUtilities } from '../../utilities/object.utilities';
33
+ import { SemVerUtilities, SemVerVersion } from '../../utilities/sem-ver.utilities';
35
34
  import { TypeOrmUtilities } from '../../utilities/typeorm.utilities';
36
35
  import { getDefaultBeforeReturnHook, getDefaultBeforeSaveHook } from '../hooks/hooks.default';
37
36
  import { MigrationEntity } from '../migration/migration-entity.model';
@@ -217,19 +216,19 @@ export abstract class TypeOrmBaseDataSource<TOptions extends DataSourceOptions>
217
216
  const finishedMigrationVersions: string[] = (await migrationsRepository.findAll()).map(m => m.version);
218
217
  const allMigrations: MigrationWithName[] = this.migrations.map(m => ({ migration: inject(m), name: m.name }));
219
218
 
220
- const appVersion: Version | undefined = GlobalRegistry.getAppData('version');
219
+ const appVersion: SemVerVersion | undefined = GlobalRegistry.getAppData('version');
221
220
  if (!appVersion) {
222
221
  throw new Error('Couldn\'t run migrations: No app version could be resolved');
223
222
  }
224
223
 
225
224
  const migrationsToRunUp: MigrationWithName[] = allMigrations.filter(m => {
226
225
  return !finishedMigrationVersions.includes(m.migration.version)
227
- && compareVersion(m.migration.version, appVersion) !== 'bigger';
226
+ && SemVerUtilities.compare(m.migration.version, appVersion) !== 'bigger';
228
227
  });
229
228
 
230
229
  const migrationsToRunDown: MigrationWithName[] = allMigrations.filter(m => {
231
230
  return finishedMigrationVersions.includes(m.migration.version)
232
- && compareVersion(m.migration.version, appVersion) === 'bigger';
231
+ && SemVerUtilities.compare(m.migration.version, appVersion) === 'bigger';
233
232
  });
234
233
 
235
234
  for (const migration of migrationsToRunUp) {
@@ -1,7 +1,7 @@
1
1
  import { Raw, FindOperator, DataSource as ToDataSource } from 'typeorm';
2
2
  import { RelationMetadata as ToRelationMetadata } from 'typeorm/metadata/RelationMetadata.js';
3
3
 
4
- import { TypeOrmWhereFilterConverter } from './typeorm-where-filter.converter';
4
+ import { TypeOrmWhereFilterConverter, WhereFilterHandler } from './typeorm-where-filter.converter';
5
5
  import { BaseEntity } from '../../../entity/base-entity.model';
6
6
  import { EntityMetadata } from '../../../entity/decorators/entity.decorator';
7
7
  import { PropertyMetadata, RelationMetadata } from '../../../entity/decorators/property.decorator';
@@ -9,6 +9,7 @@ import { EntityMetadataMissingError } from '../../../entity/entity-metadata-miss
9
9
  import { Relation } from '../../../entity/models/relation.enum';
10
10
  import { Newable } from '../../../types/newable.type';
11
11
  import { MetadataUtilities } from '../../../utilities/metadata.utilities';
12
+ import { NumberUtilities } from '../../../utilities/number.utilities';
12
13
  import { WhereFilterKeys } from '../../models/where/where-filter-keys.model';
13
14
  import { Where } from '../../models/where/where-filter.model';
14
15
 
@@ -32,7 +33,7 @@ type JsonbOperatorHandler = (
32
33
  */
33
34
  export class PostgresTypeOrmWhereFilterConverter extends TypeOrmWhereFilterConverter {
34
35
 
35
- private readonly jsonbOperatorHandlers: Record<string, JsonbOperatorHandler> = {
36
+ private readonly jsonbOperatorHandlers: Record<WhereFilterKeys, JsonbOperatorHandler> = {
36
37
  is: (jp, _tp, _cp, val) => val === null
37
38
  ? `${jp} = 'null'::jsonb`
38
39
  : `${jp} @> ${this.toJsonbLiteral(val as object)}`,
@@ -59,12 +60,27 @@ export class PostgresTypeOrmWhereFilterConverter extends TypeOrmWhereFilterConve
59
60
  },
60
61
  like: (_jp, tp, _cp, val) => `${tp} LIKE ${this.toSqlLiteral(val)}`,
61
62
  iLike: (_jp, tp, _cp, val) => `${tp} ILIKE ${this.toSqlLiteral(val)}`,
63
+ fuzzyLike: (_jp, tp, _cp, val) => {
64
+ if (typeof val !== 'object' || !('value' in (val as object))) {
65
+ throw new Error('fuzzyLike expects an object with a "value" property');
66
+ }
67
+ const { value: searchString, minSimilarity = 0.3 } = val as {
68
+ // eslint-disable-next-line jsdoc/require-jsdoc
69
+ value: string,
70
+ // eslint-disable-next-line jsdoc/require-jsdoc
71
+ minSimilarity?: number
72
+ };
73
+ const safeSearch: string = this.toSqlLiteral(searchString);
74
+ return `similarity(${tp}, ${safeSearch}) >= ${NumberUtilities.divide(minSimilarity, 100)}`;
75
+ },
62
76
  greaterThan: (_jp, _tp, cp, val) => `${cp} > ${this.toSqlLiteral(val)}`,
63
77
  after: (_jp, _tp, cp, val) => `${cp} > ${this.toSqlLiteral(val)}`,
64
78
  greaterThanEquals: (_jp, _tp, cp, val) => `${cp} >= ${this.toSqlLiteral(val)}`,
79
+ afterOrOn: (_jp, _tp, cp, val) => `${cp} >= ${this.toSqlLiteral(val)}`,
65
80
  lesserThan: (_jp, _tp, cp, val) => `${cp} < ${this.toSqlLiteral(val)}`,
66
81
  before: (_jp, _tp, cp, val) => `${cp} < ${this.toSqlLiteral(val)}`,
67
82
  lesserThanEquals: (_jp, _tp, cp, val) => `${cp} <= ${this.toSqlLiteral(val)}`,
83
+ beforeOrOn: (_jp, _tp, cp, val) => `${cp} <= ${this.toSqlLiteral(val)}`,
68
84
  length: (jp, _tp, _cp, val) => `jsonb_array_length(${jp}) = ${this.toSqlLiteral(val)}`,
69
85
  lengthGreaterThan: (jp, _tp, _cp, val) => `jsonb_array_length(${jp}) > ${this.toSqlLiteral(val)}`,
70
86
  lengthGreaterThanEquals: (jp, _tp, _cp, val) => `jsonb_array_length(${jp}) >= ${this.toSqlLiteral(val)}`,
@@ -89,6 +105,23 @@ export class PostgresTypeOrmWhereFilterConverter extends TypeOrmWhereFilterConve
89
105
  super(dataSource);
90
106
  }
91
107
 
108
+ // eslint-disable-next-line jsdoc/require-jsdoc
109
+ protected fuzzyLikeWhereFilterHandler: WhereFilterHandler = (value) => {
110
+ if (typeof value !== 'object' || value === null || !('value' in value)) {
111
+ throw new Error('fuzzyLike expects an object with a "value" property');
112
+ }
113
+ const { value: searchString, minSimilarity = 30 } = value as {
114
+ // eslint-disable-next-line jsdoc/require-jsdoc
115
+ value: string,
116
+ // eslint-disable-next-line jsdoc/require-jsdoc
117
+ minSimilarity?: number
118
+ };
119
+ const safeSearch: string = this.toSqlLiteral(searchString); // produces e.g. 'hello'
120
+ return Raw(
121
+ alias => `similarity(${alias}, ${safeSearch}) >= ${NumberUtilities.divide(minSimilarity, 100)}`
122
+ );
123
+ };
124
+
92
125
  // ── JSONB-aware "where" handler ─────────────────────────────
93
126
 
94
127
  // eslint-disable-next-line jsdoc/require-jsdoc
@@ -34,6 +34,12 @@ export type WhereFilterHandler = (
34
34
  * Abstract base converter that transforms a Zibri WhereFilter into a TypeORM FindOptionsWhere.
35
35
  */
36
36
  export abstract class TypeOrmWhereFilterConverter {
37
+
38
+ /**
39
+ * Handler for a fuzzyLike filter.
40
+ */
41
+ protected abstract fuzzyLikeWhereFilterHandler: WhereFilterHandler;
42
+
37
43
  /**
38
44
  * A map that defines how Zibri's where filter properties are mapped to their typeorm counterpart.
39
45
  */
@@ -54,11 +60,19 @@ export abstract class TypeOrmWhereFilterConverter {
54
60
  },
55
61
  after: (value) => MoreThan(value),
56
62
  before: (value) => LessThan(value),
63
+ afterOrOn: (value) => MoreThanOrEqual(value),
64
+ beforeOrOn: (value) => LessThanOrEqual(value),
57
65
  greaterThan: (value) => MoreThan(value),
58
66
  greaterThanEquals: (value) => MoreThanOrEqual(value),
59
67
  lesserThan: (value) => LessThan(value),
60
68
  lesserThanEquals: (value) => LessThanOrEqual(value),
61
69
  iLike: (value) => ILike(value),
70
+ fuzzyLike: (value, metadata, nestedProperties, entityClass) => this.fuzzyLikeWhereFilterHandler(
71
+ value,
72
+ metadata,
73
+ nestedProperties,
74
+ entityClass
75
+ ),
62
76
  is: (value, metadata) => {
63
77
  if (value === null) {
64
78
  return IsNull();
@@ -67,7 +81,6 @@ export abstract class TypeOrmWhereFilterConverter {
67
81
  if (
68
82
  (metadata.type === Relation.MANY_TO_ONE
69
83
  || metadata.type === Relation.BELONGS_TO_ONE)
70
- && value !== null
71
84
  && typeof value === 'object'
72
85
  && !Array.isArray(value)
73
86
  && 'id' in value
@@ -33,7 +33,7 @@ class HookTestEntity extends BaseEntity implements ChangeSetEntity, SoftDeleteEn
33
33
  isActive!: boolean; // default value set on create
34
34
 
35
35
  @Property.string({ required: false, excludeFromChangeSets: true })
36
- internalNote?: string; // excluded from change sets
36
+ internalNote?: string | null; // excluded from change sets
37
37
 
38
38
  @Property.boolean({ default: false })
39
39
  deleted!: boolean; // required by SoftDeleteEntity
@@ -1,7 +1,7 @@
1
1
  import { BaseEntity } from '../../entity/base-entity.model';
2
2
  import { Entity } from '../../entity/decorators/entity.decorator';
3
3
  import { Property } from '../../entity/decorators/property.decorator';
4
- import { type Version } from '../../types/version.type';
4
+ import { type SemVerVersion } from '../../utilities/sem-ver.utilities';
5
5
 
6
6
  /**
7
7
  * The migration entity that is stored in the db.
@@ -18,7 +18,7 @@ export class MigrationEntity extends BaseEntity {
18
18
  * The version at which this migration should run.
19
19
  */
20
20
  @Property.string({ unique: true })
21
- version!: Version;
21
+ version!: SemVerVersion;
22
22
 
23
23
  /**
24
24
  * The timestamp at which the migration ran.
@@ -2,7 +2,7 @@ import { MigrationEntity } from './migration-entity.model';
2
2
  import { repositoryTokenFor } from '../../di/decorators/inject-repository.decorator';
3
3
  import { inject } from '../../di/inject.function';
4
4
  import { Newable } from '../../types/newable.type';
5
- import { Version } from '../../types/version.type';
5
+ import { SemVerVersion } from '../../utilities/sem-ver.utilities';
6
6
  import { DataSourceInterface } from '../data-sources/data-source.interface';
7
7
  import { Repository } from '../repository';
8
8
  import { Transaction } from '../transaction/transaction.model';
@@ -11,7 +11,7 @@ import { Transaction } from '../transaction/transaction.model';
11
11
  * Base class for a data source migration.
12
12
  */
13
13
  export abstract class Migration {
14
- abstract readonly version: Version;
14
+ abstract readonly version: SemVerVersion;
15
15
  /**
16
16
  * The data source that the migration is for.
17
17
  */
@@ -20,7 +20,7 @@ import { Property } from '../../entity/decorators/property.decorator';
20
20
  import { GlobalRegistry } from '../../global/global-registry';
21
21
  import { Newable } from '../../types/newable.type';
22
22
  import { OmitStrict } from '../../types/omit-strict.type';
23
- import { Version } from '../../types/version.type';
23
+ import { SemVerVersion } from '../../types/version.type';
24
24
  import { PostgresDataSource, PostgresOptions } from '../data-sources/postgres-typeorm-data-source.model';
25
25
  import { DataSource } from '../decorators/data-source.decorator';
26
26
  import { Repository } from '../repository';
@@ -68,7 +68,7 @@ class DbDataSource extends PostgresDataSource {
68
68
 
69
69
  @Injectable()
70
70
  class AddTestValueMigration extends Migration {
71
- version: Version = '0.0.1';
71
+ version: SemVerVersion = '0.0.1';
72
72
 
73
73
  constructor(
74
74
  @InjectRepository(Item)
@@ -5,13 +5,21 @@ import { BaseWhereFilter, BaseWhereFilterObject } from './base-where-filter.mode
5
5
  */
6
6
  type DateFilterWhereObject = BaseWhereFilterObject<Date> & {
7
7
  /**
8
- * The property needs to be after the value.
8
+ * The property needs to be after the date.
9
9
  */
10
10
  after?: Date,
11
11
  /**
12
- * The property needs to be before the value.
12
+ * The property needs to be before the date.
13
13
  */
14
- before?: Date
14
+ before?: Date,
15
+ /**
16
+ * The property needs to be after or on the date.
17
+ */
18
+ afterOrOn?: Date,
19
+ /**
20
+ * The property needs to be before or on the date.
21
+ */
22
+ beforeOrOn?: Date
15
23
  };
16
24
 
17
25
  /**
@@ -1,4 +1,6 @@
1
1
  import { BaseWhereFilter, BaseWhereFilterObject } from './base-where-filter.model';
2
+ import { ExcludeStrict } from '../../../types/exclude-strict.type';
3
+ import { Percentage } from '../../../types/percentage.type';
2
4
 
3
5
  /**
4
6
  * The string where filter object.
@@ -13,7 +15,22 @@ type StringWhereFilterObject = BaseWhereFilterObject<string> & {
13
15
  * The property needs to be like the provided string, ignoring case.
14
16
  * @example '%.cOm'
15
17
  */
16
- iLike?: string
18
+ iLike?: string,
19
+ /**
20
+ * The property needs to fuzzily be like the provided string so that eg. Typos don't matter.
21
+ */
22
+ fuzzyLike?: {
23
+ /**
24
+ * The search value.
25
+ */
26
+ value: string,
27
+ /**
28
+ * The minimum similarity that the search term must have as a percentage between 1 and 99.
29
+ *
30
+ * 1 matches almost everything while 99 is basically just a strict equal.
31
+ */
32
+ minSimilarity?: ExcludeStrict<Percentage, 0 | 100>
33
+ }
17
34
  };
18
35
 
19
36
  /**
@@ -60,12 +60,15 @@ const whereFilterKeysRecord: Record<WhereFilterKeys, WhereFilterKeys> = {
60
60
  oneOf: 'oneOf',
61
61
  notOneOf: 'notOneOf',
62
62
  after: 'after',
63
+ afterOrOn: 'afterOrOn',
63
64
  before: 'before',
65
+ beforeOrOn: 'beforeOrOn',
64
66
  greaterThan: 'greaterThan',
65
67
  greaterThanEquals: 'greaterThanEquals',
66
68
  lesserThan: 'lesserThan',
67
69
  lesserThanEquals: 'lesserThanEquals',
68
70
  iLike: 'iLike',
71
+ fuzzyLike: 'fuzzyLike',
69
72
  is: 'is',
70
73
  where: 'where',
71
74
  includes: 'includes',
@@ -20,7 +20,7 @@ class Address {
20
20
  city!: string;
21
21
 
22
22
  @Property.string({ required: false })
23
- type?: string; // 'home', 'work', etc.
23
+ type?: string | null; // 'home', 'work', etc.
24
24
  }
25
25
 
26
26
  class PersonalData {
@@ -182,7 +182,6 @@ describe('Where filters – deeply nested (object → array → object)', () =>
182
182
 
183
183
  // ===== Array of objects: includes (contains) – requires feature, skip for now =====
184
184
  it('array includes (contains all specified objects)', async () => {
185
- // TODO: implement partial object match in includes for object arrays
186
185
  const res: Customer[] = await customerRepo.findAll({
187
186
  where: {
188
187
  personalData: {
@@ -197,7 +196,6 @@ describe('Where filters – deeply nested (object → array → object)', () =>
197
196
 
198
197
  // ===== Array of objects: nested where on items (if supported) =====
199
198
  it('array item where filter', async () => {
200
- // TODO: implement 'where' on array items to filter by item properties
201
199
  const res: Customer[] = await customerRepo.findAll({
202
200
  where: {
203
201
  personalData: {
@@ -340,5 +338,12 @@ describe('Where filters – deeply nested (object → array → object)', () =>
340
338
  });
341
339
  expect(res.map(c => c.id)).toEqual([container2.id]);
342
340
  });
341
+
342
+ it('fuzzyLike on title', async () => {
343
+ const res: Container[] = await containerRepo.findAll({
344
+ where: { title: { fuzzyLike: { value: 'Cont', minSimilarity: 30 } } }
345
+ });
346
+ expect(res.map(c => c.id)).toEqual(expect.arrayContaining([container.id, container2.id]));
347
+ });
343
348
  });
344
349
  });
@@ -87,7 +87,7 @@ class User extends BaseEntity {
87
87
  company!: Company;
88
88
 
89
89
  @Property.string({ format: 'uuid', required: false })
90
- companyId!: string;
90
+ companyId?: string | null;
91
91
 
92
92
  @Property.oneToMany({ target: () => Post, inverseSide: 'author' })
93
93
  posts!: Post[];
@@ -96,7 +96,7 @@ class User extends BaseEntity {
96
96
  profile!: Profile;
97
97
 
98
98
  @Property.string({ format: 'uuid', required: false })
99
- profileId!: string;
99
+ profileId?: string | null;
100
100
 
101
101
  @Property.manyToMany({ target: () => Group, inverseSide: 'members', joinTable: true })
102
102
  groups!: Group[];
@@ -152,6 +152,23 @@ describe('Where filters', () => {
152
152
  expect(res.map(p => p.id)).toEqual([prodA.id]);
153
153
  });
154
154
 
155
+ it('fuzzyLike', async () => {
156
+ // eslint-disable-next-line cspell/spellchecker
157
+ // "Alpha" and "Beta" are seeded. A fuzzy search for "Alpah" (typo) should still match.
158
+ const res: Product[] = await productRepo.findAll({
159
+ // eslint-disable-next-line cspell/spellchecker
160
+ where: { name: { fuzzyLike: { value: 'Alpah', minSimilarity: 30 } } }
161
+ });
162
+ expect(res.map(p => p.id)).toEqual([prodA.id]);
163
+ });
164
+
165
+ it('fuzzyLike with low similarity returns nothing', async () => {
166
+ const res: Product[] = await productRepo.findAll({
167
+ where: { name: { fuzzyLike: { value: 'Zzzz', minSimilarity: 90 } } }
168
+ });
169
+ expect(res).toHaveLength(0);
170
+ });
171
+
155
172
  it('null', async () => {
156
173
  await productRepo.updateById(prodA.id, { name: null }); // set to null
157
174
  const res: Product[] = await productRepo.findAll({ where: { name: null } });
@@ -406,13 +423,6 @@ describe('Where filters', () => {
406
423
  const res: Product[] = await productRepo.findAll({ where: { category: { is: catFood } } });
407
424
  expect(res.map(p => p.id)).toEqual([prodFood.id]);
408
425
  });
409
-
410
- // TODO
411
- // it('null (no category)', async () => {
412
- // await productRepo.updateById(prodFood.id, { category: null });
413
- // const res: Product[] = await productRepo.findAll({ where: { category: null } });
414
- // expect(res.map(p => p.id)).toEqual([prodFood.id]);
415
- // });
416
426
  });
417
427
 
418
428
  // =================== ARRAY OF OBJECTS (Review[]) ===================
@@ -25,6 +25,7 @@ import { DataSourceService } from '../../data-source/data-source.service';
25
25
  import { EmailService } from '../../email/email.service';
26
26
  import { errorHandler } from '../../error-handling/error-handler';
27
27
  import { EventService } from '../../event/event.service';
28
+ import { KnownHeader } from '../../http/known-header.enum';
28
29
  import { HttpClient } from '../../http-client/http-client';
29
30
  import { LocalizeOptionsInput } from '../../localization/models/localize-options.model';
30
31
  import { LogLevel } from '../../logging/log-level.enum';
@@ -39,6 +40,7 @@ import { Router } from '../../routing/router';
39
40
  import { FsUtilities } from '../../utilities/fs.utilities';
40
41
  import { Ms } from '../../utilities/ms';
41
42
  import { ValidationService } from '../../validation/validation.service';
43
+ import { VersioningService } from '../../versioning/versioning.service';
42
44
  import { WebsocketService } from '../../websocket/services/websocket.service';
43
45
  import { DiTokenProviderRecord } from '../models/di-token.model';
44
46
 
@@ -147,6 +149,8 @@ export const ZIBRI_DI_PROVIDERS: DiTokenProviderRecord<typeof ZIBRI_DI_TOKENS> =
147
149
  ENCRYPTION_STRATEGIES: { useValue: [AesGcmEncryptionStrategy] },
148
150
  ENCRYPTION_MASTER_OPTIONS: { useValue: undefined },
149
151
  CACHE_SERVICE: { useClass: CacheService },
152
+ VERSIONING_SERVICE: { useClass: VersioningService },
153
+ VERSION_HEADER: { useValue: KnownHeader.X_VERSION },
150
154
  // dynamic
151
155
  CURRENT_REQUEST_CONTEXT: {
152
156
  useFactory: () => AlsUtilities.getCurrentRequestContext(),
@@ -38,6 +38,7 @@ import { RouterInterface } from '../../routing/router.interface';
38
38
  import { Newable } from '../../types/newable.type';
39
39
  import { FsPath } from '../../utilities/fs.utilities';
40
40
  import { ValidationServiceInterface } from '../../validation/validation-service.interface';
41
+ import { VersioningServiceInterface } from '../../versioning/versioning-service.interface';
41
42
  import { WebsocketOptions } from '../../websocket/models/websocket-options.model';
42
43
  import { WebsocketServiceInterface } from '../../websocket/services/websocket-service.interface';
43
44
  import { TokenRecord } from '../models/di-token.model';
@@ -115,6 +116,8 @@ export const ZIBRI_DI_TOKENS = {
115
116
  'zi.encryption_master_options'
116
117
  ),
117
118
  CACHE_SERVICE: ziToken<CacheServiceInterface>('zi.cache_service'),
119
+ VERSIONING_SERVICE: ziToken<VersioningServiceInterface>('zi.versioning_service'),
120
+ VERSION_HEADER: ziToken<string>('zi.version_header'),
118
121
  // dynamic/context based tokens
119
122
  CURRENT_REQUEST_CONTEXT: ziToken<HttpRequestContext | WebsocketRequestContext | undefined>('zi.current_request_context'),
120
123
  DEFAULT_CSP_OPTIONS: ziToken<CspOptions>('zi.default_csp_options'),
@@ -101,15 +101,15 @@ export class EmailService implements EmailServiceInterface, OnAppInit, OnAppShut
101
101
  * @param email - The email to send out.
102
102
  */
103
103
  protected async send(email: Email): Promise<void> {
104
- await this.validateAttachments(email.attachments);
104
+ await this.validateAttachments(email.attachments ?? undefined);
105
105
  const res: SMTPTransport.SentMessageInfo = await this.transporter.sendMail({
106
106
  html: email.html,
107
107
  subject: email.subject,
108
108
  from: email.sender,
109
109
  to: email.recipients,
110
- bcc: email.bcc,
111
- cc: email.cc,
112
- attachments: email.attachments
110
+ bcc: email.bcc ?? undefined,
111
+ cc: email.cc ?? undefined,
112
+ attachments: email.attachments ?? undefined
113
113
  });
114
114
 
115
115
  const status: EmailStatus = res.rejected.length ? EmailStatus.FAILED : EmailStatus.SENT;
@@ -132,7 +132,7 @@ export class EmailService implements EmailServiceInterface, OnAppInit, OnAppShut
132
132
  * @param attachments - The attachments to resolve.
133
133
  * @returns The resolved attachments.
134
134
  */
135
- protected async validateAttachments(attachments: EmailAttachment[] | undefined): Promise<void> {
135
+ protected async validateAttachments(attachments: EmailAttachment[] | undefined | null): Promise<void> {
136
136
  if (!attachments?.length) {
137
137
  return;
138
138
  }