@perseidesjs/notification-nodemailer 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ProviderSendNotificationDTO, ProviderSendNotificationResultsDTO } from "@medusajs/framework/types";
|
|
2
2
|
import { AbstractNotificationProviderService } from "@medusajs/framework/utils";
|
|
3
3
|
import { type Transporter } from "nodemailer";
|
|
4
|
+
import type Mail from "nodemailer/lib/mailer";
|
|
4
5
|
import type SMTPConnection from "nodemailer/lib/smtp-connection";
|
|
5
6
|
import type SMTPTransport from "nodemailer/lib/smtp-transport";
|
|
6
7
|
/**
|
|
@@ -17,6 +18,11 @@ export declare function isBinaryString(content: string): boolean;
|
|
|
17
18
|
* of each byte, e.g., "0100100001101001" represents "Hi".
|
|
18
19
|
*/
|
|
19
20
|
export declare function binaryStringToBuffer(binaryString: string): Buffer;
|
|
21
|
+
/**
|
|
22
|
+
* Checks if a string is valid base64 encoded data.
|
|
23
|
+
* Base64 strings contain only A-Z, a-z, 0-9, +, /, and optional = padding.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isBase64String(content: string): boolean;
|
|
20
26
|
/**
|
|
21
27
|
* Processes attachment content to ensure it's in a format Nodemailer can handle.
|
|
22
28
|
* Supports:
|
|
@@ -25,6 +31,7 @@ export declare function binaryStringToBuffer(binaryString: string): Buffer;
|
|
|
25
31
|
* - Regular string: Passed through as-is (assumed to be base64 or text content)
|
|
26
32
|
*/
|
|
27
33
|
export declare function processAttachmentContent(content: string | Buffer): string | Buffer;
|
|
34
|
+
export declare function extractProviderData(provider_data: Record<string, unknown> | null | undefined): Pick<Mail.Options, "replyTo" | "cc" | "bcc">;
|
|
28
35
|
export type PluginOptions = SMTPConnection.Options & SMTPTransport.MailOptions & {
|
|
29
36
|
from: string;
|
|
30
37
|
};
|
|
@@ -6,7 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.NodemailerNotificationProviderService = void 0;
|
|
7
7
|
exports.isBinaryString = isBinaryString;
|
|
8
8
|
exports.binaryStringToBuffer = binaryStringToBuffer;
|
|
9
|
+
exports.isBase64String = isBase64String;
|
|
9
10
|
exports.processAttachmentContent = processAttachmentContent;
|
|
11
|
+
exports.extractProviderData = extractProviderData;
|
|
10
12
|
const utils_1 = require("@medusajs/framework/utils");
|
|
11
13
|
const nodemailer_1 = __importDefault(require("nodemailer"));
|
|
12
14
|
/**
|
|
@@ -41,6 +43,20 @@ function binaryStringToBuffer(binaryString) {
|
|
|
41
43
|
}
|
|
42
44
|
return Buffer.from(bytes);
|
|
43
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Checks if a string is valid base64 encoded data.
|
|
48
|
+
* Base64 strings contain only A-Z, a-z, 0-9, +, /, and optional = padding.
|
|
49
|
+
*/
|
|
50
|
+
function isBase64String(content) {
|
|
51
|
+
if (content.length < 4)
|
|
52
|
+
return false;
|
|
53
|
+
// Binary strings (only 0s and 1s) are NOT base64
|
|
54
|
+
if (isBinaryString(content))
|
|
55
|
+
return false;
|
|
56
|
+
// Base64 pattern: alphanumeric, +, /, with optional = padding at end
|
|
57
|
+
// Allow strings not divisible by 4 (some encoders omit padding)
|
|
58
|
+
return /^[A-Za-z0-9+/]+=*$/.test(content);
|
|
59
|
+
}
|
|
44
60
|
/**
|
|
45
61
|
* Processes attachment content to ensure it's in a format Nodemailer can handle.
|
|
46
62
|
* Supports:
|
|
@@ -57,6 +73,21 @@ function processAttachmentContent(content) {
|
|
|
57
73
|
}
|
|
58
74
|
return content;
|
|
59
75
|
}
|
|
76
|
+
function extractProviderData(provider_data) {
|
|
77
|
+
if (!provider_data)
|
|
78
|
+
return {};
|
|
79
|
+
const result = {};
|
|
80
|
+
if ((0, utils_1.isDefined)(provider_data.replyTo)) {
|
|
81
|
+
result.replyTo = provider_data.replyTo;
|
|
82
|
+
}
|
|
83
|
+
if ((0, utils_1.isDefined)(provider_data.cc)) {
|
|
84
|
+
result.cc = provider_data.cc;
|
|
85
|
+
}
|
|
86
|
+
if ((0, utils_1.isDefined)(provider_data.bcc)) {
|
|
87
|
+
result.bcc = provider_data.bcc;
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
60
91
|
class NodemailerNotificationProviderService extends utils_1.AbstractNotificationProviderService {
|
|
61
92
|
constructor(_, options) {
|
|
62
93
|
super();
|
|
@@ -72,7 +103,7 @@ class NodemailerNotificationProviderService extends utils_1.AbstractNotification
|
|
|
72
103
|
}
|
|
73
104
|
}
|
|
74
105
|
async send(notification) {
|
|
75
|
-
const { to, content } = notification;
|
|
106
|
+
const { to, content, provider_data } = notification;
|
|
76
107
|
if (!(0, utils_1.isDefined)(this.options_.from) && !(0, utils_1.isDefined)(notification.from)) {
|
|
77
108
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `"from" is required in the ${NodemailerNotificationProviderService.identifier} provider's options.`);
|
|
78
109
|
}
|
|
@@ -84,24 +115,29 @@ class NodemailerNotificationProviderService extends utils_1.AbstractNotification
|
|
|
84
115
|
if ((0, utils_1.isDefined)(notification.attachments) &&
|
|
85
116
|
Array.isArray(notification.attachments) &&
|
|
86
117
|
notification.attachments.length > 0) {
|
|
87
|
-
attachments = notification.attachments.map((attachment) =>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
118
|
+
attachments = notification.attachments.map((attachment) => {
|
|
119
|
+
const processedContent = processAttachmentContent(attachment.content);
|
|
120
|
+
const isBase64Content = typeof processedContent === "string" &&
|
|
121
|
+
isBase64String(processedContent);
|
|
122
|
+
return {
|
|
123
|
+
content: processedContent,
|
|
124
|
+
filename: attachment.filename,
|
|
125
|
+
contentType: attachment.content_type,
|
|
126
|
+
contentDisposition: attachment.disposition === "inline" ||
|
|
127
|
+
attachment.disposition === "attachment"
|
|
128
|
+
? attachment.disposition
|
|
129
|
+
: undefined,
|
|
130
|
+
cid: attachment.id,
|
|
131
|
+
// Tell nodemailer the content is base64-encoded so it decodes first
|
|
132
|
+
encoding: isBase64Content ? "base64" : undefined,
|
|
133
|
+
};
|
|
134
|
+
});
|
|
100
135
|
}
|
|
101
136
|
const mailOptions = {
|
|
102
137
|
from: notification.from ?? this.options_.from,
|
|
103
138
|
to,
|
|
104
139
|
subject: content?.subject,
|
|
140
|
+
...extractProviderData(provider_data),
|
|
105
141
|
};
|
|
106
142
|
if ((0, utils_1.isDefined)(html)) {
|
|
107
143
|
mailOptions.html = html;
|
|
@@ -118,4 +154,4 @@ class NodemailerNotificationProviderService extends utils_1.AbstractNotification
|
|
|
118
154
|
exports.NodemailerNotificationProviderService = NodemailerNotificationProviderService;
|
|
119
155
|
NodemailerNotificationProviderService.identifier = "nodemailer";
|
|
120
156
|
exports.default = NodemailerNotificationProviderService;
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvbm9kZW1haWxlci9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXFCQSx3Q0FXQztBQU9ELG9EQU9DO0FBTUQsd0NBT0M7QUFTRCw0REFVQztBQUVELGtEQWVDO0FBM0ZELHFEQUlrQztBQUNsQyw0REFBeUQ7QUFLekQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE9BQWU7SUFDN0MsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDYixDQUFDO0lBQ0QsOENBQThDO0lBQzlDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUE7SUFDYixDQUFDO0lBQ0Qsa0RBQWtEO0lBQ2xELE9BQU8sT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUE7QUFDM0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxZQUFvQjtJQUN4RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUM1QyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzFCLENB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
|
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ pnpm add @perseidesjs/notification-nodemailer
|
|
|
41
41
|
|
|
42
42
|
## Documentation
|
|
43
43
|
|
|
44
|
-
Access the full documentation at [docs.perseides.org/plugins/notification-nodemailer](https://docs.perseides.org/plugins/notification-nodemailer/getting-started)
|
|
44
|
+
Access the full documentation at [https://docs.perseides.org/docs/plugins/notification-nodemailer/getting-started](https://docs.perseides.org/docs/plugins/notification-nodemailer/getting-started)
|
|
45
45
|
|
|
46
46
|
## License
|
|
47
47
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perseidesjs/notification-nodemailer",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "A Medusa plugin for sending notifications via Nodemailer (SMTP)",
|
|
5
5
|
"author": "adevinwild",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,13 +43,15 @@
|
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@biomejs/biome": "2.3.11",
|
|
45
45
|
"@changesets/cli": "^2.29.5",
|
|
46
|
-
"@medusajs/cli": "2.
|
|
47
|
-
"@medusajs/framework": "2.
|
|
48
|
-
"@medusajs/medusa": "2.
|
|
46
|
+
"@medusajs/cli": "2.14.1",
|
|
47
|
+
"@medusajs/framework": "2.14.1",
|
|
48
|
+
"@medusajs/medusa": "2.14.1",
|
|
49
49
|
"@swc/core": "1.5.7",
|
|
50
50
|
"@types/node": "^20.0.0",
|
|
51
51
|
"@types/nodemailer": "^6.4.17",
|
|
52
|
-
"
|
|
52
|
+
"@types/qrcode": "^1.5.6",
|
|
53
|
+
"nodemailer": "^8.0.5",
|
|
54
|
+
"qrcode": "^1.5.4",
|
|
53
55
|
"ts-node": "^10.9.2",
|
|
54
56
|
"typescript": "^5.6.2",
|
|
55
57
|
"vitest": "^4.0.16",
|
|
@@ -59,7 +61,7 @@
|
|
|
59
61
|
"@medusajs/cli": ">=2.13.0",
|
|
60
62
|
"@medusajs/framework": ">=2.13.0",
|
|
61
63
|
"@medusajs/medusa": ">=2.13.0",
|
|
62
|
-
"nodemailer": "^
|
|
64
|
+
"nodemailer": "^8.0.5"
|
|
63
65
|
},
|
|
64
66
|
"engines": {
|
|
65
67
|
"node": ">=20"
|