@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.
- package/.medusa/server/src/email/config/index.js +7 -4
- package/.medusa/server/src/email/domain/sender.js +28 -0
- package/.medusa/server/src/providers/smtp/service.js +4 -4
- package/README.md +3 -1
- package/dist/email/config/index.js +6 -3
- package/dist/email/domain/sender.d.ts +12 -0
- package/dist/email/domain/sender.js +27 -0
- package/package.json +1 -1
|
@@ -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
|
-
|
|
67
|
-
|
|
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:
|
|
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,
|
|
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
|
-
!
|
|
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 &&
|
|
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,
|
|
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`. `
|
|
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
|
-
|
|
67
|
-
|
|
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:
|
|
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.
|
|
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": [
|