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
@@ -1,4 +1,4 @@
1
- import swaggerUi from 'swagger-ui-express';
1
+ import { Readable } from 'node:stream';
2
2
 
3
3
  import { ZibriApplication } from '../application';
4
4
  import { OpenApiServiceInterface } from './open-api-service.interface';
@@ -21,26 +21,31 @@ import { ManyToOnePropertyMetadata } from '../entity/models/many-to-one-property
21
21
  import { OneToManyPropertyMetadata } from '../entity/models/one-to-many-property-metadata.model';
22
22
  import { Relation } from '../entity/models/relation.enum';
23
23
  import { OmitClass } from '../entity/omit-class.model';
24
+ import { NotFoundError } from '../error-handling/errors/not-found.error';
24
25
  import { GlobalRegistry } from '../global/global-registry';
25
26
  import { OnAppInit } from '../global/on-app-init.interface';
26
27
  import { HttpMethod } from '../http/http-method.enum';
27
28
  import { HttpStatus } from '../http/http-status.enum';
28
29
  import { KnownHeader } from '../http/known-header.enum';
29
30
  import { MimeType } from '../http/mime-type.enum';
31
+ import { FormatDateFn } from '../localization/formatting/format-date-fn.model';
30
32
  import { type LoggerInterface } from '../logging/logger.interface';
31
33
  import { FileResponse } from '../parsing/form-data/file-response.model';
34
+ import { HtmlResponse } from '../parsing/html/html-response.model';
32
35
  import { Route, ControllerRouteConfiguration } from '../routing/controller-route-configuration.model';
33
36
  import { BodyMetadata } from '../routing/decorators/body.decorator';
34
37
  import { ControllerData } from '../routing/decorators/controller.decorator';
35
38
  import { PathParamMetadata, QueryParamMetadata, HeaderParamMetadata } from '../routing/decorators/param.decorator';
36
39
  import { MissingBaseRouteError } from '../routing/missing-base-route.error';
37
- import { RouteHandler } from '../routing/route-configuration.model';
38
40
  import { type RouterInterface } from '../routing/router.interface';
39
41
  import { Newable } from '../types/newable.type';
40
42
  import { FsUtilities, FsPath } from '../utilities/fs.utilities';
41
- import { JsonUtilities } from '../utilities/json.utilities';
42
43
  import { MetadataUtilities } from '../utilities/metadata.utilities';
43
44
  import { ObjectUtilities } from '../utilities/object.utilities';
45
+ import { SemVerUtilities } from '../utilities/sem-ver.utilities';
46
+ import { SupportedVersionsOptions } from '../versioning/supported-versions-options.model';
47
+ import { Version, VersionFile } from '../versioning/version.model';
48
+ import { type VersioningServiceInterface } from '../versioning/versioning-service.interface';
44
49
 
45
50
  const defaultDescriptionForHttpStatus: Record<HttpStatus | 'default', string> = {
46
51
  default: 'Response',
@@ -99,17 +104,37 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
99
104
  @Inject(ZIBRI_DI_TOKENS.AUTH_SERVICE)
100
105
  private readonly authService: AuthServiceInterface,
101
106
  @Inject(ZIBRI_DI_TOKENS.ROUTER)
102
- private readonly router: RouterInterface
107
+ private readonly router: RouterInterface,
108
+ @Inject(ZIBRI_DI_TOKENS.VERSIONING_SERVICE)
109
+ private readonly versioningService: VersioningServiceInterface
103
110
  ) { }
104
111
 
105
112
  // eslint-disable-next-line jsdoc/require-jsdoc
