@venizia/ignis 0.2.0-9 → 0.2.1-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 (400) hide show
  1. package/LICENSE.md +0 -1
  2. package/README.md +118 -158
  3. package/dist/base/applications/base.d.ts +19 -13
  4. package/dist/base/applications/base.d.ts.map +1 -1
  5. package/dist/base/applications/base.js +95 -74
  6. package/dist/base/applications/base.js.map +1 -1
  7. package/dist/base/applications/boot-steps.d.ts +13 -0
  8. package/dist/base/applications/boot-steps.d.ts.map +1 -0
  9. package/dist/base/applications/boot-steps.js +23 -0
  10. package/dist/base/applications/boot-steps.js.map +1 -0
  11. package/dist/base/applications/common/index.d.ts +2 -0
  12. package/dist/base/applications/common/index.d.ts.map +1 -0
  13. package/dist/base/applications/common/index.js +18 -0
  14. package/dist/base/applications/common/index.js.map +1 -0
  15. package/dist/base/applications/{types.d.ts → common/types.d.ts} +11 -0
  16. package/dist/base/applications/common/types.d.ts.map +1 -0
  17. package/dist/base/applications/common/types.js.map +1 -0
  18. package/dist/base/applications/index.d.ts +2 -1
  19. package/dist/base/applications/index.d.ts.map +1 -1
  20. package/dist/base/applications/index.js +2 -1
  21. package/dist/base/applications/index.js.map +1 -1
  22. package/dist/base/applications/server.d.ts +6 -2
  23. package/dist/base/applications/server.d.ts.map +1 -1
  24. package/dist/base/applications/server.js +34 -2
  25. package/dist/base/applications/server.js.map +1 -1
  26. package/dist/base/controllers/grpc/adapter.js +2 -2
  27. package/dist/base/controllers/grpc/adapter.js.map +1 -1
  28. package/dist/base/middlewares/app-error/app-error.middleware.d.ts +3 -2
  29. package/dist/base/middlewares/app-error/app-error.middleware.d.ts.map +1 -1
  30. package/dist/base/middlewares/app-error/app-error.middleware.js +4 -3
  31. package/dist/base/middlewares/app-error/app-error.middleware.js.map +1 -1
  32. package/dist/base/middlewares/request-spy/request-spy.middleware.d.ts +2 -2
  33. package/dist/base/middlewares/request-spy/request-spy.middleware.d.ts.map +1 -1
  34. package/dist/base/middlewares/request-spy/request-spy.middleware.js +20 -6
  35. package/dist/base/middlewares/request-spy/request-spy.middleware.js.map +1 -1
  36. package/dist/common/constants.d.ts.map +1 -1
  37. package/dist/common/constants.js +2 -1
  38. package/dist/common/constants.js.map +1 -1
  39. package/dist/common/environments.d.ts +31 -10
  40. package/dist/common/environments.d.ts.map +1 -1
  41. package/dist/common/environments.js +33 -10
  42. package/dist/common/environments.js.map +1 -1
  43. package/dist/components/api-reference/component.d.ts.map +1 -1
  44. package/dist/components/api-reference/component.js +4 -3
  45. package/dist/components/api-reference/component.js.map +1 -1
  46. package/dist/components/api-reference/index.d.ts +1 -1
  47. package/dist/components/api-reference/index.d.ts.map +1 -1
  48. package/dist/components/api-reference/index.js +1 -1
  49. package/dist/components/api-reference/index.js.map +1 -1
  50. package/dist/components/api-reference/ui/factory.d.ts +14 -0
  51. package/dist/components/api-reference/ui/factory.d.ts.map +1 -0
  52. package/dist/components/api-reference/ui/factory.js +54 -0
  53. package/dist/components/api-reference/ui/factory.js.map +1 -0
  54. package/dist/components/api-reference/ui/index.d.ts +4 -0
  55. package/dist/components/api-reference/ui/index.d.ts.map +1 -0
  56. package/dist/components/api-reference/ui/index.js +20 -0
  57. package/dist/components/api-reference/ui/index.js.map +1 -0
  58. package/dist/components/api-reference/ui/scalar.d.ts +8 -0
  59. package/dist/components/api-reference/ui/scalar.d.ts.map +1 -0
  60. package/dist/components/api-reference/ui/scalar.js +28 -0
  61. package/dist/components/api-reference/ui/scalar.js.map +1 -0
  62. package/dist/components/api-reference/ui/swagger.d.ts +8 -0
  63. package/dist/components/api-reference/ui/swagger.d.ts.map +1 -0
  64. package/dist/components/api-reference/ui/swagger.js +28 -0
  65. package/dist/components/api-reference/ui/swagger.js.map +1 -0
  66. package/dist/components/auth/authenticate/component.d.ts +5 -0
  67. package/dist/components/auth/authenticate/component.d.ts.map +1 -1
  68. package/dist/components/auth/authenticate/component.js +23 -0
  69. package/dist/components/auth/authenticate/component.js.map +1 -1
  70. package/dist/components/auth/authenticate/controllers/factory.d.ts +35 -3
  71. package/dist/components/auth/authenticate/controllers/factory.d.ts.map +1 -1
  72. package/dist/components/auth/authenticate/controllers/jwks/definitions.d.ts +40 -20
  73. package/dist/components/auth/authenticate/controllers/jwks/definitions.d.ts.map +1 -1
  74. package/dist/components/auth/authenticate/controllers/service-certs/definitions.d.ts +40 -20
  75. package/dist/components/auth/authenticate/controllers/service-certs/definitions.d.ts.map +1 -1
  76. package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.d.ts +2 -2
  77. package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.d.ts.map +1 -1
  78. package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.js +12 -8
  79. package/dist/components/auth/authenticate/services/bearer/jwks/issuer.service.js.map +1 -1
  80. package/dist/components/auth/authenticate/services/bearer/jwks/verifier.service.d.ts +1 -1
  81. package/dist/components/auth/authenticate/services/bearer/jwks/verifier.service.d.ts.map +1 -1
  82. package/dist/components/auth/authenticate/services/bearer/jwks/verifier.service.js +5 -3
  83. package/dist/components/auth/authenticate/services/bearer/jwks/verifier.service.js.map +1 -1
  84. package/dist/components/auth/authenticate/services/bearer/jws.service.d.ts +1 -2
  85. package/dist/components/auth/authenticate/services/bearer/jws.service.d.ts.map +1 -1
  86. package/dist/components/auth/authenticate/services/bearer/jws.service.js +5 -3
  87. package/dist/components/auth/authenticate/services/bearer/jws.service.js.map +1 -1
  88. package/dist/components/auth/authenticate/services/jose-loader.d.ts +16 -0
  89. package/dist/components/auth/authenticate/services/jose-loader.d.ts.map +1 -0
  90. package/dist/components/auth/authenticate/services/jose-loader.js +25 -0
  91. package/dist/components/auth/authenticate/services/jose-loader.js.map +1 -0
  92. package/dist/components/auth/authenticate/services/service/signer.service.d.ts.map +1 -1
  93. package/dist/components/auth/authenticate/services/service/signer.service.js +8 -5
  94. package/dist/components/auth/authenticate/services/service/signer.service.js.map +1 -1
  95. package/dist/components/auth/authenticate/services/service/verifier.service.d.ts.map +1 -1
  96. package/dist/components/auth/authenticate/services/service/verifier.service.js +10 -9
  97. package/dist/components/auth/authenticate/services/service/verifier.service.js.map +1 -1
  98. package/dist/components/auth/authenticate/strategies/index.d.ts +1 -1
  99. package/dist/components/auth/authenticate/strategies/index.d.ts.map +1 -1
  100. package/dist/components/auth/authenticate/strategies/index.js +1 -1
  101. package/dist/components/auth/authenticate/strategies/index.js.map +1 -1
  102. package/dist/components/auth/authenticate/strategies/jwks/index.d.ts +3 -0
  103. package/dist/components/auth/authenticate/strategies/jwks/index.d.ts.map +1 -0
  104. package/dist/components/auth/authenticate/strategies/jwks/index.js +19 -0
  105. package/dist/components/auth/authenticate/strategies/jwks/index.js.map +1 -0
  106. package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts +13 -0
  107. package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts.map +1 -0
  108. package/dist/components/auth/authenticate/strategies/{jwks.strategy.js → jwks/issuer.js} +4 -27
  109. package/dist/components/auth/authenticate/strategies/jwks/issuer.js.map +1 -0
  110. package/dist/components/auth/authenticate/strategies/{jwks.strategy.d.ts → jwks/verifier.d.ts} +2 -10
  111. package/dist/components/auth/authenticate/strategies/jwks/verifier.d.ts.map +1 -0
  112. package/dist/components/auth/authenticate/strategies/jwks/verifier.js +45 -0
  113. package/dist/components/auth/authenticate/strategies/jwks/verifier.js.map +1 -0
  114. package/dist/components/auth/authorize/adapters/base-filtered.d.ts +1 -1
  115. package/dist/components/auth/authorize/adapters/base-filtered.d.ts.map +1 -1
  116. package/dist/components/auth/authorize/adapters/common/index.d.ts +2 -0
  117. package/dist/components/auth/authorize/adapters/common/index.d.ts.map +1 -0
  118. package/dist/components/auth/authorize/adapters/common/index.js +18 -0
  119. package/dist/components/auth/authorize/adapters/common/index.js.map +1 -0
  120. package/dist/components/auth/authorize/adapters/{types.d.ts → common/types.d.ts} +1 -1
  121. package/dist/components/auth/authorize/adapters/common/types.d.ts.map +1 -0
  122. package/dist/components/auth/authorize/adapters/common/types.js.map +1 -0
  123. package/dist/components/auth/authorize/adapters/connector.d.ts +1 -1
  124. package/dist/components/auth/authorize/adapters/connector.d.ts.map +1 -1
  125. package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts +1 -1
  126. package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -1
  127. package/dist/components/auth/authorize/adapters/index.d.ts +2 -2
  128. package/dist/components/auth/authorize/adapters/index.d.ts.map +1 -1
  129. package/dist/components/auth/authorize/adapters/index.js +2 -2
  130. package/dist/components/auth/authorize/adapters/index.js.map +1 -1
  131. package/dist/components/auth/authorize/adapters/{scoped-casbin.adapter.d.ts → scoped-casbin/adapter.d.ts} +11 -55
  132. package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.d.ts.map +1 -0
  133. package/dist/components/auth/authorize/adapters/{scoped-casbin.adapter.js → scoped-casbin/adapter.js} +27 -22
  134. package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.js.map +1 -0
  135. package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts +2 -0
  136. package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts.map +1 -0
  137. package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js +5 -0
  138. package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js.map +1 -0
  139. package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts +3 -0
  140. package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts.map +1 -0
  141. package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js +19 -0
  142. package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js.map +1 -0
  143. package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts +50 -0
  144. package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts.map +1 -0
  145. package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js +3 -0
  146. package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js.map +1 -0
  147. package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts +4 -0
  148. package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts.map +1 -0
  149. package/dist/components/auth/authorize/adapters/scoped-casbin/index.js +19 -0
  150. package/dist/components/auth/authorize/adapters/scoped-casbin/index.js.map +1 -0
  151. package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts +17 -0
  152. package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts.map +1 -0
  153. package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js +11 -0
  154. package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js.map +1 -0
  155. package/dist/components/auth/authorize/enforcers/policy-line-codec.d.ts.map +1 -1
  156. package/dist/components/auth/authorize/enforcers/policy-line-codec.js +4 -2
  157. package/dist/components/auth/authorize/enforcers/policy-line-codec.js.map +1 -1
  158. package/dist/components/auth/authorize/role-managers/base.d.ts.map +1 -1
  159. package/dist/components/auth/authorize/role-managers/base.js +2 -1
  160. package/dist/components/auth/authorize/role-managers/base.js.map +1 -1
  161. package/dist/components/auth/models/entities/policy-definition.model.d.ts +30 -9
  162. package/dist/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
  163. package/dist/components/auth/models/entities/policy-definition.model.js +36 -10
  164. package/dist/components/auth/models/entities/policy-definition.model.js.map +1 -1
  165. package/dist/components/auth/models/entities/user.model.d.ts +2 -2
  166. package/dist/components/controller/grpc/grpc.component.d.ts.map +1 -1
  167. package/dist/components/controller/grpc/grpc.component.js +1 -5
  168. package/dist/components/controller/grpc/grpc.component.js.map +1 -1
  169. package/dist/components/health-check/common/constants.d.ts +5 -0
  170. package/dist/components/health-check/common/constants.d.ts.map +1 -0
  171. package/dist/components/health-check/common/constants.js +9 -0
  172. package/dist/components/health-check/common/constants.js.map +1 -0
  173. package/dist/components/health-check/common/index.d.ts +1 -0
  174. package/dist/components/health-check/common/index.d.ts.map +1 -1
  175. package/dist/components/health-check/common/index.js +1 -0
  176. package/dist/components/health-check/common/index.js.map +1 -1
  177. package/dist/components/health-check/common/keys.d.ts +2 -0
  178. package/dist/components/health-check/common/keys.d.ts.map +1 -1
  179. package/dist/components/health-check/common/keys.js +2 -0
  180. package/dist/components/health-check/common/keys.js.map +1 -1
  181. package/dist/components/health-check/common/rest-paths.d.ts +1 -0
  182. package/dist/components/health-check/common/rest-paths.d.ts.map +1 -1
  183. package/dist/components/health-check/common/rest-paths.js +1 -0
  184. package/dist/components/health-check/common/rest-paths.js.map +1 -1
  185. package/dist/components/health-check/common/types.d.ts +22 -0
  186. package/dist/components/health-check/common/types.d.ts.map +1 -1
  187. package/dist/components/health-check/component.d.ts +9 -3
  188. package/dist/components/health-check/component.d.ts.map +1 -1
  189. package/dist/components/health-check/component.js +38 -1
  190. package/dist/components/health-check/component.js.map +1 -1
  191. package/dist/components/health-check/controller.d.ts +10 -2
  192. package/dist/components/health-check/controller.d.ts.map +1 -1
  193. package/dist/components/health-check/controller.js +79 -13
  194. package/dist/components/health-check/controller.js.map +1 -1
  195. package/dist/components/health-check/index.d.ts +1 -0
  196. package/dist/components/health-check/index.d.ts.map +1 -1
  197. package/dist/components/health-check/index.js +1 -0
  198. package/dist/components/health-check/index.js.map +1 -1
  199. package/dist/components/health-check/reporter.d.ts +98 -0
  200. package/dist/components/health-check/reporter.d.ts.map +1 -0
  201. package/dist/components/health-check/reporter.js +138 -0
  202. package/dist/components/health-check/reporter.js.map +1 -0
  203. package/dist/components/mail/common/constants.d.ts +13 -0
  204. package/dist/components/mail/common/constants.d.ts.map +1 -1
  205. package/dist/components/mail/common/constants.js +20 -1
  206. package/dist/components/mail/common/constants.js.map +1 -1
  207. package/dist/components/mail/common/errors.d.ts +25 -0
  208. package/dist/components/mail/common/errors.d.ts.map +1 -1
  209. package/dist/components/mail/common/errors.js +22 -0
  210. package/dist/components/mail/common/errors.js.map +1 -1
  211. package/dist/components/mail/common/types/index.d.ts +6 -0
  212. package/dist/components/mail/common/types/index.d.ts.map +1 -0
  213. package/dist/components/mail/common/types/index.js +22 -0
  214. package/dist/components/mail/common/types/index.js.map +1 -0
  215. package/dist/components/mail/common/types/message.d.ts +50 -0
  216. package/dist/components/mail/common/types/message.d.ts.map +1 -0
  217. package/dist/components/mail/common/types/message.js +3 -0
  218. package/dist/components/mail/common/types/message.js.map +1 -0
  219. package/dist/components/mail/common/types/options.d.ts +72 -0
  220. package/dist/components/mail/common/types/options.d.ts.map +1 -0
  221. package/dist/components/mail/common/types/options.js +3 -0
  222. package/dist/components/mail/common/types/options.js.map +1 -0
  223. package/dist/components/mail/common/types/queue.d.ts +56 -0
  224. package/dist/components/mail/common/types/queue.d.ts.map +1 -0
  225. package/dist/components/mail/common/types/queue.js +3 -0
  226. package/dist/components/mail/common/types/queue.js.map +1 -0
  227. package/dist/components/mail/common/types/template.d.ts +33 -0
  228. package/dist/components/mail/common/types/template.d.ts.map +1 -0
  229. package/dist/components/mail/common/types/template.js +3 -0
  230. package/dist/components/mail/common/types/template.js.map +1 -0
  231. package/dist/components/mail/common/types/verification.d.ts +26 -0
  232. package/dist/components/mail/common/types/verification.d.ts.map +1 -0
  233. package/dist/components/mail/common/types/verification.js +3 -0
  234. package/dist/components/mail/common/types/verification.js.map +1 -0
  235. package/dist/components/mail/component.d.ts +6 -1
  236. package/dist/components/mail/component.d.ts.map +1 -1
  237. package/dist/components/mail/component.js +68 -16
  238. package/dist/components/mail/component.js.map +1 -1
  239. package/dist/components/mail/helpers/executors/bull-mq-executor.helper.d.ts +1 -0
  240. package/dist/components/mail/helpers/executors/bull-mq-executor.helper.d.ts.map +1 -1
  241. package/dist/components/mail/helpers/executors/bull-mq-executor.helper.js +3 -0
  242. package/dist/components/mail/helpers/executors/bull-mq-executor.helper.js.map +1 -1
  243. package/dist/components/mail/helpers/executors/internal-queue-executor.helper.d.ts.map +1 -1
  244. package/dist/components/mail/helpers/executors/internal-queue-executor.helper.js +2 -1
  245. package/dist/components/mail/helpers/executors/internal-queue-executor.helper.js.map +1 -1
  246. package/dist/components/mail/helpers/transporters/amazon-ses-transporter.helper.d.ts +19 -0
  247. package/dist/components/mail/helpers/transporters/amazon-ses-transporter.helper.d.ts.map +1 -0
  248. package/dist/components/mail/helpers/transporters/amazon-ses-transporter.helper.js +114 -0
  249. package/dist/components/mail/helpers/transporters/amazon-ses-transporter.helper.js.map +1 -0
  250. package/dist/components/mail/helpers/transporters/index.d.ts +2 -1
  251. package/dist/components/mail/helpers/transporters/index.d.ts.map +1 -1
  252. package/dist/components/mail/helpers/transporters/index.js +2 -1
  253. package/dist/components/mail/helpers/transporters/index.js.map +1 -1
  254. package/dist/components/mail/helpers/transporters/mailgun-transporter.helper.d.ts.map +1 -1
  255. package/dist/components/mail/helpers/transporters/mailgun-transporter.helper.js +10 -9
  256. package/dist/components/mail/helpers/transporters/mailgun-transporter.helper.js.map +1 -1
  257. package/dist/components/mail/helpers/transporters/nodemail-transporter.helper.d.ts.map +1 -1
  258. package/dist/components/mail/helpers/transporters/nodemail-transporter.helper.js +12 -1
  259. package/dist/components/mail/helpers/transporters/nodemail-transporter.helper.js.map +1 -1
  260. package/dist/components/mail/providers/mail-transporter.provider.d.ts +2 -0
  261. package/dist/components/mail/providers/mail-transporter.provider.d.ts.map +1 -1
  262. package/dist/components/mail/providers/mail-transporter.provider.js +35 -17
  263. package/dist/components/mail/providers/mail-transporter.provider.js.map +1 -1
  264. package/dist/components/mail/services/generators/index.d.ts +4 -0
  265. package/dist/components/mail/services/generators/index.d.ts.map +1 -0
  266. package/dist/components/mail/services/generators/index.js +20 -0
  267. package/dist/components/mail/services/generators/index.js.map +1 -0
  268. package/dist/components/mail/services/generators/numeric-code.d.ts +7 -0
  269. package/dist/components/mail/services/generators/numeric-code.d.ts.map +1 -0
  270. package/dist/components/mail/services/generators/numeric-code.js +20 -0
  271. package/dist/components/mail/services/generators/numeric-code.js.map +1 -0
  272. package/dist/components/mail/services/generators/random-token.d.ts +7 -0
  273. package/dist/components/mail/services/generators/random-token.d.ts.map +1 -0
  274. package/dist/components/mail/services/generators/random-token.js +18 -0
  275. package/dist/components/mail/services/generators/random-token.js.map +1 -0
  276. package/dist/components/mail/services/{generator.service.d.ts → generators/verification-data.d.ts} +2 -10
  277. package/dist/components/mail/services/generators/verification-data.d.ts.map +1 -0
  278. package/dist/components/mail/services/{generator.service.js → generators/verification-data.js} +5 -29
  279. package/dist/components/mail/services/generators/verification-data.js.map +1 -0
  280. package/dist/components/mail/services/index.d.ts +1 -1
  281. package/dist/components/mail/services/index.d.ts.map +1 -1
  282. package/dist/components/mail/services/index.js +1 -1
  283. package/dist/components/mail/services/index.js.map +1 -1
  284. package/dist/components/mail/services/mail.service.d.ts.map +1 -1
  285. package/dist/components/mail/services/mail.service.js +37 -20
  286. package/dist/components/mail/services/mail.service.js.map +1 -1
  287. package/dist/components/mail/utilities/address.utility.d.ts +9 -0
  288. package/dist/components/mail/utilities/address.utility.d.ts.map +1 -0
  289. package/dist/components/mail/utilities/address.utility.js +36 -0
  290. package/dist/components/mail/utilities/address.utility.js.map +1 -0
  291. package/dist/components/mail/utilities/attachment.utility.d.ts +31 -0
  292. package/dist/components/mail/utilities/attachment.utility.d.ts.map +1 -0
  293. package/dist/components/mail/utilities/attachment.utility.js +214 -0
  294. package/dist/components/mail/utilities/attachment.utility.js.map +1 -0
  295. package/dist/components/mail/utilities/body.utility.d.ts +6 -0
  296. package/dist/components/mail/utilities/body.utility.d.ts.map +1 -0
  297. package/dist/components/mail/utilities/body.utility.js +20 -0
  298. package/dist/components/mail/utilities/body.utility.js.map +1 -0
  299. package/dist/components/mail/utilities/index.d.ts +2 -0
  300. package/dist/components/mail/utilities/index.d.ts.map +1 -1
  301. package/dist/components/mail/utilities/index.js +2 -0
  302. package/dist/components/mail/utilities/index.js.map +1 -1
  303. package/dist/components/mail/utilities/mime.utility.d.ts +19 -0
  304. package/dist/components/mail/utilities/mime.utility.d.ts.map +1 -0
  305. package/dist/components/mail/utilities/mime.utility.js +390 -0
  306. package/dist/components/mail/utilities/mime.utility.js.map +1 -0
  307. package/dist/components/static-asset/common/commit-token.d.ts +23 -0
  308. package/dist/components/static-asset/common/commit-token.d.ts.map +1 -0
  309. package/dist/components/static-asset/common/commit-token.js +40 -0
  310. package/dist/components/static-asset/common/commit-token.js.map +1 -0
  311. package/dist/components/static-asset/common/constants.d.ts +21 -1
  312. package/dist/components/static-asset/common/constants.d.ts.map +1 -1
  313. package/dist/components/static-asset/common/constants.js +39 -2
  314. package/dist/components/static-asset/common/constants.js.map +1 -1
  315. package/dist/components/static-asset/common/errors.d.ts +52 -0
  316. package/dist/components/static-asset/common/errors.d.ts.map +1 -1
  317. package/dist/components/static-asset/common/errors.js +46 -0
  318. package/dist/components/static-asset/common/errors.js.map +1 -1
  319. package/dist/components/static-asset/common/index.d.ts +1 -0
  320. package/dist/components/static-asset/common/index.d.ts.map +1 -1
  321. package/dist/components/static-asset/common/index.js +1 -0
  322. package/dist/components/static-asset/common/index.js.map +1 -1
  323. package/dist/components/static-asset/common/keys.d.ts +1 -0
  324. package/dist/components/static-asset/common/keys.d.ts.map +1 -1
  325. package/dist/components/static-asset/common/keys.js +1 -0
  326. package/dist/components/static-asset/common/keys.js.map +1 -1
  327. package/dist/components/static-asset/common/types.d.ts +100 -30
  328. package/dist/components/static-asset/common/types.d.ts.map +1 -1
  329. package/dist/components/static-asset/component.d.ts +4 -1
  330. package/dist/components/static-asset/component.d.ts.map +1 -1
  331. package/dist/components/static-asset/component.js +21 -10
  332. package/dist/components/static-asset/component.js.map +1 -1
  333. package/dist/components/static-asset/controller/base.definition.d.ts +27 -554
  334. package/dist/components/static-asset/controller/base.definition.d.ts.map +1 -1
  335. package/dist/components/static-asset/controller/base.definition.js +259 -286
  336. package/dist/components/static-asset/controller/base.definition.js.map +1 -1
  337. package/dist/components/static-asset/controller/factory.d.ts +76 -7
  338. package/dist/components/static-asset/controller/factory.d.ts.map +1 -1
  339. package/dist/components/static-asset/controller/factory.js +810 -328
  340. package/dist/components/static-asset/controller/factory.js.map +1 -1
  341. package/dist/components/static-asset/controller/key-scope.d.ts +28 -0
  342. package/dist/components/static-asset/controller/key-scope.d.ts.map +1 -0
  343. package/dist/components/static-asset/controller/key-scope.js +44 -0
  344. package/dist/components/static-asset/controller/key-scope.js.map +1 -0
  345. package/dist/components/static-asset/controller/meta-link.d.ts +37 -0
  346. package/dist/components/static-asset/controller/meta-link.d.ts.map +1 -0
  347. package/dist/components/static-asset/controller/meta-link.js +95 -0
  348. package/dist/components/static-asset/controller/meta-link.js.map +1 -0
  349. package/dist/components/static-asset/controller/route-options.d.ts +18 -0
  350. package/dist/components/static-asset/controller/route-options.d.ts.map +1 -0
  351. package/dist/components/static-asset/controller/route-options.js +37 -0
  352. package/dist/components/static-asset/controller/route-options.js.map +1 -0
  353. package/dist/components/static-asset/index.d.ts +1 -0
  354. package/dist/components/static-asset/index.d.ts.map +1 -1
  355. package/dist/components/static-asset/index.js +1 -0
  356. package/dist/components/static-asset/index.js.map +1 -1
  357. package/dist/components/static-asset/ingest.d.ts +58 -0
  358. package/dist/components/static-asset/ingest.d.ts.map +1 -0
  359. package/dist/components/static-asset/ingest.js +82 -0
  360. package/dist/components/static-asset/ingest.js.map +1 -0
  361. package/dist/components/static-asset/models/base.model.d.ts +44 -6
  362. package/dist/components/static-asset/models/base.model.d.ts.map +1 -1
  363. package/dist/components/static-asset/models/base.model.js +7 -1
  364. package/dist/components/static-asset/models/base.model.js.map +1 -1
  365. package/dist/components/websocket/handlers/bun.handler.d.ts.map +1 -1
  366. package/dist/components/websocket/handlers/bun.handler.js +2 -1
  367. package/dist/components/websocket/handlers/bun.handler.js.map +1 -1
  368. package/dist/connectors/postgres/drivers/postgres-js.d.mts +3 -0
  369. package/dist/connectors/postgres/drivers/postgres-js.d.mts.map +1 -0
  370. package/dist/connectors/postgres/drivers/postgres-js.mjs +3 -0
  371. package/dist/connectors/postgres/drivers/postgres-js.mjs.map +1 -0
  372. package/dist/helpers/index.d.ts.map +1 -1
  373. package/dist/helpers/index.js.map +1 -1
  374. package/dist/index.d.ts +1 -1
  375. package/dist/index.d.ts.map +1 -1
  376. package/dist/testing/index.d.ts +3 -0
  377. package/dist/testing/index.d.ts.map +1 -0
  378. package/dist/testing/index.js +19 -0
  379. package/dist/testing/index.js.map +1 -0
  380. package/package.json +33 -26
  381. package/dist/base/applications/types.d.ts.map +0 -1
  382. package/dist/base/applications/types.js.map +0 -1
  383. package/dist/components/api-reference/ui-factory.d.ts +0 -24
  384. package/dist/components/api-reference/ui-factory.d.ts.map +0 -1
  385. package/dist/components/api-reference/ui-factory.js +0 -97
  386. package/dist/components/api-reference/ui-factory.js.map +0 -1
  387. package/dist/components/auth/authenticate/strategies/jwks.strategy.d.ts.map +0 -1
  388. package/dist/components/auth/authenticate/strategies/jwks.strategy.js.map +0 -1
  389. package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts.map +0 -1
  390. package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.js.map +0 -1
  391. package/dist/components/auth/authorize/adapters/types.d.ts.map +0 -1
  392. package/dist/components/auth/authorize/adapters/types.js.map +0 -1
  393. package/dist/components/mail/common/types.d.ts +0 -201
  394. package/dist/components/mail/common/types.d.ts.map +0 -1
  395. package/dist/components/mail/common/types.js +0 -10
  396. package/dist/components/mail/common/types.js.map +0 -1
  397. package/dist/components/mail/services/generator.service.d.ts.map +0 -1
  398. package/dist/components/mail/services/generator.service.js.map +0 -1
  399. /package/dist/base/applications/{types.js → common/types.js} +0 -0
  400. /package/dist/components/auth/authorize/adapters/{types.js → common/types.js} +0 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RandomTokenGenerator = void 0;
