nesthub 1.0.0 → 1.0.2

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 (66) hide show
  1. package/README.md +0 -1
  2. package/dist/index.d.ts +4 -1
  3. package/dist/index.js +18 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/queue/README.md +1 -1
  6. package/dist/queue/index.d.ts +4 -9
  7. package/dist/queue/index.js +5 -1
  8. package/dist/queue/index.js.map +1 -1
  9. package/dist/tsconfig.build.tsbuildinfo +1 -1
  10. package/package.json +1 -1
  11. package/src/queue/README.md +1 -1
  12. package/dist/cache/index.spec.d.ts +0 -1
  13. package/dist/cache/index.spec.js +0 -61
  14. package/dist/cache/index.spec.js.map +0 -1
  15. package/dist/excel/excel.module.d.ts +0 -2
  16. package/dist/excel/excel.module.js +0 -21
  17. package/dist/excel/excel.module.js.map +0 -1
  18. package/dist/excel/interfaces.d.ts +0 -19
  19. package/dist/excel/interfaces.js +0 -3
  20. package/dist/excel/interfaces.js.map +0 -1
  21. package/dist/index.spec.d.ts +0 -1
  22. package/dist/index.spec.js +0 -11
  23. package/dist/index.spec.js.map +0 -1
  24. package/dist/notification/email/index.d.ts +0 -62
  25. package/dist/notification/email/index.js +0 -253
  26. package/dist/notification/email/index.js.map +0 -1
  27. package/dist/notification/email/index.spec.d.ts +0 -1
  28. package/dist/notification/email/index.spec.js +0 -121
  29. package/dist/notification/email/index.spec.js.map +0 -1
  30. package/dist/notification/firebase/index.d.ts +0 -52
  31. package/dist/notification/firebase/index.js +0 -261
  32. package/dist/notification/firebase/index.js.map +0 -1
  33. package/dist/notification/firebase/index.spec.d.ts +0 -1
  34. package/dist/notification/firebase/index.spec.js +0 -114
  35. package/dist/notification/firebase/index.spec.js.map +0 -1
  36. package/dist/notification/index.spec.d.ts +0 -1
  37. package/dist/notification/index.spec.js +0 -336
  38. package/dist/notification/index.spec.js.map +0 -1
  39. package/dist/notification/shared.d.ts +0 -48
  40. package/dist/notification/shared.js +0 -95
  41. package/dist/notification/shared.js.map +0 -1
  42. package/dist/notification/sms/index.d.ts +0 -52
  43. package/dist/notification/sms/index.js +0 -234
  44. package/dist/notification/sms/index.js.map +0 -1
  45. package/dist/notification/sms/index.spec.d.ts +0 -1
  46. package/dist/notification/sms/index.spec.js +0 -123
  47. package/dist/notification/sms/index.spec.js.map +0 -1
  48. package/dist/notification/telegram/index.d.ts +0 -50
  49. package/dist/notification/telegram/index.js +0 -248
  50. package/dist/notification/telegram/index.js.map +0 -1
  51. package/dist/notification/telegram/index.spec.d.ts +0 -1
  52. package/dist/notification/telegram/index.spec.js +0 -108
  53. package/dist/notification/telegram/index.spec.js.map +0 -1
  54. package/dist/notification/typeorm-storage.d.ts +0 -28
  55. package/dist/notification/typeorm-storage.js +0 -56
  56. package/dist/notification/typeorm-storage.js.map +0 -1
  57. package/dist/notification/unified.d.ts +0 -47
  58. package/dist/notification/unified.js +0 -207
  59. package/dist/notification/unified.js.map +0 -1
  60. package/dist/queue/index.spec.d.ts +0 -1
  61. package/dist/queue/index.spec.js +0 -76
  62. package/dist/queue/index.spec.js.map +0 -1
  63. package/dist/tsconfig.tsbuildinfo +0 -1
  64. package/dist/typeorm/index.spec.d.ts +0 -1
  65. package/dist/typeorm/index.spec.js +0 -109
  66. package/dist/typeorm/index.spec.js.map +0 -1
