@webiny/api-mailer 6.3.0-beta.2 → 6.3.0-beta.4

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.
Files changed (90) hide show
  1. package/domain/CodeMailerSettings/abstractions.d.ts +8 -0
  2. package/domain/CodeMailerSettings/abstractions.js +4 -0
  3. package/domain/CodeMailerSettings/abstractions.js.map +1 -0
  4. package/domain/MailTransport/abstractions.d.ts +8 -0
  5. package/domain/MailTransport/abstractions.js +1 -0
  6. package/domain/MailTransport/abstractions.js.map +1 -1
  7. package/domain/errors.d.ts +4 -0
  8. package/domain/errors.js +8 -0
  9. package/domain/errors.js.map +1 -1
  10. package/exports/api/mailer.d.ts +4 -0
  11. package/exports/api/mailer.js +6 -0
  12. package/exports/api/mailer.js.map +1 -0
  13. package/features/CodeMailerSettings/CodeMailerSettingsImpl.d.ts +12 -0
  14. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js +22 -0
  15. package/features/CodeMailerSettings/CodeMailerSettingsImpl.js.map +1 -0
  16. package/features/{Encryption → CodeMailerSettings}/feature.d.ts +1 -1
  17. package/features/CodeMailerSettings/feature.js +10 -0
  18. package/features/CodeMailerSettings/feature.js.map +1 -0
  19. package/features/DummyTransport/DummyMailTransportFactory.d.ts +1 -0
  20. package/features/DummyTransport/DummyMailTransportFactory.js +1 -0
  21. package/features/DummyTransport/DummyMailTransportFactory.js.map +1 -1
  22. package/features/GetSettings/GetSettingsRepository.d.ts +6 -5
  23. package/features/GetSettings/GetSettingsRepository.js +29 -10
  24. package/features/GetSettings/GetSettingsRepository.js.map +1 -1
  25. package/features/GetSettings/GetSettingsUseCase.d.ts +3 -4
  26. package/features/GetSettings/GetSettingsUseCase.js +2 -2
  27. package/features/GetSettings/GetSettingsUseCase.js.map +1 -1
  28. package/features/GetSettings/abstractions.d.ts +11 -5
  29. package/features/GetSettings/abstractions.js.map +1 -1
  30. package/features/GetSettings/index.d.ts +1 -1
  31. package/features/GetSettings/index.js +1 -1
  32. package/features/GetSettings/index.js.map +1 -1
  33. package/features/MailerService/ActiveTransport.d.ts +10 -0
  34. package/features/MailerService/ActiveTransport.js +20 -0
  35. package/features/MailerService/ActiveTransport.js.map +1 -0
  36. package/features/MailerService/MailerService.d.ts +3 -2
  37. package/features/MailerService/MailerService.js +16 -15
  38. package/features/MailerService/MailerService.js.map +1 -1
  39. package/features/MailerService/feature.js +2 -0
  40. package/features/MailerService/feature.js.map +1 -1
  41. package/features/SaveSettings/SaveSettingsRepository.d.ts +1 -1
  42. package/features/SaveSettings/SaveSettingsRepository.js +12 -10
  43. package/features/SaveSettings/SaveSettingsRepository.js.map +1 -1
  44. package/features/SaveSettings/SaveSettingsUseCase.d.ts +5 -1
  45. package/features/SaveSettings/SaveSettingsUseCase.js +26 -8
  46. package/features/SaveSettings/SaveSettingsUseCase.js.map +1 -1
  47. package/features/SaveSettings/abstractions.d.ts +15 -7
  48. package/features/SaveSettings/abstractions.js +10 -1
  49. package/features/SaveSettings/abstractions.js.map +1 -1
  50. package/features/SaveSettings/index.d.ts +1 -1
  51. package/features/SaveSettings/index.js +1 -1
  52. package/features/SaveSettings/index.js.map +1 -1
  53. package/features/SaveSettings/validation.js +7 -3
  54. package/features/SaveSettings/validation.js.map +1 -1
  55. package/features/SendMail/SendMailUseCase.js +9 -6
  56. package/features/SendMail/SendMailUseCase.js.map +1 -1
  57. package/features/SendMail/index.d.ts +1 -0
  58. package/features/SendMail/index.js +3 -0
  59. package/features/SendMail/index.js.map +1 -0
  60. package/features/SmtpTransport/SmtpMailTransport.d.ts +51 -1
  61. package/features/SmtpTransport/SmtpMailTransport.js +7 -1
  62. package/features/SmtpTransport/SmtpMailTransport.js.map +1 -1
  63. package/features/SmtpTransport/SmtpMailTransportFactory.d.ts +1 -0
  64. package/features/SmtpTransport/SmtpMailTransportFactory.js +1 -0
  65. package/features/SmtpTransport/SmtpMailTransportFactory.js.map +1 -1
  66. package/graphql/settings.js +44 -32
  67. package/graphql/settings.js.map +1 -1
  68. package/index.js +3 -3
  69. package/index.js.map +1 -1
  70. package/package.json +20 -24
  71. package/utils/isMailboxAddress.d.ts +6 -0
  72. package/utils/isMailboxAddress.js +12 -0
  73. package/utils/isMailboxAddress.js.map +1 -0
  74. package/domain/Encryption/abstractions.d.ts +0 -8
  75. package/domain/Encryption/abstractions.js +0 -4
  76. package/domain/Encryption/abstractions.js.map +0 -1
  77. package/features/Encryption/PasswordEncryption.d.ts +0 -9
  78. package/features/Encryption/PasswordEncryption.js +0 -23
  79. package/features/Encryption/PasswordEncryption.js.map +0 -1
  80. package/features/Encryption/feature.js +0 -10
  81. package/features/Encryption/feature.js.map +0 -1
  82. package/features/Encryption/utils/password.d.ts +0 -7
  83. package/features/Encryption/utils/password.js +0 -56
  84. package/features/Encryption/utils/password.js.map +0 -1
  85. package/features/Encryption/utils/secret.d.ts +0 -1
  86. package/features/Encryption/utils/secret.js +0 -11
  87. package/features/Encryption/utils/secret.js.map +0 -1
  88. package/features/MailerService/TransportFactory.d.ts +0 -2
  89. package/features/MailerService/TransportFactory.js +0 -31
  90. package/features/MailerService/TransportFactory.js.map +0 -1
@@ -1,8 +1,28 @@
1
- import { ErrorResponse, GraphQLSchemaPlugin, Response } from "@webiny/handler-graphql";
1
+ import { ErrorResponse, GraphQLSchemaPlugin } from "@webiny/handler-graphql";
2
2
  import { GetSettingsUseCase } from "../features/GetSettings/abstractions.js";