7
+ const core_1 = require("@venizia/ignis-helpers/core");
8
+ const node_crypto_1 = __importDefault(require("node:crypto"));
9
+ class RandomTokenGenerator extends core_1.BaseHelper {
10
+ constructor() {
11
+ super({ scope: RandomTokenGenerator.name });
12
+ }
13
+ generateToken(bytes) {
14
+ return node_crypto_1.default.randomBytes(bytes).toString('base64url');
15
+ }
16
+ }
17
+ exports.RandomTokenGenerator = RandomTokenGenerator;
18
+ //# sourceMappingURL=random-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-token.js","sourceRoot":"","sources":["../../../../../src/components/mail/services/generators/random-token.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyD;AACzD,8DAAiC;AAGjC,MAAa,oBAAqB,SAAQ,iBAAU;IAClD;QACE,KAAK,CAAC,EAAE,KAAK,EAAE,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,qBAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;CACF;AARD,oDAQC"}
@@ -1,17 +1,9 @@
1
1
  import { BaseHelper } from '@venizia/ignis-helpers/core';
2
- import type { IVerificationCodeGenerator, IVerificationData, IVerificationDataGenerator, IVerificationGenerationOptions, IVerificationTokenGenerator } from '../common';
3
- export declare class NumericCodeGenerator extends BaseHelper implements IVerificationCodeGenerator {
4
- constructor();
5
- generateCode(length: number): string;
6
- }
7
- export declare class RandomTokenGenerator extends BaseHelper implements IVerificationTokenGenerator {
8
- constructor();
9
- generateToken(bytes: number): string;
10
- }
2
+ import type { IVerificationCodeGenerator, IVerificationData, IVerificationDataGenerator, IVerificationGenerationOptions, IVerificationTokenGenerator } from '../../common';
11
3
  export declare class DefaultVerificationDataGenerator extends BaseHelper implements IVerificationDataGenerator {
12
4
  private codeGenerator;
13
5
  private tokenGenerator;
14
6
  constructor(codeGenerator: IVerificationCodeGenerator, tokenGenerator: IVerificationTokenGenerator);
15
7
  generateVerificationData(options: IVerificationGenerationOptions): IVerificationData;
16
8
  }