106
113
  async onAppInit(app: ZibriApplication): Promise<void> {
107
- const definition: OpenApiDefinition = await this.createOpenApiDefinition(app);
114
+ await this.router.registerRoute({
115
+ httpMethod: HttpMethod.GET,
116
+ route: `${this.openApiRoute}/spec/:version`,
117
+ versions: 'all',
118
+ openApi: { useInOpenApi: false },
119
+ pathParams: { version: { type: 'string' } },
120
+ handler: async (req) => {
121
+ const versionValue: string = req.params['version'];
122
+ const versions: VersionFile[] = this.versioningService.getVersions();
123
+ const version: VersionFile | undefined = versions.find(v => v.value === versionValue);
124
+ if (!version) {
125
+ throw new NotFoundError(`Version "${versionValue}" not found`);
126
+ }
127
+ return await this.createOpenApiDefinition(app, version);
128
+ }
129
+ });
130
+
108
131
  await this.logger.info(`registers the OpenAPI Explorer at ${this.openApiRoute}`);
109
132
 
110
133
  await this.router.registerRoute({
111
134
  httpMethod: HttpMethod.GET,
112
135
  route: `${this.openApiRoute}/swagger-ui.css`,
136
+ versions: 'all',
137
+ openApi: { useInOpenApi: false },
113
138
  handler: () => {
114
139
  const filePath: FsPath = FsUtilities.getPath(this.assetService.publicAssetsPath, 'open-api', 'swagger-ui.css');
115
140
  return FileResponse.fromPath(filePath);
@@ -118,6 +143,8 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
118
143
  await this.router.registerRoute({
119
144
  httpMethod: HttpMethod.GET,
120
145
  route: `${this.openApiRoute}/swagger-ui-bundle.js`,
146
+ versions: 'all',
147
+ openApi: { useInOpenApi: false },
121
148
  handler: () => {
122
149
  const filePath: FsPath = FsUtilities.getPath(this.assetService.publicAssetsPath, 'open-api', 'swagger-ui-bundle.js');
123
150
  return FileResponse.fromPath(filePath);
@@ -126,6 +153,8 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
126
153
  await this.router.registerRoute({
127
154
  httpMethod: HttpMethod.GET,
128
155
  route: `${this.openApiRoute}/swagger-ui-standalone-preset.js`,
156
+ versions: 'all',
157
+ openApi: { useInOpenApi: false },
129
158
  handler: () => {
130
159
  const filePath: FsPath = FsUtilities.getPath(
131
160
  this.assetService.publicAssetsPath,
@@ -138,166 +167,250 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
138
167
  await this.router.registerRoute({
139
168
  httpMethod: HttpMethod.GET,
140
169
  route: `${this.openApiRoute}/swagger-ui-init.js`,
141
- handler: (_, res) => {
142
- res.type('.js').send([
143
- 'window.onload = function() {',
144
- ' SwaggerUIBundle({',
145
- ` spec: ${JsonUtilities.stringify(definition)},`,
146
- ' dom_id: \'#swagger-ui\',',
147
- ' presets: [',
148
- ' SwaggerUIBundle.presets.apis,',
149
- ' SwaggerUIStandalonePreset',
150
- ' ],',
151
- ' layout: "StandaloneLayout",',
152
- ' requestInterceptor: (req) => {',
153
- ' req.headers.Accept = \'application/json\'',
154
- ` req.headers['${KnownHeader.CONTENT_TYPE}'] = \'application/json\'`,
155
- ' return req;',
156
- ' },',
157
- ' defaultModelRendering: \'model\'',
158
- ' });',
159
- '};'
160
-
161
- ].join('\n'));
170
+ versions: 'all',
171
+ openApi: { useInOpenApi: false },
172
+ handler: () => {
173
+ const formatDate: FormatDateFn = inject(ZIBRI_DI_TOKENS.FORMAT_DATE);
174
+ const versions: VersionFile[] = this.versioningService
175
+ .getVersions()
176
+ .sort((a, b) => SemVerUtilities.compare(a.value, b.value) === 'bigger' ? -1 : 1);
177
+ // eslint-disable-next-line jsdoc/require-jsdoc
178
+ const urls: { url: string, name: string }[] = versions.map(v => ({
179
+ url: `${this.openApiRoute}/spec/${v.value}`,
180
+ name: v.endsAt == undefined
181
+ ? `${v.value} (latest)`
182
+ : `${v.value} (${formatDate(v.startsAt)} - ${formatDate(v.endsAt)})`
183
+ }));
184
+ const latestVersion: VersionFile | undefined = versions.find(v => v.endsAt == undefined);
185
+ return FileResponse.fromStream({
186
+ filename: 'swagger-ui-init.js',
187
+ mimeType: MimeType.JAVASCRIPT,
188
+ stream: Readable.from([
189
+ [
190
+ 'window.onload = function() {',
191
+ ' window.ui = SwaggerUIBundle({',
192
+ ` urls: ${JSON.stringify(urls)},`,
193
+ ` "urls.primaryName": "${latestVersion?.value ?? ''}",`,
194
+ ' dom_id: \'#swagger-ui\',',
195
+ ' presets: [',
196
+ ' SwaggerUIBundle.presets.apis,',
197
+ ' SwaggerUIStandalonePreset',
198
+ ' ],',
199
+ ' layout: "StandaloneLayout",',
200
+ ' requestInterceptor: (req) => {',
201
+ ' req.headers.Accept = \'application/json\'',
202
+ ` req.headers['${KnownHeader.CONTENT_TYPE}'] = \'application/json\'`,
203
+ ' return req;',
204
+ ' },',
205
+ ' defaultModelRendering: \'model\'',
206
+ ' });',
207
+ '};'
208
+ ].join('\n')
209
+ ])
210
+ });
162
211
  }
163
212
  });
164
213
 
165
214
  await this.router.registerRoute({
166
215
  httpMethod: HttpMethod.GET,
167
216
  route: `${this.openApiRoute}/custom.js`,
168
- handler: (_, res) => {
169
- res.type('.js').send([
170
- '(function waitForTopbar() {',
171
- ' const topbar = document.querySelector(\'.information-container\');',
172
- ' if (!topbar) {',
173
- ' return setTimeout(waitForTopbar, 50);',
174
- ' }',
175
- ' if (document.getElementById(\'zibri-openapi-logo\')) {',
176
- ' return;',
177
- ' }',
178
- '',
179
- ' const a = document.createElement(\'a\');',
180
- ' a.id = \'zibri-openapi-logo\';',
181
- ' a.href = \'/\';',
182
- '',
183
- ' const img = document.createElement(\'img\');',
184
- ` img.src = '${this.assetService.assetsRoute}/logo.jpg';`,
185
- ' img.height = 100;',
186
- ' img.width = 100;',
187
- '',
188
- ' a.appendChild(img);',
189
- ` a.append('${GlobalRegistry.getAppData('name')}')`,
190
- ' topbar.insertBefore(a, topbar.firstChild);',
191
- '})();',
192
- '',
193
- '(function waitForSwagger() {',
194
- ' if (!window.ui || typeof window.ui.specSelectors !== \'object\') {',
195
- ' return setTimeout(waitForSwagger, 50);',
196
- ' }',
197
- // eslint-disable-next-line stylistic/max-len
198
- ' const spec = window.ui.specSelectors.specJson().toJS ? window.ui.specSelectors.specJson().toJS() : window.ui.specSelectors.specJson();',
199
- ' if (!spec || !spec.paths) {',
200
- ' return setTimeout(waitForSwagger, 50);',
201
- ' }',
202
- '',
203
- ' function normalizeMethod(m) {',
204
- ' return String(m).toLowerCase();',
205
- ' }',
206
- '',
207
- // eslint-disable-next-line cspell/spellchecker
208
- ' const opblocks = Array.from(document.querySelectorAll(\'.opblock\'));',
209
- // eslint-disable-next-line cspell/spellchecker
210
- ' opblocks.forEach((op) => {',
211
- ' try {',
212
- // eslint-disable-next-line cspell/spellchecker
213
- ' const methodEl = op.querySelector(\'.opblock-summary-method\');',
214
- // eslint-disable-next-line cspell/spellchecker
215
- ' const pathEl = op.querySelector(\'.opblock-summary-path\');',
216
- ' if (!methodEl || !pathEl) {',
217
- ' return;',
218
- ' }',
219
- ' const method = normalizeMethod(methodEl.textContent?.trim() ?? \'\');',
220
- ' const path = (pathEl.textContent?.trim() ?? \'\');',
221
- '',
222
- ' const pathObj = spec.paths && spec.paths[path];',
223
- ' if (!pathObj) {',
224
- ' return;',
225
- ' }',
226
- ' const operationObj = pathObj[method];',
227
- ' if (!operationObj) {',
228
- ' return;',
229
- ' }',
230
- ' const roles = operationObj[\'x-roles\'];',
231
- ' if (!roles || !Array.isArray(roles) || roles.length === 0) {',
232
- ' return;',
233
- ' }',
234
- '',
235
- ' if (op.querySelector(\'.zibri-roles-container\')) {',
236
- ' return;',
237
- ' }',
238
- ' const container = document.createElement(\'div\');',
239
- ' container.className = \'zibri-roles-container\';',
240
- ' container.setAttribute(\'aria-hidden\', \'true\');',
241
- '',
242
- ' roles.forEach((r) => {',
243
- ' const badge = document.createElement(\'span\');',
244
- ' badge.className = \'zibri-role-badge\';',
245
- ' badge.textContent = String(r);',
246
- ' container.appendChild(badge);',
247
- ' });',
248
- '',
249
- // eslint-disable-next-line cspell/spellchecker
250
- ' const summary = op.querySelector(\'.opblock-summary-path-description-wrapper\');',
251
- ' summary.appendChild(container);',
252
- // ' if (summary) {',
253
- // ' const lock = summary.querySelector(\'.authorization__btn\');',
254
- // ' if (lock) {',
255
- // ' summary.insertBefore(container, lock);',
256
- // ' } else {',
257
- // ' summary.appendChild(container);',
258
- // ' }',
259
- // ' }',
260
- ' } catch (e) {',
261
- ' console.warn(\'zibri openapi role injection failed\', e);',
262
- ' }',
263
- ' });',
264
- '})();'
265
-
266
- ].join('\n'));
217
+ versions: 'all',
218
+ openApi: { useInOpenApi: false },
219
+ handler: () => {
220
+ return FileResponse.fromStream({
221
+ filename: 'custom.js',
222
+ mimeType: MimeType.JAVASCRIPT,
223
+ stream: Readable.from([
224
+ [
225
+ '(function() {',
226
+ ' function injectLogo(topbar) {',
227
+ ' if (topbar.querySelector(\'#zibri-openapi-logo\')) {',
228
+ ' return;',
229
+ ' }',
230
+ ' const a = document.createElement(\'a\');',
231
+ ' a.id = \'zibri-openapi-logo\';',
232
+ ' a.href = \'/\';',
233
+ '',
234
+ ' const img = document.createElement(\'img\');',
235
+ ` img.src = '${this.assetService.assetsRoute}/logo.jpg';`,
236
+ ' img.height = 100;',
237
+ ' img.width = 100;',
238
+ '',
239
+ ' a.appendChild(img);',
240
+ ` a.append('${GlobalRegistry.getAppData('name')}');`,
241
+ ' topbar.insertBefore(a, topbar.firstChild);',
242
+ ' }',
243
+ '',
244
+ ' function observe() {',
245
+ ' const topbar = document.querySelector(\'.information-container\');',
246
+ ' if (!topbar) {',
247
+ ' setTimeout(observe, 50);',
248
+ ' return;',
249
+ ' }',
250
+ ' injectLogo(topbar);',
251
+ ' new MutationObserver(() => {',
252
+ ' const t = document.querySelector(\'.information-container\');',
253
+ ' if (t) {',
254
+ ' injectLogo(t);',
255
+ ' }',
256
+ ' }).observe(document.body, { childList: true, subtree: true });',
257
+ ' }',
258
+ '',
259
+ ' observe();',
260
+ '})();',
261
+ '',
262
+ '(function() {',
263
+ ' let isInjecting = false;',
264
+ '',
265
+ ' function injectRoles() {',
266
+ ' if (isInjecting) return;',
267
+ ' if (!window.ui || typeof window.ui.specSelectors !== \'object\') return;',
268
+ '',
269
+ ' const spec = window.ui.specSelectors.specJson().toJS',
270
+ ' ? window.ui.specSelectors.specJson().toJS()',
271
+ ' : window.ui.specSelectors.specJson();',
272
+ '',
273
+ ' if (!spec || !spec.paths) return;',
274
+ '',
275
+ ' isInjecting = true;',
276
+ ' try {',
277
+ ' const normalizeMethod = (m) => String(m).toLowerCase();',
278
+ '',
279
+ // eslint-disable-next-line cspell/spellchecker
280
+ ' const opBlocks = document.querySelectorAll(\'.opblock\');',
281
+ ' opBlocks.forEach((op) => {',
282
+ ' try {',
283
+ // eslint-disable-next-line cspell/spellchecker
284
+ ' const methodEl = op.querySelector(\'.opblock-summary-method\');',
285
+ // eslint-disable-next-line cspell/spellchecker
286
+ ' const pathEl = op.querySelector(\'.opblock-summary-path\');',
287
+ ' if (!methodEl || !pathEl) return;',
288
+ '',
289
+ ' const method = normalizeMethod(methodEl.textContent.trim());',
290
+ ' const path = pathEl.textContent.trim();',
291
+ '',
292
+ ' const pathObj = spec.paths[path];',
293
+ ' if (!pathObj) return;',
294
+ '',
295
+ ' const operationObj = pathObj[method];',
296
+ ' if (!operationObj) return;',
297
+ '',
298
+ ' const roles = operationObj[\'x-roles\'];',
299
+ ' if (!roles || !Array.isArray(roles) || roles.length === 0) return;',
300
+ '',
301
+ ' if (op.querySelector(\'.zibri-roles-container\')) return;',
302
+ '',
303
+ ' const container = document.createElement(\'div\');',
304
+ ' container.className = \'zibri-roles-container\';',
305
+ ' container.setAttribute(\'aria-hidden\', \'true\');',
306
+ '',
307
+ ' roles.forEach((r) => {',
308
+ ' const badge = document.createElement(\'span\');',
309
+ ' badge.className = \'zibri-role-badge\';',
310
+ ' badge.textContent = String(r);',
311
+ ' container.appendChild(badge);',
312
+ ' });',
313
+ '',
314
+ // eslint-disable-next-line cspell/spellchecker
315
+ ' const summary = op.querySelector(\'.opblock-summary-path-description-wrapper\');',
316
+ ' if (summary) summary.appendChild(container);',
317
+ ' } catch (e) {',
318
+ ' console.warn(\'zibri openapi role injection failed\', e);',
319
+ ' }',
320
+ ' });',
321
+ ' } finally {',
322
+ ' isInjecting = false;',
323
+ ' }',
324
+ ' }',
325
+ '',
326
+ ' function waitForSwaggerAndObserve() {',
327
+ ' if (!window.ui || typeof window.ui.specSelectors !== \'object\') {',
328
+ ' return setTimeout(waitForSwaggerAndObserve, 50);',
329
+ ' }',
330
+ '',
331
+ ' const spec = window.ui.specSelectors.specJson().toJS',
332
+ ' ? window.ui.specSelectors.specJson().toJS()',
333
+ ' : window.ui.specSelectors.specJson();',
334
+ '',
335
+ ' if (!spec || !spec.paths) {',
336
+ ' return setTimeout(waitForSwaggerAndObserve, 50);',
337
+ ' }',
338
+ '',
339
+ ' // Initial injection',
340
+ ' injectRoles();',
341
+ '',
342
+ ' // Watch for version switches / re-renders',
343
+ ' const swaggerContainer = document.getElementById(\'swagger-ui\');',
344
+ ' if (!swaggerContainer) return;',
345
+ '',
346
+ ' let debounceTimer;',
347
+ ' const observer = new MutationObserver(() => {',
348
+ ' clearTimeout(debounceTimer);',
349
+ ' debounceTimer = setTimeout(() => {',
350
+ ' injectRoles();',
351
+ ' }, 200);',
352
+ ' });',
353
+ '',
354
+ ' observer.observe(swaggerContainer, { childList: true, subtree: true });',
355
+ ' }',
356
+ '',
357
+ ' waitForSwaggerAndObserve();',
358
+ '})();'
359
+ ].join('\n')
360
+ ])
361
+ });
267
362
  }
268
363
  });
269
364
 
270
- app.use(this.openApiRoute, swaggerUi.serve);
271
365
  await this.router.registerRoute({
272
366
  httpMethod: HttpMethod.GET,
273
367
  route: this.openApiRoute,
274
- handler: swaggerUi.setup(
275
- definition,
276
- {
277
- // eslint-disable-next-line cspell/spellchecker
278
- customfavIcon: `${this.assetService.assetsRoute}/favicon.png`,
279
- customSiteTitle: definition.info.title,
280
- customCssUrl: `${this.assetService.assetsRoute}/open-api/custom.css`,
281
- customJs: `${this.openApiRoute}/custom.js`
282
- }
283
- ) as RouteHandler<BodyMetadata, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>
368
+ versions: 'all',
369
+ openApi: { useInOpenApi: false },
370
+ handler: () => {
371
+ return HtmlResponse.fromString(
372
+ `<!DOCTYPE html>
373
+ <html lang="en">
374
+ <head>
375
+ <meta charset="UTF-8">
376
+ <title>${GlobalRegistry.getAppData('name')} | Explorer</title>
377
+ <link rel="stylesheet" href="${this.openApiRoute}/swagger-ui.css">
378
+ <link rel="icon" href="${this.assetService.assetsRoute}/favicon.png">
379
+ <link rel="stylesheet" href="${this.assetService.assetsRoute}/open-api/custom.css">
380
+ </head>
381
+ <body>
382
+ <div id="swagger-ui"></div>
383
+ <script src="${this.openApiRoute}/swagger-ui-bundle.js"></script>
384
+ <script src="${this.openApiRoute}/swagger-ui-standalone-preset.js"></script>
385
+ <script src="${this.openApiRoute}/swagger-ui-init.js"></script>
386
+ <script src="${this.openApiRoute}/custom.js"></script>
387
+ </body>
388
+ </html>`,
389
+ {
390
+ csp: {
391
+ styleSrc: ['\'self\'', '\'unsafe-hashes\'', '\'sha256-RL3ie0nH+Lzz2YNqQN83mnU0J1ot4QL7b99vMdIX99w=\''],
392
+ imgSrc: ['\'self\'', 'data:']
393
+ }
394
+ }
395
+ );
396
+ }
284
397
  });
285
398
  }
286
399
 
287
400
  // eslint-disable-next-line jsdoc/require-jsdoc
288
- async createOpenApiDefinition(app: ZibriApplication): Promise<OpenApiDefinition> {
401
+ async createOpenApiDefinition(app: ZibriApplication, version: Version): Promise<OpenApiDefinition> {
289
402
  const tags: OpenApiTagObject[] = app.options.controllers.map(cls => ({ name: cls.name }));
290
403
  const res: OpenApiDefinition = {
291
404
  openapi: '3.1.0',
292
405
  info: {
293
406
  title: `${GlobalRegistry.getAppData('name')} | Explorer`,
294
- version: GlobalRegistry.getAppData('version') ?? '0.0.0'
407
+ version: version.value
295
408
  },
296
409
  tags,
297
410
  components: {
298
411
  securitySchemes: this.resolveSecuritySchemes()
299
412
  },
300
- paths: await this.resolveOpenApiPaths(app)
413
+ paths: await this.resolveOpenApiPaths(app, version)
301
414
  };
302
415
  return res;
303
416
  }
@@ -310,10 +423,11 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
310
423
  return res;
311
424
  }
312
425
 
313
- private async resolveOpenApiPaths(app: ZibriApplication): Promise<OpenApiPaths> {
426
+ // eslint-disable-next-line sonar/cognitive-complexity
427
+ private async resolveOpenApiPaths(app: ZibriApplication, version: Version): Promise<OpenApiPaths> {
314
428
  const res: OpenApiPaths = {};
315
429
 
316
- for (const controllerClass of app.options.controllers) {
430
+ for (const controllerClass of app.options.controllers.sort((a, b) => a.name.localeCompare(b.name))) {
317
431
  const controllerData: ControllerData | undefined = MetadataUtilities.getControllerData(controllerClass);
318
432
  if (!controllerData) {
319
433
  throw new MissingBaseRouteError(controllerClass);
@@ -321,6 +435,11 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
321
435
 
322
436
  const routes: ControllerRouteConfiguration[] = MetadataUtilities.getControllerRoutes(controllerClass);
323
437
  for (const route of routes) {
438
+ const routeVersions: SupportedVersionsOptions = route.versions ?? controllerData.versions;
439
+ if (!this.versioningService.matchesVersion(routeVersions, version)) {
440
+ continue;
441
+ }
442
+
324
443
  const pathParams: Record<number, PathParamMetadata> = MetadataUtilities.getRoutePathParams(
325
444
  controllerClass,
326
445
  route.controllerMethod
@@ -366,6 +485,9 @@ export class OpenApiService implements OpenApiServiceInterface, OnAppInit {
366
485
  }
367
486
 
368
487
  for (const route of this.router.manuallyRegisteredRoutes.filter(r => r.openApi.useInOpenApi)) {
488
+ if (!this.versioningService.matchesVersion(route.versions, version)) {
489
+ continue;
490
+ }
369
491
  // Ensure an entry exists
370
492
  const fullPath: string = `${route.route}`.replaceAll(/:([^/]+)/g, '{$1}');
371
493
  res[fullPath] ??= {};
@@ -9,9 +9,12 @@ import { toKebabCase } from '../../utilities/to-kebab-case.function';
9
9
  */
10
10
  export type CspSource = '\'self\''
11
11
  | '\'none\''
12
+ | '\'unsafe-hashes\''
13
+ | `\'sha256-${string}\'`
12
14
  | '\'unsafe-inline\''
13
15
  | '\'unsafe-eval\''
14
16
  | `\'nonce-${string}\'`
17
+ | 'data:'
15
18
  | `https://${string}`
16
19
  | `http://${string}`;
17
20
 
@@ -93,7 +93,7 @@ export class Parser implements ParserInterface, OnAppInit {
93
93
 
94
94
  // eslint-disable-next-line jsdoc/require-jsdoc
95
95
  parseHeaderParam(req: HttpRequest | WebsocketRequest | HttpClientResponse, metadata: HeaderParamMetadata): unknown {
96
- const rawValue: string | undefined = req.headers[metadata.name as KnownHeader];
96
+ const rawValue: string | undefined = req.headers?.[metadata.name as KnownHeader];
97
97
  return this.headerParamParseFunctions[metadata.type](rawValue, metadata);
98
98
  }
99
99
 
@@ -112,8 +112,8 @@ export class Parser implements ParserInterface, OnAppInit {
112
112
 
113
113
  // eslint-disable-next-line jsdoc/require-jsdoc
114
114
  async parseBody(req: HttpRequest | WebsocketRequest | HttpClientResponse, metadata: BodyMetadata): Promise<unknown> {
115
- const contentTypeHeader: string | undefined = req.headers[KnownHeader.CONTENT_TYPE]
116
- ?? req.headers[KnownHeader.CONTENT_TYPE.toLowerCase() as KnownHeader];
115
+ const contentTypeHeader: string | undefined = req.headers?.[KnownHeader.CONTENT_TYPE]
116
+ ?? req.headers?.[KnownHeader.CONTENT_TYPE.toLowerCase() as KnownHeader];
117
117
  let contentType: string = contentTypeHeader?.split(';')[0]?.trim().toLowerCase() ?? '';
118
118
  if (!contentType.length) {
119
119
  if (isHttpClientResponse(req)) {
@@ -25,7 +25,7 @@ export class InvoiceAddress {
25
25
  * It is required for factur-x or x-rechnung compliant invoices.
26
26
  */
27
27
  @Property.string({ required: false })
28
- email?: string;
28
+ email?: string | null;
29
29
  /**
30
30
  * The street of the address.
31
31
  */
@@ -61,5 +61,5 @@ export class InvoiceAddress {
61
61
  * The name of the company.
62
62
  */
63
63
  @Property.string({ required: false })
64
- companyName?: string;
64
+ companyName?: string | null;
65
65
  }
@@ -33,5 +33,5 @@ export class Vat {
33
33
  * Is required when categoryCode is set to 'E'.
34
34
  */
35
35
  @Property.string({ required: false })
36
- exemptionReason?: string;
36
+ exemptionReason?: string | null;
37
37
  }
@@ -22,7 +22,7 @@ import { Get } from '../../routing/decorators/get.decorator';
22
22
  import { Param } from '../../routing/decorators/param.decorator';
23
23
  import { Patch } from '../../routing/decorators/patch.decorator';
24
24
 
25
- @Controller('/mailing-lists', { allowOrphan: true })
25
+ @Controller('/mailing-lists', { allowOrphan: true, versions: 'all' })
26
26
  export class MailingListController implements OnAppInit {
27
27
 
28
28
  constructor(
@@ -12,7 +12,7 @@ export class MailingListSubscriber extends BaseEntity {
12
12
  * The optional name of the subscriber.
13
13
  */
14
14
  @Property.string({ required: false })
15
- name?: string;
15
+ name?: string | null;
16
16
 
17
17
  /**
18
18
  * The email of the subscriber.
@@ -30,7 +30,7 @@ export class MailingListSubscriptionConfirmationToken extends BaseEntity {
30
30
  * The optional name of the new subscriber that this token belongs to.
31
31
  */
32
32
  @Property.string({ required: false })
33
- name?: string;
33
+ name?: string | null;
34
34
 
35
35
  /**
36
36
  * The id of the mailing list that this token belongs to.
@@ -45,10 +45,10 @@ export class Payment<M extends PaymentMethod, Data extends AnyObject> extends Ba
45
45
  * Additional data stored by the provider.
46
46
  */
47
47
  @Property.unknown({ required: false })
48
- data?: Data;
48
+ data?: Data | null;
49
49
  /**
50
50
  * An error that the payment failed with.
51
51
  */
52
52
  @Property.unknown({ required: false })
53
- error?: Error;
53
+ error?: Error | null;
54
54
  }