3
3
  import { SaveSettingsUseCase } from "../features/SaveSettings/abstractions.js";
4
- import { getSecret } from "../features/Encryption/utils/secret.js";
4
+ import { ActiveTransport } from "../domain/MailTransport/abstractions.js";
5
5
  const emptyResolver = () => ({});
6
+
7
+ // Strip `password` before the settings leave the server and tack on `source`
8
+ // so the admin UI can branch on code-vs-storage. Accepts both the full
9
+ // `TransportSettings` (from getSettings) and the already-stripped
10
+ // `Omit<TransportSettings, "password">` (from saveSettings) — defense in depth
11
+ // even when the input type carries no password to begin with.
12
+ const toPublicSettings = (settings, source) => {
13
+ if (!settings) {
14
+ return null;
15
+ }
16
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
+ const {
18
+ password: _password,
19
+ ...publicSettings
20
+ } = settings;
21
+ return {
22
+ ...publicSettings,
23
+ source
24
+ };
25
+ };
6
26
  export const createSettingsGraphQL = () => {
7
27
  return new GraphQLSchemaPlugin({
8
28
  typeDefs: `
@@ -18,6 +38,7 @@ export const createSettingsGraphQL = () => {
18
38
  user: String
19
39
  from: String
20
40
  replyTo: String
41
+ source: String
21
42
  }
22
43
 
23
44
  type MailerTransportSettingsResponse {
@@ -56,24 +77,24 @@ export const createSettingsGraphQL = () => {
56
77
  MailerQuery: {
57
78
  getSettings: async (_, __, context) => {
58
79
  try {
59
- // First check of encryption key is set!
60
- // If not, this function will throw an error.
61
- // TODO: refactor this to make more sense.
62
- getSecret();
63
- const getSettings = context.container.resolve(GetSettingsUseCase);
64
- const result = await getSettings.execute();
65
- const settings = result.value;
66
-
67
- // Remove password from response
68
- if (settings?.password) {
69
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
70
- const {
71
- password,
72
- ...settingsWithoutPassword
73
- } = settings;
74
- return new Response(settingsWithoutPassword);
80
+ const activeTransport = context.container.resolve(ActiveTransport);
81
+ const transportName = activeTransport.name();
82
+ if (!transportName) {
83
+ return {
84
+ data: null,
85
+ error: null
86
+ };
75
87
  }
76
- return new Response(settings);
88
+ const getSettings = context.container.resolve(GetSettingsUseCase);
89
+ const result = await getSettings.execute(transportName);
90
+ const {
91
+ settings,
92
+ source
93
+ } = result.value;
94
+ return {
95
+ data: toPublicSettings(settings, source),
96
+ error: null
97
+ };
77
98
  } catch (ex) {
78
99
  return new ErrorResponse(ex);
79
100
  }
@@ -90,19 +111,10 @@ export const createSettingsGraphQL = () => {
90
111
  if (result.isFail()) {
91
112
  return new ErrorResponse(result.error);
92
113
  }
93
- const settings = result.value;
94
-
95
- // Remove password from response
96
- // TODO: create a GraphQL output mapper
97
- if (settings?.password) {
98
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
99
- const {
100
- password,
101
- ...settingsWithoutPassword
102
- } = settings;
103
- return new Response(settingsWithoutPassword);
104
- }
105
- return new Response(settings);
114
+ return {
115
+ data: toPublicSettings(result.value, "storage"),
116
+ error: null
117
+ };
106
118
  } catch (ex) {
107
119
  return new ErrorResponse(ex);
108
120
  }
@@ -1 +1 @@
1
- {"version":3,"names":["ErrorResponse","GraphQLSchemaPlugin","Response","GetSettingsUseCase","SaveSettingsUseCase","getSecret","emptyResolver","createSettingsGraphQL","typeDefs","resolvers","Query","mailer","MailerQuery","getSettings","_","__","context","container","resolve","result","execute","settings","value","password","settingsWithoutPassword","ex","Mutation","MailerMutation","saveSettings","args","data","isFail","error"],"sources":["settings.ts"],"sourcesContent":["import { ErrorResponse, GraphQLSchemaPlugin, Response } from \"@webiny/handler-graphql\";\nimport { GetSettingsUseCase } from \"~/features/GetSettings/abstractions.js\";\nimport { SaveSettingsUseCase } from \"~/features/SaveSettings/abstractions.js\";\nimport type { Context } from \"@webiny/api/types.js\";\nimport { getSecret } from \"~/features/Encryption/utils/secret.js\";\n\nconst emptyResolver = () => ({});\n\nexport const createSettingsGraphQL = () => {\n return new GraphQLSchemaPlugin<Context>({\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 // First check of encryption key is set!\n // If not, this function will throw an error.\n // TODO: refactor this to make more sense.\n getSecret();\n\n const getSettings = context.container.resolve(GetSettingsUseCase);\n const result = await getSettings.execute();\n\n const settings = result.value;\n\n // Remove password from response\n if (settings?.password) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password, ...settingsWithoutPassword } = settings;\n return new Response(settingsWithoutPassword);\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 saveSettings = context.container.resolve(SaveSettingsUseCase);\n const result = await saveSettings.execute(args.data);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n const settings = result.value;\n\n // Remove password from response\n // TODO: create a GraphQL output mapper\n if (settings?.password) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password, ...settingsWithoutPassword } = settings;\n return new Response(settingsWithoutPassword);\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n }\n }\n });\n};\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,mBAAmB,EAAEC,QAAQ,QAAQ,yBAAyB;AACtF,SAASC,kBAAkB;AAC3B,SAASC,mBAAmB;AAE5B,SAASC,SAAS;AAElB,MAAMC,aAAa,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAEhC,OAAO,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EACvC,OAAO,IAAIN,mBAAmB,CAAU;IACpCO,QAAQ,EAAE;AAClB;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,EAAEL;MACZ,CAAC;MACDM,WAAW,EAAE;QACTC,WAAW,EAAE,MAAAA,CAAOC,CAAC,EAAEC,EAAE,EAAEC,OAAO,KAAK;UACnC,IAAI;YACA;YACA;YACA;YACAX,SAAS,CAAC,CAAC;YAEX,MAAMQ,WAAW,GAAGG,OAAO,CAACC,SAAS,CAACC,OAAO,CAACf,kBAAkB,CAAC;YACjE,MAAMgB,MAAM,GAAG,MAAMN,WAAW,CAACO,OAAO,CAAC,CAAC;YAE1C,MAAMC,QAAQ,GAAGF,MAAM,CAACG,KAAK;;YAE7B;YACA,IAAID,QAAQ,EAAEE,QAAQ,EAAE;cACpB;cACA,MAAM;gBAAEA,QAAQ;gBAAE,GAAGC;cAAwB,CAAC,GAAGH,QAAQ;cACzD,OAAO,IAAInB,QAAQ,CAACsB,uBAAuB,CAAC;YAChD;YACA,OAAO,IAAItB,QAAQ,CAACmB,QAAQ,CAAC;UACjC,CAAC,CAAC,OAAOI,EAAE,EAAE;YACT,OAAO,IAAIzB,aAAa,CAACyB,EAAE,CAAC;UAChC;QACJ;MACJ,CAAC;MACDC,QAAQ,EAAE;QACNf,MAAM,EAAEL;MACZ,CAAC;MACDqB,cAAc,EAAE;QACZC,YAAY,EAAE,MAAAA,CAAOd,CAAC,EAAEe,IAAS,EAAEb,OAAO,KAAK;UAC3C,IAAI;YACA,MAAMY,YAAY,GAAGZ,OAAO,CAACC,SAAS,CAACC,OAAO,CAACd,mBAAmB,CAAC;YACnE,MAAMe,MAAM,GAAG,MAAMS,YAAY,CAACR,OAAO,CAACS,IAAI,CAACC,IAAI,CAAC;YAEpD,IAAIX,MAAM,CAACY,MAAM,CAAC,CAAC,EAAE;cACjB,OAAO,IAAI/B,aAAa,CAACmB,MAAM,CAACa,KAAK,CAAC;YAC1C;YAEA,MAAMX,QAAQ,GAAGF,MAAM,CAACG,KAAK;;YAE7B;YACA;YACA,IAAID,QAAQ,EAAEE,QAAQ,EAAE;cACpB;cACA,MAAM;gBAAEA,QAAQ;gBAAE,GAAGC;cAAwB,CAAC,GAAGH,QAAQ;cACzD,OAAO,IAAInB,QAAQ,CAACsB,uBAAuB,CAAC;YAChD;YACA,OAAO,IAAItB,QAAQ,CAACmB,QAAQ,CAAC;UACjC,CAAC,CAAC,OAAOI,EAAE,EAAE;YACT,OAAO,IAAIzB,aAAa,CAACyB,EAAE,CAAC;UAChC;QACJ;MACJ;IACJ;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ErrorResponse","GraphQLSchemaPlugin","GetSettingsUseCase","SaveSettingsUseCase","ActiveTransport","emptyResolver","toPublicSettings","settings","source","password","_password","publicSettings","createSettingsGraphQL","typeDefs","resolvers","Query","mailer","MailerQuery","getSettings","_","__","context","activeTransport","container","resolve","transportName","name","data","error","result","execute","value","ex","Mutation","MailerMutation","saveSettings","args","isFail"],"sources":["settings.ts"],"sourcesContent":["import { ErrorResponse, GraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { GetSettingsUseCase } from \"~/features/GetSettings/abstractions.js\";\nimport { SaveSettingsUseCase } from \"~/features/SaveSettings/abstractions.js\";\nimport { ActiveTransport } from \"~/domain/MailTransport/abstractions.js\";\nimport type { MailerSettingsSource } from \"~/features/GetSettings/abstractions.js\";\nimport type { Context } from \"@webiny/api/types.js\";\nimport type { TransportSettings } from \"~/types.js\";\n\nconst emptyResolver = () => ({});\n\n// Strip `password` before the settings leave the server and tack on `source`\n// so the admin UI can branch on code-vs-storage. Accepts both the full\n// `TransportSettings` (from getSettings) and the already-stripped\n// `Omit<TransportSettings, \"password\">` (from saveSettings) — defense in depth\n// even when the input type carries no password to begin with.\nconst toPublicSettings = (\n settings: TransportSettings | Omit<TransportSettings, \"password\"> | null,\n source: MailerSettingsSource\n): (Omit<TransportSettings, \"password\"> & { source: MailerSettingsSource }) | null => {\n if (!settings) {\n return null;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password: _password, ...publicSettings } = settings as TransportSettings;\n return { ...publicSettings, source };\n};\n\nexport const createSettingsGraphQL = () => {\n return new GraphQLSchemaPlugin<Context>({\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 source: 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 activeTransport = context.container.resolve(ActiveTransport);\n const transportName = activeTransport.name();\n\n if (!transportName) {\n return { data: null, error: null };\n }\n\n const getSettings = context.container.resolve(GetSettingsUseCase);\n const result = await getSettings.execute(transportName);\n\n const { settings, source } = result.value;\n\n return {\n data: toPublicSettings(settings, source),\n error: null\n };\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 saveSettings = context.container.resolve(SaveSettingsUseCase);\n const result = await saveSettings.execute(args.data);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return {\n data: toPublicSettings(result.value, \"storage\"),\n error: null\n };\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n }\n }\n });\n};\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,mBAAmB,QAAQ,yBAAyB;AAC5E,SAASC,kBAAkB;AAC3B,SAASC,mBAAmB;AAC5B,SAASC,eAAe;AAKxB,MAAMC,aAAa,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;;AAEhC;AACA;AACA;AACA;AACA;AACA,MAAMC,gBAAgB,GAAGA,CACrBC,QAAwE,EACxEC,MAA4B,KACsD;EAClF,IAAI,CAACD,QAAQ,EAAE;IACX,OAAO,IAAI;EACf;EACA;EACA,MAAM;IAAEE,QAAQ,EAAEC,SAAS;IAAE,GAAGC;EAAe,CAAC,GAAGJ,QAA6B;EAChF,OAAO;IAAE,GAAGI,cAAc;IAAEH;EAAO,CAAC;AACxC,CAAC;AAED,OAAO,MAAMI,qBAAqB,GAAGA,CAAA,KAAM;EACvC,OAAO,IAAIX,mBAAmB,CAAU;IACpCY,QAAQ,EAAE;AAClB;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;AACA,SAAS;IACDC,SAAS,EAAE;MACPC,KAAK,EAAE;QACHC,MAAM,EAAEX;MACZ,CAAC;MACDY,WAAW,EAAE;QACTC,WAAW,EAAE,MAAAA,CAAOC,CAAC,EAAEC,EAAE,EAAEC,OAAO,KAAK;UACnC,IAAI;YACA,MAAMC,eAAe,GAAGD,OAAO,CAACE,SAAS,CAACC,OAAO,CAACpB,eAAe,CAAC;YAClE,MAAMqB,aAAa,GAAGH,eAAe,CAACI,IAAI,CAAC,CAAC;YAE5C,IAAI,CAACD,aAAa,EAAE;cAChB,OAAO;gBAAEE,IAAI,EAAE,IAAI;gBAAEC,KAAK,EAAE;cAAK,CAAC;YACtC;YAEA,MAAMV,WAAW,GAAGG,OAAO,CAACE,SAAS,CAACC,OAAO,CAACtB,kBAAkB,CAAC;YACjE,MAAM2B,MAAM,GAAG,MAAMX,WAAW,CAACY,OAAO,CAACL,aAAa,CAAC;YAEvD,MAAM;cAAElB,QAAQ;cAAEC;YAAO,CAAC,GAAGqB,MAAM,CAACE,KAAK;YAEzC,OAAO;cACHJ,IAAI,EAAErB,gBAAgB,CAACC,QAAQ,EAAEC,MAAM,CAAC;cACxCoB,KAAK,EAAE;YACX,CAAC;UACL,CAAC,CAAC,OAAOI,EAAE,EAAE;YACT,OAAO,IAAIhC,aAAa,CAACgC,EAAE,CAAC;UAChC;QACJ;MACJ,CAAC;MACDC,QAAQ,EAAE;QACNjB,MAAM,EAAEX;MACZ,CAAC;MACD6B,cAAc,EAAE;QACZC,YAAY,EAAE,MAAAA,CAAOhB,CAAC,EAAEiB,IAAS,EAAEf,OAAO,KAAK;UAC3C,IAAI;YACA,MAAMc,YAAY,GAAGd,OAAO,CAACE,SAAS,CAACC,OAAO,CAACrB,mBAAmB,CAAC;YACnE,MAAM0B,MAAM,GAAG,MAAMM,YAAY,CAACL,OAAO,CAACM,IAAI,CAACT,IAAI,CAAC;YAEpD,IAAIE,MAAM,CAACQ,MAAM,CAAC,CAAC,EAAE;cACjB,OAAO,IAAIrC,aAAa,CAAC6B,MAAM,CAACD,KAAK,CAAC;YAC1C;YAEA,OAAO;cACHD,IAAI,EAAErB,gBAAgB,CAACuB,MAAM,CAACE,KAAK,EAAE,SAAS,CAAC;cAC/CH,KAAK,EAAE;YACX,CAAC;UACL,CAAC,CAAC,OAAOI,EAAE,EAAE;YACT,OAAO,IAAIhC,aAAa,CAACgC,EAAE,CAAC;UAChC;QACJ;MACJ;IACJ;EACJ,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { createContextPlugin } from "@webiny/api";
2
- import { EncryptionFeature } from "./features/Encryption/feature.js";
2
+ import { CodeMailerSettingsFeature } from "./features/CodeMailerSettings/feature.js";
3
3
  import { GetSettingsFeature } from "./features/GetSettings/feature.js";
4
4
  import { SaveSettingsFeature } from "./features/SaveSettings/feature.js";
5
5
  import { DummyTransportFeature } from "./features/DummyTransport/feature.js";
@@ -10,8 +10,8 @@ import { createSettingsGraphQL } from "./graphql/settings.js";
10
10
  export { MailerService } from "./domain/MailerService/abstractions.js";
11
11
  export const createMailerContext = () => {
12
12
  return createContextPlugin(context => {
13
- // Register all features
14
- EncryptionFeature.register(context.container);
13
+ // Register all features.
14
+ CodeMailerSettingsFeature.register(context.container);
15
15
  DummyTransportFeature.register(context.container);
16
16
  SmtpTransportFeature.register(context.container);
17
17
  GetSettingsFeature.register(context.container);
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["createContextPlugin","EncryptionFeature","GetSettingsFeature","SaveSettingsFeature","DummyTransportFeature","SmtpTransportFeature","MailerServiceFeature","SendMailFeature","createSettingsGraphQL","MailerService","createMailerContext","context","register","container","createMailerGraphQL"],"sources":["index.ts"],"sourcesContent":["import { createContextPlugin } from \"@webiny/api\";\nimport { EncryptionFeature } from \"~/features/Encryption/feature.js\";\nimport { GetSettingsFeature } from \"~/features/GetSettings/feature.js\";\nimport { SaveSettingsFeature } from \"~/features/SaveSettings/feature.js\";\nimport { DummyTransportFeature } from \"~/features/DummyTransport/feature.js\";\nimport { SmtpTransportFeature } from \"~/features/SmtpTransport/feature.js\";\nimport { MailerServiceFeature } from \"~/features/MailerService/feature.js\";\nimport { SendMailFeature } from \"~/features/SendMail/feature.js\";\nimport { createSettingsGraphQL } from \"~/graphql/settings.js\";\n\nexport { MailerService } from \"./domain/MailerService/abstractions.js\";\nexport type { IMailerService, IMailerServiceErrors } from \"./domain/MailerService/abstractions.js\";\n\nexport const createMailerContext = () => {\n return createContextPlugin(context => {\n // Register all features\n EncryptionFeature.register(context.container);\n DummyTransportFeature.register(context.container);\n SmtpTransportFeature.register(context.container);\n GetSettingsFeature.register(context.container);\n SaveSettingsFeature.register(context.container);\n MailerServiceFeature.register(context.container);\n SendMailFeature.register(context.container);\n });\n};\n\nexport const createMailerGraphQL = () => {\n return createSettingsGraphQL();\n};\n"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,aAAa;AACjD,SAASC,iBAAiB;AAC1B,SAASC,kBAAkB;AAC3B,SAASC,mBAAmB;AAC5B,SAASC,qBAAqB;AAC9B,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,eAAe;AACxB,SAASC,qBAAqB;AAE9B,SAASC,aAAa;AAGtB,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAOV,mBAAmB,CAACW,OAAO,IAAI;IAClC;IACAV,iBAAiB,CAACW,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC7CT,qBAAqB,CAACQ,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IACjDR,oBAAoB,CAACO,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAChDX,kBAAkB,CAACU,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC9CV,mBAAmB,CAACS,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC/CP,oBAAoB,CAACM,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAChDN,eAAe,CAACK,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;EAC/C,CAAC,CAAC;AACN,CAAC;AAED,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAON,qBAAqB,CAAC,CAAC;AAClC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createContextPlugin","CodeMailerSettingsFeature","GetSettingsFeature","SaveSettingsFeature","DummyTransportFeature","SmtpTransportFeature","MailerServiceFeature","SendMailFeature","createSettingsGraphQL","MailerService","createMailerContext","context","register","container","createMailerGraphQL"],"sources":["index.ts"],"sourcesContent":["import { createContextPlugin } from \"@webiny/api\";\nimport { CodeMailerSettingsFeature } from \"~/features/CodeMailerSettings/feature.js\";\nimport { GetSettingsFeature } from \"~/features/GetSettings/feature.js\";\nimport { SaveSettingsFeature } from \"~/features/SaveSettings/feature.js\";\nimport { DummyTransportFeature } from \"~/features/DummyTransport/feature.js\";\nimport { SmtpTransportFeature } from \"~/features/SmtpTransport/feature.js\";\nimport { MailerServiceFeature } from \"~/features/MailerService/feature.js\";\nimport { SendMailFeature } from \"~/features/SendMail/feature.js\";\nimport { createSettingsGraphQL } from \"~/graphql/settings.js\";\n\nexport { MailerService } from \"./domain/MailerService/abstractions.js\";\nexport type { IMailerService, IMailerServiceErrors } from \"./domain/MailerService/abstractions.js\";\n\nexport const createMailerContext = () => {\n return createContextPlugin(context => {\n // Register all features.\n CodeMailerSettingsFeature.register(context.container);\n DummyTransportFeature.register(context.container);\n SmtpTransportFeature.register(context.container);\n GetSettingsFeature.register(context.container);\n SaveSettingsFeature.register(context.container);\n MailerServiceFeature.register(context.container);\n SendMailFeature.register(context.container);\n });\n};\n\nexport const createMailerGraphQL = () => {\n return createSettingsGraphQL();\n};\n"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,aAAa;AACjD,SAASC,yBAAyB;AAClC,SAASC,kBAAkB;AAC3B,SAASC,mBAAmB;AAC5B,SAASC,qBAAqB;AAC9B,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,eAAe;AACxB,SAASC,qBAAqB;AAE9B,SAASC,aAAa;AAGtB,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAOV,mBAAmB,CAACW,OAAO,IAAI;IAClC;IACAV,yBAAyB,CAACW,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IACrDT,qBAAqB,CAACQ,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IACjDR,oBAAoB,CAACO,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAChDX,kBAAkB,CAACU,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC9CV,mBAAmB,CAACS,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC/CP,oBAAoB,CAACM,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAChDN,eAAe,CAACK,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;EAC/C,CAAC,CAAC;AACN,CAAC;AAED,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAON,qBAAqB,CAAC,CAAC;AAClC,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/api-mailer",
3
- "version": "6.3.0-beta.2",
3
+ "version": "6.3.0-beta.4",
4
4
  "type": "module",
5
- "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/webiny/webiny-js.git",
@@ -15,24 +18,24 @@
15
18
  "description": "The API to send e-mails.",
16
19
  "license": "MIT",
17
20
  "dependencies": {
18
- "@webiny/api": "6.3.0-beta.2",
19
- "@webiny/api-headless-cms": "6.3.0-beta.2",
20
- "@webiny/error": "6.3.0-beta.2",
21
- "@webiny/feature": "6.3.0-beta.2",
22
- "@webiny/handler-graphql": "6.3.0-beta.2",
23
- "@webiny/plugins": "6.3.0-beta.2",
24
- "nodemailer": "8.0.5",
21
+ "@webiny/api": "6.3.0-beta.4",
22
+ "@webiny/api-headless-cms": "6.3.0-beta.4",
23
+ "@webiny/feature": "6.3.0-beta.4",
24
+ "@webiny/handler-graphql": "6.3.0-beta.4",
25
+ "@webiny/plugins": "6.3.0-beta.4",
26
+ "email-addresses": "5.0.0",
27
+ "nodemailer": "8.0.7",
25
28
  "zod": "4.3.6"
26
29
  },
27
30
  "devDependencies": {
28
31
  "@types/nodemailer": "8.0.0",
29
- "@webiny/api-core": "6.3.0-beta.2",
30
- "@webiny/build-tools": "6.3.0-beta.2",
31
- "@webiny/db-dynamodb": "6.3.0-beta.2",
32
- "@webiny/handler": "6.3.0-beta.2",
33
- "@webiny/handler-aws": "6.3.0-beta.2",
34
- "@webiny/handler-db": "6.3.0-beta.2",
35
- "@webiny/project-utils": "6.3.0-beta.2",
32
+ "@webiny/api-core": "6.3.0-beta.4",
33
+ "@webiny/build-tools": "6.3.0-beta.4",
34
+ "@webiny/db-dynamodb": "6.3.0-beta.4",
35
+ "@webiny/handler": "6.3.0-beta.4",
36
+ "@webiny/handler-aws": "6.3.0-beta.4",
37
+ "@webiny/handler-db": "6.3.0-beta.4",
38
+ "@webiny/project-utils": "6.3.0-beta.4",
36
39
  "graphql": "16.13.2",
37
40
  "jest-dynalite": "3.6.1",
38
41
  "rimraf": "6.1.3",
@@ -43,12 +46,5 @@
43
46
  "access": "public",
44
47
  "directory": "dist"
45
48
  },
46
- "gitHead": "c5ae1dbcb99bf7457449ef67aef19c5b4b1ffc4c",
47
- "adio": {
48
- "ignore": {
49
- "src": [
50
- "node:crypto"
51
- ]
52
- }
53
- }
49
+ "gitHead": "7cefe15431dbd65504e1f58147dc9e55bcbfa693"
54
50
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * RFC 5322 mailbox validator. Accepts both addr-spec ("addr@domain") and
3
+ * name-addr ("Display Name <addr@domain>") forms — both are valid SMTP
4
+ * From / Reply-To inputs that nodemailer and most providers accept.
5
+ */
6
+ export declare const isMailboxAddress: (value: string) => boolean;
@@ -0,0 +1,12 @@
1
+ import emailAddresses from "email-addresses";
2
+
3
+ /**
4
+ * RFC 5322 mailbox validator. Accepts both addr-spec ("addr@domain") and
5
+ * name-addr ("Display Name <addr@domain>") forms — both are valid SMTP
6
+ * From / Reply-To inputs that nodemailer and most providers accept.
7
+ */
8
+ export const isMailboxAddress = value => {
9
+ return emailAddresses.parseOneAddress(value) !== null;
10
+ };
11
+
12
+ //# sourceMappingURL=isMailboxAddress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["emailAddresses","isMailboxAddress","value","parseOneAddress"],"sources":["isMailboxAddress.ts"],"sourcesContent":["import emailAddresses from \"email-addresses\";\n\n/**\n * RFC 5322 mailbox validator. Accepts both addr-spec (\"addr@domain\") and\n * name-addr (\"Display Name <addr@domain>\") forms — both are valid SMTP\n * From / Reply-To inputs that nodemailer and most providers accept.\n */\nexport const isMailboxAddress = (value: string): boolean => {\n return emailAddresses.parseOneAddress(value) !== null;\n};\n"],"mappings":"AAAA,OAAOA,cAAc,MAAM,iBAAiB;;AAE5C;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAIC,KAAa,IAAc;EACxD,OAAOF,cAAc,CAACG,eAAe,CAACD,KAAK,CAAC,KAAK,IAAI;AACzD,CAAC","ignoreList":[]}
@@ -1,8 +0,0 @@
1
- export interface IEncryption {
2
- encrypt(value: string): Promise<string>;
3
- decrypt(value: string): Promise<string>;
4
- }
5
- export declare const Encryption: import("@webiny/di").Abstraction<IEncryption>;
6
- export declare namespace Encryption {
7
- type Interface = IEncryption;
8
- }
@@ -1,4 +0,0 @@
1
- import { createAbstraction } from "@webiny/feature/api";
2
- export const Encryption = createAbstraction("Encryption");
3
-
4
- //# sourceMappingURL=abstractions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["createAbstraction","Encryption"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\nexport interface IEncryption {\n encrypt(value: string): Promise<string>;\n decrypt(value: string): Promise<string>;\n}\n\nexport const Encryption = createAbstraction<IEncryption>(\"Encryption\");\n\nexport namespace Encryption {\n export type Interface = IEncryption;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAOvD,OAAO,MAAMC,UAAU,GAAGD,iBAAiB,CAAc,YAAY,CAAC","ignoreList":[]}
@@ -1,9 +0,0 @@
1
- import { Encryption } from "../../domain/Encryption/abstractions.js";
2
- declare class PasswordEncryptionImpl implements Encryption.Interface {
3
- encrypt(value: string): Promise<string>;
4
- decrypt(value: string): Promise<string>;
5
- }
6
- export declare const PasswordEncryption: typeof PasswordEncryptionImpl & {
7
- __abstraction: import("@webiny/di").Abstraction<import("~/domain/Encryption/abstractions.js").IEncryption>;
8
- };
9
- export {};
@@ -1,23 +0,0 @@
1
- import { Encryption } from "../../domain/Encryption/abstractions.js";
2
- import { decrypt, encrypt } from "./utils/password.js";
3
- import { getSecret } from "./utils/secret.js";
4
- class PasswordEncryptionImpl {
5
- async encrypt(value) {
6
- return encrypt({
7
- value,
8
- secret: getSecret()
9
- });
10
- }
11
- async decrypt(value) {
12
- return decrypt({
13
- value,
14
- secret: getSecret()
15
- });
16
- }
17
- }
18
- export const PasswordEncryption = Encryption.createImplementation({
19
- implementation: PasswordEncryptionImpl,
20
- dependencies: []
21
- });
22
-
23
- //# sourceMappingURL=PasswordEncryption.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["Encryption","decrypt","encrypt","getSecret","PasswordEncryptionImpl","value","secret","PasswordEncryption","createImplementation","implementation","dependencies"],"sources":["PasswordEncryption.ts"],"sourcesContent":["import { Encryption } from \"~/domain/Encryption/abstractions.js\";\nimport { decrypt, encrypt } from \"./utils/password.js\";\nimport { getSecret } from \"./utils/secret.js\";\n\nclass PasswordEncryptionImpl implements Encryption.Interface {\n public async encrypt(value: string): Promise<string> {\n return encrypt({ value, secret: getSecret() });\n }\n\n public async decrypt(value: string): Promise<string> {\n return decrypt({ value, secret: getSecret() });\n }\n}\n\nexport const PasswordEncryption = Encryption.createImplementation({\n implementation: PasswordEncryptionImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,UAAU;AACnB,SAASC,OAAO,EAAEC,OAAO;AACzB,SAASC,SAAS;AAElB,MAAMC,sBAAsB,CAAiC;EACzD,MAAaF,OAAOA,CAACG,KAAa,EAAmB;IACjD,OAAOH,OAAO,CAAC;MAAEG,KAAK;MAAEC,MAAM,EAAEH,SAAS,CAAC;IAAE,CAAC,CAAC;EAClD;EAEA,MAAaF,OAAOA,CAACI,KAAa,EAAmB;IACjD,OAAOJ,OAAO,CAAC;MAAEI,KAAK;MAAEC,MAAM,EAAEH,SAAS,CAAC;IAAE,CAAC,CAAC;EAClD;AACJ;AAEA,OAAO,MAAMI,kBAAkB,GAAGP,UAAU,CAACQ,oBAAoB,CAAC;EAC9DC,cAAc,EAAEL,sBAAsB;EACtCM,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -1,10 +0,0 @@
1
- import { createFeature } from "@webiny/feature/api";
2
- import { PasswordEncryption } from "./PasswordEncryption.js";
3
- export const EncryptionFeature = createFeature({
4
- name: "Mailer/Encryption",
5
- register(container) {
6
- container.register(PasswordEncryption).inSingletonScope();
7
- }
8
- });
9
-
10
- //# sourceMappingURL=feature.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["createFeature","PasswordEncryption","EncryptionFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { PasswordEncryption } from \"./PasswordEncryption.js\";\n\nexport const EncryptionFeature = createFeature({\n name: \"Mailer/Encryption\",\n register(container) {\n container.register(PasswordEncryption).inSingletonScope();\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,kBAAkB;AAE3B,OAAO,MAAMC,iBAAiB,GAAGF,aAAa,CAAC;EAC3CG,IAAI,EAAE,mBAAmB;EACzBC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACH,kBAAkB,CAAC,CAACK,gBAAgB,CAAC,CAAC;EAC7D;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1,7 +0,0 @@
1
- interface Params {
2
- value?: string | null;
3
- secret?: string | null;
4
- }
5
- export declare const decrypt: (params: Params) => string;
6
- export declare const encrypt: (params: Params) => string;
7
- export {};
@@ -1,56 +0,0 @@
1
- import crypto from "node:crypto";
2
- import WebinyError from "@webiny/error";
3
- const ALGORITHM = "aes-256-gcm";
4
- const IV_LENGTH = 12;
5
- const KEY_LENGTH = 32;
6
- export const decrypt = params => {
7
- const {
8
- value,
9
- secret
10
- } = params;
11
- if (!secret) {
12
- throw new WebinyError(`Cannot call decrypt without passing the secret.`);
13
- }
14
- if (!value) {
15
- return "";
16
- }
17
- try {
18
- const data = Buffer.from(value, "base64");
19
- const iv = data.subarray(0, 12);
20
- const authTag = data.subarray(12, 28);
21
- const encrypted = data.subarray(28);
22
- const key = crypto.scryptSync(secret, "salt", 32);
23
- const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
24
- decipher.setAuthTag(authTag);
25
- const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
26
- return decrypted.toString("utf8");
27
- } catch {
28
- console.log(`Could not decrypt given encrypted password.`);
29
- }
30
- return "";
31
- };
32
- export const encrypt = params => {
33
- const {
34
- value,
35
- secret
36
- } = params;
37
- if (!secret) {
38
- throw new WebinyError(`Cannot call decrypt without passing the secret.`);
39
- }
40
- if (!value) {
41
- return "";
42
- }
43
- try {
44
- const key = crypto.scryptSync(secret, "salt", KEY_LENGTH);
45
- const iv = crypto.randomBytes(IV_LENGTH);
46
- const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
47
- const encrypted = Buffer.concat([cipher.update(value, "utf8"), cipher.final()]);
48
- const authTag = cipher.getAuthTag();
49
- return Buffer.concat([iv, authTag, encrypted]).toString("base64");
50
- } catch {
51
- console.log(`Could not encrypt given password.`);
52
- }
53
- return "";
54
- };
55
-
56
- //# sourceMappingURL=password.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["crypto","WebinyError","ALGORITHM","IV_LENGTH","KEY_LENGTH","decrypt","params","value","secret","data","Buffer","from","iv","subarray","authTag","encrypted","key","scryptSync","decipher","createDecipheriv","setAuthTag","decrypted","concat","update","final","toString","console","log","encrypt","randomBytes","cipher","createCipheriv","getAuthTag"],"sources":["password.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport WebinyError from \"@webiny/error\";\n\nconst ALGORITHM = \"aes-256-gcm\";\nconst IV_LENGTH = 12;\nconst KEY_LENGTH = 32;\n\ninterface Params {\n value?: string | null;\n secret?: string | null;\n}\n\nexport const decrypt = (params: Params): string => {\n const { value, secret } = params;\n if (!secret) {\n throw new WebinyError(`Cannot call decrypt without passing the secret.`);\n }\n if (!value) {\n return \"\";\n }\n try {\n const data = Buffer.from(value, \"base64\");\n\n const iv = data.subarray(0, 12);\n const authTag = data.subarray(12, 28);\n const encrypted = data.subarray(28);\n\n const key = crypto.scryptSync(secret, \"salt\", 32);\n\n const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);\n decipher.setAuthTag(authTag);\n\n const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\n return decrypted.toString(\"utf8\");\n } catch {\n console.log(`Could not decrypt given encrypted password.`);\n }\n return \"\";\n};\n\nexport const encrypt = (params: Params): string => {\n const { value, secret } = params;\n if (!secret) {\n throw new WebinyError(`Cannot call decrypt without passing the secret.`);\n }\n if (!value) {\n return \"\";\n }\n\n try {\n const key = crypto.scryptSync(secret, \"salt\", KEY_LENGTH);\n const iv = crypto.randomBytes(IV_LENGTH);\n const cipher = crypto.createCipheriv(ALGORITHM, key, iv);\n const encrypted = Buffer.concat([cipher.update(value, \"utf8\"), cipher.final()]);\n const authTag = cipher.getAuthTag();\n return Buffer.concat([iv, authTag, encrypted]).toString(\"base64\");\n } catch {\n console.log(`Could not encrypt given password.`);\n }\n return \"\";\n};\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,aAAa;AAChC,OAAOC,WAAW,MAAM,eAAe;AAEvC,MAAMC,SAAS,GAAG,aAAa;AAC/B,MAAMC,SAAS,GAAG,EAAE;AACpB,MAAMC,UAAU,GAAG,EAAE;AAOrB,OAAO,MAAMC,OAAO,GAAIC,MAAc,IAAa;EAC/C,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAChC,IAAI,CAACE,MAAM,EAAE;IACT,MAAM,IAAIP,WAAW,CAAC,iDAAiD,CAAC;EAC5E;EACA,IAAI,CAACM,KAAK,EAAE;IACR,OAAO,EAAE;EACb;EACA,IAAI;IACA,MAAME,IAAI,GAAGC,MAAM,CAACC,IAAI,CAACJ,KAAK,EAAE,QAAQ,CAAC;IAEzC,MAAMK,EAAE,GAAGH,IAAI,CAACI,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/B,MAAMC,OAAO,GAAGL,IAAI,CAACI,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IACrC,MAAME,SAAS,GAAGN,IAAI,CAACI,QAAQ,CAAC,EAAE,CAAC;IAEnC,MAAMG,GAAG,GAAGhB,MAAM,CAACiB,UAAU,CAACT,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAEjD,MAAMU,QAAQ,GAAGlB,MAAM,CAACmB,gBAAgB,CAACjB,SAAS,EAAEc,GAAG,EAAEJ,EAAE,CAAC;IAC5DM,QAAQ,CAACE,UAAU,CAACN,OAAO,CAAC;IAE5B,MAAMO,SAAS,GAAGX,MAAM,CAACY,MAAM,CAAC,CAACJ,QAAQ,CAACK,MAAM,CAACR,SAAS,CAAC,EAAEG,QAAQ,CAACM,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/E,OAAOH,SAAS,CAACI,QAAQ,CAAC,MAAM,CAAC;EACrC,CAAC,CAAC,MAAM;IACJC,OAAO,CAACC,GAAG,CAAC,6CAA6C,CAAC;EAC9D;EACA,OAAO,EAAE;AACb,CAAC;AAED,OAAO,MAAMC,OAAO,GAAItB,MAAc,IAAa;EAC/C,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAChC,IAAI,CAACE,MAAM,EAAE;IACT,MAAM,IAAIP,WAAW,CAAC,iDAAiD,CAAC;EAC5E;EACA,IAAI,CAACM,KAAK,EAAE;IACR,OAAO,EAAE;EACb;EAEA,IAAI;IACA,MAAMS,GAAG,GAAGhB,MAAM,CAACiB,UAAU,CAACT,MAAM,EAAE,MAAM,EAAEJ,UAAU,CAAC;IACzD,MAAMQ,EAAE,GAAGZ,MAAM,CAAC6B,WAAW,CAAC1B,SAAS,CAAC;IACxC,MAAM2B,MAAM,GAAG9B,MAAM,CAAC+B,cAAc,CAAC7B,SAAS,EAAEc,GAAG,EAAEJ,EAAE,CAAC;IACxD,MAAMG,SAAS,GAAGL,MAAM,CAACY,MAAM,CAAC,CAACQ,MAAM,CAACP,MAAM,CAAChB,KAAK,EAAE,MAAM,CAAC,EAAEuB,MAAM,CAACN,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAMV,OAAO,GAAGgB,MAAM,CAACE,UAAU,CAAC,CAAC;IACnC,OAAOtB,MAAM,CAACY,MAAM,CAAC,CAACV,EAAE,EAAEE,OAAO,EAAEC,SAAS,CAAC,CAAC,CAACU,QAAQ,CAAC,QAAQ,CAAC;EACrE,CAAC,CAAC,MAAM;IACJC,OAAO,CAACC,GAAG,CAAC,mCAAmC,CAAC;EACpD;EACA,OAAO,EAAE;AACb,CAAC","ignoreList":[]}
@@ -1 +0,0 @@
1
- export declare const getSecret: () => string;
@@ -1,11 +0,0 @@
1
- import WebinyError from "@webiny/error";
2
- export const getSecret = () => {
3
- const envValue = process.env.WEBINY_API_MAILER_PASSWORD_SECRET;
4
- const value = String(envValue).trim();
5
- if (!envValue || !value) {
6
- throw new WebinyError(`There must be a password secret defined!`, "PASSWORD_SECRET_ERROR");
7
- }
8
- return value;
9
- };
10
-
11
- //# sourceMappingURL=secret.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["WebinyError","getSecret","envValue","process","env","WEBINY_API_MAILER_PASSWORD_SECRET","value","String","trim"],"sources":["secret.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\n\nexport const getSecret = (): string => {\n const envValue = process.env.WEBINY_API_MAILER_PASSWORD_SECRET;\n\n const value = String(envValue).trim();\n if (!envValue || !value) {\n throw new WebinyError(`There must be a password secret defined!`, \"PASSWORD_SECRET_ERROR\");\n }\n return value;\n};\n"],"mappings":"AAAA,OAAOA,WAAW,MAAM,eAAe;AAEvC,OAAO,MAAMC,SAAS,GAAGA,CAAA,KAAc;EACnC,MAAMC,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAACC,iCAAiC;EAE9D,MAAMC,KAAK,GAAGC,MAAM,CAACL,QAAQ,CAAC,CAACM,IAAI,CAAC,CAAC;EACrC,IAAI,CAACN,QAAQ,IAAI,CAACI,KAAK,EAAE;IACrB,MAAM,IAAIN,WAAW,CAAC,0CAA0C,EAAE,uBAAuB,CAAC;EAC9F;EACA,OAAOM,KAAK;AAChB,CAAC","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import type { TransportSettings } from "../../types.js";
2
- export declare const getDefaultSettingsFromEnv: () => TransportSettings | null;
@@ -1,31 +0,0 @@
1
- const getPort = value => {
2
- const port = Number(value);
3
- if (!!value && isNaN(port) === false) {
4
- return port;
5
- }
6
- return 25;
7
- };
8
- export const getDefaultSettingsFromEnv = () => {
9
- const input = {
10
- host: process.env.WEBINY_API_MAILER_HOST,
11
- port: getPort(process.env.WEBINY_API_MAILER_PORT),
12
- user: process.env.WEBINY_API_MAILER_USER,
13
- password: process.env.WEBINY_API_MAILER_PASSWORD,
14
- replyTo: process.env.WEBINY_API_MAILER_REPLY_TO,
15
- from: process.env.WEBINY_API_MAILER_FROM
16
- };
17
-
18
- // No need to do the validation if there is not at least one variable defined
19
- const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());
20
- if (!hasAtLeastOneValue) {
21
- return null;
22
- }
23
-
24
- // Basic validation - require essential fields
25
- if (!input.host || !input.user || !input.from) {
26
- return null;
27
- }
28
- return input;
29
- };
30
-
31
- //# sourceMappingURL=TransportFactory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["getPort","value","port","Number","isNaN","getDefaultSettingsFromEnv","input","host","process","env","WEBINY_API_MAILER_HOST","WEBINY_API_MAILER_PORT","user","WEBINY_API_MAILER_USER","password","WEBINY_API_MAILER_PASSWORD","replyTo","WEBINY_API_MAILER_REPLY_TO","from","WEBINY_API_MAILER_FROM","hasAtLeastOneValue","Object","values","some","String","trim"],"sources":["TransportFactory.ts"],"sourcesContent":["import type { TransportSettings } from \"~/types.js\";\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\nexport const getDefaultSettingsFromEnv = (): TransportSettings | null => {\n const input: Partial<TransportSettings> = {\n host: process.env.WEBINY_API_MAILER_HOST,\n port: getPort(process.env.WEBINY_API_MAILER_PORT),\n user: process.env.WEBINY_API_MAILER_USER,\n password: process.env.WEBINY_API_MAILER_PASSWORD,\n replyTo: process.env.WEBINY_API_MAILER_REPLY_TO,\n from: process.env.WEBINY_API_MAILER_FROM\n };\n\n // No need to do the validation if there is not at least one variable defined\n const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());\n if (!hasAtLeastOneValue) {\n return null;\n }\n\n // Basic validation - require essential fields\n if (!input.host || !input.user || !input.from) {\n return null;\n }\n\n return input as TransportSettings;\n};\n"],"mappings":"AAEA,MAAMA,OAAO,GAAIC,KAAU,IAAa;EACpC,MAAMC,IAAI,GAAGC,MAAM,CAACF,KAAK,CAAC;EAC1B,IAAI,CAAC,CAACA,KAAK,IAAIG,KAAK,CAACF,IAAI,CAAC,KAAK,KAAK,EAAE;IAClC,OAAOA,IAAI;EACf;EACA,OAAO,EAAE;AACb,CAAC;AAED,OAAO,MAAMG,yBAAyB,GAAGA,CAAA,KAAgC;EACrE,MAAMC,KAAiC,GAAG;IACtCC,IAAI,EAAEC,OAAO,CAACC,GAAG,CAACC,sBAAsB;IACxCR,IAAI,EAAEF,OAAO,CAACQ,OAAO,CAACC,GAAG,CAACE,sBAAsB,CAAC;IACjDC,IAAI,EAAEJ,OAAO,CAACC,GAAG,CAACI,sBAAsB;IACxCC,QAAQ,EAAEN,OAAO,CAACC,GAAG,CAACM,0BAA0B;IAChDC,OAAO,EAAER,OAAO,CAACC,GAAG,CAACQ,0BAA0B;IAC/CC,IAAI,EAAEV,OAAO,CAACC,GAAG,CAACU;EACtB,CAAC;;EAED;EACA,MAAMC,kBAAkB,GAAGC,MAAM,CAACC,MAAM,CAAChB,KAAK,CAAC,CAACiB,IAAI,CAACtB,KAAK,IAAI,CAAC,CAACuB,MAAM,CAACvB,KAAK,CAAC,CAACwB,IAAI,CAAC,CAAC,CAAC;EACrF,IAAI,CAACL,kBAAkB,EAAE;IACrB,OAAO,IAAI;EACf;;EAEA;EACA,IAAI,CAACd,KAAK,CAACC,IAAI,IAAI,CAACD,KAAK,CAACM,IAAI,IAAI,CAACN,KAAK,CAACY,IAAI,EAAE;IAC3C,OAAO,IAAI;EACf;EAEA,OAAOZ,KAAK;AAChB,CAAC","ignoreList":[]}