@@ -1,234 +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 __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var SmsModule_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.SmsModule = exports.SMS_SERVICE = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const shared_1 = require("../shared");
19
- const typeorm_storage_1 = require("../typeorm-storage");
20
- exports.SMS_SERVICE = 'SMS_SERVICE';
21
- let SmsServiceImpl = class SmsServiceImpl {
22
- options;
23
- injectedStorage;
24
- templateService = new shared_1.TemplateService();
25
- twilioClient;
26
- queueClient;
27
- workerClient;
28
- storage;
29
- constructor(options, injectedStorage) {
30
- this.options = options;
31
- this.injectedStorage = injectedStorage;
32
- this.storage =
33
- injectedStorage ??
34
- options.storage?.provider ??
35
- new shared_1.ConsoleNotificationStorage();
36
- }
37
- async onModuleInit() {
38
- const { templates, twilio, queue } = this.options;
39
- if (templates?.dir)
40
- await this.templateService.loadFromDir(templates.dir);
41
- if (templates?.templates)
42
- this.templateService.loadFromRecord(templates.templates);
43
- if (twilio?.accountSid && twilio?.authToken) {
44
- try {
45
- const twilioModule = (await (0, shared_1.dynamicImport)('twilio'));
46
- this.twilioClient = twilioModule.default(twilio.accountSid, twilio.authToken);
47
- }
48
- catch {
49
- console.warn('[SmsModule] twilio not installed. Falling back to console.');
50
- }
51
- }
52
- if (queue?.useQueue && queue?.connection?.url) {
53
- try {
54
- const bullmqModule = (await (0, shared_1.dynamicImport)('bullmq'));
55
- const queueName = queue.prefix ?? 'sms-notifications';
56
- this.queueClient = new bullmqModule.Queue(queueName, {
57
- connection: { url: queue.connection.url },
58
- defaultJobOptions: queue.defaultJobOptions,
59
- });
60
- if (queue.worker !== false) {
61
- this.workerClient = new bullmqModule.Worker(queueName, async (job) => this.processQueuedJob(job), {
62
- connection: { url: queue.connection.url },
63
- concurrency: queue.concurrency ?? 1,
64
- });
65
- }
66
- }
67
- catch {
68
- console.warn('[SmsModule] bullmq not installed. Queue mode disabled.');
69
- }
70
- }
71
- }
72
- async onModuleDestroy() {
73
- await this.workerClient?.close();
74
- await this.queueClient?.close();
75
- }
76
- async sendSms(options) {
77
- if ((options.mode ?? 'direct') === 'queue' && this.queueClient) {
78
- return this.enqueue(options);
79
- }
80
- return this.sendNow(options);
81
- }
82
- async cancelJob(dedupId) {
83
- if (!this.queueClient)
84
- return;
85
- const record = await this.storage.findByDedupId(dedupId);
86
- if (!record || record.status !== 'pending')
87
- return;
88
- try {
89
- await this.queueClient.remove(record.id);
90
- }
91
- catch {
92
- }
93
- await this.storage.update(record.id, { status: 'cancelled' });
94
- }
95
- async processQueuedJob(job) {
96
- const { data } = job;
97
- if (data.expiresAt && new Date(data.expiresAt) < new Date()) {
98
- await this.storage.update(job.id, {
99
- status: 'expired',
100
- error: 'Expired before processing',
101
- });
102
- return;
103
- }
104
- if (data.dedupId) {
105
- const record = await this.storage.findByDedupId(data.dedupId);
106
- if (record &&
107
- (record.status === 'cancelled' || record.status === 'expired'))
108
- return;
109
- }
110
- const result = await this.sendNow(data);
111
- await this.storage.update(job.id, {
112
- status: result.success ? 'sent' : 'failed',
113
- messageId: result.messageId,
114
- error: result.error,
115
- sentAt: new Date().toISOString(),
116
- });
117
- }
118
- async sendNow(options) {
119
- try {
120
- const { to, body, template, context = {}, locale, from } = options;
121
- const resolvedLocale = locale ?? this.options.defaultLocale ?? 'en';
122
- const ctx = { ...context, locale: resolvedLocale };
123
- let resolvedBody = body;
124
- if (template) {
125
- const tmplName = this.templateService.resolveName(template, resolvedLocale);
126
- if (!resolvedBody) {
127
- resolvedBody =
128
- this.templateService.render(`body:${tmplName}`, ctx) ||
129
- this.templateService.render(tmplName, ctx);
130
- }
131
- }
132
- if (!resolvedBody) {
133
- return { success: false, error: 'No content to send' };
134
- }
135
- if (this.twilioClient) {
136
- const message = await this.twilioClient.messages.create({
137
- to,
138
- from: from ?? this.options.twilio?.from ?? this.options.defaultFrom,
139
- body: resolvedBody,
140
- });
141
- return { success: true, messageId: message.sid };
142
- }
143
- console.log('[SmsService] SMS:', JSON.stringify({ to, from, body: resolvedBody }));
144
- return { success: true, messageId: `mock-${Date.now()}` };
145
- }
146
- catch (error) {
147
- const message = error instanceof Error ? error.message : 'Unknown error';
148
- return { success: false, error: message };
149
- }
150
- }
151
- async enqueue(options) {
152
- try {
153
- const jobOpts = {};
154
- if (options.dedupId)
155
- jobOpts.deduplication = { id: options.dedupId };
156
- const job = await this.queueClient.add('send-sms', options, jobOpts);
157
- await this.storage.save({
158
- id: job.id ?? '',
159
- to: options.to,
160
- body: options.body,
161
- template: options.template,
162
- channel: 'sms',
163
- status: 'pending',
164
- expiresAt: options.expiresAt
165
- ? new Date(options.expiresAt).toISOString()
166
- : undefined,
167
- dedupId: options.dedupId,
168
- createdAt: new Date().toISOString(),
169
- });
170
- return { success: true, messageId: job.id, jobId: job.id };
171
- }
172
- catch (error) {
173
- const message = error instanceof Error ? error.message : 'Unknown error';
174
- return { success: false, error: message };
175
- }
176
- }
177
- };
178
- SmsServiceImpl = __decorate([
179
- (0, common_1.Injectable)(),
180
- __param(0, (0, common_1.Inject)('SMS_MODULE_OPTIONS')),
181
- __param(1, (0, common_1.Optional)()),
182
- __param(1, (0, common_1.Inject)(shared_1.NOTIFICATION_STORAGE)),
183
- __metadata("design:paramtypes", [Object, Object])
184
- ], SmsServiceImpl);
185
- let SmsModule = SmsModule_1 = class SmsModule {
186
- static forRoot(options = {}) {
187
- const providers = [
188
- { provide: 'SMS_MODULE_OPTIONS', useValue: options },
189
- { provide: exports.SMS_SERVICE, useClass: SmsServiceImpl },
190
- ];
191
- const imports = [];
192
- if (options.storage?.typeorm) {
193
- try {
194
- const { TypeOrmModule, getRepositoryToken } = (0, typeorm_storage_1.getTypeOrmHelpers)();
195
- const entity = (0, typeorm_storage_1.getOrCreateEntity)();
196
- imports.push(TypeOrmModule.forFeature([entity]));
197
- providers.push({
198
- provide: shared_1.NOTIFICATION_STORAGE,
199
- useFactory: (repo) => new typeorm_storage_1.TypeOrmNotificationStorage(repo),
200
- inject: [getRepositoryToken(entity)],
201
- });
202
- }
203
- catch {
204
- throw new Error('SmsModule: @nestjs/typeorm and typeorm must be installed when storage.typeorm is true');
205
- }
206
- }
207
- return {
208
- module: SmsModule_1,
209
- imports,
210
- providers,
211
- exports: [exports.SMS_SERVICE],
212
- };
213
- }
214
- static forRootAsync(options) {
215
- return {
216
- module: SmsModule_1,
217
- providers: [
218
- {
219
- provide: 'SMS_MODULE_OPTIONS',
220
- useFactory: options.useFactory,
221
- inject: options.inject ?? [],
222
- },
223
- { provide: exports.SMS_SERVICE, useClass: SmsServiceImpl },
224
- ],
225
- exports: [exports.SMS_SERVICE],
226
- };
227
- }
228
- };
229
- exports.SmsModule = SmsModule;
230
- exports.SmsModule = SmsModule = SmsModule_1 = __decorate([
231
- (0, common_1.Global)(),
232
- (0, common_1.Module)({})
233
- ], SmsModule);
234
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/notification/sms/index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- let nextJobId = 1;
4
- jest.mock('bullmq', () => ({
5
- Queue: jest.fn().mockImplementation(() => ({
6
- add: jest
7
- .fn()
8
- .mockImplementation(() => Promise.resolve({ id: `sms-job-${nextJobId++}` })),
9
- remove: jest.fn().mockResolvedValue(undefined),
10
- close: jest.fn().mockResolvedValue(undefined),
11
- })),
12
- Worker: jest.fn().mockImplementation(() => ({
13
- close: jest.fn().mockResolvedValue(undefined),
14
- })),
15
- }));
16
- const testing_1 = require("@nestjs/testing");
17
- const index_1 = require("./index");
18
- describe('@vn.chemgio/nestjs-utilities/notification/sms', () => {
19
- let service;
20
- let module;
21
- afterEach(async () => {
22
- if (module)
23
- await module.close();
24
- });
25
- it('should send SMS via console fallback', async () => {
26
- module = await testing_1.Test.createTestingModule({
27
- imports: [
28
- index_1.SmsModule.forRoot({
29
- twilio: { accountSid: 'sid', authToken: 'token' },
30
- }),
31
- ],
32
- }).compile();
33
- await module.init();
34
- service = module.get(index_1.SMS_SERVICE);
35
- const result = await service.sendSms({ to: '+84123456789', body: 'Hello' });
36
- expect(result.success).toBe(true);
37
- expect(result.messageId).toMatch(/^mock-/);
38
- });
39
- it('should return no-content error', async () => {
40
- module = await testing_1.Test.createTestingModule({
41
- imports: [
42
- index_1.SmsModule.forRoot({
43
- twilio: { accountSid: 'sid', authToken: 'token' },
44
- }),
45
- ],
46
- }).compile();
47
- await module.init();
48
- service = module.get(index_1.SMS_SERVICE);
49
- const result = await service.sendSms({ to: '+84123456789' });
50
- expect(result.success).toBe(false);
51
- expect(result.error).toBe('No content to send');
52
- });
53
- it('should render handlebars template', async () => {
54
- module = await testing_1.Test.createTestingModule({
55
- imports: [
56
- index_1.SmsModule.forRoot({
57
- twilio: { accountSid: 'sid', authToken: 'token' },
58
- templates: {
59
- templates: {
60
- otp: { body: 'Your code is {{code}}' },
61
- },
62
- },
63
- }),
64
- ],
65
- }).compile();
66
- await module.init();
67
- service = module.get(index_1.SMS_SERVICE);
68
- const result = await service.sendSms({
69
- to: '+84123456789',
70
- template: 'otp',
71
- context: { code: '123456' },
72
- });
73
- expect(result.success).toBe(true);
74
- });
75
- it('should queue SMS and save pending record', async () => {
76
- module = await testing_1.Test.createTestingModule({
77
- imports: [
78
- index_1.SmsModule.forRoot({
79
- twilio: { accountSid: 'sid', authToken: 'token' },
80
- queue: {
81
- useQueue: true,
82
- connection: { url: 'redis://localhost:6379' },
83
- worker: false,
84
- },
85
- }),
86
- ],
87
- }).compile();
88
- await module.init();
89
- service = module.get(index_1.SMS_SERVICE);
90
- const result = await service.sendSms({
91
- to: '+84123456789',
92
- body: 'Queued SMS',
93
- mode: 'queue',
94
- });
95
- expect(result.success).toBe(true);
96
- expect(result.jobId).toMatch(/^sms-job-/);
97
- });
98
- it('should cancel a pending job by dedupId', async () => {
99
- module = await testing_1.Test.createTestingModule({
100
- imports: [
101
- index_1.SmsModule.forRoot({
102
- twilio: { accountSid: 'sid', authToken: 'token' },
103
- queue: {
104
- useQueue: true,
105
- connection: { url: 'redis://localhost:6379' },
106
- worker: false,
107
- },
108
- }),
109
- ],
110
- }).compile();
111
- await module.init();
112
- service = module.get(index_1.SMS_SERVICE);
113
- const sendResult = await service.sendSms({
114
- to: '+84123456789',
115
- body: 'Cancel test',
116
- mode: 'queue',
117
- dedupId: 'sms-cancel-test',
118
- });
119
- expect(sendResult.success).toBe(true);
120
- await service.cancelJob('sms-cancel-test');
121
- });
122
- });
123
- //# sourceMappingURL=index.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../../src/notification/sms/index.spec.ts"],"names":[],"mappings":";;AAAA,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QACzC,GAAG,EAAE,IAAI;aACN,EAAE,EAAE;aACJ,kBAAkB,CAAC,GAAG,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,WAAW,SAAS,EAAE,EAAE,EAAE,CAAC,CAClD;QACH,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC9C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC9C,CAAC,CAAC;IACH,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KAC9C,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,6CAAsD;AACtD,mCAA8D;AAE9D,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,IAAI,OAAoB,CAAC;IACzB,IAAI,MAAqB,CAAC;IAE1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,MAAM;YAAE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE;gBACP,iBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;iBAClD,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE;gBACP,iBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;iBAClD,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE;gBACP,iBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;oBACjD,SAAS,EAAE;wBACT,SAAS,EAAE;4BACT,GAAG,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;yBACvC;qBACF;iBACF,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;YACnC,EAAE,EAAE,cAAc;YAClB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC5B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE;gBACP,iBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;oBACjD,KAAK,EAAE;wBACL,QAAQ,EAAE,IAAI;wBACd,UAAU,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE;wBAC7C,MAAM,EAAE,KAAK;qBACd;iBACF,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;QAElC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;YACnC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YACtC,OAAO,EAAE;gBACP,iBAAS,CAAC,OAAO,CAAC;oBAChB,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;oBACjD,KAAK,EAAE;wBACL,QAAQ,EAAE,IAAI;wBACd,UAAU,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE;wBAC7C,MAAM,EAAE,KAAK;qBACd;iBACF,CAAC;aACH;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC;YACvC,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;QACH,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,50 +0,0 @@
1
- import type { DynamicModule, InjectionToken, OptionalFactoryDependency } from '@nestjs/common';
2
- import type { SendMode, SendResult, NotificationStorage, NotificationTemplate } from '../shared';
3
- export declare const TELEGRAM_SERVICE = "TELEGRAM_SERVICE";
4
- export interface SendTelegramOptions {
5
- chatId: string | number;
6
- text?: string;
7
- parseMode?: 'HTML' | 'MarkdownV2' | 'Markdown';
8
- disableWebPagePreview?: boolean;
9
- disableNotification?: boolean;
10
- replyToMessageId?: number;
11
- template?: string;
12
- context?: Record<string, unknown>;
13
- locale?: string;
14
- mode?: SendMode;
15
- expiresAt?: Date | string;
16
- dedupId?: string;
17
- }
18
- export interface ITelegramService {
19
- sendTelegram(options: SendTelegramOptions): Promise<SendResult>;
20
- cancelJob(dedupId: string): Promise<void>;
21
- }
22
- export interface TelegramModuleOptions {
23
- botToken: string;
24
- defaultLocale?: string;
25
- queue?: {
26
- useQueue?: boolean;
27
- connection?: {
28
- url: string;
29
- };
30
- prefix?: string;
31
- defaultJobOptions?: Record<string, unknown>;
32
- worker?: boolean;
33
- concurrency?: number;
34
- };
35
- templates?: {
36
- dir?: string;
37
- templates?: Record<string, NotificationTemplate>;
38
- };
39
- storage?: {
40
- provider?: NotificationStorage;
41
- typeorm?: boolean;
42
- };
43
- }
44
- export declare class TelegramModule {
45
- static forRoot(options: TelegramModuleOptions): DynamicModule;
46
- static forRootAsync(options: {
47
- useFactory: (...args: unknown[]) => TelegramModuleOptions | Promise<TelegramModuleOptions>;
48
- inject?: (InjectionToken | OptionalFactoryDependency)[];
49
- }): DynamicModule;
50
- }