@flusys/nestjs-email 1.1.0-beta
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/cjs/config/email-config.service.js +94 -0
- package/cjs/config/email.constants.js +40 -0
- package/cjs/config/index.js +19 -0
- package/cjs/controllers/email-config.controller.js +59 -0
- package/cjs/controllers/email-send.controller.js +142 -0
- package/cjs/controllers/email-template.controller.js +84 -0
- package/cjs/controllers/index.js +20 -0
- package/cjs/docs/email-swagger.config.js +176 -0
- package/cjs/docs/index.js +11 -0
- package/cjs/dtos/email-config.dto.js +238 -0
- package/cjs/dtos/email-send.dto.js +376 -0
- package/cjs/dtos/email-template.dto.js +283 -0
- package/cjs/dtos/index.js +20 -0
- package/cjs/entities/email-config-base.entity.js +111 -0
- package/cjs/entities/email-config-with-company.entity.js +63 -0
- package/cjs/entities/email-config.entity.js +25 -0
- package/cjs/entities/email-template-base.entity.js +134 -0
- package/cjs/entities/email-template-with-company.entity.js +63 -0
- package/cjs/entities/email-template.entity.js +25 -0
- package/cjs/entities/index.js +41 -0
- package/cjs/enums/email-provider-type.enum.js +18 -0
- package/cjs/enums/index.js +18 -0
- package/cjs/index.js +27 -0
- package/cjs/interfaces/email-config.interface.js +4 -0
- package/cjs/interfaces/email-module-options.interface.js +4 -0
- package/cjs/interfaces/email-provider.interface.js +6 -0
- package/cjs/interfaces/email-template.interface.js +4 -0
- package/cjs/interfaces/index.js +21 -0
- package/cjs/modules/email.module.js +177 -0
- package/cjs/modules/index.js +18 -0
- package/cjs/providers/email-factory.service.js +160 -0
- package/cjs/providers/email-provider.registry.js +51 -0
- package/cjs/providers/index.js +22 -0
- package/cjs/providers/mailgun-provider.js +125 -0
- package/cjs/providers/sendgrid-provider.js +156 -0
- package/cjs/providers/smtp-provider.js +185 -0
- package/cjs/services/email-datasource.provider.js +215 -0
- package/cjs/services/email-provider-config.service.js +180 -0
- package/cjs/services/email-send.service.js +228 -0
- package/cjs/services/email-template.service.js +186 -0
- package/cjs/services/index.js +21 -0
- package/config/email-config.service.d.ts +13 -0
- package/config/email.constants.d.ts +11 -0
- package/config/index.d.ts +2 -0
- package/controllers/email-config.controller.d.ts +17 -0
- package/controllers/email-send.controller.d.ts +19 -0
- package/controllers/email-template.controller.d.ts +25 -0
- package/controllers/index.d.ts +3 -0
- package/docs/email-swagger.config.d.ts +3 -0
- package/docs/index.d.ts +1 -0
- package/dtos/email-config.dto.d.ts +33 -0
- package/dtos/email-send.dto.d.ts +45 -0
- package/dtos/email-template.dto.d.ts +42 -0
- package/dtos/index.d.ts +3 -0
- package/entities/email-config-base.entity.d.ts +11 -0
- package/entities/email-config-with-company.entity.d.ts +4 -0
- package/entities/email-config.entity.d.ts +3 -0
- package/entities/email-template-base.entity.d.ts +14 -0
- package/entities/email-template-with-company.entity.d.ts +4 -0
- package/entities/email-template.entity.d.ts +3 -0
- package/entities/index.d.ts +7 -0
- package/enums/email-provider-type.enum.d.ts +5 -0
- package/enums/index.d.ts +1 -0
- package/fesm/config/email-config.service.js +84 -0
- package/fesm/config/email.constants.js +13 -0
- package/fesm/config/index.js +2 -0
- package/fesm/controllers/email-config.controller.js +49 -0
- package/fesm/controllers/email-send.controller.js +132 -0
- package/fesm/controllers/email-template.controller.js +74 -0
- package/fesm/controllers/index.js +3 -0
- package/fesm/docs/email-swagger.config.js +172 -0
- package/fesm/docs/index.js +1 -0
- package/fesm/dtos/email-config.dto.js +223 -0
- package/fesm/dtos/email-send.dto.js +360 -0
- package/fesm/dtos/email-template.dto.js +268 -0
- package/fesm/dtos/index.js +3 -0
- package/fesm/entities/email-config-base.entity.js +101 -0
- package/fesm/entities/email-config-with-company.entity.js +53 -0
- package/fesm/entities/email-config.entity.js +15 -0
- package/fesm/entities/email-template-base.entity.js +124 -0
- package/fesm/entities/email-template-with-company.entity.js +53 -0
- package/fesm/entities/email-template.entity.js +15 -0
- package/fesm/entities/index.js +20 -0
- package/fesm/enums/email-provider-type.enum.js +8 -0
- package/fesm/enums/index.js +1 -0
- package/fesm/index.js +10 -0
- package/fesm/interfaces/email-config.interface.js +3 -0
- package/fesm/interfaces/email-module-options.interface.js +3 -0
- package/fesm/interfaces/email-provider.interface.js +5 -0
- package/fesm/interfaces/email-template.interface.js +3 -0
- package/fesm/interfaces/index.js +4 -0
- package/fesm/modules/email.module.js +167 -0
- package/fesm/modules/index.js +1 -0
- package/fesm/providers/email-factory.service.js +109 -0
- package/fesm/providers/email-provider.registry.js +44 -0
- package/fesm/providers/index.js +5 -0
- package/fesm/providers/mailgun-provider.js +119 -0
- package/fesm/providers/sendgrid-provider.js +150 -0
- package/fesm/providers/smtp-provider.js +137 -0
- package/fesm/services/email-datasource.provider.js +164 -0
- package/fesm/services/email-provider-config.service.js +170 -0
- package/fesm/services/email-send.service.js +218 -0
- package/fesm/services/email-template.service.js +176 -0
- package/fesm/services/index.js +4 -0
- package/index.d.ts +9 -0
- package/interfaces/email-config.interface.d.ts +28 -0
- package/interfaces/email-module-options.interface.d.ts +26 -0
- package/interfaces/email-provider.interface.d.ts +34 -0
- package/interfaces/email-template.interface.d.ts +64 -0
- package/interfaces/index.d.ts +4 -0
- package/modules/email.module.d.ts +9 -0
- package/modules/index.d.ts +1 -0
- package/package.json +105 -0
- package/providers/email-factory.service.d.ts +14 -0
- package/providers/email-provider.registry.d.ts +10 -0
- package/providers/index.d.ts +5 -0
- package/providers/mailgun-provider.d.ts +11 -0
- package/providers/sendgrid-provider.d.ts +11 -0
- package/providers/smtp-provider.d.ts +11 -0
- package/services/email-datasource.provider.d.ts +25 -0
- package/services/email-provider-config.service.d.ts +32 -0
- package/services/email-send.service.d.ts +20 -0
- package/services/email-template.service.d.ts +31 -0
- package/services/index.d.ts +4 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmailTemplateWithCompany", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmailTemplateWithCompany;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _typeorm = require("typeorm");
|
|
12
|
+
const _emailtemplatebaseentity = require("./email-template-base.entity");
|
|
13
|
+
function _define_property(obj, key, value) {
|
|
14
|
+
if (key in obj) {
|
|
15
|
+
Object.defineProperty(obj, key, {
|
|
16
|
+
value: value,
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true
|
|
20
|
+
});
|
|
21
|
+
} else {
|
|
22
|
+
obj[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
27
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
28
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
29
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
30
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
31
|
+
}
|
|
32
|
+
function _ts_metadata(k, v) {
|
|
33
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
34
|
+
}
|
|
35
|
+
let EmailTemplateWithCompany = class EmailTemplateWithCompany extends _emailtemplatebaseentity.EmailTemplateBase {
|
|
36
|
+
constructor(...args){
|
|
37
|
+
super(...args), _define_property(this, "companyId", void 0);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
_ts_decorate([
|
|
41
|
+
(0, _typeorm.Column)({
|
|
42
|
+
type: 'uuid',
|
|
43
|
+
nullable: true,
|
|
44
|
+
name: 'company_id'
|
|
45
|
+
}),
|
|
46
|
+
_ts_metadata("design:type", Object)
|
|
47
|
+
], EmailTemplateWithCompany.prototype, "companyId", void 0);
|
|
48
|
+
EmailTemplateWithCompany = _ts_decorate([
|
|
49
|
+
(0, _typeorm.Entity)({
|
|
50
|
+
name: 'email_template'
|
|
51
|
+
}),
|
|
52
|
+
(0, _typeorm.Index)([
|
|
53
|
+
'companyId'
|
|
54
|
+
]),
|
|
55
|
+
(0, _typeorm.Index)([
|
|
56
|
+
'companyId',
|
|
57
|
+
'slug'
|
|
58
|
+
]),
|
|
59
|
+
(0, _typeorm.Index)([
|
|
60
|
+
'companyId',
|
|
61
|
+
'isActive'
|
|
62
|
+
])
|
|
63
|
+
], EmailTemplateWithCompany);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmailTemplate", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmailTemplate;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _typeorm = require("typeorm");
|
|
12
|
+
const _emailtemplatebaseentity = require("./email-template-base.entity");
|
|
13
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
14
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
17
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
+
}
|
|
19
|
+
let EmailTemplate = class EmailTemplate extends _emailtemplatebaseentity.EmailTemplateBase {
|
|
20
|
+
};
|
|
21
|
+
EmailTemplate = _ts_decorate([
|
|
22
|
+
(0, _typeorm.Entity)({
|
|
23
|
+
name: 'email_template'
|
|
24
|
+
})
|
|
25
|
+
], EmailTemplate);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "getEmailEntitiesByConfig", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return getEmailEntitiesByConfig;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
_export_star(require("./email-config-base.entity"), exports);
|
|
12
|
+
_export_star(require("./email-config.entity"), exports);
|
|
13
|
+
_export_star(require("./email-config-with-company.entity"), exports);
|
|
14
|
+
_export_star(require("./email-template-base.entity"), exports);
|
|
15
|
+
_export_star(require("./email-template.entity"), exports);
|
|
16
|
+
_export_star(require("./email-template-with-company.entity"), exports);
|
|
17
|
+
function _export_star(from, to) {
|
|
18
|
+
Object.keys(from).forEach(function(k) {
|
|
19
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
20
|
+
Object.defineProperty(to, k, {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function() {
|
|
23
|
+
return from[k];
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return from;
|
|
29
|
+
}
|
|
30
|
+
function getEmailEntitiesByConfig(enableCompanyFeature) {
|
|
31
|
+
if (enableCompanyFeature) {
|
|
32
|
+
return [
|
|
33
|
+
require('./email-config-with-company.entity').EmailConfigWithCompany,
|
|
34
|
+
require('./email-template-with-company.entity').EmailTemplateWithCompany
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
return [
|
|
38
|
+
require('./email-config.entity').EmailConfig,
|
|
39
|
+
require('./email-template.entity').EmailTemplate
|
|
40
|
+
];
|
|
41
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supported email provider types
|
|
3
|
+
*/ "use strict";
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(exports, "EmailProviderTypeEnum", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function() {
|
|
10
|
+
return EmailProviderTypeEnum;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
var EmailProviderTypeEnum = /*#__PURE__*/ function(EmailProviderTypeEnum) {
|
|
14
|
+
/** SMTP - Default provider using nodemailer (always available) */ EmailProviderTypeEnum["SMTP"] = "smtp";
|
|
15
|
+
/** SendGrid - Optional (requires @sendgrid/mail) */ EmailProviderTypeEnum["SENDGRID"] = "sendgrid";
|
|
16
|
+
/** Mailgun - Optional (requires mailgun.js) */ EmailProviderTypeEnum["MAILGUN"] = "mailgun";
|
|
17
|
+
return EmailProviderTypeEnum;
|
|
18
|
+
}({});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./email-provider-type.enum"), exports);
|
|
6
|
+
function _export_star(from, to) {
|
|
7
|
+
Object.keys(from).forEach(function(k) {
|
|
8
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
9
|
+
Object.defineProperty(to, k, {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
12
|
+
return from[k];
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return from;
|
|
18
|
+
}
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Export all email module components
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
_export_star(require("./controllers"), exports);
|
|
7
|
+
_export_star(require("./services"), exports);
|
|
8
|
+
_export_star(require("./entities"), exports);
|
|
9
|
+
_export_star(require("./modules"), exports);
|
|
10
|
+
_export_star(require("./config"), exports);
|
|
11
|
+
_export_star(require("./dtos"), exports);
|
|
12
|
+
_export_star(require("./enums"), exports);
|
|
13
|
+
_export_star(require("./interfaces"), exports);
|
|
14
|
+
_export_star(require("./providers"), exports);
|
|
15
|
+
function _export_star(from, to) {
|
|
16
|
+
Object.keys(from).forEach(function(k) {
|
|
17
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
18
|
+
Object.defineProperty(to, k, {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function() {
|
|
21
|
+
return from[k];
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return from;
|
|
27
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./email-provider.interface"), exports);
|
|
6
|
+
_export_star(require("./email-module-options.interface"), exports);
|
|
7
|
+
_export_star(require("./email-config.interface"), exports);
|
|
8
|
+
_export_star(require("./email-template.interface"), exports);
|
|
9
|
+
function _export_star(from, to) {
|
|
10
|
+
Object.keys(from).forEach(function(k) {
|
|
11
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
12
|
+
Object.defineProperty(to, k, {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function() {
|
|
15
|
+
return from[k];
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return from;
|
|
21
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmailModule", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmailModule;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _modules = require("@flusys/nestjs-shared/modules");
|
|
12
|
+
const _common = require("@nestjs/common");
|
|
13
|
+
const _config = require("../config");
|
|
14
|
+
const _emailconstants = require("../config/email.constants");
|
|
15
|
+
const _enums = require("../enums");
|
|
16
|
+
const _providers = require("../providers");
|
|
17
|
+
const _services = require("../services");
|
|
18
|
+
const _controllers = require("../controllers");
|
|
19
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
20
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
22
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
23
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
24
|
+
}
|
|
25
|
+
// Auto-register built-in email providers
|
|
26
|
+
const logger = new _common.Logger('EmailModule');
|
|
27
|
+
// Register all providers (they use dynamic imports internally)
|
|
28
|
+
_providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SMTP, _providers.SmtpProvider);
|
|
29
|
+
logger.log('Registered SmtpProvider');
|
|
30
|
+
_providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.SENDGRID, _providers.SendGridProvider);
|
|
31
|
+
logger.log('Registered SendGridProvider');
|
|
32
|
+
_providers.EmailProviderRegistry.register(_enums.EmailProviderTypeEnum.MAILGUN, _providers.MailgunProvider);
|
|
33
|
+
logger.log('Registered MailgunProvider');
|
|
34
|
+
let EmailModule = class EmailModule {
|
|
35
|
+
/**
|
|
36
|
+
* Register EmailModule synchronously
|
|
37
|
+
*/ static forRoot(options) {
|
|
38
|
+
const controllers = this.getControllers(options);
|
|
39
|
+
const providers = this.getProviders(options);
|
|
40
|
+
return {
|
|
41
|
+
module: EmailModule,
|
|
42
|
+
global: options.global ?? false,
|
|
43
|
+
imports: [
|
|
44
|
+
_modules.CacheModule,
|
|
45
|
+
_modules.UtilsModule
|
|
46
|
+
],
|
|
47
|
+
controllers: options.includeController !== false ? controllers : [],
|
|
48
|
+
providers,
|
|
49
|
+
exports: [
|
|
50
|
+
_config.EmailConfigService,
|
|
51
|
+
_services.EmailDataSourceProvider,
|
|
52
|
+
_services.EmailProviderConfigService,
|
|
53
|
+
_services.EmailTemplateService,
|
|
54
|
+
_services.EmailSendService,
|
|
55
|
+
_providers.EmailFactoryService
|
|
56
|
+
]
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Register EmailModule asynchronously
|
|
61
|
+
*/ static forRootAsync(options) {
|
|
62
|
+
const controllers = this.getControllers(options);
|
|
63
|
+
const asyncProviders = this.createAsyncProviders(options);
|
|
64
|
+
return {
|
|
65
|
+
module: EmailModule,
|
|
66
|
+
global: options.global ?? false,
|
|
67
|
+
imports: [
|
|
68
|
+
...options.imports || [],
|
|
69
|
+
_modules.CacheModule,
|
|
70
|
+
_modules.UtilsModule
|
|
71
|
+
],
|
|
72
|
+
controllers: options.includeController !== false ? controllers : [],
|
|
73
|
+
providers: [
|
|
74
|
+
...asyncProviders,
|
|
75
|
+
...this.getProviders(options, false)
|
|
76
|
+
],
|
|
77
|
+
exports: [
|
|
78
|
+
_config.EmailConfigService,
|
|
79
|
+
_services.EmailDataSourceProvider,
|
|
80
|
+
_services.EmailProviderConfigService,
|
|
81
|
+
_services.EmailTemplateService,
|
|
82
|
+
_services.EmailSendService,
|
|
83
|
+
_providers.EmailFactoryService
|
|
84
|
+
]
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// ==================== Private Helper Methods ====================
|
|
88
|
+
/**
|
|
89
|
+
* Get controllers
|
|
90
|
+
*/ static getControllers(_options) {
|
|
91
|
+
return [
|
|
92
|
+
_controllers.EmailConfigController,
|
|
93
|
+
_controllers.EmailTemplateController,
|
|
94
|
+
_controllers.EmailSendController
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get providers
|
|
99
|
+
*/ static getProviders(options, includeOptionsProvider = true) {
|
|
100
|
+
const providers = [
|
|
101
|
+
_config.EmailConfigService,
|
|
102
|
+
_services.EmailDataSourceProvider,
|
|
103
|
+
_services.EmailProviderConfigService,
|
|
104
|
+
_services.EmailTemplateService,
|
|
105
|
+
_services.EmailSendService,
|
|
106
|
+
_providers.EmailFactoryService
|
|
107
|
+
];
|
|
108
|
+
if (includeOptionsProvider) {
|
|
109
|
+
providers.unshift({
|
|
110
|
+
provide: _emailconstants.EMAIL_MODULE_OPTIONS,
|
|
111
|
+
useValue: options
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return providers;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create async providers for forRootAsync
|
|
118
|
+
*/ static createAsyncProviders(options) {
|
|
119
|
+
if (options.useFactory) {
|
|
120
|
+
return [
|
|
121
|
+
{
|
|
122
|
+
provide: _emailconstants.EMAIL_MODULE_OPTIONS,
|
|
123
|
+
useFactory: async (...args)=>{
|
|
124
|
+
const config = await options.useFactory(...args);
|
|
125
|
+
return {
|
|
126
|
+
...options,
|
|
127
|
+
config
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
inject: options.inject || []
|
|
131
|
+
}
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
if (options.useClass) {
|
|
135
|
+
return [
|
|
136
|
+
{
|
|
137
|
+
provide: _emailconstants.EMAIL_MODULE_OPTIONS,
|
|
138
|
+
useFactory: async (optionsFactory)=>{
|
|
139
|
+
const config = await optionsFactory.createEmailOptions();
|
|
140
|
+
return {
|
|
141
|
+
...options,
|
|
142
|
+
config
|
|
143
|
+
};
|
|
144
|
+
},
|
|
145
|
+
inject: [
|
|
146
|
+
options.useClass
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
provide: options.useClass,
|
|
151
|
+
useClass: options.useClass
|
|
152
|
+
}
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
if (options.useExisting) {
|
|
156
|
+
return [
|
|
157
|
+
{
|
|
158
|
+
provide: _emailconstants.EMAIL_MODULE_OPTIONS,
|
|
159
|
+
useFactory: async (optionsFactory)=>{
|
|
160
|
+
const config = await optionsFactory.createEmailOptions();
|
|
161
|
+
return {
|
|
162
|
+
...options,
|
|
163
|
+
config
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
inject: [
|
|
167
|
+
options.useExisting
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
];
|
|
171
|
+
}
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
EmailModule = _ts_decorate([
|
|
176
|
+
(0, _common.Module)({})
|
|
177
|
+
], EmailModule);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./email.module"), exports);
|
|
6
|
+
function _export_star(from, to) {
|
|
7
|
+
Object.keys(from).forEach(function(k) {
|
|
8
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
9
|
+
Object.defineProperty(to, k, {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
get: function() {
|
|
12
|
+
return from[k];
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return from;
|
|
18
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmailFactoryService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmailFactoryService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _crypto = /*#__PURE__*/ _interop_require_wildcard(require("crypto"));
|
|
13
|
+
const _emailconfigservice = require("../config/email-config.service");
|
|
14
|
+
const _emailproviderregistry = require("./email-provider.registry");
|
|
15
|
+
function _define_property(obj, key, value) {
|
|
16
|
+
if (key in obj) {
|
|
17
|
+
Object.defineProperty(obj, key, {
|
|
18
|
+
value: value,
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true
|
|
22
|
+
});
|
|
23
|
+
} else {
|
|
24
|
+
obj[key] = value;
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
29
|
+
if (typeof WeakMap !== "function") return null;
|
|
30
|
+
var cacheBabelInterop = new WeakMap();
|
|
31
|
+
var cacheNodeInterop = new WeakMap();
|
|
32
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
33
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
34
|
+
})(nodeInterop);
|
|
35
|
+
}
|
|
36
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
37
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
38
|
+
return obj;
|
|
39
|
+
}
|
|
40
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
41
|
+
return {
|
|
42
|
+
default: obj
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
46
|
+
if (cache && cache.has(obj)) {
|
|
47
|
+
return cache.get(obj);
|
|
48
|
+
}
|
|
49
|
+
var newObj = {
|
|
50
|
+
__proto__: null
|
|
51
|
+
};
|
|
52
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
53
|
+
for(var key in obj){
|
|
54
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
55
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
56
|
+
if (desc && (desc.get || desc.set)) {
|
|
57
|
+
Object.defineProperty(newObj, key, desc);
|
|
58
|
+
} else {
|
|
59
|
+
newObj[key] = obj[key];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
newObj.default = obj;
|
|
64
|
+
if (cache) {
|
|
65
|
+
cache.set(obj, newObj);
|
|
66
|
+
}
|
|
67
|
+
return newObj;
|
|
68
|
+
}
|
|
69
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
70
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
71
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
72
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
73
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
74
|
+
}
|
|
75
|
+
function _ts_metadata(k, v) {
|
|
76
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
77
|
+
}
|
|
78
|
+
function _ts_param(paramIndex, decorator) {
|
|
79
|
+
return function(target, key) {
|
|
80
|
+
decorator(target, key, paramIndex);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
let EmailFactoryService = class EmailFactoryService {
|
|
84
|
+
/**
|
|
85
|
+
* Generate a unique cache key for a provider configuration
|
|
86
|
+
*/ generateCacheKey(config) {
|
|
87
|
+
const configString = JSON.stringify(config.config, Object.keys(config.config || {}).sort());
|
|
88
|
+
const configHash = _crypto.createHash('sha256').update(configString).digest('hex').substring(0, 16);
|
|
89
|
+
return `${config.provider}-${configHash}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create or retrieve a cached email provider instance
|
|
93
|
+
*/ async createProvider(config) {
|
|
94
|
+
const providerKey = this.generateCacheKey(config);
|
|
95
|
+
// Return cached provider if exists
|
|
96
|
+
if (this.providerCache.has(providerKey)) {
|
|
97
|
+
return this.providerCache.get(providerKey);
|
|
98
|
+
}
|
|
99
|
+
// Get provider class from registry
|
|
100
|
+
const ProviderClass = _emailproviderregistry.EmailProviderRegistry.get(config.provider);
|
|
101
|
+
if (!ProviderClass) {
|
|
102
|
+
throw new _common.NotFoundException(`Email provider '${config.provider}' is not registered. ` + `Available providers: ${_emailproviderregistry.EmailProviderRegistry.getAll().join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
// Create new instance
|
|
106
|
+
const instance = new ProviderClass();
|
|
107
|
+
// Initialize if provider has initialize method
|
|
108
|
+
if ('initialize' in instance && typeof instance.initialize === 'function') {
|
|
109
|
+
await instance.initialize(config.config);
|
|
110
|
+
}
|
|
111
|
+
// Cache the instance
|
|
112
|
+
this.providerCache.set(providerKey, instance);
|
|
113
|
+
this.logger.log(`Created email provider: ${config.provider} (key: ${providerKey})`);
|
|
114
|
+
return instance;
|
|
115
|
+
} catch (error) {
|
|
116
|
+
this.logger.error(`Failed to create provider ${config.provider}:`, error);
|
|
117
|
+
throw new Error(`Failed to initialize email provider '${config.provider}': ${error?.message || 'Unknown error'}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if a provider is available (registered)
|
|
122
|
+
*/ isProviderAvailable(providerName) {
|
|
123
|
+
return _emailproviderregistry.EmailProviderRegistry.has(providerName);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get list of available providers
|
|
127
|
+
*/ getAvailableProviders() {
|
|
128
|
+
return _emailproviderregistry.EmailProviderRegistry.getAll();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Cleanup on module destroy
|
|
132
|
+
*/ async onModuleDestroy() {
|
|
133
|
+
this.logger.log('Cleaning up email provider connections...');
|
|
134
|
+
const closePromises = [];
|
|
135
|
+
for (const [key, provider] of this.providerCache.entries()){
|
|
136
|
+
if ('close' in provider && typeof provider.close === 'function') {
|
|
137
|
+
closePromises.push(provider.close().then(()=>this.logger.debug(`Closed provider: ${key}`)).catch((err)=>this.logger.warn(`Failed to close provider ${key}: ${err.message}`)));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
await Promise.allSettled(closePromises);
|
|
141
|
+
this.providerCache.clear();
|
|
142
|
+
this.logger.log('Email provider cleanup complete');
|
|
143
|
+
}
|
|
144
|
+
constructor(emailConfigService){
|
|
145
|
+
_define_property(this, "emailConfigService", void 0);
|
|
146
|
+
_define_property(this, "logger", void 0);
|
|
147
|
+
_define_property(this, "providerCache", void 0);
|
|
148
|
+
this.emailConfigService = emailConfigService;
|
|
149
|
+
this.logger = new _common.Logger(EmailFactoryService.name);
|
|
150
|
+
this.providerCache = new Map();
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
EmailFactoryService = _ts_decorate([
|
|
154
|
+
(0, _common.Injectable)(),
|
|
155
|
+
_ts_param(0, (0, _common.Inject)(_emailconfigservice.EmailConfigService)),
|
|
156
|
+
_ts_metadata("design:type", Function),
|
|
157
|
+
_ts_metadata("design:paramtypes", [
|
|
158
|
+
typeof _emailconfigservice.EmailConfigService === "undefined" ? Object : _emailconfigservice.EmailConfigService
|
|
159
|
+
])
|
|
160
|
+
], EmailFactoryService);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "EmailProviderRegistry", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return EmailProviderRegistry;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
function _define_property(obj, key, value) {
|
|
12
|
+
if (key in obj) {
|
|
13
|
+
Object.defineProperty(obj, key, {
|
|
14
|
+
value: value,
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
obj[key] = value;
|
|
21
|
+
}
|
|
22
|
+
return obj;
|
|
23
|
+
}
|
|
24
|
+
let EmailProviderRegistry = class EmailProviderRegistry {
|
|
25
|
+
/**
|
|
26
|
+
* Register an email provider
|
|
27
|
+
*/ static register(providerName, providerClass) {
|
|
28
|
+
this.providers.set(providerName.toLowerCase(), providerClass);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get a registered provider class
|
|
32
|
+
*/ static get(providerName) {
|
|
33
|
+
return this.providers.get(providerName.toLowerCase());
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if a provider is registered
|
|
37
|
+
*/ static has(providerName) {
|
|
38
|
+
return this.providers.has(providerName.toLowerCase());
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get all registered provider names
|
|
42
|
+
*/ static getAll() {
|
|
43
|
+
return Array.from(this.providers.keys());
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clear all providers (useful for testing)
|
|
47
|
+
*/ static clear() {
|
|
48
|
+
this.providers.clear();
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
_define_property(EmailProviderRegistry, "providers", new Map());
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./email-provider.registry"), exports);
|
|
6
|
+
_export_star(require("./email-factory.service"), exports);
|
|
7
|
+
_export_star(require("./smtp-provider"), exports);
|
|
8
|
+
_export_star(require("./sendgrid-provider"), exports);
|
|
9
|
+
_export_star(require("./mailgun-provider"), exports);
|
|
10
|
+
function _export_star(from, to) {
|
|
11
|
+
Object.keys(from).forEach(function(k) {
|
|
12
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
13
|
+
Object.defineProperty(to, k, {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function() {
|
|
16
|
+
return from[k];
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return from;
|
|
22
|
+
}
|