@b2y/email-service 1.0.9 → 1.1.0

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/Config.js CHANGED
@@ -1,40 +1,41 @@
1
- // config.js
2
- require('dotenv').config();
3
- const Config = {
4
- // Email Provider Configuration
5
- emailProvider: process.env.EMAIL_PROVIDER,
6
-
7
- // Nodemailer Configuration
8
- emailService: process.env.EMAIL_SERVICE,
9
- emailHost: process.env.EMAIL_HOST,
10
- smtpPort: process.env.SMTP_PORT,
11
- emailUser: process.env.EMAIL_USERNAME,
12
- emailPass: process.env.EMAIL_PASSWORD,
13
-
14
- // SendGrid Configuration
15
- sendGridApiKey: process.env.SENDGRID_API_KEY,
16
-
17
- // Postmark Configuration
18
- postmarkApiKey: process.env.POSTMARK_API_KEY,
19
- postmarkFromEmail: process.env.POSTMARK_FROM_EMAIL,
20
-
21
- // Amazon SES Configuration
22
- awsRegion: process.env.AWS_REGION,
23
- awsAccessKeyId: process.env.AWS_ACCESS_KEY_ID,
24
- awsSecretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
25
- awsFromEmail: process.env.AWS_FROM_EMAIL,
26
-
27
- defaultLanguage: process.env.DEFAULT_LANGUAGE,
28
-
29
- // Database Configuration (if using database for templates)
30
- dbHost: process.env.DB_HOST,
31
- dbPort: process.env.DB_PORT,
32
- dbName: process.env.DB_DATABASE,
33
- dbUser: process.env.DB_USER,
34
- dbPass: process.env.DB_PASSWORD,
35
- dbschema:process.env.DB_SCHEMA,
36
- dbssl:process.env.DBSSL,
37
-
38
- };
39
-
1
+ // config.js
2
+ require('dotenv').config();
3
+ const Config = {
4
+ // Email Provider Configuration
5
+ emailProvider: process.env.EMAIL_PROVIDER,
6
+ fromEmail: process.env.FROM_EMAIL,
7
+ fromName: process.env.FROM_NAME,
8
+
9
+ // Nodemailer Configuration
10
+ emailHost: process.env.EMAIL_HOST,
11
+ smtpPort: process.env.EMAIL_PORT,
12
+ emailUser: process.env.FROM_EMAIL,
13
+ emailPass: process.env.EMAIL_PASSWORD,
14
+
15
+ // SendGrid Configuration
16
+ sendGridApiKey: process.env.ACCESS_KEY,
17
+
18
+ // Postmark Configuration
19
+ postmarkApiKey: process.env.ACCESS_KEY,
20
+ postmarkFromEmail: process.env.FROM_EMAIL,
21
+
22
+ // Amazon SES Configuration
23
+ awsRegion: process.env.REGION,
24
+ awsAccessKeyId: process.env.ACCESS_KEY,
25
+ awsSecretAccessKey: process.env.ACCESS_SECRET,
26
+ awsFromEmail: process.env.FROM_EMAIL,
27
+
28
+ defaultLanguage: process.env.DEFAULT_LANGUAGE,
29
+
30
+ // Database Configuration (if using database for templates)
31
+ dbHost: process.env.DB_HOST,
32
+ dbPort: process.env.DB_PORT,
33
+ dbName: process.env.DB_DATABASE,
34
+ dbUser: process.env.DB_USER,
35
+ dbPass: process.env.DB_PASSWORD,
36
+ dbschema:process.env.DB_SCHEMA,
37
+ dbssl:process.env.DBSSL,
38
+
39
+ };
40
+
40
41
  module.exports = Config;
package/Logger.js CHANGED
@@ -1,6 +1,6 @@
1
- require('dotenv').config();
2
- const { createLogger } = require('b2y-logger');
3
-
4
- const logger = createLogger();
5
-
1
+ require('dotenv').config();
2
+ const { createLogger } = require('b2y-logger');
3
+
4
+ const logger = createLogger();
5
+
6
6
  module.exports = logger;
