@webiny/api-mailer 0.0.0-unstable.1e66d121db → 0.0.0-unstable.40876133bb
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/crud/group.js +2 -1
- package/crud/group.js.map +1 -1
- package/crud/settings/model.js +27 -9
- package/crud/settings/model.js.map +1 -1
- package/crud/settings/validation.js +1 -0
- package/crud/settings/validation.js.map +1 -1
- package/crud/settings.crud.js +10 -0
- package/crud/settings.crud.js.map +1 -1
- package/crud/transport/onTransportBeforeSend.js +1 -1
- package/crud/transport/onTransportBeforeSend.js.map +1 -1
- package/crud/transporter.crud.js +11 -0
- package/crud/transporter.crud.js.map +1 -1
- package/graphql/settings.js +2 -0
- package/graphql/settings.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.js +30 -6
- package/index.js.map +1 -1
- package/package.json +21 -21
- package/transports/createSmtpTransport.d.ts +1 -1
- package/transports/createSmtpTransport.js +24 -3
- package/transports/createSmtpTransport.js.map +1 -1
- package/types.d.ts +1 -0
- package/types.js.map +1 -1
package/crud/group.js
CHANGED
package/crud/group.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createGroup","createCmsGroup","name","description","id","slug","icon"],"sources":["group.ts"],"sourcesContent":["import { CmsGroupPlugin, createCmsGroup } from \"@webiny/api-headless-cms\";\n\nexport const createGroup = (): CmsGroupPlugin => {\n return createCmsGroup({\n name: \"Mailer Group\",\n description: \"Mailer Group for CMS\",\n id: \"mailerGroup\",\n slug: \"mailerGroup\",\n icon: \"none\"\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAEO,MAAMA,WAAW,GAAG,MAAsB;EAC7C,OAAO,IAAAC,8BAAA,EAAe;IAClBC,IAAI,EAAE,cADY;IAElBC,WAAW,EAAE,sBAFK;IAGlBC,EAAE,EAAE,aAHc;IAIlBC,IAAI,EAAE,aAJY;IAKlBC,IAAI,EAAE;
|
|
1
|
+
{"version":3,"names":["createGroup","createCmsGroup","name","description","id","slug","icon","isPrivate"],"sources":["group.ts"],"sourcesContent":["import { CmsGroupPlugin, createCmsGroup } from \"@webiny/api-headless-cms\";\n\nexport const createGroup = (): CmsGroupPlugin => {\n return createCmsGroup({\n name: \"Mailer Group\",\n description: \"Mailer Group for CMS\",\n id: \"mailerGroup\",\n slug: \"mailerGroup\",\n icon: \"none\",\n isPrivate: true\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAEO,MAAMA,WAAW,GAAG,MAAsB;EAC7C,OAAO,IAAAC,8BAAA,EAAe;IAClBC,IAAI,EAAE,cADY;IAElBC,WAAW,EAAE,sBAFK;IAGlBC,EAAE,EAAE,aAHc;IAIlBC,IAAI,EAAE,aAJY;IAKlBC,IAAI,EAAE,MALY;IAMlBC,SAAS,EAAE;EANO,CAAf,CAAP;AAQH,CATM"}
|
package/crud/settings/model.js
CHANGED
|
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.createSettingsModel = exports.SETTINGS_MODEL_ID = void 0;
|
|
9
9
|
|
|
10
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
|
+
|
|
10
12
|
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
11
13
|
|
|
12
14
|
var _camelCase = _interopRequireDefault(require("lodash/camelCase"));
|
|
@@ -17,7 +19,8 @@ exports.SETTINGS_MODEL_ID = SETTINGS_MODEL_ID;
|
|
|
17
19
|
const createField = params => {
|
|
18
20
|
const {
|
|
19
21
|
label,
|
|
20
|
-
required
|
|
22
|
+
required,
|
|
23
|
+
type
|
|
21
24
|
} = params;
|
|
22
25
|
const id = (0, _camelCase.default)(label);
|
|
23
26
|
const validation = [];
|
|
@@ -35,11 +38,23 @@ const createField = params => {
|
|
|
35
38
|
id,
|
|
36
39
|
fieldId: id,
|
|
37
40
|
storageId: id,
|
|
38
|
-
type
|
|
41
|
+
type,
|
|
39
42
|
validation
|
|
40
43
|
};
|
|
41
44
|
};
|
|
42
45
|
|
|
46
|
+
const createTextField = params => {
|
|
47
|
+
return createField((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
48
|
+
type: "text"
|
|
49
|
+
}));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const createNumberField = params => {
|
|
53
|
+
return createField((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
54
|
+
type: "number"
|
|
55
|
+
}));
|
|
56
|
+
};
|
|
57
|
+
|
|
43
58
|
const createSettingsModel = group => {
|
|
44
59
|
return (0, _apiHeadlessCms.createCmsModel)({
|
|
45
60
|
modelId: SETTINGS_MODEL_ID,
|
|
@@ -48,24 +63,27 @@ const createSettingsModel = group => {
|
|
|
48
63
|
id: group.contentModelGroup.id,
|
|
49
64
|
name: group.contentModelGroup.name
|
|
50
65
|
},
|
|
51
|
-
fields: [
|
|
66
|
+
fields: [createTextField({
|
|
52
67
|
label: "Host",
|
|
53
68
|
required: true
|
|
54
|
-
}),
|
|
69
|
+
}), createNumberField({
|
|
70
|
+
label: "Port"
|
|
71
|
+
}), createTextField({
|
|
55
72
|
label: "User",
|
|
56
73
|
required: true
|
|
57
|
-
}),
|
|
74
|
+
}), createTextField({
|
|
58
75
|
label: "Password",
|
|
59
76
|
required: true
|
|
60
|
-
}),
|
|
77
|
+
}), createTextField({
|
|
61
78
|
label: "From",
|
|
62
79
|
required: true
|
|
63
|
-
}),
|
|
80
|
+
}), createTextField({
|
|
64
81
|
label: "Reply-To"
|
|
65
82
|
})],
|
|
66
|
-
layout: [["host", "user", "password", "from", "replyTo"]],
|
|
83
|
+
layout: [["host", "port", "user", "password", "from", "replyTo"]],
|
|
67
84
|
description: "Mailer Settings",
|
|
68
|
-
titleFieldId: ""
|
|
85
|
+
titleFieldId: "",
|
|
86
|
+
isPrivate: true
|
|
69
87
|
});
|
|
70
88
|
};
|
|
71
89
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SETTINGS_MODEL_ID","createField","params","label","required","id","lodashCamelCase","validation","push","message","name","settings","fieldId","storageId","
|
|
1
|
+
{"version":3,"names":["SETTINGS_MODEL_ID","createField","params","label","required","type","id","lodashCamelCase","validation","push","message","name","settings","fieldId","storageId","createTextField","createNumberField","createSettingsModel","group","createCmsModel","modelId","contentModelGroup","fields","layout","description","titleFieldId","isPrivate"],"sources":["model.ts"],"sourcesContent":["import { createCmsModel, CmsGroupPlugin } from \"@webiny/api-headless-cms\";\nimport { CmsModelField, CmsModelFieldValidation } from \"@webiny/api-headless-cms/types\";\nimport lodashCamelCase from \"lodash/camelCase\";\n\nexport const SETTINGS_MODEL_ID = \"mailerSettings\";\n\ninterface CreateFieldParams {\n type: string;\n label: string;\n required?: boolean;\n}\nconst createField = (params: CreateFieldParams): CmsModelField => {\n const { label, required, type } = params;\n const id = lodashCamelCase(label);\n\n const validation: CmsModelFieldValidation[] = [];\n if (required) {\n validation.push({\n message: `Field \"${label}\" is required!`,\n name: \"required\",\n settings: {}\n });\n }\n return {\n label,\n id,\n fieldId: id,\n storageId: id,\n type,\n validation\n };\n};\n\nconst createTextField = (params: Omit<CreateFieldParams, \"type\">) => {\n return createField({\n ...params,\n type: \"text\"\n });\n};\nconst createNumberField = (params: Omit<CreateFieldParams, \"type\">) => {\n return createField({\n ...params,\n type: \"number\"\n });\n};\n\nexport const createSettingsModel = (group: CmsGroupPlugin) => {\n return createCmsModel({\n modelId: SETTINGS_MODEL_ID,\n name: \"Mailer Settings\",\n group: {\n id: group.contentModelGroup.id,\n name: group.contentModelGroup.name\n },\n fields: [\n createTextField({\n label: \"Host\",\n required: true\n }),\n createNumberField({\n label: \"Port\"\n }),\n createTextField({\n label: \"User\",\n required: true\n }),\n createTextField({\n label: \"Password\",\n required: true\n }),\n createTextField({\n label: \"From\",\n required: true\n }),\n createTextField({\n label: \"Reply-To\"\n })\n ],\n layout: [[\"host\", \"port\", \"user\", \"password\", \"from\", \"replyTo\"]],\n description: \"Mailer Settings\",\n titleFieldId: \"\",\n isPrivate: true\n });\n};\n"],"mappings":";;;;;;;;;;;AAAA;;AAEA;;AAEO,MAAMA,iBAAiB,GAAG,gBAA1B;;;AAOP,MAAMC,WAAW,GAAIC,MAAD,IAA8C;EAC9D,MAAM;IAAEC,KAAF;IAASC,QAAT;IAAmBC;EAAnB,IAA4BH,MAAlC;EACA,MAAMI,EAAE,GAAG,IAAAC,kBAAA,EAAgBJ,KAAhB,CAAX;EAEA,MAAMK,UAAqC,GAAG,EAA9C;;EACA,IAAIJ,QAAJ,EAAc;IACVI,UAAU,CAACC,IAAX,CAAgB;MACZC,OAAO,EAAG,UAASP,KAAM,gBADb;MAEZQ,IAAI,EAAE,UAFM;MAGZC,QAAQ,EAAE;IAHE,CAAhB;EAKH;;EACD,OAAO;IACHT,KADG;IAEHG,EAFG;IAGHO,OAAO,EAAEP,EAHN;IAIHQ,SAAS,EAAER,EAJR;IAKHD,IALG;IAMHG;EANG,CAAP;AAQH,CApBD;;AAsBA,MAAMO,eAAe,GAAIb,MAAD,IAA6C;EACjE,OAAOD,WAAW,6DACXC,MADW;IAEdG,IAAI,EAAE;EAFQ,GAAlB;AAIH,CALD;;AAMA,MAAMW,iBAAiB,GAAId,MAAD,IAA6C;EACnE,OAAOD,WAAW,6DACXC,MADW;IAEdG,IAAI,EAAE;EAFQ,GAAlB;AAIH,CALD;;AAOO,MAAMY,mBAAmB,GAAIC,KAAD,IAA2B;EAC1D,OAAO,IAAAC,8BAAA,EAAe;IAClBC,OAAO,EAAEpB,iBADS;IAElBW,IAAI,EAAE,iBAFY;IAGlBO,KAAK,EAAE;MACHZ,EAAE,EAAEY,KAAK,CAACG,iBAAN,CAAwBf,EADzB;MAEHK,IAAI,EAAEO,KAAK,CAACG,iBAAN,CAAwBV;IAF3B,CAHW;IAOlBW,MAAM,EAAE,CACJP,eAAe,CAAC;MACZZ,KAAK,EAAE,MADK;MAEZC,QAAQ,EAAE;IAFE,CAAD,CADX,EAKJY,iBAAiB,CAAC;MACdb,KAAK,EAAE;IADO,CAAD,CALb,EAQJY,eAAe,CAAC;MACZZ,KAAK,EAAE,MADK;MAEZC,QAAQ,EAAE;IAFE,CAAD,CARX,EAYJW,eAAe,CAAC;MACZZ,KAAK,EAAE,UADK;MAEZC,QAAQ,EAAE;IAFE,CAAD,CAZX,EAgBJW,eAAe,CAAC;MACZZ,KAAK,EAAE,MADK;MAEZC,QAAQ,EAAE;IAFE,CAAD,CAhBX,EAoBJW,eAAe,CAAC;MACZZ,KAAK,EAAE;IADK,CAAD,CApBX,CAPU;IA+BlBoB,MAAM,EAAE,CAAC,CAAC,MAAD,EAAS,MAAT,EAAiB,MAAjB,EAAyB,UAAzB,EAAqC,MAArC,EAA6C,SAA7C,CAAD,CA/BU;IAgClBC,WAAW,EAAE,iBAhCK;IAiClBC,YAAY,EAAE,EAjCI;IAkClBC,SAAS,EAAE;EAlCO,CAAf,CAAP;AAoCH,CArCM"}
|
|
@@ -19,6 +19,7 @@ const password = _joi.default.string().label("Password");
|
|
|
19
19
|
|
|
20
20
|
const common = {
|
|
21
21
|
from: _joi.default.string().email(options).required().label("Mail from"),
|
|
22
|
+
port: _joi.default.number().label("Port").default(25),
|
|
22
23
|
replyTo: _joi.default.string().email(options).optional().label("Mail reply-to"),
|
|
23
24
|
host: _joi.default.string().required().label("Hostname"),
|
|
24
25
|
user: _joi.default.string().required().label("User")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["options","tlds","password","joi","string","label","common","from","email","required","replyTo","optional","host","user","createValidation","object","updateValidation"],"sources":["validation.ts"],"sourcesContent":["import joi, { EmailOptions } from \"joi\";\nimport { TransportSettings } from \"~/types\";\n\nconst options: EmailOptions = {\n tlds: false\n};\n\nconst password = joi.string().label(\"Password\");\nconst common = {\n from: joi.string().email(options).required().label(\"Mail from\"),\n replyTo: joi.string().email(options).optional().label(\"Mail reply-to\"),\n host: joi.string().required().label(\"Hostname\"),\n user: joi.string().required().label(\"User\")\n};\n\nexport const createValidation = joi\n .object<TransportSettings>({\n ...common,\n password: password.required()\n })\n .required();\n\nexport const updateValidation = joi\n .object<TransportSettings>({\n ...common,\n password\n })\n .required();\n"],"mappings":";;;;;;;;;;;AAAA;;AAGA,MAAMA,OAAqB,GAAG;EAC1BC,IAAI,EAAE;AADoB,CAA9B;;AAIA,MAAMC,QAAQ,GAAGC,YAAA,CAAIC,MAAJ,GAAaC,KAAb,CAAmB,UAAnB,CAAjB;;AACA,MAAMC,MAAM,GAAG;EACXC,IAAI,EAAEJ,YAAA,CAAIC,MAAJ,GAAaI,KAAb,CAAmBR,OAAnB,EAA4BS,QAA5B,GAAuCJ,KAAvC,CAA6C,WAA7C,CADK;EAEXK,
|
|
1
|
+
{"version":3,"names":["options","tlds","password","joi","string","label","common","from","email","required","port","number","default","replyTo","optional","host","user","createValidation","object","updateValidation"],"sources":["validation.ts"],"sourcesContent":["import joi, { EmailOptions } from \"joi\";\nimport { TransportSettings } from \"~/types\";\n\nconst options: EmailOptions = {\n tlds: false\n};\n\nconst password = joi.string().label(\"Password\");\nconst common = {\n from: joi.string().email(options).required().label(\"Mail from\"),\n port: joi.number().label(\"Port\").default(25),\n replyTo: joi.string().email(options).optional().label(\"Mail reply-to\"),\n host: joi.string().required().label(\"Hostname\"),\n user: joi.string().required().label(\"User\")\n};\n\nexport const createValidation = joi\n .object<TransportSettings>({\n ...common,\n password: password.required()\n })\n .required();\n\nexport const updateValidation = joi\n .object<TransportSettings>({\n ...common,\n password\n })\n .required();\n"],"mappings":";;;;;;;;;;;AAAA;;AAGA,MAAMA,OAAqB,GAAG;EAC1BC,IAAI,EAAE;AADoB,CAA9B;;AAIA,MAAMC,QAAQ,GAAGC,YAAA,CAAIC,MAAJ,GAAaC,KAAb,CAAmB,UAAnB,CAAjB;;AACA,MAAMC,MAAM,GAAG;EACXC,IAAI,EAAEJ,YAAA,CAAIC,MAAJ,GAAaI,KAAb,CAAmBR,OAAnB,EAA4BS,QAA5B,GAAuCJ,KAAvC,CAA6C,WAA7C,CADK;EAEXK,IAAI,EAAEP,YAAA,CAAIQ,MAAJ,GAAaN,KAAb,CAAmB,MAAnB,EAA2BO,OAA3B,CAAmC,EAAnC,CAFK;EAGXC,OAAO,EAAEV,YAAA,CAAIC,MAAJ,GAAaI,KAAb,CAAmBR,OAAnB,EAA4Bc,QAA5B,GAAuCT,KAAvC,CAA6C,eAA7C,CAHE;EAIXU,IAAI,EAAEZ,YAAA,CAAIC,MAAJ,GAAaK,QAAb,GAAwBJ,KAAxB,CAA8B,UAA9B,CAJK;EAKXW,IAAI,EAAEb,YAAA,CAAIC,MAAJ,GAAaK,QAAb,GAAwBJ,KAAxB,CAA8B,MAA9B;AALK,CAAf;;AAQO,MAAMY,gBAAgB,GAAGd,YAAA,CAC3Be,MAD2B,6DAErBZ,MAFqB;EAGxBJ,QAAQ,EAAEA,QAAQ,CAACO,QAAT;AAHc,IAK3BA,QAL2B,EAAzB;;;;AAOA,MAAMU,gBAAgB,GAAGhB,YAAA,CAC3Be,MAD2B,6DAErBZ,MAFqB;EAGxBJ;AAHwB,IAK3BO,QAL2B,EAAzB"}
|
package/crud/settings.crud.js
CHANGED
|
@@ -191,6 +191,11 @@ const createSettingsCrud = async context => {
|
|
|
191
191
|
password
|
|
192
192
|
} = _result$value,
|
|
193
193
|
settings = (0, _objectWithoutProperties2.default)(_result$value, _excluded);
|
|
194
|
+
|
|
195
|
+
if (!settings.port) {
|
|
196
|
+
settings.port = 25;
|
|
197
|
+
}
|
|
198
|
+
|
|
194
199
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
195
200
|
password: ""
|
|
196
201
|
});
|
|
@@ -259,6 +264,11 @@ const createSettingsCrud = async context => {
|
|
|
259
264
|
password
|
|
260
265
|
} = _result$value2,
|
|
261
266
|
settings = (0, _objectWithoutProperties2.default)(_result$value2, _excluded2);
|
|
267
|
+
|
|
268
|
+
if (!settings.port) {
|
|
269
|
+
settings.port = original.port || 25;
|
|
270
|
+
}
|
|
271
|
+
|
|
262
272
|
const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
|
|
263
273
|
password: ""
|
|
264
274
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createSettingsCrud","context","attachPasswordObfuscatingHooks","getTenant","tenancy","getCurrentTenant","id","validateAccess","permission","security","getPermission","NotAuthorizedError","data","reason","secret","getSecret","ex","getModel","disableAuthorization","model","cms","SETTINGS_MODEL_ID","WebinyError","message","code","enableAuthorization","modelId","onSettingsBeforeGet","createTopic","onSettingsAfterGet","onSettingsGetError","onSettingsBeforeCreate","onSettingsAfterCreate","onSettingsCreateError","onSettingsBeforeUpdate","onSettingsAfterUpdate","onSettingsUpdateError","checkSecret","description","getSettings","tenant","publish","entries","listLatestEntries","limit","sort","entry","settings","transformValuesFromEntry","passwordlessSettings","password","error","createSettings","params","input","result","createValidation","validate","errors","details","value","createEntry","transformInputToEntryValues","values","updateSettings","original","initialOriginal","updateValidation","transformedInput","updateEntry","saveSettings"],"sources":["settings.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n MailerContext,\n MailerContextObject,\n MailerSettingsContext,\n OnSettingsAfterCreateTopicParams,\n OnSettingsAfterGetTopicParams,\n OnSettingsAfterUpdateTopicParams,\n OnSettingsBeforeCreateTopicParams,\n OnSettingsBeforeGetTopicParams,\n OnSettingsBeforeUpdateTopicParams,\n OnSettingsCreateErrorTopicParams,\n OnSettingsGetErrorTopicParams,\n OnSettingsUpdateErrorTopicParams,\n TransportSettings\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { SETTINGS_MODEL_ID } from \"./settings/model\";\nimport { transformValuesFromEntry, transformInputToEntryValues } from \"~/crud/settings/transform\";\nimport { getSecret } from \"~/crud/settings/secret\";\nimport { createValidation, updateValidation } from \"~/crud/settings/validation\";\nimport { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { attachPasswordObfuscatingHooks } from \"~/crud/settings/hooks\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\n/**\n * Note that settings cannot be used if there is no secret defined.\n */\nexport const createSettingsCrud = async (\n context: MailerContext\n): Promise<MailerSettingsContext> => {\n /**\n * We need to remove password from all references on create and update in the CMS.\n */\n attachPasswordObfuscatingHooks(context);\n\n const getTenant = () => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const validateAccess = async () => {\n const permission = await context.security.getPermission(\"mailer.settings\");\n\n if (permission) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to update the mailer settings.`\n }\n });\n };\n\n let secret: string | null = null;\n try {\n secret = getSecret();\n } catch (ex) {}\n\n const getModel = async (): Promise<CmsModel> => {\n try {\n context.security.disableAuthorization();\n const model = await context.cms.getModel(SETTINGS_MODEL_ID);\n if (model) {\n return model;\n }\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n throw new WebinyError(`Missing CMS Model \"${SETTINGS_MODEL_ID}\".`, \"CMS_MODEL_MISSING\", {\n modelId: SETTINGS_MODEL_ID\n });\n };\n\n // get\n const onSettingsBeforeGet = createTopic<OnSettingsBeforeGetTopicParams>(\n \"mailer.onSettingsBeforeGet\"\n );\n const onSettingsAfterGet = createTopic<OnSettingsAfterGetTopicParams>(\n \"mailer.onSettingsAfterGet\"\n );\n const onSettingsGetError = createTopic<OnSettingsGetErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // create\n const onSettingsBeforeCreate = createTopic<OnSettingsBeforeCreateTopicParams>(\n \"mailer.onSettingsBeforeCreate\"\n );\n const onSettingsAfterCreate = createTopic<OnSettingsAfterCreateTopicParams>(\n \"mailer.onSettingsAfterCreate\"\n );\n const onSettingsCreateError = createTopic<OnSettingsCreateErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // update\n const onSettingsBeforeUpdate = createTopic<OnSettingsBeforeUpdateTopicParams>(\n \"mailer.onSettingsBeforeUpdate\"\n );\n const onSettingsAfterUpdate = createTopic<OnSettingsAfterUpdateTopicParams>(\n \"mailer.onSettingsAfterUpdate\"\n );\n const onSettingsUpdateError = createTopic<OnSettingsUpdateErrorTopicParams>(\n \"mailer.onSettingsUpdateError\"\n );\n\n const checkSecret = (): void => {\n if (secret) {\n return;\n }\n throw new WebinyError(\"There must be a password secret defined!\", \"PASSWORD_SECRET_ERROR\", {\n description:\n \"To store the Mailer settings, you must have a password secret environment variable defined.\"\n });\n };\n\n return {\n onSettingsAfterGet,\n onSettingsBeforeGet,\n onSettingsGetError,\n onSettingsBeforeCreate,\n onSettingsAfterCreate,\n onSettingsCreateError,\n onSettingsBeforeUpdate,\n onSettingsAfterUpdate,\n onSettingsUpdateError,\n getSettings: async () => {\n checkSecret();\n\n const model = await getModel();\n\n const tenant = getTenant();\n try {\n context.security.disableAuthorization();\n await onSettingsBeforeGet.publish({\n tenant\n });\n /**\n * We always list because we have no id or something like that to query by.\n * This should return one setting anyway.\n */\n const [entries] = await context.cms.listLatestEntries(model, {\n limit: 1,\n sort: [\"createdOn_DESC\"]\n });\n const [entry] = entries;\n if (!entry) {\n return null;\n }\n const settings = transformValuesFromEntry({\n entry: entry as CmsEntry<TransportSettings>,\n secret\n });\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n await onSettingsAfterGet.publish({\n tenant,\n settings: passwordlessSettings\n });\n\n return settings;\n } catch (ex) {\n await onSettingsGetError.publish({\n tenant,\n error: ex\n });\n } finally {\n context.security.enableAuthorization();\n }\n return null;\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async createSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input } = params;\n\n const model = await getModel();\n\n const result = createValidation.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\n });\n }\n\n const { password, ...settings } = result.value;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeCreate.publish({\n settings: passwordlessSettings\n });\n\n await context.cms.createEntry(\n model,\n transformInputToEntryValues({\n values: {\n ...settings,\n password\n },\n secret\n })\n );\n\n await onSettingsAfterCreate.publish({\n settings: passwordlessSettings\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsCreateError.publish({\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async updateSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input, original: initialOriginal } = params;\n\n const model = await getModel();\n\n const result = updateValidation.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\n });\n }\n let original = initialOriginal;\n if (!original) {\n original = await this.getSettings();\n if (!original) {\n throw new WebinyError(\n `You are trying to update settings, but there is no existing record. Create it first!`,\n \"NOT_FOUND\"\n );\n }\n }\n\n const { password, ...settings } = result.value;\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n\n const transformedInput = transformInputToEntryValues({\n values: {\n ...settings,\n password: password || original.password\n },\n secret\n });\n /**\n * We want to make sure that old password gets stored again in case no password was sent in update input.\n */\n await context.cms.updateEntry(model, original.id, transformedInput);\n\n await onSettingsAfterUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsUpdateError.publish({\n original,\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n async saveSettings(this: MailerContextObject, params) {\n const { input } = params;\n\n const original = await this.getSettings();\n if (!original) {\n return this.createSettings({\n input\n });\n }\n return this.updateSettings({\n input,\n original\n });\n }\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["createSettingsCrud","context","attachPasswordObfuscatingHooks","getTenant","tenancy","getCurrentTenant","id","validateAccess","permission","security","getPermission","NotAuthorizedError","data","reason","secret","getSecret","ex","getModel","disableAuthorization","model","cms","SETTINGS_MODEL_ID","WebinyError","message","code","enableAuthorization","modelId","onSettingsBeforeGet","createTopic","onSettingsAfterGet","onSettingsGetError","onSettingsBeforeCreate","onSettingsAfterCreate","onSettingsCreateError","onSettingsBeforeUpdate","onSettingsAfterUpdate","onSettingsUpdateError","checkSecret","description","getSettings","tenant","publish","entries","listLatestEntries","limit","sort","entry","settings","transformValuesFromEntry","passwordlessSettings","password","error","createSettings","params","input","result","createValidation","validate","errors","details","value","port","createEntry","transformInputToEntryValues","values","updateSettings","original","initialOriginal","updateValidation","transformedInput","updateEntry","saveSettings"],"sources":["settings.crud.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport {\n MailerContext,\n MailerContextObject,\n MailerSettingsContext,\n OnSettingsAfterCreateTopicParams,\n OnSettingsAfterGetTopicParams,\n OnSettingsAfterUpdateTopicParams,\n OnSettingsBeforeCreateTopicParams,\n OnSettingsBeforeGetTopicParams,\n OnSettingsBeforeUpdateTopicParams,\n OnSettingsCreateErrorTopicParams,\n OnSettingsGetErrorTopicParams,\n OnSettingsUpdateErrorTopicParams,\n TransportSettings\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { SETTINGS_MODEL_ID } from \"./settings/model\";\nimport { transformValuesFromEntry, transformInputToEntryValues } from \"~/crud/settings/transform\";\nimport { getSecret } from \"~/crud/settings/secret\";\nimport { createValidation, updateValidation } from \"~/crud/settings/validation\";\nimport { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { attachPasswordObfuscatingHooks } from \"~/crud/settings/hooks\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\n/**\n * Note that settings cannot be used if there is no secret defined.\n */\nexport const createSettingsCrud = async (\n context: MailerContext\n): Promise<MailerSettingsContext> => {\n /**\n * We need to remove password from all references on create and update in the CMS.\n */\n attachPasswordObfuscatingHooks(context);\n\n const getTenant = () => {\n return context.tenancy.getCurrentTenant().id;\n };\n\n const validateAccess = async () => {\n const permission = await context.security.getPermission(\"mailer.settings\");\n\n if (permission) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to update the mailer settings.`\n }\n });\n };\n\n let secret: string | null = null;\n try {\n secret = getSecret();\n } catch (ex) {}\n\n const getModel = async (): Promise<CmsModel> => {\n try {\n context.security.disableAuthorization();\n const model = await context.cms.getModel(SETTINGS_MODEL_ID);\n if (model) {\n return model;\n }\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n throw new WebinyError(`Missing CMS Model \"${SETTINGS_MODEL_ID}\".`, \"CMS_MODEL_MISSING\", {\n modelId: SETTINGS_MODEL_ID\n });\n };\n\n // get\n const onSettingsBeforeGet = createTopic<OnSettingsBeforeGetTopicParams>(\n \"mailer.onSettingsBeforeGet\"\n );\n const onSettingsAfterGet = createTopic<OnSettingsAfterGetTopicParams>(\n \"mailer.onSettingsAfterGet\"\n );\n const onSettingsGetError = createTopic<OnSettingsGetErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // create\n const onSettingsBeforeCreate = createTopic<OnSettingsBeforeCreateTopicParams>(\n \"mailer.onSettingsBeforeCreate\"\n );\n const onSettingsAfterCreate = createTopic<OnSettingsAfterCreateTopicParams>(\n \"mailer.onSettingsAfterCreate\"\n );\n const onSettingsCreateError = createTopic<OnSettingsCreateErrorTopicParams>(\n \"mailer.onSettingsCreateError\"\n );\n // update\n const onSettingsBeforeUpdate = createTopic<OnSettingsBeforeUpdateTopicParams>(\n \"mailer.onSettingsBeforeUpdate\"\n );\n const onSettingsAfterUpdate = createTopic<OnSettingsAfterUpdateTopicParams>(\n \"mailer.onSettingsAfterUpdate\"\n );\n const onSettingsUpdateError = createTopic<OnSettingsUpdateErrorTopicParams>(\n \"mailer.onSettingsUpdateError\"\n );\n\n const checkSecret = (): void => {\n if (secret) {\n return;\n }\n throw new WebinyError(\"There must be a password secret defined!\", \"PASSWORD_SECRET_ERROR\", {\n description:\n \"To store the Mailer settings, you must have a password secret environment variable defined.\"\n });\n };\n\n return {\n onSettingsAfterGet,\n onSettingsBeforeGet,\n onSettingsGetError,\n onSettingsBeforeCreate,\n onSettingsAfterCreate,\n onSettingsCreateError,\n onSettingsBeforeUpdate,\n onSettingsAfterUpdate,\n onSettingsUpdateError,\n getSettings: async () => {\n checkSecret();\n\n const model = await getModel();\n\n const tenant = getTenant();\n try {\n context.security.disableAuthorization();\n await onSettingsBeforeGet.publish({\n tenant\n });\n /**\n * We always list because we have no id or something like that to query by.\n * This should return one setting anyway.\n */\n const [entries] = await context.cms.listLatestEntries(model, {\n limit: 1,\n sort: [\"createdOn_DESC\"]\n });\n const [entry] = entries;\n if (!entry) {\n return null;\n }\n const settings = transformValuesFromEntry({\n entry: entry as CmsEntry<TransportSettings>,\n secret\n });\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n await onSettingsAfterGet.publish({\n tenant,\n settings: passwordlessSettings\n });\n\n return settings;\n } catch (ex) {\n await onSettingsGetError.publish({\n tenant,\n error: ex\n });\n } finally {\n context.security.enableAuthorization();\n }\n return null;\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async createSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input } = params;\n\n const model = await getModel();\n\n const result = createValidation.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\n });\n }\n\n const { password, ...settings } = result.value;\n\n if (!settings.port) {\n settings.port = 25;\n }\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeCreate.publish({\n settings: passwordlessSettings\n });\n\n await context.cms.createEntry(\n model,\n transformInputToEntryValues({\n values: {\n ...settings,\n password\n },\n secret\n })\n );\n\n await onSettingsAfterCreate.publish({\n settings: passwordlessSettings\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsCreateError.publish({\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n async updateSettings(this: MailerContextObject, params) {\n checkSecret();\n await validateAccess();\n\n const { input, original: initialOriginal } = params;\n\n const model = await getModel();\n\n const result = updateValidation.validate(input);\n\n const error = result.error;\n if (error) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: error.details\n });\n }\n let original = initialOriginal;\n if (!original) {\n original = await this.getSettings();\n if (!original) {\n throw new WebinyError(\n `You are trying to update settings, but there is no existing record. Create it first!`,\n \"NOT_FOUND\"\n );\n }\n }\n\n const { password, ...settings } = result.value;\n\n if (!settings.port) {\n settings.port = original.port || 25;\n }\n\n const passwordlessSettings: TransportSettings = {\n ...settings,\n password: \"\"\n };\n try {\n context.security.disableAuthorization();\n\n await onSettingsBeforeUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n\n const transformedInput = transformInputToEntryValues({\n values: {\n ...settings,\n password: password || original.password\n },\n secret\n });\n /**\n * We want to make sure that old password gets stored again in case no password was sent in update input.\n */\n await context.cms.updateEntry(model, original.id, transformedInput);\n\n await onSettingsAfterUpdate.publish({\n settings: passwordlessSettings,\n original\n });\n return passwordlessSettings;\n } catch (ex) {\n await onSettingsUpdateError.publish({\n original,\n settings: passwordlessSettings,\n error: ex\n });\n throw new WebinyError(ex.message, ex.code, ex.data);\n } finally {\n context.security.enableAuthorization();\n }\n },\n async saveSettings(this: MailerContextObject, params) {\n const { input } = params;\n\n const original = await this.getSettings();\n if (!original) {\n return this.createSettings({\n input\n });\n }\n return this.updateSettings({\n input,\n original\n });\n }\n };\n};\n"],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ const requiredEmail = requiredString.email(options);
|
|
|
23
23
|
|
|
24
24
|
const schema = _joi.default.object({
|
|
25
25
|
to: _joi.default.array().items(requiredEmail),
|
|
26
|
-
from:
|
|
26
|
+
from: _joi.default.string().email(options),
|
|
27
27
|
subject: requiredString.max(1024),
|
|
28
28
|
cc: _joi.default.array().items(requiredEmail),
|
|
29
29
|
bcc: _joi.default.array().items(requiredEmail),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["options","tlds","requiredString","joi","string","required","requiredEmail","email","schema","object","to","array","items","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","data","input","result","validate","error","ex","WebinyError","message","code"],"sources":["onTransportBeforeSend.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { TransportSendData, OnTransportBeforeSendParams } from \"~/types\";\nimport joi, { EmailOptions } from \"joi\";\nimport WebinyError from \"@webiny/error\";\n\nconst options: EmailOptions = {\n tlds: false\n};\n\nconst requiredString = joi.string().required();\nconst requiredEmail = requiredString.email(options);\n\nconst schema = joi.object<TransportSendData>({\n to: joi.array().items(requiredEmail),\n from:
|
|
1
|
+
{"version":3,"names":["options","tlds","requiredString","joi","string","required","requiredEmail","email","schema","object","to","array","items","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","data","input","result","validate","error","ex","WebinyError","message","code"],"sources":["onTransportBeforeSend.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { TransportSendData, OnTransportBeforeSendParams } from \"~/types\";\nimport joi, { EmailOptions } from \"joi\";\nimport WebinyError from \"@webiny/error\";\n\nconst options: EmailOptions = {\n tlds: false\n};\n\nconst requiredString = joi.string().required();\nconst requiredEmail = requiredString.email(options);\n\nconst schema = joi.object<TransportSendData>({\n to: joi.array().items(requiredEmail),\n from: joi.string().email(options),\n subject: requiredString.max(1024),\n cc: joi.array().items(requiredEmail),\n bcc: joi.array().items(requiredEmail),\n replyTo: joi.string().email(options),\n text: requiredString.min(10),\n html: joi.string()\n});\n\ninterface Params {\n onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;\n}\nexport const attachOnTransportBeforeSend = (params: Params) => {\n const { onTransportBeforeSend } = params;\n\n onTransportBeforeSend.subscribe(async ({ data: input }) => {\n let result: joi.ValidationResult<TransportSendData>;\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,OAAqB,GAAG;EAC1BC,IAAI,EAAE;AADoB,CAA9B;;AAIA,MAAMC,cAAc,GAAGC,YAAA,CAAIC,MAAJ,GAAaC,QAAb,EAAvB;;AACA,MAAMC,aAAa,GAAGJ,cAAc,CAACK,KAAf,CAAqBP,OAArB,CAAtB;;AAEA,MAAMQ,MAAM,GAAGL,YAAA,CAAIM,MAAJ,CAA8B;EACzCC,EAAE,EAAEP,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CADqC;EAEzCO,IAAI,EAAEV,YAAA,CAAIC,MAAJ,GAAaG,KAAb,CAAmBP,OAAnB,CAFmC;EAGzCc,OAAO,EAAEZ,cAAc,CAACa,GAAf,CAAmB,IAAnB,CAHgC;EAIzCC,EAAE,EAAEb,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CAJqC;EAKzCW,GAAG,EAAEd,YAAA,CAAIQ,KAAJ,GAAYC,KAAZ,CAAkBN,aAAlB,CALoC;EAMzCY,OAAO,EAAEf,YAAA,CAAIC,MAAJ,GAAaG,KAAb,CAAmBP,OAAnB,CANgC;EAOzCmB,IAAI,EAAEjB,cAAc,CAACkB,GAAf,CAAmB,EAAnB,CAPmC;EAQzCC,IAAI,EAAElB,YAAA,CAAIC,MAAJ;AARmC,CAA9B,CAAf;;AAcO,MAAMkB,2BAA2B,GAAIC,MAAD,IAAoB;EAC3D,MAAM;IAAEC;EAAF,IAA4BD,MAAlC;EAEAC,qBAAqB,CAACC,SAAtB,CAAgC,OAAO;IAAEC,IAAI,EAAEC;EAAR,CAAP,KAA2B;IACvD,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,kCACGE,MAAM,CAACE,KADV;IAHc,CAAhB,CAAN;EAOH,CAzBD;AA0BH,CA7BM"}
|
package/crud/transporter.crud.js
CHANGED
|
@@ -41,9 +41,20 @@ const buildTransporter = async params => {
|
|
|
41
41
|
throw new _error.default("Could not build mailer via any of the available plugins.", "MAILER_PLUGINS_ERROR");
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
+
const getPort = value => {
|
|
45
|
+
const port = Number(value);
|
|
46
|
+
|
|
47
|
+
if (!!value && isNaN(port) === false) {
|
|
48
|
+
return port;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return 25;
|
|
52
|
+
};
|
|
53
|
+
|
|
44
54
|
const getDefaultSettings = () => {
|
|
45
55
|
const input = {
|
|
46
56
|
host: process.env.WEBINY_MAILER_HOST,
|
|
57
|
+
port: getPort(process.env.WEBINY_MAILER_PORT),
|
|
47
58
|
user: process.env.WEBINY_MAILER_USER,
|
|
48
59
|
password: process.env.WEBINY_MAILER_PASSWORD,
|
|
49
60
|
replyTo: process.env.WEBINY_MAILER_REPLY_TO,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildTransporter","params","settings","context","plugins","plugin","buildMailerTransport","ex","console","log","name","message","WebinyError","getDefaultSettings","input","host","process","env","WEBINY_MAILER_HOST","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","replyTo","WEBINY_MAILER_REPLY_TO","from","WEBINY_MAILER_FROM","hasAtLeastOneValue","Object","values","some","value","String","trim","result","createValidation","validate","error","createTransporterCrud","transporters","defaultSettings","byType","CreateTransportPlugin","type","reverse","onTransportBeforeSend","createTopic","onTransportAfterSend","onTransportError","attachOnTransportBeforeSend","getTransport","tenant","tenancy","getCurrentTenant","id","mailer","getSettings","code","transporter","sendMail","data","transport","publish","response","send"],"sources":["transporter.crud.ts"],"sourcesContent":["import {\n MailerContext,\n Transport,\n OnTransportAfterSendParams,\n OnTransportBeforeSendParams,\n OnTransportErrorParams,\n TransportSettings,\n MailerTransporterContext\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { attachOnTransportBeforeSend } from \"~/crud/transport/onTransportBeforeSend\";\nimport { CreateTransportPlugin } from \"~/plugins\";\nimport WebinyError from \"@webiny/error\";\n\nimport { createValidation } from \"./settings/validation\";\n\ninterface BuildMailerParams {\n plugins: CreateTransportPlugin[];\n settings: TransportSettings | null;\n context: MailerContext;\n}\n\nconst buildTransporter = async (params: BuildMailerParams): Promise<Transport> => {\n const { settings, context, plugins } = params;\n\n for (const plugin of plugins) {\n try {\n return await plugin.buildMailerTransport({\n settings,\n context\n });\n } catch (ex) {\n console.log(`Could not build mailer with plugin \"${plugin.name}\".`);\n console.log(ex.message);\n }\n }\n throw new WebinyError(\n \"Could not build mailer via any of the available plugins.\",\n \"MAILER_PLUGINS_ERROR\"\n );\n};\n\nconst getDefaultSettings = (): TransportSettings | null => {\n const input: Partial<TransportSettings> = {\n host: process.env.WEBINY_MAILER_HOST,\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD,\n replyTo: process.env.WEBINY_MAILER_REPLY_TO,\n from: process.env.WEBINY_MAILER_FROM\n };\n /**\n * No need to do the validation if there is not at least one variable defined.\n */\n const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());\n if (!hasAtLeastOneValue) {\n return null;\n }\n\n try {\n const result = createValidation.validate(input);\n\n if (!result.error) {\n return result.value;\n }\n } catch (ex) {}\n\n return null;\n};\n\nexport const createTransporterCrud = async (\n context: MailerContext\n): Promise<MailerTransporterContext> => {\n const transporters: Record<string, Transport> = {};\n\n const defaultSettings: TransportSettings | null = getDefaultSettings();\n /**\n * We need the last possible plugin which is defined.\n * The last plugins are our default ones with the default configurations.\n * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.\n */\n const plugins = context.plugins\n .byType<CreateTransportPlugin>(CreateTransportPlugin.type)\n .reverse();\n\n /**\n * We define possible events to be hooked into.\n */\n const onTransportBeforeSend = createTopic<OnTransportBeforeSendParams>(\n \"mailer.onTransportBeforeSend\"\n );\n const onTransportAfterSend = createTopic<OnTransportAfterSendParams>(\n \"mailer.onTransportAfterSend\"\n );\n const onTransportError = createTopic<OnTransportErrorParams>(\"mailer.onTransportError\");\n /**\n * We attach our default ones.\n */\n attachOnTransportBeforeSend({\n onTransportBeforeSend\n });\n\n const getTransport = async (): Promise<Transport | null> => {\n const tenant = context.tenancy.getCurrentTenant().id;\n\n if (transporters[tenant]) {\n return transporters[tenant];\n }\n\n let settings: TransportSettings | null = null;\n try {\n settings = await context.mailer.getSettings();\n } catch (ex) {\n if (ex.code !== \"PASSWORD_SECRET_ERROR\") {\n console.log(ex.message);\n console.log(ex.code);\n }\n }\n if (!settings && !defaultSettings) {\n console.log(`There are no Mailer transport settings for tenant \"${tenant}\".`);\n }\n const transporter = await buildTransporter({\n settings: settings || defaultSettings,\n plugins,\n context\n });\n\n transporters[tenant] = transporter;\n\n return transporter;\n };\n\n return {\n onTransportBeforeSend,\n onTransportAfterSend,\n onTransportError,\n getTransport,\n sendMail: async data => {\n const transport = await getTransport();\n if (!transport) {\n return {\n result: null,\n error: {\n message: \"There is no transport available.\",\n code: \"NO_TRANSPORT_DEFINED\"\n }\n };\n }\n try {\n await onTransportBeforeSend.publish({\n data,\n transport\n });\n const response = await transport.send(data);\n await onTransportAfterSend.publish({\n data,\n transport\n });\n\n return {\n result: response.result,\n error: response.error\n };\n } catch (ex) {\n await onTransportError.publish({\n error: ex,\n data,\n transport\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":"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"}
|
|
1
|
+
{"version":3,"names":["buildTransporter","params","settings","context","plugins","plugin","buildMailerTransport","ex","console","log","name","message","WebinyError","getPort","value","port","Number","isNaN","getDefaultSettings","input","host","process","env","WEBINY_MAILER_HOST","WEBINY_MAILER_PORT","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","replyTo","WEBINY_MAILER_REPLY_TO","from","WEBINY_MAILER_FROM","hasAtLeastOneValue","Object","values","some","String","trim","result","createValidation","validate","error","createTransporterCrud","transporters","defaultSettings","byType","CreateTransportPlugin","type","reverse","onTransportBeforeSend","createTopic","onTransportAfterSend","onTransportError","attachOnTransportBeforeSend","getTransport","tenant","tenancy","getCurrentTenant","id","mailer","getSettings","code","transporter","sendMail","data","transport","publish","response","send"],"sources":["transporter.crud.ts"],"sourcesContent":["import {\n MailerContext,\n Transport,\n OnTransportAfterSendParams,\n OnTransportBeforeSendParams,\n OnTransportErrorParams,\n TransportSettings,\n MailerTransporterContext\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { attachOnTransportBeforeSend } from \"~/crud/transport/onTransportBeforeSend\";\nimport { CreateTransportPlugin } from \"~/plugins\";\nimport WebinyError from \"@webiny/error\";\n\nimport { createValidation } from \"./settings/validation\";\n\ninterface BuildMailerParams {\n plugins: CreateTransportPlugin[];\n settings: TransportSettings | null;\n context: MailerContext;\n}\n\nconst buildTransporter = async (params: BuildMailerParams): Promise<Transport> => {\n const { settings, context, plugins } = params;\n\n for (const plugin of plugins) {\n try {\n return await plugin.buildMailerTransport({\n settings,\n context\n });\n } catch (ex) {\n console.log(`Could not build mailer with plugin \"${plugin.name}\".`);\n console.log(ex.message);\n }\n }\n throw new WebinyError(\n \"Could not build mailer via any of the available plugins.\",\n \"MAILER_PLUGINS_ERROR\"\n );\n};\n\nconst getPort = (value: any) => {\n const port = Number(value);\n if (!!value && isNaN(port) === false) {\n return port;\n }\n return 25;\n};\n\nconst getDefaultSettings = (): TransportSettings | null => {\n const input: Partial<TransportSettings> = {\n host: process.env.WEBINY_MAILER_HOST,\n port: getPort(process.env.WEBINY_MAILER_PORT),\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD,\n replyTo: process.env.WEBINY_MAILER_REPLY_TO,\n from: process.env.WEBINY_MAILER_FROM\n };\n /**\n * No need to do the validation if there is not at least one variable defined.\n */\n const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());\n if (!hasAtLeastOneValue) {\n return null;\n }\n\n try {\n const result = createValidation.validate(input);\n\n if (!result.error) {\n return result.value;\n }\n } catch (ex) {}\n\n return null;\n};\n\nexport const createTransporterCrud = async (\n context: MailerContext\n): Promise<MailerTransporterContext> => {\n const transporters: Record<string, Transport> = {};\n\n const defaultSettings: TransportSettings | null = getDefaultSettings();\n /**\n * We need the last possible plugin which is defined.\n * The last plugins are our default ones with the default configurations.\n * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.\n */\n const plugins = context.plugins\n .byType<CreateTransportPlugin>(CreateTransportPlugin.type)\n .reverse();\n\n /**\n * We define possible events to be hooked into.\n */\n const onTransportBeforeSend = createTopic<OnTransportBeforeSendParams>(\n \"mailer.onTransportBeforeSend\"\n );\n const onTransportAfterSend = createTopic<OnTransportAfterSendParams>(\n \"mailer.onTransportAfterSend\"\n );\n const onTransportError = createTopic<OnTransportErrorParams>(\"mailer.onTransportError\");\n /**\n * We attach our default ones.\n */\n attachOnTransportBeforeSend({\n onTransportBeforeSend\n });\n\n const getTransport = async (): Promise<Transport | null> => {\n const tenant = context.tenancy.getCurrentTenant().id;\n\n if (transporters[tenant]) {\n return transporters[tenant];\n }\n\n let settings: TransportSettings | null = null;\n try {\n settings = await context.mailer.getSettings();\n } catch (ex) {\n if (ex.code !== \"PASSWORD_SECRET_ERROR\") {\n console.log(ex.message);\n console.log(ex.code);\n }\n }\n if (!settings && !defaultSettings) {\n console.log(`There are no Mailer transport settings for tenant \"${tenant}\".`);\n }\n const transporter = await buildTransporter({\n settings: settings || defaultSettings,\n plugins,\n context\n });\n\n transporters[tenant] = transporter;\n\n return transporter;\n };\n\n return {\n onTransportBeforeSend,\n onTransportAfterSend,\n onTransportError,\n getTransport,\n sendMail: async data => {\n const transport = await getTransport();\n if (!transport) {\n return {\n result: null,\n error: {\n message: \"There is no transport available.\",\n code: \"NO_TRANSPORT_DEFINED\"\n }\n };\n }\n try {\n await onTransportBeforeSend.publish({\n data,\n transport\n });\n const response = await transport.send(data);\n await onTransportAfterSend.publish({\n data,\n transport\n });\n\n return {\n result: response.result,\n error: response.error\n };\n } catch (ex) {\n await onTransportError.publish({\n error: ex,\n data,\n transport\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;;AACA;;AAEA;;AAQA,MAAMA,gBAAgB,GAAG,MAAOC,MAAP,IAAyD;EAC9E,MAAM;IAAEC,QAAF;IAAYC,OAAZ;IAAqBC;EAArB,IAAiCH,MAAvC;;EAEA,KAAK,MAAMI,MAAX,IAAqBD,OAArB,EAA8B;IAC1B,IAAI;MACA,OAAO,MAAMC,MAAM,CAACC,oBAAP,CAA4B;QACrCJ,QADqC;QAErCC;MAFqC,CAA5B,CAAb;IAIH,CALD,CAKE,OAAOI,EAAP,EAAW;MACTC,OAAO,CAACC,GAAR,CAAa,uCAAsCJ,MAAM,CAACK,IAAK,IAA/D;MACAF,OAAO,CAACC,GAAR,CAAYF,EAAE,CAACI,OAAf;IACH;EACJ;;EACD,MAAM,IAAIC,cAAJ,CACF,0DADE,EAEF,sBAFE,CAAN;AAIH,CAlBD;;AAoBA,MAAMC,OAAO,GAAIC,KAAD,IAAgB;EAC5B,MAAMC,IAAI,GAAGC,MAAM,CAACF,KAAD,CAAnB;;EACA,IAAI,CAAC,CAACA,KAAF,IAAWG,KAAK,CAACF,IAAD,CAAL,KAAgB,KAA/B,EAAsC;IAClC,OAAOA,IAAP;EACH;;EACD,OAAO,EAAP;AACH,CAND;;AAQA,MAAMG,kBAAkB,GAAG,MAAgC;EACvD,MAAMC,KAAiC,GAAG;IACtCC,IAAI,EAAEC,OAAO,CAACC,GAAR,CAAYC,kBADoB;IAEtCR,IAAI,EAAEF,OAAO,CAACQ,OAAO,CAACC,GAAR,CAAYE,kBAAb,CAFyB;IAGtCC,IAAI,EAAEJ,OAAO,CAACC,GAAR,CAAYI,kBAHoB;IAItCC,QAAQ,EAAEN,OAAO,CAACC,GAAR,CAAYM,sBAJgB;IAKtCC,OAAO,EAAER,OAAO,CAACC,GAAR,CAAYQ,sBALiB;IAMtCC,IAAI,EAAEV,OAAO,CAACC,GAAR,CAAYU;EANoB,CAA1C;EAQA;AACJ;AACA;;EACI,MAAMC,kBAAkB,GAAGC,MAAM,CAACC,MAAP,CAAchB,KAAd,EAAqBiB,IAArB,CAA0BtB,KAAK,IAAI,CAAC,CAACuB,MAAM,CAACvB,KAAD,CAAN,CAAcwB,IAAd,EAArC,CAA3B;;EACA,IAAI,CAACL,kBAAL,EAAyB;IACrB,OAAO,IAAP;EACH;;EAED,IAAI;IACA,MAAMM,MAAM,GAAGC,4BAAA,CAAiBC,QAAjB,CAA0BtB,KAA1B,CAAf;;IAEA,IAAI,CAACoB,MAAM,CAACG,KAAZ,EAAmB;MACf,OAAOH,MAAM,CAACzB,KAAd;IACH;EACJ,CAND,CAME,OAAOP,EAAP,EAAW,CAAE;;EAEf,OAAO,IAAP;AACH,CA1BD;;AA4BO,MAAMoC,qBAAqB,GAAG,MACjCxC,OADiC,IAEG;EACpC,MAAMyC,YAAuC,GAAG,EAAhD;EAEA,MAAMC,eAAyC,GAAG3B,kBAAkB,EAApE;EACA;AACJ;AACA;AACA;AACA;;EACI,MAAMd,OAAO,GAAGD,OAAO,CAACC,OAAR,CACX0C,MADW,CACmBC,8BAAA,CAAsBC,IADzC,EAEXC,OAFW,EAAhB;EAIA;AACJ;AACA;;EACI,MAAMC,qBAAqB,GAAG,IAAAC,mBAAA,EAC1B,8BAD0B,CAA9B;EAGA,MAAMC,oBAAoB,GAAG,IAAAD,mBAAA,EACzB,6BADyB,CAA7B;EAGA,MAAME,gBAAgB,GAAG,IAAAF,mBAAA,EAAoC,yBAApC,CAAzB;EACA;AACJ;AACA;;EACI,IAAAG,kDAAA,EAA4B;IACxBJ;EADwB,CAA5B;;EAIA,MAAMK,YAAY,GAAG,YAAuC;IACxD,MAAMC,MAAM,GAAGrD,OAAO,CAACsD,OAAR,CAAgBC,gBAAhB,GAAmCC,EAAlD;;IAEA,IAAIf,YAAY,CAACY,MAAD,CAAhB,EAA0B;MACtB,OAAOZ,YAAY,CAACY,MAAD,CAAnB;IACH;;IAED,IAAItD,QAAkC,GAAG,IAAzC;;IACA,IAAI;MACAA,QAAQ,GAAG,MAAMC,OAAO,CAACyD,MAAR,CAAeC,WAAf,EAAjB;IACH,CAFD,CAEE,OAAOtD,EAAP,EAAW;MACT,IAAIA,EAAE,CAACuD,IAAH,KAAY,uBAAhB,EAAyC;QACrCtD,OAAO,CAACC,GAAR,CAAYF,EAAE,CAACI,OAAf;QACAH,OAAO,CAACC,GAAR,CAAYF,EAAE,CAACuD,IAAf;MACH;IACJ;;IACD,IAAI,CAAC5D,QAAD,IAAa,CAAC2C,eAAlB,EAAmC;MAC/BrC,OAAO,CAACC,GAAR,CAAa,sDAAqD+C,MAAO,IAAzE;IACH;;IACD,MAAMO,WAAW,GAAG,MAAM/D,gBAAgB,CAAC;MACvCE,QAAQ,EAAEA,QAAQ,IAAI2C,eADiB;MAEvCzC,OAFuC;MAGvCD;IAHuC,CAAD,CAA1C;IAMAyC,YAAY,CAACY,MAAD,CAAZ,GAAuBO,WAAvB;IAEA,OAAOA,WAAP;EACH,CA5BD;;EA8BA,OAAO;IACHb,qBADG;IAEHE,oBAFG;IAGHC,gBAHG;IAIHE,YAJG;IAKHS,QAAQ,EAAE,MAAMC,IAAN,IAAc;MACpB,MAAMC,SAAS,GAAG,MAAMX,YAAY,EAApC;;MACA,IAAI,CAACW,SAAL,EAAgB;QACZ,OAAO;UACH3B,MAAM,EAAE,IADL;UAEHG,KAAK,EAAE;YACH/B,OAAO,EAAE,kCADN;YAEHmD,IAAI,EAAE;UAFH;QAFJ,CAAP;MAOH;;MACD,IAAI;QACA,MAAMZ,qBAAqB,CAACiB,OAAtB,CAA8B;UAChCF,IADgC;UAEhCC;QAFgC,CAA9B,CAAN;QAIA,MAAME,QAAQ,GAAG,MAAMF,SAAS,CAACG,IAAV,CAAeJ,IAAf,CAAvB;QACA,MAAMb,oBAAoB,CAACe,OAArB,CAA6B;UAC/BF,IAD+B;UAE/BC;QAF+B,CAA7B,CAAN;QAKA,OAAO;UACH3B,MAAM,EAAE6B,QAAQ,CAAC7B,MADd;UAEHG,KAAK,EAAE0B,QAAQ,CAAC1B;QAFb,CAAP;MAIH,CAfD,CAeE,OAAOnC,EAAP,EAAW;QACT,MAAM8C,gBAAgB,CAACc,OAAjB,CAAyB;UAC3BzB,KAAK,EAAEnC,EADoB;UAE3B0D,IAF2B;UAG3BC;QAH2B,CAAzB,CAAN;QAKA,OAAO;UACH3B,MAAM,EAAE,IADL;UAEHG,KAAK,EAAE;YACH/B,OAAO,EAAEJ,EAAE,CAACI,OADT;YAEHmD,IAAI,EAAEvD,EAAE,CAACuD,IAFN;YAGHG,IAAI;cACAA;YADA,GAEG1D,EAAE,CAAC0D,IAFN;UAHD;QAFJ,CAAP;MAWH;IACJ;EAjDE,CAAP;AAmDH,CAjHM"}
|
package/graphql/settings.js
CHANGED
|
@@ -20,6 +20,7 @@ const createSettingsGraphQL = () => {
|
|
|
20
20
|
|
|
21
21
|
type MailerTransportSettings {
|
|
22
22
|
host: String
|
|
23
|
+
port: Number
|
|
23
24
|
user: String
|
|
24
25
|
from: String
|
|
25
26
|
replyTo: String
|
|
@@ -36,6 +37,7 @@ const createSettingsGraphQL = () => {
|
|
|
36
37
|
|
|
37
38
|
input TransportSettingsInput {
|
|
38
39
|
host: String!
|
|
40
|
+
port: Number
|
|
39
41
|
user: String!
|
|
40
42
|
password: String
|
|
41
43
|
from: String!
|
package/graphql/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["emptyResolver","createSettingsGraphQL","GraphQLSchemaPlugin","typeDefs","resolvers","Query","mailer","MailerQuery","getSettings","_","__","context","settings","password","Response","ex","ErrorResponse","Mutation","MailerMutation","saveSettings","args","input","data"],"sources":["settings.ts"],"sourcesContent":["import { ErrorResponse, GraphQLSchemaPlugin, Response } from \"@webiny/handler-graphql\";\nimport { MailerContext } from \"~/types\";\n\nconst emptyResolver = () => ({});\n\nexport const createSettingsGraphQL = () => {\n return new GraphQLSchemaPlugin<MailerContext>({\n typeDefs: `\n type MailerTransportSettingsError {\n message: String!\n code: String\n data: JSON\n }\n \n type MailerTransportSettings {\n host: String\n user: String\n from: String\n replyTo: String\n }\n \n type MailerSettingsResponse {\n data: MailerTransportSettings\n error: MailerTransportSettingsError\n }\n \n type MailerQuery {\n getSettings: MailerSettingsResponse!\n }\n \n input TransportSettingsInput {\n host: String!\n user: String!\n password: String\n from: String!\n replyTo: String\n }\n \n type MailerMutation {\n saveSettings(data: TransportSettingsInput!): MailerSettingsResponse!\n }\n \n extend type Query {\n mailer: MailerQuery\n }\n extend type Mutation {\n mailer: MailerMutation\n }\n `,\n resolvers: {\n Query: {\n mailer: emptyResolver\n },\n MailerQuery: {\n getSettings: async (_, __, context) => {\n try {\n const settings = await context.mailer.getSettings();\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n },\n Mutation: {\n mailer: emptyResolver\n },\n MailerMutation: {\n saveSettings: async (_, args: any, context) => {\n try {\n const settings = await context.mailer.saveSettings({\n input: args.data\n });\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n }\n }\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAGA,MAAMA,aAAa,GAAG,OAAO,EAAP,CAAtB;;AAEO,MAAMC,qBAAqB,GAAG,MAAM;EACvC,OAAO,IAAIC,mCAAJ,CAAuC;IAC1CC,QAAQ,EAAG;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,
|
|
1
|
+
{"version":3,"names":["emptyResolver","createSettingsGraphQL","GraphQLSchemaPlugin","typeDefs","resolvers","Query","mailer","MailerQuery","getSettings","_","__","context","settings","password","Response","ex","ErrorResponse","Mutation","MailerMutation","saveSettings","args","input","data"],"sources":["settings.ts"],"sourcesContent":["import { ErrorResponse, GraphQLSchemaPlugin, Response } from \"@webiny/handler-graphql\";\nimport { MailerContext } from \"~/types\";\n\nconst emptyResolver = () => ({});\n\nexport const createSettingsGraphQL = () => {\n return new GraphQLSchemaPlugin<MailerContext>({\n typeDefs: `\n type MailerTransportSettingsError {\n message: String!\n code: String\n data: JSON\n }\n \n type MailerTransportSettings {\n host: String\n port: Number\n user: String\n from: String\n replyTo: String\n }\n \n type MailerSettingsResponse {\n data: MailerTransportSettings\n error: MailerTransportSettingsError\n }\n \n type MailerQuery {\n getSettings: MailerSettingsResponse!\n }\n \n input TransportSettingsInput {\n host: String!\n port: Number\n user: String!\n password: String\n from: String!\n replyTo: String\n }\n \n type MailerMutation {\n saveSettings(data: TransportSettingsInput!): MailerSettingsResponse!\n }\n \n extend type Query {\n mailer: MailerQuery\n }\n extend type Mutation {\n mailer: MailerMutation\n }\n `,\n resolvers: {\n Query: {\n mailer: emptyResolver\n },\n MailerQuery: {\n getSettings: async (_, __, context) => {\n try {\n const settings = await context.mailer.getSettings();\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n },\n Mutation: {\n mailer: emptyResolver\n },\n MailerMutation: {\n saveSettings: async (_, args: any, context) => {\n try {\n const settings = await context.mailer.saveSettings({\n input: args.data\n });\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n }\n }\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAGA,MAAMA,aAAa,GAAG,OAAO,EAAP,CAAtB;;AAEO,MAAMC,qBAAqB,GAAG,MAAM;EACvC,OAAO,IAAIC,mCAAJ,CAAuC;IAC1CC,QAAQ,EAAG;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SA5CkD;IA6C1CC,SAAS,EAAE;MACPC,KAAK,EAAE;QACHC,MAAM,EAAEN;MADL,CADA;MAIPO,WAAW,EAAE;QACTC,WAAW,EAAE,OAAOC,CAAP,EAAUC,EAAV,EAAcC,OAAd,KAA0B;UACnC,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAR,CAAeE,WAAf,EAAvB;YACA;AACxB;AACA;;YACwB,IAAII,QAAJ,EAAc;cACV;cACA,OAAOA,QAAQ,CAACC,QAAhB;YACH;;YACD,OAAO,IAAIC,wBAAJ,CAAaF,QAAb,CAAP;UACH,CAVD,CAUE,OAAOG,EAAP,EAAW;YACT,OAAO,IAAIC,6BAAJ,CAAkBD,EAAlB,CAAP;UACH;QACJ;MAfQ,CAJN;MAqBPE,QAAQ,EAAE;QACNX,MAAM,EAAEN;MADF,CArBH;MAwBPkB,cAAc,EAAE;QACZC,YAAY,EAAE,OAAOV,CAAP,EAAUW,IAAV,EAAqBT,OAArB,KAAiC;UAC3C,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAR,CAAea,YAAf,CAA4B;cAC/CE,KAAK,EAAED,IAAI,CAACE;YADmC,CAA5B,CAAvB;YAGA;AACxB;AACA;;YACwB,IAAIV,QAAJ,EAAc;cACV;cACA,OAAOA,QAAQ,CAACC,QAAhB;YACH;;YACD,OAAO,IAAIC,wBAAJ,CAAaF,QAAb,CAAP;UACH,CAZD,CAYE,OAAOG,EAAP,EAAW;YACT,OAAO,IAAIC,6BAAJ,CAAkBD,EAAlB,CAAP;UACH;QACJ;MAjBW;IAxBT;EA7C+B,CAAvC,CAAP;AA0FH,CA3FM"}
|
package/index.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ import { createSmtpTransport, SmtpTransport, SmtpTransportConfig } from "./trans
|
|
|
4
4
|
import { createTransport } from "./plugins";
|
|
5
5
|
export { createDummyTransport, createSmtpTransport, createTransport };
|
|
6
6
|
export type { SmtpTransport, SmtpTransportConfig, DummyTransport };
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const createMailerContext: () => PluginCollection;
|
|
8
|
+
export declare const createMailerGraphQL: () => import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("./types").MailerContext>[];
|
package/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
@@ -9,7 +11,7 @@ Object.defineProperty(exports, "createDummyTransport", {
|
|
|
9
11
|
return _createDummyTransport.createDummyTransport;
|
|
10
12
|
}
|
|
11
13
|
});
|
|
12
|
-
exports.
|
|
14
|
+
exports.createMailerGraphQL = exports.createMailerContext = void 0;
|
|
13
15
|
Object.defineProperty(exports, "createSmtpTransport", {
|
|
14
16
|
enumerable: true,
|
|
15
17
|
get: function () {
|
|
@@ -23,6 +25,8 @@ Object.defineProperty(exports, "createTransport", {
|
|
|
23
25
|
}
|
|
24
26
|
});
|
|
25
27
|
|
|
28
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
29
|
+
|
|
26
30
|
var _context = require("./context");
|
|
27
31
|
|
|
28
32
|
var _createDummyTransport = require("./transports/createDummyTransport");
|
|
@@ -37,7 +41,7 @@ var _group = require("./crud/group");
|
|
|
37
41
|
|
|
38
42
|
var _graphql = require("./graphql");
|
|
39
43
|
|
|
40
|
-
const
|
|
44
|
+
const createMailerContext = () => {
|
|
41
45
|
const group = (0, _group.createGroup)();
|
|
42
46
|
return [group,
|
|
43
47
|
/**
|
|
@@ -55,11 +59,31 @@ const createMailer = () => {
|
|
|
55
59
|
/**
|
|
56
60
|
* Smtp mailer goes into the plugins after the dummy one because plugins are loaded in reverse.
|
|
57
61
|
*/
|
|
58
|
-
(0, _plugins.createTransport)(async
|
|
59
|
-
|
|
62
|
+
(0, _plugins.createTransport)(async ({
|
|
63
|
+
settings
|
|
64
|
+
}) => {
|
|
65
|
+
/**
|
|
66
|
+
* We need to map our settings to the required settings for the SMTP NodeMailer transport.
|
|
67
|
+
*/
|
|
68
|
+
const config = (0, _objectSpread2.default)({}, settings || {});
|
|
69
|
+
|
|
70
|
+
if (settings) {
|
|
71
|
+
config.auth = {
|
|
72
|
+
user: settings.user,
|
|
73
|
+
pass: settings.password
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const plugin = await (0, _createSmtpTransport.createSmtpTransport)(config);
|
|
60
78
|
plugin.name = "smtp-default";
|
|
61
79
|
return plugin;
|
|
62
|
-
}), (0, _context.createMailerContext)()
|
|
80
|
+
}), (0, _context.createMailerContext)()];
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
exports.createMailerContext = createMailerContext;
|
|
84
|
+
|
|
85
|
+
const createMailerGraphQL = () => {
|
|
86
|
+
return [...(0, _graphql.createGraphQL)()];
|
|
63
87
|
};
|
|
64
88
|
|
|
65
|
-
exports.
|
|
89
|
+
exports.createMailerGraphQL = createMailerGraphQL;
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["createMailerContext","group","createGroup","createSettingsModel","createTransport","plugin","createDummyTransport","name","settings","config","auth","user","pass","password","createSmtpTransport","createMailerContextPlugin","createMailerGraphQL","createGraphQL"],"sources":["index.ts"],"sourcesContent":["import { PluginCollection } from \"@webiny/plugins/types\";\nimport { createMailerContext as createMailerContextPlugin } from \"~/context\";\nimport { createDummyTransport, DummyTransport } from \"~/transports/createDummyTransport\";\nimport {\n createSmtpTransport,\n SmtpTransport,\n SmtpTransportConfig\n} from \"~/transports/createSmtpTransport\";\nimport { createTransport } from \"~/plugins\";\nimport { createSettingsModel } from \"~/crud/settings/model\";\nimport { createGroup } from \"~/crud/group\";\nimport { createGraphQL } from \"~/graphql\";\n\nexport { createDummyTransport, createSmtpTransport, createTransport };\nexport type { SmtpTransport, SmtpTransportConfig, DummyTransport };\n\nexport const createMailerContext = (): PluginCollection => {\n const group = createGroup();\n return [\n group,\n /**\n * Groups and models to use via the CMS\n */\n createSettingsModel(group),\n /**\n * If something is wrong with the smtp mailer, we will initialize the dummy one.\n */\n createTransport(async () => {\n const plugin = await createDummyTransport();\n plugin.name = \"dummy-default\";\n return plugin;\n }),\n /**\n * Smtp mailer goes into the plugins after the dummy one because plugins are loaded in reverse.\n */\n createTransport(async ({ settings }) => {\n /**\n * We need to map our settings to the required settings for the SMTP NodeMailer transport.\n */\n const config: SmtpTransportConfig = {\n ...(settings || {})\n };\n if (settings) {\n config.auth = {\n user: settings.user,\n pass: settings.password\n };\n }\n const plugin = await createSmtpTransport(config);\n plugin.name = \"smtp-default\";\n return plugin;\n }),\n createMailerContextPlugin()\n ];\n};\n\nexport const createMailerGraphQL = () => {\n return [...createGraphQL()];\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAKA;;AACA;;AACA;;AACA;;AAKO,MAAMA,mBAAmB,GAAG,MAAwB;EACvD,MAAMC,KAAK,GAAG,IAAAC,kBAAA,GAAd;EACA,OAAO,CACHD,KADG;EAEH;AACR;AACA;EACQ,IAAAE,0BAAA,EAAoBF,KAApB,CALG;EAMH;AACR;AACA;EACQ,IAAAG,wBAAA,EAAgB,YAAY;IACxB,MAAMC,MAAM,GAAG,MAAM,IAAAC,0CAAA,GAArB;IACAD,MAAM,CAACE,IAAP,GAAc,eAAd;IACA,OAAOF,MAAP;EACH,CAJD,CATG;EAcH;AACR;AACA;EACQ,IAAAD,wBAAA,EAAgB,OAAO;IAAEI;EAAF,CAAP,KAAwB;IACpC;AACZ;AACA;IACY,MAAMC,MAA2B,mCACzBD,QAAQ,IAAI,EADa,CAAjC;;IAGA,IAAIA,QAAJ,EAAc;MACVC,MAAM,CAACC,IAAP,GAAc;QACVC,IAAI,EAAEH,QAAQ,CAACG,IADL;QAEVC,IAAI,EAAEJ,QAAQ,CAACK;MAFL,CAAd;IAIH;;IACD,MAAMR,MAAM,GAAG,MAAM,IAAAS,wCAAA,EAAoBL,MAApB,CAArB;IACAJ,MAAM,CAACE,IAAP,GAAc,cAAd;IACA,OAAOF,MAAP;EACH,CAhBD,CAjBG,EAkCH,IAAAU,4BAAA,GAlCG,CAAP;AAoCH,CAtCM;;;;AAwCA,MAAMC,mBAAmB,GAAG,MAAM;EACrC,OAAO,CAAC,GAAG,IAAAC,sBAAA,GAAJ,CAAP;AACH,CAFM"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-mailer",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.40876133bb",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@babel/runtime": "7.19.0",
|
|
18
|
-
"@webiny/api": "0.0.0-unstable.
|
|
19
|
-
"@webiny/api-headless-cms": "0.0.0-unstable.
|
|
20
|
-
"@webiny/error": "0.0.0-unstable.
|
|
21
|
-
"@webiny/handler-graphql": "0.0.0-unstable.
|
|
22
|
-
"@webiny/plugins": "0.0.0-unstable.
|
|
23
|
-
"@webiny/pubsub": "0.0.0-unstable.
|
|
18
|
+
"@webiny/api": "0.0.0-unstable.40876133bb",
|
|
19
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.40876133bb",
|
|
20
|
+
"@webiny/error": "0.0.0-unstable.40876133bb",
|
|
21
|
+
"@webiny/handler-graphql": "0.0.0-unstable.40876133bb",
|
|
22
|
+
"@webiny/plugins": "0.0.0-unstable.40876133bb",
|
|
23
|
+
"@webiny/pubsub": "0.0.0-unstable.40876133bb",
|
|
24
24
|
"crypto-js": "4.1.1",
|
|
25
25
|
"joi": "17.6.2",
|
|
26
26
|
"lodash": "4.17.21",
|
|
@@ -33,19 +33,19 @@
|
|
|
33
33
|
"@babel/preset-typescript": "^7.18.6",
|
|
34
34
|
"@types/crypto-js": "^4.1.1",
|
|
35
35
|
"@types/nodemailer": "^6.4.4",
|
|
36
|
-
"@webiny/api-headless-cms-ddb": "^0.0.0-unstable.
|
|
37
|
-
"@webiny/api-i18n": "^0.0.0-unstable.
|
|
38
|
-
"@webiny/api-i18n-ddb": "^0.0.0-unstable.
|
|
39
|
-
"@webiny/api-security": "^0.0.0-unstable.
|
|
40
|
-
"@webiny/api-security-so-ddb": "^0.0.0-unstable.
|
|
41
|
-
"@webiny/api-tenancy": "^0.0.0-unstable.
|
|
42
|
-
"@webiny/api-tenancy-so-ddb": "^0.0.0-unstable.
|
|
43
|
-
"@webiny/cli": "^0.0.0-unstable.
|
|
44
|
-
"@webiny/db-dynamodb": "^0.0.0-unstable.
|
|
45
|
-
"@webiny/handler": "^0.0.0-unstable.
|
|
46
|
-
"@webiny/handler-aws": "^0.0.0-unstable.
|
|
47
|
-
"@webiny/handler-db": "^0.0.0-unstable.
|
|
48
|
-
"@webiny/project-utils": "^0.0.0-unstable.
|
|
36
|
+
"@webiny/api-headless-cms-ddb": "^0.0.0-unstable.40876133bb",
|
|
37
|
+
"@webiny/api-i18n": "^0.0.0-unstable.40876133bb",
|
|
38
|
+
"@webiny/api-i18n-ddb": "^0.0.0-unstable.40876133bb",
|
|
39
|
+
"@webiny/api-security": "^0.0.0-unstable.40876133bb",
|
|
40
|
+
"@webiny/api-security-so-ddb": "^0.0.0-unstable.40876133bb",
|
|
41
|
+
"@webiny/api-tenancy": "^0.0.0-unstable.40876133bb",
|
|
42
|
+
"@webiny/api-tenancy-so-ddb": "^0.0.0-unstable.40876133bb",
|
|
43
|
+
"@webiny/cli": "^0.0.0-unstable.40876133bb",
|
|
44
|
+
"@webiny/db-dynamodb": "^0.0.0-unstable.40876133bb",
|
|
45
|
+
"@webiny/handler": "^0.0.0-unstable.40876133bb",
|
|
46
|
+
"@webiny/handler-aws": "^0.0.0-unstable.40876133bb",
|
|
47
|
+
"@webiny/handler-db": "^0.0.0-unstable.40876133bb",
|
|
48
|
+
"@webiny/project-utils": "^0.0.0-unstable.40876133bb",
|
|
49
49
|
"graphql": "^15.7.2",
|
|
50
50
|
"jest": "^28.1.0",
|
|
51
51
|
"jest-dynalite": "^3.6.1",
|
|
@@ -61,5 +61,5 @@
|
|
|
61
61
|
"build": "yarn webiny run build",
|
|
62
62
|
"watch": "yarn webiny run watch"
|
|
63
63
|
},
|
|
64
|
-
"gitHead": "
|
|
64
|
+
"gitHead": "f33811072795d25c5787ae39808e75e3312fb247"
|
|
65
65
|
}
|
|
@@ -9,4 +9,4 @@ export declare type SmtpTransportConfig = Options;
|
|
|
9
9
|
export interface SmtpTransport extends Transport {
|
|
10
10
|
transporter: Transporter<SMTPTransport.SentMessageInfo>;
|
|
11
11
|
}
|
|
12
|
-
export declare const createSmtpTransport: (
|
|
12
|
+
export declare const createSmtpTransport: (initialConfig?: Partial<SmtpTransportConfig> | null) => SmtpTransport;
|
|
@@ -17,11 +17,32 @@ var _nodemailer = _interopRequireDefault(require("nodemailer"));
|
|
|
17
17
|
* Nodemailer docs
|
|
18
18
|
* https://nodemailer.com/about/
|
|
19
19
|
*/
|
|
20
|
-
const
|
|
21
|
-
|
|
20
|
+
const configDefaults = {
|
|
21
|
+
socketTimeout: 15000,
|
|
22
|
+
connectionTimeout: 15000,
|
|
23
|
+
greetingTimeout: 15000
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const applyDefaults = initialConfig => {
|
|
27
|
+
return Object.keys(configDefaults).reduce((config, key) => {
|
|
28
|
+
const configKey = key;
|
|
29
|
+
|
|
30
|
+
if (config[configKey] === undefined || config[configKey] === null) {
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
config[configKey] = configDefaults[configKey];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return config;
|
|
36
|
+
}, (0, _objectSpread2.default)({}, initialConfig));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const createSmtpTransport = initialConfig => {
|
|
40
|
+
if (!initialConfig || typeof initialConfig !== "object" || Object.keys(initialConfig).length === 0) {
|
|
22
41
|
throw new _error.default("There is no configuration for the SMTP transport.");
|
|
23
42
|
}
|
|
24
43
|
|
|
44
|
+
const config = applyDefaults(initialConfig);
|
|
45
|
+
|
|
25
46
|
const transporter = _nodemailer.default.createTransport(config);
|
|
26
47
|
|
|
27
48
|
return {
|
|
@@ -53,7 +74,7 @@ const createSmtpTransport = config => {
|
|
|
53
74
|
|
|
54
75
|
if (result.messageId) {
|
|
55
76
|
return {
|
|
56
|
-
result:
|
|
77
|
+
result: result.response,
|
|
57
78
|
error: null
|
|
58
79
|
};
|
|
59
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["configDefaults","socketTimeout","connectionTimeout","greetingTimeout","applyDefaults","initialConfig","Object","keys","reduce","config","key","configKey","undefined","createSmtpTransport","length","WebinyError","transporter","nodemailer","createTransport","name","send","params","replyTo","text","html","to","bcc","cc","from","subject","result","sendMail","messageId","response","error","message","code","data","ex"],"sources":["createSmtpTransport.ts"],"sourcesContent":["/**\n * Nodemailer docs\n * https://nodemailer.com/about/\n */\nimport { Transport } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport nodemailer, { Transporter } from \"nodemailer\";\nimport SMTPTransport, { Options } from \"nodemailer/lib/smtp-transport\";\n\nexport type SmtpTransportConfig = Options;\n\nexport interface SmtpTransport extends Transport {\n transporter: Transporter<SMTPTransport.SentMessageInfo>;\n}\n\nconst configDefaults: Partial<SmtpTransportConfig> = {\n socketTimeout: 15000,\n connectionTimeout: 15000,\n greetingTimeout: 15000\n};\n\nconst applyDefaults = (\n initialConfig: Partial<SmtpTransportConfig>\n): Partial<SmtpTransportConfig> => {\n return Object.keys(configDefaults).reduce<Partial<SmtpTransportConfig>>(\n (config, key) => {\n const configKey = key as unknown as keyof SmtpTransportConfig;\n if (config[configKey] === undefined || config[configKey] === null) {\n // @ts-ignore\n config[configKey] = configDefaults[configKey];\n }\n\n return config;\n },\n { ...initialConfig }\n );\n};\n\nexport const createSmtpTransport = (\n initialConfig?: Partial<SmtpTransportConfig> | null\n): SmtpTransport => {\n if (\n !initialConfig ||\n typeof initialConfig !== \"object\" ||\n Object.keys(initialConfig).length === 0\n ) {\n throw new WebinyError(\"There is no configuration for the SMTP transport.\");\n }\n\n const config = applyDefaults(initialConfig);\n\n const transporter = nodemailer.createTransport(config);\n\n return {\n name: \"smtp-default\",\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: result.response,\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;;AANA;AACA;AACA;AACA;AAYA,MAAMA,cAA4C,GAAG;EACjDC,aAAa,EAAE,KADkC;EAEjDC,iBAAiB,EAAE,KAF8B;EAGjDC,eAAe,EAAE;AAHgC,CAArD;;AAMA,MAAMC,aAAa,GACfC,aADkB,IAEa;EAC/B,OAAOC,MAAM,CAACC,IAAP,CAAYP,cAAZ,EAA4BQ,MAA5B,CACH,CAACC,MAAD,EAASC,GAAT,KAAiB;IACb,MAAMC,SAAS,GAAGD,GAAlB;;IACA,IAAID,MAAM,CAACE,SAAD,CAAN,KAAsBC,SAAtB,IAAmCH,MAAM,CAACE,SAAD,CAAN,KAAsB,IAA7D,EAAmE;MAC/D;MACAF,MAAM,CAACE,SAAD,CAAN,GAAoBX,cAAc,CAACW,SAAD,CAAlC;IACH;;IAED,OAAOF,MAAP;EACH,CATE,kCAUEJ,aAVF,EAAP;AAYH,CAfD;;AAiBO,MAAMQ,mBAAmB,GAC5BR,aAD+B,IAEf;EAChB,IACI,CAACA,aAAD,IACA,OAAOA,aAAP,KAAyB,QADzB,IAEAC,MAAM,CAACC,IAAP,CAAYF,aAAZ,EAA2BS,MAA3B,KAAsC,CAH1C,EAIE;IACE,MAAM,IAAIC,cAAJ,CAAgB,mDAAhB,CAAN;EACH;;EAED,MAAMN,MAAM,GAAGL,aAAa,CAACC,aAAD,CAA5B;;EAEA,MAAMW,WAAW,GAAGC,mBAAA,CAAWC,eAAX,CAA2BT,MAA3B,CAApB;;EAEA,OAAO;IACHU,IAAI,EAAE,cADH;IAEHH,WAFG;IAGHI,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,MAAMd,WAAW,CAACe,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,EAAEA,MAAM,CAACG,QADZ;YAEHC,KAAK,EAAE;UAFJ,CAAP;QAIH;;QAED,MAAM,IAAInB,cAAJ,CAAgB;UAClBoB,OAAO,EACH,sFAFc;UAGlBC,IAAI,EAAE,cAHY;UAIlBC,IAAI,kCACGP,MADH;QAJc,CAAhB,CAAN;MAQH,CA1BD,CA0BE,OAAOQ,EAAP,EAAW;QACT,OAAO;UACHR,MAAM,EAAE,IADL;UAEHI,KAAK,EAAE;YACHC,OAAO,EAAEG,EAAE,CAACH,OADT;YAEHC,IAAI,EAAEE,EAAE,CAACF,IAFN;YAGHC,IAAI,8DACGhB,MADH,GAEGiB,EAAE,CAACD,IAFN;UAHD;QAFJ,CAAP;MAWH;IACJ;EA7CE,CAAP;AA+CH,CA9DM"}
|
package/types.d.ts
CHANGED
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import { CmsContext } from \"@webiny/api-headless-cms/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\n\nexport interface MailerTransporterContext<T extends Transport = Transport> {\n onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;\n onTransportAfterSend: Topic<OnTransportAfterSendParams>;\n onTransportError: Topic<OnTransportErrorParams>;\n getTransport: () => Promise<T | null>;\n sendMail: <D>(data: TransportSendData) => Promise<TransportSendResponse<D>>;\n}\n\nexport interface MailerSettingsCreateParams {\n input: Partial<TransportSettings>;\n}\nexport interface MailerSettingsUpdateParams {\n input: Partial<TransportSettings>;\n original?: ExtendedTransportSettings | null;\n}\n\nexport interface MailerSettingsSaveParams {\n input: Partial<TransportSettings>;\n}\n\nexport interface OnSettingsBeforeGetTopicParams {\n tenant: string;\n}\n\nexport interface OnSettingsAfterGetTopicParams {\n tenant: string;\n settings: TransportSettings | null;\n}\n\nexport interface OnSettingsGetErrorTopicParams {\n tenant: string;\n error: Error;\n}\n\nexport interface OnSettingsBeforeCreateTopicParams {\n settings: TransportSettings;\n}\n\nexport interface OnSettingsAfterCreateTopicParams {\n settings: TransportSettings;\n}\n\nexport interface OnSettingsCreateErrorTopicParams {\n settings: TransportSettings;\n error: Error;\n}\n\nexport interface OnSettingsBeforeUpdateTopicParams {\n settings: TransportSettings;\n original: TransportSettings;\n}\n\nexport interface OnSettingsAfterUpdateTopicParams {\n original: TransportSettings;\n settings: TransportSettings;\n}\n\nexport interface OnSettingsUpdateErrorTopicParams {\n original: TransportSettings;\n settings: TransportSettings;\n error: Error;\n}\n\nexport interface ExtendedTransportSettings extends TransportSettings {\n id: string;\n}\n\nexport interface MailerSettingsContext {\n getSettings: () => Promise<ExtendedTransportSettings | null>;\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n createSettings: (params: MailerSettingsCreateParams) => Promise<TransportSettings>;\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n updateSettings: (params: MailerSettingsUpdateParams) => Promise<TransportSettings>;\n /**\n * Use to store the settings data.\n */\n saveSettings: (params: MailerSettingsSaveParams) => Promise<TransportSettings>;\n /**\n * Lifecycle events\n */\n onSettingsBeforeGet: Topic<OnSettingsBeforeGetTopicParams>;\n onSettingsAfterGet: Topic<OnSettingsAfterGetTopicParams>;\n onSettingsGetError: Topic<OnSettingsGetErrorTopicParams>;\n onSettingsBeforeCreate: Topic<OnSettingsBeforeCreateTopicParams>;\n onSettingsAfterCreate: Topic<OnSettingsAfterCreateTopicParams>;\n onSettingsCreateError: Topic<OnSettingsCreateErrorTopicParams>;\n onSettingsBeforeUpdate: Topic<OnSettingsBeforeUpdateTopicParams>;\n onSettingsAfterUpdate: Topic<OnSettingsAfterUpdateTopicParams>;\n onSettingsUpdateError: Topic<OnSettingsUpdateErrorTopicParams>;\n}\n\nexport interface MailerContextObject<T extends Transport = Transport>\n extends MailerTransporterContext<T>,\n MailerSettingsContext {}\nexport interface MailerContext extends CmsContext {\n mailer: MailerContextObject;\n}\n\nexport interface OnTransportBeforeSendParams {\n data: TransportSendData;\n transport: Transport;\n}\nexport interface OnTransportAfterSendParams {\n data: TransportSendData;\n transport: Transport;\n}\nexport interface OnTransportErrorParams {\n error: Error;\n data: TransportSendData;\n transport: Transport;\n}\n\n/**\n * Interface to implement the actual mailer.\n */\nexport interface TransportSendResponse<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\ninterface TransportSendToData {\n to: string[];\n}\ninterface TransportSendCcData {\n cc: string[];\n}\ninterface TransportSendBccData {\n bcc: string[];\n}\n\ninterface BaseTransportSendData {\n to?: string[];\n cc?: string[];\n bcc?: string[];\n from?: string;\n subject: string;\n text: string;\n html?: string;\n replyTo?: string;\n}\n\nexport type TransportSendData = BaseTransportSendData &\n (TransportSendToData | TransportSendBccData | TransportSendCcData);\nexport interface Transport<T = any> {\n name: string;\n send: (params: TransportSendData) => Promise<TransportSendResponse<T>>;\n}\n\nexport interface TransportSettings {\n host: string;\n user: string;\n password: string;\n from: string;\n replyTo?: string;\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import { CmsContext } from \"@webiny/api-headless-cms/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\n\nexport interface MailerTransporterContext<T extends Transport = Transport> {\n onTransportBeforeSend: Topic<OnTransportBeforeSendParams>;\n onTransportAfterSend: Topic<OnTransportAfterSendParams>;\n onTransportError: Topic<OnTransportErrorParams>;\n getTransport: () => Promise<T | null>;\n sendMail: <D>(data: TransportSendData) => Promise<TransportSendResponse<D>>;\n}\n\nexport interface MailerSettingsCreateParams {\n input: Partial<TransportSettings>;\n}\nexport interface MailerSettingsUpdateParams {\n input: Partial<TransportSettings>;\n original?: ExtendedTransportSettings | null;\n}\n\nexport interface MailerSettingsSaveParams {\n input: Partial<TransportSettings>;\n}\n\nexport interface OnSettingsBeforeGetTopicParams {\n tenant: string;\n}\n\nexport interface OnSettingsAfterGetTopicParams {\n tenant: string;\n settings: TransportSettings | null;\n}\n\nexport interface OnSettingsGetErrorTopicParams {\n tenant: string;\n error: Error;\n}\n\nexport interface OnSettingsBeforeCreateTopicParams {\n settings: TransportSettings;\n}\n\nexport interface OnSettingsAfterCreateTopicParams {\n settings: TransportSettings;\n}\n\nexport interface OnSettingsCreateErrorTopicParams {\n settings: TransportSettings;\n error: Error;\n}\n\nexport interface OnSettingsBeforeUpdateTopicParams {\n settings: TransportSettings;\n original: TransportSettings;\n}\n\nexport interface OnSettingsAfterUpdateTopicParams {\n original: TransportSettings;\n settings: TransportSettings;\n}\n\nexport interface OnSettingsUpdateErrorTopicParams {\n original: TransportSettings;\n settings: TransportSettings;\n error: Error;\n}\n\nexport interface ExtendedTransportSettings extends TransportSettings {\n id: string;\n}\n\nexport interface MailerSettingsContext {\n getSettings: () => Promise<ExtendedTransportSettings | null>;\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n createSettings: (params: MailerSettingsCreateParams) => Promise<TransportSettings>;\n /**\n * Method should not be used outside of mailer\n * @internal\n */\n updateSettings: (params: MailerSettingsUpdateParams) => Promise<TransportSettings>;\n /**\n * Use to store the settings data.\n */\n saveSettings: (params: MailerSettingsSaveParams) => Promise<TransportSettings>;\n /**\n * Lifecycle events\n */\n onSettingsBeforeGet: Topic<OnSettingsBeforeGetTopicParams>;\n onSettingsAfterGet: Topic<OnSettingsAfterGetTopicParams>;\n onSettingsGetError: Topic<OnSettingsGetErrorTopicParams>;\n onSettingsBeforeCreate: Topic<OnSettingsBeforeCreateTopicParams>;\n onSettingsAfterCreate: Topic<OnSettingsAfterCreateTopicParams>;\n onSettingsCreateError: Topic<OnSettingsCreateErrorTopicParams>;\n onSettingsBeforeUpdate: Topic<OnSettingsBeforeUpdateTopicParams>;\n onSettingsAfterUpdate: Topic<OnSettingsAfterUpdateTopicParams>;\n onSettingsUpdateError: Topic<OnSettingsUpdateErrorTopicParams>;\n}\n\nexport interface MailerContextObject<T extends Transport = Transport>\n extends MailerTransporterContext<T>,\n MailerSettingsContext {}\nexport interface MailerContext extends CmsContext {\n mailer: MailerContextObject;\n}\n\nexport interface OnTransportBeforeSendParams {\n data: TransportSendData;\n transport: Transport;\n}\nexport interface OnTransportAfterSendParams {\n data: TransportSendData;\n transport: Transport;\n}\nexport interface OnTransportErrorParams {\n error: Error;\n data: TransportSendData;\n transport: Transport;\n}\n\n/**\n * Interface to implement the actual mailer.\n */\nexport interface TransportSendResponse<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\ninterface TransportSendToData {\n to: string[];\n}\ninterface TransportSendCcData {\n cc: string[];\n}\ninterface TransportSendBccData {\n bcc: string[];\n}\n\ninterface BaseTransportSendData {\n to?: string[];\n cc?: string[];\n bcc?: string[];\n from?: string;\n subject: string;\n text: string;\n html?: string;\n replyTo?: string;\n}\n\nexport type TransportSendData = BaseTransportSendData &\n (TransportSendToData | TransportSendBccData | TransportSendCcData);\nexport interface Transport<T = any> {\n name: string;\n send: (params: TransportSendData) => Promise<TransportSendResponse<T>>;\n}\n\nexport interface TransportSettings {\n host: string;\n port: number;\n user: string;\n password: string;\n from: string;\n replyTo?: string;\n}\n"],"mappings":""}
|