17
- //# sourceMappingURL=generator.service.d.ts.map
9
+ //# sourceMappingURL=verification-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-data.d.ts","sourceRoot":"","sources":["../../../../../src/components/mail/services/generators/verification-data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,KAAK,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,0BAA0B,EAC1B,8BAA8B,EAC9B,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,qBAAa,gCACX,SAAQ,UACR,YAAW,0BAA0B;IAInC,OAAO,CAAC,aAAa;IAGrB,OAAO,CAAC,cAAc;gBAHd,aAAa,EAAE,0BAA0B,EAGzC,cAAc,EAAE,2BAA2B;IAKrD,wBAAwB,CAAC,OAAO,EAAE,8BAA8B,GAAG,iBAAiB;CAkBrF"}
@@ -11,37 +11,13 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
- var __importDefault = (this && this.__importDefault) || function (mod) {
15
- return (mod && mod.__esModule) ? mod : { "default": mod };
16
- };
17
14
  var DefaultVerificationDataGenerator_1;
18
15
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.DefaultVerificationDataGenerator = exports.RandomTokenGenerator = exports.NumericCodeGenerator = void 0;
20
- const metadata_1 = require("../../../base/metadata");
16
+ exports.DefaultVerificationDataGenerator = void 0;
17
+ const metadata_1 = require("../../../../base/metadata");
21
18
  const core_1 = require("@venizia/ignis-helpers/core");
