@vandenberghinc/volt 1.1.26 → 1.1.28

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 (502) hide show
  1. package/backend/dist/cjs/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  2. package/backend/dist/cjs/{blacklist.js → backend/src/blacklist.js} +8 -5
  3. package/backend/dist/cjs/{cli.js → backend/src/cli.js} +29 -47
  4. package/backend/dist/cjs/backend/src/database/collection.d.ts +1543 -0
  5. package/backend/dist/cjs/backend/src/database/collection.js +3042 -0
  6. package/backend/dist/cjs/backend/src/database/database.d.ts +66 -0
  7. package/backend/dist/cjs/{database → backend/src/database}/database.js +48 -43
  8. package/backend/dist/cjs/backend/src/database/filters/filters.d.ts +6 -0
  9. package/backend/dist/cjs/backend/src/database/filters/filters.js +15 -0
  10. package/backend/dist/cjs/backend/src/database/filters/strict_filter.d.ts +223 -0
  11. package/backend/dist/cjs/backend/src/database/filters/strict_filter.js +15 -0
  12. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test.js +443 -0
  13. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test_v0.js +15 -0
  14. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  15. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.js +15 -0
  16. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  17. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.js +15 -0
  18. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  19. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.js +15 -0
  20. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  21. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.js +15 -0
  22. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  23. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.js +15 -0
  24. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  25. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.js +355 -0
  26. package/backend/dist/cjs/backend/src/database/flatten.d.ts +75 -0
  27. package/backend/dist/cjs/{logger.js → backend/src/database/flatten.js} +18 -7
  28. package/backend/dist/cjs/backend/src/database/flatten_test.js +175 -0
  29. package/backend/dist/cjs/backend/src/database/quota/quota.d.ts +461 -0
  30. package/backend/dist/cjs/backend/src/database/quota/quota.js +1014 -0
  31. package/backend/dist/cjs/backend/src/database/quota/quota_v1.d.ts +534 -0
  32. package/backend/dist/cjs/backend/src/database/quota/quota_v1.js +1087 -0
  33. package/backend/dist/cjs/backend/src/database/quota/safe_int.d.ts +293 -0
  34. package/backend/dist/cjs/backend/src/database/quota/safe_int.js +573 -0
  35. package/backend/dist/{esm → cjs/backend/src}/endpoint.d.ts +69 -46
  36. package/backend/dist/cjs/{endpoint.js → backend/src/endpoint.js} +87 -101
  37. package/backend/dist/cjs/backend/src/errors/index.d.ts +7 -0
  38. package/backend/dist/cjs/backend/src/errors/index.js +25 -0
  39. package/backend/dist/{esm/utils.d.ts → cjs/backend/src/errors/internal_external.d.ts} +14 -22
  40. package/backend/dist/cjs/backend/src/errors/internal_external.js +85 -0
  41. package/backend/dist/cjs/backend/src/errors/invalid_usage_error.d.ts +38 -0
  42. package/backend/dist/cjs/{mutex.js → backend/src/errors/invalid_usage_error.js} +20 -37
  43. package/backend/dist/cjs/backend/src/errors/system_error.d.ts +230 -0
  44. package/backend/dist/cjs/backend/src/errors/system_error.js +393 -0
  45. package/backend/dist/cjs/backend/src/events.d.ts +54 -0
  46. package/backend/dist/cjs/backend/src/events.js +15 -0
  47. package/backend/dist/cjs/{frontend.js → backend/src/frontend.js} +1 -1
  48. package/backend/dist/cjs/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  49. package/backend/dist/cjs/{image_endpoint.js → backend/src/image_endpoint.js} +3 -5
  50. package/backend/dist/cjs/backend/src/logger.d.ts +5 -0
  51. package/backend/dist/cjs/backend/src/logger.js +15 -0
  52. package/backend/dist/cjs/backend/src/meta.d.ts +64 -0
  53. package/backend/dist/cjs/{meta.js → backend/src/meta.js} +9 -12
  54. package/backend/dist/cjs/backend/src/payments/paddle.d.ts +326 -0
  55. package/backend/dist/cjs/{payments → backend/src/payments}/paddle.js +377 -327
  56. package/backend/dist/cjs/backend/src/plugins/browser.d.ts +1 -0
  57. package/backend/dist/cjs/backend/src/plugins/browser.js +15 -0
  58. package/backend/dist/cjs/backend/src/plugins/mail/mail.d.ts +248 -0
  59. package/backend/dist/cjs/backend/src/plugins/mail/mail.js +379 -0
  60. package/backend/dist/{esm → cjs/backend/src}/plugins/mail/ui.d.ts +23 -0
  61. package/backend/dist/cjs/backend/src/plugins/pdf.d.ts +1 -0
  62. package/backend/dist/cjs/backend/src/rate_limit.d.ts +145 -0
  63. package/backend/dist/cjs/backend/src/rate_limit.js +549 -0
  64. package/backend/dist/cjs/{route.d.ts → backend/src/route.d.ts} +3 -10
  65. package/backend/dist/cjs/{route.js → backend/src/route.js} +23 -21
  66. package/backend/dist/cjs/backend/src/server.d.ts +485 -0
  67. package/backend/dist/cjs/{server.js → backend/src/server.js} +688 -873
  68. package/backend/dist/cjs/backend/src/splash_screen.d.ts +80 -0
  69. package/backend/dist/cjs/{splash_screen.js → backend/src/splash_screen.js} +24 -3
  70. package/backend/dist/cjs/backend/src/status.d.ts +74 -0
  71. package/backend/dist/cjs/{status.js → backend/src/status.js} +64 -64
  72. package/backend/dist/cjs/backend/src/stream.d.ts +376 -0
  73. package/backend/dist/cjs/{stream.js → backend/src/stream.js} +299 -276
  74. package/backend/dist/cjs/backend/src/users.d.ts +807 -0
  75. package/backend/dist/cjs/backend/src/users.js +1971 -0
  76. package/backend/dist/cjs/backend/src/utils.d.ts +16 -0
  77. package/backend/dist/cjs/{utils.js → backend/src/utils.js} +14 -77
  78. package/backend/dist/{esm → cjs/backend/src}/view.d.ts +33 -11
  79. package/backend/dist/cjs/backend/src/view.js +508 -0
  80. package/backend/dist/{esm → cjs/backend/src}/volt.d.ts +10 -1
  81. package/backend/dist/cjs/{volt.js → backend/src/volt.js} +8 -5
  82. package/backend/dist/cjs/frontend/src/modules/request.d.ts +70 -0
  83. package/backend/dist/cjs/frontend/src/modules/request.js +99 -0
  84. package/backend/dist/esm/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  85. package/backend/dist/esm/{blacklist.js → backend/src/blacklist.js} +9 -6
  86. package/backend/dist/esm/{cli.js → backend/src/cli.js} +43 -60
  87. package/backend/dist/esm/backend/src/database/collection.d.ts +1543 -0
  88. package/backend/dist/esm/backend/src/database/collection.js +3510 -0
  89. package/backend/dist/esm/backend/src/database/database.d.ts +66 -0
  90. package/backend/dist/esm/{database → backend/src/database}/database.js +62 -103
  91. package/backend/dist/esm/backend/src/database/document.d.ts +1 -0
  92. package/backend/dist/esm/backend/src/database/document.js +558 -0
  93. package/backend/dist/esm/backend/src/database/filters/filters.d.ts +6 -0
  94. package/backend/dist/esm/backend/src/database/filters/filters.js +1 -0
  95. package/backend/dist/esm/backend/src/database/filters/strict_filter.d.ts +223 -0
  96. package/backend/dist/esm/backend/src/database/filters/strict_filter.js +3 -0
  97. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.d.ts +1 -0
  98. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.js +505 -0
  99. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.d.ts +1 -0
  100. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.js +712 -0
  101. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  102. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.js +5 -0
  103. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  104. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.js +44 -0
  105. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  106. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.js +5 -0
  107. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  108. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.js +1 -0
  109. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  110. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.js +5 -0
  111. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  112. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.js +405 -0
  113. package/backend/dist/esm/backend/src/database/flatten.d.ts +75 -0
  114. package/backend/dist/esm/backend/src/database/flatten.js +22 -0
  115. package/backend/dist/esm/backend/src/database/flatten_test.d.ts +1 -0
  116. package/backend/dist/esm/backend/src/database/flatten_test.js +174 -0
  117. package/backend/dist/esm/backend/src/database/quota/quota.d.ts +461 -0
  118. package/backend/dist/esm/backend/src/database/quota/quota.js +1118 -0
  119. package/backend/dist/esm/backend/src/database/quota/quota_v1.d.ts +534 -0
  120. package/backend/dist/esm/backend/src/database/quota/quota_v1.js +1242 -0
  121. package/backend/dist/esm/backend/src/database/quota/safe_int.d.ts +293 -0
  122. package/backend/dist/esm/backend/src/database/quota/safe_int.js +602 -0
  123. package/backend/dist/{cjs → esm/backend/src}/endpoint.d.ts +69 -46
  124. package/backend/dist/esm/{endpoint.js → backend/src/endpoint.js} +136 -127
  125. package/backend/dist/esm/backend/src/errors/index.d.ts +7 -0
  126. package/backend/dist/esm/backend/src/errors/index.js +7 -0
  127. package/backend/dist/{cjs/utils.d.ts → esm/backend/src/errors/internal_external.d.ts} +14 -22
  128. package/backend/dist/esm/backend/src/errors/internal_external.js +70 -0
  129. package/backend/dist/esm/backend/src/errors/invalid_usage_error.d.ts +38 -0
  130. package/backend/dist/esm/backend/src/errors/invalid_usage_error.js +30 -0
  131. package/backend/dist/esm/backend/src/errors/system_error.d.ts +230 -0
  132. package/backend/dist/esm/backend/src/errors/system_error.js +402 -0
  133. package/backend/dist/esm/backend/src/events.d.ts +54 -0
  134. package/backend/dist/esm/backend/src/events.js +5 -0
  135. package/backend/dist/esm/{frontend.js → backend/src/frontend.js} +1 -1
  136. package/backend/dist/esm/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  137. package/backend/dist/esm/{image_endpoint.js → backend/src/image_endpoint.js} +16 -20
  138. package/backend/dist/esm/backend/src/logger.d.ts +5 -0
  139. package/backend/dist/esm/backend/src/logger.js +8 -0
  140. package/backend/dist/esm/backend/src/meta.d.ts +64 -0
  141. package/backend/dist/esm/{meta.js → backend/src/meta.js} +15 -54
  142. package/backend/dist/esm/backend/src/payments/paddle.d.ts +326 -0
  143. package/backend/dist/esm/{payments → backend/src/payments}/paddle.js +417 -452
  144. package/backend/dist/esm/backend/src/plugins/browser.d.ts +1 -0
  145. package/backend/dist/esm/backend/src/plugins/browser.js +170 -0
  146. package/backend/dist/esm/backend/src/plugins/mail/mail.d.ts +248 -0
  147. package/backend/dist/esm/backend/src/plugins/mail/mail.js +389 -0
  148. package/backend/dist/{cjs → esm/backend/src}/plugins/mail/ui.d.ts +23 -0
  149. package/backend/dist/esm/{plugins → backend/src/plugins}/mail/ui.js +3 -6
  150. package/backend/dist/esm/backend/src/plugins/pdf.d.ts +1 -0
  151. package/backend/dist/esm/{plugins → backend/src/plugins}/pdf.js +3 -3
  152. package/backend/dist/esm/backend/src/rate_limit.d.ts +145 -0
  153. package/backend/dist/esm/backend/src/rate_limit.js +667 -0
  154. package/backend/dist/esm/{route.d.ts → backend/src/route.d.ts} +3 -10
  155. package/backend/dist/esm/{route.js → backend/src/route.js} +26 -21
  156. package/backend/dist/esm/backend/src/server.d.ts +485 -0
  157. package/backend/dist/esm/{server.js → backend/src/server.js} +891 -1441
  158. package/backend/dist/esm/backend/src/splash_screen.d.ts +80 -0
  159. package/backend/dist/esm/{splash_screen.js → backend/src/splash_screen.js} +42 -55
  160. package/backend/dist/esm/backend/src/status.d.ts +74 -0
  161. package/backend/dist/esm/backend/src/status.js +199 -0
  162. package/backend/dist/esm/backend/src/stream.d.ts +376 -0
  163. package/backend/dist/esm/{stream.js → backend/src/stream.js} +327 -292
  164. package/backend/dist/esm/backend/src/users.d.ts +809 -0
  165. package/backend/dist/esm/backend/src/users.js +2140 -0
  166. package/backend/dist/esm/backend/src/utils.d.ts +16 -0
  167. package/backend/dist/esm/{utils.js → backend/src/utils.js} +20 -81
  168. package/backend/dist/{cjs → esm/backend/src}/view.d.ts +33 -11
  169. package/backend/dist/esm/{view.js → backend/src/view.js} +266 -86
  170. package/backend/dist/{cjs → esm/backend/src}/volt.d.ts +10 -1
  171. package/backend/dist/esm/{volt.js → backend/src/volt.js} +7 -4
  172. package/backend/dist/esm/frontend/src/modules/request.d.ts +70 -0
  173. package/backend/dist/esm/frontend/src/modules/request.js +117 -0
  174. package/frontend/dist/backend/src/database/collection.d.ts +1543 -0
  175. package/frontend/dist/backend/src/database/collection.js +3510 -0
  176. package/frontend/dist/backend/src/database/database.d.ts +66 -0
  177. package/frontend/dist/backend/src/database/database.js +196 -0
  178. package/frontend/dist/backend/src/database/filters/filters.d.ts +6 -0
  179. package/frontend/dist/backend/src/database/filters/filters.js +1 -0
  180. package/frontend/dist/backend/src/database/filters/strict_filter.d.ts +223 -0
  181. package/frontend/dist/backend/src/database/filters/strict_filter.js +3 -0
  182. package/frontend/dist/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  183. package/frontend/dist/backend/src/database/filters/strict_update_filter.js +5 -0
  184. package/frontend/dist/backend/src/database/flatten.d.ts +75 -0
  185. package/frontend/dist/backend/src/database/flatten.js +22 -0
  186. package/frontend/dist/backend/src/endpoint.d.ts +204 -0
  187. package/frontend/dist/backend/src/endpoint.js +570 -0
  188. package/frontend/dist/backend/src/errors/index.d.ts +7 -0
  189. package/frontend/dist/backend/src/errors/index.js +7 -0
  190. package/frontend/dist/backend/src/errors/internal_external.d.ts +38 -0
  191. package/frontend/dist/backend/src/errors/internal_external.js +70 -0
  192. package/frontend/dist/backend/src/errors/invalid_usage_error.d.ts +38 -0
  193. package/frontend/dist/backend/src/errors/invalid_usage_error.js +30 -0
  194. package/frontend/dist/backend/src/errors/system_error.d.ts +230 -0
  195. package/frontend/dist/backend/src/errors/system_error.js +402 -0
  196. package/frontend/dist/backend/src/events.d.ts +54 -0
  197. package/frontend/dist/backend/src/events.js +5 -0
  198. package/frontend/dist/backend/src/frontend.d.ts +11 -0
  199. package/frontend/dist/backend/src/frontend.js +12 -0
  200. package/frontend/dist/backend/src/image_endpoint.d.ts +39 -0
  201. package/frontend/dist/backend/src/image_endpoint.js +202 -0
  202. package/frontend/dist/backend/src/meta.d.ts +64 -0
  203. package/frontend/dist/backend/src/meta.js +110 -0
  204. package/frontend/dist/backend/src/payments/paddle.d.ts +326 -0
  205. package/frontend/dist/backend/src/payments/paddle.js +2256 -0
  206. package/frontend/dist/backend/src/plugins/mail/mail.d.ts +248 -0
  207. package/frontend/dist/backend/src/plugins/mail/mail.js +389 -0
  208. package/{backend/dist/esm/plugins/mail.d.ts → frontend/dist/backend/src/plugins/mail/ui.d.ts} +23 -0
  209. package/{backend/dist/esm/plugins/mail.js → frontend/dist/backend/src/plugins/mail/ui.js} +3 -6
  210. package/frontend/dist/backend/src/rate_limit.d.ts +145 -0
  211. package/frontend/dist/backend/src/rate_limit.js +673 -0
  212. package/frontend/dist/backend/src/route.d.ts +35 -0
  213. package/frontend/dist/backend/src/route.js +212 -0
  214. package/frontend/dist/backend/src/server.d.ts +485 -0
  215. package/frontend/dist/backend/src/server.js +2670 -0
  216. package/frontend/dist/backend/src/splash_screen.d.ts +80 -0
  217. package/frontend/dist/backend/src/splash_screen.js +135 -0
  218. package/frontend/dist/backend/src/status.d.ts +74 -0
  219. package/frontend/dist/backend/src/status.js +199 -0
  220. package/frontend/dist/backend/src/stream.d.ts +376 -0
  221. package/frontend/dist/backend/src/stream.js +1007 -0
  222. package/frontend/dist/backend/src/users.d.ts +807 -0
  223. package/frontend/dist/backend/src/users.js +2118 -0
  224. package/frontend/dist/backend/src/utils.d.ts +16 -0
  225. package/frontend/dist/backend/src/utils.js +241 -0
  226. package/frontend/dist/backend/src/view.d.ts +162 -0
  227. package/frontend/dist/backend/src/view.js +720 -0
  228. package/frontend/dist/frontend/src/elements/base.d.ts +4414 -0
  229. package/frontend/dist/{elements → frontend/src/elements}/base.js +3624 -260
  230. package/frontend/dist/frontend/src/elements/module.d.ts +95 -0
  231. package/frontend/dist/{elements → frontend/src/elements}/module.js +53 -52
  232. package/frontend/dist/frontend/src/elements/types.d.ts +52 -0
  233. package/frontend/dist/frontend/src/elements/types.js +5 -0
  234. package/frontend/dist/frontend/src/modules/attachment.d.ts +126 -0
  235. package/frontend/dist/frontend/src/modules/attachment.js +306 -0
  236. package/frontend/dist/frontend/src/modules/auth.d.ts +44 -0
  237. package/frontend/dist/frontend/src/modules/auth.js +80 -0
  238. package/frontend/dist/{modules → frontend/src/modules}/color.js +2 -2
  239. package/frontend/dist/frontend/src/modules/compression.d.ts +39 -0
  240. package/frontend/dist/frontend/src/modules/compression.js +102 -0
  241. package/frontend/dist/frontend/src/modules/cookies.d.ts +44 -0
  242. package/frontend/dist/frontend/src/modules/cookies.js +143 -0
  243. package/frontend/dist/frontend/src/modules/events.d.ts +31 -0
  244. package/frontend/dist/frontend/src/modules/events.js +74 -0
  245. package/frontend/dist/frontend/src/modules/google.d.ts +23 -0
  246. package/frontend/dist/frontend/src/modules/google.js +52 -0
  247. package/frontend/dist/frontend/src/modules/meta.d.ts +14 -0
  248. package/frontend/dist/{modules → frontend/src/modules}/meta.js +9 -7
  249. package/frontend/dist/{modules → frontend/src/modules}/paddle.d.ts +37 -134
  250. package/frontend/dist/{modules → frontend/src/modules}/paddle.js +620 -568
  251. package/frontend/dist/frontend/src/modules/request.d.ts +70 -0
  252. package/frontend/dist/frontend/src/modules/request.js +117 -0
  253. package/frontend/dist/frontend/src/modules/settings.d.ts +3 -0
  254. package/frontend/dist/frontend/src/modules/settings.js +5 -0
  255. package/frontend/dist/frontend/src/modules/statics.d.ts +21 -0
  256. package/frontend/dist/{modules → frontend/src/modules}/statics.js +15 -18
  257. package/frontend/dist/frontend/src/modules/support.d.ts +30 -0
  258. package/frontend/dist/frontend/src/modules/support.js +53 -0
  259. package/frontend/dist/{modules → frontend/src/modules}/theme.d.ts +67 -0
  260. package/frontend/dist/{modules → frontend/src/modules}/theme.js +68 -38
  261. package/frontend/dist/frontend/src/modules/themes.d.ts +12 -0
  262. package/frontend/dist/frontend/src/modules/themes.js +22 -0
  263. package/frontend/dist/frontend/src/modules/user.d.ts +164 -0
  264. package/frontend/dist/frontend/src/modules/user.js +268 -0
  265. package/frontend/dist/frontend/src/modules/utils.d.ts +176 -0
  266. package/frontend/dist/frontend/src/modules/utils.js +569 -0
  267. package/frontend/dist/frontend/src/types/gradient.d.ts +29 -0
  268. package/frontend/dist/{types → frontend/src/types}/gradient.js +14 -18
  269. package/frontend/dist/frontend/src/ui/border_button.d.ts +94 -0
  270. package/frontend/dist/{ui → frontend/src/ui}/border_button.js +7 -13
  271. package/frontend/dist/frontend/src/ui/button.d.ts +28 -0
  272. package/frontend/dist/{ui → frontend/src/ui}/button.js +21 -12
  273. package/frontend/dist/frontend/src/ui/canvas.d.ts +138 -0
  274. package/frontend/dist/{ui → frontend/src/ui}/canvas.js +88 -55
  275. package/frontend/dist/frontend/src/ui/checkbox.d.ts +74 -0
  276. package/frontend/dist/{ui → frontend/src/ui}/checkbox.js +80 -41
  277. package/frontend/dist/{ui → frontend/src/ui}/code.d.ts +73 -6
  278. package/frontend/dist/{ui → frontend/src/ui}/code.js +55 -52
  279. package/frontend/dist/{ui → frontend/src/ui}/context_menu.d.ts +4 -0
  280. package/frontend/dist/{ui → frontend/src/ui}/context_menu.js +12 -17
  281. package/frontend/dist/{ui → frontend/src/ui}/css.d.ts +4 -0
  282. package/frontend/dist/{ui → frontend/src/ui}/css.js +3 -3
  283. package/frontend/dist/{ui → frontend/src/ui}/divider.d.ts +4 -0
  284. package/frontend/dist/{ui → frontend/src/ui}/divider.js +3 -3
  285. package/frontend/dist/{ui → frontend/src/ui}/dropdown.d.ts +57 -2
  286. package/frontend/dist/{ui → frontend/src/ui}/dropdown.js +87 -94
  287. package/frontend/dist/{ui → frontend/src/ui}/for_each.d.ts +4 -0
  288. package/frontend/dist/{ui → frontend/src/ui}/for_each.js +3 -3
  289. package/frontend/dist/{ui → frontend/src/ui}/form.d.ts +6 -2
  290. package/frontend/dist/{ui → frontend/src/ui}/form.js +10 -7
  291. package/frontend/dist/frontend/src/ui/frame_modes.d.ts +37 -0
  292. package/frontend/dist/{ui → frontend/src/ui}/frame_modes.js +16 -22
  293. package/frontend/dist/{ui → frontend/src/ui}/google_map.d.ts +4 -0
  294. package/frontend/dist/{ui → frontend/src/ui}/google_map.js +4 -4
  295. package/frontend/dist/{ui → frontend/src/ui}/gradient.d.ts +4 -0
  296. package/frontend/dist/{ui → frontend/src/ui}/gradient.js +3 -3
  297. package/frontend/dist/{ui → frontend/src/ui}/image.d.ts +4 -0
  298. package/frontend/dist/{ui → frontend/src/ui}/image.js +5 -5
  299. package/frontend/dist/frontend/src/ui/input.d.ts +392 -0
  300. package/frontend/dist/{ui → frontend/src/ui}/input.js +346 -360
  301. package/frontend/dist/{ui → frontend/src/ui}/link.d.ts +4 -0
  302. package/frontend/dist/{ui → frontend/src/ui}/link.js +3 -3
  303. package/frontend/dist/{ui → frontend/src/ui}/list.d.ts +4 -0
  304. package/frontend/dist/{ui → frontend/src/ui}/list.js +12 -6
  305. package/frontend/dist/frontend/src/ui/loader_button.d.ts +80 -0
  306. package/frontend/dist/{ui → frontend/src/ui}/loader_button.js +35 -47
  307. package/frontend/dist/frontend/src/ui/loaders.d.ts +57 -0
  308. package/frontend/dist/{ui → frontend/src/ui}/loaders.js +11 -11
  309. package/frontend/dist/{ui → frontend/src/ui}/popup.d.ts +11 -6
  310. package/frontend/dist/{ui → frontend/src/ui}/popup.js +32 -18
  311. package/frontend/dist/frontend/src/ui/pseudo.d.ts +44 -0
  312. package/frontend/dist/{ui → frontend/src/ui}/pseudo.js +84 -8
  313. package/frontend/dist/{ui → frontend/src/ui}/scroller.d.ts +14 -2
  314. package/frontend/dist/{ui → frontend/src/ui}/scroller.js +37 -43
  315. package/frontend/dist/{ui → frontend/src/ui}/slider.d.ts +5 -1
  316. package/frontend/dist/{ui → frontend/src/ui}/slider.js +4 -4
  317. package/frontend/dist/{ui → frontend/src/ui}/spacer.d.ts +4 -0
  318. package/frontend/dist/{ui → frontend/src/ui}/spacer.js +3 -3
  319. package/frontend/dist/{ui → frontend/src/ui}/span.d.ts +4 -0
  320. package/frontend/dist/{ui → frontend/src/ui}/span.js +3 -3
  321. package/frontend/dist/{ui → frontend/src/ui}/stack.d.ts +4 -0
  322. package/frontend/dist/{ui → frontend/src/ui}/stack.js +3 -9
  323. package/frontend/dist/frontend/src/ui/steps.d.ts +131 -0
  324. package/frontend/dist/{ui → frontend/src/ui}/steps.js +30 -45
  325. package/frontend/dist/{ui → frontend/src/ui}/style.d.ts +4 -0
  326. package/frontend/dist/{ui → frontend/src/ui}/style.js +3 -3
  327. package/frontend/dist/{ui → frontend/src/ui}/switch.d.ts +5 -1
  328. package/frontend/dist/{ui → frontend/src/ui}/switch.js +4 -4
  329. package/frontend/dist/{ui → frontend/src/ui}/table.d.ts +4 -0
  330. package/frontend/dist/{ui → frontend/src/ui}/table.js +6 -6
  331. package/frontend/dist/{ui → frontend/src/ui}/tabs.d.ts +45 -3
  332. package/frontend/dist/{ui → frontend/src/ui}/tabs.js +65 -40
  333. package/frontend/dist/{ui → frontend/src/ui}/text.d.ts +4 -0
  334. package/frontend/dist/{ui → frontend/src/ui}/text.js +3 -3
  335. package/frontend/dist/frontend/src/ui/title.d.ts +91 -0
  336. package/frontend/dist/frontend/src/ui/title.js +272 -0
  337. package/frontend/dist/{ui → frontend/src/ui}/view.d.ts +4 -0
  338. package/frontend/dist/{ui → frontend/src/ui}/view.js +3 -3
  339. package/frontend/dist/{volt.d.ts → frontend/src/volt.d.ts} +3 -0
  340. package/frontend/dist/{volt.js → frontend/src/volt.js} +4 -0
  341. package/frontend/tools/bundle_d_ts.js +71 -0
  342. package/frontend/tools/convert_to_jsdoc_input.txt +9452 -0
  343. package/frontend/tools/convert_to_jsdoc_output.txt +7626 -0
  344. package/frontend/tools/convert_to_jsdoc_tmp.js +345 -0
  345. package/package.json +11 -12
  346. package/backend/dist/cjs/database/collection.d.ts +0 -160
  347. package/backend/dist/cjs/database/collection.js +0 -842
  348. package/backend/dist/cjs/database/database.d.ts +0 -121
  349. package/backend/dist/cjs/database/document.d.ts +0 -131
  350. package/backend/dist/cjs/database/document.js +0 -224
  351. package/backend/dist/cjs/database.d.ts +0 -502
  352. package/backend/dist/cjs/database.js +0 -2248
  353. package/backend/dist/cjs/logger.d.ts +0 -3
  354. package/backend/dist/cjs/meta.d.ts +0 -50
  355. package/backend/dist/cjs/mutex.d.ts +0 -24
  356. package/backend/dist/cjs/payments/paddle.d.ts +0 -160
  357. package/backend/dist/cjs/plugins/browser.d.ts +0 -36
  358. package/backend/dist/cjs/plugins/browser.js +0 -198
  359. package/backend/dist/cjs/plugins/css.d.ts +0 -11
  360. package/backend/dist/cjs/plugins/css.js +0 -80
  361. package/backend/dist/cjs/plugins/mail.d.ts +0 -277
  362. package/backend/dist/cjs/plugins/mail.js +0 -1370
  363. package/backend/dist/cjs/plugins/ts/compiler.d.ts +0 -139
  364. package/backend/dist/cjs/plugins/ts/compiler.js +0 -750
  365. package/backend/dist/cjs/plugins/ts/preprocessing.d.ts +0 -14
  366. package/backend/dist/cjs/plugins/ts/preprocessing.js +0 -440
  367. package/backend/dist/cjs/rate_limit.d.ts +0 -63
  368. package/backend/dist/cjs/rate_limit.js +0 -348
  369. package/backend/dist/cjs/request.deprc.d.ts +0 -48
  370. package/backend/dist/cjs/request.deprc.js +0 -572
  371. package/backend/dist/cjs/response.deprc.d.ts +0 -55
  372. package/backend/dist/cjs/response.deprc.js +0 -275
  373. package/backend/dist/cjs/server.d.ts +0 -342
  374. package/backend/dist/cjs/splash_screen.d.ts +0 -35
  375. package/backend/dist/cjs/status.d.ts +0 -61
  376. package/backend/dist/cjs/stream.d.ts +0 -79
  377. package/backend/dist/cjs/users.d.ts +0 -111
  378. package/backend/dist/cjs/users.js +0 -1817
  379. package/backend/dist/cjs/view.js +0 -352
  380. package/backend/dist/cjs/vinc.dev.d.ts +0 -3
  381. package/backend/dist/cjs/vinc.dev.js +0 -7
  382. package/backend/dist/css/adyen.css +0 -92
  383. package/backend/dist/css/volt.css +0 -70
  384. package/backend/dist/esm/database/collection.d.ts +0 -160
  385. package/backend/dist/esm/database/collection.js +0 -1328
  386. package/backend/dist/esm/database/database.d.ts +0 -121
  387. package/backend/dist/esm/database/document.d.ts +0 -131
  388. package/backend/dist/esm/database/document.js +0 -247
  389. package/backend/dist/esm/database.d.ts +0 -502
  390. package/backend/dist/esm/database.js +0 -2423
  391. package/backend/dist/esm/file_watcher.js +0 -329
  392. package/backend/dist/esm/logger.d.ts +0 -3
  393. package/backend/dist/esm/logger.js +0 -11
  394. package/backend/dist/esm/meta.d.ts +0 -50
  395. package/backend/dist/esm/mutex.d.ts +0 -24
  396. package/backend/dist/esm/mutex.js +0 -48
  397. package/backend/dist/esm/payments/paddle.d.ts +0 -160
  398. package/backend/dist/esm/plugins/browser.d.ts +0 -36
  399. package/backend/dist/esm/plugins/browser.js +0 -176
  400. package/backend/dist/esm/plugins/css.d.ts +0 -11
  401. package/backend/dist/esm/plugins/css.js +0 -90
  402. package/backend/dist/esm/plugins/ts/compiler.d.ts +0 -139
  403. package/backend/dist/esm/plugins/ts/compiler.js +0 -1194
  404. package/backend/dist/esm/plugins/ts/preprocessing.d.ts +0 -14
  405. package/backend/dist/esm/plugins/ts/preprocessing.js +0 -726
  406. package/backend/dist/esm/rate_limit.d.ts +0 -63
  407. package/backend/dist/esm/rate_limit.js +0 -417
  408. package/backend/dist/esm/request.deprc.d.ts +0 -48
  409. package/backend/dist/esm/request.deprc.js +0 -572
  410. package/backend/dist/esm/response.deprc.d.ts +0 -55
  411. package/backend/dist/esm/response.deprc.js +0 -275
  412. package/backend/dist/esm/server.d.ts +0 -342
  413. package/backend/dist/esm/splash_screen.d.ts +0 -35
  414. package/backend/dist/esm/status.d.ts +0 -61
  415. package/backend/dist/esm/status.js +0 -197
  416. package/backend/dist/esm/stream.d.ts +0 -79
  417. package/backend/dist/esm/users.d.ts +0 -111
  418. package/backend/dist/esm/users.js +0 -1935
  419. package/backend/dist/esm/vinc.dev.d.ts +0 -3
  420. package/backend/dist/esm/vinc.dev.js +0 -7
  421. package/frontend/dist/elements/base.d.ts +0 -9889
  422. package/frontend/dist/elements/module.d.ts +0 -30
  423. package/frontend/dist/modules/array.d.ts +0 -94
  424. package/frontend/dist/modules/array.js +0 -634
  425. package/frontend/dist/modules/auth.d.ts +0 -46
  426. package/frontend/dist/modules/auth.js +0 -139
  427. package/frontend/dist/modules/colors.d.ts +0 -1
  428. package/frontend/dist/modules/colors.js +0 -417
  429. package/frontend/dist/modules/compression.d.ts +0 -6
  430. package/frontend/dist/modules/compression.js +0 -999
  431. package/frontend/dist/modules/cookies.d.ts +0 -18
  432. package/frontend/dist/modules/cookies.js +0 -167
  433. package/frontend/dist/modules/date.d.ts +0 -142
  434. package/frontend/dist/modules/date.js +0 -493
  435. package/frontend/dist/modules/events.d.ts +0 -8
  436. package/frontend/dist/modules/events.js +0 -91
  437. package/frontend/dist/modules/google.d.ts +0 -11
  438. package/frontend/dist/modules/google.js +0 -54
  439. package/frontend/dist/modules/meta.d.ts +0 -10
  440. package/frontend/dist/modules/mutex.d.ts +0 -7
  441. package/frontend/dist/modules/mutex.js +0 -51
  442. package/frontend/dist/modules/number.d.ts +0 -16
  443. package/frontend/dist/modules/number.js +0 -23
  444. package/frontend/dist/modules/object.d.ts +0 -52
  445. package/frontend/dist/modules/object.js +0 -383
  446. package/frontend/dist/modules/scheme.d.ts +0 -227
  447. package/frontend/dist/modules/scheme.js +0 -531
  448. package/frontend/dist/modules/settings.d.ts +0 -3
  449. package/frontend/dist/modules/settings.js +0 -4
  450. package/frontend/dist/modules/statics.d.ts +0 -5
  451. package/frontend/dist/modules/string.d.ts +0 -124
  452. package/frontend/dist/modules/string.js +0 -745
  453. package/frontend/dist/modules/support.d.ts +0 -19
  454. package/frontend/dist/modules/support.js +0 -103
  455. package/frontend/dist/modules/themes.d.ts +0 -8
  456. package/frontend/dist/modules/themes.js +0 -18
  457. package/frontend/dist/modules/user.d.ts +0 -59
  458. package/frontend/dist/modules/user.js +0 -280
  459. package/frontend/dist/modules/utils.d.ts +0 -87
  460. package/frontend/dist/modules/utils.js +0 -923
  461. package/frontend/dist/types/gradient.d.ts +0 -12
  462. package/frontend/dist/ui/border_button.d.ts +0 -152
  463. package/frontend/dist/ui/button.d.ts +0 -21
  464. package/frontend/dist/ui/canvas.d.ts +0 -56
  465. package/frontend/dist/ui/checkbox.d.ts +0 -52
  466. package/frontend/dist/ui/frame_modes.d.ts +0 -25
  467. package/frontend/dist/ui/input.d.ts +0 -241
  468. package/frontend/dist/ui/loader_button.d.ts +0 -93
  469. package/frontend/dist/ui/loaders.d.ts +0 -57
  470. package/frontend/dist/ui/pseudo.d.ts +0 -16
  471. package/frontend/dist/ui/steps.d.ts +0 -59
  472. package/frontend/dist/ui/title.d.ts +0 -21
  473. package/frontend/dist/ui/title.js +0 -121
  474. package/frontend/examples/dashboard/dashboard.ts +0 -776
  475. /package/backend/dist/cjs/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  476. /package/backend/dist/cjs/{file_watcher.d.ts → backend/src/database/document.d.ts} +0 -0
  477. /package/backend/dist/cjs/{file_watcher.js → backend/src/database/document.js} +0 -0
  478. /package/backend/dist/cjs/{plugins/pdf.d.ts → backend/src/database/filters/strict_filter_test.d.ts} +0 -0
  479. /package/backend/dist/{esm/file_watcher.d.ts → cjs/backend/src/database/filters/strict_filter_test_v0.d.ts} +0 -0
  480. /package/backend/dist/{esm/plugins/pdf.d.ts → cjs/backend/src/database/flatten_test.d.ts} +0 -0
  481. /package/backend/dist/cjs/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  482. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  483. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.js +0 -0
  484. /package/backend/dist/cjs/{plugins → backend/src/plugins}/mail/ui.js +0 -0
  485. /package/backend/dist/cjs/{plugins → backend/src/plugins}/pdf.js +0 -0
  486. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  487. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  488. /package/backend/dist/cjs/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  489. /package/backend/dist/cjs/{vinc.js → backend/src/vinc.js} +0 -0
  490. /package/backend/dist/esm/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  491. /package/backend/dist/esm/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  492. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  493. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.js +0 -0
  494. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  495. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  496. /package/backend/dist/esm/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  497. /package/backend/dist/esm/{vinc.js → backend/src/vinc.js} +0 -0
  498. /package/frontend/dist/{elements → frontend/src/elements}/register_element.d.ts +0 -0
  499. /package/frontend/dist/{elements → frontend/src/elements}/register_element.js +0 -0
  500. /package/frontend/dist/{modules → frontend/src/modules}/color.d.ts +0 -0
  501. /package/frontend/dist/{ui → frontend/src/ui}/ui.d.ts +0 -0
  502. /package/frontend/dist/{ui → frontend/src/ui}/ui.js +0 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh.
