@hexaijs/core 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +8 -0
  2. package/dist/domain/aggregate-root.d.ts +12 -0
  3. package/dist/domain/aggregate-root.d.ts.map +1 -0
  4. package/dist/domain/aggregate-root.js +22 -0
  5. package/dist/domain/aggregate-root.js.map +1 -0
  6. package/dist/domain/domain-error.d.ts +11 -0
  7. package/dist/domain/domain-error.d.ts.map +1 -0
  8. package/dist/domain/domain-error.js +19 -0
  9. package/dist/domain/domain-error.js.map +1 -0
  10. package/dist/domain/domain-event.d.ts +5 -0
  11. package/dist/domain/domain-event.d.ts.map +1 -0
  12. package/dist/domain/domain-event.js +7 -0
  13. package/dist/domain/domain-event.js.map +1 -0
  14. package/dist/domain/identifiable.d.ts +11 -0
  15. package/dist/domain/identifiable.d.ts.map +1 -0
  16. package/dist/domain/identifiable.js +14 -0
  17. package/dist/domain/identifiable.js.map +1 -0
  18. package/dist/domain/index.d.ts +6 -0
  19. package/dist/domain/index.d.ts.map +1 -0
  20. package/dist/domain/index.js +6 -0
  21. package/dist/domain/index.js.map +1 -0
  22. package/dist/domain/repository.d.ts +16 -0
  23. package/dist/domain/repository.d.ts.map +1 -0
  24. package/dist/domain/repository.js +19 -0
  25. package/dist/domain/repository.js.map +1 -0
  26. package/dist/event-store.d.ts +13 -0
  27. package/dist/event-store.d.ts.map +1 -0
  28. package/dist/event-store.js +2 -0
  29. package/dist/event-store.js.map +1 -0
  30. package/dist/index.d.ts +6 -85
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +5 -275
  33. package/dist/index.js.map +1 -1
  34. package/dist/{event-store-UbTJSE4H.d.ts → message.d.ts} +9 -21
  35. package/dist/message.d.ts.map +1 -0
  36. package/dist/message.js +144 -0
  37. package/dist/message.js.map +1 -0
  38. package/dist/test/dummy-message.d.ts +8 -0
  39. package/dist/test/dummy-message.d.ts.map +1 -0
  40. package/dist/test/dummy-message.js +15 -0
  41. package/dist/test/dummy-message.js.map +1 -0
  42. package/dist/test/in-memory-event-store.d.ts +11 -0
  43. package/dist/test/in-memory-event-store.d.ts.map +1 -0
  44. package/dist/test/in-memory-event-store.js +34 -0
  45. package/dist/test/in-memory-event-store.js.map +1 -0
  46. package/dist/test/index.d.ts +6 -38
  47. package/dist/test/index.d.ts.map +1 -0
  48. package/dist/test/index.js +5 -333
  49. package/dist/test/index.js.map +1 -1
  50. package/dist/test/matchers.d.ts +5 -0
  51. package/dist/test/matchers.d.ts.map +1 -0
  52. package/dist/test/matchers.js +69 -0
  53. package/dist/test/matchers.js.map +1 -0
  54. package/dist/test/partial-match.d.ts +4 -0
  55. package/dist/test/partial-match.d.ts.map +1 -0
  56. package/dist/test/partial-match.js +26 -0
  57. package/dist/test/partial-match.js.map +1 -0
  58. package/dist/test/utils.d.ts +5 -0
  59. package/dist/test/utils.d.ts.map +1 -0
  60. package/dist/test/utils.js +18 -0
  61. package/dist/test/utils.js.map +1 -0
  62. package/dist/transaction-hooks.d.ts +13 -0
  63. package/dist/transaction-hooks.d.ts.map +1 -0
  64. package/dist/transaction-hooks.js +47 -0
  65. package/dist/transaction-hooks.js.map +1 -0
  66. package/dist/unit-of-work.d.ts +19 -0
  67. package/dist/unit-of-work.d.ts.map +1 -0
  68. package/dist/unit-of-work.js +7 -0
  69. package/dist/unit-of-work.js.map +1 -0
  70. package/package.json +11 -2
