@webiny/api-mailer 0.0.0-unstable.6e5425ee89 → 0.0.0-unstable.7f63ea0744
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/settings/validation.d.ts +45 -4
- package/crud/settings/validation.js +11 -14
- package/crud/settings/validation.js.map +1 -1
- package/crud/settings.crud.js +12 -14
- package/crud/settings.crud.js.map +1 -1
- package/crud/transport/onTransportBeforeSend.js +23 -21
- package/crud/transport/onTransportBeforeSend.js.map +1 -1
- package/crud/transporter.crud.js +2 -7
- package/crud/transporter.crud.js.map +1 -1
- package/graphql/settings.js +8 -8
- package/graphql/settings.js.map +1 -1
- package/package.json +24 -24
- package/crud/mailer/onBeforeSend.d.ts +0 -7
- package/crud/mailer/onBeforeSend.js +0 -69
- package/crud/mailer/onBeforeSend.js.map +0 -1
- package/crud/mailer.crud.d.ts +0 -2
- package/crud/mailer.crud.js +0 -123
- package/crud/mailer.crud.js.map +0 -1
- package/mailers/createDummyMailer.d.ts +0 -5
- package/mailers/createDummyMailer.js +0 -24
- package/mailers/createDummyMailer.js.map +0 -1
- package/mailers/createSmtpMailer.d.ts +0 -13
- package/mailers/createSmtpMailer.js +0 -106
- package/mailers/createSmtpMailer.js.map +0 -1
|
@@ -1,4 +1,45 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import zod from "zod";
|
|
2
|
+
export declare const createValidation: zod.ZodObject<{
|
|
3
|
+
password: zod.ZodString;
|
|
4
|
+
from: zod.ZodString;
|
|
5
|
+
port: zod.ZodDefault<zod.ZodNumber>;
|
|
6
|
+
replyTo: zod.ZodString;
|
|
7
|
+
host: zod.ZodString;
|
|
8
|
+
user: zod.ZodString;
|
|
9
|
+
}, "strip", zod.ZodTypeAny, {
|
|
10
|
+
from: string;
|
|
11
|
+
host: string;
|
|
12
|
+
port: number;
|
|
13
|
+
replyTo: string;
|
|
14
|
+
password: string;
|
|
15
|
+
user: string;
|
|
16
|
+
}, {
|
|
17
|
+
port?: number | undefined;
|
|
18
|
+
from: string;
|
|
19
|
+
host: string;
|
|
20
|
+
replyTo: string;
|
|
21
|
+
password: string;
|
|
22
|
+
user: string;
|
|
23
|
+
}>;
|
|
24
|
+
export declare const updateValidation: zod.ZodObject<{
|
|
25
|
+
password: zod.ZodString;
|
|
26
|
+
from: zod.ZodString;
|
|
27
|
+
port: zod.ZodDefault<zod.ZodNumber>;
|
|
28
|
+
replyTo: zod.ZodString;
|
|
29
|
+
host: zod.ZodString;
|
|
30
|
+
user: zod.ZodString;
|
|
31
|
+
}, "strip", zod.ZodTypeAny, {
|
|
32
|
+
from: string;
|
|
33
|
+
host: string;
|
|
34
|
+
port: number;
|
|
35
|
+
replyTo: string;
|
|
36
|
+
password: string;
|
|
37
|
+
user: string;
|
|
38
|
+
}, {
|
|
39
|
+
port?: number | undefined;
|
|
40
|
+
from: string;
|
|
41
|
+
host: string;
|
|
42
|
+
replyTo: string;
|
|
43
|
+
password: string;
|
|
44
|
+
user: string;
|
|
45
|
+
}>;
|
|
@@ -6,23 +6,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.updateValidation = exports.createValidation = void 0;
|
|
8
8
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
-
var
|
|
10
|
-
const
|
|
11
|
-
tlds: false
|
|
12
|
-
};
|
|
13
|
-
const password = _joi.default.string().label("Password");
|
|
9
|
+
var _zod = _interopRequireDefault(require("zod"));
|
|
10
|
+
const password = _zod.default.string().describe("Password");
|
|
14
11
|
const common = {
|
|
15
|
-
from:
|
|
16
|
-
port:
|
|
17
|
-
replyTo:
|
|
18
|
-
host:
|
|
19
|
-
user:
|
|
12
|
+
from: _zod.default.string().email().describe("Mail from"),
|
|
13
|
+
port: _zod.default.number().describe("Port").default(25),
|
|
14
|
+
replyTo: _zod.default.string().email().optional().describe("Mail reply-to"),
|
|
15
|
+
host: _zod.default.string().describe("Hostname"),
|
|
16
|
+
user: _zod.default.string().describe("User")
|
|
20
17
|
};
|
|
21
|
-
const createValidation =
|
|
22
|
-
password
|
|
18
|
+
const createValidation = _zod.default.object((0, _objectSpread2.default)((0, _objectSpread2.default)({}, common), {}, {
|
|
19
|
+
password
|
|
23
20
|
})).required();
|
|
24
21
|
exports.createValidation = createValidation;
|
|
25
|
-
const updateValidation =
|
|
26
|
-
password
|
|
22
|
+
const updateValidation = _zod.default.object((0, _objectSpread2.default)((0, _objectSpread2.default)({}, common), {}, {
|
|
23
|
+
password: password.optional()
|
|
27
24
|
})).required();
|
|
28
25
|
exports.updateValidation = updateValidation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["password","zod","string","describe","common","from","email","port","number","default","replyTo","optional","host","user","createValidation","object","required","updateValidation"],"sources":["validation.ts"],"sourcesContent":["import zod from \"zod\";\n\nconst password = zod.string().describe(\"Password\");\n\nconst common = {\n from: zod.string().email().describe(\"Mail from\"),\n port: zod.number().describe(\"Port\").default(25),\n replyTo: zod.string().email().optional().describe(\"Mail reply-to\"),\n host: zod.string().describe(\"Hostname\"),\n user: zod.string().describe(\"User\")\n};\n\nexport const createValidation = zod\n .object({\n ...common,\n password\n })\n .required();\n\nexport const updateValidation = zod\n .object({\n ...common,\n password: password.optional()\n })\n .required();\n"],"mappings":";;;;;;;;AAAA;AAEA,MAAMA,QAAQ,GAAGC,YAAG,CAACC,MAAM,EAAE,CAACC,QAAQ,CAAC,UAAU,CAAC;AAElD,MAAMC,MAAM,GAAG;EACXC,IAAI,EAAEJ,YAAG,CAACC,MAAM,EAAE,CAACI,KAAK,EAAE,CAACH,QAAQ,CAAC,WAAW,CAAC;EAChDI,IAAI,EAAEN,YAAG,CAACO,MAAM,EAAE,CAACL,QAAQ,CAAC,MAAM,CAAC,CAACM,OAAO,CAAC,EAAE,CAAC;EAC/CC,OAAO,EAAET,YAAG,CAACC,MAAM,EAAE,CAACI,KAAK,EAAE,CAACK,QAAQ,EAAE,CAACR,QAAQ,CAAC,eAAe,CAAC;EAClES,IAAI,EAAEX,YAAG,CAACC,MAAM,EAAE,CAACC,QAAQ,CAAC,UAAU,CAAC;EACvCU,IAAI,EAAEZ,YAAG,CAACC,MAAM,EAAE,CAACC,QAAQ,CAAC,MAAM;AACtC,CAAC;AAEM,MAAMW,gBAAgB,GAAGb,YAAG,CAC9Bc,MAAM,6DACAX,MAAM;EACTJ;AAAQ,GACV,CACDgB,QAAQ,EAAE;AAAC;AAET,MAAMC,gBAAgB,GAAGhB,YAAG,CAC9Bc,MAAM,6DACAX,MAAM;EACTJ,QAAQ,EAAEA,QAAQ,CAACW,QAAQ;AAAE,GAC/B,CACDK,QAAQ,EAAE;AAAC"}
|
package/crud/settings.crud.js
CHANGED
|
@@ -144,18 +144,17 @@ const createSettingsCrud = async context => {
|
|
|
144
144
|
input
|
|
145
145
|
} = params;
|
|
146
146
|
const model = await getModel();
|
|
147
|
-
const result = _validation.createValidation.
|
|
148
|
-
|
|
149
|
-
if (error) {
|
|
147
|
+
const result = _validation.createValidation.safeParse(input);
|
|
148
|
+
if (!result.success) {
|
|
150
149
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
151
|
-
errors: error.
|
|
150
|
+
errors: result.error.errors
|
|
152
151
|
});
|
|
153
152
|
}
|
|
154
|
-
const _result$
|
|
153
|
+
const _result$data = result.data,
|
|
155
154
|
{
|
|
156
155
|
password
|
|
157
|
-
} = _result$
|
|
158
|
-
settings = (0, _objectWithoutProperties2.default)(_result$
|
|
156
|
+
} = _result$data,
|
|
157
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data, _excluded);
|
|
159
158
|
if (!settings.port) {
|
|
160
159
|
settings.port = 25;
|
|
161
160
|
}
|
|
@@ -199,11 +198,10 @@ const createSettingsCrud = async context => {
|
|
|
199
198
|
original: initialOriginal
|
|
200
199
|
} = params;
|
|
201
200
|
const model = await getModel();
|
|
202
|
-
const result = _validation.updateValidation.
|
|
203
|
-
|
|
204
|
-
if (error) {
|
|
201
|
+
const result = _validation.updateValidation.safeParse(input);
|
|
202
|
+
if (!result.success) {
|
|
205
203
|
throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
|
|
206
|
-
errors: error.
|
|
204
|
+
errors: result.error.errors
|
|
207
205
|
});
|
|
208
206
|
}
|
|
209
207
|
let original = initialOriginal;
|
|
@@ -213,11 +211,11 @@ const createSettingsCrud = async context => {
|
|
|
213
211
|
throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
|
|
214
212
|
}
|
|
215
213
|
}
|
|
216
|
-
const _result$
|
|
214
|
+
const _result$data2 = result.data,
|
|
217
215
|
{
|
|
218
216
|
password
|
|
219
|
-
} = _result$
|
|
220
|
-
settings = (0, _objectWithoutProperties2.default)(_result$
|
|
217
|
+
} = _result$data2,
|
|
218
|
+
settings = (0, _objectWithoutProperties2.default)(_result$data2, _excluded2);
|
|
221
219
|
if (!settings.port) {
|
|
222
220
|
settings.port = original.port || 25;
|
|
223
221
|
}
|
|
@@ -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","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":";;;;;;;;;AAAA;AAgBA;AACA;AACA;AACA;AACA;AAEA;AACA;AAA0D;EAAA;AAE1D;AACA;AACA;AACO,MAAMA,kBAAkB,GAAG,MAC9BC,OAAsB,IACW;EACjC;AACJ;AACA;EACI,IAAAC,qCAA8B,EAACD,OAAO,CAAC;EAEvC,MAAME,SAAS,GAAG,MAAM;IACpB,OAAOF,OAAO,CAACG,OAAO,CAACC,gBAAgB,EAAE,CAACC,EAAE;EAChD,CAAC;EAED,MAAMC,cAAc,GAAG,YAAY;IAC/B,MAAMC,UAAU,GAAG,MAAMP,OAAO,CAACQ,QAAQ,CAACC,aAAa,CAAC,iBAAiB,CAAC;IAE1E,IAAIF,UAAU,EAAE;MACZ;IACJ;IACA,MAAM,IAAIG,+BAAkB,CAAC;MACzBC,IAAI,EAAE;QACFC,MAAM,EAAG;MACb;IACJ,CAAC,CAAC;EACN,CAAC;EAED,IAAIC,MAAqB,GAAG,IAAI;EAChC,IAAI;IACAA,MAAM,GAAG,IAAAC,iBAAS,GAAE;EACxB,CAAC,CAAC,OAAOC,EAAE,EAAE,CAAC;EAEd,MAAMC,QAAQ,GAAG,YAA+B;IAC5C,IAAI;MACAhB,OAAO,CAACQ,QAAQ,CAACS,oBAAoB,EAAE;MACvC,MAAMC,KAAK,GAAG,MAAMlB,OAAO,CAACmB,GAAG,CAACH,QAAQ,CAACI,wBAAiB,CAAC;MAC3D,IAAIF,KAAK,EAAE;QACP,OAAOA,KAAK;MAChB;IACJ,CAAC,CAAC,OAAOH,EAAE,EAAE;MACT,MAAM,IAAIM,cAAW,CAACN,EAAE,CAACO,OAAO,EAAEP,EAAE,CAACQ,IAAI,EAAER,EAAE,CAACJ,IAAI,CAAC;IACvD,CAAC,SAAS;MACNX,OAAO,CAACQ,QAAQ,CAACgB,mBAAmB,EAAE;IAC1C;IACA,MAAM,IAAIH,cAAW,CAAE,sBAAqBD,wBAAkB,IAAG,EAAE,mBAAmB,EAAE;MACpFK,OAAO,EAAEL;IACb,CAAC,CAAC;EACN,CAAC;;EAED;EACA,MAAMM,mBAAmB,GAAG,IAAAC,mBAAW,EACnC,4BAA4B,CAC/B;EACD,MAAMC,kBAAkB,GAAG,IAAAD,mBAAW,EAClC,2BAA2B,CAC9B;EACD,MAAME,kBAAkB,GAAG,IAAAF,mBAAW,EAClC,8BAA8B,CACjC;EACD;EACA,MAAMG,sBAAsB,GAAG,IAAAH,mBAAW,EACtC,+BAA+B,CAClC;EACD,MAAMI,qBAAqB,GAAG,IAAAJ,mBAAW,EACrC,8BAA8B,CACjC;EACD,MAAMK,qBAAqB,GAAG,IAAAL,mBAAW,EACrC,8BAA8B,CACjC;EACD;EACA,MAAMM,sBAAsB,GAAG,IAAAN,mBAAW,EACtC,+BAA+B,CAClC;EACD,MAAMO,qBAAqB,GAAG,IAAAP,mBAAW,EACrC,8BAA8B,CACjC;EACD,MAAMQ,qBAAqB,GAAG,IAAAR,mBAAW,EACrC,8BAA8B,CACjC;EAED,MAAMS,WAAW,GAAG,MAAY;IAC5B,IAAIvB,MAAM,EAAE;MACR;IACJ;IACA,MAAM,IAAIQ,cAAW,CAAC,0CAA0C,EAAE,uBAAuB,EAAE;MACvFgB,WAAW,EACP;IACR,CAAC,CAAC;EACN,CAAC;EAED,OAAO;IACHT,kBAAkB;IAClBF,mBAAmB;IACnBG,kBAAkB;IAClBC,sBAAsB;IACtBC,qBAAqB;IACrBC,qBAAqB;IACrBC,sBAAsB;IACtBC,qBAAqB;IACrBC,qBAAqB;IACrBG,WAAW,EAAE,YAAY;MACrBF,WAAW,EAAE;MAEb,MAAMlB,KAAK,GAAG,MAAMF,QAAQ,EAAE;MAE9B,MAAMuB,MAAM,GAAGrC,SAAS,EAAE;MAC1B,IAAI;QACAF,OAAO,CAACQ,QAAQ,CAACS,oBAAoB,EAAE;QACvC,MAAMS,mBAAmB,CAACc,OAAO,CAAC;UAC9BD;QACJ,CAAC,CAAC;QACF;AAChB;AACA;AACA;QACgB,MAAM,CAACE,OAAO,CAAC,GAAG,MAAMzC,OAAO,CAACmB,GAAG,CAACuB,iBAAiB,CAACxB,KAAK,EAAE;UACzDyB,KAAK,EAAE,CAAC;UACRC,IAAI,EAAE,CAAC,gBAAgB;QAC3B,CAAC,CAAC;QACF,MAAM,CAACC,KAAK,CAAC,GAAGJ,OAAO;QACvB,IAAI,CAACI,KAAK,EAAE;UACR,OAAO,IAAI;QACf;QACA,MAAMC,QAAQ,GAAG,IAAAC,mCAAwB,EAAC;UACtCF,KAAK,EAAEA,KAAoC;UAC3ChC;QACJ,CAAC,CAAC;QAEF,MAAMmC,oBAAuC,+DACtCF,QAAQ;UACXG,QAAQ,EAAE;QAAE,EACf;QAED,MAAMrB,kBAAkB,CAACY,OAAO,CAAC;UAC7BD,MAAM;UACNO,QAAQ,EAAEE;QACd,CAAC,CAAC;QAEF,OAAOF,QAAQ;MACnB,CAAC,CAAC,OAAO/B,EAAE,EAAE;QACT,MAAMc,kBAAkB,CAACW,OAAO,CAAC;UAC7BD,MAAM;UACNW,KAAK,EAAEnC;QACX,CAAC,CAAC;MACN,CAAC,SAAS;QACNf,OAAO,CAACQ,QAAQ,CAACgB,mBAAmB,EAAE;MAC1C;MACA,OAAO,IAAI;IACf,CAAC;IACD;AACR;AACA;AACA;IACQ,MAAM2B,cAAc,CAA4BC,MAAM,EAAE;MACpDhB,WAAW,EAAE;MACb,MAAM9B,cAAc,EAAE;MAEtB,MAAM;QAAE+C;MAAM,CAAC,GAAGD,MAAM;MAExB,MAAMlC,KAAK,GAAG,MAAMF,QAAQ,EAAE;MAE9B,MAAMsC,MAAM,GAAGC,4BAAgB,CAACC,QAAQ,CAACH,KAAK,CAAC;MAE/C,MAAMH,KAAK,GAAGI,MAAM,CAACJ,KAAK;MAC1B,IAAIA,KAAK,EAAE;QACP,MAAM,IAAI7B,cAAW,CAAC,oBAAoB,EAAE,kBAAkB,EAAE;UAC5DoC,MAAM,EAAEP,KAAK,CAACQ;QAClB,CAAC,CAAC;MACN;MAEA,sBAAkCJ,MAAM,CAACK,KAAK;QAAxC;UAAEV;QAAsB,CAAC;QAAVH,QAAQ;MAE7B,IAAI,CAACA,QAAQ,CAACc,IAAI,EAAE;QAChBd,QAAQ,CAACc,IAAI,GAAG,EAAE;MACtB;MAEA,MAAMZ,oBAAuC,+DACtCF,QAAQ;QACXG,QAAQ,EAAE;MAAE,EACf;MAED,IAAI;QACAjD,OAAO,CAACQ,QAAQ,CAACS,oBAAoB,EAAE;QAEvC,MAAMa,sBAAsB,CAACU,OAAO,CAAC;UACjCM,QAAQ,EAAEE;QACd,CAAC,CAAC;QAEF,MAAMhD,OAAO,CAACmB,GAAG,CAAC0C,WAAW,CACzB3C,KAAK,EACL,IAAA4C,sCAA2B,EAAC;UACxBC,MAAM,8DACCjB,QAAQ;YACXG;UAAQ,EACX;UACDpC;QACJ,CAAC,CAAC,CACL;QAED,MAAMkB,qBAAqB,CAACS,OAAO,CAAC;UAChCM,QAAQ,EAAEE;QACd,CAAC,CAAC;QACF,OAAOA,oBAAoB;MAC/B,CAAC,CAAC,OAAOjC,EAAE,EAAE;QACT,MAAMiB,qBAAqB,CAACQ,OAAO,CAAC;UAChCM,QAAQ,EAAEE,oBAAoB;UAC9BE,KAAK,EAAEnC;QACX,CAAC,CAAC;QACF,MAAM,IAAIM,cAAW,CAACN,EAAE,CAACO,OAAO,EAAEP,EAAE,CAACQ,IAAI,EAAER,EAAE,CAACJ,IAAI,CAAC;MACvD,CAAC,SAAS;QACNX,OAAO,CAACQ,QAAQ,CAACgB,mBAAmB,EAAE;MAC1C;IACJ,CAAC;IACD;AACR;AACA;AACA;IACQ,MAAMwC,cAAc,CAA4BZ,MAAM,EAAE;MACpDhB,WAAW,EAAE;MACb,MAAM9B,cAAc,EAAE;MAEtB,MAAM;QAAE+C,KAAK;QAAEY,QAAQ,EAAEC;MAAgB,CAAC,GAAGd,MAAM;MAEnD,MAAMlC,KAAK,GAAG,MAAMF,QAAQ,EAAE;MAE9B,MAAMsC,MAAM,GAAGa,4BAAgB,CAACX,QAAQ,CAACH,KAAK,CAAC;MAE/C,MAAMH,KAAK,GAAGI,MAAM,CAACJ,KAAK;MAC1B,IAAIA,KAAK,EAAE;QACP,MAAM,IAAI7B,cAAW,CAAC,oBAAoB,EAAE,kBAAkB,EAAE;UAC5DoC,MAAM,EAAEP,KAAK,CAACQ;QAClB,CAAC,CAAC;MACN;MACA,IAAIO,QAAQ,GAAGC,eAAe;MAC9B,IAAI,CAACD,QAAQ,EAAE;QACXA,QAAQ,GAAG,MAAM,IAAI,CAAC3B,WAAW,EAAE;QACnC,IAAI,CAAC2B,QAAQ,EAAE;UACX,MAAM,IAAI5C,cAAW,CAChB,sFAAqF,EACtF,WAAW,CACd;QACL;MACJ;MAEA,uBAAkCiC,MAAM,CAACK,KAAK;QAAxC;UAAEV;QAAsB,CAAC;QAAVH,QAAQ;MAE7B,IAAI,CAACA,QAAQ,CAACc,IAAI,EAAE;QAChBd,QAAQ,CAACc,IAAI,GAAGK,QAAQ,CAACL,IAAI,IAAI,EAAE;MACvC;MAEA,MAAMZ,oBAAuC,+DACtCF,QAAQ;QACXG,QAAQ,EAAE;MAAE,EACf;MACD,IAAI;QACAjD,OAAO,CAACQ,QAAQ,CAACS,oBAAoB,EAAE;QAEvC,MAAMgB,sBAAsB,CAACO,OAAO,CAAC;UACjCM,QAAQ,EAAEE,oBAAoB;UAC9BiB;QACJ,CAAC,CAAC;QAEF,MAAMG,gBAAgB,GAAG,IAAAN,sCAA2B,EAAC;UACjDC,MAAM,8DACCjB,QAAQ;YACXG,QAAQ,EAAEA,QAAQ,IAAIgB,QAAQ,CAAChB;UAAQ,EAC1C;UACDpC;QACJ,CAAC,CAAC;QACF;AAChB;AACA;QACgB,MAAMb,OAAO,CAACmB,GAAG,CAACkD,WAAW,CAACnD,KAAK,EAAE+C,QAAQ,CAAC5D,EAAE,EAAE+D,gBAAgB,CAAC;QAEnE,MAAMlC,qBAAqB,CAACM,OAAO,CAAC;UAChCM,QAAQ,EAAEE,oBAAoB;UAC9BiB;QACJ,CAAC,CAAC;QACF,OAAOjB,oBAAoB;MAC/B,CAAC,CAAC,OAAOjC,EAAE,EAAE;QACT,MAAMoB,qBAAqB,CAACK,OAAO,CAAC;UAChCyB,QAAQ;UACRnB,QAAQ,EAAEE,oBAAoB;UAC9BE,KAAK,EAAEnC;QACX,CAAC,CAAC;QACF,MAAM,IAAIM,cAAW,CAACN,EAAE,CAACO,OAAO,EAAEP,EAAE,CAACQ,IAAI,EAAER,EAAE,CAACJ,IAAI,CAAC;MACvD,CAAC,SAAS;QACNX,OAAO,CAACQ,QAAQ,CAACgB,mBAAmB,EAAE;MAC1C;IACJ,CAAC;IACD,MAAM8C,YAAY,CAA4BlB,MAAM,EAAE;MAClD,MAAM;QAAEC;MAAM,CAAC,GAAGD,MAAM;MAExB,MAAMa,QAAQ,GAAG,MAAM,IAAI,CAAC3B,WAAW,EAAE;MACzC,IAAI,CAAC2B,QAAQ,EAAE;QACX,OAAO,IAAI,CAACd,cAAc,CAAC;UACvBE;QACJ,CAAC,CAAC;MACN;MACA,OAAO,IAAI,CAACW,cAAc,CAAC;QACvBX,KAAK;QACLY;MACJ,CAAC,CAAC;IACN;EACJ,CAAC;AACL,CAAC;AAAC"}
|
|
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","safeParse","success","errors","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.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\n });\n }\n\n const { password, ...settings } = result.data;\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.safeParse(input);\n\n if (!result.success) {\n throw new WebinyError(\"Validation failed!\", \"VALIDATION_ERROR\", {\n errors: result.error.errors\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.data;\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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"}
|
|
@@ -5,23 +5,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.attachOnTransportBeforeSend = void 0;
|
|
8
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
-
var _joi = _interopRequireDefault(require("joi"));
|
|
10
8
|
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
to: _joi.default.array().items(requiredEmail),
|
|
18
|
-
from: _joi.default.string().email(options),
|
|
9
|
+
var _zod = _interopRequireDefault(require("zod"));
|
|
10
|
+
const requiredString = _zod.default.string();
|
|
11
|
+
const requiredEmail = requiredString.email();
|
|
12
|
+
const schema = _zod.default.object({
|
|
13
|
+
to: _zod.default.array(requiredEmail).optional(),
|
|
14
|
+
from: _zod.default.string().email().optional(),
|
|
19
15
|
subject: requiredString.max(1024),
|
|
20
|
-
cc:
|
|
21
|
-
bcc:
|
|
22
|
-
replyTo:
|
|
16
|
+
cc: _zod.default.array(requiredEmail).optional(),
|
|
17
|
+
bcc: _zod.default.array(requiredEmail).optional(),
|
|
18
|
+
replyTo: _zod.default.string().email().optional(),
|
|
23
19
|
text: requiredString.min(10),
|
|
24
|
-
html:
|
|
20
|
+
html: _zod.default.string().optional()
|
|
25
21
|
});
|
|
26
22
|
const attachOnTransportBeforeSend = params => {
|
|
27
23
|
const {
|
|
@@ -32,11 +28,22 @@ const attachOnTransportBeforeSend = params => {
|
|
|
32
28
|
}) => {
|
|
33
29
|
let result;
|
|
34
30
|
try {
|
|
35
|
-
result =
|
|
36
|
-
if (
|
|
31
|
+
result = schema.safeParse(input);
|
|
32
|
+
if (result.success) {
|
|
37
33
|
return;
|
|
38
34
|
}
|
|
35
|
+
throw new _error.default({
|
|
36
|
+
message: "Error while validating e-mail params.",
|
|
37
|
+
code: "VALIDATION_ERROR",
|
|
38
|
+
data: {
|
|
39
|
+
error: result.error,
|
|
40
|
+
input
|
|
41
|
+
}
|
|
42
|
+
});
|
|
39
43
|
} catch (ex) {
|
|
44
|
+
if (ex instanceof _error.default) {
|
|
45
|
+
throw ex;
|
|
46
|
+
}
|
|
40
47
|
throw new _error.default({
|
|
41
48
|
message: "Error while validating e-mail params.",
|
|
42
49
|
code: "VALIDATION_ERROR",
|
|
@@ -46,11 +53,6 @@ const attachOnTransportBeforeSend = params => {
|
|
|
46
53
|
}
|
|
47
54
|
});
|
|
48
55
|
}
|
|
49
|
-
throw new _error.default({
|
|
50
|
-
message: "Error while validating e-mail params.",
|
|
51
|
-
code: "VALIDATION_ERROR",
|
|
52
|
-
data: (0, _objectSpread2.default)({}, result.error)
|
|
53
|
-
});
|
|
54
56
|
});
|
|
55
57
|
};
|
|
56
58
|
exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","cc","bcc","replyTo","text","min","html","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","data","input","result","safeParse","success","WebinyError","message","code","error","ex"],"sources":["onTransportBeforeSend.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport zod from \"zod\";\nimport { Topic } from \"@webiny/pubsub/types\";\nimport { OnTransportBeforeSendParams } from \"~/types\";\nimport { SafeParseReturnType } from \"zod/lib/types\";\n\nconst requiredString = zod.string();\nconst requiredEmail = requiredString.email();\n\nconst schema = zod.object({\n to: zod.array(requiredEmail).optional(),\n from: zod.string().email().optional(),\n subject: requiredString.max(1024),\n cc: zod.array(requiredEmail).optional(),\n bcc: zod.array(requiredEmail).optional(),\n replyTo: zod.string().email().optional(),\n text: requiredString.min(10),\n html: zod.string().optional()\n});\n\ntype SchemaType = zod.infer<typeof schema>;\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: SafeParseReturnType<SchemaType, SchemaType>;\n try {\n result = schema.safeParse(input);\n\n if (result.success) {\n return;\n }\n throw new WebinyError({\n message: \"Error while validating e-mail params.\",\n code: \"VALIDATION_ERROR\",\n data: {\n error: result.error,\n input\n }\n });\n } catch (ex) {\n if (ex instanceof WebinyError) {\n throw ex;\n }\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 });\n};\n"],"mappings":";;;;;;;AAAA;AACA;AAKA,MAAMA,cAAc,GAAGC,YAAG,CAACC,MAAM,EAAE;AACnC,MAAMC,aAAa,GAAGH,cAAc,CAACI,KAAK,EAAE;AAE5C,MAAMC,MAAM,GAAGJ,YAAG,CAACK,MAAM,CAAC;EACtBC,EAAE,EAAEN,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCC,IAAI,EAAET,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACrCE,OAAO,EAAEX,cAAc,CAACY,GAAG,CAAC,IAAI,CAAC;EACjCC,EAAE,EAAEZ,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCK,GAAG,EAAEb,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACxCM,OAAO,EAAEd,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACxCO,IAAI,EAAEhB,cAAc,CAACiB,GAAG,CAAC,EAAE,CAAC;EAC5BC,IAAI,EAAEjB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ;AAC/B,CAAC,CAAC;AAOK,MAAMU,2BAA2B,GAAIC,MAAc,IAAK;EAC3D,MAAM;IAAEC;EAAsB,CAAC,GAAGD,MAAM;EAExCC,qBAAqB,CAACC,SAAS,CAAC,OAAO;IAAEC,IAAI,EAAEC;EAAM,CAAC,KAAK;IACvD,IAAIC,MAAmD;IACvD,IAAI;MACAA,MAAM,GAAGpB,MAAM,CAACqB,SAAS,CAACF,KAAK,CAAC;MAEhC,IAAIC,MAAM,CAACE,OAAO,EAAE;QAChB;MACJ;MACA,MAAM,IAAIC,cAAW,CAAC;QAClBC,OAAO,EAAE,uCAAuC;QAChDC,IAAI,EAAE,kBAAkB;QACxBP,IAAI,EAAE;UACFQ,KAAK,EAAEN,MAAM,CAACM,KAAK;UACnBP;QACJ;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOQ,EAAE,EAAE;MACT,IAAIA,EAAE,YAAYJ,cAAW,EAAE;QAC3B,MAAMI,EAAE;MACZ;MACA,MAAM,IAAIJ,cAAW,CAAC;QAClBC,OAAO,EAAE,uCAAuC;QAChDC,IAAI,EAAE,kBAAkB;QACxBP,IAAI,EAAE;UACFC,KAAK;UACLO,KAAK,EAAEC;QACX;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
|
package/crud/transporter.crud.js
CHANGED
|
@@ -53,13 +53,8 @@ const getDefaultSettings = () => {
|
|
|
53
53
|
if (!hasAtLeastOneValue) {
|
|
54
54
|
return null;
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (!result.error) {
|
|
59
|
-
return result.value;
|
|
60
|
-
}
|
|
61
|
-
} catch (ex) {}
|
|
62
|
-
return null;
|
|
56
|
+
const result = _validation.createValidation.safeParse(input);
|
|
57
|
+
return result.success ? result.data : null;
|
|
63
58
|
};
|
|
64
59
|
const createTransporterCrud = async context => {
|
|
65
60
|
const transporters = {};
|
|
@@ -1 +1 @@
|
|
|
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":"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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","safeParse","success","data","createTransporterCrud","transporters","defaultSettings","byType","CreateTransportPlugin","type","reverse","onTransportBeforeSend","createTopic","onTransportAfterSend","onTransportError","attachOnTransportBeforeSend","getTransport","tenant","tenancy","getCurrentTenant","id","mailer","getSettings","code","transporter","sendMail","transport","error","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\";\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 const result = createValidation.safeParse(input);\n\n return result.success ? result.data : 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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"}
|
package/graphql/settings.js
CHANGED
|
@@ -23,16 +23,16 @@ const createSettingsGraphQL = () => {
|
|
|
23
23
|
replyTo: String
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
type
|
|
26
|
+
type MailerTransportSettingsResponse {
|
|
27
27
|
data: MailerTransportSettings
|
|
28
28
|
error: MailerTransportSettingsError
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
type MailerQuery {
|
|
32
|
-
getSettings:
|
|
32
|
+
getSettings: MailerTransportSettingsResponse!
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
input
|
|
35
|
+
input MailerTransportSettingsInput {
|
|
36
36
|
host: String!
|
|
37
37
|
port: Number
|
|
38
38
|
user: String!
|
|
@@ -42,7 +42,7 @@ const createSettingsGraphQL = () => {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
type MailerMutation {
|
|
45
|
-
saveSettings(data:
|
|
45
|
+
saveSettings(data: MailerTransportSettingsInput!): MailerTransportSettingsResponse!
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
extend type Query {
|
|
@@ -61,9 +61,9 @@ const createSettingsGraphQL = () => {
|
|
|
61
61
|
try {
|
|
62
62
|
const settings = await context.mailer.getSettings();
|
|
63
63
|
/**
|
|
64
|
-
* We want to remove the password from the response
|
|
64
|
+
* We want to remove the password from the response, if it exists.
|
|
65
65
|
*/
|
|
66
|
-
if (settings) {
|
|
66
|
+
if (settings !== null && settings !== void 0 && settings.password) {
|
|
67
67
|
// @ts-ignore
|
|
68
68
|
delete settings.password;
|
|
69
69
|
}
|
|
@@ -83,9 +83,9 @@ const createSettingsGraphQL = () => {
|
|
|
83
83
|
input: args.data
|
|
84
84
|
});
|
|
85
85
|
/**
|
|
86
|
-
* We want to remove the password from the response
|
|
86
|
+
* We want to remove the password from the response, if it exists.
|
|
87
87
|
*/
|
|
88
|
-
if (settings) {
|
|
88
|
+
if (settings !== null && settings !== void 0 && settings.password) {
|
|
89
89
|
// @ts-ignore
|
|
90
90
|
delete settings.password;
|
|
91
91
|
}
|
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 port: Number\n user: String\n from: String\n replyTo: String\n }\n \n type
|
|
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 MailerTransportSettingsResponse {\n data: MailerTransportSettings\n error: MailerTransportSettingsError\n }\n \n type MailerQuery {\n getSettings: MailerTransportSettingsResponse!\n }\n \n input MailerTransportSettingsInput {\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: MailerTransportSettingsInput!): MailerTransportSettingsResponse!\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, if it exists.\n */\n if (settings?.password) {\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, if it exists.\n */\n if (settings?.password) {\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,CAAC,CAAC,CAAC;AAEzB,MAAMC,qBAAqB,GAAG,MAAM;EACvC,OAAO,IAAIC,mCAAmB,CAAgB;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,SAAS;IACDC,SAAS,EAAE;MACPC,KAAK,EAAE;QACHC,MAAM,EAAEN;MACZ,CAAC;MACDO,WAAW,EAAE;QACTC,WAAW,EAAE,OAAOC,CAAC,EAAEC,EAAE,EAAEC,OAAO,KAAK;UACnC,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAM,CAACE,WAAW,EAAE;YACnD;AACxB;AACA;YACwB,IAAII,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,QAAQ,EAAE;cACpB;cACA,OAAOD,QAAQ,CAACC,QAAQ;YAC5B;YACA,OAAO,IAAIC,wBAAQ,CAACF,QAAQ,CAAC;UACjC,CAAC,CAAC,OAAOG,EAAE,EAAE;YACT,OAAO,IAAIC,6BAAa,CAACD,EAAE,CAAC;UAChC;QACJ;MACJ,CAAC;MACDE,QAAQ,EAAE;QACNX,MAAM,EAAEN;MACZ,CAAC;MACDkB,cAAc,EAAE;QACZC,YAAY,EAAE,OAAOV,CAAC,EAAEW,IAAS,EAAET,OAAO,KAAK;UAC3C,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAM,CAACa,YAAY,CAAC;cAC/CE,KAAK,EAAED,IAAI,CAACE;YAChB,CAAC,CAAC;YACF;AACxB;AACA;YACwB,IAAIV,QAAQ,aAARA,QAAQ,eAARA,QAAQ,CAAEC,QAAQ,EAAE;cACpB;cACA,OAAOD,QAAQ,CAACC,QAAQ;YAC5B;YACA,OAAO,IAAIC,wBAAQ,CAACF,QAAQ,CAAC;UACjC,CAAC,CAAC,OAAOG,EAAE,EAAE;YACT,OAAO,IAAIC,6BAAa,CAACD,EAAE,CAAC;UAChC;QACJ;MACJ;IACJ;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
|
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.7f63ea0744",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,17 +14,17 @@
|
|
|
14
14
|
"description": "The API to send e-mails.",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@babel/runtime": "7.20.
|
|
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.
|
|
17
|
+
"@babel/runtime": "7.20.13",
|
|
18
|
+
"@webiny/api": "0.0.0-unstable.7f63ea0744",
|
|
19
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.7f63ea0744",
|
|
20
|
+
"@webiny/error": "0.0.0-unstable.7f63ea0744",
|
|
21
|
+
"@webiny/handler-graphql": "0.0.0-unstable.7f63ea0744",
|
|
22
|
+
"@webiny/plugins": "0.0.0-unstable.7f63ea0744",
|
|
23
|
+
"@webiny/pubsub": "0.0.0-unstable.7f63ea0744",
|
|
24
24
|
"crypto-js": "4.1.1",
|
|
25
|
-
"joi": "17.7.0",
|
|
26
25
|
"lodash": "4.17.21",
|
|
27
|
-
"nodemailer": "6.
|
|
26
|
+
"nodemailer": "6.9.1",
|
|
27
|
+
"zod": "3.20.2"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"@babel/cli": "^7.19.3",
|
|
@@ -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.7f63ea0744",
|
|
37
|
+
"@webiny/api-i18n": "^0.0.0-unstable.7f63ea0744",
|
|
38
|
+
"@webiny/api-i18n-ddb": "^0.0.0-unstable.7f63ea0744",
|
|
39
|
+
"@webiny/api-security": "^0.0.0-unstable.7f63ea0744",
|
|
40
|
+
"@webiny/api-security-so-ddb": "^0.0.0-unstable.7f63ea0744",
|
|
41
|
+
"@webiny/api-tenancy": "^0.0.0-unstable.7f63ea0744",
|
|
42
|
+
"@webiny/api-tenancy-so-ddb": "^0.0.0-unstable.7f63ea0744",
|
|
43
|
+
"@webiny/cli": "^0.0.0-unstable.7f63ea0744",
|
|
44
|
+
"@webiny/db-dynamodb": "^0.0.0-unstable.7f63ea0744",
|
|
45
|
+
"@webiny/handler": "^0.0.0-unstable.7f63ea0744",
|
|
46
|
+
"@webiny/handler-aws": "^0.0.0-unstable.7f63ea0744",
|
|
47
|
+
"@webiny/handler-db": "^0.0.0-unstable.7f63ea0744",
|
|
48
|
+
"@webiny/project-utils": "^0.0.0-unstable.7f63ea0744",
|
|
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": "7f63ea0744c9e31977e5dabb95538d22b4db585c"
|
|
65
65
|
}
|
|
@@ -1,7 +0,0 @@
|
|
|
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 {};
|
|
@@ -1,69 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/crud/mailer.crud.d.ts
DELETED
package/crud/mailer.crud.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
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;
|
package/crud/mailer.crud.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
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;
|
|
@@ -1,106 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|