@hartl-services/medusa-base 2.2.0 → 2.2.1

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.
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
4
+ const sender_1 = require("../domain/sender");
4
5
  var notification_module_1 = require("./notification-module");
5
6
  Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
6
7
  const defineShopEmailConfiguration = (configuration) => configuration;
@@ -63,11 +64,13 @@ const resolveSmtp = (values, allowInsecure) => {
63
64
  if (port === undefined) {
64
65
  throw new TypeError("SMTP_PORT is required.");
65
66
  }
66
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.SMTP_FROM)) {
67
- throw new TypeError("SMTP_FROM must be a valid email address.");
67
+ // A display name is allowed: "Example GmbH <info@example.com>".
68
+ const sender = (0, sender_1.parseEmailSender)(values.SMTP_FROM);
69
+ if (!sender) {
70
+ throw new TypeError('SMTP_FROM must be an email address, optionally as "Name <address>".');
68
71
  }
69
72
  const smtp = {
70
- from: values.SMTP_FROM,
73
+ from: (0, sender_1.formatEmailSender)(sender),
71
74
  host: values.SMTP_HOST,
72
75
  password: values.SMTP_PASSWORD,
73
76
  port,
@@ -81,4 +84,4 @@ const resolveSmtp = (values, allowInsecure) => {
81
84
  return smtp;
82
85
  };
83
86
  exports.resolveSmtp = resolveSmtp;
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDZEQUEyRTtBQUFsRSx5SUFBQSxrQ0FBa0MsT0FBQTtBQUVwQyxNQUFNLDRCQUE0QixHQUFHLENBRzFDLGFBQTRCLEVBQ2IsRUFBRSxDQUFDLGFBQWEsQ0FBQztBQUpyQixRQUFBLDRCQUE0QixnQ0FJUDtBQU9yQixRQUFBLDBCQUEwQixHQUFHO0lBQ3hDLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLFdBQVc7SUFDWCxlQUFlO0lBQ2YsV0FBVztJQUNYLGtCQUFrQjtDQUNWLENBQUM7QUFFWDs7OztHQUlHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBcUM7SUFDdkUsU0FBUyxFQUFFLDZCQUE2QjtJQUN4QyxTQUFTLEVBQUUsb0JBQW9CO0lBQy9CLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsU0FBUyxFQUFFLE1BQU07SUFDakIsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixTQUFTLEVBQUUsWUFBWTtDQUN4QixDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsTUFBb0QsRUFDcEQsSUFBWSxFQUNRLEVBQUU7SUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ25DLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUNuQixNQUFvRCxFQUNwRCxJQUFZLEVBQ1osT0FBZSxFQUNmLE9BQWUsRUFDSyxFQUFFO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsT0FBTyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksU0FBUyxDQUNqQixHQUFHLElBQUksNEJBQTRCLE9BQU8sWUFBWSxPQUFPLEdBQUcsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUNuQixNQUFvRCxFQUNwRCxJQUFZLEVBQ1osWUFBcUIsRUFDWixFQUFFO0lBQ1gsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNJLE1BQU0sV0FBVyxHQUFHLENBQ3pCLE1BQTZFLEVBQzdFLGFBQXNCLEVBQ0ssRUFBRTtJQUM3QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxTQUFTLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUc7UUFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQ3RCLFFBQVEsRUFBRSxNQUFNLENBQUMsYUFBYTtRQUM5QixJQUFJO1FBQ0osVUFBVSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDO1FBQzNELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDbEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0tBQ3ZCLENBQUM7SUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksU0FBUyxDQUNqQix1RkFBdUYsQ0FDeEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQTNCVyxRQUFBLFdBQVcsZUEyQnRCIn0=
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQU12RSw2REFBMkU7QUFBbEUseUlBQUEsa0NBQWtDLE9BQUE7QUFFcEMsTUFBTSw0QkFBNEIsR0FBRyxDQUcxQyxhQUE0QixFQUNiLEVBQUUsQ0FBQyxhQUFhLENBQUM7QUFKckIsUUFBQSw0QkFBNEIsZ0NBSVA7QUFPckIsUUFBQSwwQkFBMEIsR0FBRztJQUN4QyxXQUFXO0lBQ1gsV0FBVztJQUNYLGFBQWE7SUFDYixXQUFXO0lBQ1gsZUFBZTtJQUNmLFdBQVc7SUFDWCxrQkFBa0I7Q0FDVixDQUFDO0FBRVg7Ozs7R0FJRztBQUNVLFFBQUEsdUJBQXVCLEdBQXFDO0lBQ3ZFLFNBQVMsRUFBRSw2QkFBNkI7SUFDeEMsU0FBUyxFQUFFLG9CQUFvQjtJQUMvQixhQUFhLEVBQUUsZ0JBQWdCO0lBQy9CLFNBQVMsRUFBRSxNQUFNO0lBQ2pCLGdCQUFnQixFQUFFLE9BQU87SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsU0FBUyxFQUFFLFlBQVk7Q0FDeEIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFHLENBQ3BCLE1BQW9ELEVBQ3BELElBQVksRUFDUSxFQUFFO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNuQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FDbkIsTUFBb0QsRUFDcEQsSUFBWSxFQUNaLE9BQWUsRUFDZixPQUFlLEVBQ0ssRUFBRTtJQUN0QixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFDLElBQUks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
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatEmailSender = exports.parseEmailSender = void 0;
4
+ const emailAddressPattern = /^[^\s@<>"]+@[^\s@<>"]+\.[^\s@<>"]+$/;
5
+ const namedSenderPattern = /^(.*?)\s*<([^<>]*)>$/;
6
+ /**
7
+ * Reads a sender as either a bare address (`info@example.com`) or with a
8
+ * display name (`Example GmbH <info@example.com>`, the name optionally in
9
+ * double quotes). Returns undefined when the address is not valid.
10
+ */
11
+ const parseEmailSender = (value) => {
12
+ const trimmed = value.trim();
13
+ const named = namedSenderPattern.exec(trimmed);
14
+ const address = (named ? named[2] : trimmed).trim();
15
+ if (!emailAddressPattern.test(address)) {
16
+ return undefined;
17
+ }
18
+ const name = named?.[1]
19
+ .trim()
20
+ .replace(/^"(.*)"$/, "$1")
21
+ .trim();
22
+ return name ? { address, name } : { address };
23
+ };
24
+ exports.parseEmailSender = parseEmailSender;
25
+ /** Writes the sender for a mail header, quoting the display name. */
26
+ const formatEmailSender = ({ address, name }) => name ? `"${name.replace(/["\\]/g, "\\$&")}" <${address}>` : address;
27
+ exports.formatEmailSender = formatEmailSender;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL2RvbWFpbi9zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztBQUNsRSxNQUFNLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDO0FBRWxEOzs7O0dBSUc7QUFDSSxNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUEyQixFQUFFO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDcEIsSUFBSSxFQUFFO1NBQ04sT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUM7U0FDekIsSUFBSSxFQUFFLENBQUM7SUFDVixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDaEQsQ0FBQyxDQUFDO0FBYlcsUUFBQSxnQkFBZ0Isb0JBYTNCO0FBRUYscUVBQXFFO0FBQzlELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQWUsRUFBVSxFQUFFLENBQzFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRHpELFFBQUEsaUJBQWlCLHFCQUN3QyJ9
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.SmtpNotificationService = exports.SMTP_TIMEOUTS = void 0;
7
7
  const utils_1 = require("@medusajs/framework/utils");
8
8
  const nodemailer_1 = __importDefault(require("nodemailer"));
9
+ const sender_1 = require("../../email/domain/sender");
9
10
  const service_1 = require("../../modules/email/service");
10
11
  const types_1 = require("./types");
11
12
  exports.SMTP_TIMEOUTS = {
@@ -13,7 +14,6 @@ exports.SMTP_TIMEOUTS = {
13
14
  greeting: 10_000,
14
15
  socket: 30_000,
15
16
  };
16
- const emailAddressPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
17
17
  const connectionFailureCodes = new Set(["ECONNREFUSED", "EDNS"]);
18
18
  const invalidOptions = () => {
19
19
  throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid SMTP notification provider options.");
@@ -111,7 +111,7 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
111
111
  }
112
112
  const configuration = smtp;
113
113
  if (!isNonEmptyString(configuration.from) ||
114
- !emailAddressPattern.test(configuration.from) ||
114
+ !(0, sender_1.parseEmailSender)(configuration.from) ||
115
115
  !isNonEmptyString(configuration.host) ||
116
116
  !isNonEmptyString(configuration.password) ||
117
117
  !Number.isInteger(configuration.port) ||
@@ -145,7 +145,7 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
145
145
  filename: attachment.filename,
146
146
  };
147
147
  });
148
- const from = notification.from && emailAddressPattern.test(notification.from)
148
+ const from = notification.from && (0, sender_1.parseEmailSender)(notification.from)
149
149
  ? notification.from
150
150
  : this.options_.smtp.from;
151
151
  const identity = deliveryIdentity(notification);
@@ -233,4 +233,4 @@ class SmtpNotificationService extends utils_1.AbstractNotificationProviderServic
233
233
  }
234
234
  exports.SmtpNotificationService = SmtpNotificationService;
235
235
  SmtpNotificationService.identifier = "smtp";
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc210cC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHFEQUltQztBQUNuQyw0REFBb0M7QUFFcEMseURBQXFFO0FBQ3JFLG1DQU1pQjtBQWtDSixRQUFBLGFBQWEsR0FBRztJQUMzQixVQUFVLEVBQUUsTUFBTTtJQUNsQixRQUFRLEVBQUUsTUFBTTtJQUNoQixNQUFNLEVBQUUsTUFBTTtDQUNOLENBQUM7QUFFWCxNQUFNLG1CQUFtQixHQUFHLDRCQUE0QixDQUFDO0FBQ3pELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUVqRSxNQUFNLGNBQWMsR0FBRyxHQUFVLEVBQUU7SUFDakMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNkNBQTZDLENBQzlDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYyxFQUFtQixFQUFFLENBQzNELE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFFckQsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixZQUEyRCxFQUNsQyxFQUFFO0lBQzNCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFlBQVksSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLENBQUM7SUFDMUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFJLFlBQWlDLENBQUMsRUFBRSxDQUFDO0lBQzdELElBQ0UsQ0FBQyxZ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
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvc210cC9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHFEQUltQztBQUNuQyw0REFBb0M7QUFFcEMsc0RBQTZEO0FBQzdELHlEQUFxRTtBQUNyRSxtQ0FNaUI7QUFrQ0osUUFBQSxhQUFhLEdBQUc7SUFDM0IsVUFBVSxFQUFFLE1BQU07SUFDbEIsUUFBUSxFQUFFLE1BQU07SUFDaEIsTUFBTSxFQUFFLE1BQU07Q0FDTixDQUFDO0FBRVgsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sY0FBYyxHQUFHLEdBQVUsRUFBRTtJQUNqQyxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw2Q0FBNkMsQ0FDOUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFjLEVBQW1CLEVBQUUsQ0FDM0QsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUVyRCxNQUFNLGdCQUFnQixHQUFHLENBQ3ZCLFlBQTJELEVBQ2xDLEVBQUU7SUFDM0IsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsWUFBWSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQztJQUMxRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUksWUFBaUMsQ0FBQyxFQUFFLENBQUM7SUFDN0QsSUFDRSxDQUFDLFlBQVk7UUFDYixDQUFDLGdCQUFnQixD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
package/README.md CHANGED
@@ -1378,7 +1378,9 @@ deployment variables:
1378
1378
  build); otherwise `SMTP_SECURE` or `SMTP_REQUIRE_TLS` must be `true`.
