@nocobase/plugin-workflow-mailer 2.4.0-alpha.1 → 2.4.0-alpha.11

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 (187) hide show
  1. package/dist/externalVersion.js +6 -6
  2. package/dist/node_modules/joi/dist/joi-browser.min.js +1 -1
  3. package/dist/node_modules/joi/lib/index.js +1 -1
  4. package/dist/node_modules/joi/lib/messages.js +35 -6
  5. package/dist/node_modules/joi/lib/types/keys.js +18 -1
  6. package/dist/node_modules/joi/lib/types/link.js +18 -2
  7. package/dist/node_modules/joi/lib/types/string.js +2 -2
  8. package/dist/node_modules/joi/package.json +1 -1
  9. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
  10. package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
  11. package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
  12. package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
  13. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
  14. package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
  15. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
  16. package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
  17. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
  18. package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
  19. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
  20. package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
  21. package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
  22. package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
  23. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
  24. package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
  25. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
  26. package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
  27. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
  28. package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
  29. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
  30. package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
  31. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
  32. package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
  33. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
  34. package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
  35. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
  36. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
  37. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
  38. package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
  39. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
  40. package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
  41. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
  42. package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
  43. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
  44. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
  45. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
  46. package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
  47. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
  48. package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
  49. package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
  50. package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
  51. package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
  52. package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
  53. package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +63 -112
  54. package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
  55. package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
  56. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
  57. package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
  58. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
  59. package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
  60. package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
  61. package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
  62. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
  63. package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
  64. package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
  65. package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
  66. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
  67. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
  68. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
  69. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
  70. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
  71. package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
  72. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
  73. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
  74. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
  75. package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
  76. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
  77. package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
  78. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
  79. package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
  80. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
  81. package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
  82. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
  83. package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
  84. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
  85. package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
  86. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
  87. package/dist/node_modules/nodemailer/dist/esm/addressparser/index.js +786 -0
  88. package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
  89. package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +39 -68
  90. package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
  91. package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +62 -92
  92. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
  93. package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.js +176 -0
  94. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
  95. package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
  96. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
  97. package/dist/node_modules/nodemailer/dist/esm/dkim/sign.js +125 -0
  98. package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
  99. package/dist/node_modules/nodemailer/dist/esm/errors.js +67 -0
  100. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
  101. package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
  102. package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
  103. package/dist/node_modules/nodemailer/dist/esm/fetch/index.js +344 -0
  104. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
  105. package/dist/node_modules/nodemailer/dist/esm/json-transport/index.js +62 -0
  106. package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
  107. package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +283 -275
  108. package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
  109. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +151 -205
  110. package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
  111. package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +111 -125
  112. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
  113. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
  114. package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
  115. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +43 -49
  116. package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
  117. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +576 -437
  118. package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
  119. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
  120. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
  121. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +7 -15
  122. package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
  123. package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -16
  124. package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
  125. package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
  126. package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
  127. package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
  128. package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
  129. package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
  130. package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
  131. package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
  132. package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +59 -77
  133. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
  134. package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.js +170 -0
  135. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
  136. package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
  137. package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
  138. package/dist/node_modules/nodemailer/dist/esm/shared/index.js +631 -0
  139. package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
  140. package/dist/node_modules/nodemailer/dist/esm/shared/objects.js +38 -0
  141. package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
  142. package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
  143. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
  144. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
  145. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
  146. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.js +149 -0
  147. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
  148. package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.js +1797 -0
  149. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
  150. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +195 -314
  151. package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
  152. package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +70 -107
  153. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
  154. package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.js +331 -0
  155. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
  156. package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.js +106 -0
  157. package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
  158. package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +12 -23
  159. package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
  160. package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
  161. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
  162. package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.js +386 -0
  163. package/dist/node_modules/nodemailer/dist/well-known/services.json +640 -0
  164. package/dist/node_modules/nodemailer/package.json +1 -1
  165. package/package.json +4 -4
  166. package/dist/node_modules/nodemailer/.gitattributes +0 -6
  167. package/dist/node_modules/nodemailer/.ncurc.js +0 -7
  168. package/dist/node_modules/nodemailer/.prettierrc.js +0 -8
  169. package/dist/node_modules/nodemailer/lib/addressparser/index.js +0 -313
  170. package/dist/node_modules/nodemailer/lib/dkim/message-parser.js +0 -155
  171. package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
  172. package/dist/node_modules/nodemailer/lib/dkim/sign.js +0 -117
  173. package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -281
  174. package/dist/node_modules/nodemailer/lib/fetch/index.js +0 -274
  175. package/dist/node_modules/nodemailer/lib/json-transport/index.js +0 -82
  176. package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -625
  177. package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
  178. package/dist/node_modules/nodemailer/lib/sendmail-transport/index.js +0 -210
  179. package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -349
  180. package/dist/node_modules/nodemailer/lib/shared/index.js +0 -688
  181. package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -108
  182. package/dist/node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js +0 -143
  183. package/dist/node_modules/nodemailer/lib/smtp-connection/index.js +0 -1825
  184. package/dist/node_modules/nodemailer/lib/smtp-transport/index.js +0 -416
  185. package/dist/node_modules/nodemailer/lib/stream-transport/index.js +0 -135
  186. package/dist/node_modules/nodemailer/lib/well-known/services.json +0 -343
  187. package/dist/node_modules/nodemailer/lib/xoauth2/index.js +0 -376
