@webiny/api-mailer 5.30.0-beta.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # @webiny/api-mailer
2
+ [![](https://img.shields.io/npm/dw/@webiny/api-mailer.svg)](https://www.npmjs.com/package/@webiny/api-mailer)
3
+ [![](https://img.shields.io/npm/v/@webiny/api-mailer.svg)](https://www.npmjs.com/package/@webiny/api-mailer)
4
+ [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
5
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
6
+
7
+
8
+ ## Install
9
+ ```
10
+ yarn add @webiny/api-mailer
11
+ ```
12
+
13
+ ## Documentation
14
+ [Webiny Documentation > Overview > Features > Mailer](https://www.webiny.com/docs/overview/features/mailer)
package/context.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { ContextPlugin } from "@webiny/handler";
2
+ import { MailerConfig, MailerContext } from "./types";
3
+ export declare const createMailerContext: (config?: MailerConfig) => ContextPlugin<MailerContext>;
package/context.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createMailerContext = void 0;
7
+
8
+ var _handler = require("@webiny/handler");
9
+
10
+ var _mailer = require("./crud/mailer.crud");
11
+
12
+ const createMailerContext = config => {
13
+ return new _handler.ContextPlugin(async context => {
14
+ context.mailer = (0, _mailer.createMailerCrud)(config);
15
+ });
16
+ };
17
+
18
+ exports.createMailerContext = createMailerContext;
package/context.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createMailerContext","config","ContextPlugin","context","mailer","createMailerCrud"],"sources":["context.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/handler\";\nimport { MailerConfig, MailerContext } from \"./types\";\nimport { createMailerCrud } from \"~/crud/mailer.crud\";\n\nexport const createMailerContext = (config?: MailerConfig) => {\n return new ContextPlugin<MailerContext>(async context => {\n context.mailer = createMailerCrud(config);\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AAEO,MAAMA,mBAAmB,GAAIC,MAAD,IAA2B;EAC1D,OAAO,IAAIC,sBAAJ,CAAiC,MAAMC,OAAN,IAAiB;IACrDA,OAAO,CAACC,MAAR,GAAiB,IAAAC,wBAAA,EAAiBJ,MAAjB,CAAjB;EACH,CAFM,CAAP;AAGH,CAJM"}
@@ -0,0 +1,7 @@
1
+ import { Topic } from "@webiny/pubsub/types";
2
+ import { OnBeforeMailerSendParams } from "../../types";
3
+ interface AttachOnBeforeSendParams {
4
+ onBeforeSend: Topic<OnBeforeMailerSendParams>;
5
+ }
6
+ export declare const attachOnBeforeSend: (params: AttachOnBeforeSendParams) => void;
7
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.attachOnBeforeSend = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _joi = _interopRequireDefault(require("joi"));
13
+
14
+ var _error = _interopRequireDefault(require("@webiny/error"));
15
+
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
19
+
20
+ const requiredString = _joi.default.string().required();
21
+
22
+ const requiredEmail = requiredString.email();
23
+
24
+ const schema = _joi.default.object({
25
+ to: _joi.default.array().items(requiredEmail).required(),
26
+ from: requiredEmail,
27
+ subject: requiredString.max(1024),
28
+ cc: _joi.default.array().items(requiredEmail),
29
+ bcc: _joi.default.array().items(requiredEmail),
30
+ replyTo: _joi.default.string().email(),
31
+ text: requiredString.min(10),
32
+ html: _joi.default.string()
33
+ });
34
+
35
+ const attachOnBeforeSend = params => {
36
+ const {
37
+ onBeforeSend
38
+ } = params;
39
+ onBeforeSend.subscribe(async ({
40
+ data: input
41
+ }) => {
42
+ let result;
43
+
44
+ try {
45
+ result = await schema.validate(input);
46
+
47
+ if (!result.error) {
48
+ return;
49
+ }
50
+ } catch (ex) {
51
+ throw new _error.default({
52
+ message: "Error while validating e-mail params.",
53
+ code: "VALIDATION_ERROR",
54
+ data: {
55
+ input,
56
+ error: ex
57
+ }
58
+ });
59
+ }
60
+
61
+ throw new _error.default({
62
+ message: "Error while validating e-mail params.",
63
+ code: "VALIDATION_ERROR",
64
+ data: _objectSpread({}, result.error)
65
+ });
66
+ });
67
+ };
68
+
69
+ exports.attachOnBeforeSend = attachOnBeforeSend;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["requiredString","joi","string","required","requiredEmail","email","schema","object","to","array","items","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnBeforeSend","params","onBeforeSend","subscribe","data","input","result","validate","error","ex","WebinyError","message","code"],"sources":["onBeforeSend.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { MailerSendData, OnBeforeMailerSendParams } from \"~/types\";\nimport joi from \"joi\";\nimport WebinyError from \"@webiny/error\";\n\nconst requiredString = joi.string().required();\nconst requiredEmail = requiredString.email();\n\nconst schema = joi.object<MailerSendData>({\n to: joi.array().items(requiredEmail).required(),\n from: requiredEmail,\n subject: requiredString.max(1024),\n cc: joi.array().items(requiredEmail),\n bcc: joi.array().items(requiredEmail),\n replyTo: joi.string().email(),\n text: requiredString.min(10),\n html: joi.string()\n});\n\ninterface AttachOnBeforeSendParams {\n onBeforeSend: Topic<OnBeforeMailerSendParams>;\n}\nexport const attachOnBeforeSend = (params: AttachOnBeforeSendParams) => {\n const { onBeforeSend } = params;\n\n onBeforeSend.subscribe(async ({ data: input }) => {\n let result: joi.ValidationResult<MailerSendData>;\n try {\n result = await schema.validate(input);\n\n if (!result.error) {\n return;\n }\n } catch (ex) {\n throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n input,\n error: ex\n }\n });\n }\n throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n ...result.error\n }\n });\n });\n};\n"],"mappings":";;;;;;;;;;;AAEA;;AACA;;;;;;AAEA,MAAMA,cAAc,GAAGC,YAAA,CAAIC,MAAJ,GAAaC,QAAb,EAAvB;;AACA,MAAMC,aAAa,GAAGJ,cAAc,CAACK,KAAf,EAAtB;;AAEA,MAAMC,MAAM,GAAGL,YAAA,CAAIM,MAAJ,CAA2B;EACtCC,EAAE,EAAEP,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,EAAiCD,QAAjC,EADkC;EAEtCQ,IAAI,EAAEP,aAFgC;EAGtCQ,OAAO,EAAEZ,cAAc,CAACa,GAAf,CAAmB,IAAnB,CAH6B;EAItCC,EAAE,EAAEb,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CAJkC;EAKtCW,GAAG,EAAEd,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CALiC;EAMtCY,OAAO,EAAEf,YAAA,CAAIC,MAAJ,GAAaG,KAAb,EAN6B;EAOtCY,IAAI,EAAEjB,cAAc,CAACkB,GAAf,CAAmB,EAAnB,CAPgC;EAQtCC,IAAI,EAAElB,YAAA,CAAIC,MAAJ;AARgC,CAA3B,CAAf;;AAcO,MAAMkB,kBAAkB,GAAIC,MAAD,IAAsC;EACpE,MAAM;IAAEC;EAAF,IAAmBD,MAAzB;EAEAC,YAAY,CAACC,SAAb,CAAuB,OAAO;IAAEC,IAAI,EAAEC;EAAR,CAAP,KAA2B;IAC9C,IAAIC,MAAJ;;IACA,IAAI;MACAA,MAAM,GAAG,MAAMpB,MAAM,CAACqB,QAAP,CAAgBF,KAAhB,CAAf;;MAEA,IAAI,CAACC,MAAM,CAACE,KAAZ,EAAmB;QACf;MACH;IACJ,CAND,CAME,OAAOC,EAAP,EAAW;MACT,MAAM,IAAIC,cAAJ,CAAgB;QAClBC,OAAO,EAAE,uCADS;QAElBC,IAAI,EAAE,kBAFY;QAGlBR,IAAI,EAAE;UACFC,KADE;UAEFG,KAAK,EAAEC;QAFL;MAHY,CAAhB,CAAN;IAQH;;IACD,MAAM,IAAIC,cAAJ,CAAgB;MAClBC,OAAO,EAAE,uCADS;MAElBC,IAAI,EAAE,kBAFY;MAGlBR,IAAI,oBACGE,MAAM,CAACE,KADV;IAHc,CAAhB,CAAN;EAOH,CAzBD;AA0BH,CA7BM"}
@@ -0,0 +1,2 @@
1
+ import { MailerConfig, MailerContextObject } from "../types";
2
+ export declare const createMailerCrud: (config?: MailerConfig) => MailerContextObject;
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createMailerCrud = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _pubsub = require("@webiny/pubsub");
13
+
14
+ var _onBeforeSend = require("./mailer/onBeforeSend");
15
+
16
+ var _error = _interopRequireDefault(require("@webiny/error"));
17
+
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
+
26
+ const createDefaultMailer = async () => {
27
+ return Promise.resolve().then(() => _interopRequireWildcard(require("../mailers/createSmtpMailer"))).then(module => {
28
+ return module.createSmtpMailer();
29
+ });
30
+ };
31
+
32
+ const createMailerCrud = config => {
33
+ let defaultMailer = (config === null || config === void 0 ? void 0 : config.mailer) || createDefaultMailer;
34
+ /**
35
+ * We define possible events to be hooked into.
36
+ */
37
+
38
+ const onBeforeSend = (0, _pubsub.createTopic)();
39
+ const onAfterSend = (0, _pubsub.createTopic)();
40
+ const onError = (0, _pubsub.createTopic)();
41
+ /**
42
+ * We attach our default ones.
43
+ */
44
+
45
+ (0, _onBeforeSend.attachOnBeforeSend)({
46
+ onBeforeSend
47
+ });
48
+ let initializedMailer;
49
+
50
+ const getMailer = async () => {
51
+ if (initializedMailer) {
52
+ return initializedMailer;
53
+ } else if (!defaultMailer) {
54
+ throw new _error.default({
55
+ message: "Mailer is not set.",
56
+ code: "MAILER_NOT_SET_ERROR"
57
+ });
58
+ } else if (typeof defaultMailer === "function") {
59
+ try {
60
+ initializedMailer = await defaultMailer();
61
+ return initializedMailer;
62
+ } catch (ex) {
63
+ throw new _error.default({
64
+ message: "Error while getting mailer.",
65
+ code: "MAILER_ERROR",
66
+ data: {
67
+ error: ex
68
+ }
69
+ });
70
+ }
71
+ }
72
+
73
+ initializedMailer = defaultMailer;
74
+ return initializedMailer;
75
+ };
76
+
77
+ return {
78
+ onBeforeSend,
79
+ onAfterSend,
80
+ onError,
81
+ getMailer,
82
+ setMailer: target => {
83
+ initializedMailer = undefined;
84
+ defaultMailer = target;
85
+ },
86
+ send: async ({
87
+ data
88
+ }) => {
89
+ const mailer = await getMailer();
90
+
91
+ try {
92
+ await onBeforeSend.publish({
93
+ data
94
+ });
95
+ const response = await mailer.send(data);
96
+ await onAfterSend.publish({
97
+ data
98
+ });
99
+ return {
100
+ result: response.result,
101
+ error: response.error
102
+ };
103
+ } catch (ex) {
104
+ await onError.publish({
105
+ error: ex,
106
+ data
107
+ });
108
+ return {
109
+ result: null,
110
+ error: {
111
+ message: ex.message,
112
+ code: ex.code,
113
+ data: _objectSpread({
114
+ data
115
+ }, ex.data)
116
+ }
117
+ };
118
+ }
119
+ }
120
+ };
121
+ };
122
+
123
+ exports.createMailerCrud = createMailerCrud;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createDefaultMailer","then","module","createSmtpMailer","createMailerCrud","config","defaultMailer","mailer","onBeforeSend","createTopic","onAfterSend","onError","attachOnBeforeSend","initializedMailer","getMailer","WebinyError","message","code","ex","data","error","setMailer","target","undefined","send","publish","response","result"],"sources":["mailer.crud.ts"],"sourcesContent":["import {\n MailerConfig,\n MailerContextObject,\n Mailer,\n MailerSetterParams,\n OnAfterMailerSendParams,\n OnBeforeMailerSendParams,\n OnErrorMailerParams\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { attachOnBeforeSend } from \"~/crud/mailer/onBeforeSend\";\nimport WebinyError from \"@webiny/error\";\n\nconst createDefaultMailer = async () => {\n return import(\"~/mailers/createSmtpMailer\").then(module => {\n return module.createSmtpMailer();\n });\n};\n\nexport const createMailerCrud = (config?: MailerConfig): MailerContextObject => {\n let defaultMailer: MailerSetterParams | undefined = config?.mailer || createDefaultMailer;\n /**\n * We define possible events to be hooked into.\n */\n const onBeforeSend = createTopic<OnBeforeMailerSendParams>();\n const onAfterSend = createTopic<OnAfterMailerSendParams>();\n const onError = createTopic<OnErrorMailerParams>();\n /**\n * We attach our default ones.\n */\n attachOnBeforeSend({\n onBeforeSend\n });\n\n let initializedMailer: Mailer | undefined;\n\n const getMailer = async <T extends Mailer = Mailer>(): Promise<T> => {\n if (initializedMailer) {\n return initializedMailer as T;\n } else if (!defaultMailer) {\n throw new WebinyError({\n message: \"Mailer is not set.\",\n code: \"MAILER_NOT_SET_ERROR\"\n });\n } else if (typeof defaultMailer === \"function\") {\n try {\n initializedMailer = await defaultMailer();\n\n return initializedMailer as T;\n } catch (ex) {\n throw new WebinyError({\n message: \"Error while getting mailer.\",\n code: \"MAILER_ERROR\",\n data: {\n error: ex\n }\n });\n }\n }\n initializedMailer = defaultMailer;\n return initializedMailer as T;\n };\n\n return {\n onBeforeSend,\n onAfterSend,\n onError,\n getMailer,\n setMailer: target => {\n initializedMailer = undefined;\n defaultMailer = target;\n },\n send: async ({ data }) => {\n const mailer = await getMailer();\n try {\n await onBeforeSend.publish({\n data\n });\n const response = await mailer.send(data);\n await onAfterSend.publish({\n data\n });\n\n return {\n result: response.result,\n error: response.error\n };\n } catch (ex) {\n await onError.publish({\n error: ex,\n data\n });\n return {\n result: null,\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n data,\n ...ex.data\n }\n }\n };\n }\n }\n };\n};\n"],"mappings":";;;;;;;;;;;AASA;;AACA;;AACA;;;;;;;;;;AAEA,MAAMA,mBAAmB,GAAG,YAAY;EACpC,OAAO,8FAAqCC,IAArC,CAA0CC,MAAM,IAAI;IACvD,OAAOA,MAAM,CAACC,gBAAP,EAAP;EACH,CAFM,CAAP;AAGH,CAJD;;AAMO,MAAMC,gBAAgB,GAAIC,MAAD,IAAgD;EAC5E,IAAIC,aAA6C,GAAG,CAAAD,MAAM,SAAN,IAAAA,MAAM,WAAN,YAAAA,MAAM,CAAEE,MAAR,KAAkBP,mBAAtE;EACA;AACJ;AACA;;EACI,MAAMQ,YAAY,GAAG,IAAAC,mBAAA,GAArB;EACA,MAAMC,WAAW,GAAG,IAAAD,mBAAA,GAApB;EACA,MAAME,OAAO,GAAG,IAAAF,mBAAA,GAAhB;EACA;AACJ;AACA;;EACI,IAAAG,gCAAA,EAAmB;IACfJ;EADe,CAAnB;EAIA,IAAIK,iBAAJ;;EAEA,MAAMC,SAAS,GAAG,YAAmD;IACjE,IAAID,iBAAJ,EAAuB;MACnB,OAAOA,iBAAP;IACH,CAFD,MAEO,IAAI,CAACP,aAAL,EAAoB;MACvB,MAAM,IAAIS,cAAJ,CAAgB;QAClBC,OAAO,EAAE,oBADS;QAElBC,IAAI,EAAE;MAFY,CAAhB,CAAN;IAIH,CALM,MAKA,IAAI,OAAOX,aAAP,KAAyB,UAA7B,EAAyC;MAC5C,IAAI;QACAO,iBAAiB,GAAG,MAAMP,aAAa,EAAvC;QAEA,OAAOO,iBAAP;MACH,CAJD,CAIE,OAAOK,EAAP,EAAW;QACT,MAAM,IAAIH,cAAJ,CAAgB;UAClBC,OAAO,EAAE,6BADS;UAElBC,IAAI,EAAE,cAFY;UAGlBE,IAAI,EAAE;YACFC,KAAK,EAAEF;UADL;QAHY,CAAhB,CAAN;MAOH;IACJ;;IACDL,iBAAiB,GAAGP,aAApB;IACA,OAAOO,iBAAP;EACH,CAzBD;;EA2BA,OAAO;IACHL,YADG;IAEHE,WAFG;IAGHC,OAHG;IAIHG,SAJG;IAKHO,SAAS,EAAEC,MAAM,IAAI;MACjBT,iBAAiB,GAAGU,SAApB;MACAjB,aAAa,GAAGgB,MAAhB;IACH,CARE;IASHE,IAAI,EAAE,OAAO;MAAEL;IAAF,CAAP,KAAoB;MACtB,MAAMZ,MAAM,GAAG,MAAMO,SAAS,EAA9B;;MACA,IAAI;QACA,MAAMN,YAAY,CAACiB,OAAb,CAAqB;UACvBN;QADuB,CAArB,CAAN;QAGA,MAAMO,QAAQ,GAAG,MAAMnB,MAAM,CAACiB,IAAP,CAAYL,IAAZ,CAAvB;QACA,MAAMT,WAAW,CAACe,OAAZ,CAAoB;UACtBN;QADsB,CAApB,CAAN;QAIA,OAAO;UACHQ,MAAM,EAAED,QAAQ,CAACC,MADd;UAEHP,KAAK,EAAEM,QAAQ,CAACN;QAFb,CAAP;MAIH,CAbD,CAaE,OAAOF,EAAP,EAAW;QACT,MAAMP,OAAO,CAACc,OAAR,CAAgB;UAClBL,KAAK,EAAEF,EADW;UAElBC;QAFkB,CAAhB,CAAN;QAIA,OAAO;UACHQ,MAAM,EAAE,IADL;UAEHP,KAAK,EAAE;YACHJ,OAAO,EAAEE,EAAE,CAACF,OADT;YAEHC,IAAI,EAAEC,EAAE,CAACD,IAFN;YAGHE,IAAI;cACAA;YADA,GAEGD,EAAE,CAACC,IAFN;UAHD;QAFJ,CAAP;MAWH;IACJ;EAzCE,CAAP;AA2CH,CAvFM"}
package/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { PluginCollection } from "@webiny/plugins/types";
2
+ import { MailerConfig } from "./types";
3
+ import { createDummyMailer, DummyMailer } from "./mailers/createDummyMailer";
4
+ import { createSmtpMailer, SmtpMailerConfig, SmtpMailer } from "./mailers/createSmtpMailer";
5
+ export { createDummyMailer, createSmtpMailer };
6
+ export type { SmtpMailerConfig, SmtpMailer, DummyMailer };
7
+ export declare const createMailer: (config?: MailerConfig) => PluginCollection;
package/index.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "createDummyMailer", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _createDummyMailer.createDummyMailer;
10
+ }
11
+ });
12
+ exports.createMailer = void 0;
13
+ Object.defineProperty(exports, "createSmtpMailer", {
14
+ enumerable: true,
15
+ get: function () {
16
+ return _createSmtpMailer.createSmtpMailer;
17
+ }
18
+ });
19
+
20
+ var _context = require("./context");
21
+
22
+ var _createDummyMailer = require("./mailers/createDummyMailer");
23
+
24
+ var _createSmtpMailer = require("./mailers/createSmtpMailer");
25
+
26
+ const createMailer = config => {
27
+ return [(0, _context.createMailerContext)(config)];
28
+ };
29
+
30
+ exports.createMailer = createMailer;
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createMailer","config","createMailerContext"],"sources":["index.ts"],"sourcesContent":["import { PluginCollection } from \"@webiny/plugins/types\";\nimport { createMailerContext } from \"~/context\";\nimport { MailerConfig } from \"~/types\";\nimport { createDummyMailer, DummyMailer } from \"~/mailers/createDummyMailer\";\nimport { createSmtpMailer, SmtpMailerConfig, SmtpMailer } from \"~/mailers/createSmtpMailer\";\n\nexport { createDummyMailer, createSmtpMailer };\nexport type { SmtpMailerConfig, SmtpMailer, DummyMailer };\n\nexport const createMailer = (config?: MailerConfig): PluginCollection => {\n return [createMailerContext(config)];\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AACA;;AAEA;;AACA;;AAKO,MAAMA,YAAY,GAAIC,MAAD,IAA6C;EACrE,OAAO,CAAC,IAAAC,4BAAA,EAAoBD,MAApB,CAAD,CAAP;AACH,CAFM"}
@@ -0,0 +1,5 @@
1
+ import { Mailer, MailerSendData } from "../types";
2
+ export interface DummyMailer extends Mailer {
3
+ getAllSent: () => MailerSendData[];
4
+ }
5
+ export declare const createDummyMailer: () => DummyMailer;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createDummyMailer = void 0;
7
+
8
+ const createDummyMailer = () => {
9
+ const sent = [];
10
+ return {
11
+ send: async params => {
12
+ sent.push(params);
13
+ return {
14
+ result: true,
15
+ error: null
16
+ };
17
+ },
18
+ getAllSent: () => {
19
+ return sent;
20
+ }
21
+ };
22
+ };
23
+
24
+ exports.createDummyMailer = createDummyMailer;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createDummyMailer","sent","send","params","push","result","error","getAllSent"],"sources":["createDummyMailer.ts"],"sourcesContent":["import { Mailer, MailerSendData } from \"~/types\";\n\nexport interface DummyMailer extends Mailer {\n getAllSent: () => MailerSendData[];\n}\nexport const createDummyMailer = (): DummyMailer => {\n const sent: MailerSendData[] = [];\n\n return {\n send: async params => {\n sent.push(params);\n return {\n result: true,\n error: null\n };\n },\n getAllSent: () => {\n return sent;\n }\n };\n};\n"],"mappings":";;;;;;;AAKO,MAAMA,iBAAiB,GAAG,MAAmB;EAChD,MAAMC,IAAsB,GAAG,EAA/B;EAEA,OAAO;IACHC,IAAI,EAAE,MAAMC,MAAN,IAAgB;MAClBF,IAAI,CAACG,IAAL,CAAUD,MAAV;MACA,OAAO;QACHE,MAAM,EAAE,IADL;QAEHC,KAAK,EAAE;MAFJ,CAAP;IAIH,CAPE;IAQHC,UAAU,EAAE,MAAM;MACd,OAAON,IAAP;IACH;EAVE,CAAP;AAYH,CAfM"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Nodemailer docs
3
+ * https://nodemailer.com/about/
4
+ */
5
+ import { Mailer } from "../types";
6
+ import { Transporter } from "nodemailer";
7
+ import SMTPTransport, { Options } from "nodemailer/lib/smtp-transport";
8
+ import { DummyMailer } from "./createDummyMailer";
9
+ export declare type SmtpMailerConfig = Options;
10
+ export interface SmtpMailer extends Mailer {
11
+ transporter: Transporter<SMTPTransport.SentMessageInfo>;
12
+ }
13
+ export declare const createSmtpMailer: (config?: SmtpMailerConfig) => SmtpMailer | DummyMailer;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.createSmtpMailer = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+
14
+ var _nodemailer = _interopRequireDefault(require("nodemailer"));
15
+
16
+ var _createDummyMailer = require("./createDummyMailer");
17
+
18
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
19
+
20
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
21
+
22
+ const variables = {
23
+ host: process.env.WEBINY_MAILER_HOST,
24
+ user: process.env.WEBINY_MAILER_USER,
25
+ password: process.env.WEBINY_MAILER_PASSWORD
26
+ };
27
+
28
+ const createSmtpMailer = config => {
29
+ /**
30
+ * If we have environment variables, use those as config.
31
+ */
32
+ if (variables.host && variables.user && variables.password) {
33
+ if (config) {
34
+ throw new _error.default({
35
+ message: `Cannot use both config and environment variables to setup the nodemailer.`,
36
+ code: "SMTP_MAILER_INIT_ERROR"
37
+ });
38
+ }
39
+
40
+ config = {
41
+ host: variables.host,
42
+ auth: {
43
+ user: variables.user,
44
+ pass: variables.password
45
+ }
46
+ };
47
+ } else if (!config) {
48
+ console.log("There is no config or required environment variables defined. Using dummy mailer.");
49
+ return (0, _createDummyMailer.createDummyMailer)();
50
+ }
51
+
52
+ const transporter = _nodemailer.default.createTransport(_objectSpread({}, config));
53
+
54
+ return {
55
+ transporter,
56
+ send: async params => {
57
+ const {
58
+ replyTo,
59
+ text,
60
+ html,
61
+ to,
62
+ bcc,
63
+ cc,
64
+ from,
65
+ subject
66
+ } = params;
67
+
68
+ try {
69
+ const result = await transporter.sendMail({
70
+ replyTo,
71
+ bcc,
72
+ cc,
73
+ from,
74
+ text,
75
+ html,
76
+ to,
77
+ subject
78
+ });
79
+
80
+ if (result.messageId) {
81
+ return {
82
+ result: true,
83
+ error: null
84
+ };
85
+ }
86
+
87
+ throw new _error.default({
88
+ message: "nodemailer.sendMail does not have a messageId in the result. Something went wrong...",
89
+ code: "MAILER_ERROR",
90
+ data: _objectSpread({}, result)
91
+ });
92
+ } catch (ex) {
93
+ return {
94
+ result: null,
95
+ error: {
96
+ message: ex.message,
97
+ code: ex.code,
98
+ data: _objectSpread(_objectSpread({}, params), ex.data)
99
+ }
100
+ };
101
+ }
102
+ }
103
+ };
104
+ };
105
+
106
+ exports.createSmtpMailer = createSmtpMailer;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["variables","host","process","env","WEBINY_MAILER_HOST","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","createSmtpMailer","config","WebinyError","message","code","auth","pass","console","log","createDummyMailer","transporter","nodemailer","createTransport","send","params","replyTo","text","html","to","bcc","cc","from","subject","result","sendMail","messageId","error","data","ex"],"sources":["createSmtpMailer.ts"],"sourcesContent":["/**\n * Nodemailer docs\n * https://nodemailer.com/about/\n */\nimport { Mailer } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport nodemailer, { Transporter } from \"nodemailer\";\nimport SMTPTransport, { Options } from \"nodemailer/lib/smtp-transport\";\nimport { createDummyMailer, DummyMailer } from \"~/mailers/createDummyMailer\";\n\nexport type SmtpMailerConfig = Options;\n\nexport interface SmtpMailer extends Mailer {\n transporter: Transporter<SMTPTransport.SentMessageInfo>;\n}\n\ninterface SmtpMailerEnvironmentVariables {\n host?: string;\n user?: string;\n password?: string;\n}\nconst variables: SmtpMailerEnvironmentVariables = {\n host: process.env.WEBINY_MAILER_HOST,\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD\n};\n\nexport const createSmtpMailer = (config?: SmtpMailerConfig): SmtpMailer | DummyMailer => {\n /**\n * If we have environment variables, use those as config.\n */\n if (variables.host && variables.user && variables.password) {\n if (config) {\n throw new WebinyError({\n message: `Cannot use both config and environment variables to setup the nodemailer.`,\n code: \"SMTP_MAILER_INIT_ERROR\"\n });\n }\n config = {\n host: variables.host,\n auth: {\n user: variables.user,\n pass: variables.password\n }\n };\n } else if (!config) {\n console.log(\n \"There is no config or required environment variables defined. Using dummy mailer.\"\n );\n return createDummyMailer();\n }\n const transporter = nodemailer.createTransport({\n ...config\n });\n\n return {\n transporter,\n send: async params => {\n const { replyTo, text, html, to, bcc, cc, from, subject } = params;\n\n try {\n const result = await transporter.sendMail({\n replyTo,\n bcc,\n cc,\n from,\n text,\n html,\n to,\n subject\n });\n if (result.messageId) {\n return {\n result: true,\n error: null\n };\n }\n\n throw new WebinyError({\n message:\n \"nodemailer.sendMail does not have a messageId in the result. Something went wrong...\",\n code: \"MAILER_ERROR\",\n data: {\n ...result\n }\n });\n } catch (ex) {\n return {\n result: null,\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n ...params,\n ...ex.data\n }\n }\n };\n }\n }\n };\n};\n"],"mappings":";;;;;;;;;;;AAKA;;AACA;;AAEA;;;;;;AAaA,MAAMA,SAAyC,GAAG;EAC9CC,IAAI,EAAEC,OAAO,CAACC,GAAR,CAAYC,kBAD4B;EAE9CC,IAAI,EAAEH,OAAO,CAACC,GAAR,CAAYG,kBAF4B;EAG9CC,QAAQ,EAAEL,OAAO,CAACC,GAAR,CAAYK;AAHwB,CAAlD;;AAMO,MAAMC,gBAAgB,GAAIC,MAAD,IAAyD;EACrF;AACJ;AACA;EACI,IAAIV,SAAS,CAACC,IAAV,IAAkBD,SAAS,CAACK,IAA5B,IAAoCL,SAAS,CAACO,QAAlD,EAA4D;IACxD,IAAIG,MAAJ,EAAY;MACR,MAAM,IAAIC,cAAJ,CAAgB;QAClBC,OAAO,EAAG,2EADQ;QAElBC,IAAI,EAAE;MAFY,CAAhB,CAAN;IAIH;;IACDH,MAAM,GAAG;MACLT,IAAI,EAAED,SAAS,CAACC,IADX;MAELa,IAAI,EAAE;QACFT,IAAI,EAAEL,SAAS,CAACK,IADd;QAEFU,IAAI,EAAEf,SAAS,CAACO;MAFd;IAFD,CAAT;EAOH,CAdD,MAcO,IAAI,CAACG,MAAL,EAAa;IAChBM,OAAO,CAACC,GAAR,CACI,mFADJ;IAGA,OAAO,IAAAC,oCAAA,GAAP;EACH;;EACD,MAAMC,WAAW,GAAGC,mBAAA,CAAWC,eAAX,mBACbX,MADa,EAApB;;EAIA,OAAO;IACHS,WADG;IAEHG,IAAI,EAAE,MAAMC,MAAN,IAAgB;MAClB,MAAM;QAAEC,OAAF;QAAWC,IAAX;QAAiBC,IAAjB;QAAuBC,EAAvB;QAA2BC,GAA3B;QAAgCC,EAAhC;QAAoCC,IAApC;QAA0CC;MAA1C,IAAsDR,MAA5D;;MAEA,IAAI;QACA,MAAMS,MAAM,GAAG,MAAMb,WAAW,CAACc,QAAZ,CAAqB;UACtCT,OADsC;UAEtCI,GAFsC;UAGtCC,EAHsC;UAItCC,IAJsC;UAKtCL,IALsC;UAMtCC,IANsC;UAOtCC,EAPsC;UAQtCI;QARsC,CAArB,CAArB;;QAUA,IAAIC,MAAM,CAACE,SAAX,EAAsB;UAClB,OAAO;YACHF,MAAM,EAAE,IADL;YAEHG,KAAK,EAAE;UAFJ,CAAP;QAIH;;QAED,MAAM,IAAIxB,cAAJ,CAAgB;UAClBC,OAAO,EACH,sFAFc;UAGlBC,IAAI,EAAE,cAHY;UAIlBuB,IAAI,oBACGJ,MADH;QAJc,CAAhB,CAAN;MAQH,CA1BD,CA0BE,OAAOK,EAAP,EAAW;QACT,OAAO;UACHL,MAAM,EAAE,IADL;UAEHG,KAAK,EAAE;YACHvB,OAAO,EAAEyB,EAAE,CAACzB,OADT;YAEHC,IAAI,EAAEwB,EAAE,CAACxB,IAFN;YAGHuB,IAAI,kCACGb,MADH,GAEGc,EAAE,CAACD,IAFN;UAHD;QAFJ,CAAP;MAWH;IACJ;EA5CE,CAAP;AA8CH,CA1EM"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@webiny/api-mailer",
3
+ "version": "5.30.0-beta.0",
4
+ "main": "index.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/webiny/webiny-js.git",
8
+ "directory": "packages/api-mailer"
9
+ },
10
+ "keywords": [
11
+ "mailer:base"
12
+ ],
13
+ "author": "Webiny Ltd",
14
+ "description": "The API to send e-mails.",
15
+ "license": "MIT",
16
+ "dependencies": {
17
+ "@babel/runtime": "7.18.6",
18
+ "@webiny/error": "5.30.0-beta.0",
19
+ "@webiny/handler": "5.30.0-beta.0",
20
+ "@webiny/plugins": "5.30.0-beta.0",
21
+ "@webiny/pubsub": "5.30.0-beta.0",
22
+ "joi": "17.6.0",
23
+ "nodemailer": "6.7.7"
24
+ },
25
+ "devDependencies": {
26
+ "@babel/cli": "^7.16.0",
27
+ "@babel/core": "^7.16.0",
28
+ "@babel/preset-env": "^7.16.4",
29
+ "@babel/preset-typescript": "^7.16.0",
30
+ "@types/nodemailer": "^6.4.4",
31
+ "@webiny/cli": "^5.30.0-beta.0",
32
+ "@webiny/project-utils": "^5.30.0-beta.0",
33
+ "jest": "^26.6.3",
34
+ "rimraf": "^3.0.2",
35
+ "ttypescript": "^1.5.12",
36
+ "typescript": "4.7.4"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public",
40
+ "directory": "dist"
41
+ },
42
+ "scripts": {
43
+ "build": "yarn webiny run build",
44
+ "watch": "yarn webiny run watch"
45
+ },
46
+ "gitHead": "622d120f5637e3ca807b8bfc9ed2cd034ac85fb7"
47
+ }
package/types.d.ts ADDED
@@ -0,0 +1,59 @@
1
+ import { Context } from "@webiny/handler/types";
2
+ import { Topic } from "@webiny/pubsub/types";
3
+ export interface MailerContextObjectSendParams {
4
+ data: MailerSendData;
5
+ }
6
+ export declare type MailerSetterParams = Mailer | (() => Promise<Mailer>);
7
+ export interface MailerSetter {
8
+ (mailer: MailerSetterParams): void;
9
+ }
10
+ export interface MailerContextObject {
11
+ onBeforeSend: Topic<OnBeforeMailerSendParams>;
12
+ onAfterSend: Topic<OnAfterMailerSendParams>;
13
+ onError: Topic<OnErrorMailerParams>;
14
+ setMailer: MailerSetter;
15
+ getMailer: <T extends Mailer = Mailer>() => Promise<T>;
16
+ send: <T>(params: MailerContextObjectSendParams) => Promise<MailerSendResponse<T>>;
17
+ }
18
+ export interface MailerContext extends Context {
19
+ mailer: MailerContextObject;
20
+ }
21
+ export interface MailerConfig<T extends Mailer = Mailer> {
22
+ mailer?: T;
23
+ }
24
+ export interface OnBeforeMailerSendParams {
25
+ data: MailerSendData;
26
+ }
27
+ export interface OnAfterMailerSendParams {
28
+ data: MailerSendData;
29
+ }
30
+ export interface OnErrorMailerParams {
31
+ error: Error;
32
+ data: MailerSendData;
33
+ }
34
+ /**
35
+ * Interface to implement the actual mailer.
36
+ */
37
+ export interface MailerSendResponse<T = any> {
38
+ result: T | null;
39
+ error: {
40
+ message: string;
41
+ code: string;
42
+ data: {
43
+ [key: string]: any;
44
+ };
45
+ } | null;
46
+ }
47
+ export interface MailerSendData {
48
+ to: string[];
49
+ from: string;
50
+ subject: string;
51
+ text: string;
52
+ html?: string;
53
+ replyTo?: string;
54
+ cc?: string[];
55
+ bcc?: string[];
56
+ }
57
+ export interface Mailer<T = any> {
58
+ send: (params: MailerSendData) => Promise<MailerSendResponse<T>>;
59
+ }
package/types.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
package/types.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import { Context } from \"@webiny/handler/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\n\nexport interface MailerContextObjectSendParams {\n data: MailerSendData;\n}\n\nexport type MailerSetterParams = Mailer | (() => Promise<Mailer>);\n\nexport interface MailerSetter {\n (mailer: MailerSetterParams): void;\n}\n\nexport interface MailerContextObject {\n onBeforeSend: Topic<OnBeforeMailerSendParams>;\n onAfterSend: Topic<OnAfterMailerSendParams>;\n onError: Topic<OnErrorMailerParams>;\n setMailer: MailerSetter;\n getMailer: <T extends Mailer = Mailer>() => Promise<T>;\n send: <T>(params: MailerContextObjectSendParams) => Promise<MailerSendResponse<T>>;\n}\nexport interface MailerContext extends Context {\n mailer: MailerContextObject;\n}\n\nexport interface MailerConfig<T extends Mailer = Mailer> {\n mailer?: T;\n}\n\nexport interface OnBeforeMailerSendParams {\n data: MailerSendData;\n}\nexport interface OnAfterMailerSendParams {\n data: MailerSendData;\n}\nexport interface OnErrorMailerParams {\n error: Error;\n data: MailerSendData;\n}\n\n/**\n * Interface to implement the actual mailer.\n */\nexport interface MailerSendResponse<T = any> {\n result: T | null;\n error: {\n message: string;\n code: string;\n data: {\n [key: string]: any;\n };\n } | null;\n}\n\nexport interface MailerSendData {\n to: string[];\n from: string;\n subject: string;\n text: string;\n html?: string;\n replyTo?: string;\n cc?: string[];\n bcc?: string[];\n}\nexport interface Mailer<T = any> {\n send: (params: MailerSendData) => Promise<MailerSendResponse<T>>;\n}\n"],"mappings":""}