1379
1379
 
1380
1380
  Runtime requires `SMTP_HOST`, `SMTP_PORT`, `SMTP_SECURE`, `SMTP_REQUIRE_TLS`,
1381
- `SMTP_USER`, `SMTP_PASSWORD`, and `SMTP_FROM`. `SMTP_SECURE=true` selects
1381
+ `SMTP_USER`, `SMTP_PASSWORD`, and `SMTP_FROM`. `SMTP_FROM` is a bare address
1382
+ or carries the sender's display name: `Example GmbH <info@example.com>` (quote
1383
+ the value in a `.env` file). `SMTP_SECURE=true` selects
1382
1384
  implicit TLS; `SMTP_REQUIRE_TLS=true` requires STARTTLS. Outside development
1383
1385
  and test, at least one must be true. Certificate verification is never
1384
1386
  disabled. Development and test may set both to `false` for an isolated local
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
4
+ const sender_1 = require("../domain/sender");
4
5
  var notification_module_1 = require("./notification-module");
5
6
  Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
6
7
  const defineShopEmailConfiguration = (configuration) => configuration;
@@ -63,11 +64,13 @@ const resolveSmtp = (values, allowInsecure) => {
63
64
  if (port === undefined) {
64
65
  throw new TypeError("SMTP_PORT is required.");
65
66
  }
66
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.SMTP_FROM)) {
67
- throw new TypeError("SMTP_FROM must be a valid email address.");
67
+ // A display name is allowed: "Example GmbH <info@example.com>".
68
+ const sender = (0, sender_1.parseEmailSender)(values.SMTP_FROM);
69
+ if (!sender) {
70
+ throw new TypeError('SMTP_FROM must be an email address, optionally as "Name <address>".');
68
71
  }
69
72
  const smtp = {
70
- from: values.SMTP_FROM,
73
+ from: (0, sender_1.formatEmailSender)(sender),
71
74
  host: values.SMTP_HOST,
72
75
  password: values.SMTP_PASSWORD,
73
76
  port,
@@ -0,0 +1,12 @@
1
+ export type EmailSender = {
2
+ address: string;
3
+ name?: string;
4
+ };
5
+ /**
6
+ * Reads a sender as either a bare address (`info@example.com`) or with a
7
+ * display name (`Example GmbH <info@example.com>`, the name optionally in
8
+ * double quotes). Returns undefined when the address is not valid.
9
+ */
10
+ export declare const parseEmailSender: (value: string) => EmailSender | undefined;
11
+ /** Writes the sender for a mail header, quoting the display name. */
12
+ export declare const formatEmailSender: ({ address, name }: EmailSender) => string;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatEmailSender = exports.parseEmailSender = void 0;
4
+ const emailAddressPattern = /^[^\s@<>"]+@[^\s@<>"]+\.[^\s@<>"]+$/;
5
+ const namedSenderPattern = /^(.*?)\s*<([^<>]*)>$/;
6
+ /**
7
+ * Reads a sender as either a bare address (`info@example.com`) or with a
8
+ * display name (`Example GmbH <info@example.com>`, the name optionally in
9
+ * double quotes). Returns undefined when the address is not valid.
10
+ */
11
+ const parseEmailSender = (value) => {
12
+ const trimmed = value.trim();
13
+ const named = namedSenderPattern.exec(trimmed);
14
+ const address = (named ? named[2] : trimmed).trim();
15
+ if (!emailAddressPattern.test(address)) {
16
+ return undefined;
17
+ }
18
+ const name = named?.[1]
19
+ .trim()
20
+ .replace(/^"(.*)"$/, "$1")
21
+ .trim();
22
+ return name ? { address, name } : { address };
23
+ };
24
+ exports.parseEmailSender = parseEmailSender;
25
+ /** Writes the sender for a mail header, quoting the display name. */
26
+ const formatEmailSender = ({ address, name }) => name ? `"${name.replace(/["\\]/g, "\\$&")}" <${address}>` : address;
27
+ exports.formatEmailSender = formatEmailSender;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hartl-services/medusa-base",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "Base plugin for Hartl Services Medusa shops: per-plugin feature toggles with a generic Admin settings page, a Store endpoint for storefronts, enforcement helpers, the complete-cart hook composition, the root redirect, cart-promotion link repair, the built-in E-Mail, Documents and S3 file storage modules, config helpers with the turnkey food-shop preset, and the Sentry logger wrapper and instrumentation.",
5
5
  "license": "MIT",
6
6
  "files": [