velocious 1.0.183 → 1.0.185
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/README.md +87 -0
- package/build/src/background-jobs/job-registry.d.ts +9 -0
- package/build/src/background-jobs/job-registry.d.ts.map +1 -1
- package/build/src/background-jobs/job-registry.js +30 -12
- package/build/src/configuration-types.d.ts +18 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +6 -1
- package/build/src/configuration.d.ts +11 -1
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +16 -2
- package/build/src/database/drivers/base.d.ts +2 -3
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +5 -4
- package/build/src/database/drivers/sqlite/base.d.ts +0 -7
- package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.d.ts.map +1 -1
- package/build/src/database/drivers/sqlite/index.js +22 -7
- package/build/src/database/query/insert-base.d.ts +5 -0
- package/build/src/database/query/insert-base.d.ts.map +1 -1
- package/build/src/database/query/insert-base.js +11 -2
- package/build/src/database/record/index.d.ts +66 -2
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +155 -4
- package/build/src/jobs/mail-delivery.d.ts +12 -0
- package/build/src/jobs/mail-delivery.d.ts.map +1 -0
- package/build/src/jobs/mail-delivery.js +19 -0
- package/build/src/mailer/backends/smtp.d.ts +25 -0
- package/build/src/mailer/backends/smtp.d.ts.map +1 -0
- package/build/src/mailer/backends/smtp.js +99 -0
- package/build/src/mailer/base.d.ts +105 -0
- package/build/src/mailer/base.d.ts.map +1 -0
- package/build/src/mailer/base.js +223 -0
- package/build/src/mailer/delivery.d.ts +35 -0
- package/build/src/mailer/delivery.d.ts.map +1 -0
- package/build/src/mailer/delivery.js +48 -0
- package/build/src/mailer/index.d.ts +17 -0
- package/build/src/mailer/index.d.ts.map +1 -0
- package/build/src/mailer/index.js +23 -0
- package/build/src/mailer.d.ts +16 -0
- package/build/src/mailer.d.ts.map +1 -0
- package/build/src/mailer.js +6 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +3 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background job for delivering mailer payloads.
|
|
3
|
+
*/
|
|
4
|
+
export default class MailDeliveryJob extends VelociousJob {
|
|
5
|
+
/**
|
|
6
|
+
* @param {import("../mailer.js").MailerDeliveryPayload} [payload] - Mail delivery payload.
|
|
7
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
8
|
+
*/
|
|
9
|
+
perform(payload?: import("../mailer.js").MailerDeliveryPayload): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
import VelociousJob from "../background-jobs/job.js";
|
|
12
|
+
//# sourceMappingURL=mail-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-delivery.d.ts","sourceRoot":"","sources":["../../../src/jobs/mail-delivery.js"],"names":[],"mappings":"AAKA;;GAEG;AACH;IACE;;;OAGG;IACH,kBAHW,OAAO,cAAc,EAAE,qBAAqB,GAC1C,OAAO,CAAC,IAAI,CAAC,CAQzB;CACF;yBAlBwB,2BAA2B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import VelociousJob from "../background-jobs/job.js";
|
|
3
|
+
import velociousMailer from "../mailer.js";
|
|
4
|
+
/**
|
|
5
|
+
* Background job for delivering mailer payloads.
|
|
6
|
+
*/
|
|
7
|
+
export default class MailDeliveryJob extends VelociousJob {
|
|
8
|
+
/**
|
|
9
|
+
* @param {import("../mailer.js").MailerDeliveryPayload} [payload] - Mail delivery payload.
|
|
10
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
11
|
+
*/
|
|
12
|
+
async perform(payload) {
|
|
13
|
+
if (!payload) {
|
|
14
|
+
throw new Error(`Missing mail delivery payload. Got: ${String(payload)}`);
|
|
15
|
+
}
|
|
16
|
+
await velociousMailer.deliverPayload(payload);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbC1kZWxpdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9qb2JzL21haWwtZGVsaXZlcnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sWUFBWSxNQUFNLDJCQUEyQixDQUFBO0FBQ3BELE9BQU8sZUFBZSxNQUFNLGNBQWMsQ0FBQTtBQUUxQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxZQUFZO0lBQ3ZEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTztRQUNuQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzNFLENBQUM7UUFFRCxNQUFNLGVBQWUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBWZWxvY2lvdXNKb2IgZnJvbSBcIi4uL2JhY2tncm91bmQtam9icy9qb2IuanNcIlxuaW1wb3J0IHZlbG9jaW91c01haWxlciBmcm9tIFwiLi4vbWFpbGVyLmpzXCJcblxuLyoqXG4gKiBCYWNrZ3JvdW5kIGpvYiBmb3IgZGVsaXZlcmluZyBtYWlsZXIgcGF5bG9hZHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haWxEZWxpdmVyeUpvYiBleHRlbmRzIFZlbG9jaW91c0pvYiB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL21haWxlci5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IFtwYXlsb2FkXSAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIHBlcmZvcm0ocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwgZGVsaXZlcnkgcGF5bG9hZC4gR290OiAke1N0cmluZyhwYXlsb2FkKX1gKVxuICAgIH1cblxuICAgIGF3YWl0IHZlbG9jaW91c01haWxlci5kZWxpdmVyUGF5bG9hZChwYXlsb2FkKVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMTP mailer backend using smtp-connection.
|
|
3
|
+
*/
|
|
4
|
+
export default class SmtpMailerBackend {
|
|
5
|
+
/**
|
|
6
|
+
* @param {object} args - Constructor args.
|
|
7
|
+
* @param {object} args.connectionOptions - smtp-connection options.
|
|
8
|
+
* @param {string} [args.defaultFrom] - Default from address.
|
|
9
|
+
*/
|
|
10
|
+
constructor({ connectionOptions, defaultFrom, ...restArgs }: {
|
|
11
|
+
connectionOptions: object;
|
|
12
|
+
defaultFrom?: string;
|
|
13
|
+
});
|
|
14
|
+
connectionOptions: any;
|
|
15
|
+
defaultFrom: string;
|
|
16
|
+
/**
|
|
17
|
+
* @param {object} args - Delivery args.
|
|
18
|
+
* @param {import("../index.js").MailerDeliveryPayload} args.payload - Mail delivery payload.
|
|
19
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
20
|
+
*/
|
|
21
|
+
deliver({ payload, ...restArgs }: {
|
|
22
|
+
payload: import("../index.js").MailerDeliveryPayload;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=smtp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smtp.d.ts","sourceRoot":"","sources":["../../../../src/mailer/backends/smtp.js"],"names":[],"mappings":"AAyBA;;GAEG;AACH;IACE;;;;OAIG;IACH,6DAHG;QAAqB,iBAAiB,EAA9B,MAAM;QACQ,WAAW,GAAzB,MAAM;KAChB,EAUA;IAFC,uBAA0C;IAC1C,oBAA8B;IAGhC;;;;OAIG;IACH,kCAHG;QAA0D,OAAO,EAAzD,OAAO,aAAa,EAAE,qBAAqB;KACnD,GAAU,OAAO,CAAC,IAAI,CAAC,CA8DzB;CACF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import restArgsError from "../../utils/rest-args-error.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param {any} value - Recipient input.
|
|
5
|
+
* @returns {string[]} - Normalized recipients.
|
|
6
|
+
*/
|
|
7
|
+
function normalizeRecipients(value) {
|
|
8
|
+
if (!value)
|
|
9
|
+
return [];
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.filter((entry) => entry);
|
|
12
|
+
return [value].filter((entry) => entry);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* @param {string} name - Header name.
|
|
16
|
+
* @param {string | undefined} value - Header value.
|
|
17
|
+
* @returns {string | null} - Header line.
|
|
18
|
+
*/
|
|
19
|
+
function headerLine(name, value) {
|
|
20
|
+
if (!value)
|
|
21
|
+
return null;
|
|
22
|
+
return `${name}: ${value}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* SMTP mailer backend using smtp-connection.
|
|
26
|
+
*/
|
|
27
|
+
export default class SmtpMailerBackend {
|
|
28
|
+
/**
|
|
29
|
+
* @param {object} args - Constructor args.
|
|
30
|
+
* @param {object} args.connectionOptions - smtp-connection options.
|
|
31
|
+
* @param {string} [args.defaultFrom] - Default from address.
|
|
32
|
+
*/
|
|
33
|
+
constructor({ connectionOptions, defaultFrom, ...restArgs }) {
|
|
34
|
+
restArgsError(restArgs);
|
|
35
|
+
if (!connectionOptions) {
|
|
36
|
+
throw new Error(`Missing smtp connection options. Got: ${String(connectionOptions)}`);
|
|
37
|
+
}
|
|
38
|
+
this.connectionOptions = connectionOptions;
|
|
39
|
+
this.defaultFrom = defaultFrom;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @param {object} args - Delivery args.
|
|
43
|
+
* @param {import("../index.js").MailerDeliveryPayload} args.payload - Mail delivery payload.
|
|
44
|
+
* @returns {Promise<void>} - Resolves when complete.
|
|
45
|
+
*/
|
|
46
|
+
async deliver({ payload, ...restArgs }) {
|
|
47
|
+
restArgsError(restArgs);
|
|
48
|
+
const from = payload.from || this.defaultFrom;
|
|
49
|
+
if (!from) {
|
|
50
|
+
throw new Error(`Missing mail "from" address. Got: ${String(from)}`);
|
|
51
|
+
}
|
|
52
|
+
const toList = normalizeRecipients(payload.to);
|
|
53
|
+
const ccList = normalizeRecipients(payload.cc);
|
|
54
|
+
const bccList = normalizeRecipients(payload.bcc);
|
|
55
|
+
const recipients = [...toList, ...ccList, ...bccList];
|
|
56
|
+
if (recipients.length === 0) {
|
|
57
|
+
throw new Error(`Missing mail recipients. Got: ${JSON.stringify({ to: payload.to, cc: payload.cc, bcc: payload.bcc })}`);
|
|
58
|
+
}
|
|
59
|
+
const headers = [
|
|
60
|
+
headerLine("From", from),
|
|
61
|
+
headerLine("To", toList.length > 0 ? toList.join(", ") : undefined),
|
|
62
|
+
headerLine("Cc", ccList.length > 0 ? ccList.join(", ") : undefined),
|
|
63
|
+
headerLine("Subject", payload.subject),
|
|
64
|
+
"MIME-Version: 1.0",
|
|
65
|
+
"Content-Type: text/html; charset=UTF-8"
|
|
66
|
+
].filter((line) => line);
|
|
67
|
+
if (payload.headers) {
|
|
68
|
+
for (const [headerName, headerValue] of Object.entries(payload.headers)) {
|
|
69
|
+
headers.push(`${headerName}: ${headerValue}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const message = `${headers.join("\r\n")}\r\n\r\n${payload.html}`;
|
|
73
|
+
const { default: SmtpConnection } = await import("smtp-connection");
|
|
74
|
+
const connection = new SmtpConnection(this.connectionOptions);
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
connection.connect((connectError) => {
|
|
77
|
+
if (connectError) {
|
|
78
|
+
reject(connectError);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
connection.send({ from, to: recipients }, message, (sendError) => {
|
|
82
|
+
if (sendError) {
|
|
83
|
+
connection.quit(() => reject(sendError));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
connection.quit((quitError) => {
|
|
87
|
+
if (quitError) {
|
|
88
|
+
reject(quitError);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
resolve(null);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWlsZXIvYmFja2VuZHMvc210cC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0sZ0NBQWdDLENBQUE7QUFFMUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ2hDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFDckIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDL0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDekMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUM3QixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRXZCLE9BQU8sR0FBRyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUE7QUFDNUIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBTyxpQkFBaUI7SUFDcEM7Ozs7T0FJRztJQUNILFlBQVksRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDdkQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRXZCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2RixDQUFDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFBO1FBQzFDLElBQUksQ0FBQyxX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b0JBQ3BCLE9BQU07Z0JBQ1IsQ0FBQztnQkFFRCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDN0QsSUFBSSxTQUFTLEVBQUUsQ0FBQzt3QkFDZCxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO3dCQUN4QyxPQUFNO29CQUNSLENBQUM7b0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO3dCQUM1QixJQUFJLFNBQVMsRUFBRSxDQUFDOzRCQUNkLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDbkIsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTt3QkFDZixDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNKLENBQUMsQ0FBQyxDQUFBO1lBQ0osQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBSZWNpcGllbnQgaW5wdXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IC0gTm9ybWFsaXplZCByZWNpcGllbnRzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVSZWNpcGllbnRzKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBbXVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeSlcbiAgcmV0dXJuIFt2YWx1ZV0uZmlsdGVyKChlbnRyeSkgPT4gZW50cnkpXG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBIZWFkZXIgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIEhlYWRlciB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSAtIEhlYWRlciBsaW5lLlxuICovXG5mdW5jdGlvbiBoZWFkZXJMaW5lKG5hbWUsIHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiBudWxsXG5cbiAgcmV0dXJuIGAke25hbWV9OiAke3ZhbHVlfWBcbn1cblxuLyoqXG4gKiBTTVRQIG1haWxlciBiYWNrZW5kIHVzaW5nIHNtdHAtY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU210cE1haWxlckJhY2tlbmQge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBDb25zdHJ1Y3RvciBhcmdzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncy5jb25uZWN0aW9uT3B0aW9ucyAtIHNtdHAtY29ubmVjdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuZGVmYXVsdEZyb21dIC0gRGVmYXVsdCBmcm9tIGFkZHJlc3MuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29ubmVjdGlvbk9wdGlvbnMsIGRlZmF1bHRGcm9tLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgaWYgKCFjb25uZWN0aW9uT3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHNtdHAgY29ubmVjdGlvbiBvcHRpb25zLiBHb3Q6ICR7U3RyaW5nKGNvbm5lY3Rpb25PcHRpb25zKX1gKVxuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvbk9wdGlvbnMgPSBjb25uZWN0aW9uT3B0aW9uc1xuICAgIHRoaXMuZGVmYXVsdEZyb20gPSBkZWZhdWx0RnJvbVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRGVsaXZlcnkgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IGFyZ3MucGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlbGl2ZXIoe3BheWxvYWQsIC4uLnJlc3RBcmdzfSkge1xuICAgIHJlc3RBcmdzRXJyb3IocmVzdEFyZ3MpXG5cbiAgICBjb25zdCBmcm9tID0gcGF5bG9hZC5mcm9tIHx8IHRoaXMuZGVmYXVsdEZyb21cblxuICAgIGlmICghZnJvbSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwgXCJmcm9tXCIgYWRkcmVzcy4gR290OiAke1N0cmluZyhmcm9tKX1gKVxuICAgIH1cblxuICAgIGNvbnN0IHRvTGlzdCA9IG5vcm1hbGl6ZVJlY2lwaWVudHMocGF5bG9hZC50bylcbiAgICBjb25zdCBjY0xpc3QgPSBub3JtYWxpemVSZWNpcGllbnRzKHBheWxvYWQuY2MpXG4gICAgY29uc3QgYmNjTGlzdCA9IG5vcm1hbGl6ZVJlY2lwaWVudHMocGF5bG9hZC5iY2MpXG4gICAgY29uc3QgcmVjaXBpZW50cyA9IFsuLi50b0xpc3QsIC4uLmNjTGlzdCwgLi4uYmNjTGlzdF1cblxuICAgIGlmIChyZWNpcGllbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwgcmVjaXBpZW50cy4gR290OiAke0pTT04uc3RyaW5naWZ5KHt0bzogcGF5bG9hZC50bywgY2M6IHBheWxvYWQuY2MsIGJjYzogcGF5bG9hZC5iY2N9KX1gKVxuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnMgPSBbXG4gICAgICBoZWFkZXJMaW5lKFwiRnJvbVwiLCBmcm9tKSxcbiAgICAgIGhlYWRlckxpbmUoXCJUb1wiLCB0b0xpc3QubGVuZ3RoID4gMCA/IHRvTGlzdC5qb2luKFwiLCBcIikgOiB1bmRlZmluZWQpLFxuICAgICAgaGVhZGVyTGluZShcIkNjXCIsIGNjTGlzdC5sZW5ndGggPiAwID8gY2NMaXN0LmpvaW4oXCIsIFwiKSA6IHVuZGVmaW5lZCksXG4gICAgICBoZWFkZXJMaW5lKFwiU3ViamVjdFwiLCBwYXlsb2FkLnN1YmplY3QpLFxuICAgICAgXCJNSU1FLVZlcnNpb246IDEuMFwiLFxuICAgICAgXCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOFwiXG4gICAgXS5maWx0ZXIoKGxpbmUpID0+IGxpbmUpXG5cbiAgICBpZiAocGF5bG9hZC5oZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGF5bG9hZC5oZWFkZXJzKSkge1xuICAgICAgICBoZWFkZXJzLnB1c2goYCR7aGVhZGVyTmFtZX06ICR7aGVhZGVyVmFsdWV9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYCR7aGVhZGVycy5qb2luKFwiXFxyXFxuXCIpfVxcclxcblxcclxcbiR7cGF5bG9hZC5odG1sfWBcbiAgICBjb25zdCB7ZGVmYXVsdDogU210cENvbm5lY3Rpb259ID0gYXdhaXQgaW1wb3J0KFwic210cC1jb25uZWN0aW9uXCIpXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5ldyBTbXRwQ29ubmVjdGlvbih0aGlzLmNvbm5lY3Rpb25PcHRpb25zKVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29ubmVjdGlvbi5jb25uZWN0KChjb25uZWN0RXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGNvbm5lY3RFcnJvcikge1xuICAgICAgICAgIHJlamVjdChjb25uZWN0RXJyb3IpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25uZWN0aW9uLnNlbmQoe2Zyb20sIHRvOiByZWNpcGllbnRzfSwgbWVzc2FnZSwgKHNlbmRFcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChzZW5kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucXVpdCgoKSA9PiByZWplY3Qoc2VuZEVycm9yKSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbm5lY3Rpb24ucXVpdCgocXVpdEVycm9yKSA9PiB7XG4gICAgICAgICAgICBpZiAocXVpdEVycm9yKSB7XG4gICAgICAgICAgICAgIHJlamVjdChxdWl0RXJyb3IpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKG51bGwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base mailer with view rendering and delivery helpers.
|
|
3
|
+
*/
|
|
4
|
+
export class VelociousMailerBase {
|
|
5
|
+
/**
|
|
6
|
+
* @returns {import("./index.js").MailerDeliveryPayload[]} - Delivered payloads.
|
|
7
|
+
*/
|
|
8
|
+
static deliveries(): import("./index.js").MailerDeliveryPayload[];
|
|
9
|
+
/**
|
|
10
|
+
* @returns {void} - No return value.
|
|
11
|
+
*/
|
|
12
|
+
static clearDeliveries(): void;
|
|
13
|
+
/**
|
|
14
|
+
* @param {(payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown} handler - Delivery handler.
|
|
15
|
+
* @returns {void} - No return value.
|
|
16
|
+
*/
|
|
17
|
+
static setDeliveryHandler(handler: (payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown): void;
|
|
18
|
+
/**
|
|
19
|
+
* @returns {(payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown | null} - Handler or null.
|
|
20
|
+
*/
|
|
21
|
+
static getDeliveryHandler(): (payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown | null;
|
|
22
|
+
/**
|
|
23
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
24
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | unknown>} - Handler result.
|
|
25
|
+
*/
|
|
26
|
+
static deliverPayload(payload: import("./index.js").MailerDeliveryPayload): Promise<import("./index.js").MailerDeliveryPayload | unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
29
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
30
|
+
*/
|
|
31
|
+
static enqueuePayload(payload: import("./index.js").MailerDeliveryPayload): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
32
|
+
/**
|
|
33
|
+
* @param {object} [args] - Constructor args.
|
|
34
|
+
* @param {import("../configuration.js").default} [args.configuration] - Configuration instance.
|
|
35
|
+
*/
|
|
36
|
+
constructor({ configuration }?: {
|
|
37
|
+
configuration?: import("../configuration.js").default;
|
|
38
|
+
});
|
|
39
|
+
_actionName: string;
|
|
40
|
+
_mailOptions: {
|
|
41
|
+
to: any;
|
|
42
|
+
subject: string;
|
|
43
|
+
from: any;
|
|
44
|
+
cc: any;
|
|
45
|
+
bcc: any;
|
|
46
|
+
replyTo: any;
|
|
47
|
+
headers: Record<string, string>;
|
|
48
|
+
};
|
|
49
|
+
_viewParams: {};
|
|
50
|
+
_configurationPromise: Promise<import("../configuration.js").default>;
|
|
51
|
+
/**
|
|
52
|
+
* @param {Record<string, any>} params - View params.
|
|
53
|
+
* @returns {void} - No return value.
|
|
54
|
+
*/
|
|
55
|
+
assignView(params: Record<string, any>): void;
|
|
56
|
+
/**
|
|
57
|
+
* @param {object} args - Mail options.
|
|
58
|
+
* @param {any} args.to - Recipient.
|
|
59
|
+
* @param {string} args.subject - Subject line.
|
|
60
|
+
* @param {any} [args.from] - Sender.
|
|
61
|
+
* @param {any} [args.cc] - CC recipients.
|
|
62
|
+
* @param {any} [args.bcc] - BCC recipients.
|
|
63
|
+
* @param {any} [args.replyTo] - Reply-to address.
|
|
64
|
+
* @param {Record<string, string>} [args.headers] - Custom headers.
|
|
65
|
+
* @returns {void} - No return value.
|
|
66
|
+
*/
|
|
67
|
+
mail({ to, subject, from, cc, bcc, replyTo, headers, ...restArgs }: {
|
|
68
|
+
to: any;
|
|
69
|
+
subject: string;
|
|
70
|
+
from?: any;
|
|
71
|
+
cc?: any;
|
|
72
|
+
bcc?: any;
|
|
73
|
+
replyTo?: any;
|
|
74
|
+
headers?: Record<string, string>;
|
|
75
|
+
}): void;
|
|
76
|
+
/**
|
|
77
|
+
* @param {string} actionName - Action name.
|
|
78
|
+
* @param {any[]} args - Action args.
|
|
79
|
+
* @returns {MailerDelivery} - Delivery wrapper.
|
|
80
|
+
*/
|
|
81
|
+
_buildDelivery(actionName: string, args: any[]): MailerDelivery;
|
|
82
|
+
/**
|
|
83
|
+
* @returns {Promise<import("../configuration.js").default>} - Configuration instance.
|
|
84
|
+
*/
|
|
85
|
+
_getConfiguration(): Promise<import("../configuration.js").default>;
|
|
86
|
+
/**
|
|
87
|
+
* @returns {string} - Action name.
|
|
88
|
+
*/
|
|
89
|
+
_getActionName(): string;
|
|
90
|
+
/**
|
|
91
|
+
* @param {string} html - Rendered HTML.
|
|
92
|
+
* @returns {import("./index.js").MailerDeliveryPayload} - Delivery payload.
|
|
93
|
+
*/
|
|
94
|
+
_buildPayloadSync(html: string): import("./index.js").MailerDeliveryPayload;
|
|
95
|
+
/**
|
|
96
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Delivery payload.
|
|
97
|
+
*/
|
|
98
|
+
_buildPayload(): Promise<import("./index.js").MailerDeliveryPayload>;
|
|
99
|
+
/**
|
|
100
|
+
* @returns {Promise<string>} - Rendered HTML.
|
|
101
|
+
*/
|
|
102
|
+
_renderView(): Promise<string>;
|
|
103
|
+
}
|
|
104
|
+
import MailerDelivery from "./delivery.js";
|
|
105
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"AAyCA;;GAEG;AACH;IAmJE;;OAEG;IACH,qBAFa,OAAO,YAAY,EAAE,qBAAqB,EAAE,CAIxD;IAED;;OAEG;IACH,0BAFa,IAAI,CAIhB;IAED;;;OAGG;IACH,mCAHW,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GACjF,IAAI,CAIhB;IAED;;OAEG;IACH,6BAFa,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,IAAI,CAItG;IAED;;;OAGG;IACH,+BAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAsBzE;IAED;;;OAGG;IACH,+BAHW,OAAO,YAAY,EAAE,qBAAqB,GACxC,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAW/E;IAtND;;;OAGG;IACH,gCAFG;QAAqD,aAAa,GAA1D,OAAO,qBAAqB,EAAE,OAAO;KAC/C,EAMA;IAJC,oBAAuB;IACvB;;;;;;;;MAAwB;IACxB,gBAAqB;IACrB,sEAAqG;IAGvG;;;OAGG;IACH,mBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,IAAI,CAIhB;IAED;;;;;;;;;;OAUG;IACH,oEATG;QAAkB,EAAE,EAAZ,GAAG;QACU,OAAO,EAApB,MAAM;QACK,IAAI,GAAf,GAAG;QACQ,EAAE,GAAb,GAAG;QACQ,GAAG,GAAd,GAAG;QACQ,OAAO,GAAlB,GAAG;QAC2B,OAAO,GAArC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;KAC9B,GAAU,IAAI,CAMhB;IAED;;;;OAIG;IACH,2BAJW,MAAM,QACN,GAAG,EAAE,GACH,cAAc,CAiB1B;IAED;;OAEG;IACH,qBAFa,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAI1D;IAED;;OAEG;IACH,kBAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,OAAO,YAAY,EAAE,qBAAqB,CA6BtD;IAED;;OAEG;IACH,iBAFa,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,CAAC,CAM/D;IAED;;OAEG;IACH,eAFa,OAAO,CAAC,MAAM,CAAC,CAyB3B;CAuEF;2BA7P0B,eAAe"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import ejs from "ejs";
|
|
3
|
+
import { incorporate } from "incorporator";
|
|
4
|
+
import * as inflection from "inflection";
|
|
5
|
+
import configurationResolver from "../configuration-resolver.js";
|
|
6
|
+
import restArgsError from "../utils/rest-args-error.js";
|
|
7
|
+
import MailerDelivery from "./delivery.js";
|
|
8
|
+
/** @type {import("./index.js").MailerDeliveryPayload[]} */
|
|
9
|
+
const deliveries = [];
|
|
10
|
+
/** @type {((payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown) | null} */
|
|
11
|
+
let deliveryHandler = null;
|
|
12
|
+
/**
|
|
13
|
+
* @param {string} actionName - Mailer action name.
|
|
14
|
+
* @returns {string} - View file name.
|
|
15
|
+
*/
|
|
16
|
+
function viewFileName(actionName) {
|
|
17
|
+
return inflection.dasherize(inflection.underscore(actionName));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @param {string} className - Mailer class name.
|
|
21
|
+
* @returns {string} - Mailer directory name.
|
|
22
|
+
*/
|
|
23
|
+
function mailerDirectoryName(className) {
|
|
24
|
+
const baseName = className.replace(/Mailer$/, "");
|
|
25
|
+
return inflection.dasherize(inflection.underscore(baseName));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* @returns {Promise<boolean>} - Whether the current environment is test.
|
|
29
|
+
*/
|
|
30
|
+
async function isTestingEnvironment() {
|
|
31
|
+
const configuration = await configurationResolver();
|
|
32
|
+
return configuration.getEnvironment() === "test";
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Base mailer with view rendering and delivery helpers.
|
|
36
|
+
*/
|
|
37
|
+
export class VelociousMailerBase {
|
|
38
|
+
/**
|
|
39
|
+
* @param {object} [args] - Constructor args.
|
|
40
|
+
* @param {import("../configuration.js").default} [args.configuration] - Configuration instance.
|
|
41
|
+
*/
|
|
42
|
+
constructor({ configuration } = {}) {
|
|
43
|
+
this._actionName = null;
|
|
44
|
+
this._mailOptions = null;
|
|
45
|
+
this._viewParams = {};
|
|
46
|
+
this._configurationPromise = configuration ? Promise.resolve(configuration) : configurationResolver();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @param {Record<string, any>} params - View params.
|
|
50
|
+
* @returns {void} - No return value.
|
|
51
|
+
*/
|
|
52
|
+
assignView(params) {
|
|
53
|
+
this._viewParams = Object.assign(this._viewParams, params || {});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @param {object} args - Mail options.
|
|
57
|
+
* @param {any} args.to - Recipient.
|
|
58
|
+
* @param {string} args.subject - Subject line.
|
|
59
|
+
* @param {any} [args.from] - Sender.
|
|
60
|
+
* @param {any} [args.cc] - CC recipients.
|
|
61
|
+
* @param {any} [args.bcc] - BCC recipients.
|
|
62
|
+
* @param {any} [args.replyTo] - Reply-to address.
|
|
63
|
+
* @param {Record<string, string>} [args.headers] - Custom headers.
|
|
64
|
+
* @returns {void} - No return value.
|
|
65
|
+
*/
|
|
66
|
+
mail({ to, subject, from, cc, bcc, replyTo, headers, ...restArgs }) {
|
|
67
|
+
restArgsError(restArgs);
|
|
68
|
+
this._mailOptions = { to, subject, from, cc, bcc, replyTo, headers };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* @param {string} actionName - Action name.
|
|
72
|
+
* @param {any[]} args - Action args.
|
|
73
|
+
* @returns {MailerDelivery} - Delivery wrapper.
|
|
74
|
+
*/
|
|
75
|
+
_buildDelivery(actionName, args) {
|
|
76
|
+
const action = this[actionName];
|
|
77
|
+
if (typeof action !== "function") {
|
|
78
|
+
throw new Error(`Unknown mailer method "${actionName}" on ${this.constructor.name}`);
|
|
79
|
+
}
|
|
80
|
+
this._actionName = actionName;
|
|
81
|
+
const actionResult = action.apply(this, args);
|
|
82
|
+
return new MailerDelivery({
|
|
83
|
+
mailer: this,
|
|
84
|
+
actionPromise: Promise.resolve(actionResult),
|
|
85
|
+
actionName
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* @returns {Promise<import("../configuration.js").default>} - Configuration instance.
|
|
90
|
+
*/
|
|
91
|
+
async _getConfiguration() {
|
|
92
|
+
return await this._configurationPromise;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @returns {string} - Action name.
|
|
96
|
+
*/
|
|
97
|
+
_getActionName() {
|
|
98
|
+
if (!this._actionName) {
|
|
99
|
+
throw new Error(`No mailer action set on ${this.constructor.name}`);
|
|
100
|
+
}
|
|
101
|
+
return this._actionName;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* @param {string} html - Rendered HTML.
|
|
105
|
+
* @returns {import("./index.js").MailerDeliveryPayload} - Delivery payload.
|
|
106
|
+
*/
|
|
107
|
+
_buildPayloadSync(html) {
|
|
108
|
+
const mailOptions = this._mailOptions;
|
|
109
|
+
if (!mailOptions) {
|
|
110
|
+
throw new Error(`Missing mail() options for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions)}`);
|
|
111
|
+
}
|
|
112
|
+
if (!mailOptions.to) {
|
|
113
|
+
throw new Error(`Missing "to" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.to)}`);
|
|
114
|
+
}
|
|
115
|
+
if (!mailOptions.subject) {
|
|
116
|
+
throw new Error(`Missing "subject" for ${this.constructor.name}#${this._getActionName()}. Got: ${String(mailOptions.subject)}`);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
to: mailOptions.to,
|
|
120
|
+
subject: mailOptions.subject,
|
|
121
|
+
from: mailOptions.from,
|
|
122
|
+
cc: mailOptions.cc,
|
|
123
|
+
bcc: mailOptions.bcc,
|
|
124
|
+
replyTo: mailOptions.replyTo,
|
|
125
|
+
headers: mailOptions.headers,
|
|
126
|
+
html,
|
|
127
|
+
mailer: this.constructor.name,
|
|
128
|
+
action: this._getActionName()
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload>} - Delivery payload.
|
|
133
|
+
*/
|
|
134
|
+
async _buildPayload() {
|
|
135
|
+
const html = await this._renderView();
|
|
136
|
+
return this._buildPayloadSync(html);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @returns {Promise<string>} - Rendered HTML.
|
|
140
|
+
*/
|
|
141
|
+
async _renderView() {
|
|
142
|
+
const configuration = await this._getConfiguration();
|
|
143
|
+
const mailerDir = mailerDirectoryName(this.constructor.name);
|
|
144
|
+
const actionName = this._getActionName();
|
|
145
|
+
const fileName = viewFileName(actionName);
|
|
146
|
+
const viewPath = `${configuration.getDirectory()}/src/mailers/${mailerDir}/${fileName}.ejs`;
|
|
147
|
+
const viewParams = incorporate({ mailer: this }, this._viewParams);
|
|
148
|
+
return await new Promise((resolve, reject) => {
|
|
149
|
+
ejs.renderFile(viewPath, viewParams, {}, (err, str) => {
|
|
150
|
+
if (err) {
|
|
151
|
+
const errorCode = /** @type {{code?: string}} */ (err).code;
|
|
152
|
+
if (errorCode === "ENOENT") {
|
|
153
|
+
reject(new Error(`Missing mailer view file: ${viewPath}`));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
reject(err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
resolve(str);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @returns {import("./index.js").MailerDeliveryPayload[]} - Delivered payloads.
|
|
167
|
+
*/
|
|
168
|
+
static deliveries() {
|
|
169
|
+
return deliveries.slice();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* @returns {void} - No return value.
|
|
173
|
+
*/
|
|
174
|
+
static clearDeliveries() {
|
|
175
|
+
deliveries.length = 0;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @param {(payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown} handler - Delivery handler.
|
|
179
|
+
* @returns {void} - No return value.
|
|
180
|
+
*/
|
|
181
|
+
static setDeliveryHandler(handler) {
|
|
182
|
+
deliveryHandler = handler;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @returns {(payload: import("./index.js").MailerDeliveryPayload) => Promise<unknown> | unknown | null} - Handler or null.
|
|
186
|
+
*/
|
|
187
|
+
static getDeliveryHandler() {
|
|
188
|
+
return deliveryHandler;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
192
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | unknown>} - Handler result.
|
|
193
|
+
*/
|
|
194
|
+
static async deliverPayload(payload) {
|
|
195
|
+
if (await isTestingEnvironment()) {
|
|
196
|
+
deliveries.push(payload);
|
|
197
|
+
return payload;
|
|
198
|
+
}
|
|
199
|
+
const configuration = await configurationResolver();
|
|
200
|
+
const backend = configuration.getMailerBackend();
|
|
201
|
+
if (backend?.deliver) {
|
|
202
|
+
return await backend.deliver({ payload, configuration });
|
|
203
|
+
}
|
|
204
|
+
const handler = deliveryHandler;
|
|
205
|
+
if (!handler) {
|
|
206
|
+
throw new Error(`No mail delivery handler configured for "${payload.subject}" to "${payload.to}"`);
|
|
207
|
+
}
|
|
208
|
+
return await handler(payload);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
212
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
213
|
+
*/
|
|
214
|
+
static async enqueuePayload(payload) {
|
|
215
|
+
if (await isTestingEnvironment()) {
|
|
216
|
+
deliveries.push(payload);
|
|
217
|
+
return payload;
|
|
218
|
+
}
|
|
219
|
+
const { default: mailDeliveryJob } = await import("../jobs/mail-delivery.js");
|
|
220
|
+
return await mailDeliveryJob.performLater(payload);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWlsZXIvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLGNBQWMsTUFBTSxlQUFlLENBQUE7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtBQUNyQiwyR0FBMkc7QUFDM0csSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFBO0FBRTFCOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLFVBQVU7SUFDOUIsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxTQUFTO0lBQ3BDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBRWpELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDOUQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLG9CQUFvQjtJQUNqQyxNQUFNLGFBQWEsR0FBRyxNQUFNLHFCQUFxQixFQUFFLENBQUE7SUFFbkQsT0FBTyxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssTUFBTSxDQUFBO0FBQ2xELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUI7OztPQUdH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Q0FBQyxDQUFBO1FBRTNFLE9BQU8sTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZWpzIGZyb20gXCJlanNcIlxuaW1wb3J0IHtpbmNvcnBvcmF0ZX0gZnJvbSBcImluY29ycG9yYXRvclwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBjb25maWd1cmF0aW9uUmVzb2x2ZXIgZnJvbSBcIi4uL2NvbmZpZ3VyYXRpb24tcmVzb2x2ZXIuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5pbXBvcnQgTWFpbGVyRGVsaXZlcnkgZnJvbSBcIi4vZGVsaXZlcnkuanNcIlxuXG4vKiogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkW119ICovXG5jb25zdCBkZWxpdmVyaWVzID0gW11cbi8qKiBAdHlwZSB7KChwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd24pIHwgbnVsbH0gKi9cbmxldCBkZWxpdmVyeUhhbmRsZXIgPSBudWxsXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBNYWlsZXIgYWN0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFZpZXcgZmlsZSBuYW1lLlxuICovXG5mdW5jdGlvbiB2aWV3RmlsZU5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFjdGlvbk5hbWUpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWUgLSBNYWlsZXIgY2xhc3MgbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gTWFpbGVyIGRpcmVjdG9yeSBuYW1lLlxuICovXG5mdW5jdGlvbiBtYWlsZXJEaXJlY3RvcnlOYW1lKGNsYXNzTmFtZSkge1xuICBjb25zdCBiYXNlTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKC9NYWlsZXIkLywgXCJcIilcblxuICByZXR1cm4gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGJhc2VOYW1lKSlcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIHRlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzVGVzdGluZ0Vudmlyb25tZW50KCkge1xuICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgY29uZmlndXJhdGlvblJlc29sdmVyKClcblxuICByZXR1cm4gY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcInRlc3RcIlxufVxuXG4vKipcbiAqIEJhc2UgbWFpbGVyIHdpdGggdmlldyByZW5kZXJpbmcgYW5kIGRlbGl2ZXJ5IGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWxvY2lvdXNNYWlsZXJCYXNlIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb25zdHJ1Y3RvciBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259ID0ge30pIHtcbiAgICB0aGlzLl9hY3Rpb25OYW1lID0gbnVsbFxuICAgIHRoaXMuX21haWxPcHRpb25zID0gbnVsbFxuICAgIHRoaXMuX3ZpZXdQYXJhbXMgPSB7fVxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25Qcm9taXNlID0gY29uZmlndXJhdGlvbiA/IFByb21pc2UucmVzb2x2ZShjb25maWd1cmF0aW9uKSA6IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBwYXJhbXMgLSBWaWV3IHBhcmFtcy5cbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgYXNzaWduVmlldyhwYXJhbXMpIHtcbiAgICB0aGlzLl92aWV3UGFyYW1zID0gT2JqZWN0LmFzc2lnbih0aGlzLl92aWV3UGFyYW1zLCBwYXJhbXMgfHwge30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBNYWlsIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7YW55fSBhcmdzLnRvIC0gUmVjaXBpZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJqZWN0IC0gU3ViamVjdCBsaW5lLlxuICAgKiBAcGFyYW0ge2FueX0gW2FyZ3MuZnJvbV0gLSBTZW5kZXIuXG4gICAqIEBwYXJhbSB7YW55fSBbYXJncy5jY10gLSBDQyByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gW2FyZ3MuYmNjXSAtIEJDQyByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0ge2FueX0gW2FyZ3MucmVwbHlUb10gLSBSZXBseS10byBhZGRyZXNzLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFthcmdzLmhlYWRlcnNdIC0gQ3VzdG9tIGhlYWRlcnMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIG1haWwoe3RvLCBzdWJqZWN0LCBmcm9tLCBjYywgYmNjLCByZXBseVRvLCBoZWFkZXJzLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5fbWFpbE9wdGlvbnMgPSB7dG8sIHN1YmplY3QsIGZyb20sIGNjLCBiY2MsIHJlcGx5VG8sIGhlYWRlcnN9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBBY3Rpb24gbmFtZS5cbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFjdGlvbiBhcmdzLlxuICAgKiBAcmV0dXJucyB7TWFpbGVyRGVsaXZlcnl9IC0gRGVsaXZlcnkgd3JhcHBlci5cbiAgICovXG4gIF9idWlsZERlbGl2ZXJ5KGFjdGlvbk5hbWUsIGFyZ3MpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzW2FjdGlvbk5hbWVdXG5cbiAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWFpbGVyIG1ldGhvZCBcIiR7YWN0aW9uTmFtZX1cIiBvbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGlvbk5hbWUgPSBhY3Rpb25OYW1lXG4gICAgY29uc3QgYWN0aW9uUmVzdWx0ID0gYWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpXG5cbiAgICByZXR1cm4gbmV3IE1haWxlckRlbGl2ZXJ5KHtcbiAgICAgIG1haWxlcjogdGhpcyxcbiAgICAgIGFjdGlvblByb21pc2U6IFByb21pc2UucmVzb2x2ZShhY3Rpb25SZXN1bHQpLFxuICAgICAgYWN0aW9uTmFtZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0Pn0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgX2dldENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb25Qcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBY3Rpb24gbmFtZS5cbiAgICovXG4gIF9nZXRBY3Rpb25OYW1lKCkge1xuICAgIGlmICghdGhpcy5fYWN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtYWlsZXIgYWN0aW9uIHNldCBvbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hY3Rpb25OYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBSZW5kZXJlZCBIVE1MLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IC0gRGVsaXZlcnkgcGF5bG9hZC5cbiAgICovXG4gIF9idWlsZFBheWxvYWRTeW5jKGh0bWwpIHtcbiAgICBjb25zdCBtYWlsT3B0aW9ucyA9IHRoaXMuX21haWxPcHRpb25zXG5cbiAgICBpZiAoIW1haWxPcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgbWFpbCgpIG9wdGlvbnMgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMpfWApXG4gICAgfVxuXG4gICAgaWYgKCFtYWlsT3B0aW9ucy50bykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwidG9cIiBmb3IgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5fZ2V0QWN0aW9uTmFtZSgpfS4gR290OiAke1N0cmluZyhtYWlsT3B0aW9ucy50byl9YClcbiAgICB9XG5cbiAgICBpZiAoIW1haWxPcHRpb25zLnN1YmplY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcInN1YmplY3RcIiBmb3IgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5fZ2V0QWN0aW9uTmFtZSgpfS4gR290OiAke1N0cmluZyhtYWlsT3B0aW9ucy5zdWJqZWN0KX1gKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0bzogbWFpbE9wdGlvbnMudG8sXG4gICAgICBzdWJqZWN0OiBtYWlsT3B0aW9ucy5zdWJqZWN0LFxuICAgICAgZnJvbTogbWFpbE9wdGlvbnMuZnJvbSxcbiAgICAgIGNjOiBtYWlsT3B0aW9ucy5jYyxcbiAgICAgIGJjYzogbWFpbE9wdGlvbnMuYmNjLFxuICAgICAgcmVwbHlUbzogbWFpbE9wdGlvbnMucmVwbHlUbyxcbiAgICAgIGhlYWRlcnM6IG1haWxPcHRpb25zLmhlYWRlcnMsXG4gICAgICBodG1sLFxuICAgICAgbWFpbGVyOiB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICBhY3Rpb246IHRoaXMuX2dldEFjdGlvbk5hbWUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZD59IC0gRGVsaXZlcnkgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIF9idWlsZFBheWxvYWQoKSB7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuX3JlbmRlclZpZXcoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUGF5bG9hZFN5bmMoaHRtbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFJlbmRlcmVkIEhUTUwuXG4gICAqL1xuICBhc3luYyBfcmVuZGVyVmlldygpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbWFpbGVyRGlyID0gbWFpbGVyRGlyZWN0b3J5TmFtZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgY29uc3QgYWN0aW9uTmFtZSA9IHRoaXMuX2dldEFjdGlvbk5hbWUoKVxuICAgIGNvbnN0IGZpbGVOYW1lID0gdmlld0ZpbGVOYW1lKGFjdGlvbk5hbWUpXG4gICAgY29uc3Qgdmlld1BhdGggPSBgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvbWFpbGVycy8ke21haWxlckRpcn0vJHtmaWxlTmFtZX0uZWpzYFxuICAgIGNvbnN0IHZpZXdQYXJhbXMgPSBpbmNvcnBvcmF0ZSh7bWFpbGVyOiB0aGlzfSwgdGhpcy5fdmlld1BhcmFtcylcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBlanMucmVuZGVyRmlsZSh2aWV3UGF0aCwgdmlld1BhcmFtcywge30sIChlcnIsIHN0cikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gLyoqIEB0eXBlIHt7Y29kZT86IHN0cmluZ319ICovIChlcnIpLmNvZGVcblxuICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgbWFpbGVyIHZpZXcgZmlsZTogJHt2aWV3UGF0aH1gKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWRbXX0gLSBEZWxpdmVyZWQgcGF5bG9hZHMuXG4gICAqL1xuICBzdGF0aWMgZGVsaXZlcmllcygpIHtcbiAgICByZXR1cm4gZGVsaXZlcmllcy5zbGljZSgpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIGNsZWFyRGVsaXZlcmllcygpIHtcbiAgICBkZWxpdmVyaWVzLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd259IGhhbmRsZXIgLSBEZWxpdmVyeSBoYW5kbGVyLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc2V0RGVsaXZlcnlIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICBkZWxpdmVyeUhhbmRsZXIgPSBoYW5kbGVyXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgeyhwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTx1bmtub3duPiB8IHVua25vd24gfCBudWxsfSAtIEhhbmRsZXIgb3IgbnVsbC5cbiAgICovXG4gIHN0YXRpYyBnZXREZWxpdmVyeUhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIGRlbGl2ZXJ5SGFuZGxlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgdW5rbm93bj59IC0gSGFuZGxlciByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZGVsaXZlclBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmIChhd2FpdCBpc1Rlc3RpbmdFbnZpcm9ubWVudCgpKSB7XG4gICAgICBkZWxpdmVyaWVzLnB1c2gocGF5bG9hZClcbiAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG4gICAgY29uc3QgYmFja2VuZCA9IGNvbmZpZ3VyYXRpb24uZ2V0TWFpbGVyQmFja2VuZCgpXG5cbiAgICBpZiAoYmFja2VuZD8uZGVsaXZlcikge1xuICAgICAgcmV0dXJuIGF3YWl0IGJhY2tlbmQuZGVsaXZlcih7cGF5bG9hZCwgY29uZmlndXJhdGlvbn0pXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlciA9IGRlbGl2ZXJ5SGFuZGxlclxuXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG1haWwgZGVsaXZlcnkgaGFuZGxlciBjb25maWd1cmVkIGZvciBcIiR7cGF5bG9hZC5zdWJqZWN0fVwiIHRvIFwiJHtwYXlsb2FkLnRvfVwiYClcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgaGFuZGxlcihwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGVucXVldWVQYXlsb2FkKHBheWxvYWQpIHtcbiAgICBpZiAoYXdhaXQgaXNUZXN0aW5nRW52aXJvbm1lbnQoKSkge1xuICAgICAgZGVsaXZlcmllcy5wdXNoKHBheWxvYWQpXG4gICAgICByZXR1cm4gcGF5bG9hZFxuICAgIH1cblxuICAgIGNvbnN0IHtkZWZhdWx0OiBtYWlsRGVsaXZlcnlKb2J9ID0gYXdhaXQgaW1wb3J0KFwiLi4vam9icy9tYWlsLWRlbGl2ZXJ5LmpzXCIpXG5cbiAgICByZXR1cm4gYXdhaXQgbWFpbERlbGl2ZXJ5Sm9iLnBlcmZvcm1MYXRlcihwYXlsb2FkKVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents a prepared mail delivery.
|
|
3
|
+
*/
|
|
4
|
+
export default class MailerDelivery {
|
|
5
|
+
/**
|
|
6
|
+
* @param {object} args - Constructor args.
|
|
7
|
+
* @param {import("./base.js").VelociousMailerBase} args.mailer - Mailer instance.
|
|
8
|
+
* @param {Promise<unknown>} args.actionPromise - Action promise.
|
|
9
|
+
* @param {string} args.actionName - Action name.
|
|
10
|
+
*/
|
|
11
|
+
constructor({ mailer, actionPromise, actionName }: {
|
|
12
|
+
mailer: import("./base.js").VelociousMailerBase;
|
|
13
|
+
actionPromise: Promise<unknown>;
|
|
14
|
+
actionName: string;
|
|
15
|
+
});
|
|
16
|
+
/** @type {import("./base.js").VelociousMailerBase} */
|
|
17
|
+
mailer: import("./base.js").VelociousMailerBase;
|
|
18
|
+
/** @type {Promise<unknown>} */
|
|
19
|
+
actionPromise: Promise<unknown>;
|
|
20
|
+
/** @type {string} */
|
|
21
|
+
actionName: string;
|
|
22
|
+
/**
|
|
23
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | unknown>} - Delivered payload or handler result.
|
|
24
|
+
*/
|
|
25
|
+
deliverNow(): Promise<import("./index.js").MailerDeliveryPayload | unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
28
|
+
*/
|
|
29
|
+
deliverLater(): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
30
|
+
/**
|
|
31
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
32
|
+
*/
|
|
33
|
+
deliverLaver(): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/mailer/delivery.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IAQE;;;;;OAKG;IACH,mDAJG;QAAsD,MAAM,EAApD,OAAO,WAAW,EAAE,mBAAmB;QAChB,aAAa,EAApC,OAAO,CAAC,OAAO,CAAC;QACH,UAAU,EAAvB,MAAM;KAChB,EAKA;IAjBD,sDAAsD;IACtD,QADW,OAAO,WAAW,EAAE,mBAAmB,CAC5C;IACN,+BAA+B;IAC/B,eADW,OAAO,CAAC,OAAO,CAAC,CACd;IACb,qBAAqB;IACrB,YADW,MAAM,CACP;IAcV;;OAEG;IACH,cAFa,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,CAQzE;IAED;;OAEG;IACH,gBAFa,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAQ/E;IAED;;OAEG;IACH,gBAFa,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAI/E;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Represents a prepared mail delivery.
|
|
4
|
+
*/
|
|
5
|
+
export default class MailerDelivery {
|
|
6
|
+
/** @type {import("./base.js").VelociousMailerBase} */
|
|
7
|
+
mailer;
|
|
8
|
+
/** @type {Promise<unknown>} */
|
|
9
|
+
actionPromise;
|
|
10
|
+
/** @type {string} */
|
|
11
|
+
actionName;
|
|
12
|
+
/**
|
|
13
|
+
* @param {object} args - Constructor args.
|
|
14
|
+
* @param {import("./base.js").VelociousMailerBase} args.mailer - Mailer instance.
|
|
15
|
+
* @param {Promise<unknown>} args.actionPromise - Action promise.
|
|
16
|
+
* @param {string} args.actionName - Action name.
|
|
17
|
+
*/
|
|
18
|
+
constructor({ mailer, actionPromise, actionName }) {
|
|
19
|
+
this.mailer = mailer;
|
|
20
|
+
this.actionPromise = actionPromise;
|
|
21
|
+
this.actionName = actionName;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @returns {Promise<import("./index.js").MailerDeliveryPayload | unknown>} - Delivered payload or handler result.
|
|
25
|
+
*/
|
|
26
|
+
async deliverNow() {
|
|
27
|
+
await this.actionPromise;
|
|
28
|
+
const payload = /** @type {import("./index.js").MailerDeliveryPayload} */ (await this.mailer._buildPayload());
|
|
29
|
+
const mailerClass = /** @type {typeof import("./base.js").VelociousMailerBase} */ (this.mailer.constructor);
|
|
30
|
+
return await mailerClass.deliverPayload(payload);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
34
|
+
*/
|
|
35
|
+
async deliverLater() {
|
|
36
|
+
await this.actionPromise;
|
|
37
|
+
const payload = /** @type {import("./index.js").MailerDeliveryPayload} */ (await this.mailer._buildPayload());
|
|
38
|
+
const mailerClass = /** @type {typeof import("./base.js").VelociousMailerBase} */ (this.mailer.constructor);
|
|
39
|
+
return await mailerClass.enqueuePayload(payload);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
43
|
+
*/
|
|
44
|
+
async deliverLaver() {
|
|
45
|
+
return await this.deliverLater();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWFpbGVyL2RlbGl2ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sY0FBYztJQUNqQyxzREFBc0Q7SUFDdEQsTUFBTSxDQUFBO0lBQ04sK0JBQStCO0lBQy9CLGFBQWEsQ0FBQTtJQUNiLHFCQUFxQjtJQUNyQixVQUFVLENBQUE7SUFFVjs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQTtRQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNkLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQTtRQUN4QixNQUFNLE9BQU8sR0FBRyx5REFBeUQsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1FBQzdHLE1BQU0sV0FBVyxHQUFHLDZEQUE2RCxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUzRyxPQUFPLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUE7UUFDeEIsTUFBTSxPQUFPLEdBQUcseURBQXlELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUM3RyxNQUFNLFdBQVcsR0FBRyw2REFBNkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFM0csT0FBTyxNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVk7UUFDaEIsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcHJlcGFyZWQgbWFpbCBkZWxpdmVyeS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpbGVyRGVsaXZlcnkge1xuICAvKiogQHR5cGUge2ltcG9ydChcIi4vYmFzZS5qc1wiKS5WZWxvY2lvdXNNYWlsZXJCYXNlfSAqL1xuICBtYWlsZXJcbiAgLyoqIEB0eXBlIHtQcm9taXNlPHVua25vd24+fSAqL1xuICBhY3Rpb25Qcm9taXNlXG4gIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICBhY3Rpb25OYW1lXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gQ29uc3RydWN0b3IgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UuanNcIikuVmVsb2Npb3VzTWFpbGVyQmFzZX0gYXJncy5tYWlsZXIgLSBNYWlsZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7UHJvbWlzZTx1bmtub3duPn0gYXJncy5hY3Rpb25Qcm9taXNlIC0gQWN0aW9uIHByb21pc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmFjdGlvbk5hbWUgLSBBY3Rpb24gbmFtZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHttYWlsZXIsIGFjdGlvblByb21pc2UsIGFjdGlvbk5hbWV9KSB7XG4gICAgdGhpcy5tYWlsZXIgPSBtYWlsZXJcbiAgICB0aGlzLmFjdGlvblByb21pc2UgPSBhY3Rpb25Qcm9taXNlXG4gICAgdGhpcy5hY3Rpb25OYW1lID0gYWN0aW9uTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgdW5rbm93bj59IC0gRGVsaXZlcmVkIHBheWxvYWQgb3IgaGFuZGxlciByZXN1bHQuXG4gICAqL1xuICBhc3luYyBkZWxpdmVyTm93KCkge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uUHJvbWlzZVxuICAgIGNvbnN0IHBheWxvYWQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSAqLyAoYXdhaXQgdGhpcy5tYWlsZXIuX2J1aWxkUGF5bG9hZCgpKVxuICAgIGNvbnN0IG1haWxlckNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLlZlbG9jaW91c01haWxlckJhc2V9ICovICh0aGlzLm1haWxlci5jb25zdHJ1Y3RvcilcblxuICAgIHJldHVybiBhd2FpdCBtYWlsZXJDbGFzcy5kZWxpdmVyUGF5bG9hZChwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckxhdGVyKCkge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uUHJvbWlzZVxuICAgIGNvbnN0IHBheWxvYWQgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSAqLyAoYXdhaXQgdGhpcy5tYWlsZXIuX2J1aWxkUGF5bG9hZCgpKVxuICAgIGNvbnN0IG1haWxlckNsYXNzID0gLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9iYXNlLmpzXCIpLlZlbG9jaW91c01haWxlckJhc2V9ICovICh0aGlzLm1haWxlci5jb25zdHJ1Y3RvcilcblxuICAgIHJldHVybiBhd2FpdCBtYWlsZXJDbGFzcy5lbnF1ZXVlUGF5bG9hZChwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICAgKi9cbiAgYXN5bmMgZGVsaXZlckxhdmVyKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmRlbGl2ZXJMYXRlcigpXG4gIH1cbn1cbiJdfQ==
|