blendsdk 5.33.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 (538) hide show
  1. package/README.md +125 -0
  2. package/dist/cmdline/cmdline.d.ts +144 -0
  3. package/dist/cmdline/cmdline.d.ts.map +1 -0
  4. package/dist/cmdline/cmdline.js +683 -0
  5. package/dist/cmdline/cmdline.js.map +1 -0
  6. package/dist/cmdline/errors.d.ts +105 -0
  7. package/dist/cmdline/errors.d.ts.map +1 -0
  8. package/dist/cmdline/errors.js +153 -0
  9. package/dist/cmdline/errors.js.map +1 -0
  10. package/dist/cmdline/index.d.ts +5 -0
  11. package/dist/cmdline/index.d.ts.map +1 -0
  12. package/dist/cmdline/index.js +5 -0
  13. package/dist/cmdline/index.js.map +1 -0
  14. package/dist/cmdline/types.d.ts +260 -0
  15. package/dist/cmdline/types.d.ts.map +1 -0
  16. package/dist/cmdline/types.js +9 -0
  17. package/dist/cmdline/types.js.map +1 -0
  18. package/dist/cmdline/validators.d.ts +28 -0
  19. package/dist/cmdline/validators.d.ts.map +1 -0
  20. package/dist/cmdline/validators.js +211 -0
  21. package/dist/cmdline/validators.js.map +1 -0
  22. package/dist/codegen/database/index.d.ts +3 -0
  23. package/dist/codegen/database/index.d.ts.map +1 -0
  24. package/dist/codegen/database/index.js +3 -0
  25. package/dist/codegen/database/index.js.map +1 -0
  26. package/dist/codegen/database/introspect/index.d.ts +3 -0
  27. package/dist/codegen/database/introspect/index.d.ts.map +1 -0
  28. package/dist/codegen/database/introspect/index.js +3 -0
  29. package/dist/codegen/database/introspect/index.js.map +1 -0
  30. package/dist/codegen/database/introspect/introspect-query.d.ts +2 -0
  31. package/dist/codegen/database/introspect/introspect-query.d.ts.map +1 -0
  32. package/dist/codegen/database/introspect/introspect-query.js +416 -0
  33. package/dist/codegen/database/introspect/introspect-query.js.map +1 -0
  34. package/dist/codegen/database/introspect/introspect-types.d.ts +45 -0
  35. package/dist/codegen/database/introspect/introspect-types.d.ts.map +1 -0
  36. package/dist/codegen/database/introspect/introspect-types.js +2 -0
  37. package/dist/codegen/database/introspect/introspect-types.js.map +1 -0
  38. package/dist/codegen/database/introspect/introspect.d.ts +21 -0
  39. package/dist/codegen/database/introspect/introspect.d.ts.map +1 -0
  40. package/dist/codegen/database/introspect/introspect.js +223 -0
  41. package/dist/codegen/database/introspect/introspect.js.map +1 -0
  42. package/dist/codegen/database/schema/check-constraint.d.ts +8 -0
  43. package/dist/codegen/database/schema/check-constraint.d.ts.map +1 -0
  44. package/dist/codegen/database/schema/check-constraint.js +12 -0
  45. package/dist/codegen/database/schema/check-constraint.js.map +1 -0
  46. package/dist/codegen/database/schema/column-schema.d.ts +7 -0
  47. package/dist/codegen/database/schema/column-schema.d.ts.map +1 -0
  48. package/dist/codegen/database/schema/column-schema.js +9 -0
  49. package/dist/codegen/database/schema/column-schema.js.map +1 -0
  50. package/dist/codegen/database/schema/constraint-base.d.ts +13 -0
  51. package/dist/codegen/database/schema/constraint-base.d.ts.map +1 -0
  52. package/dist/codegen/database/schema/constraint-base.js +32 -0
  53. package/dist/codegen/database/schema/constraint-base.js.map +1 -0
  54. package/dist/codegen/database/schema/database-schema.d.ts +19 -0
  55. package/dist/codegen/database/schema/database-schema.d.ts.map +1 -0
  56. package/dist/codegen/database/schema/database-schema.js +48 -0
  57. package/dist/codegen/database/schema/database-schema.js.map +1 -0
  58. package/dist/codegen/database/schema/dataobject-schema.d.ts +9 -0
  59. package/dist/codegen/database/schema/dataobject-schema.d.ts.map +1 -0
  60. package/dist/codegen/database/schema/dataobject-schema.js +18 -0
  61. package/dist/codegen/database/schema/dataobject-schema.js.map +1 -0
  62. package/dist/codegen/database/schema/fkey-constraints.d.ts +21 -0
  63. package/dist/codegen/database/schema/fkey-constraints.d.ts.map +1 -0
  64. package/dist/codegen/database/schema/fkey-constraints.js +58 -0
  65. package/dist/codegen/database/schema/fkey-constraints.js.map +1 -0
  66. package/dist/codegen/database/schema/index-constraint.d.ts +34 -0
  67. package/dist/codegen/database/schema/index-constraint.d.ts.map +1 -0
  68. package/dist/codegen/database/schema/index-constraint.js +79 -0
  69. package/dist/codegen/database/schema/index-constraint.js.map +1 -0
  70. package/dist/codegen/database/schema/index.d.ts +5 -0
  71. package/dist/codegen/database/schema/index.d.ts.map +1 -0
  72. package/dist/codegen/database/schema/index.js +5 -0
  73. package/dist/codegen/database/schema/index.js.map +1 -0
  74. package/dist/codegen/database/schema/primarykey-constraint.d.ts +4 -0
  75. package/dist/codegen/database/schema/primarykey-constraint.d.ts.map +1 -0
  76. package/dist/codegen/database/schema/primarykey-constraint.js +4 -0
  77. package/dist/codegen/database/schema/primarykey-constraint.js.map +1 -0
  78. package/dist/codegen/database/schema/relation-schema.d.ts +16 -0
  79. package/dist/codegen/database/schema/relation-schema.d.ts.map +1 -0
  80. package/dist/codegen/database/schema/relation-schema.js +32 -0
  81. package/dist/codegen/database/schema/relation-schema.js.map +1 -0
  82. package/dist/codegen/database/schema/table-column-schema.d.ts +59 -0
  83. package/dist/codegen/database/schema/table-column-schema.d.ts.map +1 -0
  84. package/dist/codegen/database/schema/table-column-schema.js +137 -0
  85. package/dist/codegen/database/schema/table-column-schema.js.map +1 -0
  86. package/dist/codegen/database/schema/table-schema.d.ts +48 -0
  87. package/dist/codegen/database/schema/table-schema.d.ts.map +1 -0
  88. package/dist/codegen/database/schema/table-schema.js +219 -0
  89. package/dist/codegen/database/schema/table-schema.js.map +1 -0
  90. package/dist/codegen/database/schema/types.d.ts +13 -0
  91. package/dist/codegen/database/schema/types.d.ts.map +1 -0
  92. package/dist/codegen/database/schema/types.js +175 -0
  93. package/dist/codegen/database/schema/types.js.map +1 -0
  94. package/dist/codegen/database/schema/unique-constraint.d.ts +4 -0
  95. package/dist/codegen/database/schema/unique-constraint.d.ts.map +1 -0
  96. package/dist/codegen/database/schema/unique-constraint.js +4 -0
  97. package/dist/codegen/database/schema/unique-constraint.js.map +1 -0
  98. package/dist/codegen/database/schema/view-schema.d.ts +14 -0
  99. package/dist/codegen/database/schema/view-schema.d.ts.map +1 -0
  100. package/dist/codegen/database/schema/view-schema.js +32 -0
  101. package/dist/codegen/database/schema/view-schema.js.map +1 -0
  102. package/dist/codegen/generator/ctype-generator.d.ts +5 -0
  103. package/dist/codegen/generator/ctype-generator.d.ts.map +1 -0
  104. package/dist/codegen/generator/ctype-generator.js +26 -0
  105. package/dist/codegen/generator/ctype-generator.js.map +1 -0
  106. package/dist/codegen/generator/generator.d.ts +17 -0
  107. package/dist/codegen/generator/generator.d.ts.map +1 -0
  108. package/dist/codegen/generator/generator.js +57 -0
  109. package/dist/codegen/generator/generator.js.map +1 -0
  110. package/dist/codegen/generator/index.d.ts +8 -0
  111. package/dist/codegen/generator/index.d.ts.map +1 -0
  112. package/dist/codegen/generator/index.js +8 -0
  113. package/dist/codegen/generator/index.js.map +1 -0
  114. package/dist/codegen/generator/openapi-generator.d.ts +239 -0
  115. package/dist/codegen/generator/openapi-generator.d.ts.map +1 -0
  116. package/dist/codegen/generator/openapi-generator.js +434 -0
  117. package/dist/codegen/generator/openapi-generator.js.map +1 -0
  118. package/dist/codegen/generator/openapi-types.d.ts +263 -0
  119. package/dist/codegen/generator/openapi-types.d.ts.map +1 -0
  120. package/dist/codegen/generator/openapi-types.js +11 -0
  121. package/dist/codegen/generator/openapi-types.js.map +1 -0
  122. package/dist/codegen/generator/postgres-schema-generator.d.ts +48 -0
  123. package/dist/codegen/generator/postgres-schema-generator.d.ts.map +1 -0
  124. package/dist/codegen/generator/postgres-schema-generator.js +339 -0
  125. package/dist/codegen/generator/postgres-schema-generator.js.map +1 -0
  126. package/dist/codegen/generator/type-generator.d.ts +113 -0
  127. package/dist/codegen/generator/type-generator.d.ts.map +1 -0
  128. package/dist/codegen/generator/type-generator.js +249 -0
  129. package/dist/codegen/generator/type-generator.js.map +1 -0
  130. package/dist/codegen/generator/zod-generator.d.ts +15 -0
  131. package/dist/codegen/generator/zod-generator.d.ts.map +1 -0
  132. package/dist/codegen/generator/zod-generator.js +86 -0
  133. package/dist/codegen/generator/zod-generator.js.map +1 -0
  134. package/dist/codegen/generator/zod-to-openapi.d.ts +69 -0
  135. package/dist/codegen/generator/zod-to-openapi.d.ts.map +1 -0
  136. package/dist/codegen/generator/zod-to-openapi.js +480 -0
  137. package/dist/codegen/generator/zod-to-openapi.js.map +1 -0
  138. package/dist/codegen/index.d.ts +4 -0
  139. package/dist/codegen/index.d.ts.map +1 -0
  140. package/dist/codegen/index.js +4 -0
  141. package/dist/codegen/index.js.map +1 -0
  142. package/dist/codegen/schema/any-schema.d.ts +6 -0
  143. package/dist/codegen/schema/any-schema.d.ts.map +1 -0
  144. package/dist/codegen/schema/any-schema.js +12 -0
  145. package/dist/codegen/schema/any-schema.js.map +1 -0
  146. package/dist/codegen/schema/boolean-schema.d.ts +6 -0
  147. package/dist/codegen/schema/boolean-schema.d.ts.map +1 -0
  148. package/dist/codegen/schema/boolean-schema.js +12 -0
  149. package/dist/codegen/schema/boolean-schema.js.map +1 -0
  150. package/dist/codegen/schema/date-schema.d.ts +6 -0
  151. package/dist/codegen/schema/date-schema.d.ts.map +1 -0
  152. package/dist/codegen/schema/date-schema.js +12 -0
  153. package/dist/codegen/schema/date-schema.js.map +1 -0
  154. package/dist/codegen/schema/index.d.ts +10 -0
  155. package/dist/codegen/schema/index.d.ts.map +1 -0
  156. package/dist/codegen/schema/index.js +10 -0
  157. package/dist/codegen/schema/index.js.map +1 -0
  158. package/dist/codegen/schema/object-schema.d.ts +10 -0
  159. package/dist/codegen/schema/object-schema.d.ts.map +1 -0
  160. package/dist/codegen/schema/object-schema.js +21 -0
  161. package/dist/codegen/schema/object-schema.js.map +1 -0
  162. package/dist/codegen/schema/primitive-schema.d.ts +20 -0
  163. package/dist/codegen/schema/primitive-schema.d.ts.map +1 -0
  164. package/dist/codegen/schema/primitive-schema.js +48 -0
  165. package/dist/codegen/schema/primitive-schema.js.map +1 -0
  166. package/dist/codegen/schema/ref-schema.d.ts +6 -0
  167. package/dist/codegen/schema/ref-schema.d.ts.map +1 -0
  168. package/dist/codegen/schema/ref-schema.js +11 -0
  169. package/dist/codegen/schema/ref-schema.js.map +1 -0
  170. package/dist/codegen/schema/schema-container.d.ts +14 -0
  171. package/dist/codegen/schema/schema-container.d.ts.map +1 -0
  172. package/dist/codegen/schema/schema-container.js +38 -0
  173. package/dist/codegen/schema/schema-container.js.map +1 -0
  174. package/dist/codegen/schema/schema-object.d.ts +42 -0
  175. package/dist/codegen/schema/schema-object.d.ts.map +1 -0
  176. package/dist/codegen/schema/schema-object.js +90 -0
  177. package/dist/codegen/schema/schema-object.js.map +1 -0
  178. package/dist/codegen/schema/schema-scope.d.ts +23 -0
  179. package/dist/codegen/schema/schema-scope.d.ts.map +1 -0
  180. package/dist/codegen/schema/schema-scope.js +67 -0
  181. package/dist/codegen/schema/schema-scope.js.map +1 -0
  182. package/dist/codegen/schema/utils.d.ts +17 -0
  183. package/dist/codegen/schema/utils.d.ts.map +1 -0
  184. package/dist/codegen/schema/utils.js +47 -0
  185. package/dist/codegen/schema/utils.js.map +1 -0
  186. package/dist/dbcore/crud-statement.d.ts +67 -0
  187. package/dist/dbcore/crud-statement.d.ts.map +1 -0
  188. package/dist/dbcore/crud-statement.js +75 -0
  189. package/dist/dbcore/crud-statement.js.map +1 -0
  190. package/dist/dbcore/database.d.ts +272 -0
  191. package/dist/dbcore/database.d.ts.map +1 -0
  192. package/dist/dbcore/database.js +53 -0
  193. package/dist/dbcore/database.js.map +1 -0
  194. package/dist/dbcore/dataservice-base.d.ts +18 -0
  195. package/dist/dbcore/dataservice-base.d.ts.map +1 -0
  196. package/dist/dbcore/dataservice-base.js +19 -0
  197. package/dist/dbcore/dataservice-base.js.map +1 -0
  198. package/dist/dbcore/delete-statement.d.ts +29 -0
  199. package/dist/dbcore/delete-statement.d.ts.map +1 -0
  200. package/dist/dbcore/delete-statement.js +30 -0
  201. package/dist/dbcore/delete-statement.js.map +1 -0
  202. package/dist/dbcore/filterable-statement.d.ts +126 -0
  203. package/dist/dbcore/filterable-statement.d.ts.map +1 -0
  204. package/dist/dbcore/filterable-statement.js +178 -0
  205. package/dist/dbcore/filterable-statement.js.map +1 -0
  206. package/dist/dbcore/from-statement.d.ts +120 -0
  207. package/dist/dbcore/from-statement.d.ts.map +1 -0
  208. package/dist/dbcore/from-statement.js +150 -0
  209. package/dist/dbcore/from-statement.js.map +1 -0
  210. package/dist/dbcore/index.d.ts +21 -0
  211. package/dist/dbcore/index.d.ts.map +1 -0
  212. package/dist/dbcore/index.js +21 -0
  213. package/dist/dbcore/index.js.map +1 -0
  214. package/dist/dbcore/insert-statement.d.ts +48 -0
  215. package/dist/dbcore/insert-statement.d.ts.map +1 -0
  216. package/dist/dbcore/insert-statement.js +52 -0
  217. package/dist/dbcore/insert-statement.js.map +1 -0
  218. package/dist/dbcore/query-dataservice.d.ts +144 -0
  219. package/dist/dbcore/query-dataservice.d.ts.map +1 -0
  220. package/dist/dbcore/query-dataservice.js +144 -0
  221. package/dist/dbcore/query-dataservice.js.map +1 -0
  222. package/dist/dbcore/statement.d.ts +133 -0
  223. package/dist/dbcore/statement.d.ts.map +1 -0
  224. package/dist/dbcore/statement.js +138 -0
  225. package/dist/dbcore/statement.js.map +1 -0
  226. package/dist/dbcore/update-statement.d.ts +48 -0
  227. package/dist/dbcore/update-statement.d.ts.map +1 -0
  228. package/dist/dbcore/update-statement.js +52 -0
  229. package/dist/dbcore/update-statement.js.map +1 -0
  230. package/dist/expression/builders/comparison-builder.d.ts +47 -0
  231. package/dist/expression/builders/comparison-builder.d.ts.map +1 -0
  232. package/dist/expression/builders/comparison-builder.js +197 -0
  233. package/dist/expression/builders/comparison-builder.js.map +1 -0
  234. package/dist/expression/builders/query-builder.d.ts +80 -0
  235. package/dist/expression/builders/query-builder.d.ts.map +1 -0
  236. package/dist/expression/builders/query-builder.js +229 -0
  237. package/dist/expression/builders/query-builder.js.map +1 -0
  238. package/dist/expression/compiler/postgresql-compiler.d.ts +56 -0
  239. package/dist/expression/compiler/postgresql-compiler.d.ts.map +1 -0
  240. package/dist/expression/compiler/postgresql-compiler.js +217 -0
  241. package/dist/expression/compiler/postgresql-compiler.js.map +1 -0
  242. package/dist/expression/core/ast-node.d.ts +47 -0
  243. package/dist/expression/core/ast-node.d.ts.map +1 -0
  244. package/dist/expression/core/ast-node.js +154 -0
  245. package/dist/expression/core/ast-node.js.map +1 -0
  246. package/dist/expression/core/parameter-manager.d.ts +84 -0
  247. package/dist/expression/core/parameter-manager.d.ts.map +1 -0
  248. package/dist/expression/core/parameter-manager.js +164 -0
  249. package/dist/expression/core/parameter-manager.js.map +1 -0
  250. package/dist/expression/core/query-builder-interfaces.d.ts +188 -0
  251. package/dist/expression/core/query-builder-interfaces.d.ts.map +1 -0
  252. package/dist/expression/core/query-builder-interfaces.js +6 -0
  253. package/dist/expression/core/query-builder-interfaces.js.map +1 -0
  254. package/dist/expression/core/types.d.ts +239 -0
  255. package/dist/expression/core/types.d.ts.map +1 -0
  256. package/dist/expression/core/types.js +121 -0
  257. package/dist/expression/core/types.js.map +1 -0
  258. package/dist/expression/index.d.ts +11 -0
  259. package/dist/expression/index.d.ts.map +1 -0
  260. package/dist/expression/index.js +11 -0
  261. package/dist/expression/index.js.map +1 -0
  262. package/dist/i18n/content-file-source.d.ts +109 -0
  263. package/dist/i18n/content-file-source.d.ts.map +1 -0
  264. package/dist/i18n/content-file-source.js +218 -0
  265. package/dist/i18n/content-file-source.js.map +1 -0
  266. package/dist/i18n/index.d.ts +19 -0
  267. package/dist/i18n/index.d.ts.map +1 -0
  268. package/dist/i18n/index.js +21 -0
  269. package/dist/i18n/index.js.map +1 -0
  270. package/dist/i18n/json-file-source.d.ts +96 -0
  271. package/dist/i18n/json-file-source.d.ts.map +1 -0
  272. package/dist/i18n/json-file-source.js +258 -0
  273. package/dist/i18n/json-file-source.js.map +1 -0
  274. package/dist/i18n/merge-catalogs.d.ts +20 -0
  275. package/dist/i18n/merge-catalogs.d.ts.map +1 -0
  276. package/dist/i18n/merge-catalogs.js +34 -0
  277. package/dist/i18n/merge-catalogs.js.map +1 -0
  278. package/dist/i18n/node.d.ts +20 -0
  279. package/dist/i18n/node.d.ts.map +1 -0
  280. package/dist/i18n/node.js +19 -0
  281. package/dist/i18n/node.js.map +1 -0
  282. package/dist/i18n/translation-source.d.ts +35 -0
  283. package/dist/i18n/translation-source.d.ts.map +1 -0
  284. package/dist/i18n/translation-source.js +2 -0
  285. package/dist/i18n/translation-source.js.map +1 -0
  286. package/dist/i18n/translator.d.ts +162 -0
  287. package/dist/i18n/translator.d.ts.map +1 -0
  288. package/dist/i18n/translator.js +259 -0
  289. package/dist/i18n/translator.js.map +1 -0
  290. package/dist/i18n/types.d.ts +80 -0
  291. package/dist/i18n/types.d.ts.map +1 -0
  292. package/dist/i18n/types.js +2 -0
  293. package/dist/i18n/types.js.map +1 -0
  294. package/dist/postgresql/database.d.ts +204 -0
  295. package/dist/postgresql/database.d.ts.map +1 -0
  296. package/dist/postgresql/database.js +321 -0
  297. package/dist/postgresql/database.js.map +1 -0
  298. package/dist/postgresql/delete-statement.d.ts +36 -0
  299. package/dist/postgresql/delete-statement.d.ts.map +1 -0
  300. package/dist/postgresql/delete-statement.js +54 -0
  301. package/dist/postgresql/delete-statement.js.map +1 -0
  302. package/dist/postgresql/index.d.ts +12 -0
  303. package/dist/postgresql/index.d.ts.map +1 -0
  304. package/dist/postgresql/index.js +12 -0
  305. package/dist/postgresql/index.js.map +1 -0
  306. package/dist/postgresql/insert-statement.d.ts +34 -0
  307. package/dist/postgresql/insert-statement.d.ts.map +1 -0
  308. package/dist/postgresql/insert-statement.js +48 -0
  309. package/dist/postgresql/insert-statement.js.map +1 -0
  310. package/dist/postgresql/update-statement.d.ts +38 -0
  311. package/dist/postgresql/update-statement.d.ts.map +1 -0
  312. package/dist/postgresql/update-statement.js +75 -0
  313. package/dist/postgresql/update-statement.js.map +1 -0
  314. package/dist/stdlib/formatString.d.ts +52 -0
  315. package/dist/stdlib/formatString.d.ts.map +1 -0
  316. package/dist/stdlib/formatString.js +118 -0
  317. package/dist/stdlib/formatString.js.map +1 -0
  318. package/dist/stdlib/index.d.ts +8 -0
  319. package/dist/stdlib/index.d.ts.map +1 -0
  320. package/dist/stdlib/index.js +8 -0
  321. package/dist/stdlib/index.js.map +1 -0
  322. package/dist/stdlib/isBoolean.d.ts +15 -0
  323. package/dist/stdlib/isBoolean.d.ts.map +1 -0
  324. package/dist/stdlib/isBoolean.js +17 -0
  325. package/dist/stdlib/isBoolean.js.map +1 -0
  326. package/dist/stdlib/isNullOrUndef.d.ts +24 -0
  327. package/dist/stdlib/isNullOrUndef.d.ts.map +1 -0
  328. package/dist/stdlib/isNullOrUndef.js +28 -0
  329. package/dist/stdlib/isNullOrUndef.js.map +1 -0
  330. package/dist/stdlib/isNumeric.d.ts +20 -0
  331. package/dist/stdlib/isNumeric.d.ts.map +1 -0
  332. package/dist/stdlib/isNumeric.js +39 -0
  333. package/dist/stdlib/isNumeric.js.map +1 -0
  334. package/dist/stdlib/isString.d.ts +15 -0
  335. package/dist/stdlib/isString.d.ts.map +1 -0
  336. package/dist/stdlib/isString.js +17 -0
  337. package/dist/stdlib/isString.js.map +1 -0
  338. package/dist/stdlib/isTemplateString.d.ts +18 -0
  339. package/dist/stdlib/isTemplateString.d.ts.map +1 -0
  340. package/dist/stdlib/isTemplateString.js +38 -0
  341. package/dist/stdlib/isTemplateString.js.map +1 -0
  342. package/dist/stdlib/wrapInArray.d.ts +14 -0
  343. package/dist/stdlib/wrapInArray.d.ts.map +1 -0
  344. package/dist/stdlib/wrapInArray.js +17 -0
  345. package/dist/stdlib/wrapInArray.js.map +1 -0
  346. package/dist/webafx/application/application-settings.d.ts +129 -0
  347. package/dist/webafx/application/application-settings.d.ts.map +1 -0
  348. package/dist/webafx/application/application-settings.js +162 -0
  349. package/dist/webafx/application/application-settings.js.map +1 -0
  350. package/dist/webafx/application/base-controller.d.ts +128 -0
  351. package/dist/webafx/application/base-controller.d.ts.map +1 -0
  352. package/dist/webafx/application/base-controller.js +122 -0
  353. package/dist/webafx/application/base-controller.js.map +1 -0
  354. package/dist/webafx/application/console-logger.d.ts +81 -0
  355. package/dist/webafx/application/console-logger.d.ts.map +1 -0
  356. package/dist/webafx/application/console-logger.js +111 -0
  357. package/dist/webafx/application/console-logger.js.map +1 -0
  358. package/dist/webafx/application/controller-registry.d.ts +34 -0
  359. package/dist/webafx/application/controller-registry.d.ts.map +1 -0
  360. package/dist/webafx/application/controller-registry.js +32 -0
  361. package/dist/webafx/application/controller-registry.js.map +1 -0
  362. package/dist/webafx/application/error-handler-middleware.d.ts +22 -0
  363. package/dist/webafx/application/error-handler-middleware.d.ts.map +1 -0
  364. package/dist/webafx/application/error-handler-middleware.js +70 -0
  365. package/dist/webafx/application/error-handler-middleware.js.map +1 -0
  366. package/dist/webafx/application/index.d.ts +13 -0
  367. package/dist/webafx/application/index.d.ts.map +1 -0
  368. package/dist/webafx/application/index.js +13 -0
  369. package/dist/webafx/application/index.js.map +1 -0
  370. package/dist/webafx/application/logger.d.ts +2 -0
  371. package/dist/webafx/application/logger.d.ts.map +1 -0
  372. package/dist/webafx/application/logger.js +2 -0
  373. package/dist/webafx/application/logger.js.map +1 -0
  374. package/dist/webafx/application/plugin.d.ts +73 -0
  375. package/dist/webafx/application/plugin.d.ts.map +1 -0
  376. package/dist/webafx/application/plugin.js +90 -0
  377. package/dist/webafx/application/plugin.js.map +1 -0
  378. package/dist/webafx/application/rate-limiter.d.ts +35 -0
  379. package/dist/webafx/application/rate-limiter.d.ts.map +1 -0
  380. package/dist/webafx/application/rate-limiter.js +74 -0
  381. package/dist/webafx/application/rate-limiter.js.map +1 -0
  382. package/dist/webafx/application/request-context.d.ts +62 -0
  383. package/dist/webafx/application/request-context.d.ts.map +1 -0
  384. package/dist/webafx/application/request-context.js +54 -0
  385. package/dist/webafx/application/request-context.js.map +1 -0
  386. package/dist/webafx/application/request-id-middleware.d.ts +30 -0
  387. package/dist/webafx/application/request-id-middleware.d.ts.map +1 -0
  388. package/dist/webafx/application/request-id-middleware.js +57 -0
  389. package/dist/webafx/application/request-id-middleware.js.map +1 -0
  390. package/dist/webafx/application/route-builder.d.ts +231 -0
  391. package/dist/webafx/application/route-builder.d.ts.map +1 -0
  392. package/dist/webafx/application/route-builder.js +182 -0
  393. package/dist/webafx/application/route-builder.js.map +1 -0
  394. package/dist/webafx/application/service-container.d.ts +144 -0
  395. package/dist/webafx/application/service-container.d.ts.map +1 -0
  396. package/dist/webafx/application/service-container.js +192 -0
  397. package/dist/webafx/application/service-container.js.map +1 -0
  398. package/dist/webafx/application/services.d.ts +27 -0
  399. package/dist/webafx/application/services.d.ts.map +1 -0
  400. package/dist/webafx/application/services.js +33 -0
  401. package/dist/webafx/application/services.js.map +1 -0
  402. package/dist/webafx/application/structured-logger.d.ts +99 -0
  403. package/dist/webafx/application/structured-logger.d.ts.map +1 -0
  404. package/dist/webafx/application/structured-logger.js +132 -0
  405. package/dist/webafx/application/structured-logger.js.map +1 -0
  406. package/dist/webafx/application/type.d.ts +29 -0
  407. package/dist/webafx/application/type.d.ts.map +1 -0
  408. package/dist/webafx/application/type.js +2 -0
  409. package/dist/webafx/application/type.js.map +1 -0
  410. package/dist/webafx/application/web-application.d.ts +257 -0
  411. package/dist/webafx/application/web-application.d.ts.map +1 -0
  412. package/dist/webafx/application/web-application.js +611 -0
  413. package/dist/webafx/application/web-application.js.map +1 -0
  414. package/dist/webafx/errors/api-error.d.ts +21 -0
  415. package/dist/webafx/errors/api-error.d.ts.map +1 -0
  416. package/dist/webafx/errors/api-error.js +38 -0
  417. package/dist/webafx/errors/api-error.js.map +1 -0
  418. package/dist/webafx/errors/http-errors.d.ts +56 -0
  419. package/dist/webafx/errors/http-errors.d.ts.map +1 -0
  420. package/dist/webafx/errors/http-errors.js +74 -0
  421. package/dist/webafx/errors/http-errors.js.map +1 -0
  422. package/dist/webafx/errors/index.d.ts +4 -0
  423. package/dist/webafx/errors/index.d.ts.map +1 -0
  424. package/dist/webafx/errors/index.js +4 -0
  425. package/dist/webafx/errors/index.js.map +1 -0
  426. package/dist/webafx/errors/types.d.ts +42 -0
  427. package/dist/webafx/errors/types.d.ts.map +1 -0
  428. package/dist/webafx/errors/types.js +2 -0
  429. package/dist/webafx/errors/types.js.map +1 -0
  430. package/dist/webafx/index.d.ts +3 -0
  431. package/dist/webafx/index.d.ts.map +1 -0
  432. package/dist/webafx/index.js +3 -0
  433. package/dist/webafx/index.js.map +1 -0
  434. package/dist/webafx-auth/abstract-auth-provider.d.ts +178 -0
  435. package/dist/webafx-auth/abstract-auth-provider.d.ts.map +1 -0
  436. package/dist/webafx-auth/abstract-auth-provider.js +240 -0
  437. package/dist/webafx-auth/abstract-auth-provider.js.map +1 -0
  438. package/dist/webafx-auth/index.d.ts +27 -0
  439. package/dist/webafx-auth/index.d.ts.map +1 -0
  440. package/dist/webafx-auth/index.js +32 -0
  441. package/dist/webafx-auth/index.js.map +1 -0
  442. package/dist/webafx-auth/jwt-auth-provider.d.ts +100 -0
  443. package/dist/webafx-auth/jwt-auth-provider.d.ts.map +1 -0
  444. package/dist/webafx-auth/jwt-auth-provider.js +154 -0
  445. package/dist/webafx-auth/jwt-auth-provider.js.map +1 -0
  446. package/dist/webafx-auth/memory-auth-provider.d.ts +100 -0
  447. package/dist/webafx-auth/memory-auth-provider.d.ts.map +1 -0
  448. package/dist/webafx-auth/memory-auth-provider.js +122 -0
  449. package/dist/webafx-auth/memory-auth-provider.js.map +1 -0
  450. package/dist/webafx-auth/types.d.ts +333 -0
  451. package/dist/webafx-auth/types.d.ts.map +1 -0
  452. package/dist/webafx-auth/types.js +24 -0
  453. package/dist/webafx-auth/types.js.map +1 -0
  454. package/dist/webafx-cache/abstract-cache-provider.d.ts +185 -0
  455. package/dist/webafx-cache/abstract-cache-provider.d.ts.map +1 -0
  456. package/dist/webafx-cache/abstract-cache-provider.js +133 -0
  457. package/dist/webafx-cache/abstract-cache-provider.js.map +1 -0
  458. package/dist/webafx-cache/abstract-pubsub-provider.d.ts +170 -0
  459. package/dist/webafx-cache/abstract-pubsub-provider.d.ts.map +1 -0
  460. package/dist/webafx-cache/abstract-pubsub-provider.js +132 -0
  461. package/dist/webafx-cache/abstract-pubsub-provider.js.map +1 -0
  462. package/dist/webafx-cache/cache-plugin.d.ts +114 -0
  463. package/dist/webafx-cache/cache-plugin.d.ts.map +1 -0
  464. package/dist/webafx-cache/cache-plugin.js +176 -0
  465. package/dist/webafx-cache/cache-plugin.js.map +1 -0
  466. package/dist/webafx-cache/index.d.ts +33 -0
  467. package/dist/webafx-cache/index.d.ts.map +1 -0
  468. package/dist/webafx-cache/index.js +44 -0
  469. package/dist/webafx-cache/index.js.map +1 -0
  470. package/dist/webafx-cache/memory-cache-provider.d.ts +99 -0
  471. package/dist/webafx-cache/memory-cache-provider.d.ts.map +1 -0
  472. package/dist/webafx-cache/memory-cache-provider.js +251 -0
  473. package/dist/webafx-cache/memory-cache-provider.js.map +1 -0
  474. package/dist/webafx-cache/memory-pubsub-provider.d.ts +124 -0
  475. package/dist/webafx-cache/memory-pubsub-provider.d.ts.map +1 -0
  476. package/dist/webafx-cache/memory-pubsub-provider.js +195 -0
  477. package/dist/webafx-cache/memory-pubsub-provider.js.map +1 -0
  478. package/dist/webafx-cache/pubsub-plugin.d.ts +128 -0
  479. package/dist/webafx-cache/pubsub-plugin.d.ts.map +1 -0
  480. package/dist/webafx-cache/pubsub-plugin.js +182 -0
  481. package/dist/webafx-cache/pubsub-plugin.js.map +1 -0
  482. package/dist/webafx-cache/redis-cache-provider.d.ts +81 -0
  483. package/dist/webafx-cache/redis-cache-provider.d.ts.map +1 -0
  484. package/dist/webafx-cache/redis-cache-provider.js +209 -0
  485. package/dist/webafx-cache/redis-cache-provider.js.map +1 -0
  486. package/dist/webafx-cache/redis-pubsub-provider.d.ts +164 -0
  487. package/dist/webafx-cache/redis-pubsub-provider.d.ts.map +1 -0
  488. package/dist/webafx-cache/redis-pubsub-provider.js +329 -0
  489. package/dist/webafx-cache/redis-pubsub-provider.js.map +1 -0
  490. package/dist/webafx-cache/types.d.ts +206 -0
  491. package/dist/webafx-cache/types.d.ts.map +1 -0
  492. package/dist/webafx-cache/types.js +27 -0
  493. package/dist/webafx-cache/types.js.map +1 -0
  494. package/dist/webafx-i18n/i18n-plugin.d.ts +29 -0
  495. package/dist/webafx-i18n/i18n-plugin.d.ts.map +1 -0
  496. package/dist/webafx-i18n/i18n-plugin.js +145 -0
  497. package/dist/webafx-i18n/i18n-plugin.js.map +1 -0
  498. package/dist/webafx-i18n/index.d.ts +12 -0
  499. package/dist/webafx-i18n/index.d.ts.map +1 -0
  500. package/dist/webafx-i18n/index.js +12 -0
  501. package/dist/webafx-i18n/index.js.map +1 -0
  502. package/dist/webafx-i18n/locale-resolver.d.ts +33 -0
  503. package/dist/webafx-i18n/locale-resolver.d.ts.map +1 -0
  504. package/dist/webafx-i18n/locale-resolver.js +67 -0
  505. package/dist/webafx-i18n/locale-resolver.js.map +1 -0
  506. package/dist/webafx-i18n/postgresql-source.d.ts +101 -0
  507. package/dist/webafx-i18n/postgresql-source.d.ts.map +1 -0
  508. package/dist/webafx-i18n/postgresql-source.js +101 -0
  509. package/dist/webafx-i18n/postgresql-source.js.map +1 -0
  510. package/dist/webafx-i18n/types.d.ts +70 -0
  511. package/dist/webafx-i18n/types.d.ts.map +1 -0
  512. package/dist/webafx-i18n/types.js +2 -0
  513. package/dist/webafx-i18n/types.js.map +1 -0
  514. package/dist/webafx-mailer/abstract-mail-provider.d.ts +55 -0
  515. package/dist/webafx-mailer/abstract-mail-provider.d.ts.map +1 -0
  516. package/dist/webafx-mailer/abstract-mail-provider.js +37 -0
  517. package/dist/webafx-mailer/abstract-mail-provider.js.map +1 -0
  518. package/dist/webafx-mailer/index.d.ts +24 -0
  519. package/dist/webafx-mailer/index.d.ts.map +1 -0
  520. package/dist/webafx-mailer/index.js +34 -0
  521. package/dist/webafx-mailer/index.js.map +1 -0
  522. package/dist/webafx-mailer/mail-plugin.d.ts +98 -0
  523. package/dist/webafx-mailer/mail-plugin.d.ts.map +1 -0
  524. package/dist/webafx-mailer/mail-plugin.js +155 -0
  525. package/dist/webafx-mailer/mail-plugin.js.map +1 -0
  526. package/dist/webafx-mailer/memory-mail-provider.d.ts +85 -0
  527. package/dist/webafx-mailer/memory-mail-provider.d.ts.map +1 -0
  528. package/dist/webafx-mailer/memory-mail-provider.js +111 -0
  529. package/dist/webafx-mailer/memory-mail-provider.js.map +1 -0
  530. package/dist/webafx-mailer/smtp-mail-provider.d.ts +65 -0
  531. package/dist/webafx-mailer/smtp-mail-provider.d.ts.map +1 -0
  532. package/dist/webafx-mailer/smtp-mail-provider.js +113 -0
  533. package/dist/webafx-mailer/smtp-mail-provider.js.map +1 -0
  534. package/dist/webafx-mailer/types.d.ts +136 -0
  535. package/dist/webafx-mailer/types.d.ts.map +1 -0
  536. package/dist/webafx-mailer/types.js +13 -0
  537. package/dist/webafx-mailer/types.js.map +1 -0
  538. package/package.json +159 -0
