@woltz/rich-domain-drizzle 0.1.1 → 0.1.3

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 (75) hide show
  1. package/README.md +58 -33
  2. package/dist/cjs/errors.d.ts +3 -0
  3. package/dist/cjs/errors.d.ts.map +1 -1
  4. package/dist/cjs/errors.js +8 -1
  5. package/dist/cjs/errors.js.map +1 -1
  6. package/dist/cjs/index.d.ts +3 -1
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js +7 -1
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/mappers/to-persistence.d.ts +5 -8
  11. package/dist/cjs/mappers/to-persistence.d.ts.map +1 -1
  12. package/dist/cjs/mappers/to-persistence.js +6 -4
  13. package/dist/cjs/mappers/to-persistence.js.map +1 -1
  14. package/dist/cjs/outbox-store.d.ts +34 -0
  15. package/dist/cjs/outbox-store.d.ts.map +1 -0
  16. package/dist/cjs/outbox-store.js +96 -0
  17. package/dist/cjs/outbox-store.js.map +1 -0
  18. package/dist/cjs/outbox-table.d.ts +157 -0
  19. package/dist/cjs/outbox-table.d.ts.map +1 -0
  20. package/dist/cjs/outbox-table.js +32 -0
  21. package/dist/cjs/outbox-table.js.map +1 -0
  22. package/dist/cjs/repository.d.ts +31 -8
  23. package/dist/cjs/repository.d.ts.map +1 -1
  24. package/dist/cjs/repository.js +36 -1
  25. package/dist/cjs/repository.js.map +1 -1
  26. package/dist/esm/errors.d.ts +3 -0
  27. package/dist/esm/errors.d.ts.map +1 -1
  28. package/dist/esm/errors.js +6 -0
  29. package/dist/esm/errors.js.map +1 -1
  30. package/dist/esm/index.d.ts +3 -1
  31. package/dist/esm/index.d.ts.map +1 -1
  32. package/dist/esm/index.js +4 -1
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/mappers/to-persistence.d.ts +5 -8
  35. package/dist/esm/mappers/to-persistence.d.ts.map +1 -1
  36. package/dist/esm/mappers/to-persistence.js +6 -4
  37. package/dist/esm/mappers/to-persistence.js.map +1 -1
  38. package/dist/esm/outbox-store.d.ts +34 -0
  39. package/dist/esm/outbox-store.d.ts.map +1 -0
  40. package/dist/esm/outbox-store.js +92 -0
  41. package/dist/esm/outbox-store.js.map +1 -0
  42. package/dist/esm/outbox-table.d.ts +157 -0
  43. package/dist/esm/outbox-table.d.ts.map +1 -0
  44. package/dist/esm/outbox-table.js +29 -0
  45. package/dist/esm/outbox-table.js.map +1 -0
  46. package/dist/esm/repository.d.ts +31 -8
  47. package/dist/esm/repository.d.ts.map +1 -1
  48. package/dist/esm/repository.js +36 -1
  49. package/dist/esm/repository.js.map +1 -1
  50. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  51. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  52. package/dist/tsconfig.types.tsbuildinfo +1 -1
  53. package/dist/types/errors.d.ts +3 -0
  54. package/dist/types/errors.d.ts.map +1 -1
  55. package/dist/types/index.d.ts +3 -1
  56. package/dist/types/index.d.ts.map +1 -1
  57. package/dist/types/mappers/to-persistence.d.ts +5 -8
  58. package/dist/types/mappers/to-persistence.d.ts.map +1 -1
  59. package/dist/types/outbox-store.d.ts +34 -0
  60. package/dist/types/outbox-store.d.ts.map +1 -0
  61. package/dist/types/outbox-table.d.ts +157 -0
  62. package/dist/types/outbox-table.d.ts.map +1 -0
  63. package/dist/types/repository.d.ts +31 -8
  64. package/dist/types/repository.d.ts.map +1 -1
  65. package/package.json +65 -69
  66. package/src/batch-executor.ts +317 -317
  67. package/src/errors.ts +7 -0
  68. package/src/index.ts +5 -0
  69. package/src/mappers/to-domain.ts +13 -13
  70. package/src/mappers/to-persistence.ts +13 -16
  71. package/src/outbox-store.ts +101 -0
  72. package/src/outbox-table.ts +40 -0
  73. package/src/query-builder.ts +217 -217
  74. package/src/repository.ts +58 -8
  75. package/src/unit-of-work.ts +123 -123
package/README.md CHANGED
@@ -24,9 +24,12 @@ npm install @woltz/rich-domain @woltz/rich-domain-drizzle drizzle-orm
24
24
 
25
25
  ```typescript
26
26
  import { drizzle } from "drizzle-orm/node-postgres";
27
+ import * as schema from "./schema";
27
28
  import { DrizzleUnitOfWork } from "@woltz/rich-domain-drizzle";
28
29
 
29
- const db = drizzle(pool, { schema });
30
+ type DB = ReturnType<typeof drizzle<typeof schema>>;
31
+
32
+ const db: DB = drizzle(pool, { schema });
30
33
  const uow = new DrizzleUnitOfWork(db);
31
34
  ```
