@effect-app/infra 4.0.0-beta.139 → 4.0.0-beta.140
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/CHANGELOG.md +7 -0
- package/dist/Emailer/Sendgrid.d.ts +2 -2
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +16 -15
- package/dist/Emailer/service.d.ts +7 -1
- package/dist/Emailer/service.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/Emailer/Sendgrid.ts +17 -14
- package/src/Emailer/service.ts +6 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.140
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 1576688: Add configurable `fakeMailAddress` to `SendgridConfig`. Supports `{i}` placeholder for unique addresses, e.g. `"test+{i}@example.com"`.
|
|
8
|
+
- effect-app@4.0.0-beta.140
|
|
9
|
+
|
|
3
10
|
## 4.0.0-beta.139
|
|
4
11
|
|
|
5
12
|
### Patch Changes
|
|
@@ -6,7 +6,7 @@ export declare function Sendgrid(config: SendgridConfig): import("effect/Layer")
|
|
|
6
6
|
/**
|
|
7
7
|
* @hidden
|
|
8
8
|
*/
|
|
9
|
-
export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
9
|
+
export declare function renderMessage(forceFake: boolean, fakeMailAddress: string): (msg: EmailMsg) => {
|
|
10
10
|
replyTo?: EmailData;
|
|
11
11
|
sendAt?: number;
|
|
12
12
|
subject?: string;
|
|
@@ -168,4 +168,4 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
168
168
|
* @hidden
|
|
169
169
|
*/
|
|
170
170
|
export declare function isTestAddress(to: EmailData): boolean;
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZGdyaWQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9FbWFpbGVyL1NlbmRncmlkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRDQUE0QyxDQUFBO0FBQzNFLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXBFLE9BQU8sRUFBRSxLQUFLLEVBQWlDLE1BQU0sWUFBWSxDQUFBO0FBSWpFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQTZCLEtBQUssY0FBYyxFQUFpQixNQUFNLGNBQWMsQ0FBQTtBQTBEcEgsd0JBQWdCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsY0FBYyx1REFFOUM7QUFFRDs7R0FFRztBQUNILHdCQUFnQixhQUFhLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQVk3RCxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBT25CO0FBRUQ7O0dBRUc7QUFDSCx3QkFBZ0IsYUFBYSxDQUFDLEVBQUUsRUFBRSxTQUFTLFdBTzFDIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sendgrid.d.ts","sourceRoot":"","sources":["../../src/Emailer/Sendgrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAEpE,OAAO,EAAE,KAAK,EAAiC,MAAM,YAAY,CAAA;AAIjE,OAAO,EAAE,OAAO,EAAE,KAAK,QAAQ,EAA6B,KAAK,cAAc,EAAiB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Sendgrid.d.ts","sourceRoot":"","sources":["../../src/Emailer/Sendgrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAEpE,OAAO,EAAE,KAAK,EAAiC,MAAM,YAAY,CAAA;AAIjE,OAAO,EAAE,OAAO,EAAE,KAAK,QAAQ,EAA6B,KAAK,cAAc,EAAiB,MAAM,cAAc,CAAA;AA0DpH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,uDAE9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,SAY7D,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,WAO1C"}
|
package/dist/Emailer/Sendgrid.js
CHANGED
|
@@ -4,7 +4,7 @@ import { dropUndefinedT } from "effect-app/utils";
|
|
|
4
4
|
import { inspect } from "util";
|
|
5
5
|
import { InfraLogger } from "../logger.js";
|
|
6
6
|
import { Emailer, SendMailError } from "./service.js";
|
|
7
|
-
const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPrefix }) => Effect.sync(() => {
|
|
7
|
+
const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, fakeMailAddress, realMail, subjectPrefix }) => Effect.sync(() => {
|
|
8
8
|
sgMail.setApiKey(Redacted.value(apiKey));
|
|
9
9
|
return Emailer.of({
|
|
10
10
|
sendMail: Effect.fn("Sendgrid.sendMail")(function* (msg_) {
|
|
@@ -13,7 +13,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
13
13
|
from: msg_.from ?? defaultFrom,
|
|
14
14
|
replyTo: msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
|
|
15
15
|
});
|
|
16
|
-
const render = renderMessage(!realMail);
|
|
16
|
+
const render = renderMessage(!realMail, fakeMailAddress);
|
|
17
17
|
const renderedMsg_ = render(msg);
|
|
18
18
|
const renderedMsg = {
|
|
19
19
|
...renderedMsg_,
|
|
@@ -48,21 +48,22 @@ export function Sendgrid(config) {
|
|
|
48
48
|
/**
|
|
49
49
|
* @hidden
|
|
50
50
|
*/
|
|
51
|
-
export function renderMessage(forceFake) {
|
|
51
|
+
export function renderMessage(forceFake, fakeMailAddress) {
|
|
52
52
|
let i = 0;
|
|
53
53
|
const makeId = () => i++;
|
|
54
|
+
const makeFakeEmail = () => fakeMailAddress.replace("{i}", String(makeId()));
|
|
54
55
|
return forceFake
|
|
55
56
|
? (msg) => dropUndefinedT({
|
|
56
57
|
...msg,
|
|
57
|
-
to: msg.to && renderFake(msg.to,
|
|
58
|
-
cc: msg.cc && renderFake(msg.cc,
|
|
59
|
-
bcc: msg.bcc && renderFake(msg.bcc,
|
|
58
|
+
to: msg.to && renderFake(msg.to, makeFakeEmail),
|
|
59
|
+
cc: msg.cc && renderFake(msg.cc, makeFakeEmail),
|
|
60
|
+
bcc: msg.bcc && renderFake(msg.bcc, makeFakeEmail)
|
|
60
61
|
})
|
|
61
62
|
: (msg) => dropUndefinedT({
|
|
62
63
|
...msg,
|
|
63
|
-
to: msg.to && renderFakeIfTest(msg.to,
|
|
64
|
-
cc: msg.cc && renderFakeIfTest(msg.cc,
|
|
65
|
-
bcc: msg.bcc && renderFakeIfTest(msg.bcc,
|
|
64
|
+
to: msg.to && renderFakeIfTest(msg.to, makeFakeEmail),
|
|
65
|
+
cc: msg.cc && renderFakeIfTest(msg.cc, makeFakeEmail),
|
|
66
|
+
bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeFakeEmail)
|
|
66
67
|
});
|
|
67
68
|
}
|
|
68
69
|
/**
|
|
@@ -74,10 +75,10 @@ export function isTestAddress(to) {
|
|
|
74
75
|
&& "email" in to
|
|
75
76
|
&& to.email.toLowerCase().endsWith(".test")));
|
|
76
77
|
}
|
|
77
|
-
function renderFake(addr,
|
|
78
|
+
function renderFake(addr, makeEmail) {
|
|
78
79
|
return {
|
|
79
80
|
name: renderMailData(addr),
|
|
80
|
-
email:
|
|
81
|
+
email: makeEmail()
|
|
81
82
|
};
|
|
82
83
|
}
|
|
83
84
|
const eq = Equivalence.mapInput(Equivalence.String, (to) => typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase());
|
|
@@ -86,11 +87,11 @@ function isEmailDataArray(md) {
|
|
|
86
87
|
}
|
|
87
88
|
// TODO: should just not add any already added email address
|
|
88
89
|
// https://stackoverflow.com/a/53603076/11595834
|
|
89
|
-
function renderFakeIfTest(addr,
|
|
90
|
+
function renderFakeIfTest(addr, makeEmail) {
|
|
90
91
|
if (isEmailDataArray(addr)) {
|
|
91
|
-
return Array.dedupeWith(addr.map((x) => (isTestAddress(x) ? renderFake(x,
|
|
92
|
+
return Array.dedupeWith(addr.map((x) => (isTestAddress(x) ? renderFake(x, makeEmail) : x)), eq);
|
|
92
93
|
}
|
|
93
|
-
return isTestAddress(addr) ? renderFake(addr,
|
|
94
|
+
return isTestAddress(addr) ? renderFake(addr, makeEmail) : addr;
|
|
94
95
|
}
|
|
95
96
|
function renderMailData(md) {
|
|
96
97
|
if (isEmailDataArray(md)) {
|
|
@@ -101,4 +102,4 @@ function renderMailData(md) {
|
|
|
101
102
|
}
|
|
102
103
|
return md.email;
|
|
103
104
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZGdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvRW1haWxlci9TZW5kZ3JpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBaUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXBILE1BQU0sWUFBWSxHQUFHLENBQ25CLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQWtCLEVBQ2pHLEVBQUUsQ0FDRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUNmLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBRXhDLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoQixRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLElBQTBCO1lBQzNFLE1BQU0sR0FBRyxHQUFhLGNBQWMsQ0FBQztnQkFDbkMsR0FBRyxJQUFJO2dCQUNQLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVc7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7YUFDbEUsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFBO1lBRXhELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQyxNQUFNLFdBQVcsR0FBRztnQkFDbEIsR0FBRyxZQUFvRDtnQkFDdkQsT0FBTyxFQUFFLEdBQUcsYUFBYSxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xELEdBQUcsU0FBUyxJQUFJLFlBQVk7b0JBQzFCLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBb0MsRUFBRTtvQkFDM0UsQ0FBQyxDQUFDLEVBQUU7YUFDUCxDQUFBO1lBQ0QsS0FBSyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRTdHLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07aUJBQ3RCLFFBQVEsQ0FJUCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1QsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUNkLFdBQWtCLEVBQUUsU0FBUztZQUM3QixHQUFHLENBQUMsVUFBVSxJQUFJLElBQUksRUFDdEIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDZCxHQUFHO2dCQUNELENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ3hDLENBQ0o7aUJBQ0EsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFFN0Qsa0JBQWtCO1lBQ2xCLHVCQUF1QjtZQUN2QixrQkFBa0I7WUFDbEIsaUNBQWlDO1lBQ2pDLE1BQU07WUFDTixJQUFJO1lBQ0osNkZBQTZGO1lBQzdGLGlEQUFpRDtZQUNqRCxvQkFBb0I7WUFDcEIsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDLENBQUM7S0FDSCxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQTtBQUVKLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBc0I7SUFDN0MsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBQzlDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsU0FBa0IsRUFBRSxlQUF1QjtJQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDVCxNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUN4QixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQzVFLE9BQU8sU0FBUztRQUNkLENBQUMsQ0FBQyxDQUFDLEdBQWEsRUFBRSxFQUFFLENBQ2xCLGNBQWMsQ0FBQztZQUNiLEdBQUcsR0FBRztZQUNOLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQztZQUMvQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQUM7WUFDL0MsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDO1NBQ25ELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRSxDQUNsQixjQUFjLENBQUM7WUFDYixHQUFHLEdBQUc7WUFDTixFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQztZQUNyRCxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQztZQUNyRCxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQztTQUN6RCxDQUFDLENBQUE7QUFDUixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEVBQWE7SUFDekMsT0FBTyxDQUNMLENBQUMsT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7V0FDM0QsQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRO2VBQ3JCLE9BQU8sSUFBSSxFQUFFO2VBQ2IsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDL0MsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFzQyxFQUFFLFNBQXVCO0lBQ2pGLE9BQU87UUFDTCxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQztRQUMxQixLQUFLLEVBQUUsU0FBUyxFQUFFO0tBQ25CLENBQUE7QUFDSCxDQUFDO0FBQ0QsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FDN0IsV0FBVyxDQUFDLE1BQU0sRUFDbEIsQ0FBQyxFQUE2QyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FDdEgsQ0FBQTtBQUVELFNBQVMsZ0JBQWdCLENBQUMsRUFBb0M7SUFDNUQsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNyQyxDQUFDO0FBRUQsNERBQTREO0FBQzVELGdEQUFnRDtBQUNoRCxTQUFTLGdCQUFnQixDQUFDLElBQXNDLEVBQUUsU0FBdUI7SUFDdkYsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2xFLEVBQUUsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7QUFDakUsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQW9DO0lBQzFELElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFDRCxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQTtBQUNqQixDQUFDIn0=
|
|
@@ -24,6 +24,12 @@ export interface SendgridConfig {
|
|
|
24
24
|
realMail: boolean;
|
|
25
25
|
defaultFrom: EmailData;
|
|
26
26
|
apiKey: Redacted.Redacted<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Email address used for fake/test recipients. Use `{i}` as a placeholder for an auto-incrementing index to ensure uniqueness.
|
|
29
|
+
*
|
|
30
|
+
* @example "test+{i}@example.com"
|
|
31
|
+
*/
|
|
32
|
+
fakeMailAddress: string;
|
|
27
33
|
}
|
|
28
34
|
export type EmailTemplateMsg = MailData & {
|
|
29
35
|
templateId: string;
|
|
@@ -52,4 +58,4 @@ export type EmailContent = {
|
|
|
52
58
|
export type EmailMsg = EmailMsgBase & EmailContent;
|
|
53
59
|
export type EmailMsgOptionalFrom = Omit<EmailMsgBase, "from"> & Partial<Pick<EmailMsg, "from">> & EmailContent;
|
|
54
60
|
export {};
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0VtYWlsZXIvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDOUUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBUSxLQUFLLE1BQU0sRUFBRSxLQUFLLHFCQUFxQixFQUFFLEtBQUssUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2xHLE9BQU8sS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBOzs7O0FBRTlDLHFCQUFhLGFBQWMsU0FBUSxtQkFBa0M7SUFDbkUsUUFBUSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsYUFBYSxDQUFBO0NBQ3BDLENBQUM7Q0FBRzs7Y0FHTyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUM7O0FBRDdFLHFCQUFhLE9BQVEsU0FBUSxZQUVIO0NBQUc7QUFFN0IsTUFBTSxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUc7SUFDOUIsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFBO0lBQ2IsS0FBSyxFQUFFLEtBQUssQ0FBQTtDQUNiLENBQUE7QUFFRCxNQUFNLFdBQVcsY0FBYztJQUM3QixjQUFjLENBQUMsRUFBRSxTQUFTLENBQUE7SUFDMUIsYUFBYSxFQUFFLE1BQU0sQ0FBQTtJQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFBO0lBQ2pCLFdBQVcsRUFBRSxTQUFTLENBQUE7SUFDdEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDakM7Ozs7T0FJRztJQUNILGVBQWUsRUFBRSxNQUFNLENBQUE7Q0FDeEI7QUFDRCxNQUFNLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxHQUFHO0lBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQTtDQUFFLENBQUE7QUFFaEUsTUFBTSxNQUFNLGVBQWUsR0FBRyxTQUFTLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUUsTUFBTSxNQUFNLFlBQVksR0FDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLEdBQ3hEO0lBQ0EsRUFBRSxFQUFFLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRCxFQUFFLENBQUMsRUFBRSxTQUFTLEdBQUcscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDakQsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2xELElBQUksRUFBRSxTQUFTLENBQUE7SUFDZjs7O09BR0c7SUFDSCxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUE7Q0FDckIsQ0FBQTtBQUVILE1BQU0sTUFBTSxZQUFZLEdBQUc7SUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFBO0NBQUUsR0FBRztJQUFFLElBQUksRUFBRSxNQUFNLENBQUE7Q0FBRSxHQUFHO0lBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQTtDQUFFLEdBQUc7SUFDeEYsT0FBTyxFQUFFLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFBO0NBQzVDLENBQUE7QUFFRCxNQUFNLE1BQU0sUUFBUSxHQUNoQixZQUFZLEdBQ1osWUFBWSxDQUFBO0FBRWhCLE1BQU0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFBIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/Emailer/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAQ,KAAK,MAAM,EAAE,KAAK,qBAAqB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAClG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;;;;AAE9C,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,aAAa,CAAA;CACpC,CAAC;CAAG;;cAGO,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAD7E,qBAAa,OAAQ,SAAQ,YAEH;CAAG;AAE7B,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,SAAS,CAAA;IACtB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/Emailer/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAQ,KAAK,MAAM,EAAE,KAAK,qBAAqB,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAA;AAClG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;;;;AAE9C,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,aAAa,CAAA;CACpC,CAAC;CAAG;;cAGO,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAD7E,qBAAa,OAAQ,SAAQ,YAEH;CAAG;AAE7B,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,SAAS,CAAA;IACtB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjC;;;;OAIG;IACH,eAAe,EAAE,MAAM,CAAA;CACxB;AACD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;AAE1E,MAAM,MAAM,YAAY,GACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GACxD;IACA,EAAE,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IAChD,EAAE,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IACjD,GAAG,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IAClD,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IACxF,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,YAAY,CAAA;AAEhB,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.140",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.140"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.3",
|
package/src/Emailer/Sendgrid.ts
CHANGED
|
@@ -7,7 +7,9 @@ import { inspect } from "util"
|
|
|
7
7
|
import { InfraLogger } from "../logger.js"
|
|
8
8
|
import { Emailer, type EmailMsg, type EmailMsgOptionalFrom, type SendgridConfig, SendMailError } from "./service.js"
|
|
9
9
|
|
|
10
|
-
const makeSendgrid = (
|
|
10
|
+
const makeSendgrid = (
|
|
11
|
+
{ apiKey, defaultFrom, defaultReplyTo, fakeMailAddress, realMail, subjectPrefix }: SendgridConfig
|
|
12
|
+
) =>
|
|
11
13
|
Effect.sync(() => {
|
|
12
14
|
sgMail.setApiKey(Redacted.value(apiKey))
|
|
13
15
|
|
|
@@ -18,7 +20,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
18
20
|
from: msg_.from ?? defaultFrom,
|
|
19
21
|
replyTo: msg_.replyTo ?? (msg_.from ? undefined : defaultReplyTo)
|
|
20
22
|
})
|
|
21
|
-
const render = renderMessage(!realMail)
|
|
23
|
+
const render = renderMessage(!realMail, fakeMailAddress)
|
|
22
24
|
|
|
23
25
|
const renderedMsg_ = render(msg)
|
|
24
26
|
const renderedMsg = {
|
|
@@ -68,23 +70,24 @@ export function Sendgrid(config: SendgridConfig) {
|
|
|
68
70
|
/**
|
|
69
71
|
* @hidden
|
|
70
72
|
*/
|
|
71
|
-
export function renderMessage(forceFake: boolean) {
|
|
73
|
+
export function renderMessage(forceFake: boolean, fakeMailAddress: string) {
|
|
72
74
|
let i = 0
|
|
73
75
|
const makeId = () => i++
|
|
76
|
+
const makeFakeEmail = () => fakeMailAddress.replace("{i}", String(makeId()))
|
|
74
77
|
return forceFake
|
|
75
78
|
? (msg: EmailMsg) =>
|
|
76
79
|
dropUndefinedT({
|
|
77
80
|
...msg,
|
|
78
|
-
to: msg.to && renderFake(msg.to,
|
|
79
|
-
cc: msg.cc && renderFake(msg.cc,
|
|
80
|
-
bcc: msg.bcc && renderFake(msg.bcc,
|
|
81
|
+
to: msg.to && renderFake(msg.to, makeFakeEmail),
|
|
82
|
+
cc: msg.cc && renderFake(msg.cc, makeFakeEmail),
|
|
83
|
+
bcc: msg.bcc && renderFake(msg.bcc, makeFakeEmail)
|
|
81
84
|
})
|
|
82
85
|
: (msg: EmailMsg) =>
|
|
83
86
|
dropUndefinedT({
|
|
84
87
|
...msg,
|
|
85
|
-
to: msg.to && renderFakeIfTest(msg.to,
|
|
86
|
-
cc: msg.cc && renderFakeIfTest(msg.cc,
|
|
87
|
-
bcc: msg.bcc && renderFakeIfTest(msg.bcc,
|
|
88
|
+
to: msg.to && renderFakeIfTest(msg.to, makeFakeEmail),
|
|
89
|
+
cc: msg.cc && renderFakeIfTest(msg.cc, makeFakeEmail),
|
|
90
|
+
bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeFakeEmail)
|
|
88
91
|
})
|
|
89
92
|
}
|
|
90
93
|
|
|
@@ -100,10 +103,10 @@ export function isTestAddress(to: EmailData) {
|
|
|
100
103
|
)
|
|
101
104
|
}
|
|
102
105
|
|
|
103
|
-
function renderFake(addr: EmailData | readonly EmailData[],
|
|
106
|
+
function renderFake(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
|
|
104
107
|
return {
|
|
105
108
|
name: renderMailData(addr),
|
|
106
|
-
email:
|
|
109
|
+
email: makeEmail()
|
|
107
110
|
}
|
|
108
111
|
}
|
|
109
112
|
const eq = Equivalence.mapInput(
|
|
@@ -117,14 +120,14 @@ function isEmailDataArray(md: EmailData | readonly EmailData[]): md is readonly
|
|
|
117
120
|
|
|
118
121
|
// TODO: should just not add any already added email address
|
|
119
122
|
// https://stackoverflow.com/a/53603076/11595834
|
|
120
|
-
function renderFakeIfTest(addr: EmailData | readonly EmailData[],
|
|
123
|
+
function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeEmail: () => string) {
|
|
121
124
|
if (isEmailDataArray(addr)) {
|
|
122
125
|
return Array.dedupeWith(
|
|
123
|
-
addr.map((x) => (isTestAddress(x) ? renderFake(x,
|
|
126
|
+
addr.map((x) => (isTestAddress(x) ? renderFake(x, makeEmail) : x)),
|
|
124
127
|
eq
|
|
125
128
|
)
|
|
126
129
|
}
|
|
127
|
-
return isTestAddress(addr) ? renderFake(addr,
|
|
130
|
+
return isTestAddress(addr) ? renderFake(addr, makeEmail) : addr
|
|
128
131
|
}
|
|
129
132
|
|
|
130
133
|
function renderMailData(md: EmailData | readonly EmailData[]): string {
|
package/src/Emailer/service.ts
CHANGED
|
@@ -22,6 +22,12 @@ export interface SendgridConfig {
|
|
|
22
22
|
realMail: boolean
|
|
23
23
|
defaultFrom: EmailData
|
|
24
24
|
apiKey: Redacted.Redacted<string>
|
|
25
|
+
/**
|
|
26
|
+
* Email address used for fake/test recipients. Use `{i}` as a placeholder for an auto-incrementing index to ensure uniqueness.
|
|
27
|
+
*
|
|
28
|
+
* @example "test+{i}@example.com"
|
|
29
|
+
*/
|
|
30
|
+
fakeMailAddress: string
|
|
25
31
|
}
|
|
26
32
|
export type EmailTemplateMsg = MailData & { templateId: string }
|
|
27
33
|
|