@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.
Files changed (124) hide show
  1. package/cjs/config/email-config.service.js +94 -0
  2. package/cjs/config/email.constants.js +40 -0
  3. package/cjs/config/index.js +19 -0
  4. package/cjs/controllers/email-config.controller.js +59 -0
  5. package/cjs/controllers/email-send.controller.js +142 -0
  6. package/cjs/controllers/email-template.controller.js +84 -0
  7. package/cjs/controllers/index.js +20 -0
  8. package/cjs/docs/email-swagger.config.js +176 -0
  9. package/cjs/docs/index.js +11 -0
  10. package/cjs/dtos/email-config.dto.js +238 -0
  11. package/cjs/dtos/email-send.dto.js +376 -0
  12. package/cjs/dtos/email-template.dto.js +283 -0
  13. package/cjs/dtos/index.js +20 -0
  14. package/cjs/entities/email-config-base.entity.js +111 -0
  15. package/cjs/entities/email-config-with-company.entity.js +63 -0
  16. package/cjs/entities/email-config.entity.js +25 -0
  17. package/cjs/entities/email-template-base.entity.js +134 -0
  18. package/cjs/entities/email-template-with-company.entity.js +63 -0
  19. package/cjs/entities/email-template.entity.js +25 -0
  20. package/cjs/entities/index.js +41 -0
  21. package/cjs/enums/email-provider-type.enum.js +18 -0
  22. package/cjs/enums/index.js +18 -0
  23. package/cjs/index.js +27 -0
  24. package/cjs/interfaces/email-config.interface.js +4 -0
  25. package/cjs/interfaces/email-module-options.interface.js +4 -0
  26. package/cjs/interfaces/email-provider.interface.js +6 -0
  27. package/cjs/interfaces/email-template.interface.js +4 -0
  28. package/cjs/interfaces/index.js +21 -0
  29. package/cjs/modules/email.module.js +177 -0
  30. package/cjs/modules/index.js +18 -0
  31. package/cjs/providers/email-factory.service.js +160 -0
  32. package/cjs/providers/email-provider.registry.js +51 -0
  33. package/cjs/providers/index.js +22 -0
  34. package/cjs/providers/mailgun-provider.js +125 -0
  35. package/cjs/providers/sendgrid-provider.js +156 -0
  36. package/cjs/providers/smtp-provider.js +185 -0
  37. package/cjs/services/email-datasource.provider.js +215 -0
  38. package/cjs/services/email-provider-config.service.js +180 -0
  39. package/cjs/services/email-send.service.js +228 -0
  40. package/cjs/services/email-template.service.js +186 -0
  41. package/cjs/services/index.js +21 -0
  42. package/config/email-config.service.d.ts +13 -0
  43. package/config/email.constants.d.ts +11 -0
  44. package/config/index.d.ts +2 -0
  45. package/controllers/email-config.controller.d.ts +17 -0
  46. package/controllers/email-send.controller.d.ts +19 -0
  47. package/controllers/email-template.controller.d.ts +25 -0
  48. package/controllers/index.d.ts +3 -0
  49. package/docs/email-swagger.config.d.ts +3 -0
  50. package/docs/index.d.ts +1 -0
  51. package/dtos/email-config.dto.d.ts +33 -0
  52. package/dtos/email-send.dto.d.ts +45 -0
  53. package/dtos/email-template.dto.d.ts +42 -0
  54. package/dtos/index.d.ts +3 -0
  55. package/entities/email-config-base.entity.d.ts +11 -0
  56. package/entities/email-config-with-company.entity.d.ts +4 -0
  57. package/entities/email-config.entity.d.ts +3 -0
  58. package/entities/email-template-base.entity.d.ts +14 -0
  59. package/entities/email-template-with-company.entity.d.ts +4 -0
  60. package/entities/email-template.entity.d.ts +3 -0
  61. package/entities/index.d.ts +7 -0
  62. package/enums/email-provider-type.enum.d.ts +5 -0
  63. package/enums/index.d.ts +1 -0
  64. package/fesm/config/email-config.service.js +84 -0
  65. package/fesm/config/email.constants.js +13 -0
  66. package/fesm/config/index.js +2 -0
  67. package/fesm/controllers/email-config.controller.js +49 -0
  68. package/fesm/controllers/email-send.controller.js +132 -0
  69. package/fesm/controllers/email-template.controller.js +74 -0
  70. package/fesm/controllers/index.js +3 -0
  71. package/fesm/docs/email-swagger.config.js +172 -0
  72. package/fesm/docs/index.js +1 -0
  73. package/fesm/dtos/email-config.dto.js +223 -0
  74. package/fesm/dtos/email-send.dto.js +360 -0
  75. package/fesm/dtos/email-template.dto.js +268 -0
  76. package/fesm/dtos/index.js +3 -0
  77. package/fesm/entities/email-config-base.entity.js +101 -0
  78. package/fesm/entities/email-config-with-company.entity.js +53 -0
  79. package/fesm/entities/email-config.entity.js +15 -0
  80. package/fesm/entities/email-template-base.entity.js +124 -0
  81. package/fesm/entities/email-template-with-company.entity.js +53 -0
  82. package/fesm/entities/email-template.entity.js +15 -0
  83. package/fesm/entities/index.js +20 -0
  84. package/fesm/enums/email-provider-type.enum.js +8 -0
  85. package/fesm/enums/index.js +1 -0
  86. package/fesm/index.js +10 -0
  87. package/fesm/interfaces/email-config.interface.js +3 -0
  88. package/fesm/interfaces/email-module-options.interface.js +3 -0
  89. package/fesm/interfaces/email-provider.interface.js +5 -0
  90. package/fesm/interfaces/email-template.interface.js +3 -0
  91. package/fesm/interfaces/index.js +4 -0
  92. package/fesm/modules/email.module.js +167 -0
  93. package/fesm/modules/index.js +1 -0
  94. package/fesm/providers/email-factory.service.js +109 -0
  95. package/fesm/providers/email-provider.registry.js +44 -0
  96. package/fesm/providers/index.js +5 -0
  97. package/fesm/providers/mailgun-provider.js +119 -0
  98. package/fesm/providers/sendgrid-provider.js +150 -0
  99. package/fesm/providers/smtp-provider.js +137 -0
  100. package/fesm/services/email-datasource.provider.js +164 -0
  101. package/fesm/services/email-provider-config.service.js +170 -0
  102. package/fesm/services/email-send.service.js +218 -0
  103. package/fesm/services/email-template.service.js +176 -0
  104. package/fesm/services/index.js +4 -0
  105. package/index.d.ts +9 -0
  106. package/interfaces/email-config.interface.d.ts +28 -0
  107. package/interfaces/email-module-options.interface.d.ts +26 -0
  108. package/interfaces/email-provider.interface.d.ts +34 -0
  109. package/interfaces/email-template.interface.d.ts +64 -0
  110. package/interfaces/index.d.ts +4 -0
  111. package/modules/email.module.d.ts +9 -0
  112. package/modules/index.d.ts +1 -0
  113. package/package.json +105 -0
  114. package/providers/email-factory.service.d.ts +14 -0
  115. package/providers/email-provider.registry.d.ts +10 -0
  116. package/providers/index.d.ts +5 -0
  117. package/providers/mailgun-provider.d.ts +11 -0
  118. package/providers/sendgrid-provider.d.ts +11 -0
  119. package/providers/smtp-provider.d.ts +11 -0
  120. package/services/email-datasource.provider.d.ts +25 -0
  121. package/services/email-provider-config.service.d.ts +32 -0
  122. package/services/email-send.service.d.ts +20 -0
  123. package/services/email-template.service.d.ts +31 -0
  124. 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,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Email provider configuration
3
+ */ "use strict";
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -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
+ }