@woltz/rich-domain-drizzle 0.1.2 → 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 (70) hide show
  1. package/dist/cjs/errors.d.ts +3 -0
  2. package/dist/cjs/errors.d.ts.map +1 -1
  3. package/dist/cjs/errors.js +8 -1
  4. package/dist/cjs/errors.js.map +1 -1
  5. package/dist/cjs/index.d.ts +3 -1
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js +7 -1
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/mappers/to-persistence.d.ts +2 -2
  10. package/dist/cjs/mappers/to-persistence.d.ts.map +1 -1
  11. package/dist/cjs/mappers/to-persistence.js +2 -2
  12. package/dist/cjs/mappers/to-persistence.js.map +1 -1
  13. package/dist/cjs/outbox-store.d.ts +34 -0
  14. package/dist/cjs/outbox-store.d.ts.map +1 -0
  15. package/dist/cjs/outbox-store.js +96 -0
  16. package/dist/cjs/outbox-store.js.map +1 -0
  17. package/dist/cjs/outbox-table.d.ts +157 -0
  18. package/dist/cjs/outbox-table.d.ts.map +1 -0
  19. package/dist/cjs/outbox-table.js +32 -0
  20. package/dist/cjs/outbox-table.js.map +1 -0
  21. package/dist/cjs/repository.d.ts +24 -1
  22. package/dist/cjs/repository.d.ts.map +1 -1
  23. package/dist/cjs/repository.js +35 -0
  24. package/dist/cjs/repository.js.map +1 -1
  25. package/dist/esm/errors.d.ts +3 -0
  26. package/dist/esm/errors.d.ts.map +1 -1
  27. package/dist/esm/errors.js +6 -0
  28. package/dist/esm/errors.js.map +1 -1
  29. package/dist/esm/index.d.ts +3 -1
  30. package/dist/esm/index.d.ts.map +1 -1
  31. package/dist/esm/index.js +4 -1
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/mappers/to-persistence.d.ts +2 -2
  34. package/dist/esm/mappers/to-persistence.d.ts.map +1 -1
  35. package/dist/esm/mappers/to-persistence.js +2 -2
  36. package/dist/esm/mappers/to-persistence.js.map +1 -1
  37. package/dist/esm/outbox-store.d.ts +34 -0
  38. package/dist/esm/outbox-store.d.ts.map +1 -0
  39. package/dist/esm/outbox-store.js +92 -0
  40. package/dist/esm/outbox-store.js.map +1 -0
  41. package/dist/esm/outbox-table.d.ts +157 -0
  42. package/dist/esm/outbox-table.d.ts.map +1 -0
  43. package/dist/esm/outbox-table.js +29 -0
  44. package/dist/esm/outbox-table.js.map +1 -0
  45. package/dist/esm/repository.d.ts +24 -1
  46. package/dist/esm/repository.d.ts.map +1 -1
  47. package/dist/esm/repository.js +35 -0
  48. package/dist/esm/repository.js.map +1 -1
  49. package/dist/tsconfig.cjs.tsbuildinfo +1 -1
  50. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  51. package/dist/tsconfig.types.tsbuildinfo +1 -1
  52. package/dist/types/errors.d.ts +3 -0
  53. package/dist/types/errors.d.ts.map +1 -1
  54. package/dist/types/index.d.ts +3 -1
  55. package/dist/types/index.d.ts.map +1 -1
  56. package/dist/types/mappers/to-persistence.d.ts +2 -2
  57. package/dist/types/mappers/to-persistence.d.ts.map +1 -1
  58. package/dist/types/outbox-store.d.ts +34 -0
  59. package/dist/types/outbox-store.d.ts.map +1 -0
  60. package/dist/types/outbox-table.d.ts +157 -0
  61. package/dist/types/outbox-table.d.ts.map +1 -0
  62. package/dist/types/repository.d.ts +24 -1
  63. package/dist/types/repository.d.ts.map +1 -1
  64. package/package.json +3 -7
  65. package/src/errors.ts +85 -78
  66. package/src/index.ts +42 -37
  67. package/src/mappers/to-persistence.ts +98 -99
  68. package/src/outbox-store.ts +101 -0
  69. package/src/outbox-table.ts +40 -0
  70. package/src/repository.ts +302 -257
