@pixelplex/mail-service 0.1.22 → 0.2.1

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 (132) hide show
  1. package/.gitlab-ci.yml +1 -25
  2. package/LICENSE.md +1 -1
  3. package/README.md +83 -137
  4. package/audit-ci.json +4 -0
  5. package/commitlint.config.js +27 -0
  6. package/dist/constants/index.d.ts +1 -0
  7. package/dist/constants/index.js +18 -0
  8. package/dist/constants/index.js.map +1 -0
  9. package/dist/constants/mail.constants.d.ts +11 -0
  10. package/dist/constants/mail.constants.js +17 -0
  11. package/dist/constants/mail.constants.js.map +1 -0
  12. package/dist/decorators/index.d.ts +2 -0
  13. package/dist/decorators/index.js +19 -0
  14. package/dist/decorators/index.js.map +1 -0
  15. package/dist/decorators/inject-gateways.decorator.d.ts +2 -0
  16. package/dist/decorators/inject-gateways.decorator.js +10 -0
  17. package/dist/decorators/inject-gateways.decorator.js.map +1 -0
  18. package/dist/decorators/inject-options.decorator.d.ts +3 -0
  19. package/dist/decorators/inject-options.decorator.js +14 -0
  20. package/dist/decorators/inject-options.decorator.js.map +1 -0
  21. package/dist/factories/gateway.factory.d.ts +4 -0
  22. package/dist/factories/gateway.factory.js +18 -0
  23. package/dist/factories/gateway.factory.js.map +1 -0
  24. package/dist/factories/index.d.ts +1 -0
  25. package/dist/factories/index.js +18 -0
  26. package/dist/factories/index.js.map +1 -0
  27. package/dist/gateways/console.gateway.d.ts +6 -0
  28. package/dist/{connect/app.module.js → gateways/console.gateway.js} +13 -17
  29. package/dist/gateways/console.gateway.js.map +1 -0
  30. package/dist/gateways/index.d.ts +4 -0
  31. package/dist/gateways/index.js +21 -0
  32. package/dist/gateways/index.js.map +1 -0
  33. package/dist/gateways/sendgrid.gateway.d.ts +8 -0
  34. package/dist/gateways/sendgrid.gateway.js +45 -0
  35. package/dist/gateways/sendgrid.gateway.js.map +1 -0
  36. package/dist/gateways/slack.gateway.d.ts +8 -0
  37. package/dist/gateways/slack.gateway.js +40 -0
  38. package/dist/gateways/slack.gateway.js.map +1 -0
  39. package/dist/gateways/smtp.gateway.d.ts +9 -0
  40. package/dist/gateways/smtp.gateway.js +43 -0
  41. package/dist/gateways/smtp.gateway.js.map +1 -0
  42. package/dist/index.d.ts +7 -4
  43. package/dist/index.js +21 -7
  44. package/dist/index.js.map +1 -1
  45. package/dist/interfaces/gateway.interface.d.ts +4 -0
  46. package/dist/interfaces/gateway.interface.js +3 -0
  47. package/dist/interfaces/gateway.interface.js.map +1 -0
  48. package/dist/interfaces/index.d.ts +1 -0
  49. package/dist/interfaces/index.js +18 -0
  50. package/dist/interfaces/index.js.map +1 -0
  51. package/dist/mail.module.d.ts +5 -0
  52. package/dist/mail.module.js +68 -0
  53. package/dist/mail.module.js.map +1 -0
  54. package/dist/services/index.d.ts +1 -0
  55. package/dist/services/index.js +18 -0
  56. package/dist/services/index.js.map +1 -0
  57. package/dist/services/mail-sender.service.d.ts +11 -0
  58. package/dist/services/mail-sender.service.js +91 -0
  59. package/dist/services/mail-sender.service.js.map +1 -0
  60. package/dist/tsconfig.build.tsbuildinfo +1 -8211
  61. package/dist/types/decorators.types.d.ts +2 -0
  62. package/dist/types/decorators.types.js +3 -0
  63. package/dist/types/decorators.types.js.map +1 -0
  64. package/dist/types/gateway.class.d.ts +4 -0
  65. package/dist/types/gateway.class.js +3 -0
  66. package/dist/types/gateway.class.js.map +1 -0
  67. package/dist/types/index.d.ts +7 -0
  68. package/dist/types/index.js +24 -0
  69. package/dist/types/index.js.map +1 -0
  70. package/dist/types/options.types.d.ts +16 -0
  71. package/dist/types/options.types.js +3 -0
  72. package/dist/types/options.types.js.map +1 -0
  73. package/dist/types/sendgrid-options.types.d.ts +4 -0
  74. package/dist/types/sendgrid-options.types.js +3 -0
  75. package/dist/types/sendgrid-options.types.js.map +1 -0
  76. package/dist/types/slack-options.types.d.ts +3 -0
  77. package/dist/types/slack-options.types.js +3 -0
  78. package/dist/types/slack-options.types.js.map +1 -0
  79. package/dist/types/smtp-options.types.d.ts +7 -0
  80. package/dist/types/smtp-options.types.js +3 -0
  81. package/dist/types/smtp-options.types.js.map +1 -0
  82. package/dist/types/templates.types.d.ts +12 -0
  83. package/dist/types/templates.types.js +3 -0
  84. package/dist/types/templates.types.js.map +1 -0
  85. package/dist/utils/connection.utils.d.ts +4 -0
  86. package/dist/utils/connection.utils.js +17 -0
  87. package/dist/utils/connection.utils.js.map +1 -0
  88. package/dist/utils/index.d.ts +3 -0
  89. package/dist/utils/index.js +20 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/object.utils.d.ts +1 -0
  92. package/dist/utils/object.utils.js +8 -0
  93. package/dist/utils/object.utils.js.map +1 -0
  94. package/dist/utils/types.utils.d.ts +1 -0
  95. package/dist/utils/types.utils.js +3 -0
  96. package/dist/utils/types.utils.js.map +1 -0
  97. package/package.json +51 -45
  98. package/tsconfig.json +4 -1
  99. package/.dockerignore +0 -5
  100. package/.husky/pre-commit +0 -9
  101. package/dist/connect/app.module.d.ts +0 -4
  102. package/dist/connect/app.module.js.map +0 -1
  103. package/dist/connect/retry.d.ts +0 -2
  104. package/dist/connect/retry.js +0 -13
  105. package/dist/connect/retry.js.map +0 -1
  106. package/dist/main.d.ts +0 -1
  107. package/dist/main.js +0 -24
  108. package/dist/main.js.map +0 -1
  109. package/dist/service/app.module.d.ts +0 -4
  110. package/dist/service/app.module.js +0 -29
  111. package/dist/service/app.module.js.map +0 -1
  112. package/dist/service/sender.service.d.ts +0 -7
  113. package/dist/service/sender.service.js +0 -63
  114. package/dist/service/sender.service.js.map +0 -1
  115. package/dist/transports/rmq/app.controller.d.ts +0 -9
  116. package/dist/transports/rmq/app.controller.js +0 -59
  117. package/dist/transports/rmq/app.controller.js.map +0 -1
  118. package/dist/transports/rmq/app.service.d.ts +0 -20
  119. package/dist/transports/rmq/app.service.js +0 -61
  120. package/dist/transports/rmq/app.service.js.map +0 -1
  121. package/dist/transports/rmq/connection.d.ts +0 -3
  122. package/dist/transports/rmq/connection.js +0 -33
  123. package/dist/transports/rmq/connection.js.map +0 -1
  124. package/dist/transports/tcp/app.controller.d.ts +0 -8
  125. package/dist/transports/tcp/app.controller.js +0 -54
  126. package/dist/transports/tcp/app.controller.js.map +0 -1
  127. package/dist/transports/tcp/app.service.d.ts +0 -19
  128. package/dist/transports/tcp/app.service.js +0 -56
  129. package/dist/transports/tcp/app.service.js.map +0 -1
  130. package/dist/transports/tcp/connection.d.ts +0 -8
  131. package/dist/transports/tcp/connection.js +0 -13
  132. package/dist/transports/tcp/connection.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import { Inject } from '@nestjs/common';