package/README.md CHANGED
@@ -1,18 +1,18 @@
1
- # email-service
2
-
3
- A reusable, flexible Node.js email service supporting multiple providers like **Nodemailer (Gmail)** and **SendGrid**, with support for **dynamic HTML templates** using Handlebars.
4
-
5
- # Features
6
-
7
- - Common interface for multiple email providers
8
- - Supports Gmail via Nodemailer and SendGrid (easy to extend more)
9
- - Handlebars-based HTML templates with variables
10
- - Easily switch between providers without changing your code
11
- - Dynamic template loading from the filesystem
12
- - Configurable via environment variables or direct parameters
13
-
14
- ---
15
-
16
- # Installation
17
-
18
- npm install @ourgitname/email-service
1
+ # email-service
2
+
3
+ A reusable, flexible Node.js email service supporting multiple providers like **Nodemailer (Gmail)** and **SendGrid**, with support for **dynamic HTML templates** using Handlebars.
4
+
5
+ # Features
6
+
7
+ - Common interface for multiple email providers
8
+ - Supports Gmail via Nodemailer and SendGrid (easy to extend more)
9
+ - Handlebars-based HTML templates with variables
10
+ - Easily switch between providers without changing your code
11
+ - Dynamic template loading from the filesystem
12
+ - Configurable via environment variables or direct parameters
13
+
14
+ ---
15
+
16
+ # Installation
17
+
18
+ npm install @ourgitname/email-service
@@ -1,39 +1,39 @@
1
- const StatusMessage = {
2
- // Database messages
3
- DB_CONNECTION_SUCCESS: 'Database connection has been established successfully.',
4
- DB_CONNECTION_FAILED: 'Unable to connect to the database:',
5
-
6
- // Email provider messages
7
- PROVIDER_NOT_IMPLEMENTED: 'sendEmail method not implemented in BaseProvider',
8
- PROVIDER_DEFAULT_FALLBACK: 'No valid provider specified, defaulting to Nodemailer',
9
-
10
- // Validation messages
11
- RECIPIENTS_REQUIRED: 'Recipients (to) are required',
12
- SUBJECT_REQUIRED: 'Subject is required',
13
- HTML_CONTENT_REQUIRED: 'Email content (html) is required',
14
- TENANT_ID_REQUIRED: 'TenantID is required',
15
- TEMPLATE_OR_HTML_REQUIRED: 'TemplateName or HTML content is required',
16
- LANGCODE_IS_REQUIRED: 'Language code (langCode) is required',
17
-
18
- // Template messages
19
- TEMPLATE_NOT_FOUND: 'Template "${templateName}" not found for tenant ${tenantId}',
20
- TEMPLATE_FETCH_ERROR: 'Error fetching template from DB: ${errorMessage}',
21
- TEMPLATE_COMPILE_ERROR: 'Error compiling template "${templateName}": ${errorMessage}',
22
- PLACEHOLDER_REPLACE_ERROR: 'Error replacing placeholders: ${errorMessage}',
23
-
24
- // Email sending messages
25
- EMAIL_SENT_SUCCESS: 'Email sent successfully for tenant: ${tenantId}',
26
- EMAIL_SEND_FAILED: 'Failed to send email for tenant ${tenantId}: ${errorMessage}',
27
-
28
- // Service initialization messages
29
- PROVIDER_REQUIRED: 'Email provider is required',
30
- DB_CLIENT_REQUIRED: 'Database client is required',
31
- CANNOT_INSTANTIATE_BASE: 'Cannot instantiate BaseProvider directly',
32
-
33
- NODEMAILER_SEND_ERROR:'Nodemailer failed to send email',
34
- POSTMARK_SEND_ERROR:'Postmark failed to send email',
35
- SENDGRID_SEND_ERROR:'SendGrid failed to send email',
36
- AMAZON_SES_SEND_ERROR: 'Amazon SES failed to send email'
37
- };
38
-
1
+ const StatusMessage = {
2
+ // Database messages
3
+ DB_CONNECTION_SUCCESS: 'Database connection has been established successfully.',
4
+ DB_CONNECTION_FAILED: 'Unable to connect to the database:',
5
+
6
+ // Email provider messages
7
+ PROVIDER_NOT_IMPLEMENTED: 'sendEmail method not implemented in BaseProvider',
8
+ PROVIDER_DEFAULT_FALLBACK: 'No valid provider specified, defaulting to Nodemailer',
9
+
10
+ // Validation messages
11
+ RECIPIENTS_REQUIRED: 'Recipients (to) are required',
12
+ SUBJECT_REQUIRED: 'Subject is required',
13
+ HTML_CONTENT_REQUIRED: 'Email content (html) is required',
14
+ TENANT_ID_REQUIRED: 'TenantID is required',
15
+ TEMPLATE_OR_HTML_REQUIRED: 'TemplateName or HTML content is required',
16
+ LANGCODE_IS_REQUIRED: 'Language code (langCode) is required',
17
+
18
+ // Template messages
19
+ TEMPLATE_NOT_FOUND: 'Template "${templateName}" not found for tenant ${tenantId}',
20
+ TEMPLATE_FETCH_ERROR: 'Error fetching template from DB: ${errorMessage}',
21
+ TEMPLATE_COMPILE_ERROR: 'Error compiling template "${templateName}": ${errorMessage}',
22
+ PLACEHOLDER_REPLACE_ERROR: 'Error replacing placeholders: ${errorMessage}',
23
+
24
+ // Email sending messages
25
+ EMAIL_SENT_SUCCESS: 'Email sent successfully for tenant: ${tenantId}',
26
+ EMAIL_SEND_FAILED: 'Failed to send email for tenant ${tenantId}: ${errorMessage}',
27
+
28
+ // Service initialization messages
29
+ PROVIDER_REQUIRED: 'Email provider is required',
30
+ DB_CLIENT_REQUIRED: 'Database client is required',
31
+ CANNOT_INSTANTIATE_BASE: 'Cannot instantiate BaseProvider directly',
32
+
33
+ NODEMAILER_SEND_ERROR:'Nodemailer failed to send email',
34
+ POSTMARK_SEND_ERROR:'Postmark failed to send email',
35
+ SENDGRID_SEND_ERROR:'SendGrid failed to send email',
36
+ AMAZON_SES_SEND_ERROR: 'Amazon SES failed to send email'
37
+ };
38
+
39
39
  module.exports = StatusMessage;