4
+ */
5
+ // imports.
6
+ import * as nodemailer from "nodemailer";
7
+ import * as vlib from "@vandenberghinc/vlib";
8
+ // imports.
9
+ import * as UI from "./ui.js";
10
+ import { ExternalError } from "../../errors/index.js";
11
+ import { Status } from "../../status.js";
12
+ /**
13
+ * mail module.
14
+ */
15
+ export class Mail {
16
+ /** the smpt mailer. */
17
+ smtp;
18
+ /** the smtp sender address. */
19
+ sender; // is defined when `smtp` is defined.
20
+ /** the default mail style. */
21
+ style;
22
+ /** construct a new server instance. */
23
+ constructor({ smtp, style = {
24
+ font: '"Helvetica", sans-serif',
25
+ title_fg: "#121B23",
26
+ subtitle_fg: "#121B23",
27
+ text_fg: "#1F2F3D",
28
+ button_fg: "#FFFFFF",
29
+ footer_fg: "#686B80",
30
+ bg: "#EEEEEE",
31
+ widget_bg: "#FFFFFF",
32
+ widget_border: "#E6E6E6",
33
+ button_bg: "#1F2F3D",
34
+ divider_bg: "#706780",
35
+ }, }) {
36
+ this.style = style;
37
+ this.sender = smtp.sender;
38
+ this.smtp = nodemailer.createTransport({
39
+ ...smtp,
40
+ ...(smtp.override ?? {}),
41
+ });
42
+ }
43
+ // ---------------------------------------------------------
44
+ // public methods.
45
+ /**
46
+ * send one or multiple mails.
47
+ *
48
+ * @note ensure SPF/DKIM are configured when sending attachments.
49
+ * @returns resolves/rejects when the mail has been sent.
50
+ *
51
+ * @param sender optional sender override.
52
+ * @param recipients recipient addresses.
53
+ * @param subject subject line.
54
+ * @param body html string or `UI.MailElement`.
55
+ * @param attachments supported inputs (paths, backend model, REST model, or nodemailer attachment).
56
+ * @param max_attachments limit on number of attachments; -1 disables.
57
+ * @param max_attachment_size max size (bytes) per attachment; -1 disables.
58
+ * @param max_attachments_size max total size (bytes) across attachments; -1 disables.
59
+ */
60
+ async send({ sender = undefined, recipients = [], subject = undefined, body = "", attachments = [], max_attachments = -1, max_attachment_size = -1, max_attachments_size = -1, allow_untrusted_urls = false, }) {
61
+ if (!this.smtp) {
62
+ throw new Error("smtp is not enabled, define the required server argument on initialization to enable smtp.");
63
+ }
64
+ if (body instanceof UI.MailElement) {
65
+ body = body.html();
66
+ }
67
+ if ((sender == null) && (this.sender != null)) {
68
+ sender = this.sender;
69
+ }
70
+ if (!recipients || recipients.length === 0) {
71
+ throw new Error("the mail has no recipients.");
72
+ }
73
+ if (sender == null) {
74
+ throw new Error('parameter "sender" should be a defined value of type "string" or "array".');
75
+ }
76
+ const format_address = (address) => {
77
+ if (Array.isArray(address))
78
+ return `${address[0]} <${address[1]}>`;
79
+ return address;
80
+ };
81
+ const to = [];
82
+ recipients.forEach((address) => to.push(format_address(address)));
83
+ const { nodemailer_attachments } = this.normalize_and_validate_attachments(attachments, {
84
+ max_attachments,
85
+ max_attachment_size,
86
+ max_attachments_size,
87
+ allow_untrusted_urls,
88
+ });
89
+ try {
90
+ await this.smtp.sendMail({
91
+ from: format_address(sender),
92
+ to,
93
+ subject,
94
+ html: body,
95
+ attachments: nodemailer_attachments,
96
+ });
97
+ }
98
+ catch (error) {
99
+ throw new Error(error?.message ?? String(error));
100
+ }
101
+ }
102
+ // ---------------------------------------------------------
103
+ // attachment handling (normalization + validation).
104
+ // ---------------------------------------------------------
105
+ /**
106
+ * convert a single generic attachment input into a nodemailer attachment.
107
+ */
108
+ build_attachment(it, opts = {}) {
109
+ // filesystem path inputs (string | vlib.Path).
110
+ if (typeof it === "string" || (it instanceof vlib.Path)) {
111
+ const path = (it instanceof vlib.Path) ? it : new vlib.Path(it);
112
+ const file_name = path.full_name();
113
+ const buf = path.load_sync();
114
+ return {
115
+ filename: file_name,
116
+ path: path.str(),
117
+ content: buf,
118
+ };
119
+ }
120
+ // rest payload: either { content + encoding } or { url }.
121
+ if (Mail.Attachment.RestAPI.is(it)) {
122
+ const { name, mime_type, charset, compressed } = it;
123
+ // a) content + encoding -> to content Buffer/string for nodemailer.
124
+ if (typeof it.content === "string") {
125
+ const enc = (it.encoding ?? "base64").toLowerCase();
126
+ let payload = it.content;
127
+ if (enc === "base64") {
128
+ payload = Buffer.from(this.normalize_base64(it.content), "base64");
129
+ }
130
+ else if (enc === "hex" || enc === "latin1" || enc === "binary" || enc === "utf8" || enc === "utf-8") {
131
+ const node_enc = enc === "utf-8" ? "utf8" : enc;
132
+ payload = Buffer.from(it.content, node_enc);
133
+ }
134
+ else {
135
+ throw new ExternalError({
136
+ status: Status.bad_request,
137
+ type: "InvalidAttachment",
138
+ message: `Unsupported encoding '${it.encoding}'.`,
139
+ });
140
+ }
141
+ return {
142
+ filename: name ?? "attachment",
143
+ content: payload,
144
+ contentType: mime_type,
145
+ headers: this.build_content_headers({ charset, compressed }),
146
+ };
147
+ }
148
+ // b) url (http/https/data) -> nodemailer streams from path.
149
+ if (it.url) {
150
+ if (!opts.allow_untrusted_urls && this.is_http_url(it.url)) {
151
+ throw new ExternalError({
152
+ status: Status.bad_request,
153
+ type: "UntrustedUrlBlocked",
154
+ message: "http/https attachment urls are blocked by default. set 'allow_untrusted_urls' to true to allow.",
155
+ });
156
+ }
157
+ return {
158
+ filename: name ?? "attachment",
159
+ path: it.url,
160
+ contentType: mime_type,
161
+ headers: this.build_content_headers({ charset, compressed }),
162
+ };
163
+ }
164
+ throw new ExternalError({
165
+ status: Status.bad_request,
166
+ type: "InvalidAttachment",
167
+ message: "Attachment payload missing { content, encoding } or { url }.",
168
+ });
169
+ }
170
+ // backend model: { bytes } or { content + encoding }.
171
+ if (Mail.Attachment.is(it)) {
172
+ const { name, mime_type, charset, compressed } = it;
173
+ if (it.bytes) {
174
+ const buf = Buffer.isBuffer(it.bytes) ? it.bytes : Buffer.from(it.bytes);
175
+ return {
176
+ filename: name ?? "attachment",
177
+ content: buf,
178
+ contentType: mime_type,
179
+ headers: this.build_content_headers({ charset, compressed }),
180
+ };
181
+ }
182
+ if (typeof it.content === "string") {
183
+ const enc = (it.encoding ?? "base64").toLowerCase();
184
+ let payload;
185
+ if (enc === "base64") {
186
+ payload = Buffer.from(this.normalize_base64(it.content), "base64");
187
+ }
188
+ else if (enc === "hex" || enc === "latin1" || enc === "binary" || enc === "utf8" || enc === "utf-8") {
189
+ const node_enc = enc === "utf-8" ? "utf8" : enc;
190
+ payload = Buffer.from(it.content, node_enc);
191
+ }
192
+ else {
193
+ throw new ExternalError({
194
+ status: Status.bad_request,
195
+ type: "InvalidAttachment",
196
+ message: `Unsupported encoding '${it.encoding}'.`,
197
+ });
198
+ }
199
+ return {
200
+ filename: name ?? "attachment",
201
+ content: payload,
202
+ contentType: mime_type,
203
+ headers: this.build_content_headers({ charset, compressed }),
204
+ };
205
+ }
206
+ // passthrough for pre-built nodemailer attachments.
207
+ if (Mail.Attachment.Native.is(it)) {
208
+ return { ...it };
209
+ }
210
+ throw new ExternalError({
211
+ status: Status.bad_request,
212
+ type: "InvalidAttachment",
213
+ message: "Attachment missing content: provide bytes or { content, encoding }.",
214
+ });
215
+ }
216
+ throw new ExternalError({
217
+ status: Status.bad_request,
218
+ type: "InvalidAttachment",
219
+ message: "Unsupported attachment input.",
220
+ });
221
+ }
222
+ /** returns true when url starts with http:// or https:// */
223
+ is_http_url(u) {
224
+ const s = typeof u === "string" ? u : String(u);
225
+ return /^https?:\/\//i.test(s);
226
+ }
227
+ /**
228
+ * normalize and validate a mixed attachment input into nodemailer attachments.
229
+ * @param input mixed list of attachments.
230
+ * @param limits size/count validation limits.
231
+ * @returns normalized nodemailer attachments.
232
+ * @throws {ExternalError} when limits are exceeded.
233
+ */
234
+ normalize_and_validate_attachments(input, limits = {}) {
235
+ const items = input ?? [];
236
+ const nm_attachments = [];
237
+ for (const it of items) {
238
+ const built = this.build_attachment(it, limits);
239
+ nm_attachments.push(built);
240
+ }
241
+ const { max_attachments, max_attachment_size, max_attachments_size, } = limits;
242
+ if (typeof max_attachments === "number" && max_attachments !== -1 && nm_attachments.length > max_attachments) {
243
+ throw new ExternalError({
244
+ status: Status.bad_request,
245
+ type: "TooManyAttachments",
246
+ message: `Too many attachments. max is ${max_attachments}.`,
247
+ });
248
+ }
249
+ if (typeof max_attachment_size === "number" && max_attachment_size !== -1) {
250
+ for (const a of nm_attachments) {
251
+ const size = this.measure_attachment_bytes(a);
252
+ if (size > max_attachment_size) {
253
+ throw new ExternalError({
254
+ status: Status.bad_request,
255
+ type: "AttachmentTooLarge",
256
+ message: `Attachment '${a.filename ?? "unnamed"}' exceeds max size of ${max_attachment_size} bytes.`,
257
+ });
258
+ }
259
+ }
260
+ }
261
+ if (typeof max_attachments_size === "number" && max_attachments_size !== -1) {
262
+ let total = 0;
263
+ for (const a of nm_attachments)
264
+ total += this.measure_attachment_bytes(a);
265
+ if (total > max_attachments_size) {
266
+ throw new ExternalError({
267
+ status: Status.bad_request,
268
+ type: "AttachmentsTooLarge",
269
+ message: `Total attachments size ${total} bytes exceeds max of ${max_attachments_size} bytes.`,
270
+ });
271
+ }
272
+ }
273
+ return { nodemailer_attachments: nm_attachments };
274
+ }
275
+ /**
276
+ * measure the on-wire payload size (approx) of a nodemailer attachment content.
277
+ * note: if `encoding: "base64"` is set, we decode to compute raw byte size.
278
+ */
279
+ measure_attachment_bytes(a) {
280
+ if (a.content) {
281
+ if (Buffer.isBuffer(a.content))
282
+ return a.content.length;
283
+ if (typeof a.content === "string") {
284
+ if (a.encoding === "base64") {
285
+ try {
286
+ return Buffer.from(a.content, "base64").length;
287
+ }
288
+ catch {
289
+ return a.content.length;
290
+ }
291
+ }
292
+ return Buffer.byteLength(a.content);
293
+ }
294
+ // stream size unknown beforehand.
295
+ return 0;
296
+ }
297
+ if (a.path) {
298
+ try {
299
+ const p = new vlib.Path(String(a.path));
300
+ return p.size ?? 0;
301
+ }
302
+ catch {
303
+ return 0;
304
+ }
305
+ }
306
+ return 0;
307
+ }
308
+ /**
309
+ * normalize a base64 or url-safe base64 string to standard base64 (no decoding).
310
+ * trims whitespace and converts url-safe chars.
311
+ */
312
+ normalize_base64(b64) {
313
+ let t = String(b64).trim().replace(/-/g, "+").replace(/_/g, "/");
314
+ const mod = t.length % 4;
315
+ if (mod)
316
+ t += "=".repeat(4 - mod);
317
+ return t;
318
+ }
319
+ /**
320
+ * optional content headers for charset/compression hints.
321
+ * email clients usually ignore custom headers; added for traceability.
322
+ */
323
+ build_content_headers({ charset, compressed }) {
324
+ const headers = {};
325
+ if (charset)
326
+ headers["X-Attachment-Charset"] = charset;
327
+ if (typeof compressed === "boolean")
328
+ headers["X-Attachment-Compressed"] = compressed ? "gzip" : "none";
329
+ return Object.keys(headers).length ? headers : undefined;
330
+ }
331
+ }
332
+ /** nested types for the mail module. */
333
+ (function (Mail) {
334
+ /** Nested attachment types. */
335
+ let Attachment;
336
+ (function (Attachment) {
337
+ Attachment.encodings = new Set(["base64", "hex", "utf8", "utf-8", "binary", "latin1"]);
338
+ /** Type guard. */
339
+ function is(a) {
340
+ return a && typeof a === "object"
341
+ && ("name" in a)
342
+ && (!("path" in a) || typeof a.path === "string")
343
+ && (!("mime_type" in a) || typeof a.mime_type === "string")
344
+ && (!("charset" in a) || typeof a.charset === "string")
345
+ && (!("bytes" in a) || (Buffer.isBuffer(a.bytes) || a.bytes instanceof Uint8Array))
346
+ && (!("content" in a) || typeof a.content === "string")
347
+ && (!("encoding" in a) || Attachment.encodings.has(a.encoding))
348
+ && (!("compressed" in a) || typeof a.compressed === "boolean");
349
+ }
350
+ Attachment.is = is;
351
+ let RestAPI;
352
+ (function (RestAPI) {
353
+ /** Type guard. */
354
+ function is(a) {
355
+ return a && typeof a === "object"
356
+ && ("name" in a)
357
+ && (!("path" in a) || typeof a.path === "string")
358
+ && (!("mime_type" in a) || typeof a.mime_type === "string")
359
+ && (!("charset" in a) || typeof a.charset === "string")
360
+ && (!("compressed" in a) || typeof a.compressed === "boolean")
361
+ && (!("content" in a) || typeof a.content === "string")
362
+ && (!("encoding" in a) || Attachment.encodings.has(a.encoding))
363
+ && (!("url" in a) || typeof a.url === "string");
364
+ }
365
+ RestAPI.is = is;
366
+ /** Schema validation. */
367
+ RestAPI.Schema = {
368
+ name: { type: "string", required: true },
369
+ path: { type: "string", required: false },
370
+ mime_type: { type: "string", required: false },
371
+ charset: { type: "string", required: false },
372
+ compressed: { type: "boolean", required: false },
373
+ content: { type: "string", required: false },
374
+ encoding: { type: "string", enum: Array.from(Attachment.encodings), required: false },
375
+ url: { type: "string", required: false },
376
+ };
377
+ })(RestAPI = Attachment.RestAPI || (Attachment.RestAPI = {}));
378
+ /** Nested native types. */
379
+ let Native;
380
+ (function (Native) {
381
+ /** Simple type guard. */
382
+ function is(a) {
383
+ return a && typeof a === "object"
384
+ && ("content" in a || "path" in a || "filename" in a);
385
+ }
386
+ Native.is = is;
387
+ })(Native = Attachment.Native || (Attachment.Native = {}));
388
+ })(Attachment = Mail.Attachment || (Mail.Attachment = {}));
389
+ })(Mail || (Mail = {}));
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
+ */
5
+ type none = undefined | null;
1
6
  export declare class Element {
2
7
  type: string;
3
8
  element_type: string;
@@ -23,10 +28,27 @@ export declare class Element {
23
28
  pad_numeric(value: string | number, padding?: string): string;
24
29
  html(): string;
25
30
  links(links: (string | Record<string, string>)[]): this;
31
+ /**
32
+ * Get or set the background color of the element.
33
+ * @param value The color value to set.
34
+ * @returns The current value when getting, or the element instance when setting.
35
+ * @funcs 3
36
+ * @docs
37
+ */
26
38
  background_color(): string | undefined;
27
39
  background_color(value: string): this;
40
+ /**
41
+ * Get or set the display property.
42
+ * @funcs 3
43
+ * @docs
44
+ */
28
45
  display(): string | undefined;
29
46
  display(value: string): this;
47
+ /**
48
+ * Get or set the background image.
49
+ * @funcs 3
50
+ * @docs
51
+ */
30
52
  background_image(): string | undefined;
31
53
  background_image(value: string): this;
32
54
  background_repeat(): string | undefined;
@@ -275,3 +297,4 @@ export declare class MailElement extends Element {
275
297
  }
276
298
  export declare const Mail: <Extensions extends object = {}>(...args: any[]) => MailElement & Extensions;
277
299
  export declare const NullMailElement: <Extensions extends object = {}>() => MailElement & Extensions;
300
+ export {};
@@ -1,10 +1,7 @@
1
- /*
2
- * Author: Daan van den Bergh
3
- * Copyright: © 2022 - 2024 Daan van den Bergh.
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
4
  */
5
- // ---------------------------------------------------------
6
- // The HTML element server side for creating mails.
7
- // Element.
8
5
  // The class.
9
6
  export class Element {
10
7
  // ---------------------------------------------------------
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,6 @@
1
- /*
2
- * Author: Daan van den Bergh
3
- * Copyright: © 2022 - 2024 Daan van den Bergh.
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
4
  */
5
5
  // ---------------------------------------------------------
6
6
  // Imports.
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
+ */
5
+ import * as https from "https";
6
+ import * as vlib from "@vandenberghinc/vlib";
7
+ import type { Server } from "./server.js";
8
+ export interface RateLimitGroup {
9
+ /** The rate limit group name. */
10
+ group?: string | null;
11
+ /** The maximum requests per rate limit interval. */
12
+ limit?: number | null;
13
+ /** The rate limit interval in seconds. */
14
+ interval?: number | null;
15
+ }
16
+ export interface RateLimitData {
17
+ /** The rate limit group name. */
18
+ group: string;
19
+ /** The maximum requests per rate limit interval. */
20
+ limit: number;
21
+ /** The rate limit interval in seconds. */
22
+ interval: number;
23
+ }
24
+ export interface RateLimitCacheData {
25
+ count: number;
26
+ expiration: number;
27
+ }
28
+ /**
29
+ * The rate limit groups for the endpoint.
30
+ *
31
+ * A group can either be registered through this class or by defining the rate limit group on an endpoint using `Endpoint.rate_limit`.
32
+ *
33
+ * This class will be accessable under `Server` attribute `rate_limits`.
34
+ * @nav Backend/Rate Limit
35
+ * @docs
36
+ */
37
+ export declare namespace RateLimits {
38
+ const groups: Map<string, RateLimitData>;
39
+ /**
40
+ * Add a rate limit group.
41
+ * @param group The rate limit group.
42
+ * @param limit The maximum requests per rate limit interval, defaults to 50.
43
+ * @param interval The rate limit interval in seconds, defaults to 60.
44
+ * @docs
45
+ */
46
+ function add({ group, limit, interval }: RateLimitGroup): RateLimitData;
47
+ /**
48
+ * Normalize an IPv4 or IPv6 address into a unique, canonical string suitable for rate limiting keys.
49
+ *
50
+ * Behavior:
51
+ * - Trims surrounding whitespace.
52
+ * - If bracketed (`[addr]` or `[addr]:port`), removes brackets (and any trailing port).
53
+ * - Removes IPv6 zone/scope IDs (`%...`), e.g. `fe80::1%eth0` → `fe80::1`.
54
+ * - IPv4: returns dotted-decimal without leading zeros (e.g. `001.002.003.004` → `1.2.3.4`).
55
+ * - IPv6: emits RFC 5952 canonical form (lowercase hex, no leading zeros, single longest `::`).
56
+ * - IPv4-mapped IPv6 (`::ffff:0:0/96`) is normalized to plain IPv4 (e.g. `::ffff:203.0.113.7` → `203.0.113.7`).
57
+ *
58
+ * Notes:
59
+ * - This function expects a host/address string (not a full URL). It tolerates `[v6]:port`
60
+ * but intentionally does **not** accept non-bracketed `ipv4:port`.
61
+ *
62
+ * @param ip The input IPv4/IPv6 address.
63
+ * @returns Canonical address string.
64
+ * @throws {Error} If the input is not a valid IPv4 or IPv6 address.
65
+ */
66
+ function normalize_ip(ip: string): string;
67
+ }
68
+ /** Nested types for the {@link RateLimitServer}. */
69
+ export declare namespace RateLimitServer {
70
+ /** Constructor options. */
71
+ interface Opts {
72
+ /** The port to which the rate limiting server will bind. The default is `51234`. */
73
+ port?: number;
74
+ /** The IP address to which the rate limiting server will bind. By default, it runs on localhost only. */
75
+ ip?: string;
76
+ /** Enable the https attribute to run on https. */
77
+ https?: https.ServerOptions;
78
+ }
79
+ }
80
+ /**
81
+ * The rate limit websocket class (server).
82
+ * Rate limiting is handled automatically when the endpoints has it enabled.
83
+ *
84
+ * @nav Backend/Rate Limit
85
+ */
86
+ export declare class RateLimitServer {
87
+ static default_port: number;
88
+ private ip;
89
+ private port;
90
+ private https_config;
91
+ private server;
92
+ private limits;
93
+ ws?: vlib.websocket.Server;
94
+ private clear_caches_interval?;
95
+ constructor({ port, ip, https, _server, }: RateLimitServer.Opts & {
96
+ _server: Server;
97
+ });
98
+ /** Assert the server is running. */
99
+ private assert_connected;
100
+ start(): Promise<void>;
101
+ stop(): Promise<void>;
102
+ limit(ip: string, groups?: RateLimitGroup[]): Promise<number | null>;
103
+ reset(group: string): Promise<void>;
104
+ reset_all(): Promise<void>;
105
+ }
106
+ /** Nested types for the {@link RateLimitClient}. */
107
+ export declare namespace RateLimitClient {
108
+ /** Constructor options. */
109
+ interface Opts {
110
+ /** The port to which the rate limiting server will bind. The default is `51234`. */
111
+ port?: number;
112
+ /** The IP address to which the rate limiting server will bind. By default, it runs on localhost only. */
113
+ ip?: string;
114
+ /** A boolean flag indicating if the server runs on HTTPS. */
115
+ https?: boolean;
116
+ /** The websocket URL of the server. If defined this takes precedence over parameters `ip` and `port`. */
117
+ url?: string;
118
+ }
119
+ }
120
+ /**
121
+ * The secondary rate limit class (client).
122
+ *
123
+ * Rate limiting is handled automatically when the endpoints has it enabled.
124
+ *
125
+ * @nav Backend/Rate Limit
126
+ */
127
+ export declare class RateLimitClient {
128
+ private ip;
129
+ private port;
130
+ private https;
131
+ private url?;
132
+ private server;
133
+ ws?: vlib.websocket.Client;
134
+ constructor({ ip, port, https, url, _server, }: RateLimitClient.Opts & {
135
+ _server: Server;
136
+ });
137
+ /** Assert the client is started & connected. */
138
+ private assert_connected;
139
+ start(): Promise<void>;
140
+ stop(): Promise<void>;
141
+ limit(ip: string, groups?: RateLimitGroup[]): Promise<number | null>;
142
+ reset(group: string): Promise<void>;
143
+ reset_all(): Promise<void>;
144
+ }
145
+ export default RateLimits;