package/README.md CHANGED
@@ -244,8 +244,15 @@ order.confirm();
244
244
  // Events are collected, not immediately published
245
245
  const events = order.getEventsOccurred();
246
246
  // [OrderPlaced, OrderConfirmed]
247
+
248
+ // flushEvents() returns events AND clears the internal list
249
+ const flushed = order.flushEvents();
250
+ // [OrderPlaced, OrderConfirmed]
251
+ order.getEventsOccurred(); // [] — now empty
247
252
  ```
248
253
 
254
+ `flushEvents()` is useful in repository implementations where you need to publish events after persisting the aggregate, and want to ensure events are not accidentally re-published.
255
+
249
256
  ### Repository
250
257
 
251
258
  Interface for aggregate persistence. Implementations live in infrastructure packages.
@@ -420,6 +427,7 @@ throw new DuplicateObjectError("Order with this ID already exists");
420
427
  | `Message.withCorrelation(trace)` | Sets correlation, returns new instance |
421
428
  | `DomainEvent<P>` | Message subclass for domain events |
422
429
  | `AggregateRoot<T>` | Base class for aggregates with event collection |
430
+ | `AggregateRoot.flushEvents()` | Returns collected events and clears the internal list |
423
431
  | `Id<T>` | Value object for typed identities |
424
432
  | `Identifiable<T>` | Interface for entities with identity |
425
433
  | `Repository<T>` | Interface for aggregate persistence |
@@ -0,0 +1,12 @@
1
+ import { DomainEvent } from "./domain-event.js";
2
+ import { Id, Identifiable } from "./identifiable.js";
3
+ export declare class AggregateRoot<T extends Id<string | number>> implements Identifiable<T> {
4
+ protected readonly id: T;
5
+ protected events: DomainEvent[];
6
+ constructor(id: T);
7
+ getId(): T;
8
+ protected raise(event: DomainEvent): void;
9
+ getEventsOccurred(): DomainEvent[];
10
+ flushEvents(): DomainEvent[];
11
+ }
12
+ //# sourceMappingURL=aggregate-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-root.d.ts","sourceRoot":"","sources":["../../src/domain/aggregate-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAErD,qBAAa,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,CACpD,YAAW,YAAY,CAAC,CAAC,CAAC;IAId,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;IAFpC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,CAAM;IAErC,YAA+B,EAAE,EAAE,CAAC,EAAI;IAEjC,KAAK,IAAI,CAAC,CAEhB;IAED,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAExC;IAEM,iBAAiB,IAAI,WAAW,EAAE,CAExC;IAEM,WAAW,IAAI,WAAW,EAAE,CAIlC;CACJ"}
@@ -0,0 +1,22 @@
1
+ export class AggregateRoot {
2
+ id;
3
+ events = [];
4
+ constructor(id) {
5
+ this.id = id;
6
+ }
7
+ getId() {
8
+ return this.id;
9
+ }
10
+ raise(event) {
11
+ this.events.push(event);
12
+ }
13
+ getEventsOccurred() {
14
+ return [...this.events];
15
+ }
16
+ flushEvents() {
17
+ const flushed = [...this.events];
18
+ this.events = [];
19
+ return flushed;
20
+ }
21
+ }
22
+ //# sourceMappingURL=aggregate-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate-root.js","sourceRoot":"","sources":["../../src/domain/aggregate-root.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAa;IAKS,EAAE;IAFvB,MAAM,GAAkB,EAAE,CAAC;IAErC,YAA+B,EAAK;kBAAL,EAAE;IAAM,CAAC;IAEjC,KAAK;QACR,OAAO,IAAI,CAAC,EAAE,CAAC;IACnB,CAAC;IAES,KAAK,CAAC,KAAkB;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEM,iBAAiB;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEM,WAAW;QACd,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,11 @@
1
+ export declare class DomainError extends Error {
2
+ }
3
+ export declare class InvariantNotSatisfiedError extends DomainError {
4
+ readonly code: string;
5
+ constructor(code: string, message?: string);
6
+ }
7
+ export declare class ValidationError extends InvariantNotSatisfiedError {
8
+ readonly field: string;
9
+ constructor(field: string, code: string, message?: string);
10
+ }
11
+ //# sourceMappingURL=domain-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-error.d.ts","sourceRoot":"","sources":["../../src/domain/domain-error.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,qBAAa,0BAA2B,SAAQ,WAAW;aAEnC,IAAI,EAAE,MAAM;IADhC,YACoB,IAAI,EAAE,MAAM,EAC5B,OAAO,GAAE,MAAW,EAIvB;CACJ;AAED,qBAAa,eAAgB,SAAQ,0BAA0B;aAEvC,KAAK,EAAE,MAAM;IADjC,YACoB,KAAK,EAAE,MAAM,EAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAW,EAKvB;CACJ"}
@@ -0,0 +1,19 @@
1
+ export class DomainError extends Error {
2
+ }
3
+ export class InvariantNotSatisfiedError extends DomainError {
4
+ code;
5
+ constructor(code, message = "") {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = "InvariantNotSatisfiedError";
9
+ }
10
+ }
11
+ export class ValidationError extends InvariantNotSatisfiedError {
12
+ field;
13
+ constructor(field, code, message = "") {
14
+ super(code, message);
15
+ this.field = field;
16
+ this.name = "ValidationError";
17
+ }
18
+ }
19
+ //# sourceMappingURL=domain-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-error.js","sourceRoot":"","sources":["../../src/domain/domain-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG;AAEzC,MAAM,OAAO,0BAA2B,SAAQ,WAAW;IAEnC,IAAI;IADxB,YACoB,IAAY,EAC5B,OAAO,GAAW,EAAE;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;oBAHC,IAAI;QAIpB,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC7C,CAAC;CACJ;AAED,MAAM,OAAO,eAAgB,SAAQ,0BAA0B;IAEvC,KAAK;IADzB,YACoB,KAAa,EAC7B,IAAY,EACZ,OAAO,GAAW,EAAE;QAEpB,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;qBAJL,KAAK;QAMrB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ"}
@@ -0,0 +1,5 @@
1
+ import { Message } from "../message.js";
2
+ export declare class DomainEvent<P extends Record<string, any> = Record<string, unknown>> extends Message<P> {
3
+ static getIntent(): string;
4
+ }
5
+ //# sourceMappingURL=domain-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event.d.ts","sourceRoot":"","sources":["../../src/domain/domain-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,qBAAa,WAAW,CACpB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACzD,SAAQ,OAAO,CAAC,CAAC,CAAC;IAChB,OAAgB,SAAS,WAExB;CACJ"}
@@ -0,0 +1,7 @@
1
+ import { Message } from "../message.js";
2
+ export class DomainEvent extends Message {
3
+ static getIntent() {
4
+ return "event";
5
+ }
6
+ }
7
+ //# sourceMappingURL=domain-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event.js","sourceRoot":"","sources":["../../src/domain/domain-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,WAEX,SAAQ,OAAU;IAChB,MAAM,CAAU,SAAS;QACrB,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -0,0 +1,11 @@
1
+ export declare class Id<T extends string | number> {
2
+ private readonly value;
3
+ constructor(value: T);
4
+ getValue(): T;
5
+ equals(other: Id<T>): boolean;
6
+ }
7
+ export type IdOf<T> = T extends Identifiable<infer Id> ? Id : never;
8
+ export interface Identifiable<T extends Id<string | number> = Id<string>> {
9
+ getId(): T;
10
+ }
11
+ //# sourceMappingURL=identifiable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiable.d.ts","sourceRoot":"","sources":["../../src/domain/identifiable.ts"],"names":[],"mappings":"AAAA,qBAAa,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAzC,YAAoC,KAAK,EAAE,CAAC,EAAI;IAEzC,QAAQ,IAAI,CAAC,CAEnB;IAEM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAKnC;CACJ;AAED,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAEpE,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IACpE,KAAK,IAAI,CAAC,CAAC;CACd"}
@@ -0,0 +1,14 @@
1
+ export class Id {
2
+ value;
3
+ constructor(value) {
4
+ this.value = value;
5
+ }
6
+ getValue() {
7
+ return this.value;
8
+ }
9
+ equals(other) {
10
+ return (this.constructor === other.constructor &&
11
+ this.getValue() === other.getValue());
12
+ }
13
+ }
14
+ //# sourceMappingURL=identifiable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifiable.js","sourceRoot":"","sources":["../../src/domain/identifiable.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,EAAE;IACyB,KAAK;IAAzC,YAAoC,KAAQ;qBAAR,KAAK;IAAM,CAAC;IAEzC,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,KAAY;QACtB,OAAO,CACH,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;YACtC,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ,EAAE,CACvC,CAAC;IACN,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ export * from "./aggregate-root.js";
2
+ export * from "./domain-error.js";
3
+ export * from "./domain-event.js";
4
+ export * from "./identifiable.js";
5
+ export * from "./repository.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from "./aggregate-root.js";
2
+ export * from "./domain-error.js";
3
+ export * from "./domain-event.js";
4
+ export * from "./identifiable.js";
5
+ export * from "./repository.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Identifiable, IdOf } from "./identifiable.js";
2
+ export interface Repository<T extends Identifiable<any>> {
3
+ get(id: IdOf<T>): Promise<T>;
4
+ add(entity: T): Promise<void>;
5
+ update(entity: T): Promise<void>;
6
+ }
7
+ export declare class RepositoryError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare class DuplicateObjectError extends RepositoryError {
11
+ constructor(message: string);
12
+ }
13
+ export declare class ObjectNotFoundError extends RepositoryError {
14
+ constructor(message: string);
15
+ }
16
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,YAAY,CAAC,GAAG,CAAC;IACnD,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACtC,YAAY,OAAO,EAAE,MAAM,EAG1B;CACJ;AAED,qBAAa,oBAAqB,SAAQ,eAAe;IACrD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACJ;AAED,qBAAa,mBAAoB,SAAQ,eAAe;IACpD,YAAY,OAAO,EAAE,MAAM,EAG1B;CACJ"}
@@ -0,0 +1,19 @@
1
+ export class RepositoryError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "RepositoryError";
5
+ }
6
+ }
7
+ export class DuplicateObjectError extends RepositoryError {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "DuplicateObjectError";
11
+ }
12
+ }
13
+ export class ObjectNotFoundError extends RepositoryError {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "ObjectNotFoundError";
17
+ }
18
+ }
19
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/domain/repository.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACtC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAClC,CAAC;CACJ;AAED,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IACrD,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACvC,CAAC;CACJ;AAED,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACpD,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACtC,CAAC;CACJ"}
@@ -0,0 +1,13 @@
1
+ import { Message } from "./message.js";
2
+ export interface StoredEvent {
3
+ position: number;
4
+ event: Message;
5
+ }
6
+ export interface EventStoreFetchResult {
7
+ events: StoredEvent[];
8
+ lastPosition: number;
9
+ }
10
+ export interface EventStore {
11
+ fetch(afterPosition: number, limit?: number): Promise<EventStoreFetchResult>;
12
+ }
13
+ //# sourceMappingURL=event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,CACD,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAAC;CACrC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../src/event-store.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,85 +1,6 @@
1
- import { M as Message } from './event-store-UbTJSE4H.js';
2
- export { A as AnyMessage, E as EventStore, a as EventStoreFetchResult, b as MessageClass, c as MessageHeaders, d as MessageOptions, e as MessageTrace, P as PayloadOf, S as StoredEvent } from './event-store-UbTJSE4H.js';
3
-
4
- declare class DomainEvent<P extends Record<string, any> = Record<string, unknown>> extends Message<P> {
5
- static getIntent(): string;
6
- }
7
-
8
- declare class Id<T extends string | number> {
9
- private readonly value;
10
- constructor(value: T);
11
- getValue(): T;
12
- equals(other: Id<T>): boolean;
13
- }
14
- type IdOf<T> = T extends Identifiable<infer Id> ? Id : never;
15
- interface Identifiable<T extends Id<string | number> = Id<string>> {
16
- getId(): T;
17
- }
18
-
19
- declare class AggregateRoot<T extends Id<string | number>> implements Identifiable<T> {
20
- protected readonly id: T;
21
- protected events: DomainEvent[];
22
- constructor(id: T);
23
- getId(): T;
24
- protected raise(event: DomainEvent): void;
25
- getEventsOccurred(): DomainEvent[];
26
- }
27
-
28
- declare class DomainError extends Error {
29
- }
30
- declare class InvariantNotSatisfiedError extends DomainError {
31
- readonly code: string;
32
- constructor(code: string, message?: string);
33
- }
34
- declare class ValidationError extends InvariantNotSatisfiedError {
35
- readonly field: string;
36
- constructor(field: string, code: string, message?: string);
37
- }
38
-
39
- interface Repository<T extends Identifiable<any>> {
40
- get(id: IdOf<T>): Promise<T>;
41
- add(entity: T): Promise<void>;
42
- update(entity: T): Promise<void>;
43
- }
44
- declare class RepositoryError extends Error {
45
- constructor(message: string);
46
- }
47
- declare class DuplicateObjectError extends RepositoryError {
48
- constructor(message: string);
49
- }
50
- declare class ObjectNotFoundError extends RepositoryError {
51
- constructor(message: string);
52
- }
53
-
54
- declare enum Propagation {
55
- NEW = "new",
56
- EXISTING = "existing",
57
- NESTED = "nested"
58
- }
59
- type TransactionHook = () => void | Promise<void>;
60
- interface BaseUnitOfWorkOptions {
61
- propagation: Propagation;
62
- }
63
- interface UnitOfWork<Client = unknown, Options extends BaseUnitOfWorkOptions = BaseUnitOfWorkOptions> {
64
- getClient(): Client;
65
- scope<T>(fn: () => Promise<T>, options?: Partial<Options>): Promise<T>;
66
- /** @deprecated Use scope() for transaction boundaries and withClient() for client access. */
67
- wrap<T>(fn: (client: Client) => Promise<T>, options?: Partial<Options>): Promise<T>;
68
- beforeCommit(hook: TransactionHook): void;
69
- afterCommit(hook: TransactionHook): void;
70
- afterRollback(hook: TransactionHook): void;
71
- }
72
-
73
- declare class TransactionHooks {
74
- private beforeCommitHooks;
75
- private afterCommitHooks;
76
- private afterRollbackHooks;
77
- addBeforeCommit(hook: TransactionHook): void;
78
- addAfterCommit(hook: TransactionHook): void;
79
- addAfterRollback(hook: TransactionHook): void;
80
- executeCommit(commitFn: () => Promise<void>, rollbackFn: () => Promise<void>): Promise<void>;
81
- executeRollback(rollbackFn: () => Promise<void>, cause?: unknown): Promise<void>;
82
- private runBestEffort;
83
- }
84
-
85
- export { AggregateRoot, type BaseUnitOfWorkOptions, DomainError, DomainEvent, DuplicateObjectError, Id, type IdOf, type Identifiable, InvariantNotSatisfiedError, Message, ObjectNotFoundError, Propagation, type Repository, RepositoryError, type TransactionHook, TransactionHooks, type UnitOfWork, ValidationError };
1
+ export * from "./domain/index.js";
2
+ export * from "./unit-of-work.js";
3
+ export * from "./transaction-hooks.js";
4
+ export * from "./message.js";
5
+ export * from "./event-store.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,276 +1,6 @@
1
- import { v4 } from 'uuid';
2
-
3
- // src/domain/aggregate-root.ts
4
- var AggregateRoot = class {
5
- constructor(id) {
6
- this.id = id;
7
- }
8
- events = [];
9
- getId() {
10
- return this.id;
11
- }
12
- raise(event) {
13
- this.events.push(event);
14
- }
15
- getEventsOccurred() {
16
- return [...this.events];
17
- }
18
- };
19
-
20
- // src/domain/domain-error.ts
21
- var DomainError = class extends Error {
22
- };
23
- var InvariantNotSatisfiedError = class extends DomainError {
24
- constructor(code, message = "") {
25
- super(message);
26
- this.code = code;
27
- this.name = "InvariantNotSatisfiedError";
28
- }
29
- };
30
- var ValidationError = class extends InvariantNotSatisfiedError {
31
- constructor(field, code, message = "") {
32
- super(code, message);
33
- this.field = field;
34
- this.name = "ValidationError";
35
- }
36
- };
37
- var Message = class {
38
- constructor(payload, options) {
39
- this.payload = payload;
40
- this.headers = Object.freeze(
41
- this.constructor.mergeHeaders(options?.headers ?? {})
42
- );
43
- if (payload && typeof payload === "object") {
44
- Object.freeze(payload);
45
- }
46
- }
47
- headers;
48
- static getSchemaVersion() {
49
- return this.schemaVersion ?? void 0;
50
- }
51
- static getType() {
52
- return this.type ?? this.name;
53
- }
54
- static getIntent() {
55
- return this.intent ?? void 0;
56
- }
57
- static newHeaders(...excludes) {
58
- return generateHeaderFor(this, ...excludes);
59
- }
60
- static from(rawPayload, headers) {
61
- const payload = this.deserializeRawPayload(rawPayload);
62
- return new this(payload, {
63
- headers: headers ? this.deserializeRawHeaders(headers) : this.newHeaders()
64
- });
65
- }
66
- static deserializeRawPayload(rawPayload) {
67
- return rawPayload;
68
- }
69
- static deserializeRawHeaders(headers) {
70
- headers.createdAt = new Date(headers.createdAt);
71
- return headers;
72
- }
73
- static mergeHeaders(headers) {
74
- return {
75
- ...this.newHeaders(...Object.keys(headers)),
76
- ...headers
77
- };
78
- }
79
- withHeader(field, value) {
80
- const newHeaders = { ...this.headers, [field]: value };
81
- return this.cloneWithHeaders(newHeaders);
82
- }
83
- clone() {
84
- const cloned = Object.create(Object.getPrototypeOf(this));
85
- Object.assign(cloned, this);
86
- return cloned;
87
- }
88
- cloneWithHeaders(headers) {
89
- const cloned = this.clone();
90
- Object.defineProperty(cloned, "headers", {
91
- value: Object.freeze(headers),
92
- writable: false,
93
- configurable: true
94
- });
95
- return cloned;
96
- }
97
- getHeader(field) {
98
- return this.headers[field];
99
- }
100
- getHeaders() {
101
- return Object.freeze({ ...this.headers });
102
- }
103
- getPayload() {
104
- return this.payload;
105
- }
106
- getMessageId() {
107
- return this.headers.id;
108
- }
109
- getMessageType() {
110
- return this.headers.type;
111
- }
112
- getSchemaVersion() {
113
- return this.headers.schemaVersion;
114
- }
115
- getTimestamp() {
116
- return this.headers.createdAt;
117
- }
118
- getIntent() {
119
- return this.constructor.getIntent();
120
- }
121
- toJSON() {
122
- return {
123
- headers: { ...this.headers },
124
- payload: this.serializePayload(this.payload)
125
- };
126
- }
127
- serialize() {
128
- return JSON.parse(JSON.stringify(this.toJSON()));
129
- }
130
- serializePayload(payload) {
131
- return payload;
132
- }
133
- asType(cls) {
134
- const { headers, payload } = this.serialize();
135
- return cls.from(payload, headers);
136
- }
137
- asTrace() {
138
- return { id: this.getMessageId(), type: this.getMessageType() };
139
- }
140
- getCausation() {
141
- return this.getHeader("causation");
142
- }
143
- getCorrelation() {
144
- return this.getHeader("correlation");
145
- }
146
- withCausation(trace) {
147
- return this.withHeader("causation", trace);
148
- }
149
- withCorrelation(trace) {
150
- return this.withHeader("correlation", trace);
151
- }
152
- };
153
- function generateHeaderFor(cls, ...excludes) {
154
- const headers = {};
155
- if (!excludes.includes("id")) {
156
- headers.id = v4();
157
- }
158
- if (!excludes.includes("type")) {
159
- headers.type = cls.getType();
160
- }
161
- if (!excludes.includes("intent")) {
162
- const intent = cls.getIntent();
163
- if (intent !== void 0) {
164
- headers.intent = intent;
165
- }
166
- }
167
- if (!excludes.includes("schemaVersion")) {
168
- const schemaVersion = cls.getSchemaVersion();
169
- if (schemaVersion !== void 0) {
170
- headers.schemaVersion = schemaVersion;
171
- }
172
- }
173
- if (!excludes.includes("createdAt")) {
174
- headers.createdAt = /* @__PURE__ */ new Date();
175
- }
176
- return headers;
177
- }
178
-
179
- // src/domain/domain-event.ts
180
- var DomainEvent = class extends Message {
181
- static getIntent() {
182
- return "event";
183
- }
184
- };
185
-
186
- // src/domain/identifiable.ts
187
- var Id = class {
188
- constructor(value) {
189
- this.value = value;
190
- }
191
- getValue() {
192
- return this.value;
193
- }
194
- equals(other) {
195
- return this.constructor === other.constructor && this.getValue() === other.getValue();
196
- }
197
- };
198
-
199
- // src/domain/repository.ts
200
- var RepositoryError = class extends Error {
201
- constructor(message) {
202
- super(message);
203
- this.name = "RepositoryError";
204
- }
205
- };
206
- var DuplicateObjectError = class extends RepositoryError {
207
- constructor(message) {
208
- super(message);
209
- this.name = "DuplicateObjectError";
210
- }
211
- };
212
- var ObjectNotFoundError = class extends RepositoryError {
213
- constructor(message) {
214
- super(message);
215
- this.name = "ObjectNotFoundError";
216
- }
217
- };
218
-
219
- // src/unit-of-work.ts
220
- var Propagation = /* @__PURE__ */ ((Propagation2) => {
221
- Propagation2["NEW"] = "new";
222
- Propagation2["EXISTING"] = "existing";
223
- Propagation2["NESTED"] = "nested";
224
- return Propagation2;
225
- })(Propagation || {});
226
-
227
- // src/transaction-hooks.ts
228
- var TransactionHooks = class {
229
- beforeCommitHooks = [];
230
- afterCommitHooks = [];
231
- afterRollbackHooks = [];
232
- addBeforeCommit(hook) {
233
- this.beforeCommitHooks.push(hook);
234
- }
235
- addAfterCommit(hook) {
236
- this.afterCommitHooks.push(hook);
237
- }
238
- addAfterRollback(hook) {
239
- this.afterRollbackHooks.push(hook);
240
- }
241
- async executeCommit(commitFn, rollbackFn) {
242
- try {
243
- for (const hook of this.beforeCommitHooks) await hook();
244
- } catch (e) {
245
- await this.executeRollback(rollbackFn, e);
246
- throw e;
247
- }
248
- await commitFn();
249
- await this.runBestEffort(this.afterCommitHooks);
250
- }
251
- async executeRollback(rollbackFn, cause) {
252
- await rollbackFn();
253
- await this.runBestEffort(this.afterRollbackHooks, cause);
254
- }
255
- async runBestEffort(hooks, cause) {
256
- const errors = [];
257
- for (const hook of hooks) {
258
- try {
259
- await hook();
260
- } catch (e) {
261
- errors.push(e);
262
- }
263
- }
264
- if (errors.length > 0) {
265
- throw cause !== void 0 ? new AggregateError(
266
- errors,
267
- "Transaction hook(s) failed",
268
- { cause }
269
- ) : new AggregateError(errors);
270
- }
271
- }
272
- };
273
-
274
- export { AggregateRoot, DomainError, DomainEvent, DuplicateObjectError, Id, InvariantNotSatisfiedError, Message, ObjectNotFoundError, Propagation, RepositoryError, TransactionHooks, ValidationError };
275
- //# sourceMappingURL=index.js.map
1
+ export * from "./domain/index.js";
2
+ export * from "./unit-of-work.js";
3
+ export * from "./transaction-hooks.js";
4
+ export * from "./message.js";
5
+ export * from "./event-store.js";
276
6
  //# sourceMappingURL=index.js.map