2
+ export type InjectDecorator = ReturnType<typeof Inject>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=decorators.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.types.js","sourceRoot":"","sources":["../../src/types/decorators.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { IGateway } from '../interfaces';
2
+ export type GatewayClass = {
3
+ new (...args: any[]): IGateway;
4
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=gateway.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.class.js","sourceRoot":"","sources":["../../src/types/gateway.class.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export * from './templates.types';
2
+ export * from './decorators.types';
3
+ export * from './gateway.class';
4
+ export * from './options.types';
5
+ export * from './sendgrid-options.types';
6
+ export * from './slack-options.types';
7
+ export * from './smtp-options.types';
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./templates.types"), exports);
18
+ __exportStar(require("./decorators.types"), exports);
19
+ __exportStar(require("./gateway.class"), exports);
20
+ __exportStar(require("./options.types"), exports);
21
+ __exportStar(require("./sendgrid-options.types"), exports);
22
+ __exportStar(require("./slack-options.types"), exports);
23
+ __exportStar(require("./smtp-options.types"), exports);
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,qDAAmC;AACnC,kDAAgC;AAChC,kDAAgC;AAChC,2DAAyC;AACzC,wDAAsC;AACtC,uDAAqC"}
@@ -0,0 +1,16 @@
1
+ import { ExtendsOrEmpty } from '../utils';
2
+ import { GatewayClass } from './gateway.class';
3
+ import { SendgridOptions } from './sendgrid-options.types';
4
+ import { SlackOptions } from './slack-options.types';
5
+ import { SmtpOptions } from './smtp-options.types';
6
+ export type Gateway = 'smtp' | 'console' | 'slack' | 'sendgrid';
7
+ export type MailOptions<TGateway extends Gateway = Gateway> = {
8
+ readonly gateways: [TGateway, ...TGateway[]];
9
+ readonly customGateways?: [GatewayClass, ...GatewayClass[]];
10
+ } & ExtendsOrEmpty<'smtp', TGateway, {
11
+ smtp: SmtpOptions;
12
+ }> & ExtendsOrEmpty<'slack', TGateway, {
13
+ slack: SlackOptions;
14
+ }> & ExtendsOrEmpty<'sendgrid', TGateway, {
15
+ sendgrid: SendgridOptions;
16
+ }>;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=options.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.types.js","sourceRoot":"","sources":["../../src/types/options.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type SendgridOptions = {
2
+ readonly apiKey: string;
3
+ readonly sender: string;
4
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=sendgrid-options.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendgrid-options.types.js","sourceRoot":"","sources":["../../src/types/sendgrid-options.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export type SlackOptions = {
2
+ readonly url: string;
3
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=slack-options.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-options.types.js","sourceRoot":"","sources":["../../src/types/slack-options.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export type SmtpOptions = {
2
+ readonly host: string;
3
+ readonly port: number;
4
+ readonly username: string;
5
+ readonly password: string;
6
+ readonly sender: string;
7
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=smtp-options.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smtp-options.types.js","sourceRoot":"","sources":["../../src/types/smtp-options.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export type Content = {
2
+ subject?: string;
3
+ html: string;
4
+ plain?: string;
5
+ };
6
+ export type TemplatePathsOrContent = {
7
+ htmlPath: string;
8
+ plain?: string;
9
+ plainPath?: string;
10
+ subject?: string;
11
+ subjectPath?: string;
12
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=templates.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.types.js","sourceRoot":"","sources":["../../src/types/templates.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { Gateway } from '../types';
2
+ export declare function getMailOptionsToken(connection?: string): string;
3
+ export declare function getGatewayOptionsToken(gateway: Gateway, connection?: string): string;
4
+ export declare function getGatewaysToken(connection?: string): string;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGatewaysToken = exports.getGatewayOptionsToken = exports.getMailOptionsToken = void 0;
4
+ const constants_1 = require("../constants");
5
+ function getMailOptionsToken(connection) {
6
+ return `${connection || constants_1.MAIL_MODULE_CONSTANTS.DEFAULT_CONNECTION}_${constants_1.MAIL_MODULE_CONSTANTS.OPTIONS_TOKEN}`;
7
+ }
8
+ exports.getMailOptionsToken = getMailOptionsToken;
9
+ function getGatewayOptionsToken(gateway, connection) {
10
+ return `${connection || constants_1.MAIL_MODULE_CONSTANTS.DEFAULT_CONNECTION}_${constants_1.MAIL_MODULE_CONSTANTS.OPTIONS_TOKEN}_${gateway}`;
11
+ }
12
+ exports.getGatewayOptionsToken = getGatewayOptionsToken;
13
+ function getGatewaysToken(connection) {
14
+ return `${connection || constants_1.MAIL_MODULE_CONSTANTS.DEFAULT_CONNECTION}_${constants_1.MAIL_MODULE_CONSTANTS.GATEWAYS_TOKEN}`;
15
+ }
16
+ exports.getGatewaysToken = getGatewaysToken;
17
+ //# sourceMappingURL=connection.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.utils.js","sourceRoot":"","sources":["../../src/utils/connection.utils.ts"],"names":[],"mappings":";;;AAAA,4CAAqD;AAGrD,SAAgB,mBAAmB,CAAC,UAAmB;IACrD,OAAO,GAAG,UAAU,IAAI,iCAAqB,CAAC,kBAAkB,IAAI,iCAAqB,CAAC,aAAa,EAAE,CAAC;AAC5G,CAAC;AAFD,kDAEC;AAED,SAAgB,sBAAsB,CAAC,OAAgB,EAAE,UAAmB;IAC1E,OAAO,GAAG,UAAU,IAAI,iCAAqB,CAAC,kBAAkB,IAAI,iCAAqB,CAAC,aAAa,IAAI,OAAO,EAAE,CAAC;AACvH,CAAC;AAFD,wDAEC;AAED,SAAgB,gBAAgB,CAAC,UAAmB;IAClD,OAAO,GAAG,UAAU,IAAI,iCAAqB,CAAC,kBAAkB,IAAI,iCAAqB,CAAC,cAAc,EAAE,CAAC;AAC7G,CAAC;AAFD,4CAEC"}
@@ -0,0 +1,3 @@
1
+ export * from './connection.utils';
2
+ export * from './object.utils';
3
+ export * from './types.utils';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./connection.utils"), exports);
18
+ __exportStar(require("./object.utils"), exports);
19
+ __exportStar(require("./types.utils"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC;AACnC,iDAA+B;AAC/B,gDAA8B"}
@@ -0,0 +1 @@
1
+ export declare function isDefined<T>(value: T): value is NonNullable<T>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isDefined = void 0;
4
+ function isDefined(value) {
5
+ return value !== undefined && value !== null;
6
+ }
7
+ exports.isDefined = isDefined;
8
+ //# sourceMappingURL=object.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.utils.js","sourceRoot":"","sources":["../../src/utils/object.utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,SAAS,CAAI,KAAQ;IACnC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/C,CAAC;AAFD,8BAEC"}
@@ -0,0 +1 @@
1
+ export type ExtendsOrEmpty<T, U, Res> = T extends U ? Res : {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.utils.js","sourceRoot":"","sources":["../../src/utils/types.utils.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixelplex/mail-service",
3
- "version": "0.1.22",
3
+ "version": "0.2.1",
4
4
  "description": "Mail service",
5
5
  "author": "dev@pixelplex.io",
6
6
  "private": false,
@@ -10,63 +10,61 @@
10
10
  "prebuild": "rimraf dist",
11
11
  "build": "nest build",
12
12
  "format": "prettier --write \"src/**/*.ts\"",
13
- "start": "nest start",
14
- "start:dev": "nest start --watch",
15
- "start:debug": "nest start --debug --watch",
16
- "start:prod": "node dist/main",
17
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
13
+ "lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
14
+ "lint:fix": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
18
15
  "test": "jest",
19
16
  "test:watch": "jest --watch",
20
17
  "test:cov": "jest --coverage",
21
18
  "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
22
19
  "test:e2e": "jest --config ./test/jest-e2e.json",
23
20
  "audit": "audit-ci --config audit-ci.json",
24
- "prepare": "husky install"
21
+ "prepare": "husky install",
22
+ "type-check": "tsc --pretty --noEmit",
23
+ "commit": "git-cz"
25
24
  },
26
25
  "dependencies": {
27
- "@nestjs/common": "^7.5.1",
28
- "@nestjs/core": "^7.5.1",
29
- "@nestjs/microservices": "^7.5.2",
30
- "@nestjs/platform-express": "^7.5.1",
31
- "@sentry/node": "^5.27.4",
32
- "amqp-connection-manager": "^3.2.1",
33
- "amqplib": "^0.6.0",
34
- "config": "^3.3.2",
35
- "express-handlebars": "^5.2.0",
36
- "handlebars": "^4.7.6",
37
- "nodemailer": "^6.7.2",
38
- "nodemailer-express-handlebars": "^4.0.0",
26
+ "@nestjs/common": "^9.4.3",
27
+ "@nestjs/core": "^9.4.3",
28
+ "@sendgrid/mail": "^7.7.0",
29
+ "axios": "^1.4.0",
30
+ "handlebars": "^4.7.7",
31
+ "nodemailer": "^6.9.3",
39
32
  "reflect-metadata": "^0.1.13",
40
- "rimraf": "^3.0.2",
41
- "rxjs": "^6.6.3"
33
+ "rimraf": "^3.0.2"
42
34
  },
43
35
  "devDependencies": {
44
- "@nestjs/cli": "^7.5.1",
45
- "@nestjs/schematics": "^7.1.3",
46
- "@nestjs/testing": "^7.5.1",
47
- "@types/express": "^4.17.8",
48
- "@types/jest": "^26.0.15",
49
- "@types/node": "^14.14.6",
50
- "@types/supertest": "^2.0.10",
51
- "@typescript-eslint/eslint-plugin": "^5.3.0",
52
- "@typescript-eslint/eslint-plugin-tslint": "^5.3.0",
53
- "@typescript-eslint/parser": "^5.3.0",
36
+ "@commitlint/cli": "^17.6.6",
37
+ "@commitlint/config-conventional": "^17.6.6",
38
+ "@commitlint/cz-commitlint": "^17.5.0",
39
+ "@nestjs/cli": "^9.5.0",
40
+ "@nestjs/schematics": "^9.2.0",
41
+ "@nestjs/testing": "^9.4.3",
42
+ "@types/node": "^18.16.18",
43
+ "@types/jest": "^29.5.0",
44
+ "@types/nodemailer": "^6.4.8",
45
+ "@types/supertest": "^2.0.12",
46
+ "@typescript-eslint/eslint-plugin": "^5.60.1",
47
+ "@typescript-eslint/eslint-plugin-tslint": "^5.60.1",
48
+ "@typescript-eslint/parser": "^5.60.1",
54
49
  "audit-ci": "^5.1.2",
55
- "eslint": "^8.2.0",
56
- "eslint-config-prettier": "^8.3.0",
57
- "eslint-import-resolver-typescript": "^2.5.0",
58
- "eslint-plugin-import": "^2.25.2",
59
- "eslint-plugin-prettier": "^4.0.0",
60
- "husky": "^7.0.2",
61
- "jest": "^26.6.3",
62
- "prettier": "^2.5.1",
50
+ "commitizen": "^4.3.0",
51
+ "eslint": "^8.43.0",
52
+ "eslint-config-prettier": "^8.8.0",
53
+ "eslint-import-resolver-typescript": "^3.5.5",
54
+ "eslint-plugin-import": "^2.27.5",
55
+ "eslint-plugin-prettier": "^4.2.1",
56
+ "husky": "^8.0.3",
57
+ "jest": "^29.6.1",
58
+ "lint-staged": "^13.2.2",
59
+ "prettier": "^2.8.7",
63
60
  "pretty-quick": "^3.1.3",
64
- "supertest": "^6.0.0",
65
- "ts-jest": "^26.4.3",
66
- "ts-loader": "^8.0.8",
67
- "ts-node": "^9.0.0",
68
- "tsconfig-paths": "^3.9.0",
69
- "typescript": "^4.0.5"
61
+ "supertest": "^6.3.3",
62
+ "ts-jest": "^29.1.0",
63
+ "ts-loader": "^9.4.2",
64
+ "ts-node": "^10.9.1",
65
+ "tsconfig-paths": "^4.2.0",
66
+ "tslint": "^6.1.3",
67
+ "typescript": "^5.1.6"
70
68
  },
71
69
  "jest": {
72
70
  "moduleFileExtensions": [
@@ -84,5 +82,13 @@
84
82
  ],
85
83
  "coverageDirectory": "../coverage",
86
84
  "testEnvironment": "node"
85
+ },
86
+ "lint-staged": {
87
+ "*.ts": "eslint --fix"
88
+ },
89
+ "config": {
90
+ "commitizen": {
91
+ "path": "@commitlint/cz-commitlint"
92
+ }
87
93
  }
88
94
  }
package/tsconfig.json CHANGED
@@ -6,10 +6,13 @@
6
6
  "emitDecoratorMetadata": true,
7
7
  "experimentalDecorators": true,
8
8
  "allowSyntheticDefaultImports": true,
9
+ "esModuleInterop": true,
9
10
  "target": "es2017",
10
11
  "sourceMap": true,
11
12
  "outDir": "./dist",
12
13
  "baseUrl": "./",
13
- "incremental": true
14
+ "incremental": true,
15
+ "strict": true,
16
+ "typeRoots": ["node_modules/@types"]
14
17
  }
15
18
  }
package/.dockerignore DELETED
@@ -1,5 +0,0 @@
1
- node_modules
2
- config/local.json
3
- dist
4
- templates
5
- docker-compose.yml
package/.husky/pre-commit DELETED
@@ -1,9 +0,0 @@
1
- #!/bin/sh
2
- . "$(dirname "$0")/_/husky.sh"
3
-
4
- if [[ "$NO_LINT" ]]; then
5
- exit 0
6
- fi
7
-
8
- npx pretty-quick --staged
9
- yarn lint
@@ -1,4 +0,0 @@
1
- import { DynamicModule } from '@nestjs/common';
2
- export declare class MailModule {
3
- static forRoot(): Promise<DynamicModule>;
4
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/connect/app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AAEvD,mCAAsC;AAGtC,IAAa,UAAU,kBAAvB,MAAa,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,OAAO;QAClB,MAAM,EAAE,WAAW,EAAE,GAAG,2CAAa,iBAAiB,qBAAY,CAAC,SAAS,cAAc,EAAC,CAAC;QAC5F,OAAO;YACL,MAAM,EAAE,YAAU;YAClB,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,CAAC,WAAW,CAAC;YACxB,OAAO,EAAE,CAAC,WAAW,CAAC;SACvB,CAAC;IACJ,CAAC;CACF,CAAA;AAVY,UAAU;IADtB,eAAM,CAAC,EAAE,CAAC;GACE,UAAU,CAUtB;AAVY,gCAAU"}
@@ -1,2 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- export default function retry(retryAttempts?: number, retryDelay?: number): <T>(source: Observable<T>) => Observable<T>;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const operators_1 = require("rxjs/operators");
4
- function retry(retryAttempts = 10, retryDelay = 10000) {
5
- return (source) => source.pipe(operators_1.retryWhen((e) => e.pipe(operators_1.scan((acc, error) => {
6
- if (acc + 1 >= retryAttempts) {
7
- throw error;
8
- }
9
- return acc + 1;
10
- }, 0), operators_1.delay(retryDelay))));
11
- }
12
- exports.default = retry;
13
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/connect/retry.ts"],"names":[],"mappings":";;AACA,8CAAwD;AAExD,SAAwB,KAAK,CAAC,aAAa,GAAG,EAAE,EAAE,UAAU,GAAG,KAAK;IAClE,OAAO,CAAI,MAAqB,EAAE,EAAE,CAClC,MAAM,CAAC,IAAI,CACT,qBAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CACd,CAAC,CAAC,IAAI,CACJ,gBAAI,CAAC,CAAC,GAAW,EAAE,KAAY,EAAE,EAAE;QACjC,IAAI,GAAG,GAAG,CAAC,IAAI,aAAa,EAAE;YAC5B,MAAM,KAAK,CAAC;SACb;QACD,OAAO,GAAG,GAAG,CAAC,CAAC;IACjB,CAAC,EAAE,CAAC,CAAC,EACL,iBAAK,CAAC,UAAU,CAAC,CAClB,CACF,CACF,CAAC;AACN,CAAC;AAfD,wBAeC"}
package/dist/main.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
package/dist/main.js DELETED
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const core_1 = require("@nestjs/core");
4
- const common_1 = require("@nestjs/common");
5
- const Sentry = require("@sentry/node");
6
- const config_1 = require("config");
7
- const app_module_1 = require("./service/app.module");
8
- const logger = new common_1.Logger('Mail::Application');
9
- if (config_1.SENTRY.ENABLED && config_1.SENTRY.DSN) {
10
- Sentry.init({
11
- dsn: config_1.SENTRY.DSN,
12
- });
13
- logger.log('Sentry is initialized');
14
- }
15
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
16
- async function bootstrap() {
17
- const { generalClient } = await Promise.resolve().then(() => require(`./transports/${config_1.MAIL_SERVICE.TRANSPORT}/connection`));
18
- const app = await core_1.NestFactory.createMicroservice(app_module_1.AppModule.forRoot(), generalClient);
19
- await app.listen(() => {
20
- logger.log(`${config_1.MAIL_SERVICE.TRANSPORT.toLocaleUpperCase()} Connected. Service is started`);
21
- });
22
- }
23
- bootstrap();
24
- //# sourceMappingURL=main.js.map
package/dist/main.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAE3C,2CAAwC;AACxC,uCAAuC;AACvC,mCAA8C;AAC9C,qDAAiD;AAEjD,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/C,IAAI,eAAM,CAAC,OAAO,IAAI,eAAM,CAAC,GAAG,EAAE;IAChC,MAAM,CAAC,IAAI,CAAC;QACV,GAAG,EAAE,eAAM,CAAC,GAAG;KAChB,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;CACrC;AAED,4EAA4E;AAC5E,KAAK,UAAU,SAAS;IACtB,MAAM,EAAE,aAAa,EAAE,GAAG,2CAAa,gBAAgB,qBAAY,CAAC,SAAS,aAAa,EAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,kBAAkB,CAAsB,sBAAS,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;IAC1G,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;QACpB,MAAM,CAAC,GAAG,CAAC,GAAG,qBAAY,CAAC,SAAS,CAAC,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACL,CAAC;AACD,SAAS,EAAE,CAAC"}
@@ -1,4 +0,0 @@
1
- import { DynamicModule } from '@nestjs/common';
2
- export declare class AppModule {
3
- static forRoot(): Promise<DynamicModule>;
4
- }
@@ -1,29 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var AppModule_1;
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.AppModule = void 0;
11
- const common_1 = require("@nestjs/common");
12
- const config_1 = require("config");
13
- const sender_service_1 = require("./sender.service");
14
- let AppModule = AppModule_1 = class AppModule {
15
- static async forRoot() {
16
- const { AppController } = await Promise.resolve().then(() => require(`../transports/${config_1.MAIL_SERVICE.TRANSPORT}/app.controller`));
17
- return {
18
- module: AppModule_1,
19
- imports: [],
20
- controllers: [AppController],
21
- providers: [sender_service_1.SenderService],
22
- };
23
- }
24
- };
25
- AppModule = AppModule_1 = __decorate([
26
- common_1.Module({})
27
- ], AppModule);
28
- exports.AppModule = AppModule;
29
- //# sourceMappingURL=app.module.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../../src/service/app.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,mCAAsC;AACtC,qDAAiD;AAGjD,IAAa,SAAS,iBAAtB,MAAa,SAAS;IACpB,MAAM,CAAC,KAAK,CAAC,OAAO;QAClB,MAAM,EAAE,aAAa,EAAE,GAAG,2CAAa,iBAAiB,qBAAY,CAAC,SAAS,iBAAiB,EAAC,CAAC;QACjG,OAAO;YACL,MAAM,EAAE,WAAS;YACjB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,CAAC,aAAa,CAAC;YAC5B,SAAS,EAAE,CAAC,8BAAa,CAAC;SAC3B,CAAC;IACJ,CAAC;CACF,CAAA;AAVY,SAAS;IADrB,eAAM,CAAC,EAAE,CAAC;GACE,SAAS,CAUrB;AAVY,8BAAS"}
@@ -1,7 +0,0 @@
1
- export declare class SenderService {
2
- private transporter;
3
- private readonly logger;
4
- onModuleInit(): Promise<void>;
5
- connect(): Promise<void>;
6
- sendMail(to: string, template: string, context?: {}): Promise<void>;
7
- }
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SenderService = void 0;
4
- const fs = require("fs");
5
- const common_1 = require("@nestjs/common");
6
- const config_1 = require("config");
7
- const Handlebars = require("handlebars");
8
- const nodemailer_1 = require("nodemailer");
9
- const hbs = require("nodemailer-express-handlebars");
10
- const hbsOptions = {
11
- viewEngine: {
12
- layoutsDir: 'templates/',
13
- },
14
- viewPath: 'templates/',
15
- };
16
- class SenderService {
17
- constructor() {
18
- this.logger = new common_1.Logger('Mail::SenderService');
19
- }
20
- async onModuleInit() {
21
- await this.connect();
22
- }
23
- async connect() {
24
- const isEthereal = config_1.MAIL_SERVICE.SMTP.HOST === 'smtp.ethereal.email';
25
- if (!config_1.MAIL_SERVICE.SMTP.PASSWORD && !isEthereal) {
26
- throw new Error(`[NodemailerConnector Error] Password wasn\'t provided.
27
- You should provide the password in ENV Variable or in local.json config file`);
28
- }
29
- let testAccount;
30
- if (isEthereal) {
31
- this.logger.warn('Run in ethereal.email mode');
32
- testAccount = await nodemailer_1.createTestAccount();
33
- }
34
- this.transporter = nodemailer_1.createTransport({
35
- host: config_1.MAIL_SERVICE.SMTP.HOST,
36
- port: config_1.MAIL_SERVICE.SMTP.PORT,
37
- auth: {
38
- user: config_1.MAIL_SERVICE.SMTP.USERNAME || testAccount.user,
39
- pass: config_1.MAIL_SERVICE.SMTP.PASSWORD || testAccount.pass,
40
- },
41
- });
42
- this.transporter.use('compile', hbs(hbsOptions));
43
- this.logger.log('Connected');
44
- }
45
- async sendMail(to, template, context = {}) {
46
- this.logger.debug(`New message to "${to}" with template "${template}"`);
47
- const subjectTpl = Handlebars.compile(fs.readFileSync(`templates/${template}.subject.handlebars`).toString());
48
- const info = await this.transporter.sendMail({
49
- from: config_1.MAIL_SERVICE.SMTP.SENDER,
50
- to,
51
- subject: subjectTpl(context),
52
- template,
53
- context,
54
- });
55
- this.logger.debug(`Message sent: ${info.messageId}, ${info.response}`);
56
- const isEthereal = config_1.MAIL_SERVICE.SMTP.HOST === 'smtp.ethereal.email';
57
- if (isEthereal) {
58
- this.logger.debug(`Preview URL: ${nodemailer_1.getTestMessageUrl(info)}`);
59
- }
60
- }
61
- }
62
- exports.SenderService = SenderService;
63
- //# sourceMappingURL=sender.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sender.service.js","sourceRoot":"","sources":["../../src/service/sender.service.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACzB,2CAAwC;AACxC,mCAAsC;AACtC,yCAAyC;AACzC,2CAAgG;AAChG,qDAAqD;AAErD,MAAM,UAAU,GAAG;IACjB,UAAU,EAAE;QACV,UAAU,EAAE,YAAY;KACzB;IACD,QAAQ,EAAE,YAAY;CACvB,CAAC;AAEF,MAAa,aAAa;IAA1B;QAEmB,WAAM,GAAW,IAAI,eAAM,CAAC,qBAAqB,CAAC,CAAC;IAgDtE,CAAC;IA9CC,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,UAAU,GAAG,qBAAY,CAAC,IAAI,CAAC,IAAI,KAAK,qBAAqB,CAAC;QACpE,IAAI,CAAC,qBAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE;YAC9C,MAAM,IAAI,KAAK,CACb;qFAC6E,CAC9E,CAAC;SACH;QAED,IAAI,WAAW,CAAC;QAChB,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,WAAW,GAAG,MAAM,8BAAiB,EAAE,CAAC;SACzC;QACD,IAAI,CAAC,WAAW,GAAG,4BAAe,CAAC;YACjC,IAAI,EAAE,qBAAY,CAAC,IAAI,CAAC,IAAI;YAC5B,IAAI,EAAE,qBAAY,CAAC,IAAI,CAAC,IAAI;YAC5B,IAAI,EAAE;gBACJ,IAAI,EAAE,qBAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI;gBACpD,IAAI,EAAE,qBAAY,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI;aACrD;SACF,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,QAAgB,EAAE,OAAO,GAAG,EAAE;QACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,oBAAoB,QAAQ,GAAG,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,QAAQ,qBAAqB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9G,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;YAC3C,IAAI,EAAE,qBAAY,CAAC,IAAI,CAAC,MAAM;YAC9B,EAAE;YACF,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;YAC5B,QAAQ;YACR,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,qBAAY,CAAC,IAAI,CAAC,IAAI,KAAK,qBAAqB,CAAC;QACpE,IAAI,UAAU,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,8BAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC9D;IACH,CAAC;CACF;AAlDD,sCAkDC"}
@@ -1,9 +0,0 @@
1
- import { RmqContext } from '@nestjs/microservices';
2
- import { MailMessage } from '../../mail';
3
- import { SenderService } from '../../service/sender.service';
4
- export declare class AppController {
5
- private readonly senderService;
6
- private logger;
7
- constructor(senderService: SenderService);
8
- getHello(data: MailMessage, context: RmqContext): Promise<void>;
9
- }