22
- const node_crypto_1 = __importDefault(require("node:crypto"));
23
- const common_1 = require("../common");
24
- const utilities_1 = require("../utilities");
25
- class NumericCodeGenerator extends core_1.BaseHelper {
26
- constructor() {
27
- super({ scope: NumericCodeGenerator.name });
28
- }
29
- generateCode(length) {
30
- const max = Math.pow(10, length);
31
- const code = node_crypto_1.default.randomInt(0, max);
32
- return code.toString().padStart(length, '0');
33
- }
34
- }
35
- exports.NumericCodeGenerator = NumericCodeGenerator;
36
- class RandomTokenGenerator extends core_1.BaseHelper {
37
- constructor() {
38
- super({ scope: RandomTokenGenerator.name });
39
- }
40
- generateToken(bytes) {
41
- return node_crypto_1.default.randomBytes(bytes).toString('base64url');
42
- }
43
- }
44
- exports.RandomTokenGenerator = RandomTokenGenerator;
19
+ const common_1 = require("../../common");
20
+ const utilities_1 = require("../../utilities");
45
21
  let DefaultVerificationDataGenerator = DefaultVerificationDataGenerator_1 = class DefaultVerificationDataGenerator extends core_1.BaseHelper {
46
22
  constructor(codeGenerator, tokenGenerator) {
47
23
  super({ scope: DefaultVerificationDataGenerator_1.name });
@@ -70,4 +46,4 @@ exports.DefaultVerificationDataGenerator = DefaultVerificationDataGenerator = De
70
46
  __param(1, (0, metadata_1.inject)({ key: common_1.MailKeys.MAIL_VERIFICATION_TOKEN_GENERATOR })),
71
47
  __metadata("design:paramtypes", [Object, Object])
72
48
  ], DefaultVerificationDataGenerator);
