@webiny/api-mailer 0.0.0-unstable.1e66d121db
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +14 -0
- package/context.d.ts +3 -0
- package/context.js +24 -0
- package/context.js.map +1 -0
- package/crud/group.d.ts +2 -0
- package/crud/group.js +20 -0
- package/crud/group.js.map +1 -0
- package/crud/mailer/onBeforeSend.d.ts +7 -0
- package/crud/mailer/onBeforeSend.js +69 -0
- package/crud/mailer/onBeforeSend.js.map +1 -0
- package/crud/mailer.crud.d.ts +2 -0
- package/crud/mailer.crud.js +123 -0
- package/crud/mailer.crud.js.map +1 -0
- package/crud/settings/hooks.d.ts +5 -0
- package/crud/settings/hooks.js +55 -0
- package/crud/settings/hooks.js.map +1 -0
- package/crud/settings/model.d.ts +3 -0
- package/crud/settings/model.js +72 -0
- package/crud/settings/model.js.map +1 -0
- package/crud/settings/password.d.ts +7 -0
- package/crud/settings/password.js +71 -0
- package/crud/settings/password.js.map +1 -0
- package/crud/settings/secret.d.ts +1 -0
- package/crud/settings/secret.js +23 -0
- package/crud/settings/secret.js.map +1 -0
- package/crud/settings/transform.d.ts +13 -0
- package/crud/settings/transform.js +56 -0
- package/crud/settings/transform.js.map +1 -0
- package/crud/settings/validation.d.ts +4 -0
- package/crud/settings/validation.js +37 -0
- package/crud/settings/validation.js.map +1 -0
- package/crud/settings.crud.d.ts +5 -0
- package/crud/settings.crud.js +321 -0
- package/crud/settings.crud.js.map +1 -0
- package/crud/transport/onTransportBeforeSend.d.ts +7 -0
- package/crud/transport/onTransportBeforeSend.js +69 -0
- package/crud/transport/onTransportBeforeSend.js.map +1 -0
- package/crud/transporter.crud.d.ts +2 -0
- package/crud/transporter.crud.js +182 -0
- package/crud/transporter.crud.js.map +1 -0
- package/graphql/index.d.ts +1 -0
- package/graphql/index.js +14 -0
- package/graphql/index.js.map +1 -0
- package/graphql/settings.d.ts +3 -0
- package/graphql/settings.js +107 -0
- package/graphql/settings.js.map +1 -0
- package/index.d.ts +7 -0
- package/index.js +65 -0
- package/index.js.map +1 -0
- package/mailers/createDummyMailer.d.ts +5 -0
- package/mailers/createDummyMailer.js +24 -0
- package/mailers/createDummyMailer.js.map +1 -0
- package/mailers/createSmtpMailer.d.ts +13 -0
- package/mailers/createSmtpMailer.js +106 -0
- package/mailers/createSmtpMailer.js.map +1 -0
- package/package.json +65 -0
- package/plugins/CreateTransportPlugin.d.ts +17 -0
- package/plugins/CreateTransportPlugin.js +34 -0
- package/plugins/CreateTransportPlugin.js.map +1 -0
- package/plugins/index.d.ts +1 -0
- package/plugins/index.js +18 -0
- package/plugins/index.js.map +1 -0
- package/transports/createDummyTransport.d.ts +5 -0
- package/transports/createDummyTransport.js +25 -0
- package/transports/createDummyTransport.js.map +1 -0
- package/transports/createSmtpTransport.d.ts +12 -0
- package/transports/createSmtpTransport.js +80 -0
- package/transports/createSmtpTransport.js.map +1 -0
- package/types.d.ts +148 -0
- package/types.js +5 -0
- package/types.js.map +1 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.createTransporterCrud = void 0;
|
|
9
|
+
|
|
10
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
|
+
|
|
12
|
+
var _pubsub = require("@webiny/pubsub");
|
|
13
|
+
|
|
14
|
+
var _onTransportBeforeSend = require("./transport/onTransportBeforeSend");
|
|
15
|
+
|
|
16
|
+
var _plugins = require("../plugins");
|
|
17
|
+
|
|
18
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
19
|
+
|
|
20
|
+
var _validation = require("./settings/validation");
|
|
21
|
+
|
|
22
|
+
const buildTransporter = async params => {
|
|
23
|
+
const {
|
|
24
|
+
settings,
|
|
25
|
+
context,
|
|
26
|
+
plugins
|
|
27
|
+
} = params;
|
|
28
|
+
|
|
29
|
+
for (const plugin of plugins) {
|
|
30
|
+
try {
|
|
31
|
+
return await plugin.buildMailerTransport({
|
|
32
|
+
settings,
|
|
33
|
+
context
|
|
34
|
+
});
|
|
35
|
+
} catch (ex) {
|
|
36
|
+
console.log(`Could not build mailer with plugin "${plugin.name}".`);
|
|
37
|
+
console.log(ex.message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
throw new _error.default("Could not build mailer via any of the available plugins.", "MAILER_PLUGINS_ERROR");
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const getDefaultSettings = () => {
|
|
45
|
+
const input = {
|
|
46
|
+
host: process.env.WEBINY_MAILER_HOST,
|
|
47
|
+
user: process.env.WEBINY_MAILER_USER,
|
|
48
|
+
password: process.env.WEBINY_MAILER_PASSWORD,
|
|
49
|
+
replyTo: process.env.WEBINY_MAILER_REPLY_TO,
|
|
50
|
+
from: process.env.WEBINY_MAILER_FROM
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* No need to do the validation if there is not at least one variable defined.
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());
|
|
57
|
+
|
|
58
|
+
if (!hasAtLeastOneValue) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
try {
|
|
63
|
+
const result = _validation.createValidation.validate(input);
|
|
64
|
+
|
|
65
|
+
if (!result.error) {
|
|
66
|
+
return result.value;
|
|
67
|
+
}
|
|
68
|
+
} catch (ex) {}
|
|
69
|
+
|
|
70
|
+
return null;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const createTransporterCrud = async context => {
|
|
74
|
+
const transporters = {};
|
|
75
|
+
const defaultSettings = getDefaultSettings();
|
|
76
|
+
/**
|
|
77
|
+
* We need the last possible plugin which is defined.
|
|
78
|
+
* The last plugins are our default ones with the default configurations.
|
|
79
|
+
* If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
const plugins = context.plugins.byType(_plugins.CreateTransportPlugin.type).reverse();
|
|
83
|
+
/**
|
|
84
|
+
* We define possible events to be hooked into.
|
|
85
|
+
*/
|
|
86
|
+
|
|
87
|
+
const onTransportBeforeSend = (0, _pubsub.createTopic)("mailer.onTransportBeforeSend");
|
|
88
|
+
const onTransportAfterSend = (0, _pubsub.createTopic)("mailer.onTransportAfterSend");
|
|
89
|
+
const onTransportError = (0, _pubsub.createTopic)("mailer.onTransportError");
|
|
90
|
+
/**
|
|
91
|
+
* We attach our default ones.
|
|
92
|
+
*/
|
|
93
|
+
|
|
94
|
+
(0, _onTransportBeforeSend.attachOnTransportBeforeSend)({
|
|
95
|
+
onTransportBeforeSend
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const getTransport = async () => {
|
|
99
|
+
const tenant = context.tenancy.getCurrentTenant().id;
|
|
100
|
+
|
|
101
|
+
if (transporters[tenant]) {
|
|
102
|
+
return transporters[tenant];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
let settings = null;
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
settings = await context.mailer.getSettings();
|
|
109
|
+
} catch (ex) {
|
|
110
|
+
if (ex.code !== "PASSWORD_SECRET_ERROR") {
|
|
111
|
+
console.log(ex.message);
|
|
112
|
+
console.log(ex.code);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (!settings && !defaultSettings) {
|
|
117
|
+
console.log(`There are no Mailer transport settings for tenant "${tenant}".`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const transporter = await buildTransporter({
|
|
121
|
+
settings: settings || defaultSettings,
|
|
122
|
+
plugins,
|
|
123
|
+
context
|
|
124
|
+
});
|
|
125
|
+
transporters[tenant] = transporter;
|
|
126
|
+
return transporter;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
onTransportBeforeSend,
|
|
131
|
+
onTransportAfterSend,
|
|
132
|
+
onTransportError,
|
|
133
|
+
getTransport,
|
|
134
|
+
sendMail: async data => {
|
|
135
|
+
const transport = await getTransport();
|
|
136
|
+
|
|
137
|
+
if (!transport) {
|
|
138
|
+
return {
|
|
139
|
+
result: null,
|
|
140
|
+
error: {
|
|
141
|
+
message: "There is no transport available.",
|
|
142
|
+
code: "NO_TRANSPORT_DEFINED"
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
await onTransportBeforeSend.publish({
|
|
149
|
+
data,
|
|
150
|
+
transport
|
|
151
|
+
});
|
|
152
|
+
const response = await transport.send(data);
|
|
153
|
+
await onTransportAfterSend.publish({
|
|
154
|
+
data,
|
|
155
|
+
transport
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
result: response.result,
|
|
159
|
+
error: response.error
|
|
160
|
+
};
|
|
161
|
+
} catch (ex) {
|
|
162
|
+
await onTransportError.publish({
|
|
163
|
+
error: ex,
|
|
164
|
+
data,
|
|
165
|
+
transport
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
result: null,
|
|
169
|
+
error: {
|
|
170
|
+
message: ex.message,
|
|
171
|
+
code: ex.code,
|
|
172
|
+
data: (0, _objectSpread2.default)({
|
|
173
|
+
data
|
|
174
|
+
}, ex.data)
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
exports.createTransporterCrud = createTransporterCrud;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["buildTransporter","params","settings","context","plugins","plugin","buildMailerTransport","ex","console","log","name","message","WebinyError","getDefaultSettings","input","host","process","env","WEBINY_MAILER_HOST","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","replyTo","WEBINY_MAILER_REPLY_TO","from","WEBINY_MAILER_FROM","hasAtLeastOneValue","Object","values","some","value","String","trim","result","createValidation","validate","error","createTransporterCrud","transporters","defaultSettings","byType","CreateTransportPlugin","type","reverse","onTransportBeforeSend","createTopic","onTransportAfterSend","onTransportError","attachOnTransportBeforeSend","getTransport","tenant","tenancy","getCurrentTenant","id","mailer","getSettings","code","transporter","sendMail","data","transport","publish","response","send"],"sources":["transporter.crud.ts"],"sourcesContent":["import {\n MailerContext,\n Transport,\n OnTransportAfterSendParams,\n OnTransportBeforeSendParams,\n OnTransportErrorParams,\n TransportSettings,\n MailerTransporterContext\n} from \"~/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { attachOnTransportBeforeSend } from \"~/crud/transport/onTransportBeforeSend\";\nimport { CreateTransportPlugin } from \"~/plugins\";\nimport WebinyError from \"@webiny/error\";\n\nimport { createValidation } from \"./settings/validation\";\n\ninterface BuildMailerParams {\n plugins: CreateTransportPlugin[];\n settings: TransportSettings | null;\n context: MailerContext;\n}\n\nconst buildTransporter = async (params: BuildMailerParams): Promise<Transport> => {\n const { settings, context, plugins } = params;\n\n for (const plugin of plugins) {\n try {\n return await plugin.buildMailerTransport({\n settings,\n context\n });\n } catch (ex) {\n console.log(`Could not build mailer with plugin \"${plugin.name}\".`);\n console.log(ex.message);\n }\n }\n throw new WebinyError(\n \"Could not build mailer via any of the available plugins.\",\n \"MAILER_PLUGINS_ERROR\"\n );\n};\n\nconst getDefaultSettings = (): TransportSettings | null => {\n const input: Partial<TransportSettings> = {\n host: process.env.WEBINY_MAILER_HOST,\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD,\n replyTo: process.env.WEBINY_MAILER_REPLY_TO,\n from: process.env.WEBINY_MAILER_FROM\n };\n /**\n * No need to do the validation if there is not at least one variable defined.\n */\n const hasAtLeastOneValue = Object.values(input).some(value => !!String(value).trim());\n if (!hasAtLeastOneValue) {\n return null;\n }\n\n try {\n const result = createValidation.validate(input);\n\n if (!result.error) {\n return result.value;\n }\n } catch (ex) {}\n\n return null;\n};\n\nexport const createTransporterCrud = async (\n context: MailerContext\n): Promise<MailerTransporterContext> => {\n const transporters: Record<string, Transport> = {};\n\n const defaultSettings: TransportSettings | null = getDefaultSettings();\n /**\n * We need the last possible plugin which is defined.\n * The last plugins are our default ones with the default configurations.\n * If users wants to override them, they just need to add new plugin with their own configuration and it will be constructed first.\n */\n const plugins = context.plugins\n .byType<CreateTransportPlugin>(CreateTransportPlugin.type)\n .reverse();\n\n /**\n * We define possible events to be hooked into.\n */\n const onTransportBeforeSend = createTopic<OnTransportBeforeSendParams>(\n \"mailer.onTransportBeforeSend\"\n );\n const onTransportAfterSend = createTopic<OnTransportAfterSendParams>(\n \"mailer.onTransportAfterSend\"\n );\n const onTransportError = createTopic<OnTransportErrorParams>(\"mailer.onTransportError\");\n /**\n * We attach our default ones.\n */\n attachOnTransportBeforeSend({\n onTransportBeforeSend\n });\n\n const getTransport = async (): Promise<Transport | null> => {\n const tenant = context.tenancy.getCurrentTenant().id;\n\n if (transporters[tenant]) {\n return transporters[tenant];\n }\n\n let settings: TransportSettings | null = null;\n try {\n settings = await context.mailer.getSettings();\n } catch (ex) {\n if (ex.code !== \"PASSWORD_SECRET_ERROR\") {\n console.log(ex.message);\n console.log(ex.code);\n }\n }\n if (!settings && !defaultSettings) {\n console.log(`There are no Mailer transport settings for tenant \"${tenant}\".`);\n }\n const transporter = await buildTransporter({\n settings: settings || defaultSettings,\n plugins,\n context\n });\n\n transporters[tenant] = transporter;\n\n return transporter;\n };\n\n return {\n onTransportBeforeSend,\n onTransportAfterSend,\n onTransportError,\n getTransport,\n sendMail: async data => {\n const transport = await getTransport();\n if (!transport) {\n return {\n result: null,\n error: {\n message: \"There is no transport available.\",\n code: \"NO_TRANSPORT_DEFINED\"\n }\n };\n }\n try {\n await onTransportBeforeSend.publish({\n data,\n transport\n });\n const response = await transport.send(data);\n await onTransportAfterSend.publish({\n data,\n transport\n });\n\n return {\n result: response.result,\n error: response.error\n };\n } catch (ex) {\n await onTransportError.publish({\n error: ex,\n data,\n transport\n });\n return {\n result: null,\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n data,\n ...ex.data\n }\n }\n };\n }\n }\n };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createGraphQL: () => import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("../types").MailerContext>[];
|
package/graphql/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createGraphQL = void 0;
|
|
7
|
+
|
|
8
|
+
var _settings = require("./settings");
|
|
9
|
+
|
|
10
|
+
const createGraphQL = () => {
|
|
11
|
+
return [(0, _settings.createSettingsGraphQL)()];
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.createGraphQL = createGraphQL;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createGraphQL","createSettingsGraphQL"],"sources":["index.ts"],"sourcesContent":["import { createSettingsGraphQL } from \"~/graphql/settings\";\n\nexport const createGraphQL = () => {\n return [createSettingsGraphQL()];\n};\n"],"mappings":";;;;;;;AAAA;;AAEO,MAAMA,aAAa,GAAG,MAAM;EAC/B,OAAO,CAAC,IAAAC,+BAAA,GAAD,CAAP;AACH,CAFM"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createSettingsGraphQL = void 0;
|
|
7
|
+
|
|
8
|
+
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
9
|
+
|
|
10
|
+
const emptyResolver = () => ({});
|
|
11
|
+
|
|
12
|
+
const createSettingsGraphQL = () => {
|
|
13
|
+
return new _handlerGraphql.GraphQLSchemaPlugin({
|
|
14
|
+
typeDefs: `
|
|
15
|
+
type MailerTransportSettingsError {
|
|
16
|
+
message: String!
|
|
17
|
+
code: String
|
|
18
|
+
data: JSON
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
type MailerTransportSettings {
|
|
22
|
+
host: String
|
|
23
|
+
user: String
|
|
24
|
+
from: String
|
|
25
|
+
replyTo: String
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type MailerSettingsResponse {
|
|
29
|
+
data: MailerTransportSettings
|
|
30
|
+
error: MailerTransportSettingsError
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type MailerQuery {
|
|
34
|
+
getSettings: MailerSettingsResponse!
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
input TransportSettingsInput {
|
|
38
|
+
host: String!
|
|
39
|
+
user: String!
|
|
40
|
+
password: String
|
|
41
|
+
from: String!
|
|
42
|
+
replyTo: String
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
type MailerMutation {
|
|
46
|
+
saveSettings(data: TransportSettingsInput!): MailerSettingsResponse!
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
extend type Query {
|
|
50
|
+
mailer: MailerQuery
|
|
51
|
+
}
|
|
52
|
+
extend type Mutation {
|
|
53
|
+
mailer: MailerMutation
|
|
54
|
+
}
|
|
55
|
+
`,
|
|
56
|
+
resolvers: {
|
|
57
|
+
Query: {
|
|
58
|
+
mailer: emptyResolver
|
|
59
|
+
},
|
|
60
|
+
MailerQuery: {
|
|
61
|
+
getSettings: async (_, __, context) => {
|
|
62
|
+
try {
|
|
63
|
+
const settings = await context.mailer.getSettings();
|
|
64
|
+
/**
|
|
65
|
+
* We want to remove the password from the response
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
if (settings) {
|
|
69
|
+
// @ts-ignore
|
|
70
|
+
delete settings.password;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return new _handlerGraphql.Response(settings);
|
|
74
|
+
} catch (ex) {
|
|
75
|
+
return new _handlerGraphql.ErrorResponse(ex);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
Mutation: {
|
|
80
|
+
mailer: emptyResolver
|
|
81
|
+
},
|
|
82
|
+
MailerMutation: {
|
|
83
|
+
saveSettings: async (_, args, context) => {
|
|
84
|
+
try {
|
|
85
|
+
const settings = await context.mailer.saveSettings({
|
|
86
|
+
input: args.data
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* We want to remove the password from the response
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
if (settings) {
|
|
93
|
+
// @ts-ignore
|
|
94
|
+
delete settings.password;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return new _handlerGraphql.Response(settings);
|
|
98
|
+
} catch (ex) {
|
|
99
|
+
return new _handlerGraphql.ErrorResponse(ex);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
exports.createSettingsGraphQL = createSettingsGraphQL;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["emptyResolver","createSettingsGraphQL","GraphQLSchemaPlugin","typeDefs","resolvers","Query","mailer","MailerQuery","getSettings","_","__","context","settings","password","Response","ex","ErrorResponse","Mutation","MailerMutation","saveSettings","args","input","data"],"sources":["settings.ts"],"sourcesContent":["import { ErrorResponse, GraphQLSchemaPlugin, Response } from \"@webiny/handler-graphql\";\nimport { MailerContext } from \"~/types\";\n\nconst emptyResolver = () => ({});\n\nexport const createSettingsGraphQL = () => {\n return new GraphQLSchemaPlugin<MailerContext>({\n typeDefs: `\n type MailerTransportSettingsError {\n message: String!\n code: String\n data: JSON\n }\n \n type MailerTransportSettings {\n host: String\n user: String\n from: String\n replyTo: String\n }\n \n type MailerSettingsResponse {\n data: MailerTransportSettings\n error: MailerTransportSettingsError\n }\n \n type MailerQuery {\n getSettings: MailerSettingsResponse!\n }\n \n input TransportSettingsInput {\n host: String!\n user: String!\n password: String\n from: String!\n replyTo: String\n }\n \n type MailerMutation {\n saveSettings(data: TransportSettingsInput!): MailerSettingsResponse!\n }\n \n extend type Query {\n mailer: MailerQuery\n }\n extend type Mutation {\n mailer: MailerMutation\n }\n `,\n resolvers: {\n Query: {\n mailer: emptyResolver\n },\n MailerQuery: {\n getSettings: async (_, __, context) => {\n try {\n const settings = await context.mailer.getSettings();\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n },\n Mutation: {\n mailer: emptyResolver\n },\n MailerMutation: {\n saveSettings: async (_, args: any, context) => {\n try {\n const settings = await context.mailer.saveSettings({\n input: args.data\n });\n /**\n * We want to remove the password from the response\n */\n if (settings) {\n // @ts-ignore\n delete settings.password;\n }\n return new Response(settings);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n }\n }\n }\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAGA,MAAMA,aAAa,GAAG,OAAO,EAAP,CAAtB;;AAEO,MAAMC,qBAAqB,GAAG,MAAM;EACvC,OAAO,IAAIC,mCAAJ,CAAuC;IAC1CC,QAAQ,EAAG;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SA1CkD;IA2C1CC,SAAS,EAAE;MACPC,KAAK,EAAE;QACHC,MAAM,EAAEN;MADL,CADA;MAIPO,WAAW,EAAE;QACTC,WAAW,EAAE,OAAOC,CAAP,EAAUC,EAAV,EAAcC,OAAd,KAA0B;UACnC,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAR,CAAeE,WAAf,EAAvB;YACA;AACxB;AACA;;YACwB,IAAII,QAAJ,EAAc;cACV;cACA,OAAOA,QAAQ,CAACC,QAAhB;YACH;;YACD,OAAO,IAAIC,wBAAJ,CAAaF,QAAb,CAAP;UACH,CAVD,CAUE,OAAOG,EAAP,EAAW;YACT,OAAO,IAAIC,6BAAJ,CAAkBD,EAAlB,CAAP;UACH;QACJ;MAfQ,CAJN;MAqBPE,QAAQ,EAAE;QACNX,MAAM,EAAEN;MADF,CArBH;MAwBPkB,cAAc,EAAE;QACZC,YAAY,EAAE,OAAOV,CAAP,EAAUW,IAAV,EAAqBT,OAArB,KAAiC;UAC3C,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAMD,OAAO,CAACL,MAAR,CAAea,YAAf,CAA4B;cAC/CE,KAAK,EAAED,IAAI,CAACE;YADmC,CAA5B,CAAvB;YAGA;AACxB;AACA;;YACwB,IAAIV,QAAJ,EAAc;cACV;cACA,OAAOA,QAAQ,CAACC,QAAhB;YACH;;YACD,OAAO,IAAIC,wBAAJ,CAAaF,QAAb,CAAP;UACH,CAZD,CAYE,OAAOG,EAAP,EAAW;YACT,OAAO,IAAIC,6BAAJ,CAAkBD,EAAlB,CAAP;UACH;QACJ;MAjBW;IAxBT;EA3C+B,CAAvC,CAAP;AAwFH,CAzFM"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
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 };
|
|
7
|
+
export declare const createMailer: () => PluginCollection;
|
package/index.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "createDummyTransport", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _createDummyTransport.createDummyTransport;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
exports.createMailer = void 0;
|
|
13
|
+
Object.defineProperty(exports, "createSmtpTransport", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () {
|
|
16
|
+
return _createSmtpTransport.createSmtpTransport;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "createTransport", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () {
|
|
22
|
+
return _plugins.createTransport;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
var _context = require("./context");
|
|
27
|
+
|
|
28
|
+
var _createDummyTransport = require("./transports/createDummyTransport");
|
|
29
|
+
|
|
30
|
+
var _createSmtpTransport = require("./transports/createSmtpTransport");
|
|
31
|
+
|
|
32
|
+
var _plugins = require("./plugins");
|
|
33
|
+
|
|
34
|
+
var _model = require("./crud/settings/model");
|
|
35
|
+
|
|
36
|
+
var _group = require("./crud/group");
|
|
37
|
+
|
|
38
|
+
var _graphql = require("./graphql");
|
|
39
|
+
|
|
40
|
+
const createMailer = () => {
|
|
41
|
+
const group = (0, _group.createGroup)();
|
|
42
|
+
return [group,
|
|
43
|
+
/**
|
|
44
|
+
* Groups and models to use via the CMS
|
|
45
|
+
*/
|
|
46
|
+
(0, _model.createSettingsModel)(group),
|
|
47
|
+
/**
|
|
48
|
+
* If something is wrong with the smtp mailer, we will initialize the dummy one.
|
|
49
|
+
*/
|
|
50
|
+
(0, _plugins.createTransport)(async () => {
|
|
51
|
+
const plugin = await (0, _createDummyTransport.createDummyTransport)();
|
|
52
|
+
plugin.name = "dummy-default";
|
|
53
|
+
return plugin;
|
|
54
|
+
}),
|
|
55
|
+
/**
|
|
56
|
+
* Smtp mailer goes into the plugins after the dummy one because plugins are loaded in reverse.
|
|
57
|
+
*/
|
|
58
|
+
(0, _plugins.createTransport)(async params => {
|
|
59
|
+
const plugin = await (0, _createSmtpTransport.createSmtpTransport)(params.settings);
|
|
60
|
+
plugin.name = "smtp-default";
|
|
61
|
+
return plugin;
|
|
62
|
+
}), (0, _context.createMailerContext)(), (0, _graphql.createGraphQL)()];
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
exports.createMailer = createMailer;
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createMailer","group","createGroup","createSettingsModel","createTransport","plugin","createDummyTransport","name","params","createSmtpTransport","settings","createMailerContext","createGraphQL"],"sources":["index.ts"],"sourcesContent":["import { PluginCollection } from \"@webiny/plugins/types\";\nimport { createMailerContext } from \"~/context\";\nimport { createDummyTransport, DummyTransport } from \"~/transports/createDummyTransport\";\nimport {\n createSmtpTransport,\n SmtpTransport,\n SmtpTransportConfig\n} from \"~/transports/createSmtpTransport\";\nimport { createTransport } from \"~/plugins\";\nimport { createSettingsModel } from \"~/crud/settings/model\";\nimport { createGroup } from \"~/crud/group\";\nimport { createGraphQL } from \"~/graphql\";\n\nexport { createDummyTransport, createSmtpTransport, createTransport };\nexport type { SmtpTransport, SmtpTransportConfig, DummyTransport };\n\nexport const createMailer = (): PluginCollection => {\n const group = createGroup();\n return [\n group,\n /**\n * Groups and models to use via the CMS\n */\n createSettingsModel(group),\n /**\n * If something is wrong with the smtp mailer, we will initialize the dummy one.\n */\n createTransport(async () => {\n const plugin = await createDummyTransport();\n plugin.name = \"dummy-default\";\n return plugin;\n }),\n /**\n * Smtp mailer goes into the plugins after the dummy one because plugins are loaded in reverse.\n */\n createTransport(async params => {\n const plugin = await createSmtpTransport(params.settings);\n plugin.name = \"smtp-default\";\n return plugin;\n }),\n createMailerContext(),\n createGraphQL()\n ];\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA;;AACA;;AACA;;AAKA;;AACA;;AACA;;AACA;;AAKO,MAAMA,YAAY,GAAG,MAAwB;EAChD,MAAMC,KAAK,GAAG,IAAAC,kBAAA,GAAd;EACA,OAAO,CACHD,KADG;EAEH;AACR;AACA;EACQ,IAAAE,0BAAA,EAAoBF,KAApB,CALG;EAMH;AACR;AACA;EACQ,IAAAG,wBAAA,EAAgB,YAAY;IACxB,MAAMC,MAAM,GAAG,MAAM,IAAAC,0CAAA,GAArB;IACAD,MAAM,CAACE,IAAP,GAAc,eAAd;IACA,OAAOF,MAAP;EACH,CAJD,CATG;EAcH;AACR;AACA;EACQ,IAAAD,wBAAA,EAAgB,MAAMI,MAAN,IAAgB;IAC5B,MAAMH,MAAM,GAAG,MAAM,IAAAI,wCAAA,EAAoBD,MAAM,CAACE,QAA3B,CAArB;IACAL,MAAM,CAACE,IAAP,GAAc,cAAd;IACA,OAAOF,MAAP;EACH,CAJD,CAjBG,EAsBH,IAAAM,4BAAA,GAtBG,EAuBH,IAAAC,sBAAA,GAvBG,CAAP;AAyBH,CA3BM"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createDummyMailer = void 0;
|
|
7
|
+
|
|
8
|
+
const createDummyMailer = () => {
|
|
9
|
+
const sent = [];
|
|
10
|
+
return {
|
|
11
|
+
send: async params => {
|
|
12
|
+
sent.push(params);
|
|
13
|
+
return {
|
|
14
|
+
result: true,
|
|
15
|
+
error: null
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
getAllSent: () => {
|
|
19
|
+
return sent;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.createDummyMailer = createDummyMailer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createDummyMailer","sent","send","params","push","result","error","getAllSent"],"sources":["createDummyMailer.ts"],"sourcesContent":["import { Mailer, MailerSendData } from \"~/types\";\n\nexport interface DummyMailer extends Mailer {\n getAllSent: () => MailerSendData[];\n}\nexport const createDummyMailer = (): DummyMailer => {\n const sent: MailerSendData[] = [];\n\n return {\n send: async params => {\n sent.push(params);\n return {\n result: true,\n error: null\n };\n },\n getAllSent: () => {\n return sent;\n }\n };\n};\n"],"mappings":";;;;;;;AAKO,MAAMA,iBAAiB,GAAG,MAAmB;EAChD,MAAMC,IAAsB,GAAG,EAA/B;EAEA,OAAO;IACHC,IAAI,EAAE,MAAMC,MAAN,IAAgB;MAClBF,IAAI,CAACG,IAAL,CAAUD,MAAV;MACA,OAAO;QACHE,MAAM,EAAE,IADL;QAEHC,KAAK,EAAE;MAFJ,CAAP;IAIH,CAPE;IAQHC,UAAU,EAAE,MAAM;MACd,OAAON,IAAP;IACH;EAVE,CAAP;AAYH,CAfM"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nodemailer docs
|
|
3
|
+
* https://nodemailer.com/about/
|
|
4
|
+
*/
|
|
5
|
+
import { Mailer } from "../types";
|
|
6
|
+
import { Transporter } from "nodemailer";
|
|
7
|
+
import SMTPTransport, { Options } from "nodemailer/lib/smtp-transport";
|
|
8
|
+
import { DummyMailer } from "./createDummyMailer";
|
|
9
|
+
export declare type SmtpMailerConfig = Options;
|
|
10
|
+
export interface SmtpMailer extends Mailer {
|
|
11
|
+
transporter: Transporter<SMTPTransport.SentMessageInfo>;
|
|
12
|
+
}
|
|
13
|
+
export declare const createSmtpMailer: (config?: SmtpMailerConfig) => SmtpMailer | DummyMailer;
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.createSmtpMailer = void 0;
|
|
9
|
+
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
12
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
13
|
+
|
|
14
|
+
var _nodemailer = _interopRequireDefault(require("nodemailer"));
|
|
15
|
+
|
|
16
|
+
var _createDummyMailer = require("./createDummyMailer");
|
|
17
|
+
|
|
18
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
19
|
+
|
|
20
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
21
|
+
|
|
22
|
+
const variables = {
|
|
23
|
+
host: process.env.WEBINY_MAILER_HOST,
|
|
24
|
+
user: process.env.WEBINY_MAILER_USER,
|
|
25
|
+
password: process.env.WEBINY_MAILER_PASSWORD
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const createSmtpMailer = config => {
|
|
29
|
+
/**
|
|
30
|
+
* If we have environment variables, use those as config.
|
|
31
|
+
*/
|
|
32
|
+
if (variables.host && variables.user && variables.password) {
|
|
33
|
+
if (config) {
|
|
34
|
+
throw new _error.default({
|
|
35
|
+
message: `Cannot use both config and environment variables to setup the nodemailer.`,
|
|
36
|
+
code: "SMTP_MAILER_INIT_ERROR"
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
config = {
|
|
41
|
+
host: variables.host,
|
|
42
|
+
auth: {
|
|
43
|
+
user: variables.user,
|
|
44
|
+
pass: variables.password
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
} else if (!config) {
|
|
48
|
+
console.log("There is no config or required environment variables defined. Using dummy mailer.");
|
|
49
|
+
return (0, _createDummyMailer.createDummyMailer)();
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const transporter = _nodemailer.default.createTransport(_objectSpread({}, config));
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
transporter,
|
|
56
|
+
send: async params => {
|
|
57
|
+
const {
|
|
58
|
+
replyTo,
|
|
59
|
+
text,
|
|
60
|
+
html,
|
|
61
|
+
to,
|
|
62
|
+
bcc,
|
|
63
|
+
cc,
|
|
64
|
+
from,
|
|
65
|
+
subject
|
|
66
|
+
} = params;
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const result = await transporter.sendMail({
|
|
70
|
+
replyTo,
|
|
71
|
+
bcc,
|
|
72
|
+
cc,
|
|
73
|
+
from,
|
|
74
|
+
text,
|
|
75
|
+
html,
|
|
76
|
+
to,
|
|
77
|
+
subject
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
if (result.messageId) {
|
|
81
|
+
return {
|
|
82
|
+
result: true,
|
|
83
|
+
error: null
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
throw new _error.default({
|
|
88
|
+
message: "nodemailer.sendMail does not have a messageId in the result. Something went wrong...",
|
|
89
|
+
code: "MAILER_ERROR",
|
|
90
|
+
data: _objectSpread({}, result)
|
|
91
|
+
});
|
|
92
|
+
} catch (ex) {
|
|
93
|
+
return {
|
|
94
|
+
result: null,
|
|
95
|
+
error: {
|
|
96
|
+
message: ex.message,
|
|
97
|
+
code: ex.code,
|
|
98
|
+
data: _objectSpread(_objectSpread({}, params), ex.data)
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
exports.createSmtpMailer = createSmtpMailer;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["variables","host","process","env","WEBINY_MAILER_HOST","user","WEBINY_MAILER_USER","password","WEBINY_MAILER_PASSWORD","createSmtpMailer","config","WebinyError","message","code","auth","pass","console","log","createDummyMailer","transporter","nodemailer","createTransport","send","params","replyTo","text","html","to","bcc","cc","from","subject","result","sendMail","messageId","error","data","ex"],"sources":["createSmtpMailer.ts"],"sourcesContent":["/**\n * Nodemailer docs\n * https://nodemailer.com/about/\n */\nimport { Mailer } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport nodemailer, { Transporter } from \"nodemailer\";\nimport SMTPTransport, { Options } from \"nodemailer/lib/smtp-transport\";\nimport { createDummyMailer, DummyMailer } from \"~/mailers/createDummyMailer\";\n\nexport type SmtpMailerConfig = Options;\n\nexport interface SmtpMailer extends Mailer {\n transporter: Transporter<SMTPTransport.SentMessageInfo>;\n}\n\ninterface SmtpMailerEnvironmentVariables {\n host?: string;\n user?: string;\n password?: string;\n}\nconst variables: SmtpMailerEnvironmentVariables = {\n host: process.env.WEBINY_MAILER_HOST,\n user: process.env.WEBINY_MAILER_USER,\n password: process.env.WEBINY_MAILER_PASSWORD\n};\n\nexport const createSmtpMailer = (config?: SmtpMailerConfig): SmtpMailer | DummyMailer => {\n /**\n * If we have environment variables, use those as config.\n */\n if (variables.host && variables.user && variables.password) {\n if (config) {\n throw new WebinyError({\n message: `Cannot use both config and environment variables to setup the nodemailer.`,\n code: \"SMTP_MAILER_INIT_ERROR\"\n });\n }\n config = {\n host: variables.host,\n auth: {\n user: variables.user,\n pass: variables.password\n }\n };\n } else if (!config) {\n console.log(\n \"There is no config or required environment variables defined. Using dummy mailer.\"\n );\n return createDummyMailer();\n }\n const transporter = nodemailer.createTransport({\n ...config\n });\n\n return {\n transporter,\n send: async params => {\n const { replyTo, text, html, to, bcc, cc, from, subject } = params;\n\n try {\n const result = await transporter.sendMail({\n replyTo,\n bcc,\n cc,\n from,\n text,\n html,\n to,\n subject\n });\n if (result.messageId) {\n return {\n result: true,\n error: null\n };\n }\n\n throw new WebinyError({\n message:\n \"nodemailer.sendMail does not have a messageId in the result. Something went wrong...\",\n code: \"MAILER_ERROR\",\n data: {\n ...result\n }\n });\n } catch (ex) {\n return {\n result: null,\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n ...params,\n ...ex.data\n }\n }\n };\n }\n }\n };\n};\n"],"mappings":";;;;;;;;;;;AAKA;;AACA;;AAEA;;;;;;AAaA,MAAMA,SAAyC,GAAG;EAC9CC,IAAI,EAAEC,OAAO,CAACC,GAAR,CAAYC,kBAD4B;EAE9CC,IAAI,EAAEH,OAAO,CAACC,GAAR,CAAYG,kBAF4B;EAG9CC,QAAQ,EAAEL,OAAO,CAACC,GAAR,CAAYK;AAHwB,CAAlD;;AAMO,MAAMC,gBAAgB,GAAIC,MAAD,IAAyD;EACrF;AACJ;AACA;EACI,IAAIV,SAAS,CAACC,IAAV,IAAkBD,SAAS,CAACK,IAA5B,IAAoCL,SAAS,CAACO,QAAlD,EAA4D;IACxD,IAAIG,MAAJ,EAAY;MACR,MAAM,IAAIC,cAAJ,CAAgB;QAClBC,OAAO,EAAG,2EADQ;QAElBC,IAAI,EAAE;MAFY,CAAhB,CAAN;IAIH;;IACDH,MAAM,GAAG;MACLT,IAAI,EAAED,SAAS,CAACC,IADX;MAELa,IAAI,EAAE;QACFT,IAAI,EAAEL,SAAS,CAACK,IADd;QAEFU,IAAI,EAAEf,SAAS,CAACO;MAFd;IAFD,CAAT;EAOH,CAdD,MAcO,IAAI,CAACG,MAAL,EAAa;IAChBM,OAAO,CAACC,GAAR,CACI,mFADJ;IAGA,OAAO,IAAAC,oCAAA,GAAP;EACH;;EACD,MAAMC,WAAW,GAAGC,mBAAA,CAAWC,eAAX,mBACbX,MADa,EAApB;;EAIA,OAAO;IACHS,WADG;IAEHG,IAAI,EAAE,MAAMC,MAAN,IAAgB;MAClB,MAAM;QAAEC,OAAF;QAAWC,IAAX;QAAiBC,IAAjB;QAAuBC,EAAvB;QAA2BC,GAA3B;QAAgCC,EAAhC;QAAoCC,IAApC;QAA0CC;MAA1C,IAAsDR,MAA5D;;MAEA,IAAI;QACA,MAAMS,MAAM,GAAG,MAAMb,WAAW,CAACc,QAAZ,CAAqB;UACtCT,OADsC;UAEtCI,GAFsC;UAGtCC,EAHsC;UAItCC,IAJsC;UAKtCL,IALsC;UAMtCC,IANsC;UAOtCC,EAPsC;UAQtCI;QARsC,CAArB,CAArB;;QAUA,IAAIC,MAAM,CAACE,SAAX,EAAsB;UAClB,OAAO;YACHF,MAAM,EAAE,IADL;YAEHG,KAAK,EAAE;UAFJ,CAAP;QAIH;;QAED,MAAM,IAAIxB,cAAJ,CAAgB;UAClBC,OAAO,EACH,sFAFc;UAGlBC,IAAI,EAAE,cAHY;UAIlBuB,IAAI,oBACGJ,MADH;QAJc,CAAhB,CAAN;MAQH,CA1BD,CA0BE,OAAOK,EAAP,EAAW;QACT,OAAO;UACHL,MAAM,EAAE,IADL;UAEHG,KAAK,EAAE;YACHvB,OAAO,EAAEyB,EAAE,CAACzB,OADT;YAEHC,IAAI,EAAEwB,EAAE,CAACxB,IAFN;YAGHuB,IAAI,kCACGb,MADH,GAEGc,EAAE,CAACD,IAFN;UAHD;QAFJ,CAAP;MAWH;IACJ;EA5CE,CAAP;AA8CH,CA1EM"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/api-mailer",
|
|
3
|
+
"version": "0.0.0-unstable.1e66d121db",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/webiny/webiny-js.git",
|
|
8
|
+
"directory": "packages/api-mailer"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"mailer:base"
|
|
12
|
+
],
|
|
13
|
+
"author": "Webiny Ltd",
|
|
14
|
+
"description": "The API to send e-mails.",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@babel/runtime": "7.19.0",
|
|
18
|
+
"@webiny/api": "0.0.0-unstable.1e66d121db",
|
|
19
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.1e66d121db",
|
|
20
|
+
"@webiny/error": "0.0.0-unstable.1e66d121db",
|
|
21
|
+
"@webiny/handler-graphql": "0.0.0-unstable.1e66d121db",
|
|
22
|
+
"@webiny/plugins": "0.0.0-unstable.1e66d121db",
|
|
23
|
+
"@webiny/pubsub": "0.0.0-unstable.1e66d121db",
|
|
24
|
+
"crypto-js": "4.1.1",
|
|
25
|
+
"joi": "17.6.2",
|
|
26
|
+
"lodash": "4.17.21",
|
|
27
|
+
"nodemailer": "6.8.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@babel/cli": "^7.19.3",
|
|
31
|
+
"@babel/core": "^7.19.3",
|
|
32
|
+
"@babel/preset-env": "^7.19.4",
|
|
33
|
+
"@babel/preset-typescript": "^7.18.6",
|
|
34
|
+
"@types/crypto-js": "^4.1.1",
|
|
35
|
+
"@types/nodemailer": "^6.4.4",
|
|
36
|
+
"@webiny/api-headless-cms-ddb": "^0.0.0-unstable.1e66d121db",
|
|
37
|
+
"@webiny/api-i18n": "^0.0.0-unstable.1e66d121db",
|
|
38
|
+
"@webiny/api-i18n-ddb": "^0.0.0-unstable.1e66d121db",
|
|
39
|
+
"@webiny/api-security": "^0.0.0-unstable.1e66d121db",
|
|
40
|
+
"@webiny/api-security-so-ddb": "^0.0.0-unstable.1e66d121db",
|
|
41
|
+
"@webiny/api-tenancy": "^0.0.0-unstable.1e66d121db",
|
|
42
|
+
"@webiny/api-tenancy-so-ddb": "^0.0.0-unstable.1e66d121db",
|
|
43
|
+
"@webiny/cli": "^0.0.0-unstable.1e66d121db",
|
|
44
|
+
"@webiny/db-dynamodb": "^0.0.0-unstable.1e66d121db",
|
|
45
|
+
"@webiny/handler": "^0.0.0-unstable.1e66d121db",
|
|
46
|
+
"@webiny/handler-aws": "^0.0.0-unstable.1e66d121db",
|
|
47
|
+
"@webiny/handler-db": "^0.0.0-unstable.1e66d121db",
|
|
48
|
+
"@webiny/project-utils": "^0.0.0-unstable.1e66d121db",
|
|
49
|
+
"graphql": "^15.7.2",
|
|
50
|
+
"jest": "^28.1.0",
|
|
51
|
+
"jest-dynalite": "^3.6.1",
|
|
52
|
+
"rimraf": "^3.0.2",
|
|
53
|
+
"ttypescript": "^1.5.12",
|
|
54
|
+
"typescript": "4.7.4"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public",
|
|
58
|
+
"directory": "dist"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "yarn webiny run build",
|
|
62
|
+
"watch": "yarn webiny run watch"
|
|
63
|
+
},
|
|
64
|
+
"gitHead": "b670bf27c5039de1a2b0be764a09ba4cb94ad5e2"
|
|
65
|
+
}
|