@@ -0,0 +1,155 @@
1
+ /**
2
+ * WebAFX plugin integration for mail providers.
3
+ *
4
+ * Provides convenience factory functions that wire a MailProvider instance
5
+ * into a WebAFX application as a singleton service with health check and
6
+ * graceful shutdown support.
7
+ *
8
+ * This is the ONLY file in @blendsdk/webafx-mailer that imports from @blendsdk/webafx,
9
+ * which is why webafx is an optional peer dependency (not a hard dependency).
10
+ *
11
+ * The design mirrors @blendsdk/webafx-cache's cache-plugin.ts exactly.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import { MemoryMailProvider } from "./memory-mail-provider.js";
16
+ import { SmtpMailProvider } from "./smtp-mail-provider.js";
17
+ // ---------------------------------------------------------------------------
18
+ // Default Constants
19
+ // ---------------------------------------------------------------------------
20
+ /** Default plugin priority — installs after most core plugins */
21
+ const DEFAULT_PLUGIN_PRIORITY = 30;
22
+ // ---------------------------------------------------------------------------
23
+ // Plugin Factory Functions
24
+ // ---------------------------------------------------------------------------
25
+ /**
26
+ * Create a WebAFX PluginDefinition from any MailProvider instance.
27
+ *
28
+ * This is the core function that wires a mail provider into WebAFX:
29
+ * 1. Registers the provider as a singleton service in the service container
30
+ * 2. Hooks the provider's health() into the /health endpoint
31
+ * 3. Hooks the provider's shutdown() into graceful shutdown
32
+ *
33
+ * The service name is read from `provider.serviceName` (defaults to "mailer").
34
+ *
35
+ * @param provider - Any MailProvider instance (SMTP, Memory, or custom)
36
+ * @param options - Optional overrides for plugin priority
37
+ * @returns A WebAFX PluginDefinition ready to pass to app.use()
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const mailer = new SmtpMailProvider({ host: "smtp.example.com", port: 587 });
42
+ * app.use(createMailPlugin(mailer));
43
+ * ```
44
+ */
45
+ export function createMailPlugin(provider, options) {
46
+ return {
47
+ name: provider.serviceName,
48
+ priority: options?.priority ?? DEFAULT_PLUGIN_PRIORITY,
49
+ factory: async ({ app, logger }) => {
50
+ // Register the mail provider as an application-wide singleton service.
51
+ // The factory ignores container/settings since the provider is pre-created.
52
+ app.registerService({
53
+ name: provider.serviceName,
54
+ type: "singleton",
55
+ factory: () => provider,
56
+ dispose: async () => {
57
+ await provider.shutdown();
58
+ },
59
+ });
60
+ await logger.info(`Mail plugin "${provider.serviceName}" initialized ` +
61
+ `(${provider.constructor.name})`);
62
+ // Return Plugin hooks for health monitoring and graceful shutdown
63
+ return {
64
+ health: () => provider.health(),
65
+ shutdown: () => provider.shutdown(),
66
+ };
67
+ },
68
+ };
69
+ }
70
+ /**
71
+ * Create a WebAFX mail plugin with an SMTP backend. One-liner registration.
72
+ *
73
+ * Creates a SmtpMailProvider internally and returns a PluginDefinition.
74
+ * The user never needs to instantiate the provider manually.
75
+ *
76
+ * @param config - SMTP configuration (host, port, auth, TLS options)
77
+ * @returns A WebAFX PluginDefinition ready to pass to app.use()
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * app.use(smtpMailPlugin({
82
+ * host: "smtp.example.com",
83
+ * port: 587,
84
+ * secure: false,
85
+ * auth: { user: "user@example.com", pass: "secret" },
86
+ * }));
87
+ * ```
88
+ */
89
+ export function smtpMailPlugin(config) {
90
+ const provider = new SmtpMailProvider(config);
91
+ return createMailPlugin(provider);
92
+ }
93
+ /**
94
+ * Create a WebAFX mail plugin with an In-Memory backend. One-liner registration.
95
+ *
96
+ * Creates a MemoryMailProvider internally and returns a PluginDefinition.
97
+ * Ideal for development and testing — no emails are actually sent.
98
+ *
99
+ * @param config - Optional memory configuration (serviceName override)
100
+ * @returns A WebAFX PluginDefinition ready to pass to app.use()
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * app.use(memoryMailPlugin());
105
+ * ```
106
+ */
107
+ export function memoryMailPlugin(config) {
108
+ const provider = new MemoryMailProvider(config);
109
+ return createMailPlugin(provider);
110
+ }
111
+ /**
112
+ * Create a MailProvider based on configuration type.
113
+ *
114
+ * Factory function for environment-based backend switching.
115
+ * Returns the appropriate provider based on `config.type`.
116
+ * Use with `createMailPlugin()` to register in WebAFX.
117
+ *
118
+ * @param config - Mail factory configuration with type discriminator
119
+ * @returns A MailProvider instance (SMTP or Memory)
120
+ * @throws Error if config.type is not "smtp" or "memory"
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * const mailer = createMailProvider({
125
+ * type: process.env.NODE_ENV === "production" ? "smtp" : "memory",
126
+ * host: process.env.SMTP_HOST,
127
+ * port: Number(process.env.SMTP_PORT || 587),
128
+ * });
129
+ * app.use(createMailPlugin(mailer));
130
+ * ```
131
+ */
132
+ export function createMailProvider(config) {
133
+ switch (config.type) {
134
+ case "smtp":
135
+ return new SmtpMailProvider({
136
+ serviceName: config.serviceName,
137
+ host: config.host,
138
+ port: config.port,
139
+ secure: config.secure,
140
+ auth: config.auth,
141
+ tls: config.tls,
142
+ });
143
+ case "memory":
144
+ return new MemoryMailProvider({
145
+ serviceName: config.serviceName,
146
+ });
147
+ default: {
148
+ // Exhaustive check — provides a clear runtime error if called with
149
+ // an invalid type that TypeScript couldn't catch at compile time
150
+ const unknownType = config.type;
151
+ throw new Error(`Unknown mail type: "${unknownType}". Supported types: "smtp", "memory".`);
152
+ }
153
+ }
154
+ }
155
+ //# sourceMappingURL=mail-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-plugin.js","sourceRoot":"","sources":["../src/mail-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,iEAAiE;AACjE,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAC5B,QAAsB,EACtB,OAA+B;IAE/B,OAAO;QACH,IAAI,EAAE,QAAQ,CAAC,WAAW;QAC1B,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,uBAAuB;QAEtD,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;YAC/B,uEAAuE;YACvE,4EAA4E;YAC5E,GAAG,CAAC,eAAe,CAAC;gBAChB,IAAI,EAAE,QAAQ,CAAC,WAAW;gBAC1B,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ;gBACvB,OAAO,EAAE,KAAK,IAAI,EAAE;oBAChB,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAC9B,CAAC;aACJ,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,IAAI,CACb,gBAAgB,QAAQ,CAAC,WAAW,gBAAgB;gBAChD,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CACvC,CAAC;YAEF,kEAAkE;YAClE,OAAO;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE;gBAC/B,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;aACtC,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACjD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAyB;IACtD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB;IACxD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM;YACP,OAAO,IAAI,gBAAgB,CAAC;gBACxB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,IAAI,EAAE,MAAM,CAAC,IAAK;gBAClB,IAAI,EAAE,MAAM,CAAC,IAAK;gBAClB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;aAClB,CAAC,CAAC;QAEP,KAAK,QAAQ;YACT,OAAO,IAAI,kBAAkB,CAAC;gBAC1B,WAAW,EAAE,MAAM,CAAC,WAAW;aAClC,CAAC,CAAC;QAEP,OAAO,CAAC,CAAC,CAAC;YACN,mEAAmE;YACnE,iEAAiE;YACjE,MAAM,WAAW,GAAI,MAA2B,CAAC,IAAI,CAAC;YACtD,MAAM,IAAI,KAAK,CACX,uBAAuB,WAAW,uCAAuC,CAC5E,CAAC;QACN,CAAC;IACL,CAAC;AACL,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * In-memory mail provider for testing.
3
+ *
4
+ * Stores all sent messages in an array that can be queried for test assertions.
5
+ * Does not actually send any emails — purely for development and testing use.
6
+ *
7
+ * Provides helper methods for test assertions:
8
+ * - `getSentMessages()` — returns all sent messages (as a copy)
9
+ * - `getLastMessage()` — returns the most recently sent message
10
+ * - `clear()` — empties the stored messages
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const mailer = new MemoryMailProvider();
15
+ * await mailer.send({ from: "a@b.com", to: "c@d.com", subject: "Hi", text: "Hello" });
16
+ *
17
+ * const sent = mailer.getSentMessages();
18
+ * expect(sent).toHaveLength(1);
19
+ * expect(sent[0].message.subject).toBe("Hi");
20
+ * ```
21
+ */
22
+ import { MailProvider } from "./abstract-mail-provider.js";
23
+ import type { MailMessage, MailResult, MemoryMailConfig } from "./types.js";
24
+ /** Stored message entry — includes both the original message and send result */
25
+ export interface SentMailEntry {
26
+ /** The original mail message as submitted to send() */
27
+ message: MailMessage;
28
+ /** The result returned from send() */
29
+ result: MailResult;
30
+ }
31
+ export declare class MemoryMailProvider extends MailProvider {
32
+ /** Internal store of all sent messages */
33
+ protected messages: SentMailEntry[];
34
+ /**
35
+ * Create a new in-memory mail provider.
36
+ *
37
+ * @param config - Optional config; defaults to `{ serviceName: "mailer" }`
38
+ */
39
+ constructor(config?: MemoryMailConfig);
40
+ /**
41
+ * "Send" an email by storing it in memory.
42
+ *
43
+ * All recipients (to, cc, bcc) are marked as accepted.
44
+ * A deterministic messageId is generated for test predictability.
45
+ *
46
+ * @param message - The email message to store
47
+ * @returns Result with all recipients in accepted list
48
+ */
49
+ send(message: MailMessage): Promise<MailResult>;
50
+ /**
51
+ * Get all sent messages (for test assertions).
52
+ *
53
+ * Returns a shallow copy of the internal array to prevent
54
+ * external mutation of the stored data.
55
+ *
56
+ * @returns Array of all sent message entries (message + result)
57
+ */
58
+ getSentMessages(): SentMailEntry[];
59
+ /**
60
+ * Get the last sent message (convenience for single-email tests).
61
+ *
62
+ * @returns The most recently sent entry, or undefined if no messages sent
63
+ */
64
+ getLastMessage(): SentMailEntry | undefined;
65
+ /**
66
+ * Clear all stored messages.
67
+ *
68
+ * Useful for resetting state between test cases.
69
+ */
70
+ clear(): void;
71
+ /**
72
+ * Health check — always returns true.
73
+ *
74
+ * The memory provider has no external dependencies,
75
+ * so it's always "healthy".
76
+ */
77
+ health(): Promise<boolean>;
78
+ /**
79
+ * Graceful shutdown — clears all stored messages.
80
+ *
81
+ * Releases the in-memory message store.
82
+ */
83
+ shutdown(): Promise<void>;
84
+ }
85
+ //# sourceMappingURL=memory-mail-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-mail-provider.d.ts","sourceRoot":"","sources":["../src/memory-mail-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5E,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC1B,uDAAuD;IACvD,OAAO,EAAE,WAAW,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,UAAU,CAAC;CACtB;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAChD,0CAA0C;IAC1C,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAM;IAEzC;;;;OAIG;gBACS,MAAM,CAAC,EAAE,gBAAgB;IAIrC;;;;;;;;OAQG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBrD;;;;;;;OAOG;IACH,eAAe,IAAI,aAAa,EAAE;IAIlC;;;;OAIG;IACH,cAAc,IAAI,aAAa,GAAG,SAAS;IAM3C;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAIb;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * In-memory mail provider for testing.
3
+ *
4
+ * Stores all sent messages in an array that can be queried for test assertions.
5
+ * Does not actually send any emails — purely for development and testing use.
6
+ *
7
+ * Provides helper methods for test assertions:
8
+ * - `getSentMessages()` — returns all sent messages (as a copy)
9
+ * - `getLastMessage()` — returns the most recently sent message
10
+ * - `clear()` — empties the stored messages
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const mailer = new MemoryMailProvider();
15
+ * await mailer.send({ from: "a@b.com", to: "c@d.com", subject: "Hi", text: "Hello" });
16
+ *
17
+ * const sent = mailer.getSentMessages();
18
+ * expect(sent).toHaveLength(1);
19
+ * expect(sent[0].message.subject).toBe("Hi");
20
+ * ```
21
+ */
22
+ import { MailProvider } from "./abstract-mail-provider.js";
23
+ export class MemoryMailProvider extends MailProvider {
24
+ /** Internal store of all sent messages */
25
+ messages = [];
26
+ /**
27
+ * Create a new in-memory mail provider.
28
+ *
29
+ * @param config - Optional config; defaults to `{ serviceName: "mailer" }`
30
+ */
31
+ constructor(config) {
32
+ super(config ?? {});
33
+ }
34
+ /**
35
+ * "Send" an email by storing it in memory.
36
+ *
37
+ * All recipients (to, cc, bcc) are marked as accepted.
38
+ * A deterministic messageId is generated for test predictability.
39
+ *
40
+ * @param message - The email message to store
41
+ * @returns Result with all recipients in accepted list
42
+ */
43
+ async send(message) {
44
+ // Normalize all recipient fields to arrays for consistent result format
45
+ const toArray = Array.isArray(message.to) ? message.to : [message.to];
46
+ const ccArray = message.cc
47
+ ? Array.isArray(message.cc)
48
+ ? message.cc
49
+ : [message.cc]
50
+ : [];
51
+ const bccArray = message.bcc
52
+ ? Array.isArray(message.bcc)
53
+ ? message.bcc
54
+ : [message.bcc]
55
+ : [];
56
+ const result = {
57
+ accepted: [...toArray, ...ccArray, ...bccArray],
58
+ rejected: [],
59
+ messageId: `<memory-${Date.now()}-${this.messages.length}@test>`,
60
+ };
61
+ this.messages.push({ message, result });
62
+ return result;
63
+ }
64
+ /**
65
+ * Get all sent messages (for test assertions).
66
+ *
67
+ * Returns a shallow copy of the internal array to prevent
68
+ * external mutation of the stored data.
69
+ *
70
+ * @returns Array of all sent message entries (message + result)
71
+ */
72
+ getSentMessages() {
73
+ return [...this.messages];
74
+ }
75
+ /**
76
+ * Get the last sent message (convenience for single-email tests).
77
+ *
78
+ * @returns The most recently sent entry, or undefined if no messages sent
79
+ */
80
+ getLastMessage() {
81
+ return this.messages.length > 0
82
+ ? this.messages[this.messages.length - 1]
83
+ : undefined;
84
+ }
85
+ /**
86
+ * Clear all stored messages.
87
+ *
88
+ * Useful for resetting state between test cases.
89
+ */
90
+ clear() {
91
+ this.messages = [];
92
+ }
93
+ /**
94
+ * Health check — always returns true.
95
+ *
96
+ * The memory provider has no external dependencies,
97
+ * so it's always "healthy".
98
+ */
99
+ async health() {
100
+ return true;
101
+ }
102
+ /**
103
+ * Graceful shutdown — clears all stored messages.
104
+ *
105
+ * Releases the in-memory message store.
106
+ */
107
+ async shutdown() {
108
+ this.clear();
109
+ }
110
+ }
111
+ //# sourceMappingURL=memory-mail-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-mail-provider.js","sourceRoot":"","sources":["../src/memory-mail-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAW3D,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAChD,0CAA0C;IAChC,QAAQ,GAAoB,EAAE,CAAC;IAEzC;;;;OAIG;IACH,YAAY,MAAyB;QACjC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC3B,wEAAwE;QACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE;YACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,CAAC,CAAC,OAAO,CAAC,EAAE;gBACZ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG;YACxB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBACxB,CAAC,CAAC,OAAO,CAAC,GAAG;gBACb,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;YACnB,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,MAAM,GAAe;YACvB,QAAQ,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC;YAC/C,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ;SACnE,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;;;OAOG;IACH,eAAe;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,cAAc;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACzC,CAAC,CAAC,SAAS,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM;QACR,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;CACJ"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * SMTP mail provider using nodemailer.
3
+ *
4
+ * Wraps nodemailer's transport to provide a clean MailProvider interface
5
+ * with health check and graceful shutdown support. The underlying transport
6
+ * handles connection pooling internally.
7
+ *
8
+ * Key design decisions vs. v3:
9
+ * - `secure` defaults to false (modern SMTP uses STARTTLS on port 587)
10
+ * - No hardcoded `tls.rejectUnauthorized: false` — configurable via `tls` option
11
+ * - `transporter.verify()` for health check — tests SMTP connection without sending
12
+ * - `transporter.close()` for graceful shutdown — closes the connection pool
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const mailer = new SmtpMailProvider({
17
+ * host: "smtp.example.com",
18
+ * port: 587,
19
+ * secure: false,
20
+ * auth: { user: "user@example.com", pass: "secret" },
21
+ * });
22
+ * await mailer.send({ from: "a@b.com", to: "c@d.com", subject: "Hi", text: "Hello" });
23
+ * ```
24
+ */
25
+ import nodemailer from "nodemailer";
26
+ import { MailProvider } from "./abstract-mail-provider.js";
27
+ import type { MailMessage, MailResult, SmtpMailConfig } from "./types.js";
28
+ export declare class SmtpMailProvider extends MailProvider {
29
+ /** Nodemailer transport instance — handles SMTP connection pooling */
30
+ protected transporter: nodemailer.Transporter;
31
+ /**
32
+ * Create a new SMTP mail provider.
33
+ *
34
+ * @param config - SMTP connection settings (host, port, auth, TLS options)
35
+ */
36
+ constructor(config: SmtpMailConfig);
37
+ /**
38
+ * Send an email via SMTP.
39
+ *
40
+ * Converts our MailMessage to nodemailer's format and sends it.
41
+ * Array recipients are joined with commas as nodemailer expects.
42
+ *
43
+ * @param message - The email message to send
44
+ * @returns Result with accepted/rejected addresses and message ID
45
+ * @throws Error on SMTP connection failure, auth failure, or send rejection
46
+ */
47
+ send(message: MailMessage): Promise<MailResult>;
48
+ /**
49
+ * Health check — verifies the SMTP connection is alive.
50
+ *
51
+ * Uses nodemailer's `verify()` which performs an EHLO/HELO handshake
52
+ * with the server without sending any email.
53
+ *
54
+ * @returns true if SMTP server is reachable and accepts connections
55
+ */
56
+ health(): Promise<boolean>;
57
+ /**
58
+ * Graceful shutdown — closes the nodemailer transport.
59
+ *
60
+ * Releases the underlying TCP connection pool. After calling this,
61
+ * subsequent `send()` calls will fail.
62
+ */
63
+ shutdown(): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=smtp-mail-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp-mail-provider.d.ts","sourceRoot":"","sources":["../src/smtp-mail-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE1E,qBAAa,gBAAiB,SAAQ,YAAY;IAC9C,sEAAsE;IACtE,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;IAE9C;;;;OAIG;gBACS,MAAM,EAAE,cAAc;IAclC;;;;;;;;;OASG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA+BrD;;;;;;;OAOG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * SMTP mail provider using nodemailer.
3
+ *
4
+ * Wraps nodemailer's transport to provide a clean MailProvider interface
5
+ * with health check and graceful shutdown support. The underlying transport
6
+ * handles connection pooling internally.
7
+ *
8
+ * Key design decisions vs. v3:
9
+ * - `secure` defaults to false (modern SMTP uses STARTTLS on port 587)
10
+ * - No hardcoded `tls.rejectUnauthorized: false` — configurable via `tls` option
11
+ * - `transporter.verify()` for health check — tests SMTP connection without sending
12
+ * - `transporter.close()` for graceful shutdown — closes the connection pool
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const mailer = new SmtpMailProvider({
17
+ * host: "smtp.example.com",
18
+ * port: 587,
19
+ * secure: false,
20
+ * auth: { user: "user@example.com", pass: "secret" },
21
+ * });
22
+ * await mailer.send({ from: "a@b.com", to: "c@d.com", subject: "Hi", text: "Hello" });
23
+ * ```
24
+ */
25
+ import nodemailer from "nodemailer";
26
+ import { MailProvider } from "./abstract-mail-provider.js";
27
+ export class SmtpMailProvider extends MailProvider {
28
+ /** Nodemailer transport instance — handles SMTP connection pooling */
29
+ transporter;
30
+ /**
31
+ * Create a new SMTP mail provider.
32
+ *
33
+ * @param config - SMTP connection settings (host, port, auth, TLS options)
34
+ */
35
+ constructor(config) {
36
+ super(config);
37
+ // Create nodemailer transport with provided SMTP settings.
38
+ // secure defaults to false — most modern SMTP servers use STARTTLS on port 587.
39
+ this.transporter = nodemailer.createTransport({
40
+ host: config.host,
41
+ port: config.port,
42
+ secure: config.secure ?? false,
43
+ auth: config.auth,
44
+ tls: config.tls,
45
+ });
46
+ }
47
+ /**
48
+ * Send an email via SMTP.
49
+ *
50
+ * Converts our MailMessage to nodemailer's format and sends it.
51
+ * Array recipients are joined with commas as nodemailer expects.
52
+ *
53
+ * @param message - The email message to send
54
+ * @returns Result with accepted/rejected addresses and message ID
55
+ * @throws Error on SMTP connection failure, auth failure, or send rejection
56
+ */
57
+ async send(message) {
58
+ const info = await this.transporter.sendMail({
59
+ from: message.from,
60
+ to: Array.isArray(message.to) ? message.to.join(", ") : message.to,
61
+ cc: message.cc
62
+ ? Array.isArray(message.cc)
63
+ ? message.cc.join(", ")
64
+ : message.cc
65
+ : undefined,
66
+ bcc: message.bcc
67
+ ? Array.isArray(message.bcc)
68
+ ? message.bcc.join(", ")
69
+ : message.bcc
70
+ : undefined,
71
+ subject: message.subject,
72
+ text: message.text,
73
+ html: message.html,
74
+ attachments: message.attachments?.map((a) => ({
75
+ filename: a.filename,
76
+ content: a.content,
77
+ contentType: a.contentType,
78
+ })),
79
+ });
80
+ return {
81
+ accepted: Array.isArray(info.accepted) ? info.accepted.map(String) : [],
82
+ rejected: Array.isArray(info.rejected) ? info.rejected.map(String) : [],
83
+ messageId: info.messageId,
84
+ };
85
+ }
86
+ /**
87
+ * Health check — verifies the SMTP connection is alive.
88
+ *
89
+ * Uses nodemailer's `verify()` which performs an EHLO/HELO handshake
90
+ * with the server without sending any email.
91
+ *
92
+ * @returns true if SMTP server is reachable and accepts connections
93
+ */
94
+ async health() {
95
+ try {
96
+ await this.transporter.verify();
97
+ return true;
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ }
103
+ /**
104
+ * Graceful shutdown — closes the nodemailer transport.
105
+ *
106
+ * Releases the underlying TCP connection pool. After calling this,
107
+ * subsequent `send()` calls will fail.
108
+ */
109
+ async shutdown() {
110
+ this.transporter.close();
111
+ }
112
+ }
113
+ //# sourceMappingURL=smtp-mail-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp-mail-provider.js","sourceRoot":"","sources":["../src/smtp-mail-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAC9C,sEAAsE;IAC5D,WAAW,CAAyB;IAE9C;;;;OAIG;IACH,YAAY,MAAsB;QAC9B,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,2DAA2D;QAC3D,gFAAgF;QAChF,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC;YAC1C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;SAClB,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CAAC,OAAoB;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YACzC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE;YAClE,EAAE,EAAE,OAAO,CAAC,EAAE;gBACV,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;oBACvB,CAAC,CAAC,OAAO,CAAC,EAAE;gBAChB,CAAC,CAAC,SAAS;YACf,GAAG,EAAE,OAAO,CAAC,GAAG;gBACZ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;oBACxB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;oBACxB,CAAC,CAAC,OAAO,CAAC,GAAG;gBACjB,CAAC,CAAC,SAAS;YACf,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW,EAAE,CAAC,CAAC,WAAW;aAC7B,CAAC,CAAC;SACN,CAAC,CAAC;QAEH,OAAO;YACH,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACvE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACvE,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC;IACN,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM;QACR,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACJ"}