73
- //# sourceMappingURL=generator.service.js.map
49
+ //# sourceMappingURL=verification-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-data.js","sourceRoot":"","sources":["../../../../../src/components/mail/services/generators/verification-data.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAAyC;AACzC,sDAAyD;AASzD,yCAAwC;AACxC,+CAAsE;AAEtE,IAAa,gCAAgC,wCAA7C,MAAa,gCACX,SAAQ,iBAAU;IAGlB,YAEU,aAAyC,EAGzC,cAA2C;QAEnD,KAAK,CAAC,EAAE,KAAK,EAAE,kCAAgC,CAAC,IAAI,EAAE,CAAC,CAAC;QALhD,kBAAa,GAAb,aAAa,CAA4B;QAGzC,mBAAc,GAAd,cAAc,CAA6B;IAGrD,CAAC;IAED,wBAAwB,CAAC,OAAuC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,OAAO;YACL,gBAAgB,EAAE,IAAI;YACtB,eAAe,EAAE,GAAG;YACpB,aAAa,EAAE,IAAA,yBAAa,EAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE;YACrE,YAAY,EAAE,CAAC;YAEf,iBAAiB,EAAE,KAAK;YACxB,gBAAgB,EAAE,GAAG;YACrB,cAAc,EAAE,IAAA,gCAAoB,EAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE;YAE5E,cAAc,EAAE,GAAG;SACpB,CAAC;IACJ,CAAC;CACF,CAAA;AAhCY,4EAAgC;2CAAhC,gCAAgC;IAKxC,WAAA,IAAA,iBAAM,EAAC,EAAE,GAAG,EAAE,iBAAQ,CAAC,gCAAgC,EAAE,CAAC,CAAA;IAG1D,WAAA,IAAA,iBAAM,EAAC,EAAE,GAAG,EAAE,iBAAQ,CAAC,iCAAiC,EAAE,CAAC,CAAA;;GARnD,gCAAgC,CAgC5C"}
@@ -1,4 +1,4 @@
1
- export * from './generator.service';
1
+ export * from './generators';
2
2
  export * from './mail.service';
3
3
  export * from './template.service';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./generator.service"), exports);
17
+ __exportStar(require("./generators"), exports);
18
18
  __exportStar(require("./mail.service"), exports);
19
19
  __exportStar(require("./template.service"), exports);
20
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/mail/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,iDAA+B;AAC/B,qDAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/mail/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,iDAA+B;AAC/B,qDAAmC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mail.service.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/services/mail.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACb,MAAM,WAAW,CAAC;AAInB,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD,qBAAa,WAAY,SAAQ,WAAY,YAAW,YAAY;IAGhE,SAAS,CAAC,OAAO,EAAE,YAAY;IAE/B,SAAS,CAAC,SAAS,EAAE,cAAc;IAEnC,SAAS,CAAC,cAAc,CAAC,EAAE,mBAAmB;gBAJpC,OAAO,EAAE,YAAY,EAErB,SAAS,EAAE,cAAc,EAEzB,cAAc,CAAC,EAAE,mBAAmB,YAAA;IAQ1C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAqCrD,SAAS,CACb,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,eAAe,EAAE,CAAC;IA2CvB,YAAY,CAAC,IAAI,EAAE;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KACjC,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBhC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAuBtD,SAAS,CAAC,cAAc,IAAI,MAAM;CAcnC"}
1
+ {"version":3,"file":"mail.service.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/services/mail.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,YAAY,EACb,MAAM,WAAW,CAAC;AAInB,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAKxD,qBAAa,WAAY,SAAQ,WAAY,YAAW,YAAY;IAGhE,SAAS,CAAC,OAAO,EAAE,YAAY;IAE/B,SAAS,CAAC,SAAS,EAAE,cAAc;IAEnC,SAAS,CAAC,cAAc,CAAC,EAAE,mBAAmB;gBAJpC,OAAO,EAAE,YAAY,EAErB,SAAS,EAAE,cAAc,EAEzB,cAAc,CAAC,EAAE,mBAAmB,YAAA;IAQ1C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAiDrD,SAAS,CACb,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACjC,OAAO,CAAC,eAAe,EAAE,CAAC;IA4CvB,YAAY,CAAC,IAAI,EAAE;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KACjC,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CtB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAiBhC,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAyBtD,SAAS,CAAC,cAAc,IAAI,MAAM;CAcnC"}
@@ -14,11 +14,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
14
14
  var MailService_1;
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.MailService = void 0;
17
+ const common_1 = require("@venizia/ignis-helpers/common");
17
18
  const ignis_kernel_1 = require("@venizia/ignis-kernel");