@@ -0,0 +1,680 @@
1
+ "use strict";
2
+ /* eslint no-console: 0 */
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.encodeXText = exports.assign = exports.parseDataURI = exports.callbackPromise = exports.getLogger = exports._logFunc = exports.parseConnectionUrl = exports.resolveHostname = exports.dnsCache = exports.networkInterfaces = exports._resetCacheCleanup = exports._lastCacheCleanup = exports.copyOwnKeys = exports.isProtoKey = void 0;
41
+ exports.resolveContent = resolveContent;
42
+ const urllib = __importStar(require("./url.js"));
43
+ const node_util_1 = __importDefault(require("node:util"));
44
+ const node_fs_1 = __importDefault(require("node:fs"));
45
+ const index_js_1 = __importDefault(require("../fetch/index.js"));
46
+ const errors = __importStar(require("../errors.js"));
47
+ const objects_js_1 = require("./objects.js");
48
+ Object.defineProperty(exports, "isProtoKey", { enumerable: true, get: function () { return objects_js_1.isProtoKey; } });
49
+ Object.defineProperty(exports, "copyOwnKeys", { enumerable: true, get: function () { return objects_js_1.copyOwnKeys; } });
50
+ const node_dns_1 = __importDefault(require("node:dns"));
51
+ const node_net_1 = __importDefault(require("node:net"));
52
+ const node_os_1 = __importDefault(require("node:os"));
53
+ const DNS_TTL = 5 * 60 * 1000;
54
+ const CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups
55
+ const MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache
56
+ let lastCacheCleanup = 0;
57
+ /** @internal */
58
+ const _lastCacheCleanup = () => lastCacheCleanup;
59
+ exports._lastCacheCleanup = _lastCacheCleanup;
60
+ /** @internal */
61
+ const _resetCacheCleanup = () => {
62
+ lastCacheCleanup = 0;
63
+ };
64
+ exports._resetCacheCleanup = _resetCacheCleanup;
65
+ try {
66
+ exports.networkInterfaces = node_os_1.default.networkInterfaces();
67
+ }
68
+ catch (_err) {
69
+ // fails on some systems
70
+ }
71
+ const isFamilySupported = (family, allowInternal) => {
72
+ const addresses = Object.values(exports.networkInterfaces || {}).flat();
73
+ if (!addresses.length) {
74
+ // hope for the best. Runtimes without an interface table (Cloudflare
75
+ // Workers) report an empty object rather than throwing
76
+ return true;
77
+ }
78
+ return addresses.filter(i => !i.internal || allowInternal).some(i => i.family === 'IPv' + family || i.family === family);
79
+ };
80
+ const resolve = (family, hostname, options, callback) => {
81
+ options = options || {};
82
+ if (!isFamilySupported(family, options.allowInternalNetworkInterfaces)) {
83
+ return callback(null, []);
84
+ }
85
+ const dnsResolver = node_dns_1.default.Resolver ? new node_dns_1.default.Resolver(options) : node_dns_1.default;
86
+ dnsResolver['resolve' + family](hostname, (err, addresses) => {
87
+ if (err) {
88
+ switch (err.code) {
89
+ case node_dns_1.default.NODATA:
90
+ case node_dns_1.default.NOTFOUND:
91
+ case node_dns_1.default.NOTIMP:
92
+ case node_dns_1.default.SERVFAIL:
93
+ case node_dns_1.default.CONNREFUSED:
94
+ case node_dns_1.default.REFUSED:
95
+ case 'EAI_AGAIN':
96
+ return callback(null, []);
97
+ }
98
+ return callback(err);
99
+ }
100
+ return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));
101
+ });
102
+ };
103
+ exports.dnsCache = new Map();
104
+ const formatDNSValue = (value, extra) => {
105
+ if (!value) {
106
+ return Object.assign({}, extra || {});
107
+ }
108
+ const addresses = value.addresses || [];
109
+ // Select a random address from available addresses, or null if none
110
+ const host = addresses.length > 0 ? addresses[Math.floor(Math.random() * addresses.length)] : null;
111
+ return Object.assign({
112
+ host,
113
+ // Include all addresses for connection fallback support
114
+ _addresses: addresses
115
+ }, extra || {});
116
+ };
117
+ const resolveHostname = (options, callback) => {
118
+ options = options || {};
119
+ if (!options.host && options.servername) {
120
+ options.host = options.servername;
121
+ }
122
+ if (!options.host || node_net_1.default.isIP(options.host)) {
123
+ // nothing to do here
124
+ const value = {
125
+ addresses: [options.host]
126
+ };
127
+ return callback(null, formatDNSValue(value, {
128
+ servername: options.servername || false,
129
+ cached: false
130
+ }));
131
+ }
132
+ const host = options.host;
133
+ // The TLS server name belongs to the connection asking, not to the host it resolves. The
134
+ // cache is shared by every transport of the process and keyed by host alone, so a server
135
+ // name stored in it would be the one of whichever transport resolved the host first, and a
136
+ // later transport with its own tls.servername would present and verify that name instead
137
+ const servername = options.servername || host;
138
+ let cached;
139
+ if (exports.dnsCache.has(options.host)) {
140
+ cached = exports.dnsCache.get(options.host);
141
+ // Lazy cleanup with time throttling
142
+ const now = Date.now();
143
+ if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {
144
+ lastCacheCleanup = now;
145
+ // Clean up expired entries
146
+ for (const [host, entry] of exports.dnsCache.entries()) {
147
+ if (entry.expires && entry.expires < now) {
148
+ exports.dnsCache.delete(host);
149
+ }
150
+ }
151
+ // If cache is still too large, remove oldest entries
152
+ if (exports.dnsCache.size > MAX_CACHE_SIZE) {
153
+ const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries
154
+ const keys = Array.from(exports.dnsCache.keys()).slice(0, toDelete);
155
+ keys.forEach(key => exports.dnsCache.delete(key));
156
+ }
157
+ }
158
+ if (!cached.expires || cached.expires >= now) {
159
+ return callback(null, formatDNSValue(cached.value, {
160
+ servername,
161
+ cached: true
162
+ }));
163
+ }
164
+ }
165
+ // Resolve both IPv4 and IPv6 addresses for fallback support
166
+ let ipv4Addresses = [];
167
+ let ipv6Addresses = [];
168
+ let ipv4Error = null;
169
+ let ipv6Error = null;
170
+ resolve(4, options.host, options, (err, addresses) => {
171
+ if (err) {
172
+ ipv4Error = err;
173
+ }
174
+ else {
175
+ ipv4Addresses = addresses || [];
176
+ }
177
+ resolve(6, host, options, (err, addresses) => {
178
+ if (err) {
179
+ ipv6Error = err;
180
+ }
181
+ else {
182
+ ipv6Addresses = addresses || [];
183
+ }
184
+ // Combine addresses: IPv4 first, then IPv6
185
+ const allAddresses = ipv4Addresses.concat(ipv6Addresses);
186
+ if (allAddresses.length) {
187
+ const value = {
188
+ addresses: allAddresses
189
+ };
190
+ exports.dnsCache.set(host, {
191
+ value,
192
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
193
+ });
194
+ return callback(null, formatDNSValue(value, {
195
+ servername,
196
+ cached: false
197
+ }));
198
+ }
199
+ // No addresses from resolve4/resolve6, try dns.lookup as fallback
200
+ if (ipv4Error && ipv6Error) {
201
+ // Both resolvers had errors
202
+ if (cached) {
203
+ exports.dnsCache.set(host, {
204
+ value: cached.value,
205
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
206
+ });
207
+ return callback(null, formatDNSValue(cached.value, {
208
+ servername,
209
+ cached: true,
210
+ error: ipv4Error
211
+ }));
212
+ }
213
+ }
214
+ try {
215
+ node_dns_1.default.lookup(host, { all: true }, (err, addresses) => {
216
+ if (err) {
217
+ if (cached) {
218
+ exports.dnsCache.set(host, {
219
+ value: cached.value,
220
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
221
+ });
222
+ return callback(null, formatDNSValue(cached.value, {
223
+ servername,
224
+ cached: true,
225
+ error: err
226
+ }));
227
+ }
228
+ return callback(err);
229
+ }
230
+ // Get all supported addresses from dns.lookup
231
+ const supportedAddresses = addresses
232
+ ? addresses.filter(addr => isFamilySupported(addr.family)).map(addr => addr.address)
233
+ : [];
234
+ if (addresses && addresses.length && !supportedAddresses.length) {
235
+ // there are addresses but none can be used
236
+ console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);
237
+ }
238
+ if (!supportedAddresses.length && cached) {
239
+ // nothing was found, fallback to cached value
240
+ return callback(null, formatDNSValue(cached.value, {
241
+ servername,
242
+ cached: true
243
+ }));
244
+ }
245
+ const value = {
246
+ addresses: supportedAddresses.length ? supportedAddresses : [host]
247
+ };
248
+ exports.dnsCache.set(host, {
249
+ value,
250
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
251
+ });
252
+ return callback(null, formatDNSValue(value, {
253
+ servername,
254
+ cached: false
255
+ }));
256
+ });
257
+ }
258
+ catch (lookupErr) {
259
+ if (cached) {
260
+ exports.dnsCache.set(host, {
261
+ value: cached.value,
262
+ expires: Date.now() + (options.dnsTtl || DNS_TTL)
263
+ });
264
+ return callback(null, formatDNSValue(cached.value, {
265
+ servername,
266
+ cached: true,
267
+ error: lookupErr
268
+ }));
269
+ }
270
+ return callback(ipv4Error || ipv6Error || lookupErr);
271
+ }
272
+ });
273
+ });
274
+ };
275
+ exports.resolveHostname = resolveHostname;
276
+ /**
277
+ * Parses connection url to a structured configuration object
278
+ *
279
+ * @param str Connection url
280
+ * @return Configuration object
281
+ */
282
+ const parseConnectionUrl = (str) => {
283
+ str = str || '';
284
+ const options = {};
285
+ const url = urllib.parse(str, true);
286
+ switch (url.protocol) {
287
+ case 'smtp:':
288
+ options.secure = false;
289
+ break;
290
+ case 'smtps:':
291
+ options.secure = true;
292
+ break;
293
+ case 'direct:':
294
+ options.direct = true;
295
+ break;
296
+ }
297
+ if (!isNaN(url.port) && Number(url.port)) {
298
+ options.port = Number(url.port);
299
+ }
300
+ if (url.hostname) {
301
+ options.host = url.hostname;
302
+ }
303
+ if (url.username || url.password) {
304
+ options.auth = {
305
+ user: url.username || '',
306
+ pass: url.password || ''
307
+ };
308
+ }
309
+ Object.keys(url.query || {}).forEach(key => {
310
+ let obj = options;
311
+ let lKey = key;
312
+ let value = url.query[key];
313
+ if (!isNaN(value)) {
314
+ value = Number(value);
315
+ }
316
+ switch (value) {
317
+ case 'true':
318
+ value = true;
319
+ break;
320
+ case 'false':
321
+ value = false;
322
+ break;
323
+ }
324
+ // tls is nested object
325
+ if (key.indexOf('tls.') === 0) {
326
+ lKey = key.substr(4);
327
+ if (!options.tls) {
328
+ options.tls = {};
329
+ }
330
+ obj = options.tls;
331
+ }
332
+ else if (key.indexOf('.') >= 0) {
333
+ // ignore nested properties besides tls
334
+ return;
335
+ }
336
+ // `in` already keeps "__proto__" out, but only as a side effect of it being an
337
+ // Object.prototype member. Say it, so the protection survives a change to the check
338
+ if (!(0, objects_js_1.isProtoKey)(lKey) && !(lKey in obj)) {
339
+ obj[lKey] = value;
340
+ }
341
+ });
342
+ return options;
343
+ };
344
+ exports.parseConnectionUrl = parseConnectionUrl;
345
+ /** @internal */
346
+ const _logFunc = (logger, level, defaults, data, message, ...args) => {
347
+ const entry = Object.assign({}, defaults || {}, data || {});
348
+ delete entry.level;
349
+ let logLevel = level;
350
+ if (typeof logger[logLevel] !== 'function') {
351
+ // Provided logger does not implement this level. Fall back to a
352
+ // lower-severity handler instead of throwing.
353
+ logLevel = ['info', 'debug', 'log', 'trace', 'warn', 'error'].find(name => typeof logger[name] === 'function');
354
+ }
355
+ if (logLevel) {
356
+ logger[logLevel](entry, message, ...args);
357
+ }
358
+ };
359
+ exports._logFunc = _logFunc;
360
+ /**
361
+ * Returns a bunyan-compatible logger interface. Uses either provided logger or
362
+ * creates a default console logger
363
+ *
364
+ * @param [options] Options object that might include 'logger' value
365
+ * @param [defaults] Fields merged into every log entry, overridden by the fields of the entry itself
366
+ * @return bunyan compatible logger
367
+ */
368
+ const getLogger = (options, defaults) => {
369
+ options = options || {};
370
+ const response = {};
371
+ const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
372
+ if (!options.logger) {
373
+ // use vanity logger
374
+ levels.forEach(level => {
375
+ response[level] = () => false;
376
+ });
377
+ return response;
378
+ }
379
+ const logger = options.logger === true ? createDefaultLogger(levels) : options.logger;
380
+ levels.forEach(level => {
381
+ response[level] = (...args) => {
382
+ // the bunyan forms: a data object first, or the message alone
383
+ const data = typeof args[0] === 'string' ? undefined : args.shift();
384
+ (0, exports._logFunc)(logger, level, defaults, data, ...args);
385
+ };
386
+ });
387
+ return response;
388
+ };
389
+ exports.getLogger = getLogger;
390
+ /**
391
+ * Wrapper for creating a callback that either resolves or rejects a promise
392
+ * based on input
393
+ *
394
+ * @param resolve Function to run if callback is called
395
+ * @param reject Function to run if callback ends with an error
396
+ */
397
+ const callbackPromise = (resolve, reject) => function (...args) {
398
+ const err = args.shift();
399
+ if (err) {
400
+ reject(err);
401
+ }
402
+ else {
403
+ resolve(...args);
404
+ }
405
+ };
406
+ exports.callbackPromise = callbackPromise;
407
+ const parseDataURI = (uri) => {
408
+ if (typeof uri !== 'string') {
409
+ return null;
410
+ }
411
+ // Early return for non-data URIs to avoid unnecessary processing
412
+ if (!uri.startsWith('data:')) {
413
+ return null;
414
+ }
415
+ // Find the first comma safely - this prevents ReDoS
416
+ const commaPos = uri.indexOf(',');
417
+ if (commaPos === -1) {
418
+ return null;
419
+ }
420
+ const data = uri.substring(commaPos + 1);
421
+ const metaStr = uri.substring('data:'.length, commaPos);
422
+ let encoding;
423
+ const metaEntries = metaStr.split(';');
424
+ if (metaEntries.length > 0) {
425
+ const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();
426
+ // Only recognize valid encoding types to prevent manipulation
427
+ if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {
428
+ encoding = lastEntry;
429
+ metaEntries.pop();
430
+ }
431
+ }
432
+ const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';
433
+ const params = {};
434
+ for (let i = 0; i < metaEntries.length; i++) {
435
+ const entry = metaEntries[i];
436
+ const sepPos = entry.indexOf('=');
437
+ if (sepPos > 0) {
438
+ // Ensure there's a key before the '='
439
+ const key = entry.substring(0, sepPos).trim();
440
+ const value = entry.substring(sepPos + 1).trim();
441
+ if (key && !(0, objects_js_1.isProtoKey)(key)) {
442
+ params[key] = value;
443
+ }
444
+ }
445
+ }
446
+ // Decode data based on encoding with proper error handling
447
+ let bufferData;
448
+ try {
449
+ if (encoding === 'base64') {
450
+ bufferData = Buffer.from(data, 'base64');
451
+ }
452
+ else {
453
+ try {
454
+ bufferData = Buffer.from(decodeURIComponent(data));
455
+ }
456
+ catch (_decodeError) {
457
+ bufferData = Buffer.from(data);
458
+ }
459
+ }
460
+ }
461
+ catch (_bufferError) {
462
+ bufferData = Buffer.alloc(0);
463
+ }
464
+ return {
465
+ data: bufferData,
466
+ encoding: encoding || null,
467
+ contentType: contentType || 'application/octet-stream',
468
+ params
469
+ };
470
+ };
471
+ exports.parseDataURI = parseDataURI;
472
+ function resolveContent(data, key, options, callback) {
473
+ // options is optional; support the legacy resolveContent(data, key, callback) signature
474
+ if (!callback && typeof options === 'function') {
475
+ callback = options;
476
+ options = false;
477
+ }
478
+ options = options || {};
479
+ let promise;
480
+ if (!callback) {
481
+ promise = new Promise((resolve, reject) => {
482
+ callback = (0, exports.callbackPromise)(resolve, reject);
483
+ });
484
+ }
485
+ resolveContentValue(data, key, options, callback);
486
+ return promise;
487
+ }
488
+ function resolveContentValue(data, key, options, callback) {
489
+ let content = (data && data[key] && data[key].content) || data[key];
490
+ const encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')
491
+ .toString()
492
+ .toLowerCase()
493
+ .replace(/[-_\s]/g, '');
494
+ if (!content) {
495
+ return callback(null, content);
496
+ }
497
+ if (typeof content === 'object') {
498
+ if (typeof content.pipe === 'function') {
499
+ return resolveStream(content, (err, value) => {
500
+ if (err) {
501
+ return callback(err);
502
+ }
503
+ // we can't stream twice the same content, so we need
504
+ // to replace the stream object with the streaming result
505
+ if (data[key].content) {
506
+ data[key].content = value;
507
+ }
508
+ else {
509
+ data[key] = value;
510
+ }
511
+ callback(null, value);
512
+ });
513
+ }
514
+ else if (/^data:/i.test(content.path || content.href)) {
515
+ const parsedDataUri = (0, exports.parseDataURI)(content.path || content.href);
516
+ return callback(null, parsedDataUri && parsedDataUri.data ? parsedDataUri.data : Buffer.alloc(0));
517
+ }
518
+ else if (content.href || /^https?:\/\//i.test(content.path)) {
519
+ // An href is always a URL, and so is a path that looks like one. Let nmfetch
520
+ // decide whether it is fetchable, it validates the parsed URL. Testing the raw
521
+ // string here instead would let a file: href fall through to the "return as is"
522
+ // default below and travel on inside the resolved message.
523
+ const url = content.href || content.path;
524
+ if (options.disableUrlAccess) {
525
+ setImmediate(() => {
526
+ const err = new Error('Url access rejected for ' + url);
527
+ err.code = errors.EURLACCESS;
528
+ callback(err);
529
+ });
530
+ return;
531
+ }
532
+ return resolveStream((0, index_js_1.default)(url, { headers: content.httpHeaders, tls: content.tls }), callback);
533
+ }
534
+ else if (content.path) {
535
+ if (options.disableFileAccess) {
536
+ setImmediate(() => {
537
+ const err = new Error('File access rejected for ' + content.path);
538
+ err.code = errors.EFILEACCESS;
539
+ callback(err);
540
+ });
541
+ return;
542
+ }
543
+ return resolveStream(node_fs_1.default.createReadStream(content.path), callback);
544
+ }
545
+ }
546
+ if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {
547
+ content = Buffer.from(data[key].content, encoding);
548
+ }
549
+ // default action, return as is
550
+ setImmediate(() => callback(null, content));
551
+ }
552
+ /**
553
+ * Copies properties from source objects to target objects
554
+ */
555
+ const assign = function (...args) {
556
+ const target = args.shift() || {};
557
+ args.forEach(source => {
558
+ Object.keys(source || {}).forEach(key => {
559
+ if ((0, objects_js_1.isProtoKey)(key)) {
560
+ return;
561
+ }
562
+ if (['tls', 'auth'].includes(key) &&
563
+ source[key] &&
564
+ typeof source[key] === 'object') {
565
+ // tls and auth are special keys that need to be enumerated separately
566
+ // other objects are passed as is. Enumerating is a copy of user supplied
567
+ // keys just like the loop above, so it gets the same treatment
568
+ target[key] = (0, objects_js_1.copyOwnKeys)(target[key] || {}, source[key]);
569
+ }
570
+ else {
571
+ target[key] = source[key];
572
+ }
573
+ });
574
+ });
575
+ return target;
576
+ };
577
+ exports.assign = assign;
578
+ const encodeXText = (str) => {
579
+ // ! 0x21
580
+ // + 0x2B
581
+ // = 0x3D
582
+ // ~ 0x7E
583
+ if (!/[^\x21-\x2A\x2C-\x3C\x3E-\x7E]/.test(str)) {
584
+ return str;
585
+ }
586
+ const buf = Buffer.from(str);
587
+ let result = '';
588
+ for (let i = 0, len = buf.length; i < len; i++) {
589
+ const c = buf[i];
590
+ if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {
591
+ result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();
592
+ }
593
+ else {
594
+ result += String.fromCharCode(c);
595
+ }
596
+ }
597
+ return result;
598
+ };
599
+ exports.encodeXText = encodeXText;
600
+ /**
601
+ * Streams a stream value into a Buffer
602
+ *
603
+ * @param stream Readable stream
604
+ * @param callback Callback function with (err, value)
605
+ */
606
+ function resolveStream(stream, callback) {
607
+ let responded = false;
608
+ const chunks = [];
609
+ let chunklen = 0;
610
+ stream.on('error', err => {
611
+ if (responded) {
612
+ return;
613
+ }
614
+ responded = true;
615
+ callback(err);
616
+ });
617
+ stream.on('readable', () => {
618
+ let chunk;
619
+ while ((chunk = stream.read()) !== null) {
620
+ chunks.push(chunk);
621
+ chunklen += chunk.length;
622
+ }
623
+ });
624
+ stream.on('end', () => {
625
+ if (responded) {
626
+ return;
627
+ }
628
+ responded = true;
629
+ let value;
630
+ try {
631
+ value = Buffer.concat(chunks, chunklen);
632
+ }
633
+ catch (E) {
634
+ return callback(E);
635
+ }
636
+ callback(null, value);
637
+ });
638
+ }
639
+ /**
640
+ * Generates a bunyan-like logger that prints to console
641
+ *
642
+ * @returns Bunyan logger instance
643
+ */
644
+ function createDefaultLogger(levels) {
645
+ const levelMaxLen = levels.reduce((max, level) => Math.max(max, level.length), 0);
646
+ const levelNames = new Map();
647
+ levels.forEach(level => {
648
+ let levelName = level.toUpperCase();
649
+ if (levelName.length < levelMaxLen) {
650
+ levelName += ' '.repeat(levelMaxLen - levelName.length);
651
+ }
652
+ levelNames.set(level, levelName);
653
+ });
654
+ const print = (level, entry, message, ...args) => {
655
+ let prefix = '';
656
+ if (entry) {
657
+ if (entry.tnx === 'server') {
658
+ prefix = 'S: ';
659
+ }
660
+ else if (entry.tnx === 'client') {
661
+ prefix = 'C: ';
662
+ }
663
+ if (entry.sid) {
664
+ prefix = '[' + entry.sid + '] ' + prefix;
665
+ }
666
+ if (entry.cid) {
667
+ prefix = '[#' + entry.cid + '] ' + prefix;
668
+ }
669
+ }
670
+ message = node_util_1.default.format(message, ...args);
671
+ message.split(/\r?\n/).forEach((line) => {
672
+ console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);
673
+ });
674
+ };
675
+ const logger = {};
676
+ levels.forEach(level => {
677
+ logger[level] = print.bind(null, level);
678
+ });
679
+ return logger;
680
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Detects a key that can not be copied onto a plain object with `target[key] = value`.
3
+ *
4
+ * "__proto__" is the only one: assigning it runs the inherited setter and replaces the
5
+ * prototype of the target instead of adding a property to it, so a caller can smuggle
6
+ * values past validation that only inspects own keys. JSON.parse produces such a key
7
+ * where an object literal can not. "constructor" and "prototype" have no such setter and
8
+ * become ordinary own properties, so dropping them would only discard legitimate values.
9
+ *
10
+ * @param key Key to check
11
+ * @returns true if the key must not be copied
12
+ */
13
+ export declare const isProtoKey: (key: string) => boolean;
14
+ /**
15
+ * Copies own enumerable keys from a source object to a target object. Every copy that
16
+ * walks the keys of user supplied data goes through here, see isProtoKey.
17
+ *
18
+ * @param target Object to copy the keys to
19
+ * @param source Object to copy the keys from
20
+ * @param [skip] Optional predicate, return true to leave a key out
21
+ * @returns The target object
22
+ */
23
+ export declare const copyOwnKeys: <T extends object>(target: T, source: object | null | undefined, skip?: (key: string) => boolean) => T;