@@ -1,8 +1,8 @@
1
- const EmailProvider = {
2
- NODE_MAILER: 'nodemailer',
3
- SENDGRID: 'sendgrid',
4
- POSTMARK: 'postmark',
5
- AMAZON_SES: 'amazonses'
6
- };
7
-
1
+ const EmailProvider = {
2
+ NODE_MAILER: 'nodemailer',
3
+ SENDGRID: 'sendgrid',
4
+ POSTMARK: 'postmark',
5
+ AMAZON_SES: 'amazonses'
6
+ };
7
+
8
8
  module.exports = { EmailProvider };
package/index.js CHANGED
@@ -1,78 +1,78 @@
1
- const BaseProvider = require('./providers/BaseProvider');
2
- const NodeMailerProvider = require('./providers/NodeMailerProvider');
3
- const SendgridProvider = require('./providers/SendgridProvider');
4
- const PostmarkProvider = require('./providers/PostmarkProvider');
5
- const AmazonSesProvider = require('./providers/AmazonSESProvider');
6
- const TemplateEngine = require('./utils/TemplateEngine');
7
- const EmailService = require('./service/EmailService');
8
- const Config = require('./Config');
9
- const logger = require('./Logger');
10
- const { sequelize, EmailTemplate } = require('./model/Connect');
11
- const { EmailProvider } = require('./enum/EmailProvider');
12
- const StatusMessage = require('./constants/StatusMessageConstants');
13
- // Initialize database connection
14
- async function initializeDatabase() {
15
- try {
16
- await sequelize.authenticate();
17
- logger.info(StatusMessage.DB_CONNECTION_SUCCESS);
18
- return { EmailTemplate };
19
- } catch (error) {
20
- logger.error(StatusMessage.DB_CONNECTION_FAILED, error);
21
- throw error;
22
- }
23
- }
24
-
25
- // Factory function to create email provider
26
- function createEmailProvider() {
27
- const provider = (Config.emailProvider || '').toLowerCase().trim();
28
-
29
- switch (provider) {
30
- case EmailProvider.NODE_MAILER:
31
- return new NodeMailerProvider();
32
- case EmailProvider.SENDGRID:
33
- return new SendgridProvider();
34
- case EmailProvider.POSTMARK:
35
- return new PostmarkProvider();
36
- case EmailProvider.AMAZON_SES:
37
- return new AmazonSesProvider();
38
- default:
39
- logger.warn(StatusMessage.PROVIDER_DEFAULT_FALLBACK);
40
- return new NodeMailerProvider();
41
- }
42
- }
43
-
44
- // Factory function to create email service
45
- async function createEmailService(options = {}) {
46
- try {
47
- const provider = options.provider || createEmailProvider();
48
- const dbClient = options.dbClient || await initializeDatabase();
49
-
50
- return new EmailService(provider, dbClient);
51
- } catch (error) {
52
- logger.error(`Failed to create email service: ${error.message}`);
53
- throw error;
54
- }
55
- }
56
-
57
- // Create a singleton instance
58
- let defaultEmailService;
59
- async function getEmailService() {
60
- if (!defaultEmailService) {
61
- defaultEmailService = await createEmailService();
62
- }
63
- return defaultEmailService;
64
- }
65
-
66
- module.exports = {
67
- BaseProvider,
68
- NodeMailerProvider,
69
- SendgridProvider,
70
- PostmarkProvider,
71
- AmazonSesProvider,
72
- EmailService,
73
- TemplateEngine,
74
- createEmailProvider,
75
- createEmailService,
76
- getEmailService,
77
- Config
1
+ const BaseProvider = require('./providers/BaseProvider');
2
+ const NodeMailerProvider = require('./providers/NodeMailerProvider');
3
+ const SendgridProvider = require('./providers/SendgridProvider');
4
+ const PostmarkProvider = require('./providers/PostmarkProvider');
5
+ const AmazonSesProvider = require('./providers/AmazonSESProvider');
6
+ const TemplateEngine = require('./utils/TemplateEngine');
7
+ const EmailService = require('./service/EmailService');
8
+ const Config = require('./Config');
9
+ const logger = require('./Logger');
10
+ const { sequelize, EmailTemplate } = require('./model/Connect');
11
+ const { EmailProvider } = require('./enum/EmailProvider');
12
+ const StatusMessage = require('./constants/StatusMessageConstants');
13
+ // Initialize database connection
14
+ async function initializeDatabase() {
15
+ try {
16
+ await sequelize.authenticate();
17
+ logger.info(StatusMessage.DB_CONNECTION_SUCCESS);
18
+ return { EmailTemplate };
19
+ } catch (error) {
20
+ logger.error(StatusMessage.DB_CONNECTION_FAILED, error);
21
+ throw error;
22
+ }
23
+ }
24
+
25
+ // Factory function to create email provider
26
+ function createEmailProvider() {
27
+ const provider = (Config.emailProvider || '').toLowerCase().trim();
28
+
29
+ switch (provider) {
30
+ case EmailProvider.NODE_MAILER:
31
+ return new NodeMailerProvider();
32
+ case EmailProvider.SENDGRID:
33
+ return new SendgridProvider();
34
+ case EmailProvider.POSTMARK:
35
+ return new PostmarkProvider();
36
+ case EmailProvider.AMAZON_SES:
37
+ return new AmazonSesProvider();
38
+ default:
39
+ logger.warn(StatusMessage.PROVIDER_DEFAULT_FALLBACK);
40
+ return new NodeMailerProvider();
41
+ }
42
+ }
43
+
44
+ // Factory function to create email service
45
+ async function createEmailService(options = {}) {
46
+ try {
47
+ const provider = options.provider || createEmailProvider();
48
+ const dbClient = options.dbClient || await initializeDatabase();
49
+
50
+ return new EmailService(provider, dbClient);
51
+ } catch (error) {
52
+ logger.error(`Failed to create email service: ${error.message}`);
53
+ throw error;
54
+ }
55
+ }
56
+
57
+ // Create a singleton instance
58
+ let defaultEmailService;
59
+ async function getEmailService() {
60
+ if (!defaultEmailService) {
61
+ defaultEmailService = await createEmailService();
62
+ }
63
+ return defaultEmailService;
64
+ }
65
+
66
+ module.exports = {
67
+ BaseProvider,
68
+ NodeMailerProvider,
69
+ SendgridProvider,
70
+ PostmarkProvider,
71
+ AmazonSesProvider,
72
+ EmailService,
73
+ TemplateEngine,
74
+ createEmailProvider,
75
+ createEmailService,
76
+ getEmailService,
77
+ Config
78
78
  };
package/model/Connect.js CHANGED
@@ -1,24 +1,24 @@
1
- const { Sequelize } = require('sequelize');
2
- const Config = require('../Config');
3
-
4
- const sequelize = new Sequelize({
5
- database: Config.dbName,
6
- username: Config.dbUser,
7
- password: Config.dbPass,
8
- host: Config.dbHost,
9
- port: Config.dbPort,
10
- dialect: 'postgres',
11
- schema: Config.dbschema,
12
- logging: false,
13
- define: {
14
- timestamps: false,
15
- freezeTableName: true
16
- }
17
- });
18
-
19
- const EmailTemplate = require('./EmailTemplate')(sequelize);
20
-
21
- module.exports = {
22
- sequelize,
23
- EmailTemplate
1
+ const { Sequelize } = require('sequelize');
2
+ const Config = require('../Config');
3
+
4
+ const sequelize = new Sequelize({
5
+ database: Config.dbName,
6
+ username: Config.dbUser,
7
+ password: Config.dbPass,
8
+ host: Config.dbHost,
9
+ port: Config.dbPort,
10
+ dialect: 'postgres',
11
+ schema: Config.dbschema,
12
+ logging: false,
13
+ define: {
14
+ timestamps: false,
15
+ freezeTableName: true
16
+ }
17
+ });
18
+
19
+ const EmailTemplate = require('./EmailTemplate')(sequelize);
20
+
21
+ module.exports = {
22
+ sequelize,
23
+ EmailTemplate
24
24
  };
@@ -1,51 +1,51 @@
1
- const { DataTypes } = require('sequelize');
2
- require('dotenv').config();
3
-
4
- module.exports = (sequelize) => {
5
- return sequelize.define('EmailTemplate', {
6
- TemplateID: {
7
- type: DataTypes.INTEGER,
8
- autoIncrement: true,
9
- primaryKey: true,
10
- },
11
- TemplateName: {
12
- type: DataTypes.STRING(100),
13
- allowNull: false,
14
- unique: true,
15
- },
16
- TenantID: {
17
- type: DataTypes.INTEGER,
18
- allowNull: false
19
- },
20
- LangCode: {
21
- type: DataTypes.STRING(10),
22
- allowNull: false,
23
- defaultValue: 'en',
24
- },
25
- Subject: {
26
- type: DataTypes.STRING(255),
27
- allowNull: false,
28
- },
29
- Body: {
30
- type: DataTypes.TEXT,
31
- allowNull: false,
32
- },
33
- CreatedBy: {
34
- type: DataTypes.STRING,
35
- },
36
- CreatedAt: {
37
- type: DataTypes.DATE,
38
- defaultValue: DataTypes.NOW,
39
- },
40
- UpdatedBy: {
41
- type: DataTypes.STRING,
42
- },
43
- UpdatedAt: {
44
- type: DataTypes.DATE,
45
- defaultValue: DataTypes.NOW,
46
- }
47
- }, {
48
- tableName: 'EmailTemplate',
49
- timestamps: false,
50
- });
51
- };
1
+ const { DataTypes } = require('sequelize');
2
+ require('dotenv').config();
3
+
4
+ module.exports = (sequelize) => {
5
+ return sequelize.define('EmailTemplate', {
6
+ TemplateID: {
7
+ type: DataTypes.INTEGER,
8
+ autoIncrement: true,
9
+ primaryKey: true,
10
+ },
11
+ TemplateName: {
12
+ type: DataTypes.STRING(100),
13
+ allowNull: false,
14
+ unique: true,
15
+ },
16
+ TenantID: {
17
+ type: DataTypes.INTEGER,
18
+ allowNull: false
19
+ },
20
+ LangCode: {
21
+ type: DataTypes.STRING(10),
22
+ allowNull: false,
23
+ defaultValue: 'en',
24
+ },
25
+ Subject: {
26
+ type: DataTypes.STRING(255),
27
+ allowNull: false,
28
+ },
29
+ Body: {
30
+ type: DataTypes.TEXT,
31
+ allowNull: false,
32
+ },
33
+ CreatedBy: {
34
+ type: DataTypes.STRING,
35
+ },
36
+ CreatedAt: {
37
+ type: DataTypes.DATE,
38
+ defaultValue: DataTypes.NOW,
39
+ },
40
+ UpdatedBy: {
41
+ type: DataTypes.STRING,
42
+ },
43
+ UpdatedAt: {
44
+ type: DataTypes.DATE,
45
+ defaultValue: DataTypes.NOW,
46
+ }
47
+ }, {
48
+ tableName: 'EmailTemplate',
49
+ timestamps: false,
50
+ });
51
+ };
package/package.json CHANGED
@@ -1,53 +1,53 @@
1
- {
2
- "name": "@b2y/email-service",
3
- "version": "1.0.9",
4
- "main": "index.js",
5
- "exports": {
6
- ".": "./index.js",
7
- "./providers": "./providers/index.js",
8
- "./providers/base": "./providers/BaseProvider.js",
9
- "./providers/nodemailer": "./providers/NodeMailerProvider.js",
10
- "./providers/sendgrid": "./providers/SendGridProvider.js",
11
- "./utils/templateEngine": "./utils/TemplateEngine.js",
12
- "./EmailService": "./service/EmailService.js"
13
- },
14
- "files": [
15
- "providers/",
16
- "templates/",
17
- "utils/",
18
- "constants/",
19
- "enum/",
20
- "model/",
21
- "service/",
22
- "*.js"
23
- ],
24
- "scripts": {
25
- "test": "echo \"Error: no test specified\" && exit 1",
26
- "start": "node test.js"
27
- },
28
- "author": "",
29
- "license": "ISC",
30
- "description": "A flexible email service with support for multiple providers and custom templates",
31
- "keywords": [
32
- "email",
33
- "templates",
34
- "nodemailer",
35
- "sendgrid"
36
- ],
37
- "publishConfig": {
38
- "access": "public"
39
- },
40
- "dependencies": {
41
- "@aws-sdk/client-ses": "^3.957.0",
42
- "@sendgrid/mail": "^8.1.5",
43
- "b2y-logger": "^1.1.0",
44
- "dotenv": "^16.5.0",
45
- "handlebars": "^4.7.8",
46
- "log4js": "^6.9.1",
47
- "nodemailer": "^6.10.0",
48
- "pg": "^8.16.3",
49
- "pg-hstore": "^2.3.4",
50
- "postmark": "^4.0.5",
51
- "sequelize": "^6.37.7"
52
- }
53
- }
1
+ {
2
+ "name": "@b2y/email-service",
3
+ "version": "1.1.0",
4
+ "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./providers": "./providers/index.js",
8
+ "./providers/base": "./providers/BaseProvider.js",
9
+ "./providers/nodemailer": "./providers/NodeMailerProvider.js",
10
+ "./providers/sendgrid": "./providers/SendGridProvider.js",
11
+ "./utils/templateEngine": "./utils/TemplateEngine.js",
12
+ "./EmailService": "./service/EmailService.js"
13
+ },
14
+ "files": [
15
+ "providers/",
16
+ "templates/",
17
+ "utils/",
18
+ "constants/",
19
+ "enum/",
20
+ "model/",
21
+ "service/",
22
+ "*.js"
23
+ ],
24
+ "scripts": {
25
+ "test": "echo \"Error: no test specified\" && exit 1",
26
+ "start": "node test.js"
27
+ },
28
+ "author": "",
29
+ "license": "ISC",
30
+ "description": "A flexible email service with support for multiple providers and custom templates",
31
+ "keywords": [
32
+ "email",
33
+ "templates",
34
+ "nodemailer",
35
+ "sendgrid"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "dependencies": {
41
+ "@aws-sdk/client-ses": "^3.957.0",
42
+ "@sendgrid/mail": "^8.1.5",
43
+ "b2y-logger": "^1.1.0",
44
+ "dotenv": "^16.5.0",
45
+ "handlebars": "^4.7.8",
46
+ "log4js": "^6.9.1",
47
+ "nodemailer": "^6.10.0",
48
+ "pg": "^8.16.3",
49
+ "pg-hstore": "^2.3.4",
50
+ "postmark": "^4.0.5",
51
+ "sequelize": "^6.37.7"
52
+ }
53
+ }