@globalart/nestjs-typeorm-outbox 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  let _nestjs_common = require("@nestjs/common");
3
3
  let _globalart_text_utils = require("@globalart/text-utils");
4
4
  let typeorm = require("typeorm");
@@ -6,7 +6,6 @@ let rxjs = require("rxjs");
6
6
  let _nestjs_microservices = require("@nestjs/microservices");
7
7
  let cron = require("cron");
8
8
  let _nestjs_typeorm = require("@nestjs/typeorm");
9
-
10
9
  //#region src/core/typeorm-outbox.di-tokens.ts
11
10
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
12
11
  const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN");
@@ -16,22 +15,19 @@ const InjectTypeormOutboxCronConfig = () => (0, _nestjs_common.Inject)(TYPEORM_O
16
15
  const InjectTypeormOutboxModuleConfig = () => (0, _nestjs_common.Inject)(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);
17
16
  const InjectTypeormOutboxService = () => (0, _nestjs_common.Inject)(TYPEORM_OUTBOX_SERVICE_TOKEN);
18
17
  const InjectTypeormOutboxBroker = () => (0, _nestjs_common.Inject)(TYPEORM_OUTBOX_BROKER_TOKEN);
19
-
20
18
  //#endregion
21
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorateMetadata.js
19
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorateMetadata.js
22
20
  function __decorateMetadata(k, v) {
23
21
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
24
22
  }
25
-
26
23
  //#endregion
27
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorate.js
24
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorate.js
28
25
  function __decorate(decorators, target, key, desc) {
29
26
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
27
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
31
28
  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;
32
29
  return c > 3 && r && Object.defineProperty(target, key, r), r;
33
30
  }
34
-
35
31
  //#endregion
36
32
  //#region src/core/typeorm-outbox.entity.ts
37
33
  var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
@@ -52,7 +48,6 @@ __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata
52
48
  __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
53
49
  __decorate([(0, typeorm.Column)("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
54
50
  TypeormOutboxEntity = __decorate([(0, typeorm.Entity)("outbox")], TypeormOutboxEntity);
55
-
56
51
  //#endregion
57
52
  //#region src/core/typeorm-outbox.enums.ts
58
53
  let CronExpression = /* @__PURE__ */ function(CronExpression) {
@@ -118,7 +113,6 @@ let CronExpression = /* @__PURE__ */ function(CronExpression) {
118
113
  CronExpression["EVERY_MINUTE"] = "0 * * * * *";
119
114
  return CronExpression;
120
115
  }({});
121
-
122
116
  //#endregion
123
117
  //#region src/core/typeorm-outbox.interfaces.ts
124
118
  var TypeormOutboxRegisterCronModuleOptions = class {
@@ -129,15 +123,13 @@ var TypeormOutboxRegisterCronModuleOptions = class {
129
123
  var TypeormOutboxModuleOptions = class {
130
124
  typeOrmConnectionName = "default";
131
125
  };
132
-
133
126
  //#endregion
134
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorateParam.js
127
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorateParam.js
135
128
  function __decorateParam(paramIndex, decorator) {
136
129
  return function(target, key) {
137
130
  decorator(target, key, paramIndex);
138
131
  };
139
132
  }
140
-
141
133
  //#endregion
142
134
  //#region src/core/typeorm-outbox-cron.service.ts
143
135
  var _ref$1, _ref2, _ref3;
@@ -206,7 +198,6 @@ TypeormOutboxCronService = __decorate([
206
198
  typeof (_ref3 = typeof typeorm.DataSource !== "undefined" && typeorm.DataSource) === "function" ? _ref3 : Object
207
199
  ])
208
200
  ], TypeormOutboxCronService);
209
-
210
201
  //#endregion
211
202
  //#region src/core/typeorm-outbox.service.ts
212
203
  var _ref;
@@ -228,133 +219,89 @@ TypeormOutboxService = __decorate([
228
219
  __decorateParam(0, (0, _nestjs_typeorm.InjectRepository)(TypeormOutboxEntity)),
229
220
  __decorateMetadata("design:paramtypes", [typeof (_ref = typeof typeorm.Repository !== "undefined" && typeorm.Repository) === "function" ? _ref : Object])
230
221
  ], TypeormOutboxService);
231
-
232
222
  //#endregion
233
223
  //#region src/core/typeorm-outbox.module.ts
234
224
  var _TypeormOutboxModule;
225
+ const serviceProvider = () => ({
226
+ provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
227
+ useClass: TypeormOutboxService
228
+ });
229
+ const brokerProvider = (useValue = {}) => ({
230
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
231
+ useValue
232
+ });
233
+ const typeOrmFeature = (connectionName = "default") => _nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName);
234
+ const mergeModuleOptions = (defaults, overrides) => ({
235
+ ...new defaults(),
236
+ ...overrides
237
+ });
238
+ const moduleConfigProvider = (options) => ({
239
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
240
+ useValue: mergeModuleOptions(TypeormOutboxModuleOptions, options)
241
+ });
242
+ const asyncModuleConfigProvider = (options) => ({
243
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
244
+ useFactory: async (...args) => mergeModuleOptions(TypeormOutboxModuleOptions, await options.useFactory?.(...args)),
245
+ inject: options.inject || []
246
+ });
247
+ const cronConfigProvider = (options) => ({
248
+ provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
249
+ useFactory: async (...args) => mergeModuleOptions(TypeormOutboxRegisterCronModuleOptions, await options.useFactory?.(...args)),
250
+ inject: options.inject || []
251
+ });
252
+ const cronBrokerProvider = (options) => ({
253
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
254
+ useFactory: async (...args) => {
255
+ const config = mergeModuleOptions(TypeormOutboxRegisterCronModuleOptions, await options.useFactory?.(...args));
256
+ return _nestjs_microservices.ClientProxyFactory.create(config?.brokerConfig ?? {});
257
+ },
258
+ inject: options.inject || []
259
+ });
235
260
  let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
236
- static createServiceProvider() {
237
- return {
238
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
239
- useClass: TypeormOutboxService
240
- };
241
- }
242
- static createBrokerProvider(useValue = {}) {
243
- return {
244
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
245
- useValue
246
- };
247
- }
248
- static createTypeOrmFeature(connectionName) {
249
- return _nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName || "default");
250
- }
251
- static createModuleConfigProvider(options) {
252
- return {
253
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
254
- useValue: {
255
- ...new TypeormOutboxModuleOptions(),
256
- ...options
257
- }
258
- };
259
- }
260
- static createAsyncModuleConfigProvider(options) {
261
- return {
262
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
263
- useFactory: async (...args) => {
264
- const moduleOptions = await options.useFactory?.(...args);
265
- return {
266
- ...new TypeormOutboxModuleOptions(),
267
- ...moduleOptions
268
- };
269
- },
270
- inject: options.inject || []
271
- };
272
- }
273
- static createCronConfigProvider(options) {
274
- return {
275
- provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
276
- useFactory: async (...args) => {
277
- const moduleOptions = await options.useFactory?.(...args);
278
- return {
279
- ...new TypeormOutboxRegisterCronModuleOptions(),
280
- ...moduleOptions
281
- };
282
- },
283
- inject: options.inject || []
284
- };
285
- }
286
- static createCronBrokerProvider(options) {
287
- return {
288
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
289
- useFactory: async (...args) => {
290
- const moduleOptions = await options.useFactory?.(...args);
291
- const config = {
292
- ...new TypeormOutboxRegisterCronModuleOptions(),
293
- ...moduleOptions
294
- };
295
- return _nestjs_microservices.ClientProxyFactory.create(config?.brokerConfig ?? {});
296
- },
297
- inject: options.inject || []
298
- };
299
- }
300
261
  static forRoot(options = {}) {
301
- const PROVIDERS = [
302
- this.createModuleConfigProvider(options),
303
- this.createServiceProvider(),
304
- this.createBrokerProvider()
262
+ const providers = [
263
+ moduleConfigProvider(options),
264
+ serviceProvider(),
265
+ brokerProvider()
305
266
  ];
306
267
  return {
307
268
  module: _TypeormOutboxModule,
308
269
  global: true,
309
- imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],
310
- providers: [...PROVIDERS],
311
- exports: [...PROVIDERS]
270
+ imports: [typeOrmFeature(options.typeOrmConnectionName)],
271
+ providers,
272
+ exports: providers
312
273
  };
313
274
  }
314
275
  static forRootAsync(options) {
315
- const configProvider = this.createAsyncModuleConfigProvider(options);
316
- const serviceProvider = this.createServiceProvider();
317
- const brokerProvider = this.createBrokerProvider();
276
+ const providers = [
277
+ asyncModuleConfigProvider(options),
278
+ serviceProvider(),
279
+ brokerProvider()
280
+ ];
318
281
  return {
319
282
  module: _TypeormOutboxModule,
320
283
  global: true,
321
- imports: [this.createTypeOrmFeature()],
322
- providers: [
323
- configProvider,
324
- serviceProvider,
325
- brokerProvider
326
- ],
327
- exports: [
328
- configProvider,
329
- serviceProvider,
330
- brokerProvider
331
- ]
284
+ imports: [typeOrmFeature()],
285
+ providers,
286
+ exports: providers
332
287
  };
333
288
  }
334
289
  static registerCronAsync(options) {
335
- const configProvider = this.createCronConfigProvider(options);
336
- const brokerProvider = this.createCronBrokerProvider(options);
337
- const serviceProvider = this.createServiceProvider();
290
+ const providers = [
291
+ cronConfigProvider(options),
292
+ cronBrokerProvider(options),
293
+ serviceProvider()
294
+ ];
338
295
  return {
339
296
  module: _TypeormOutboxModule,
340
297
  global: true,
341
- imports: [this.createTypeOrmFeature()],
342
- providers: [
343
- TypeormOutboxCronService,
344
- configProvider,
345
- brokerProvider,
346
- serviceProvider
347
- ],
348
- exports: [
349
- configProvider,
350
- brokerProvider,
351
- serviceProvider
352
- ]
298
+ imports: [typeOrmFeature()],
299
+ providers: [TypeormOutboxCronService, ...providers],
300
+ exports: providers
353
301
  };
354
302
  }
355
303
  };
356
304
  TypeormOutboxModule = _TypeormOutboxModule = __decorate([(0, _nestjs_common.Module)({})], TypeormOutboxModule);
357
-
358
305
  //#endregion
359
306
  exports.CronExpression = CronExpression;
360
307
  exports.InjectTypeormOutboxBroker = InjectTypeormOutboxBroker;
@@ -365,30 +312,31 @@ exports.TYPEORM_OUTBOX_BROKER_TOKEN = TYPEORM_OUTBOX_BROKER_TOKEN;
365
312
  exports.TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = TYPEORM_OUTBOX_CRON_CONFIG_TOKEN;
366
313
  exports.TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN;
367
314
  exports.TYPEORM_OUTBOX_SERVICE_TOKEN = TYPEORM_OUTBOX_SERVICE_TOKEN;
368
- Object.defineProperty(exports, 'TypeormOutboxCronService', {
369
- enumerable: true,
370
- get: function () {
371
- return TypeormOutboxCronService;
372
- }
315
+ Object.defineProperty(exports, "TypeormOutboxCronService", {
316
+ enumerable: true,
317
+ get: function() {
318
+ return TypeormOutboxCronService;
319
+ }
373
320
  });
374
- Object.defineProperty(exports, 'TypeormOutboxEntity', {
375
- enumerable: true,
376
- get: function () {
377
- return TypeormOutboxEntity;
378
- }
321
+ Object.defineProperty(exports, "TypeormOutboxEntity", {
322
+ enumerable: true,
323
+ get: function() {
324
+ return TypeormOutboxEntity;
325
+ }
379
326
  });
380
- Object.defineProperty(exports, 'TypeormOutboxModule', {
381
- enumerable: true,
382
- get: function () {
383
- return TypeormOutboxModule;
384
- }
327
+ Object.defineProperty(exports, "TypeormOutboxModule", {
328
+ enumerable: true,
329
+ get: function() {
330
+ return TypeormOutboxModule;
331
+ }
385
332
  });
386
333
  exports.TypeormOutboxModuleOptions = TypeormOutboxModuleOptions;
387
334
  exports.TypeormOutboxRegisterCronModuleOptions = TypeormOutboxRegisterCronModuleOptions;
388
- Object.defineProperty(exports, 'TypeormOutboxService', {
389
- enumerable: true,
390
- get: function () {
391
- return TypeormOutboxService;
392
- }
335
+ Object.defineProperty(exports, "TypeormOutboxService", {
336
+ enumerable: true,
337
+ get: function() {
338
+ return TypeormOutboxService;
339
+ }
393
340
  });
341
+
394
342
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["CronJob","Transport","TypeOrmModule","ClientProxyFactory"],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.enums.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","export enum CronExpression {\n EVERY_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions, MqttOptions, NatsOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\ntype BrokerConfig = MqttOptions | NatsOptions | KafkaOptions;\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n brokerConfig: BrokerConfig = {};\n typeOrmConnectionName?: string = \"default\";\n cronExpression?: string = CronExpression.EVERY_SECOND;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import {\n Injectable,\n OnApplicationBootstrap,\n OnApplicationShutdown,\n OnModuleInit,\n} from \"@nestjs/common\";\nimport {\n InjectTypeormOutboxBroker,\n InjectTypeormOutboxCronConfig,\n} from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy, Transport } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService\n implements OnApplicationBootstrap, OnApplicationShutdown\n{\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\n ) {}\n private cronJob!: CronJob;\n\n onApplicationBootstrap() {\n this.validateBrokerClient();\n this.cronJob = new CronJob(\n this.moduleConfig.cronExpression ?? CronExpression.EVERY_SECOND,\n () => {\n this.executeCronJob();\n },\n );\n this.cronJob.start();\n }\n\n onApplicationShutdown() {\n if (!this.cronJob) {\n return;\n }\n this.cronJob.stop();\n }\n\n private validateBrokerClient() {\n const brokerConfig = this.moduleConfig.brokerConfig;\n if (\n ![Transport.KAFKA, Transport.NATS, Transport.MQTT].includes(\n brokerConfig?.transport as Transport,\n )\n ) {\n throw new Error(\n `[TypeormOutboxCronService] Broker config must be an instance of KafkaOptions, NatsOptions, or MqttOptions`,\n );\n }\n }\n\n private async executeCronJob() {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt(\"typeorm-outbox-cron-lock\");\n\n try {\n const lockResult = await queryRunner.query(\n \"SELECT pg_try_advisory_lock($1) as locked\",\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction(\"REPEATABLE READ\");\n\n const entities = await queryRunner.manager.find(TypeormOutboxEntity, {\n order: {\n createdAt: \"ASC\",\n },\n });\n\n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query(\"SELECT pg_advisory_unlock($1)\", [lockKey]);\n }\n } finally {\n await queryRunner.release();\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity> {\n return this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\n@Module({})\nexport class TypeormOutboxModule {\n private static createServiceProvider(): Provider {\n return {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n }\n\n private static createBrokerProvider(useValue: any = {}): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n };\n }\n\n private static createTypeOrmFeature(connectionName?: string) {\n return TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n connectionName || \"default\",\n );\n }\n\n private static createModuleConfigProvider(\n options: TypeormOutboxModuleOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: {\n ...new TypeormOutboxModuleOptions(),\n ...options,\n },\n };\n }\n\n private static createAsyncModuleConfigProvider(\n options: TypeormOutboxModuleAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = (await options.useFactory?.(\n ...args,\n )) as TypeormOutboxModuleOptions;\n\n return {\n ...new TypeormOutboxModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronConfigProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n return {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronBrokerProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n const config = {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n return ClientProxyFactory.create(config?.brokerConfig ?? {});\n },\n inject: options.inject || [],\n };\n }\n\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider = this.createModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n const PROVIDERS = [configProvider, serviceProvider, brokerProvider];\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],\n providers: [...PROVIDERS],\n exports: [...PROVIDERS],\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const configProvider = this.createAsyncModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createCronConfigProvider(options);\n const brokerProvider = this.createCronBrokerProvider(options);\n const serviceProvider = this.createServiceProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [\n TypeormOutboxCronService,\n configProvider,\n brokerProvider,\n serviceProvider,\n ],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["CronJob","Transport","TypeOrmModule","ClientProxyFactory"],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.enums.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","export enum CronExpression {\n EVERY_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions, MqttOptions, NatsOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\ntype BrokerConfig = MqttOptions | NatsOptions | KafkaOptions;\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n brokerConfig: BrokerConfig = {};\n typeOrmConnectionName?: string = \"default\";\n cronExpression?: string = CronExpression.EVERY_SECOND;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import {\n Injectable,\n OnApplicationBootstrap,\n OnApplicationShutdown,\n OnModuleInit,\n} from \"@nestjs/common\";\nimport {\n InjectTypeormOutboxBroker,\n InjectTypeormOutboxCronConfig,\n} from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy, Transport } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService\n implements OnApplicationBootstrap, OnApplicationShutdown\n{\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\n ) {}\n private cronJob!: CronJob;\n\n onApplicationBootstrap() {\n this.validateBrokerClient();\n this.cronJob = new CronJob(\n this.moduleConfig.cronExpression ?? CronExpression.EVERY_SECOND,\n () => {\n this.executeCronJob();\n },\n );\n this.cronJob.start();\n }\n\n onApplicationShutdown() {\n if (!this.cronJob) {\n return;\n }\n this.cronJob.stop();\n }\n\n private validateBrokerClient() {\n const brokerConfig = this.moduleConfig.brokerConfig;\n if (\n ![Transport.KAFKA, Transport.NATS, Transport.MQTT].includes(\n brokerConfig?.transport as Transport,\n )\n ) {\n throw new Error(\n `[TypeormOutboxCronService] Broker config must be an instance of KafkaOptions, NatsOptions, or MqttOptions`,\n );\n }\n }\n\n private async executeCronJob() {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt(\"typeorm-outbox-cron-lock\");\n\n try {\n const lockResult = await queryRunner.query(\n \"SELECT pg_try_advisory_lock($1) as locked\",\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction(\"REPEATABLE READ\");\n\n const entities = await queryRunner.manager.find(TypeormOutboxEntity, {\n order: {\n createdAt: \"ASC\",\n },\n });\n\n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query(\"SELECT pg_advisory_unlock($1)\", [lockKey]);\n }\n } finally {\n await queryRunner.release();\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity> {\n return this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\nconst serviceProvider = (): Provider => ({\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n});\n\nconst brokerProvider = (useValue: any = {}): Provider => ({\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n});\n\nconst typeOrmFeature = (connectionName = \"default\") =>\n TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName);\n\nconst mergeModuleOptions = <T extends object>(\n defaults: new () => T,\n overrides?: Partial<T>,\n): T => ({ ...new defaults(), ...overrides });\n\nconst moduleConfigProvider = (\n options: TypeormOutboxModuleOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: mergeModuleOptions(TypeormOutboxModuleOptions, options),\n});\n\nconst asyncModuleConfigProvider = (\n options: TypeormOutboxModuleAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: any[]) =>\n mergeModuleOptions(\n TypeormOutboxModuleOptions,\n await options.useFactory?.(...args),\n ),\n inject: options.inject || [],\n});\n\nconst cronConfigProvider = (\n options: TypeormOutboxRegisterCronAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: any[]) =>\n mergeModuleOptions(\n TypeormOutboxRegisterCronModuleOptions,\n await options.useFactory?.(...args),\n ),\n inject: options.inject || [],\n});\n\nconst cronBrokerProvider = (\n options: TypeormOutboxRegisterCronAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: any[]) => {\n const config = mergeModuleOptions(\n TypeormOutboxRegisterCronModuleOptions,\n await options.useFactory?.(...args),\n );\n return ClientProxyFactory.create(config?.brokerConfig ?? {});\n },\n inject: options.inject || [],\n});\n\n@Module({})\nexport class TypeormOutboxModule {\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const providers = [\n moduleConfigProvider(options),\n serviceProvider(),\n brokerProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature(options.typeOrmConnectionName)],\n providers,\n exports: providers,\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const providers = [\n asyncModuleConfigProvider(options),\n serviceProvider(),\n brokerProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature()],\n providers,\n exports: providers,\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const providers = [\n cronConfigProvider(options),\n cronBrokerProvider(options),\n serviceProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature()],\n providers: [TypeormOutboxCronService, ...providers],\n exports: providers,\n };\n }\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -59,13 +59,6 @@ declare class TypeormOutboxEntity {
59
59
  //#endregion
60
60
  //#region src/core/typeorm-outbox.module.d.ts
61
61
  declare class TypeormOutboxModule {
62
- private static createServiceProvider;
63
- private static createBrokerProvider;
64
- private static createTypeOrmFeature;
65
- private static createModuleConfigProvider;
66
- private static createAsyncModuleConfigProvider;
67
- private static createCronConfigProvider;
68
- private static createCronBrokerProvider;
69
62
  static forRoot(options?: TypeormOutboxModuleOptions): DynamicModule;
70
63
  static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule;
71
64
  static registerCronAsync(options: TypeormOutboxRegisterCronAsyncOptions): DynamicModule;
package/dist/index.d.mts CHANGED
@@ -59,13 +59,6 @@ declare class TypeormOutboxEntity {
59
59
  //#endregion
60
60
  //#region src/core/typeorm-outbox.module.d.ts
61
61
  declare class TypeormOutboxModule {
62
- private static createServiceProvider;
63
- private static createBrokerProvider;
64
- private static createTypeOrmFeature;
65
- private static createModuleConfigProvider;
66
- private static createAsyncModuleConfigProvider;
67
- private static createCronConfigProvider;
68
- private static createCronBrokerProvider;
69
62
  static forRoot(options?: TypeormOutboxModuleOptions): DynamicModule;
70
63
  static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule;
71
64
  static registerCronAsync(options: TypeormOutboxRegisterCronAsyncOptions): DynamicModule;
package/dist/index.mjs CHANGED
@@ -5,7 +5,6 @@ import { firstValueFrom } from "rxjs";
5
5
  import { ClientProxy, ClientProxyFactory, Transport } from "@nestjs/microservices";
6
6
  import { CronJob } from "cron";
7
7
  import { InjectRepository, TypeOrmModule } from "@nestjs/typeorm";
8
-
9
8
  //#region src/core/typeorm-outbox.di-tokens.ts
10
9
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
11
10
  const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN");
@@ -15,22 +14,19 @@ const InjectTypeormOutboxCronConfig = () => Inject(TYPEORM_OUTBOX_CRON_CONFIG_TO
15
14
  const InjectTypeormOutboxModuleConfig = () => Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);
16
15
  const InjectTypeormOutboxService = () => Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);
17
16
  const InjectTypeormOutboxBroker = () => Inject(TYPEORM_OUTBOX_BROKER_TOKEN);
18
-
19
17
  //#endregion
20
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorateMetadata.js
18
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorateMetadata.js
21
19
  function __decorateMetadata(k, v) {
22
20
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
23
21
  }
24
-
25
22
  //#endregion
26
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorate.js
23
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorate.js
27
24
  function __decorate(decorators, target, key, desc) {
28
25
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
26
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
27
  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;
31
28
  return c > 3 && r && Object.defineProperty(target, key, r), r;
32
29
  }
33
-
34
30
  //#endregion
35
31
  //#region src/core/typeorm-outbox.entity.ts
36
32
  var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
@@ -51,7 +47,6 @@ __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type
51
47
  __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
48
  __decorate([Column("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
53
49
  TypeormOutboxEntity = __decorate([Entity("outbox")], TypeormOutboxEntity);
54
-
55
50
  //#endregion
56
51
  //#region src/core/typeorm-outbox.enums.ts
57
52
  let CronExpression = /* @__PURE__ */ function(CronExpression) {
@@ -117,7 +112,6 @@ let CronExpression = /* @__PURE__ */ function(CronExpression) {
117
112
  CronExpression["EVERY_MINUTE"] = "0 * * * * *";
118
113
  return CronExpression;
119
114
  }({});
120
-
121
115
  //#endregion
122
116
  //#region src/core/typeorm-outbox.interfaces.ts
123
117
  var TypeormOutboxRegisterCronModuleOptions = class {
@@ -128,15 +122,13 @@ var TypeormOutboxRegisterCronModuleOptions = class {
128
122
  var TypeormOutboxModuleOptions = class {
129
123
  typeOrmConnectionName = "default";
130
124
  };
131
-
132
125
  //#endregion
133
- //#region \0@oxc-project+runtime@0.112.0/helpers/decorateParam.js
126
+ //#region \0@oxc-project+runtime@0.115.0/helpers/decorateParam.js
134
127
  function __decorateParam(paramIndex, decorator) {
135
128
  return function(target, key) {
136
129
  decorator(target, key, paramIndex);
137
130
  };
138
131
  }
139
-
140
132
  //#endregion
141
133
  //#region src/core/typeorm-outbox-cron.service.ts
142
134
  var _ref$1, _ref2, _ref3;
@@ -205,7 +197,6 @@ TypeormOutboxCronService = __decorate([
205
197
  typeof (_ref3 = typeof DataSource !== "undefined" && DataSource) === "function" ? _ref3 : Object
206
198
  ])
207
199
  ], TypeormOutboxCronService);
208
-
209
200
  //#endregion
210
201
  //#region src/core/typeorm-outbox.service.ts
211
202
  var _ref;
@@ -227,133 +218,90 @@ TypeormOutboxService = __decorate([
227
218
  __decorateParam(0, InjectRepository(TypeormOutboxEntity)),
228
219
  __decorateMetadata("design:paramtypes", [typeof (_ref = typeof Repository !== "undefined" && Repository) === "function" ? _ref : Object])
229
220
  ], TypeormOutboxService);
230
-
231
221
  //#endregion
232
222
  //#region src/core/typeorm-outbox.module.ts
233
223
  var _TypeormOutboxModule;
224
+ const serviceProvider = () => ({
225
+ provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
226
+ useClass: TypeormOutboxService
227
+ });
228
+ const brokerProvider = (useValue = {}) => ({
229
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
230
+ useValue
231
+ });
232
+ const typeOrmFeature = (connectionName = "default") => TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName);
233
+ const mergeModuleOptions = (defaults, overrides) => ({
234
+ ...new defaults(),
235
+ ...overrides
236
+ });
237
+ const moduleConfigProvider = (options) => ({
238
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
239
+ useValue: mergeModuleOptions(TypeormOutboxModuleOptions, options)
240
+ });
241
+ const asyncModuleConfigProvider = (options) => ({
242
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
243
+ useFactory: async (...args) => mergeModuleOptions(TypeormOutboxModuleOptions, await options.useFactory?.(...args)),
244
+ inject: options.inject || []
245
+ });
246
+ const cronConfigProvider = (options) => ({
247
+ provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
248
+ useFactory: async (...args) => mergeModuleOptions(TypeormOutboxRegisterCronModuleOptions, await options.useFactory?.(...args)),
249
+ inject: options.inject || []
250
+ });
251
+ const cronBrokerProvider = (options) => ({
252
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
253
+ useFactory: async (...args) => {
254
+ const config = mergeModuleOptions(TypeormOutboxRegisterCronModuleOptions, await options.useFactory?.(...args));
255
+ return ClientProxyFactory.create(config?.brokerConfig ?? {});
256
+ },
257
+ inject: options.inject || []
258
+ });
234
259
  let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
235
- static createServiceProvider() {
236
- return {
237
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
238
- useClass: TypeormOutboxService
239
- };
240
- }
241
- static createBrokerProvider(useValue = {}) {
242
- return {
243
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
244
- useValue
245
- };
246
- }
247
- static createTypeOrmFeature(connectionName) {
248
- return TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName || "default");
249
- }
250
- static createModuleConfigProvider(options) {
251
- return {
252
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
253
- useValue: {
254
- ...new TypeormOutboxModuleOptions(),
255
- ...options
256
- }
257
- };
258
- }
259
- static createAsyncModuleConfigProvider(options) {
260
- return {
261
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
262
- useFactory: async (...args) => {
263
- const moduleOptions = await options.useFactory?.(...args);
264
- return {
265
- ...new TypeormOutboxModuleOptions(),
266
- ...moduleOptions
267
- };
268
- },
269
- inject: options.inject || []
270
- };
271
- }
272
- static createCronConfigProvider(options) {
273
- return {
274
- provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
275
- useFactory: async (...args) => {
276
- const moduleOptions = await options.useFactory?.(...args);
277
- return {
278
- ...new TypeormOutboxRegisterCronModuleOptions(),
279
- ...moduleOptions
280
- };
281
- },
282
- inject: options.inject || []
283
- };
284
- }
285
- static createCronBrokerProvider(options) {
286
- return {
287
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
288
- useFactory: async (...args) => {
289
- const moduleOptions = await options.useFactory?.(...args);
290
- const config = {
291
- ...new TypeormOutboxRegisterCronModuleOptions(),
292
- ...moduleOptions
293
- };
294
- return ClientProxyFactory.create(config?.brokerConfig ?? {});
295
- },
296
- inject: options.inject || []
297
- };
298
- }
299
260
  static forRoot(options = {}) {
300
- const PROVIDERS = [
301
- this.createModuleConfigProvider(options),
302
- this.createServiceProvider(),
303
- this.createBrokerProvider()
261
+ const providers = [
262
+ moduleConfigProvider(options),
263
+ serviceProvider(),
264
+ brokerProvider()
304
265
  ];
305
266
  return {
306
267
  module: _TypeormOutboxModule,
307
268
  global: true,
308
- imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],
309
- providers: [...PROVIDERS],
310
- exports: [...PROVIDERS]
269
+ imports: [typeOrmFeature(options.typeOrmConnectionName)],
270
+ providers,
271
+ exports: providers
311
272
  };
312
273
  }
313
274
  static forRootAsync(options) {
314
- const configProvider = this.createAsyncModuleConfigProvider(options);
315
- const serviceProvider = this.createServiceProvider();
316
- const brokerProvider = this.createBrokerProvider();
275
+ const providers = [
276
+ asyncModuleConfigProvider(options),
277
+ serviceProvider(),
278
+ brokerProvider()
279
+ ];
317
280
  return {
318
281
  module: _TypeormOutboxModule,
319
282
  global: true,
320
- imports: [this.createTypeOrmFeature()],
321
- providers: [
322
- configProvider,
323
- serviceProvider,
324
- brokerProvider
325
- ],
326
- exports: [
327
- configProvider,
328
- serviceProvider,
329
- brokerProvider
330
- ]
283
+ imports: [typeOrmFeature()],
284
+ providers,
285
+ exports: providers
331
286
  };
332
287
  }
333
288
  static registerCronAsync(options) {
334
- const configProvider = this.createCronConfigProvider(options);
335
- const brokerProvider = this.createCronBrokerProvider(options);
336
- const serviceProvider = this.createServiceProvider();
289
+ const providers = [
290
+ cronConfigProvider(options),
291
+ cronBrokerProvider(options),
292
+ serviceProvider()
293
+ ];
337
294
  return {
338
295
  module: _TypeormOutboxModule,
339
296
  global: true,
340
- imports: [this.createTypeOrmFeature()],
341
- providers: [
342
- TypeormOutboxCronService,
343
- configProvider,
344
- brokerProvider,
345
- serviceProvider
346
- ],
347
- exports: [
348
- configProvider,
349
- brokerProvider,
350
- serviceProvider
351
- ]
297
+ imports: [typeOrmFeature()],
298
+ providers: [TypeormOutboxCronService, ...providers],
299
+ exports: providers
352
300
  };
353
301
  }
354
302
  };
355
303
  TypeormOutboxModule = _TypeormOutboxModule = __decorate([Module({})], TypeormOutboxModule);
356
-
357
304
  //#endregion
358
305
  export { CronExpression, InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxCronService, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
306
+
359
307
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.enums.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","export enum CronExpression {\n EVERY_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions, MqttOptions, NatsOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\ntype BrokerConfig = MqttOptions | NatsOptions | KafkaOptions;\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n brokerConfig: BrokerConfig = {};\n typeOrmConnectionName?: string = \"default\";\n cronExpression?: string = CronExpression.EVERY_SECOND;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import {\n Injectable,\n OnApplicationBootstrap,\n OnApplicationShutdown,\n OnModuleInit,\n} from \"@nestjs/common\";\nimport {\n InjectTypeormOutboxBroker,\n InjectTypeormOutboxCronConfig,\n} from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy, Transport } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService\n implements OnApplicationBootstrap, OnApplicationShutdown\n{\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\n ) {}\n private cronJob!: CronJob;\n\n onApplicationBootstrap() {\n this.validateBrokerClient();\n this.cronJob = new CronJob(\n this.moduleConfig.cronExpression ?? CronExpression.EVERY_SECOND,\n () => {\n this.executeCronJob();\n },\n );\n this.cronJob.start();\n }\n\n onApplicationShutdown() {\n if (!this.cronJob) {\n return;\n }\n this.cronJob.stop();\n }\n\n private validateBrokerClient() {\n const brokerConfig = this.moduleConfig.brokerConfig;\n if (\n ![Transport.KAFKA, Transport.NATS, Transport.MQTT].includes(\n brokerConfig?.transport as Transport,\n )\n ) {\n throw new Error(\n `[TypeormOutboxCronService] Broker config must be an instance of KafkaOptions, NatsOptions, or MqttOptions`,\n );\n }\n }\n\n private async executeCronJob() {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt(\"typeorm-outbox-cron-lock\");\n\n try {\n const lockResult = await queryRunner.query(\n \"SELECT pg_try_advisory_lock($1) as locked\",\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction(\"REPEATABLE READ\");\n\n const entities = await queryRunner.manager.find(TypeormOutboxEntity, {\n order: {\n createdAt: \"ASC\",\n },\n });\n\n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query(\"SELECT pg_advisory_unlock($1)\", [lockKey]);\n }\n } finally {\n await queryRunner.release();\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity> {\n return this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\n@Module({})\nexport class TypeormOutboxModule {\n private static createServiceProvider(): Provider {\n return {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n }\n\n private static createBrokerProvider(useValue: any = {}): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n };\n }\n\n private static createTypeOrmFeature(connectionName?: string) {\n return TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n connectionName || \"default\",\n );\n }\n\n private static createModuleConfigProvider(\n options: TypeormOutboxModuleOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: {\n ...new TypeormOutboxModuleOptions(),\n ...options,\n },\n };\n }\n\n private static createAsyncModuleConfigProvider(\n options: TypeormOutboxModuleAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = (await options.useFactory?.(\n ...args,\n )) as TypeormOutboxModuleOptions;\n\n return {\n ...new TypeormOutboxModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronConfigProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n return {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronBrokerProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: any[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n const config = {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n return ClientProxyFactory.create(config?.brokerConfig ?? {});\n },\n inject: options.inject || [],\n };\n }\n\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider = this.createModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n const PROVIDERS = [configProvider, serviceProvider, brokerProvider];\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],\n providers: [...PROVIDERS],\n exports: [...PROVIDERS],\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const configProvider = this.createAsyncModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createCronConfigProvider(options);\n const brokerProvider = this.createCronBrokerProvider(options);\n const serviceProvider = this.createServiceProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [\n TypeormOutboxCronService,\n configProvider,\n brokerProvider,\n serviceProvider,\n ],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.enums.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","export enum CronExpression {\n EVERY_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions, MqttOptions, NatsOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\ntype BrokerConfig = MqttOptions | NatsOptions | KafkaOptions;\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n brokerConfig: BrokerConfig = {};\n typeOrmConnectionName?: string = \"default\";\n cronExpression?: string = CronExpression.EVERY_SECOND;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import {\n Injectable,\n OnApplicationBootstrap,\n OnApplicationShutdown,\n OnModuleInit,\n} from \"@nestjs/common\";\nimport {\n InjectTypeormOutboxBroker,\n InjectTypeormOutboxCronConfig,\n} from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy, Transport } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService\n implements OnApplicationBootstrap, OnApplicationShutdown\n{\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\n ) {}\n private cronJob!: CronJob;\n\n onApplicationBootstrap() {\n this.validateBrokerClient();\n this.cronJob = new CronJob(\n this.moduleConfig.cronExpression ?? CronExpression.EVERY_SECOND,\n () => {\n this.executeCronJob();\n },\n );\n this.cronJob.start();\n }\n\n onApplicationShutdown() {\n if (!this.cronJob) {\n return;\n }\n this.cronJob.stop();\n }\n\n private validateBrokerClient() {\n const brokerConfig = this.moduleConfig.brokerConfig;\n if (\n ![Transport.KAFKA, Transport.NATS, Transport.MQTT].includes(\n brokerConfig?.transport as Transport,\n )\n ) {\n throw new Error(\n `[TypeormOutboxCronService] Broker config must be an instance of KafkaOptions, NatsOptions, or MqttOptions`,\n );\n }\n }\n\n private async executeCronJob() {\n const queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt(\"typeorm-outbox-cron-lock\");\n\n try {\n const lockResult = await queryRunner.query(\n \"SELECT pg_try_advisory_lock($1) as locked\",\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction(\"REPEATABLE READ\");\n\n const entities = await queryRunner.manager.find(TypeormOutboxEntity, {\n order: {\n createdAt: \"ASC\",\n },\n });\n\n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query(\"SELECT pg_advisory_unlock($1)\", [lockKey]);\n }\n } finally {\n await queryRunner.release();\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity> {\n return this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\nconst serviceProvider = (): Provider => ({\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n});\n\nconst brokerProvider = (useValue: any = {}): Provider => ({\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n});\n\nconst typeOrmFeature = (connectionName = \"default\") =>\n TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName);\n\nconst mergeModuleOptions = <T extends object>(\n defaults: new () => T,\n overrides?: Partial<T>,\n): T => ({ ...new defaults(), ...overrides });\n\nconst moduleConfigProvider = (\n options: TypeormOutboxModuleOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: mergeModuleOptions(TypeormOutboxModuleOptions, options),\n});\n\nconst asyncModuleConfigProvider = (\n options: TypeormOutboxModuleAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: any[]) =>\n mergeModuleOptions(\n TypeormOutboxModuleOptions,\n await options.useFactory?.(...args),\n ),\n inject: options.inject || [],\n});\n\nconst cronConfigProvider = (\n options: TypeormOutboxRegisterCronAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: any[]) =>\n mergeModuleOptions(\n TypeormOutboxRegisterCronModuleOptions,\n await options.useFactory?.(...args),\n ),\n inject: options.inject || [],\n});\n\nconst cronBrokerProvider = (\n options: TypeormOutboxRegisterCronAsyncOptions,\n): Provider => ({\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: any[]) => {\n const config = mergeModuleOptions(\n TypeormOutboxRegisterCronModuleOptions,\n await options.useFactory?.(...args),\n );\n return ClientProxyFactory.create(config?.brokerConfig ?? {});\n },\n inject: options.inject || [],\n});\n\n@Module({})\nexport class TypeormOutboxModule {\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const providers = [\n moduleConfigProvider(options),\n serviceProvider(),\n brokerProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature(options.typeOrmConnectionName)],\n providers,\n exports: providers,\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const providers = [\n asyncModuleConfigProvider(options),\n serviceProvider(),\n brokerProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature()],\n providers,\n exports: providers,\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const providers = [\n cronConfigProvider(options),\n cronBrokerProvider(options),\n serviceProvider(),\n ];\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [typeOrmFeature()],\n providers: [TypeormOutboxCronService, ...providers],\n exports: providers,\n };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@globalart/nestjs-typeorm-outbox",
3
3
  "description": "TypeORM Outbox integration for NestJS",
4
- "version": "1.3.3",
4
+ "version": "1.4.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
7
7
  "module": "dist/index.mjs",
@@ -46,16 +46,18 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@globalart/text-utils": "^1.0.6",
49
- "@nestjs/common": "11.1.14",
50
- "@nestjs/core": "11.1.14",
51
- "@nestjs/microservices": "^11.1.14",
52
- "@nestjs/typeorm": "^11.0.0",
53
49
  "cron": "^4.4.0",
54
50
  "kafkajs": "^2.2.4",
55
51
  "lodash": "^4.17.23",
56
52
  "rxjs": "^7.8.2",
57
53
  "typeorm": "^0.3.28"
58
54
  },
55
+ "peerDependencies": {
56
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
57
+ "@nestjs/core": "^10.0.0 || ^11.0.0",
58
+ "@nestjs/microservices": "^10.0.0 || ^11.0.0",
59
+ "@nestjs/typeorm": "^10.0.0 || ^11.0.0"
60
+ },
59
61
  "devDependencies": {
60
62
  "@types/node": "25.5.0",
61
63
  "prettier": "^3.8.1",