@webiny/api-mailer 0.0.0-unstable.611c5af35e → 0.0.0-unstable.6509387258

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.
@@ -72,7 +72,8 @@ const createSettingsModel = group => {
72
72
  layout: [["host", "port", "user", "password", "from", "replyTo"]],
73
73
  description: "Mailer Settings",
74
74
  titleFieldId: "",
75
- isPrivate: true
75
+ isPrivate: true,
76
+ noValidate: true
76
77
  });
77
78
  };
78
79
  exports.createSettingsModel = createSettingsModel;
@@ -1 +1 @@
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,gBAAgB;AAAC;AAOlD,MAAMC,WAAW,GAAIC,MAAyB,IAAoB;EAC9D,MAAM;IAAEC,KAAK;IAAEC,QAAQ;IAAEC;EAAK,CAAC,GAAGH,MAAM;EACxC,MAAMI,EAAE,GAAG,IAAAC,kBAAe,EAACJ,KAAK,CAAC;EAEjC,MAAMK,UAAqC,GAAG,EAAE;EAChD,IAAIJ,QAAQ,EAAE;IACVI,UAAU,CAACC,IAAI,CAAC;MACZC,OAAO,EAAG,UAASP,KAAM,gBAAe;MACxCQ,IAAI,EAAE,UAAU;MAChBC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC;EACN;EACA,OAAO;IACHT,KAAK;IACLG,EAAE;IACFO,OAAO,EAAEP,EAAE;IACXQ,SAAS,EAAER,EAAE;IACbD,IAAI;IACJG;EACJ,CAAC;AACL,CAAC;AAED,MAAMO,eAAe,GAAIb,MAAuC,IAAK;EACjE,OAAOD,WAAW,6DACXC,MAAM;IACTG,IAAI,EAAE;EAAM,GACd;AACN,CAAC;AACD,MAAMW,iBAAiB,GAAId,MAAuC,IAAK;EACnE,OAAOD,WAAW,6DACXC,MAAM;IACTG,IAAI,EAAE;EAAQ,GAChB;AACN,CAAC;AAEM,MAAMY,mBAAmB,GAAIC,KAAqB,IAAK;EAC1D,OAAO,IAAAC,8BAAc,EAAC;IAClBC,OAAO,EAAEpB,iBAAiB;IAC1BW,IAAI,EAAE,iBAAiB;IACvBO,KAAK,EAAE;MACHZ,EAAE,EAAEY,KAAK,CAACG,iBAAiB,CAACf,EAAE;MAC9BK,IAAI,EAAEO,KAAK,CAACG,iBAAiB,CAACV;IAClC,CAAC;IACDW,MAAM,EAAE,CACJP,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFY,iBAAiB,CAAC;MACdb,KAAK,EAAE;IACX,CAAC,CAAC,EACFY,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE,UAAU;MACjBC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE;IACX,CAAC,CAAC,CACL;IACDoB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACjEC,WAAW,EAAE,iBAAiB;IAC9BC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE;EACf,CAAC,CAAC;AACN,CAAC;AAAC"}
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","noValidate"],"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 noValidate: true\n });\n};\n"],"mappings":";;;;;;;;AAAA;AAEA;AAEO,MAAMA,iBAAiB,GAAG,gBAAgB;AAAC;AAOlD,MAAMC,WAAW,GAAIC,MAAyB,IAAoB;EAC9D,MAAM;IAAEC,KAAK;IAAEC,QAAQ;IAAEC;EAAK,CAAC,GAAGH,MAAM;EACxC,MAAMI,EAAE,GAAG,IAAAC,kBAAe,EAACJ,KAAK,CAAC;EAEjC,MAAMK,UAAqC,GAAG,EAAE;EAChD,IAAIJ,QAAQ,EAAE;IACVI,UAAU,CAACC,IAAI,CAAC;MACZC,OAAO,EAAG,UAASP,KAAM,gBAAe;MACxCQ,IAAI,EAAE,UAAU;MAChBC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC;EACN;EACA,OAAO;IACHT,KAAK;IACLG,EAAE;IACFO,OAAO,EAAEP,EAAE;IACXQ,SAAS,EAAER,EAAE;IACbD,IAAI;IACJG;EACJ,CAAC;AACL,CAAC;AAED,MAAMO,eAAe,GAAIb,MAAuC,IAAK;EACjE,OAAOD,WAAW,6DACXC,MAAM;IACTG,IAAI,EAAE;EAAM,GACd;AACN,CAAC;AACD,MAAMW,iBAAiB,GAAId,MAAuC,IAAK;EACnE,OAAOD,WAAW,6DACXC,MAAM;IACTG,IAAI,EAAE;EAAQ,GAChB;AACN,CAAC;AAEM,MAAMY,mBAAmB,GAAIC,KAAqB,IAAK;EAC1D,OAAO,IAAAC,8BAAc,EAAC;IAClBC,OAAO,EAAEpB,iBAAiB;IAC1BW,IAAI,EAAE,iBAAiB;IACvBO,KAAK,EAAE;MACHZ,EAAE,EAAEY,KAAK,CAACG,iBAAiB,CAACf,EAAE;MAC9BK,IAAI,EAAEO,KAAK,CAACG,iBAAiB,CAACV;IAClC,CAAC;IACDW,MAAM,EAAE,CACJP,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFY,iBAAiB,CAAC;MACdb,KAAK,EAAE;IACX,CAAC,CAAC,EACFY,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE,UAAU;MACjBC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE;IACd,CAAC,CAAC,EACFW,eAAe,CAAC;MACZZ,KAAK,EAAE;IACX,CAAC,CAAC,CACL;IACDoB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACjEC,WAAW,EAAE,iBAAiB;IAC9BC,YAAY,EAAE,EAAE;IAChBC,SAAS,EAAE,IAAI;IACfC,UAAU,EAAE;EAChB,CAAC,CAAC;AACN,CAAC;AAAC"}
@@ -1,4 +1,45 @@
1
- import joi from "joi";
2
- import { TransportSettings } from "../../types";
3
- export declare const createValidation: joi.ObjectSchema<TransportSettings>;
4
- export declare const updateValidation: joi.ObjectSchema<TransportSettings>;
1
+ import zod from "zod";
2
+ export declare const createValidation: zod.ZodObject<{
3
+ password: zod.ZodString;
4
+ from: zod.ZodString;
5
+ port: zod.ZodNullable<zod.ZodNumber>;
6
+ replyTo: zod.ZodString;
7
+ host: zod.ZodString;
8
+ user: zod.ZodString;
9
+ }, "strip", zod.ZodTypeAny, {
10
+ from: string;
11
+ replyTo: string;
12
+ password: string;
13
+ port: number | null;
14
+ host: string;
15
+ user: string;
16
+ }, {
17
+ from: string;
18
+ replyTo: string;
19
+ password: string;
20
+ port: number | null;
21
+ host: string;
22
+ user: string;
23
+ }>;
24
+ export declare const updateValidation: zod.ZodObject<{
25
+ password: zod.ZodNullable<zod.ZodString>;
26
+ from: zod.ZodString;
27
+ port: zod.ZodNullable<zod.ZodNumber>;
28
+ replyTo: zod.ZodString;
29
+ host: zod.ZodString;
30
+ user: zod.ZodString;
31
+ }, "strip", zod.ZodTypeAny, {
32
+ from: string;
33
+ replyTo: string;
34
+ password: string | null;
35
+ port: number | null;
36
+ host: string;
37
+ user: string;
38
+ }, {
39
+ from: string;
40
+ replyTo: string;
41
+ password: string | null;
42
+ port: number | null;
43
+ host: 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 _joi = _interopRequireDefault(require("joi"));
10
- const options = {
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: _joi.default.string().email(options).required().label("Mail from"),
16
- port: _joi.default.number().label("Port").default(25),
17
- replyTo: _joi.default.string().email(options).optional().label("Mail reply-to"),
18
- host: _joi.default.string().required().label("Hostname"),
19
- user: _joi.default.string().required().label("User")
12
+ from: _zod.default.string().email().describe("Mail from"),
13
+ port: _zod.default.number().optional().nullish().describe("Port"),
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 = _joi.default.object((0, _objectSpread2.default)((0, _objectSpread2.default)({}, common), {}, {
22
- password: password.required()
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 = _joi.default.object((0, _objectSpread2.default)((0, _objectSpread2.default)({}, common), {}, {
26
- password
22
+ const updateValidation = _zod.default.object((0, _objectSpread2.default)((0, _objectSpread2.default)({}, common), {}, {
23
+ password: password.nullish().optional()
27
24
  })).required();
28
25
  exports.updateValidation = updateValidation;
@@ -1 +1 @@
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;AACV,CAAC;AAED,MAAMC,QAAQ,GAAGC,YAAG,CAACC,MAAM,EAAE,CAACC,KAAK,CAAC,UAAU,CAAC;AAC/C,MAAMC,MAAM,GAAG;EACXC,IAAI,EAAEJ,YAAG,CAACC,MAAM,EAAE,CAACI,KAAK,CAACR,OAAO,CAAC,CAACS,QAAQ,EAAE,CAACJ,KAAK,CAAC,WAAW,CAAC;EAC/DK,IAAI,EAAEP,YAAG,CAACQ,MAAM,EAAE,CAACN,KAAK,CAAC,MAAM,CAAC,CAACO,OAAO,CAAC,EAAE,CAAC;EAC5CC,OAAO,EAAEV,YAAG,CAACC,MAAM,EAAE,CAACI,KAAK,CAACR,OAAO,CAAC,CAACc,QAAQ,EAAE,CAACT,KAAK,CAAC,eAAe,CAAC;EACtEU,IAAI,EAAEZ,YAAG,CAACC,MAAM,EAAE,CAACK,QAAQ,EAAE,CAACJ,KAAK,CAAC,UAAU,CAAC;EAC/CW,IAAI,EAAEb,YAAG,CAACC,MAAM,EAAE,CAACK,QAAQ,EAAE,CAACJ,KAAK,CAAC,MAAM;AAC9C,CAAC;AAEM,MAAMY,gBAAgB,GAAGd,YAAG,CAC9Be,MAAM,6DACAZ,MAAM;EACTJ,QAAQ,EAAEA,QAAQ,CAACO,QAAQ;AAAE,GAC/B,CACDA,QAAQ,EAAE;AAAC;AAET,MAAMU,gBAAgB,GAAGhB,YAAG,CAC9Be,MAAM,6DACAZ,MAAM;EACTJ;AAAQ,GACV,CACDO,QAAQ,EAAE;AAAC"}
1
+ {"version":3,"names":["password","zod","string","describe","common","from","email","port","number","optional","nullish","replyTo","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().optional().nullish().describe(\"Port\"),\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.nullish().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,CAACC,QAAQ,EAAE,CAACC,OAAO,EAAE,CAACP,QAAQ,CAAC,MAAM,CAAC;EACxDQ,OAAO,EAAEV,YAAG,CAACC,MAAM,EAAE,CAACI,KAAK,EAAE,CAACG,QAAQ,EAAE,CAACN,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,CAACU,OAAO,EAAE,CAACD,QAAQ;AAAE,GACzC,CACDO,QAAQ,EAAE;AAAC"}
@@ -17,6 +17,7 @@ var _hooks = require("./settings/hooks");
17
17
  var _apiSecurity = require("@webiny/api-security");
18
18
  const _excluded = ["password"],
19
19
  _excluded2 = ["password"];
20
+ const defaultPort = 25;
20
21
  /**
21
22
  * Note that settings cannot be used if there is no secret defined.
22
23
  */
@@ -144,22 +145,19 @@ const createSettingsCrud = async context => {
144
145
  input
145
146
  } = params;
146
147
  const model = await getModel();
147
- const result = _validation.createValidation.validate(input);
148
- const error = result.error;
149
- if (error) {
148
+ const result = _validation.createValidation.safeParse(input);
149
+ if (!result.success) {
150
150
  throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
151
- errors: error.details
151
+ errors: result.error.errors
152
152
  });
153
153
  }
154
- const _result$value = result.value,
154
+ const _result$data = result.data,
155
155
  {
156
156
  password
157
- } = _result$value,
158
- settings = (0, _objectWithoutProperties2.default)(_result$value, _excluded);
159
- if (!settings.port) {
160
- settings.port = 25;
161
- }
157
+ } = _result$data,
158
+ settings = (0, _objectWithoutProperties2.default)(_result$data, _excluded);
162
159
  const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
160
+ port: settings.port || defaultPort,
163
161
  password: ""
164
162
  });
165
163
  try {
@@ -168,7 +166,7 @@ const createSettingsCrud = async context => {
168
166
  settings: passwordlessSettings
169
167
  });
170
168
  await context.cms.createEntry(model, (0, _transform.transformInputToEntryValues)({
171
- values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
169
+ values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, passwordlessSettings), {}, {
172
170
  password
173
171
  }),
174
172
  secret
@@ -199,11 +197,10 @@ const createSettingsCrud = async context => {
199
197
  original: initialOriginal
200
198
  } = params;
201
199
  const model = await getModel();
202
- const result = _validation.updateValidation.validate(input);
203
- const error = result.error;
204
- if (error) {
200
+ const result = _validation.updateValidation.safeParse(input);
201
+ if (!result.success) {
205
202
  throw new _error.default("Validation failed!", "VALIDATION_ERROR", {
206
- errors: error.details
203
+ errors: result.error.errors
207
204
  });
208
205
  }
209
206
  let original = initialOriginal;
@@ -213,15 +210,13 @@ const createSettingsCrud = async context => {
213
210
  throw new _error.default(`You are trying to update settings, but there is no existing record. Create it first!`, "NOT_FOUND");
214
211
  }
215
212
  }
216
- const _result$value2 = result.value,
213
+ const _result$data2 = result.data,
217
214
  {
218
215
  password
219
- } = _result$value2,
220
- settings = (0, _objectWithoutProperties2.default)(_result$value2, _excluded2);
221
- if (!settings.port) {
222
- settings.port = original.port || 25;
223
- }
216
+ } = _result$data2,
217
+ settings = (0, _objectWithoutProperties2.default)(_result$data2, _excluded2);
224
218
  const passwordlessSettings = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
219
+ port: settings.port || original.port || defaultPort,
225
220
  password: ""
226
221
  });
227
222
  try {
@@ -231,7 +226,7 @@ const createSettingsCrud = async context => {
231
226
  original
232
227
  });
233
228
  const transformedInput = (0, _transform.transformInputToEntryValues)({
234
- values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settings), {}, {
229
+ values: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, passwordlessSettings), {}, {
235
230
  password: password || original.password
236
231
  }),
237
232
  secret
@@ -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":"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"}
1
+ {"version":3,"names":["defaultPort","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\nconst defaultPort = 25;\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 const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || defaultPort,\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 ...passwordlessSettings,\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 const passwordlessSettings: TransportSettings = {\n ...settings,\n port: settings.port || original.port || defaultPort,\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 ...passwordlessSettings,\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,24 +5,22 @@ 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
- const options = {
12
- tlds: false
13
- };
14
- const requiredString = _joi.default.string().required();
15
- const requiredEmail = requiredString.email(options);
16
- const schema = _joi.default.object({
17
- to: _joi.default.array().items(requiredEmail),
18
- from: _joi.default.string().email(options),
19
- subject: requiredString.max(1024),
20
- cc: _joi.default.array().items(requiredEmail),
21
- bcc: _joi.default.array().items(requiredEmail),
22
- replyTo: _joi.default.string().email(options),
23
- text: requiredString.min(10),
24
- html: _joi.default.string()
25
- });
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(),
15
+ subject: requiredString.max(1024).min(2),
16
+ cc: _zod.default.array(requiredEmail).optional(),
17
+ bcc: _zod.default.array(requiredEmail).optional(),
18
+ replyTo: _zod.default.string().email().optional(),
19
+ text: _zod.default.string().optional(),
20
+ html: _zod.default.string().optional()
21
+ }).refine(data => {
22
+ return !!data.text || !!data.html;
23
+ }, "Either text or html is required.");
26
24
  const attachOnTransportBeforeSend = params => {
27
25
  const {
28
26
  onTransportBeforeSend
@@ -32,11 +30,22 @@ const attachOnTransportBeforeSend = params => {
32
30
  }) => {
33
31
  let result;
34
32
  try {
35
- result = await schema.validate(input);
36
- if (!result.error) {
33
+ result = schema.safeParse(input);
34
+ if (result.success) {
37
35
  return;
38
36
  }
37
+ throw new _error.default({
38
+ message: "Error while validating e-mail params.",
39
+ code: "VALIDATION_ERROR",
40
+ data: {
41
+ error: result.error,
42
+ input
43
+ }
44
+ });
39
45
  } catch (ex) {
46
+ if (ex instanceof _error.default) {
47
+ throw ex;
48
+ }
40
49
  throw new _error.default({
41
50
  message: "Error while validating e-mail params.",
42
51
  code: "VALIDATION_ERROR",
@@ -46,11 +55,6 @@ const attachOnTransportBeforeSend = params => {
46
55
  }
47
56
  });
48
57
  }
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
58
  });
55
59
  };
56
60
  exports.attachOnTransportBeforeSend = attachOnTransportBeforeSend;
@@ -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: 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;AACV,CAAC;AAED,MAAMC,cAAc,GAAGC,YAAG,CAACC,MAAM,EAAE,CAACC,QAAQ,EAAE;AAC9C,MAAMC,aAAa,GAAGJ,cAAc,CAACK,KAAK,CAACP,OAAO,CAAC;AAEnD,MAAMQ,MAAM,GAAGL,YAAG,CAACM,MAAM,CAAoB;EACzCC,EAAE,EAAEP,YAAG,CAACQ,KAAK,EAAE,CAACC,KAAK,CAACN,aAAa,CAAC;EACpCO,IAAI,EAAEV,YAAG,CAACC,MAAM,EAAE,CAACG,KAAK,CAACP,OAAO,CAAC;EACjCc,OAAO,EAAEZ,cAAc,CAACa,GAAG,CAAC,IAAI,CAAC;EACjCC,EAAE,EAAEb,YAAG,CAACQ,KAAK,EAAE,CAACC,KAAK,CAACN,aAAa,CAAC;EACpCW,GAAG,EAAEd,YAAG,CAACQ,KAAK,EAAE,CAACC,KAAK,CAACN,aAAa,CAAC;EACrCY,OAAO,EAAEf,YAAG,CAACC,MAAM,EAAE,CAACG,KAAK,CAACP,OAAO,CAAC;EACpCmB,IAAI,EAAEjB,cAAc,CAACkB,GAAG,CAAC,EAAE,CAAC;EAC5BC,IAAI,EAAElB,YAAG,CAACC,MAAM;AACpB,CAAC,CAAC;AAKK,MAAMkB,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,MAA+C;IACnD,IAAI;MACAA,MAAM,GAAG,MAAMpB,MAAM,CAACqB,QAAQ,CAACF,KAAK,CAAC;MAErC,IAAI,CAACC,MAAM,CAACE,KAAK,EAAE;QACf;MACJ;IACJ,CAAC,CAAC,OAAOC,EAAE,EAAE;MACT,MAAM,IAAIC,cAAW,CAAC;QAClBC,OAAO,EAAE,uCAAuC;QAChDC,IAAI,EAAE,kBAAkB;QACxBR,IAAI,EAAE;UACFC,KAAK;UACLG,KAAK,EAAEC;QACX;MACJ,CAAC,CAAC;IACN;IACA,MAAM,IAAIC,cAAW,CAAC;MAClBC,OAAO,EAAE,uCAAuC;MAChDC,IAAI,EAAE,kBAAkB;MACxBR,IAAI,kCACGE,MAAM,CAACE,KAAK;IAEvB,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAAC"}
1
+ {"version":3,"names":["requiredString","zod","string","requiredEmail","email","schema","object","to","array","optional","from","subject","max","min","cc","bcc","replyTo","text","html","refine","data","attachOnTransportBeforeSend","params","onTransportBeforeSend","subscribe","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\n .object({\n to: zod.array(requiredEmail).optional(),\n from: zod.string().email().optional(),\n subject: requiredString.max(1024).min(2),\n cc: zod.array(requiredEmail).optional(),\n bcc: zod.array(requiredEmail).optional(),\n replyTo: zod.string().email().optional(),\n text: zod.string().optional(),\n html: zod.string().optional()\n })\n .refine(data => {\n return !!data.text || !!data.html;\n }, \"Either text or html is required.\");\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,CACbK,MAAM,CAAC;EACJC,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,CAACC,GAAG,CAAC,CAAC,CAAC;EACxCC,EAAE,EAAEb,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACvCM,GAAG,EAAEd,YAAG,CAACO,KAAK,CAACL,aAAa,CAAC,CAACM,QAAQ,EAAE;EACxCO,OAAO,EAAEf,YAAG,CAACC,MAAM,EAAE,CAACE,KAAK,EAAE,CAACK,QAAQ,EAAE;EACxCQ,IAAI,EAAEhB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ,EAAE;EAC7BS,IAAI,EAAEjB,YAAG,CAACC,MAAM,EAAE,CAACO,QAAQ;AAC/B,CAAC,CAAC,CACDU,MAAM,CAACC,IAAI,IAAI;EACZ,OAAO,CAAC,CAACA,IAAI,CAACH,IAAI,IAAI,CAAC,CAACG,IAAI,CAACF,IAAI;AACrC,CAAC,EAAE,kCAAkC,CAAC;AAOnC,MAAMG,2BAA2B,GAAIC,MAAc,IAAK;EAC3D,MAAM;IAAEC;EAAsB,CAAC,GAAGD,MAAM;EAExCC,qBAAqB,CAACC,SAAS,CAAC,OAAO;IAAEJ,IAAI,EAAEK;EAAM,CAAC,KAAK;IACvD,IAAIC,MAAmD;IACvD,IAAI;MACAA,MAAM,GAAGrB,MAAM,CAACsB,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;QACxBX,IAAI,EAAE;UACFY,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;QACxBX,IAAI,EAAE;UACFK,KAAK;UACLO,KAAK,EAAEC;QACX;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAAC"}
@@ -53,13 +53,8 @@ const getDefaultSettings = () => {
53
53
  if (!hasAtLeastOneValue) {
54
54
  return null;
55
55
  }
56
- try {
57
- const result = _validation.createValidation.validate(input);
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): number => {\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 as TransportSettings) : 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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"}
@@ -23,16 +23,16 @@ const createSettingsGraphQL = () => {
23
23
  replyTo: String
24
24
  }
25
25
 
26
- type MailerSettingsResponse {
26
+ type MailerTransportSettingsResponse {
27
27
  data: MailerTransportSettings
28
28
  error: MailerTransportSettingsError
29
29
  }
30
30
 
31
31
  type MailerQuery {
32
- getSettings: MailerSettingsResponse!
32
+ getSettings: MailerTransportSettingsResponse!
33
33
  }
34
34
 
35
- input TransportSettingsInput {
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: TransportSettingsInput!): MailerSettingsResponse!
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
  }
@@ -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 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,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,EAAE;cACV;cACA,OAAOA,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,EAAE;cACV;cACA,OAAOA,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"}
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/index.d.ts CHANGED
@@ -1,8 +1,5 @@
1
1
  import { PluginCollection } from "@webiny/plugins/types";
2
- import { createDummyTransport, DummyTransport } from "./transports/createDummyTransport";
3
- import { createSmtpTransport, SmtpTransport, SmtpTransportConfig } from "./transports/createSmtpTransport";
4
- import { createTransport } from "./plugins";
5
- export { createDummyTransport, createSmtpTransport, createTransport };
6
- export type { SmtpTransport, SmtpTransportConfig, DummyTransport };
2
+ export * from "./plugins";
3
+ export * from "./transports";
7
4
  export declare const createMailerContext: () => PluginCollection;
8
5
  export declare const createMailerGraphQL: () => import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("./types").MailerContext>[];