32
35
 
@@ -36,13 +39,15 @@ const uow = new DrizzleUnitOfWork(db);
36
39
  import { DrizzleRepository, SearchableField } from "@woltz/rich-domain-drizzle";
37
40
  import { users } from "./schema";
38
41
 
39
- class UserRepository extends DrizzleRepository<User, UserRecord> {
40
- constructor(uow: DrizzleUnitOfWork) {
42
+ type DB = ReturnType<typeof drizzle<typeof schema>>;
43
+
44
+ class UserRepository extends DrizzleRepository<User, UserRecord, DB> {
45
+ constructor(db: DB, uow: DrizzleUnitOfWork) {
41
46
  super({
42
47
  db,
43
48
  table: users,
44
49
  toDomainMapper: new UserToDomainMapper(),
45
- toPersistenceMapper: new UserToPersistenceMapper(uow),
50
+ toPersistenceMapper: new UserToPersistenceMapper(db, uow),
46
51
  uow,
47
52
  });
48
53
  }
@@ -67,7 +72,11 @@ class UserRepository extends DrizzleRepository<User, UserRecord> {
67
72
  const userRepo = new UserRepository(uow);
68
73
 
69
74
  // Create
70
- const user = User.create({ name: "John", email: "john@example.com", posts: [] });
75
+ const user = User.create({
76
+ name: "John",
77
+ email: "john@example.com",
78
+ posts: [],
79
+ });
71
80
  await userRepo.save(user);
72
81
 
73
82
  // Find by ID
@@ -124,7 +133,13 @@ uow.getCurrentContext(); // DrizzleTransactionContext | null
124
133
  Base class for repositories with full Criteria support.
125
134
 
126
135
  ```typescript
127
- abstract class DrizzleRepository<TDomain, TRecord> {
136
+ abstract class DrizzleRepository<
137
+ TDomain,
138
+ TRecord,
139
+ TDb extends DrizzleClient = DrizzleClient,
140
+ > {
141
+ constructor(config: { db: TDb; table: any; toDomainMapper; toPersistenceMapper; uow }) { ... }
142
+
128
143
  // Required: key in db.query matching the Drizzle schema export name
129
144
  protected abstract get model(): string;
130
145
 
@@ -134,6 +149,9 @@ abstract class DrizzleRepository<TDomain, TRecord> {
134
149
  // Optional: default relations to include in queries
135
150
  protected getDefaultRelations(): Record<string, any>;
136
151
 
152
+ // Available: current context (transaction or plain db) — typed as TDb
153
+ protected get context(): TDb;
154
+
137
155
  // Available methods
138
156
  async find(criteria: Criteria<TDomain>): Promise<PaginatedResult<TDomain>>;
139
157
  async findById(id: string): Promise<TDomain | null>;
@@ -155,7 +173,12 @@ abstract class DrizzleRepository<TDomain, TRecord> {
155
173
  Base class for persistence mappers with change tracking support.
156
174
 
157
175
  ```typescript
158
- abstract class DrizzleToPersistence<TDomain> extends Mapper<TDomain, void> {
176
+ abstract class DrizzleToPersistence<
177
+ TDomain,
178
+ TDb extends DrizzleClient = DrizzleClient,
179
+ > extends Mapper<TDomain, void> {
180
+ constructor(db: TDb, uow: DrizzleUnitOfWork) { ... }
181
+
159
182
  // Required: registry for entity/table/collection mapping
160
183
  protected abstract readonly registry: EntitySchemaRegistry;
161
184
 
@@ -165,15 +188,19 @@ abstract class DrizzleToPersistence<TDomain> extends Mapper<TDomain, void> {
165
188
  // Required: implement creation
166
189
  protected abstract onCreate(entity: TDomain): Promise<void>;
167
190
 
168
- // Available: current context (transaction or plain db)
169
- protected get context(): DrizzleClient | DrizzleTransactionClient;
191
+ // Available: current context (transaction or plain db) — typed as TDb
192
+ protected get context(): TDb;
170
193
  }
171
194
  ```
172
195
 
173
196
  #### Example
174
197
 
175
198
  ```typescript
176
- import { DrizzleToPersistence, DrizzleUnitOfWork, Transactional } from "@woltz/rich-domain-drizzle";
199
+ import {
200
+ DrizzleToPersistence,
201
+ DrizzleUnitOfWork,
202
+ Transactional,
203
+ } from "@woltz/rich-domain-drizzle";
177
204
  import { EntitySchemaRegistry } from "@woltz/rich-domain";
178
205
  import { users, posts, tags, postsToTags } from "./schema";
179
206
 
@@ -203,7 +230,9 @@ const userRegistry = new EntitySchemaRegistry()
203
230
  })
204
231
  .register({ entity: "Tag", table: "tags" });
205
232
 
206
- class UserToPersistenceMapper extends DrizzleToPersistence<User> {
233
+ type DB = ReturnType<typeof drizzle<typeof schema>>;
234
+
235
+ class UserToPersistenceMapper extends DrizzleToPersistence<User, DB> {
207
236
  protected readonly registry = userRegistry;
208
237
 
209
238
  protected readonly tableMap = new Map<string, any>([
@@ -213,12 +242,8 @@ class UserToPersistenceMapper extends DrizzleToPersistence<User> {
213
242
  ["posts_to_tags", postsToTags], // junction table key must match registry
214
243
  ]);
215
244
 
216
- constructor(uow: DrizzleUnitOfWork) {
217
- super(uow);
218
- }
219
-
220
- protected getDb() {
221
- return getDb();
245
+ constructor(db: DB, uow: DrizzleUnitOfWork) {
246
+ super(db, uow);
222
247
  }
223
248
 
224
249
  @Transactional()
@@ -253,10 +278,10 @@ class UserToPersistenceMapper extends DrizzleToPersistence<User> {
253
278
 
254
279
  ### EntitySchemaRegistry — Collection Types
255
280
 
256
- | Type | Behavior | Junction required? |
257
- |------|----------|--------------------|
258
- | `owned` | 1:N — child rows belong to the parent; deletes cascade | No |
259
- | `reference` | N:N — rows in a junction table | **Yes — always** |
281
+ | Type | Behavior | Junction required? |
282
+ | ----------- | ------------------------------------------------------ | ------------------ |
283
+ | `owned` | 1:N — child rows belong to the parent; deletes cascade | No |
284
+ | `reference` | N:N — rows in a junction table | **Yes — always** |
260
285
 
261
286
  Unlike Prisma, Drizzle does not manage implicit junction tables. Every `reference` collection must provide a `junction` config. Omitting it throws `MissingJunctionConfigError`.
262
287
 
@@ -284,11 +309,11 @@ class CreateUserUseCase {
284
309
  }
285
310
  ```
286
311
 
287
- | Scenario | Behavior |
288
- |----------|----------|
289
- | Direct call | Creates new transaction |
290
- | Already in transaction | Reuses existing one |
291
- | Error thrown | Automatic rollback |
312
+ | Scenario | Behavior |
313
+ | ---------------------- | ----------------------- |
314
+ | Direct call | Creates new transaction |
315
+ | Already in transaction | Reuses existing one |
316
+ | Error thrown | Automatic rollback |
292
317
 
293
318
  The class must expose a `uow` property of type `DrizzleUnitOfWork` for the decorator to find it.
294
319
 
@@ -345,13 +370,13 @@ await uow.transaction(async () => {
345
370
 
346
371
  ## Error Reference
347
372
 
348
- | Error | When thrown |
349
- |-------|-------------|
350
- | `TableNotFoundError` | `tableMap` key not found for an entity or junction name |
351
- | `MissingJunctionConfigError` | `reference` collection has no `junction` configured |
352
- | `BatchOperationError` | DB error during a batch create, update, or delete |
353
- | `NoRecordsAffectedError` | `delete()` / `deleteById()` matched 0 rows |
354
- | `DrizzleAdapterError` | Unsupported Criteria operator, dot-field path, or column not found |
373
+ | Error | When thrown |
374
+ | ---------------------------- | ------------------------------------------------------------------ |
375
+ | `TableNotFoundError` | `tableMap` key not found for an entity or junction name |
376
+ | `MissingJunctionConfigError` | `reference` collection has no `junction` configured |
377
+ | `BatchOperationError` | DB error during a batch create, update, or delete |
378
+ | `NoRecordsAffectedError` | `delete()` / `deleteById()` matched 0 rows |
379
+ | `DrizzleAdapterError` | Unsupported Criteria operator, dot-field path, or column not found |
355
380
 
356
381
  ---
357
382
 
@@ -23,6 +23,9 @@ export declare class DrizzleRepositoryError extends DrizzleAdapterError {
23
23
  readonly cause?: Error | undefined;
24
24
  constructor(message: string, cause?: Error | undefined);
25
25
  }
26
+ export declare class OutboxStoreError extends DrizzleAdapterError {
27
+ constructor(message: string);
28
+ }
26
29
  export declare class MissingJunctionConfigError extends DrizzleAdapterError {
27
30
  readonly parentEntity: string;
28
31
  readonly collectionField: string;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;aAEvC,UAAU,EAAE,MAAM;aAClB,eAAe,EAAE,MAAM,EAAE;gBADzB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE;CAQ5C;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAE3C,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,EAAE,EAAE,MAAM;aACV,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,mBAAmB;aAExC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aAEd,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAG3C,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,0BAA2B,SAAQ,mBAAmB;aAE/C,YAAY,EAAE,MAAM;aACpB,eAAe,EAAE,MAAM;gBADvB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM;CAoB1C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,mBAAmB;aAEvC,UAAU,EAAE,MAAM;aAClB,eAAe,EAAE,MAAM,EAAE;gBADzB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE;CAQ5C;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAE3C,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aACd,EAAE,EAAE,MAAM;aACV,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,mBAAoB,SAAQ,mBAAmB;aAExC,SAAS,EAAE,MAAM;aACjB,MAAM,EAAE,MAAM;aAEd,KAAK,CAAC,EAAE,KAAK;gBAHb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAC9B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,sBAAuB,SAAQ,mBAAmB;aAG3C,KAAK,CAAC,EAAE,KAAK;gBAD7B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,qBAAa,gBAAiB,SAAQ,mBAAmB;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,0BAA2B,SAAQ,mBAAmB;aAE/C,YAAY,EAAE,MAAM;aACpB,eAAe,EAAE,MAAM;gBADvB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM;CAoB1C"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MissingJunctionConfigError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = void 0;
3
+ exports.MissingJunctionConfigError = exports.OutboxStoreError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = void 0;
4
4
  class DrizzleAdapterError extends Error {
5
5
  constructor(message) {
6
6
  super(`[DrizzleAdapter] ${message}`);
@@ -57,6 +57,13 @@ class DrizzleRepositoryError extends DrizzleAdapterError {
57
57
  }
58
58
  }
59
59
  exports.DrizzleRepositoryError = DrizzleRepositoryError;
60
+ class OutboxStoreError extends DrizzleAdapterError {
61
+ constructor(message) {
62
+ super(`[OutboxStore] ${message}`);
63
+ this.name = "OutboxStoreError";
64
+ }
65
+ }
66
+ exports.OutboxStoreError = OutboxStoreError;
60
67
  class MissingJunctionConfigError extends DrizzleAdapterError {
61
68
  parentEntity;
62
69
  collectionField;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,kBAAmB,SAAQ,mBAAmB;IAEvC;IACA;IAFlB,YACkB,UAAkB,EAClB,eAAyB;QAEzC,KAAK,CACH,qBAAqB,UAAU,2BAA2B;YACxD,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;QANc,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAU;QAMzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAXD,gDAWC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAE3C;IACA;IACA;IACA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EACd,EAAU,EACV,KAAa;QAE7B,KAAK,CAAC,GAAG,SAAS,OAAO,MAAM,SAAS,EAAE,sBAAsB,CAAC,CAAC;QALlD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAVD,wDAUC;AAED,MAAa,mBAAoB,SAAQ,mBAAmB;IAExC;IACA;IAEA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EAC9B,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,SAAS,SAAS,OAAO,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QAL5C,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAEd,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAVD,kDAUC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAG3C;IAFlB,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,MAAa,0BAA2B,SAAQ,mBAAmB;IAE/C;IACA;IAFlB,YACkB,YAAoB,EACpB,eAAuB;QAEvC,KAAK,CACH,eAAe,eAAe,gBAAgB,YAAY,2DAA2D;YACnH,gGAAgG;YAChG,YAAY;YACZ,oBAAoB;YACpB,OAAO,eAAe,OAAO;YAC7B,4BAA4B;YAC5B,iCAAiC;YACjC,qBAAqB;YACrB,mBAAmB,YAAY,CAAC,WAAW,EAAE,IAAI,eAAe,MAAM;YACtE,uBAAuB,YAAY,CAAC,WAAW,EAAE,QAAQ;YACzD,wCAAwC;YACxC,YAAY;YACZ,UAAU;YACV,KAAK,CACR,CAAC;QAlBc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,oBAAe,GAAf,eAAe,CAAQ;QAkBvC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAvBD,gEAuBC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,kBAAmB,SAAQ,mBAAmB;IAEvC;IACA;IAFlB,YACkB,UAAkB,EAClB,eAAyB;QAEzC,KAAK,CACH,qBAAqB,UAAU,2BAA2B;YACxD,cAAc,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7C,CAAC;QANc,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAU;QAMzC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAXD,gDAWC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAE3C;IACA;IACA;IACA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EACd,EAAU,EACV,KAAa;QAE7B,KAAK,CAAC,GAAG,SAAS,OAAO,MAAM,SAAS,EAAE,sBAAsB,CAAC,CAAC;QALlD,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QACd,OAAE,GAAF,EAAE,CAAQ;QACV,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAVD,wDAUC;AAED,MAAa,mBAAoB,SAAQ,mBAAmB;IAExC;IACA;IAEA;IAJlB,YACkB,SAAiB,EACjB,MAAc,EAC9B,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,SAAS,SAAS,OAAO,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC;QAL5C,cAAS,GAAT,SAAS,CAAQ;QACjB,WAAM,GAAN,MAAM,CAAQ;QAEd,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAVD,kDAUC;AAED,MAAa,sBAAuB,SAAQ,mBAAmB;IAG3C;IAFlB,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AARD,wDAQC;AAED,MAAa,gBAAiB,SAAQ,mBAAmB;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,iBAAiB,OAAO,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AALD,4CAKC;AAED,MAAa,0BAA2B,SAAQ,mBAAmB;IAE/C;IACA;IAFlB,YACkB,YAAoB,EACpB,eAAuB;QAEvC,KAAK,CACH,eAAe,eAAe,gBAAgB,YAAY,2DAA2D;YACnH,gGAAgG;YAChG,YAAY;YACZ,oBAAoB;YACpB,OAAO,eAAe,OAAO;YAC7B,4BAA4B;YAC5B,iCAAiC;YACjC,qBAAqB;YACrB,mBAAmB,YAAY,CAAC,WAAW,EAAE,IAAI,eAAe,MAAM;YACtE,uBAAuB,YAAY,CAAC,WAAW,EAAE,QAAQ;YACzD,wCAAwC;YACxC,YAAY;YACZ,UAAU;YACV,KAAK,CACR,CAAC;QAlBc,iBAAY,GAAZ,YAAY,CAAQ;QACpB,oBAAe,GAAf,eAAe,CAAQ;QAkBvC,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAvBD,gEAuBC"}
@@ -4,5 +4,7 @@ export { DrizzleToPersistence } from "./mappers/to-persistence";
4
4
  export { DrizzleToDomain } from "./mappers/to-domain";
5
5
  export { DrizzleBatchExecutor, executeBatch, type DrizzleBatchExecutorConfig, } from "./batch-executor";
6
6
  export { DrizzleQueryBuilder, type SearchableField } from "./query-builder";
7
- export { DrizzleAdapterError, TableNotFoundError, NoRecordsAffectedError, BatchOperationError, DrizzleRepositoryError, MissingJunctionConfigError, } from "./errors";
7
+ export { outboxTable } from "./outbox-table";
8
+ export { DrizzleOutboxStore } from "./outbox-store";
9
+ export { DrizzleAdapterError, TableNotFoundError, NoRecordsAffectedError, BatchOperationError, DrizzleRepositoryError, OutboxStoreError, MissingJunctionConfigError, } from "./errors";
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,UAAU,EACV,aAAa,EACb,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,wBAAwB,GAC9B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG5E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,UAAU,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MissingJunctionConfigError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = exports.DrizzleQueryBuilder = exports.executeBatch = exports.DrizzleBatchExecutor = exports.DrizzleToDomain = exports.DrizzleToPersistence = exports.DrizzleRepository = exports.getCurrentDrizzleContext = exports.Transactional = exports.UOWStorage = exports.DrizzleTransactionContext = exports.DrizzleUnitOfWork = void 0;
3
+ exports.MissingJunctionConfigError = exports.OutboxStoreError = exports.DrizzleRepositoryError = exports.BatchOperationError = exports.NoRecordsAffectedError = exports.TableNotFoundError = exports.DrizzleAdapterError = exports.DrizzleOutboxStore = exports.outboxTable = exports.DrizzleQueryBuilder = exports.executeBatch = exports.DrizzleBatchExecutor = exports.DrizzleToDomain = exports.DrizzleToPersistence = exports.DrizzleRepository = exports.getCurrentDrizzleContext = exports.Transactional = exports.UOWStorage = exports.DrizzleTransactionContext = exports.DrizzleUnitOfWork = void 0;
4
4
  // Unit of Work
5
5
  var unit_of_work_1 = require("./unit-of-work");
6
6
  Object.defineProperty(exports, "DrizzleUnitOfWork", { enumerable: true, get: function () { return unit_of_work_1.DrizzleUnitOfWork; } });
@@ -23,6 +23,11 @@ Object.defineProperty(exports, "executeBatch", { enumerable: true, get: function
23
23
  // Query Builder
24
24
  var query_builder_1 = require("./query-builder");
25
25
  Object.defineProperty(exports, "DrizzleQueryBuilder", { enumerable: true, get: function () { return query_builder_1.DrizzleQueryBuilder; } });
26
+ // Outbox
27
+ var outbox_table_1 = require("./outbox-table");
28
+ Object.defineProperty(exports, "outboxTable", { enumerable: true, get: function () { return outbox_table_1.outboxTable; } });
29
+ var outbox_store_1 = require("./outbox-store");
30
+ Object.defineProperty(exports, "DrizzleOutboxStore", { enumerable: true, get: function () { return outbox_store_1.DrizzleOutboxStore; } });
26
31
  // Errors
27
32
  var errors_1 = require("./errors");
28
33
  Object.defineProperty(exports, "DrizzleAdapterError", { enumerable: true, get: function () { return errors_1.DrizzleAdapterError; } });
@@ -30,5 +35,6 @@ Object.defineProperty(exports, "TableNotFoundError", { enumerable: true, get: fu
30
35
  Object.defineProperty(exports, "NoRecordsAffectedError", { enumerable: true, get: function () { return errors_1.NoRecordsAffectedError; } });
31
36
  Object.defineProperty(exports, "BatchOperationError", { enumerable: true, get: function () { return errors_1.BatchOperationError; } });
32
37
  Object.defineProperty(exports, "DrizzleRepositoryError", { enumerable: true, get: function () { return errors_1.DrizzleRepositoryError; } });
38
+ Object.defineProperty(exports, "OutboxStoreError", { enumerable: true, get: function () { return errors_1.OutboxStoreError; } });
33
39
  Object.defineProperty(exports, "MissingJunctionConfigError", { enumerable: true, get: function () { return errors_1.MissingJunctionConfigError; } });
34
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,+CAQwB;AAPtB,iHAAA,iBAAiB,OAAA;AACjB,yHAAA,yBAAyB,OAAA;AACzB,0GAAA,UAAU,OAAA;AACV,6GAAA,aAAa,OAAA;AACb,wHAAA,wBAAwB,OAAA;AAK1B,aAAa;AACb,2CAA+E;AAAtE,+GAAA,iBAAiB,OAAA;AAE1B,UAAU;AACV,2DAAgE;AAAvD,sHAAA,oBAAoB,OAAA;AAC7B,iDAAsD;AAA7C,4GAAA,eAAe,OAAA;AAExB,iBAAiB;AACjB,mDAI0B;AAHxB,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AAId,gBAAgB;AAChB,iDAA4E;AAAnE,oHAAA,mBAAmB,OAAA;AAE5B,SAAS;AACT,mCAOkB;AANhB,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,6GAAA,mBAAmB,OAAA;AACnB,gHAAA,sBAAsB,OAAA;AACtB,oHAAA,0BAA0B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,eAAe;AACf,+CAQwB;AAPtB,iHAAA,iBAAiB,OAAA;AACjB,yHAAA,yBAAyB,OAAA;AACzB,0GAAA,UAAU,OAAA;AACV,6GAAA,aAAa,OAAA;AACb,wHAAA,wBAAwB,OAAA;AAK1B,aAAa;AACb,2CAA+E;AAAtE,+GAAA,iBAAiB,OAAA;AAE1B,UAAU;AACV,2DAAgE;AAAvD,sHAAA,oBAAoB,OAAA;AAC7B,iDAAsD;AAA7C,4GAAA,eAAe,OAAA;AAExB,iBAAiB;AACjB,mDAI0B;AAHxB,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AAId,gBAAgB;AAChB,iDAA4E;AAAnE,oHAAA,mBAAmB,OAAA;AAE5B,SAAS;AACT,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,+CAAoD;AAA3C,kHAAA,kBAAkB,OAAA;AAE3B,SAAS;AACT,mCAQkB;AAPhB,6GAAA,mBAAmB,OAAA;AACnB,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,6GAAA,mBAAmB,OAAA;AACnB,gHAAA,sBAAsB,OAAA;AACtB,0GAAA,gBAAgB,OAAA;AAChB,oHAAA,0BAA0B,OAAA"}
@@ -1,8 +1,9 @@
1
- import { Mapper, AggregateChanges, EntitySchemaRegistry } from "@woltz/rich-domain";
1
+ import { Mapper, AggregateChanges, EntitySchemaRegistry, Aggregate } from "@woltz/rich-domain";
2
2
  import { DrizzleClient, DrizzleUnitOfWork } from "../unit-of-work";
3
- export declare abstract class DrizzleToPersistence<TDomain> extends Mapper<TDomain, void> {
3
+ export declare abstract class DrizzleToPersistence<TDomain extends Aggregate<any>, TDb extends DrizzleClient = DrizzleClient> extends Mapper<TDomain, void> {
4
+ protected readonly db: TDb;
4
5
  protected readonly uow: DrizzleUnitOfWork;
5
- constructor(uow: DrizzleUnitOfWork);
6
+ constructor(db: TDb, uow: DrizzleUnitOfWork);
6
7
  /**
7
8
  * Schema registry for field mapping (entity → table, field → column).
8
9
  */
@@ -19,14 +20,10 @@ export declare abstract class DrizzleToPersistence<TDomain> extends Mapper<TDoma
19
20
  * ```
20
21
  */
21
22
  protected abstract readonly tableMap: Map<string, any>;
22
- /**
23
- * Get the raw db instance.
24
- */
25
- protected abstract getDb(): DrizzleClient;
26
23
  /**
27
24
  * Get current context (transaction client or raw db).
28
25
  */
29
- protected get context(): DrizzleClient;
26
+ protected get context(): TDb;
30
27
  /**
31
28
  * Build persistence operations.
32
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"to-persistence.d.ts","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,iBAAiB,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,8BAAsB,oBAAoB,CAAC,OAAO,CAAE,SAAQ,MAAM,CAChE,OAAO,EACP,IAAI,CACL;IACa,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,iBAAiB;gBAAtB,GAAG,EAAE,iBAAiB;IAIrD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,aAAa;IAEzC;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,aAAa,CAGrC;IAED;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9D;;;;OAIG;cACa,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC;YAUF,YAAY;CAW3B"}
1
+ {"version":3,"file":"to-persistence.d.ts","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,iBAAiB,EAGlB,MAAM,iBAAiB,CAAC;AAGzB,8BAAsB,oBAAoB,CACxC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,GAAG,SAAS,aAAa,GAAG,aAAa,CACzC,SAAQ,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC;IAE3B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG;IAC1B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,iBAAiB;gBADtB,EAAE,EAAE,GAAG,EACP,GAAG,EAAE,iBAAiB;IAK3C;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEvD;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,GAAG,CAG3B;IAED;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9D;;;;OAIG;cACa,QAAQ,CACtB,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC;YAUF,YAAY;CAS3B"}
@@ -14,9 +14,11 @@ const rich_domain_1 = require("@woltz/rich-domain");
14
14
  const unit_of_work_1 = require("../unit-of-work");
15
15
  const batch_executor_1 = require("../batch-executor");
16
16
  class DrizzleToPersistence extends rich_domain_1.Mapper {
17
+ db;
17
18
  uow;
18
- constructor(uow) {
19
+ constructor(db, uow) {
19
20
  super();
21
+ this.db = db;
20
22
  this.uow = uow;
21
23
  }
22
24
  /**
@@ -24,13 +26,13 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
24
26
  */
25
27
  get context() {
26
28
  const ctx = unit_of_work_1.UOWStorage.getStore()?.ctx;
27
- return ctx?.client ?? this.getDb();
29
+ return (ctx?.client ?? this.db);
28
30
  }
29
31
  /**
30
32
  * Build persistence operations.
31
33
  */
32
34
  async build(entity) {
33
- const isNew = entity.isNew?.() ?? false;
35
+ const isNew = entity.isNew();
34
36
  if (isNew) {
35
37
  await this.onCreate(entity);
36
38
  }
@@ -52,7 +54,7 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
52
54
  await executor.execute(changes);
53
55
  }
54
56
  async handleUpdate(entity) {
55
- const changes = entity.getChanges?.();
57
+ const changes = entity.getChanges();
56
58
  if (!changes || changes.isEmpty()) {
57
59
  return;
58
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"to-persistence.js","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAI4B;AAC5B,kDAKyB;AACzB,sDAAyD;AAEzD,MAAsB,oBAA8B,SAAQ,oBAG3D;IACgC;IAA/B,YAA+B,GAAsB;QACnD,KAAK,EAAE,CAAC;QADqB,QAAG,GAAH,GAAG,CAAmB;IAErD,CAAC;IAyBD;;OAEG;IACH,IAAc,OAAO;QACnB,MAAM,GAAG,GAAG,yBAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;QACvC,OAAO,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAe;QACzB,MAAM,KAAK,GAAI,MAAc,CAAC,KAAK,EAAE,EAAE,IAAI,KAAK,CAAC;QAEjD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAQD;;;;OAIG;IACO,KAAK,CAAC,QAAQ,CACtB,OAAyB,EACzB,UAAmB;QAEnB,MAAM,QAAQ,GAAG,IAAI,qCAAoB,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAGa,AAAN,KAAK,CAAC,YAAY,CAAC,MAAe;QACxC,MAAM,OAAO,GAAI,MAAc,CAAC,UAAU,EAAE,EAE/B,CAAC;QAEd,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;CACF;AAvFD,oDAuFC;AAXe;IADb,IAAA,4BAAa,GAAE;;;;wDAWf"}
1
+ {"version":3,"file":"to-persistence.js","sourceRoot":"","sources":["../../../src/mappers/to-persistence.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAK4B;AAC5B,kDAKyB;AACzB,sDAAyD;AAEzD,MAAsB,oBAGpB,SAAQ,oBAAqB;IAER;IACA;IAFrB,YACqB,EAAO,EACP,GAAsB;QAEzC,KAAK,EAAE,CAAC;QAHW,OAAE,GAAF,EAAE,CAAK;QACP,QAAG,GAAH,GAAG,CAAmB;IAG3C,CAAC;IAoBD;;OAEG;IACH,IAAc,OAAO;QACnB,MAAM,GAAG,GAAG,yBAAU,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE,CAAQ,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAe;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE7B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAQD;;;;OAIG;IACO,KAAK,CAAC,QAAQ,CACtB,OAAyB,EACzB,UAAmB;QAEnB,MAAM,QAAQ,GAAG,IAAI,qCAAoB,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAGa,AAAN,KAAK,CAAC,YAAY,CAAC,MAAe;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAEpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;CACF;AAnFD,oDAmFC;AATe;IADb,IAAA,4BAAa,GAAE;;;;wDASf"}
@@ -0,0 +1,34 @@
1
+ import { IDomainEvent, IOutboxStore, OutboxFetchResult } from "@woltz/rich-domain";
2
+ import { type DrizzleClient } from "./unit-of-work";
3
+ /**
4
+ * Drizzle implementation of {@link IOutboxStore}.
5
+ *
6
+ * When called inside a {@link DrizzleUnitOfWork} transaction, operations use
7
+ * the same transactional client, guaranteeing that outbox rows are written
8
+ * atomically with the aggregate.
9
+ *
10
+ * When called outside a transaction, falls back to the raw Drizzle client.
11
+ *
12
+ * **Important:** the outbox store relies on `UOWStorage` (the `AsyncLocalStorage`
13
+ * singleton from `rich-domain-drizzle`) to resolve the transactional client.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const outboxStore = new DrizzleOutboxStore(db);
18
+ * const bus = new OutboxEventBusDecorator(rabbitBus, outboxStore);
19
+ * ```
20
+ */
21
+ export declare class DrizzleOutboxStore implements IOutboxStore {
22
+ private readonly db;
23
+ constructor(db: DrizzleClient);
24
+ /**
25
+ * Get the current Drizzle client — transactional if inside a UoW transaction,
26
+ * otherwise the raw client.
27
+ */
28
+ private get context();
29
+ save(events: IDomainEvent[]): Promise<void>;
30
+ fetchPending(batchSize?: number): Promise<OutboxFetchResult>;
31
+ markPublished(id: string): Promise<void>;
32
+ markFailed(id: string, error: string): Promise<void>;
33
+ }
34
+ //# sourceMappingURL=outbox-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-store.d.ts","sourceRoot":"","sources":["../../src/outbox-store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,gBAAgB,CAAC;AAIhE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,aAAa;IAE9C;;;OAGG;IACH,OAAO,KAAK,OAAO,GAGlB;IAEK,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3C,YAAY,CAAC,SAAS,SAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBxD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU3D"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DrizzleOutboxStore = void 0;
4
+ const drizzle_orm_1 = require("drizzle-orm");
5
+ const unit_of_work_1 = require("./unit-of-work");
6
+ const errors_1 = require("./errors");
7
+ const outbox_table_1 = require("./outbox-table");
8
+ /**
9
+ * Drizzle implementation of {@link IOutboxStore}.
10
+ *
11
+ * When called inside a {@link DrizzleUnitOfWork} transaction, operations use
12
+ * the same transactional client, guaranteeing that outbox rows are written
13
+ * atomically with the aggregate.
14
+ *
15
+ * When called outside a transaction, falls back to the raw Drizzle client.
16
+ *
17
+ * **Important:** the outbox store relies on `UOWStorage` (the `AsyncLocalStorage`
18
+ * singleton from `rich-domain-drizzle`) to resolve the transactional client.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const outboxStore = new DrizzleOutboxStore(db);
23
+ * const bus = new OutboxEventBusDecorator(rabbitBus, outboxStore);
24
+ * ```
25
+ */
26
+ class DrizzleOutboxStore {
27
+ db;
28
+ constructor(db) {
29
+ this.db = db;
30
+ }
31
+ /**
32
+ * Get the current Drizzle client — transactional if inside a UoW transaction,
33
+ * otherwise the raw client.
34
+ */
35
+ get context() {
36
+ const ctx = unit_of_work_1.UOWStorage.getStore()?.ctx;
37
+ return ctx?.client ?? this.db;
38
+ }
39
+ async save(events) {
40
+ if (events.length === 0)
41
+ return;
42
+ try {
43
+ await this.context.insert(outbox_table_1.outboxTable).values(events.map((e) => ({
44
+ id: e.eventId,
45
+ eventName: e.eventName,
46
+ payload: e.payload,
47
+ occurredOn: e.occurredOn,
48
+ status: "pending",
49
+ retries: 0,
50
+ lastError: null,
51
+ })));
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : String(error);
55
+ throw new errors_1.OutboxStoreError(`Failed to save outbox entries: ${message}`);
56
+ }
57
+ }
58
+ async fetchPending(batchSize = 50) {
59
+ const rows = await this.context
60
+ .select()
61
+ .from(outbox_table_1.outboxTable)
62
+ .where((0, drizzle_orm_1.inArray)(outbox_table_1.outboxTable.status, ["pending", "failed"]))
63
+ .orderBy((0, drizzle_orm_1.asc)(outbox_table_1.outboxTable.createdAt))
64
+ .limit(batchSize);
65
+ return {
66
+ entries: rows.map((r) => ({
67
+ id: r.id,
68
+ eventName: r.eventName,
69
+ payload: r.payload,
70
+ occurredOn: r.occurredOn,
71
+ status: r.status,
72
+ retries: r.retries,
73
+ lastError: r.lastError,
74
+ createdAt: r.createdAt,
75
+ })),
76
+ };
77
+ }
78
+ async markPublished(id) {
79
+ await this.context
80
+ .update(outbox_table_1.outboxTable)
81
+ .set({ status: "published" })
82
+ .where((0, drizzle_orm_1.eq)(outbox_table_1.outboxTable.id, id));
83
+ }
84
+ async markFailed(id, error) {
85
+ await this.context
86
+ .update(outbox_table_1.outboxTable)
87
+ .set({
88
+ status: "failed",
89
+ retries: (0, drizzle_orm_1.sql) `${outbox_table_1.outboxTable.retries} + 1`,
90
+ lastError: error,
91
+ })
92
+ .where((0, drizzle_orm_1.eq)(outbox_table_1.outboxTable.id, id));
93
+ }
94
+ }
95
+ exports.DrizzleOutboxStore = DrizzleOutboxStore;
96
+ //# sourceMappingURL=outbox-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-store.js","sourceRoot":"","sources":["../../src/outbox-store.ts"],"names":[],"mappings":"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"}