@@ -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,6 +1,6 @@
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, TDb extends DrizzleClient = DrizzleClient> extends Mapper<TDomain, void> {
3
+ export declare abstract class DrizzleToPersistence<TDomain extends Aggregate<any>, TDb extends DrizzleClient = DrizzleClient> extends Mapper<TDomain, void> {
4
4
  protected readonly db: TDb;
5
5
  protected readonly uow: DrizzleUnitOfWork;
6
6
  constructor(db: TDb, uow: DrizzleUnitOfWork);
@@ -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,CACxC,OAAO,EACP,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;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"}
@@ -32,7 +32,7 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
32
32
  * Build persistence operations.
33
33
  */
34
34
  async build(entity) {
35
- const isNew = entity.isNew?.() ?? false;
35
+ const isNew = entity.isNew();
36
36
  if (isNew) {
37
37
  await this.onCreate(entity);
38
38
  }
@@ -54,7 +54,7 @@ class DrizzleToPersistence extends rich_domain_1.Mapper {
54
54
  await executor.execute(changes);
55
55
  }
56
56
  async handleUpdate(entity) {
57
- const changes = entity.getChanges?.();
57
+ const changes = entity.getChanges();
58
58
  if (!changes || changes.isEmpty()) {
59
59
  return;
60
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,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,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;AArFD,oDAqFC;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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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Drizzle table definition for the outbox table.
3
+ *
4
+ * Import this in your schema file and add it to your schema object.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { outboxTable } from "@woltz/rich-domain-drizzle";
9
+ * export const schema = { users, orders, outbox: outboxTable };
10
+ * ```
11
+ *
12
+ * Then run `drizzle-kit generate` and `drizzle-kit migrate` as usual.
13
+ */
14
+ export declare const outboxTable: import("drizzle-orm/pg-core").PgTableWithColumns<{
15
+ name: "outbox";
16
+ schema: undefined;
17
+ columns: {
18
+ id: import("drizzle-orm/pg-core").PgColumn<{
19
+ name: "id";
20
+ tableName: "outbox";
21
+ dataType: "string";
22
+ columnType: "PgText";
23
+ data: string;
24
+ driverParam: string;
25
+ notNull: true;
26
+ hasDefault: false;
27
+ isPrimaryKey: true;
28
+ isAutoincrement: false;
29
+ hasRuntimeDefault: false;
30
+ enumValues: [string, ...string[]];
31
+ baseColumn: never;
32
+ identity: undefined;
33
+ generated: undefined;
34
+ }, {}, {}>;
35
+ eventName: import("drizzle-orm/pg-core").PgColumn<{
36
+ name: "event_name";
37
+ tableName: "outbox";
38
+ dataType: "string";
39
+ columnType: "PgText";
40
+ data: string;
41
+ driverParam: string;
42
+ notNull: true;
43
+ hasDefault: false;
44
+ isPrimaryKey: false;
45
+ isAutoincrement: false;
46
+ hasRuntimeDefault: false;
47
+ enumValues: [string, ...string[]];
48
+ baseColumn: never;
49
+ identity: undefined;
50
+ generated: undefined;
51
+ }, {}, {}>;
52
+ payload: import("drizzle-orm/pg-core").PgColumn<{
53
+ name: "payload";
54
+ tableName: "outbox";
55
+ dataType: "json";
56
+ columnType: "PgJsonb";
57
+ data: unknown;
58
+ driverParam: unknown;
59
+ notNull: true;
60
+ hasDefault: false;
61
+ isPrimaryKey: false;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: undefined;
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}, {}>;
69
+ occurredOn: import("drizzle-orm/pg-core").PgColumn<{
70
+ name: "occurred_on";
71
+ tableName: "outbox";
72
+ dataType: "date";
73
+ columnType: "PgTimestamp";
74
+ data: Date;
75
+ driverParam: string;
76
+ notNull: true;
77
+ hasDefault: false;
78
+ isPrimaryKey: false;
79
+ isAutoincrement: false;
80
+ hasRuntimeDefault: false;
81
+ enumValues: undefined;
82
+ baseColumn: never;
83
+ identity: undefined;
84
+ generated: undefined;
85
+ }, {}, {}>;
86
+ status: import("drizzle-orm/pg-core").PgColumn<{
87
+ name: "status";
88
+ tableName: "outbox";
89
+ dataType: "string";
90
+ columnType: "PgText";
91
+ data: string;
92
+ driverParam: string;
93
+ notNull: true;
94
+ hasDefault: true;
95
+ isPrimaryKey: false;
96
+ isAutoincrement: false;
97
+ hasRuntimeDefault: false;
98
+ enumValues: [string, ...string[]];
99
+ baseColumn: never;
100
+ identity: undefined;
101
+ generated: undefined;
102
+ }, {}, {}>;
103
+ retries: import("drizzle-orm/pg-core").PgColumn<{
104
+ name: "retries";
105
+ tableName: "outbox";
106
+ dataType: "number";
107
+ columnType: "PgInteger";
108
+ data: number;
109
+ driverParam: string | number;
110
+ notNull: true;
111
+ hasDefault: true;
112
+ isPrimaryKey: false;
113
+ isAutoincrement: false;
114
+ hasRuntimeDefault: false;
115
+ enumValues: undefined;
116
+ baseColumn: never;
117
+ identity: undefined;
118
+ generated: undefined;
119
+ }, {}, {}>;
120
+ lastError: import("drizzle-orm/pg-core").PgColumn<{
121
+ name: "last_error";
122
+ tableName: "outbox";
123
+ dataType: "string";
124
+ columnType: "PgText";
125
+ data: string;
126
+ driverParam: string;
127
+ notNull: false;
128
+ hasDefault: false;
129
+ isPrimaryKey: false;
130
+ isAutoincrement: false;
131
+ hasRuntimeDefault: false;
132
+ enumValues: [string, ...string[]];
133
+ baseColumn: never;
134
+ identity: undefined;
135
+ generated: undefined;
136
+ }, {}, {}>;
137
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
138
+ name: "created_at";
139
+ tableName: "outbox";
140
+ dataType: "date";
141
+ columnType: "PgTimestamp";
142
+ data: Date;
143
+ driverParam: string;
144
+ notNull: true;
145
+ hasDefault: true;
146
+ isPrimaryKey: false;
147
+ isAutoincrement: false;
148
+ hasRuntimeDefault: false;
149
+ enumValues: undefined;
150
+ baseColumn: never;
151
+ identity: undefined;
152
+ generated: undefined;
153
+ }, {}, {}>;
154
+ };
155
+ dialect: "pg";
156
+ }>;
157
+ //# sourceMappingURL=outbox-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-table.d.ts","sourceRoot":"","sources":["../../src/outbox-table.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBvB,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.outboxTable = void 0;
4
+ const pg_core_1 = require("drizzle-orm/pg-core");
5
+ /**
6
+ * Drizzle table definition for the outbox table.
7
+ *
8
+ * Import this in your schema file and add it to your schema object.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { outboxTable } from "@woltz/rich-domain-drizzle";
13
+ * export const schema = { users, orders, outbox: outboxTable };
14
+ * ```
15
+ *
16
+ * Then run `drizzle-kit generate` and `drizzle-kit migrate` as usual.
17
+ */
18
+ exports.outboxTable = (0, pg_core_1.pgTable)("outbox", {
19
+ id: (0, pg_core_1.text)("id").primaryKey(),
20
+ eventName: (0, pg_core_1.text)("event_name").notNull(),
21
+ payload: (0, pg_core_1.jsonb)("payload").notNull(),
22
+ occurredOn: (0, pg_core_1.timestamp)("occurred_on", { withTimezone: true }).notNull(),
23
+ status: (0, pg_core_1.text)("status").notNull().default("pending"),
24
+ retries: (0, pg_core_1.integer)("retries").notNull().default(0),
25
+ lastError: (0, pg_core_1.text)("last_error"),
26
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
27
+ .notNull()
28
+ .defaultNow(),
29
+ }, (table) => ({
30
+ statusIdx: (0, pg_core_1.index)("idx_outbox_status").on(table.status),
31
+ }));
32
+ //# sourceMappingURL=outbox-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-table.js","sourceRoot":"","sources":["../../src/outbox-table.ts"],"names":[],"mappings":";;;AAAA,iDAO6B;AAE7B;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAG,IAAA,iBAAO,EAChC,QAAQ,EACR;IACE,EAAE,EAAE,IAAA,cAAI,EAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,SAAS,EAAE,IAAA,cAAI,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,OAAO,EAAE,IAAA,eAAK,EAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IACnC,UAAU,EAAE,IAAA,mBAAS,EAAC,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;IACtE,MAAM,EAAE,IAAA,cAAI,EAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACnD,OAAO,EAAE,IAAA,iBAAO,EAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAChD,SAAS,EAAE,IAAA,cAAI,EAAC,YAAY,CAAC;IAC7B,SAAS,EAAE,IAAA,mBAAS,EAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;SACvD,OAAO,EAAE;SACT,UAAU,EAAE;CAChB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,IAAA,eAAK,EAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;CACvD,CAAC,CACH,CAAC"}
@@ -2,12 +2,15 @@ import { Aggregate, Repository, Mapper, Criteria, PaginatedResult } from "@woltz
2
2
  import { DrizzleClient, DrizzleUnitOfWork } from "./unit-of-work";
3
3
  import { DrizzleToPersistence } from "./mappers/to-persistence";
4
4
  import { SearchableField } from "./query-builder";
5
- export interface DrizzleRepositoryConfig<TDomain, TPersistence, TDb extends DrizzleClient = DrizzleClient> {
5
+ import { DrizzleOutboxStore } from "./outbox-store";
6
+ export interface DrizzleRepositoryConfig<TDomain extends Aggregate<any>, TPersistence, TDb extends DrizzleClient = DrizzleClient> {
6
7
  db: TDb;
7
8
  table: any;
8
9
  toDomainMapper: Mapper<TPersistence, TDomain>;
9
10
  toPersistenceMapper: DrizzleToPersistence<TDomain, TDb>;
10
11
  uow: DrizzleUnitOfWork;
12
+ /** Optional outbox store for auto-saving domain events in the same transaction. */
13
+ outboxStore?: DrizzleOutboxStore;
11
14
  }
12
15
  export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>, TPersistence, TDb extends DrizzleClient = DrizzleClient> extends Repository<TDomain> {
13
16
  protected readonly db: TDb;
@@ -15,6 +18,7 @@ export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>,
15
18
  protected readonly toDomainMapper: Mapper<TPersistence, TDomain>;
16
19
  protected readonly toPersistenceMapper: DrizzleToPersistence<TDomain, TDb>;
17
20
  protected readonly uow: DrizzleUnitOfWork;
21
+ private readonly outboxStore?;
18
22
  constructor(config: DrizzleRepositoryConfig<TDomain, TPersistence, TDb>);
19
23
  /**
20
24
  * Returns tx from UOWStorage if inside a transaction, otherwise the raw db.
@@ -37,7 +41,26 @@ export declare abstract class DrizzleRepository<TDomain extends Aggregate<any>,
37
41
  findManyByIds(ids: string[]): Promise<TDomain[]>;
38
42
  count(criteria?: Criteria<TDomain>): Promise<number>;
39
43
  exists(id: string): Promise<boolean>;
44
+ /**
45
+ * Save entity (create or update).
46
+ * Uses change tracking to determine what changed.
47
+ *
48
+ * If an {@link DrizzleOutboxStore} is configured, uncommitted domain events
49
+ * are extracted from the aggregate and saved to the outbox table in the
50
+ * same transaction context (guaranteeing atomicity).
51
+ */
40
52
  save(entity: TDomain): Promise<void>;
53
+ /**
54
+ * Extract uncommitted domain events from an aggregate.
55
+ * Uses duck-typing to avoid importing BaseAggregate from core,
56
+ * keeping the adapter loosely coupled.
57
+ *
58
+ * **Important:** events are NOT cleared from the aggregate here.
59
+ * The outbox is a *copy* — `dispatchAll()` still publishes immediately
60
+ * via the event bus, and the publisher only picks up events that were
61
+ * never dispatched (or whose immediate publish failed).
62
+ */
63
+ private extractEvents;
41
64
  delete(entity: TDomain): Promise<void>;
42
65
  deleteById(id: string): Promise<void>;
43
66
  transaction<T>(work: () => Promise<T>): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,UAAU,EACV,MAAM,EACN,QAAQ,EACR,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAc,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAuB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,WAAW,uBAAuB,CACtC,OAAO,EACP,YAAY,EACZ,GAAG,SAAS,aAAa,GAAG,aAAa;IAEzC,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,GAAG,CAAC;IACX,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9C,mBAAmB,EAAE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,8BAAsB,iBAAiB,CACrC,OAAO,SAAS,SAAS,CAAC,GAAG,CAAC,EAC9B,YAAY,EACZ,GAAG,SAAS,aAAa,GAAG,aAAa,CACzC,SAAQ,UAAU,CAAC,OAAO,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;IAC9B,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC3E,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;gBAE9B,MAAM,EAAE,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,CAAC;IASvE;;OAEG;IACH,SAAS,KAAK,OAAO,IAAI,GAAG,CAG3B;IAED;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,mBAAmB,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE;IAEzE;;OAEG;IACH,SAAS,CAAC,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAI9C,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAqDpE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IA8B7C,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA4BhD,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpC,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpC,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxD,OAAO,CAAC,6BAA6B;CAOtC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/repository.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,7 @@ class DrizzleRepository extends rich_domain_1.Repository {
12
12
  toDomainMapper;
13
13
  toPersistenceMapper;
14
14
  uow;
15
+ outboxStore;
15
16
  constructor(config) {
16
17
  super();
17
18
  this.db = config.db;
@@ -19,6 +20,7 @@ class DrizzleRepository extends rich_domain_1.Repository {
19
20
  this.toDomainMapper = config.toDomainMapper;
20
21
  this.toPersistenceMapper = config.toPersistenceMapper;
21
22
  this.uow = config.uow;
23
+ this.outboxStore = config.outboxStore;
22
24
  }
23
25
  /**
24
26
  * Returns tx from UOWStorage if inside a transaction, otherwise the raw db.
@@ -140,9 +142,42 @@ class DrizzleRepository extends rich_domain_1.Repository {
140
142
  .where((0, drizzle_orm_1.eq)(this.table.id, id));
141
143
  return Number(result[0]?.value ?? 0) > 0;
142
144
  }
145
+ /**
146
+ * Save entity (create or update).
147
+ * Uses change tracking to determine what changed.
148
+ *
149
+ * If an {@link DrizzleOutboxStore} is configured, uncommitted domain events
150
+ * are extracted from the aggregate and saved to the outbox table in the
151
+ * same transaction context (guaranteeing atomicity).
152
+ */
143
153
  async save(entity) {
154
+ // Extract uncommitted events BEFORE the mapper mutates the aggregate state.
155
+ const events = this.extractEvents(entity);
144
156
  await this.toPersistenceMapper.build(entity);
145
157
  entity.markAsPersisted();
158
+ // Auto-save events to outbox — uses the same transactional client
159
+ // if inside a DrizzleUnitOfWork transaction.
160
+ if (events.length > 0 && this.outboxStore) {
161
+ await this.outboxStore.save(events);
162
+ }
163
+ }
164
+ /**
165
+ * Extract uncommitted domain events from an aggregate.
166
+ * Uses duck-typing to avoid importing BaseAggregate from core,
167
+ * keeping the adapter loosely coupled.
168
+ *
169
+ * **Important:** events are NOT cleared from the aggregate here.
170
+ * The outbox is a *copy* — `dispatchAll()` still publishes immediately
171
+ * via the event bus, and the publisher only picks up events that were
172
+ * never dispatched (or whose immediate publish failed).
173
+ */
174
+ extractEvents(entity) {
175
+ if (typeof entity.hasUncommittedEvents === "function" &&
176
+ typeof entity.getUncommittedEvents === "function" &&
177
+ entity.hasUncommittedEvents()) {
178
+ return entity.getUncommittedEvents();
179
+ }
180
+ return [];
146
181
  }
147
182
  async delete(entity) {
148
183
  const id = entity.id.value;