18
- const common_1 = require("../common");
19
+ const common_2 = require("../common");
19
20
  const metadata_1 = require("../../../base/metadata");
20
21
  const core_1 = require("@venizia/ignis-helpers/core");
21
22
  const ignis_helpers_1 = require("@venizia/ignis-helpers");
23
+ const attachment_utility_1 = require("../utilities/attachment.utility");
24
+ const body_utility_1 = require("../utilities/body.utility");
22
25
  let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseService {
23
26
  constructor(options, transport, templateEngine) {
24
27
  super({ scope: MailService_1.name });
@@ -36,6 +39,14 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
36
39
  ...message,
37
40
  from: message.from ?? this.getDefaultFrom(),
38
41
  };
42
+ // The one place the attachment policy applies: every transport receives bytes, never a path.
43
+ if (message.attachments) {
44
+ emailMessage.attachments = await (0, attachment_utility_1.resolveMailAttachments)({
45
+ attachments: message.attachments,
46
+ attachmentRoot: this.options.attachmentRoot,
47
+ maxBytes: this.options.maxAttachmentBytes ?? common_2.MailDefaults.MAX_ATTACHMENT_BYTES,
48
+ });
49
+ }
39
50
  this.logger.for(this.send.name).debug('Sending email to: %s', emailMessage.to);
40
51
  const result = await this.transport.send(emailMessage);
41
52
  if (result.success) {
@@ -50,20 +61,23 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
50
61
  }
51
62
  catch (error) {
52
63
  this.logger.for(this.send.name).error('Error sending email: %s', error);
64
+ (0, attachment_utility_1.releaseAttachmentStreams)({ attachments: message.attachments });
53
65
  // An error the framework already shaped carries its own status and message code; re-wrapping as 500 would report a caller mistake as a server fault.
54
66
  if ((0, core_1.isApplicationError)(error)) {
55
67
  throw error;
56
68
  }
57
69
  throw (0, core_1.getError)({
58
- statusCode: 500,
59
- messageCode: common_1.MailErrorCodes.SEND_FAILED,
60
- message: `Failed to send email: ${error instanceof Error ? error.message : 'Unknown error'}`,
70
+ statusCode: common_1.HTTP.ResultCodes.RS_5.InternalServerError,
71
+ messageCode: common_2.MailErrorCodes.SEND_FAILED,
72
+ // The raw text can carry a file path or a provider detail; it rides in `cause`, which only development responses show.
73
+ message: 'Failed to send email',
74
+ cause: error,
61
75
  });
62
76
  }
63
77
  }
64
78
  async sendBatch(messages, options) {
65
79
  try {
66
- const concurrency = options?.concurrency ?? common_1.MailDefaults.BATCH_CONCURRENCY;
80
+ const concurrency = options?.concurrency ?? common_2.MailDefaults.BATCH_CONCURRENCY;
67
81
  this.logger
68
82
  .for(this.sendBatch.name)
69
83
  .info('Sending batch of %d emails with concurrency: %d', messages.length, concurrency);
@@ -91,9 +105,10 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
91
105
  catch (error) {
92
106
  this.logger.for(this.sendBatch.name).error('Error sending batch emails: %s', error);
93
107
  throw (0, core_1.getError)({
94
- statusCode: 500,
95
- messageCode: common_1.MailErrorCodes.BATCH_SEND_FAILED,
96
- message: `Failed to send batch emails: ${error instanceof Error ? error.message : 'Unknown error'}`,
108
+ statusCode: common_1.HTTP.ResultCodes.RS_5.InternalServerError,
109
+ messageCode: common_2.MailErrorCodes.BATCH_SEND_FAILED,
110
+ message: 'Failed to send batch emails',
111
+ cause: error,
97
112
  });
98
113
  }
99
114
  }
@@ -102,8 +117,8 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
102
117
  try {
103
118
  if (!this.templateEngine) {
104
119
  throw (0, core_1.getError)({
105
- statusCode: 500,
106
- messageCode: common_1.MailErrorCodes.INVALID_CONFIGURATION,
120
+ statusCode: common_1.HTTP.ResultCodes.RS_5.InternalServerError,
121
+ messageCode: common_2.MailErrorCodes.INVALID_CONFIGURATION,
107
122
  message: 'Template engine not configured',
108
123
  });
109
124
  }
@@ -144,37 +159,39 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
144
159
  catch (error) {
145
160
  this.logger.for(this.verify.name).error('Verification failed: %s', error);
146
161
  throw (0, core_1.getError)({
147
- statusCode: 500,
148
- messageCode: common_1.MailErrorCodes.VERIFICATION_FAILED,
149
- message: `Mail transport verification failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
162
+ statusCode: common_1.HTTP.ResultCodes.RS_5.InternalServerError,
163
+ messageCode: common_2.MailErrorCodes.VERIFICATION_FAILED,
164
+ message: 'Mail transport verification failed',
165
+ cause: error,
150
166
  });
151
167
  }
152
168
  }
153
169
  validateMessage(message) {
154
170
  if (!message.to || (Array.isArray(message.to) && message.to.length === 0)) {
155
171
  throw (0, core_1.getError)({
156
- error: common_1.MailErrors.INVALID_RECIPIENT,
172
+ error: common_2.MailErrors.INVALID_RECIPIENT,
157
173
  message: 'Recipient email address is required',
158
174
  });
159
175
  }
160
176
  if (!message.subject) {
161
177
  throw (0, core_1.getError)({
162
- error: common_1.MailErrors.INVALID_CONFIGURATION,
178
+ error: common_2.MailErrors.INVALID_CONFIGURATION,
163
179
  message: 'Email subject is required',
164
180
  });
165
181
  }
166
182
  if (!message.text && !message.html) {
167
183
  throw (0, core_1.getError)({
168
- error: common_1.MailErrors.INVALID_CONFIGURATION,
184
+ error: common_2.MailErrors.INVALID_CONFIGURATION,
169
185
  message: 'Email must have either text or html content',
170
186
  });
171
187
  }
188
+ (0, body_utility_1.assertMailBodyIsText)({ message });
172
189
  }
173
190
  getDefaultFrom() {
174
191
  const { from, fromName } = this.options;
175
192
  // A display name is only renderable around an address: `"Name" <undefined>` is not a sender.
176
193
  if (!from) {
177
- return common_1.MailDefaults.FALLBACK_FROM;
194
+ return common_2.MailDefaults.FALLBACK_FROM;
178
195
  }
179
196
  if (!fromName) {
180
197
  return from;
@@ -184,9 +201,9 @@ let MailService = MailService_1 = class MailService extends ignis_kernel_1.BaseS
184
201
  };
185
202
  exports.MailService = MailService;
186
203
  exports.MailService = MailService = MailService_1 = __decorate([
187
- __param(0, (0, metadata_1.inject)({ key: common_1.MailKeys.MAIL_OPTIONS })),
188
- __param(1, (0, metadata_1.inject)({ key: common_1.MailKeys.MAIL_TRANSPORT_INSTANCE })),
189
- __param(2, (0, metadata_1.inject)({ key: common_1.MailKeys.MAIL_TEMPLATE_ENGINE, isOptional: true })),
204
+ __param(0, (0, metadata_1.inject)({ key: common_2.MailKeys.MAIL_OPTIONS })),
205
+ __param(1, (0, metadata_1.inject)({ key: common_2.MailKeys.MAIL_TRANSPORT_INSTANCE })),
206
+ __param(2, (0, metadata_1.inject)({ key: common_2.MailKeys.MAIL_TEMPLATE_ENGINE, isOptional: true })),
190
207
  __metadata("design:paramtypes", [Object, Object, Object])
191
208
  ], MailService);
192
209
  //# sourceMappingURL=mail.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mail.service.js","sourceRoot":"","sources":["../../../../src/components/mail/services/mail.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mail.service.js","sourceRoot":"","sources":["../../../../src/components/mail/services/mail.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Splits one or more RFC 5322 mailbox strings into individual addresses. A caller-supplied `to`
3
+ * is frequently a single comma-separated string (`"a@x.com, b@y.com"`), not an array - treating
4
+ * it as one opaque address turns it into a single malformed recipient. Splitting only at
5
+ * top-level commas (outside a quoted display name) keeps `"Doe, Jane" <jane@x.com>` intact while
6
+ * still separating `"Doe, Jane" <jane@x.com>, bob@y.com` into its two mailboxes.
7
+ */
8
+ export declare function splitAddressList(value: string | string[]): string[];
9
+ //# sourceMappingURL=address.utility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.utility.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/utilities/address.utility.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CA8BnE"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.splitAddressList = splitAddressList;
4
+ /**
5
+ * Splits one or more RFC 5322 mailbox strings into individual addresses. A caller-supplied `to`
6
+ * is frequently a single comma-separated string (`"a@x.com, b@y.com"`), not an array - treating
7
+ * it as one opaque address turns it into a single malformed recipient. Splitting only at
8
+ * top-level commas (outside a quoted display name) keeps `"Doe, Jane" <jane@x.com>` intact while
9
+ * still separating `"Doe, Jane" <jane@x.com>, bob@y.com` into its two mailboxes.
10
+ */
11
+ function splitAddressList(value) {
12
+ const items = Array.isArray(value) ? value : [value];
13
+ const addresses = [];
14
+ for (const item of items) {
15
+ let current = '';
16
+ let inQuotes = false;
17
+ for (const char of item) {
18
+ if (char === '"') {
19
+ inQuotes = !inQuotes;
20
+ }
21
+ if (char === ',' && !inQuotes) {
22
+ if (current.trim()) {
23
+ addresses.push(current.trim());
24
+ }
25
+ current = '';
26
+ continue;
27
+ }
28
+ current += char;
29
+ }
30
+ if (current.trim()) {
31
+ addresses.push(current.trim());
32
+ }
33
+ }
34
+ return addresses;
35
+ }
36
+ //# sourceMappingURL=address.utility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.utility.js","sourceRoot":"","sources":["../../../../src/components/mail/utilities/address.utility.ts"],"names":[],"mappings":";;AAOA,4CA8BC;AArCD;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,KAAwB;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACvB,CAAC;YAED,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACnB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjC,CAAC;gBACD,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,OAAO,IAAI,IAAI,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type IMailAttachment } from '../common';
2
+ /**
3
+ * Reads one attachment's bytes. A string `content` is raw text unless `encoding` says otherwise
4
+ * (nodemailer's convention); `null` counts as absent. A `path` is read only inside
5
+ * `attachmentRoot` and refused without one. `maxBytes` caps the whole message; `usedBytes` is what
6
+ * earlier attachments already took.
7
+ */
8
+ export declare const readAttachmentContent: (opts: {
9
+ attachment: IMailAttachment;
10
+ attachmentRoot?: string;
11
+ maxBytes?: number;
12
+ usedBytes?: number;
13
+ }) => Promise<Buffer>;
14
+ /**
15
+ * Turns every attachment into `content` bytes and drops `path`, so no transport is ever handed a
16
+ * file or URL to read on its own. `maxBytes` is shared by all attachments of the message. An
17
+ * attachment read from `path` keeps the file's name and, when none is given, its content type.
18
+ */
19
+ export declare const resolveMailAttachments: (opts: {
20
+ attachments: IMailAttachment[];
21
+ attachmentRoot?: string;
22
+ maxBytes?: number;
23
+ }) => Promise<IMailAttachment[]>;
24
+ /**
25
+ * Releases every attachment stream of a refused send, read or not, so none keeps a descriptor
26
+ * open. A drained stream is already closed; releasing it again is harmless.
27
+ */
28
+ export declare const releaseAttachmentStreams: (opts: {
29
+ attachments?: IMailAttachment[];
30
+ }) => void;
31
+ //# sourceMappingURL=attachment.utility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment.utility.d.ts","sourceRoot":"","sources":["../../../../src/components/mail/utilities/attachment.utility.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAyJ7D;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAU,MAAM;IAChD,UAAU,EAAE,eAAe,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,OAAO,CAAC,MAAM,CAgCjB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAU,MAAM;IACjD,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,KAAG,OAAO,CAAC,eAAe,EAAE,CAwC5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,MAAM;IAAE,WAAW,CAAC,EAAE,eAAe,EAAE,CAAA;CAAE,KAAG,IA0BpF,CAAC"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.releaseAttachmentStreams = exports.resolveMailAttachments = exports.readAttachmentContent = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const common_1 = require("@venizia/ignis-helpers/common");
8
+ const core_1 = require("@venizia/ignis-helpers/core");
9
+ const ignis_helpers_1 = require("@venizia/ignis-helpers");
10
+ const common_2 = require("../common");
11
+ const logger = ignis_helpers_1.LoggerFactory.getLogger(['MailAttachments']);
12
+ // O_NONBLOCK: opening a FIFO must not wait for a writer; the fstat check then refuses it.
13
+ // Windows has neither flag; there the realpath containment check stands alone.
14
+ const OPEN_FLAGS = node_fs_1.constants.O_RDONLY | (node_fs_1.constants.O_NOFOLLOW ?? 0) | (node_fs_1.constants.O_NONBLOCK ?? 0);
15
+ // One reason for missing, directory, unreadable and escaping paths: no existence oracle.
16
+ const PATH_OUTSIDE_REASON = 'attachment.path must name a readable file inside attachmentRoot | pass the bytes as content instead';
17
+ const buildPathRefusedError = (opts) => {
18
+ return (0, core_1.getError)({
19
+ error: common_2.MailErrors.ATTACHMENT_PATH_REFUSED,
20
+ message: `Mail attachment path refused | ${opts.reason}`,
21
+ cause: opts.cause,
22
+ });
23
+ };
24
+ const buildTooLargeError = (opts) => {
25
+ return (0, core_1.getError)({
26
+ error: common_2.MailErrors.ATTACHMENT_TOO_LARGE,
27
+ message: `Mail attachments are over maxAttachmentBytes (${opts.maxBytes} bytes per message) | raise maxAttachmentBytes on the mail options, or send smaller attachments`,
28
+ });
29
+ };
30
+ const assertWithinLimit = (opts) => {
31
+ const { byteLength, usedBytes, maxBytes } = opts;
32
+ if (maxBytes === undefined || usedBytes + byteLength <= maxBytes) {
33
+ return;
34
+ }
35
+ throw buildTooLargeError({ maxBytes });
36
+ };
37
+ const isAttachmentStream = (value) => {
38
+ return typeof value === 'object' && value !== null && Symbol.asyncIterator in value;
39
+ };
40
+ const toBuffer = (chunk) => {
41
+ if (typeof chunk === 'string') {
42
+ return Buffer.from(chunk);
43
+ }
44
+ return Buffer.isBuffer(chunk)
45
+ ? chunk
46
+ : Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
47
+ };
48
+ /** Throwing out of `for await` destroys a Node Readable and cancels a web ReadableStream. */
49
+ const drainStream = async (opts) => {
50
+ const { stream, usedBytes, maxBytes } = opts;
51
+ const chunks = [];
52
+ let streamBytes = 0;
53
+ for await (const chunk of stream) {
54
+ const buffer = toBuffer(chunk);
55
+ streamBytes += buffer.byteLength;
56
+ // Per chunk: a stream has no length up front, and the rest must never be buffered.
57
+ assertWithinLimit({ byteLength: streamBytes, usedBytes, maxBytes });
58
+ chunks.push(buffer);
59
+ }
60
+ return Buffer.concat(chunks, streamBytes);
61
+ };
62
+ /**
63
+ * Both sides go through realpath, so neither `..` nor a symlink can leave the root. Not closed: a
64
+ * directory inside the root swapped for a symlink between this check and `open` - that takes write
65
+ * access inside the root, so keep the root writable only by what the application trusts.
66
+ */
67
+ const resolveConfinedPath = async (opts) => {
68
+ const { path, attachmentRoot } = opts;
69
+ let rootPath;
70
+ let filePath;
71
+ // `resolve` throws synchronously on a non-string `path` from an untyped caller; it lands here too.
72
+ try {
73
+ [rootPath, filePath] = await Promise.all([
74
+ (0, promises_1.realpath)(attachmentRoot),
75
+ (0, promises_1.realpath)((0, node_path_1.resolve)(attachmentRoot, path)),
76
+ ]);
77
+ }
78
+ catch (error) {
79
+ throw buildPathRefusedError({ reason: PATH_OUTSIDE_REASON, cause: error });
80
+ }
81
+ const relation = (0, node_path_1.relative)(rootPath, filePath);
82
+ const isOutside = relation === '' || relation === '..' || relation.startsWith(`..${node_path_1.sep}`) || (0, node_path_1.isAbsolute)(relation);
83
+ if (isOutside) {
84
+ throw buildPathRefusedError({ reason: PATH_OUTSIDE_REASON });
85
+ }
86
+ return filePath;
87
+ };
88
+ const readConfinedFile = async (opts) => {
89
+ const { path, usedBytes, attachmentRoot, maxBytes } = opts;
90
+ if (!attachmentRoot) {
91
+ throw buildPathRefusedError({
92
+ reason: 'attachment.path is read only under attachmentRoot, which is not set | set attachmentRoot on the mail options, or pass the bytes as content',
93
+ });
94
+ }
95
+ const filePath = await resolveConfinedPath({ path, attachmentRoot });
96
+ const handle = await (0, promises_1.open)(filePath, OPEN_FLAGS).catch(error => {
97
+ throw buildPathRefusedError({ reason: PATH_OUTSIDE_REASON, cause: error });
98
+ });
99
+ try {
100
+ const stats = await handle.stat();
101
+ if (!stats.isFile()) {
102
+ throw buildPathRefusedError({ reason: PATH_OUTSIDE_REASON });
103
+ }
104
+ // Sized before reading, so a file known to be oversized is never opened for reading.
105
+ assertWithinLimit({ byteLength: stats.size, usedBytes, maxBytes });
106
+ // Counted while read, and read no further than one byte past the budget: the file may have
107
+ // grown since fstat.
108
+ const stream = handle.createReadStream({
109
+ autoClose: false,
110
+ end: maxBytes === undefined ? Infinity : maxBytes - usedBytes,
111
+ });
112
+ return await drainStream({ stream, usedBytes, maxBytes });
113
+ }
114
+ finally {
115
+ await handle.close();
116
+ }
117
+ };
118
+ /**
119
+ * Reads one attachment's bytes. A string `content` is raw text unless `encoding` says otherwise
120
+ * (nodemailer's convention); `null` counts as absent. A `path` is read only inside
121
+ * `attachmentRoot` and refused without one. `maxBytes` caps the whole message; `usedBytes` is what
122
+ * earlier attachments already took.
123
+ */
124
+ const readAttachmentContent = async (opts) => {
125
+ const { attachment, attachmentRoot, maxBytes, usedBytes = 0 } = opts;
126
+ const { content } = attachment;
127
+ if (content !== undefined && content !== null) {
128
+ if (typeof content === 'string') {
129
+ const encoding = attachment.encoding ?? 'utf-8';
130
+ assertWithinLimit({ byteLength: Buffer.byteLength(content, encoding), usedBytes, maxBytes });
131
+ return Buffer.from(content, encoding);
132
+ }
133
+ if (content instanceof Uint8Array) {
134
+ assertWithinLimit({ byteLength: content.byteLength, usedBytes, maxBytes });
135
+ return toBuffer(content);
136
+ }
137
+ if (!isAttachmentStream(content)) {
138
+ throw (0, core_1.getError)({
139
+ error: common_2.MailErrors.INVALID_CONFIGURATION,
140
+ message: 'Invalid mail attachment | attachment.content must be a Buffer, a Uint8Array, a string or a stream',
141
+ });
142
+ }
143
+ return drainStream({ stream: content, usedBytes, maxBytes });
144
+ }
145
+ if (attachment.path !== undefined && attachment.path !== null) {
146
+ return readConfinedFile({ path: attachment.path, usedBytes, attachmentRoot, maxBytes });
147
+ }
148
+ return Buffer.alloc(0);
149
+ };
150
+ exports.readAttachmentContent = readAttachmentContent;
151
+ /**
152
+ * Turns every attachment into `content` bytes and drops `path`, so no transport is ever handed a
153
+ * file or URL to read on its own. `maxBytes` is shared by all attachments of the message. An
154
+ * attachment read from `path` keeps the file's name and, when none is given, its content type.
155
+ */
156
+ const resolveMailAttachments = async (opts) => {
157
+ const { attachments, attachmentRoot, maxBytes } = opts;
158
+ const resolved = [];
159
+ let usedBytes = 0;
160
+ // Sequential on purpose: each read spends the budget the previous ones left.
161
+ for (const attachment of attachments) {
162
+ const { path, href, raw, content, encoding, ...rest } = attachment;
163
+ // nodemailer reads both on its own - `href` fetches a URL, `raw` can carry a `path`.
164
+ if ((href !== undefined && href !== null) || (raw !== undefined && raw !== null)) {
165
+ throw buildPathRefusedError({
166
+ reason: 'attachment.href and attachment.raw are not supported | pass the bytes as content',
167
+ });
168
+ }
169
+ const bytes = await (0, exports.readAttachmentContent)({
170
+ attachment: { content, encoding, path },
171
+ attachmentRoot,
172
+ maxBytes,
173
+ usedBytes,
174
+ });
175
+ usedBytes += bytes.byteLength;
176
+ const isReadFromPath = (content === undefined || content === null) && typeof path === 'string';
177
+ const filename = rest.filename ?? (isReadFromPath ? (0, node_path_1.basename)(path) : undefined);
178
+ const contentType = rest.contentType ??
179
+ (isReadFromPath && filename ? common_1.ContentTypeTable.resolve({ filename }) : undefined);
180
+ resolved.push({
181
+ ...rest,
182
+ ...(filename === undefined ? {} : { filename }),
183
+ ...(contentType === undefined ? {} : { contentType }),
184
+ content: bytes,
185
+ });
186
+ }
187
+ return resolved;
188
+ };
189
+ exports.resolveMailAttachments = resolveMailAttachments;
190
+ /**
191
+ * Releases every attachment stream of a refused send, read or not, so none keeps a descriptor
192
+ * open. A drained stream is already closed; releasing it again is harmless.
193
+ */
194
+ const releaseAttachmentStreams = (opts) => {
195
+ for (const attachment of opts.attachments ?? []) {
196
+ const { content } = attachment;
197
+ if (content instanceof ReadableStream) {
198
+ if (!content.locked) {
199
+ content.cancel().catch(error => {
200
+ logger.warn('[releaseAttachmentStreams] Cancelling a web stream failed | error: %s', error);
201
+ });
202
+ }
203
+ continue;
204
+ }
205
+ if (typeof content === 'object' &&
206
+ content !== null &&
207
+ 'destroy' in content &&
208
+ typeof content.destroy === 'function') {
209
+ content.destroy();
210
+ }
211
+ }
212
+ };
213
+ exports.releaseAttachmentStreams = releaseAttachmentStreams;
214
+ //# sourceMappingURL=attachment.utility.js.map