@pocket-architect/core 0.1.18 → 0.1.20

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 (49) hide show
  1. package/README.md +102 -0
  2. package/build/AggregateRoot.d.ts +0 -5
  3. package/build/AggregateRoot.js +1 -11
  4. package/build/AggregateRoot.js.map +1 -1
  5. package/build/DomainEvent.d.ts +4 -8
  6. package/build/DomainEvent.js +8 -4
  7. package/build/DomainEvent.js.map +1 -1
  8. package/build/Entity.d.ts +6 -1
  9. package/build/Entity.js +30 -0
  10. package/build/Entity.js.map +1 -1
  11. package/build/Entity.spec.js +33 -3
  12. package/build/Entity.spec.js.map +1 -1
  13. package/build/EntityId.d.ts +2 -2
  14. package/build/EntityId.js.map +1 -1
  15. package/build/EntityId.spec.js +6 -5
  16. package/build/EntityId.spec.js.map +1 -1
  17. package/build/EventBus.d.ts +2 -0
  18. package/build/EventBus.spec.d.ts +1 -0
  19. package/build/EventBus.spec.js +157 -0
  20. package/build/EventBus.spec.js.map +1 -0
  21. package/build/eventBus/InMemoryEventBus.d.ts +9 -2
  22. package/build/eventBus/InMemoryEventBus.js +43 -12
  23. package/build/eventBus/InMemoryEventBus.js.map +1 -1
  24. package/build/eventBus/InMemoryEventBus.spec.js +0 -3
  25. package/build/eventBus/InMemoryEventBus.spec.js.map +1 -1
  26. package/build/helpers.d.ts +1 -0
  27. package/build/helpers.js +30 -0
  28. package/build/helpers.js.map +1 -0
  29. package/build/helpers.spec.d.ts +1 -0
  30. package/build/helpers.spec.js +70 -0
  31. package/build/helpers.spec.js.map +1 -0
  32. package/build/index.d.ts +4 -1
  33. package/build/index.js +3 -1
  34. package/build/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/AggregateRoot.ts +0 -15
  37. package/src/DomainEvent.ts +10 -13
  38. package/src/Entity.spec.ts +28 -5
  39. package/src/Entity.ts +37 -2
  40. package/src/EntityId.spec.ts +5 -4
  41. package/src/EntityId.ts +3 -3
  42. package/src/EventBus.spec.ts +108 -0
  43. package/src/EventBus.ts +2 -0
  44. package/src/eventBus/InMemoryEventBus.spec.ts +1 -5
  45. package/src/eventBus/InMemoryEventBus.ts +30 -5
  46. package/src/helpers.spec.ts +62 -0
  47. package/src/helpers.ts +25 -0
  48. package/src/index.ts +7 -1
  49. package/src/AggregateRoot.spec.ts +0 -35
package/README.md ADDED
@@ -0,0 +1,102 @@
1
+ ## Entity
2
+
3
+ ### Snapshots
4
+
5
+ ```typescript
6
+ // Створює копію властивостей сутності у вигляді простого об'єкта.
7
+ // Також зберігає початковий стан для відстеження змін (dirty checking).
8
+ const snapshot = entity.snapshot();
9
+
10
+ entity.isDirty(); // Повертає true, якщо сутність була змінена після створення знімка.
11
+ entity.snapshotDiff(); // Повертає об'єкт з відмінностями між поточним станом сутності та знімком. Або null, якщо змін немає.
12
+ ```
13
+
14
+ ## Events
15
+
16
+ ### EventBus
17
+
18
+ Сутність для керування подіями в системі.
19
+ В монолітних застосунках зазвичай використовується один глобальний EventBus і його можна описати за допомогою InMemoryEventBus, не потрібно залучати чергу, бо всі обробники працюють в одному процесі.
20
+
21
+ ```typescript
22
+ // Спершу треба описати події, які є в домені. Для цього є клас DomainEvent, який треба наслідувати.
23
+ class UserCreatedEvent extends DomainEvent<{ userId: string; username: string }> {
24
+ readonly eventName = 'UserCreatedEvent'; // без цього не буде працювати статична типізація
25
+ }
26
+ class UserUpdatedEvent extends DomainEvent<{ userId: string; username: string }> {
27
+ readonly eventName = 'UserUpdatedEvent';
28
+ }
29
+
30
+ // Далі створюємо підписника на події, реалізуючи інтерфейс DomainEventSubscriber
31
+ class NewUserSubscriber implements DomainEventSubscriber {
32
+ // Підписуємося на події, які нас цікавлять
33
+ subscribedTo() {
34
+ return [UserCreatedEvent, UserUpdatedEvent];
35
+ }
36
+
37
+ // Реалізуємо логіку обробки подій
38
+ async on(domainEvent: UserCreatedEvent|UserUpdatedEvent) {
39
+ console.log('Event received:', domainEvent);
40
+ }
41
+ }
42
+
43
+ // Далі створюємо EventBus і реєструємо підписника
44
+ const eventBus = new InMemoryEventBus();
45
+ const subscriber = new NewUserSubscriber();
46
+ eventBus.addSubscribers([subscriber]);
47
+ const event = new UserCreatedEvent({ userId: '1', username: 'john_doe' });
48
+ const event2 = new UserUpdatedEvent({ userId: '1', username: 'john_doe_updated' });
49
+ // Публікуємо події
50
+ await eventBus.publish([event, event2]);
51
+ ```
52
+
53
+ У поєднанні snapshot та EventBus можна реалізувати відстеження змін в сутностях і публікації відповідних подій.
54
+
55
+ ```typescript
56
+ class UserId extends EntityId<string> {}
57
+
58
+ interface IUser {
59
+ id: UserId;
60
+ username: string;
61
+ }
62
+
63
+ class User extends Entity<IUser, string, UserId> {
64
+ }
65
+
66
+ class UserCreatedEvent extends DomainEvent<Partial<IUser>> {
67
+ readonly eventName = 'UserCreatedEvent'; // без цього не буде працювати статична типізація
68
+ }
69
+
70
+ class ChangeLoggerSubscriber implements DomainEventSubscriber {
71
+ // Підписуємося на події, які нас цікавлять
72
+ subscribedTo() {
73
+ return [UserCreatedEvent];
74
+ }
75
+
76
+ // Реалізуємо логіку обробки подій
77
+ async on(domainEvent: UserCreatedEvent) {
78
+ console.log('Username changed:', domainEvent.username);
79
+ }
80
+ }
81
+
82
+ // Далі створюємо EventBus і реєструємо підписника
83
+ const eventBus = new InMemoryEventBus();
84
+ const subscriber = new NewUserSubscriber();
85
+ eventBus.addSubscribers([subscriber]);
86
+
87
+ const user = User.create({ id: new UserId('1'), username: 'john_doe' });
88
+ // Створюємо знімок початкового стану
89
+ user.snapshot();
90
+ // Змінюємо ім'я користувача
91
+ user.username = 'john_doe_updated';
92
+ // Перевіряємо, чи є зміни
93
+ if (user.isDirty()) {
94
+ const diff = user.snapshotDiff();
95
+ if (diff) {
96
+ // записуємо подію в чергу (не publish). Бо якщо в циклі може бути багато подій і їх треба назбирати, а потім виконати, тому збираємо через push
97
+ eventBus.push(new UserCreatedEvent(diff));
98
+ }
99
+ }
100
+ // Публікуємо всі події в черзі
101
+ await eventBus.publish();
102
+ ```
@@ -1,9 +1,4 @@
1
1
  import { Entity } from './Entity';
2
2
  import { EntityId } from './EntityId';
3
- import { DomainEvent } from "./DomainEvent";
4
3
  export declare abstract class AggregateRoot<T, E, H extends EntityId<E>> extends Entity<T, E, H> {
5
- private _domainEvents;
6
- pullDomainEvents(): DomainEvent<E>[];
7
- pushDomainEvent(event: DomainEvent<E>): void;
8
4
  }
9
- export type AnyAggregateRoot<T> = AggregateRoot<any, T, any>;
@@ -6,18 +6,8 @@ var Entity_1 = require("./Entity");
6
6
  var AggregateRoot = /** @class */ (function (_super) {
7
7
  tslib_1.__extends(AggregateRoot, _super);
8
8
  function AggregateRoot() {
9
- var _this = _super !== null && _super.apply(this, arguments) || this;
10
- _this._domainEvents = [];
11
- return _this;
9
+ return _super !== null && _super.apply(this, arguments) || this;
12
10
  }
13
- AggregateRoot.prototype.pullDomainEvents = function () {
14
- var domainEvents = this._domainEvents.slice();
15
- this._domainEvents = [];
16
- return domainEvents;
17
- };
18
- AggregateRoot.prototype.pushDomainEvent = function (event) {
19
- this._domainEvents.push(event);
20
- };
21
11
  return AggregateRoot;
22
12
  }(Entity_1.Entity));
23
13
  exports.AggregateRoot = AggregateRoot;
@@ -1 +1 @@
1
- {"version":3,"file":"AggregateRoot.js","sourceRoot":"","sources":["../src/AggregateRoot.ts"],"names":[],"mappings":";;;;AAAA,mCAAkC;AAIlC;IAAyE,yCAAe;IAAxF;;QACU,mBAAa,GAAqB,EAAE,CAAC;;IAW/C,CAAC;IATC,wCAAgB,GAAhB;QACE,IAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,uCAAe,GAAf,UAAgB,KAAqB;QACnC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IACH,oBAAC;AAAD,CAAC,AAZD,CAAyE,eAAM,GAY9E;AAZqB,sCAAa"}
1
+ {"version":3,"file":"AggregateRoot.js","sourceRoot":"","sources":["../src/AggregateRoot.ts"],"names":[],"mappings":";;;;AAAA,mCAAkC;AAGlC;IAAyE,yCAAe;IAAxF;;IACA,CAAC;IAAD,oBAAC;AAAD,CAAC,AADD,CAAyE,eAAM,GAC9E;AADqB,sCAAa"}
@@ -1,16 +1,12 @@
1
1
  import { EntityId } from "./EntityId";
2
- import { AnyAggregateRoot } from "./AggregateRoot";
3
2
  export declare abstract class DomainEvent<H> {
4
3
  static EVENT_NAME: string;
5
- readonly aggregate: AnyAggregateRoot<H>;
6
- readonly aggregateId: H;
7
- readonly eventId: EntityId<H>;
4
+ readonly props: H;
5
+ readonly eventId: EntityId<never>;
8
6
  readonly occurredOn: Date;
9
7
  readonly eventName: string;
10
- constructor(aggregate: AnyAggregateRoot<H>, eventId?: EntityId<H>, occurredOn?: Date);
11
- abstract toPrimitives(): DomainEventAttributes;
8
+ constructor(props: H, eventId?: EntityId<never>, occurredOn?: Date);
9
+ toPrimitives(): H;
12
10
  }
13
11
  export type AnyDomainEvent = DomainEvent<any>;
14
12
  export type DomainEventClass = typeof DomainEvent<any>;
15
- type DomainEventAttributes = any;
16
- export {};
@@ -3,14 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DomainEvent = void 0;
4
4
  var EntityId_1 = require("./EntityId");
5
5
  var DomainEvent = /** @class */ (function () {
6
- function DomainEvent(aggregate, eventId, occurredOn) {
6
+ function DomainEvent(props, eventId, occurredOn) {
7
+ var _a;
8
+ this.props = props;
7
9
  var event = this.constructor;
8
- this.eventName = event.EVENT_NAME;
10
+ this.eventName = (_a = event.EVENT_NAME) !== null && _a !== void 0 ? _a : this.constructor.name;
9
11
  this.eventId = eventId || new EntityId_1.EntityId();
10
- this.aggregate = aggregate;
11
- this.aggregateId = aggregate.id;
12
12
  this.occurredOn = occurredOn || new Date();
13
13
  }
14
+ DomainEvent.prototype.toPrimitives = function () {
15
+ return this.props;
16
+ };
17
+ ;
14
18
  return DomainEvent;
15
19
  }());
16
20
  exports.DomainEvent = DomainEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"DomainEvent.js","sourceRoot":"","sources":["../src/DomainEvent.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAGpC;IASE,qBAAY,SAA8B,EAAE,OAAqB,EAAE,UAAiB;QAClF,IAAM,KAAK,GAAuB,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,mBAAQ,EAAK,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAC7C,CAAC;IAGH,kBAAC;AAAD,CAAC,AAnBD,IAmBC;AAnBqB,kCAAW"}
1
+ {"version":3,"file":"DomainEvent.js","sourceRoot":"","sources":["../src/DomainEvent.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAEpC;IAQE,qBAAY,KAAQ,EAAE,OAAyB,EAAE,UAAiB;;QAChE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAM,KAAK,GAAuB,IAAI,CAAC,WAAW,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,MAAA,KAAK,CAAC,UAAU,mCAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,mBAAQ,EAAS,CAAC;QAChD,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,kCAAY,GAAZ;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAAA,CAAC;IACJ,kBAAC;AAAD,CAAC,AApBD,IAoBC;AApBqB,kCAAW"}
package/build/Entity.d.ts CHANGED
@@ -2,9 +2,14 @@ import { EntityId } from './EntityId';
2
2
  export declare abstract class Entity<T, E, H extends EntityId<E>> {
3
3
  protected readonly _id: H;
4
4
  protected props: T;
5
+ protected _snapshot: string;
6
+ snapshot(): T;
7
+ snapshotDiff(): Partial<T> | null;
8
+ isDirty(): boolean;
5
9
  protected constructor(props: T, id?: H | E);
6
10
  equals(object?: Entity<T, E, H>): boolean;
7
11
  get id(): H;
8
12
  toPrimitive(): T;
9
- toJSON(): T;
13
+ toJSON(): any;
14
+ toSnapshot(): any;
10
15
  }
package/build/Entity.js CHANGED
@@ -15,6 +15,31 @@ var Entity = /** @class */ (function () {
15
15
  }
16
16
  this.props = props;
17
17
  }
18
+ Entity.prototype.snapshot = function () {
19
+ this._snapshot = JSON.stringify(this.props);
20
+ var copy = JSON.parse(this._snapshot);
21
+ Object.freeze(copy);
22
+ return copy;
23
+ };
24
+ Entity.prototype.snapshotDiff = function () {
25
+ if (!this._snapshot) {
26
+ return null;
27
+ }
28
+ var diffs = {};
29
+ var copy = JSON.parse(this._snapshot);
30
+ for (var key in this.props) {
31
+ if (JSON.stringify(this.props[key]) !== JSON.stringify(copy[key])) {
32
+ diffs[key] = this.props[key];
33
+ }
34
+ }
35
+ return Object.keys(diffs).length > 0 ? diffs : null;
36
+ };
37
+ Entity.prototype.isDirty = function () {
38
+ if (!this._snapshot) {
39
+ return false;
40
+ }
41
+ return this._snapshot !== JSON.stringify(this.props);
42
+ };
18
43
  Entity.prototype.equals = function (object) {
19
44
  if (object === null || object === undefined) {
20
45
  return false;
@@ -37,9 +62,14 @@ var Entity = /** @class */ (function () {
37
62
  Entity.prototype.toPrimitive = function () {
38
63
  return this.props;
39
64
  };
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
66
  Entity.prototype.toJSON = function () {
41
67
  return this.toPrimitive();
42
68
  };
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ Entity.prototype.toSnapshot = function () {
71
+ return this.toPrimitive();
72
+ };
43
73
  return Entity;
44
74
  }());
45
75
  exports.Entity = Entity;
@@ -1 +1 @@
1
- {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AAEtC,IAAM,QAAQ,GAAG,UAA8B,CAAkB;IAC/D,OAAO,CAAC,YAAY,MAAM,CAAA;AAC5B,CAAC,CAAA;AAED;IAIE,gBAAsB,KAAQ,EAAE,EAAQ;QACtC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,GAAM,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,mBAAQ,CAAI,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAM,CAAC,IAAI,mBAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAEM,uBAAM,GAAb,UAAc,MAAwB;QACpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,sBAAI,sBAAE;aAAN;YACE,OAAO,IAAI,CAAC,GAAG,CAAA;QACjB,CAAC;;;OAAA;IAED,4BAAW,GAAX;QACE,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,uBAAM,GAAN;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IACH,aAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCqB,wBAAM"}
1
+ {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AAEtC,IAAM,QAAQ,GAAG,UAA8B,CAAkB;IAC/D,OAAO,CAAC,YAAY,MAAM,CAAA;AAC5B,CAAC,CAAA;AAED;IAiCE,gBAAsB,KAAQ,EAAE,EAAQ;QACtC,IAAI,EAAE,EAAE,CAAC;YACP,IAAI,CAAC,GAAG,GAAM,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,mBAAQ,CAAI,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,GAAM,CAAC,IAAI,mBAAQ,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAnCD,yBAAQ,GAAR;QACE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAM,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAAY,GAAZ;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,KAAK,IAAM,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAClE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAED,wBAAO,GAAP;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAWM,uBAAM,GAAb,UAAc,MAAwB;QACpC,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,sBAAI,sBAAE;aAAN;YACE,OAAO,IAAI,CAAC,GAAG,CAAA;QACjB,CAAC;;;OAAA;IAED,4BAAW,GAAX;QACE,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,8DAA8D;IAC9D,uBAAM,GAAN;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,8DAA8D;IAC9D,2BAAU,GAAV;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IACH,aAAC;AAAD,CAAC,AA3ED,IA2EC;AA3EqB,wBAAM"}
@@ -11,23 +11,37 @@ var TestEntity = /** @class */ (function (_super) {
11
11
  TestEntity.create = function (props, id) {
12
12
  return new TestEntity(props, id);
13
13
  };
14
+ Object.defineProperty(TestEntity.prototype, "name", {
15
+ set: function (name) {
16
+ this.props.name = name;
17
+ },
18
+ enumerable: false,
19
+ configurable: true
20
+ });
21
+ Object.defineProperty(TestEntity.prototype, "testId", {
22
+ set: function (val) {
23
+ this.props.testId = val;
24
+ },
25
+ enumerable: false,
26
+ configurable: true
27
+ });
14
28
  return TestEntity;
15
29
  }(Entity_1.Entity));
16
30
  describe('Entity', function () {
17
31
  var entity;
18
32
  beforeAll(function () {
19
- entity = TestEntity.create({ name: 'test' }, 1);
33
+ entity = TestEntity.create({ name: 'test', testId: new EntityId_1.EntityId('1') }, '1');
20
34
  });
21
35
  test('base', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
22
36
  var entityNew, entity2, entity3;
23
37
  return tslib_1.__generator(this, function (_a) {
24
38
  entityNew = TestEntity.create({ name: 'test2' });
25
39
  expect(entityNew.id.toString().length).toEqual(36); // random id
26
- entity2 = TestEntity.create({ name: 'test2' }, 1);
40
+ entity2 = TestEntity.create({ name: 'test2' }, '1');
27
41
  expect(entity.equals(entity2)).toBeTruthy(); // same id
28
42
  expect(entity.equals(entity)).toBeTruthy(); // same instance
29
43
  expect(entity.equals(null)).toBeFalsy(); // null
30
- expect(entity.equals({ id: new EntityId_1.EntityId(1) })).toBeFalsy(); // not Entity
44
+ expect(entity.equals({ id: new EntityId_1.EntityId('1') })).toBeFalsy(); // not Entity
31
45
  expect(entity.id.toPrimitive()).toEqual('1');
32
46
  expect(entity.id.toString()).toEqual('6061cf31-edcb-5d22-9adc-927af7c186fa');
33
47
  entity3 = TestEntity.create({ name: 'test2' }, entity.id);
@@ -37,5 +51,21 @@ describe('Entity', function () {
37
51
  return [2 /*return*/];
38
52
  });
39
53
  }); });
54
+ test('snapshot', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
55
+ var snapshot;
56
+ return tslib_1.__generator(this, function (_a) {
57
+ snapshot = entity.snapshot();
58
+ expect(snapshot).toEqual({ name: 'test', testId: new EntityId_1.EntityId('1') });
59
+ expect(function () {
60
+ snapshot.name = 'changed';
61
+ }).toThrow();
62
+ expect(entity.isDirty()).toEqual(false);
63
+ expect(entity.snapshotDiff()).toEqual(null);
64
+ entity.name = 'test changed';
65
+ expect(entity.isDirty()).toEqual(true);
66
+ expect(entity.snapshotDiff()).toEqual({ "name": "test changed" });
67
+ return [2 /*return*/];
68
+ });
69
+ }); });
40
70
  });
41
71
  //# sourceMappingURL=Entity.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAClC,uCAAsC;AAKtC;IAAyB,sCAA2C;IAApE;;IAIA,CAAC;IAHQ,iBAAM,GAAb,UAAc,KAAgB,EAAE,EAA2B;QACzD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IACH,iBAAC;AAAD,CAAC,AAJD,CAAyB,eAAM,GAI9B;AAED,QAAQ,CAAC,QAAQ,EAAE;IACjB,IAAI,MAAkB,CAAC;IAEvB,SAAS,CAAC;QACR,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE;;;YACL,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;YAE1D,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU;YACvD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,gBAAgB;YAC5D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO;YAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAa,EAAE,EAAE,EAAE,IAAI,mBAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa;YACrF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YAEvE,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU;YACvD,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;;;SAC/E,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  export declare class EntityId<T> {
2
2
  protected _recordId: T | null;
3
3
  protected _uuid: string;
4
- constructor(recordId?: T, isHash?: boolean, uuid?: string);
4
+ constructor(recordId?: T | string, isHash?: boolean, uuid?: string);
5
5
  private createUUID;
6
6
  get hashOptions(): [string, number];
7
7
  toHash(): string;
8
- fromHash(hash: string): EntityId<T>;
8
+ protected fromHash(hash: string): EntityId<T>;
9
9
  toPrimitive(): T;
10
10
  toString(): string;
11
11
  equals(id: EntityId<T>): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityId.js","sourceRoot":"","sources":["../src/EntityId.ts"],"names":[],"mappings":";;;;AAAA,0EAAuC;AACvC,8CAA+C;AAC/C,4DAA8B;AAC9B,+CAA4C;AAE5C;IAIE,kBAAY,QAAkB,EAAE,MAAsB,EAAE,IAAmB;QAA/D,yBAAA,EAAA,eAAkB;QAAE,uBAAA,EAAA,cAAsB;QAAE,qBAAA,EAAA,WAAmB;QAHjE,cAAS,GAAW,IAAI,CAAC;QACzB,UAAK,GAAW,IAAI,CAAC;QAG7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,6BAAU,GAAlB;QACE,IAAI,CAAC,KAAK,GAAG,IAAA,wBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAA,gBAAQ,GAAE,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,CAAC;IAED,sBAAI,iCAAW;aAAf;YACE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,yBAAM,GAAN;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,2BAAQ,GAAR,UAAS,IAAY;QACnB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,IAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,qBAAS,CAAC,uBAAgB,IAAI,CAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,GAAM,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAAW,GAAX;QACE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,yBAAM,GAAN,UAAO,EAAe;QACpB,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC;IACjC,CAAC;IACH,eAAC;AAAD,CAAC,AAvDD,IAuDC;AAvDY,4BAAQ"}
1
+ {"version":3,"file":"EntityId.js","sourceRoot":"","sources":["../src/EntityId.ts"],"names":[],"mappings":";;;;AAAA,0EAAuC;AACvC,8CAA+C;AAC/C,4DAA8B;AAC9B,+CAA4C;AAE5C;IAIE,kBAAY,QAAyB,EAAE,MAAsB,EAAE,IAAmB;QAAtE,yBAAA,EAAA,eAAyB;QAAE,uBAAA,EAAA,cAAsB;QAAE,qBAAA,EAAA,WAAmB;QAHxE,cAAS,GAAW,IAAI,CAAC;QACzB,UAAK,GAAW,IAAI,CAAC;QAG7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,6BAAU,GAAlB;QACE,IAAI,CAAC,KAAK,GAAG,IAAA,wBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAA,gBAAQ,GAAE,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,CAAC;IAED,sBAAI,iCAAW;aAAf;YACE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,yBAAM,GAAN;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAES,2BAAQ,GAAlB,UAAmB,IAAY;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,IAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,qBAAS,CAAC,uBAAgB,IAAI,CAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,GAAM,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAAW,GAAX;QACE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,yBAAM,GAAN,UAAO,EAAe;QACpB,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC;IACjC,CAAC;IACH,eAAC;AAAD,CAAC,AAvDD,IAuDC;AAvDY,4BAAQ"}
@@ -49,16 +49,17 @@ describe('ValueObject', function () {
49
49
  });
50
50
  }); });
51
51
  test('toHash', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
52
- var id, id2, id3;
52
+ var id, idFromHash, id2, id3;
53
53
  return tslib_1.__generator(this, function (_a) {
54
54
  id = new Test2Id('123');
55
55
  expect(id.toHash()).toEqual('9KdMR');
56
- expect(id.fromHash('VLoxm').toPrimitive()).toEqual('1');
57
- expect(id.toPrimitive()).toEqual('1');
58
- expect(id.toString()).toEqual('090bb5d1-267b-5967-84c8-95bc1bda380f');
56
+ idFromHash = new Test2Id('VLoxm', true);
57
+ expect(idFromHash.toPrimitive()).toEqual('1');
58
+ expect(idFromHash.toPrimitive()).toEqual('1');
59
+ expect(idFromHash.toString()).toEqual('090bb5d1-267b-5967-84c8-95bc1bda380f');
59
60
  id2 = new TestId(123);
60
61
  expect(id2.toHash()).toEqual('BJejP');
61
- expect(id2.fromHash('BJejP').toPrimitive()).toEqual(123);
62
+ expect(new TestId('BJejP', true).toPrimitive()).toEqual('123');
62
63
  id3 = new Test2Id();
63
64
  expect(function () { return id3.toHash(); }).toThrow('Cannot hash an empty recordId');
64
65
  return [2 /*return*/];
@@ -1 +1 @@
1
- {"version":3,"file":"EntityId.spec.js","sourceRoot":"","sources":["../src/EntityId.spec.ts"],"names":[],"mappings":";;;AAAA,uCAAsC;AACtC,+CAA4C;AAE5C;IAAqB,kCAAgB;IAArC;;IACA,CAAC;IAAD,aAAC;AAAD,CAAC,AADD,CAAqB,mBAAQ,GAC5B;AAED;IAAsB,mCAAgB;IAAtC;;IACA,CAAC;IAAD,cAAC;AAAD,CAAC,AADD,CAAsB,mBAAQ,GAC7B;AAED,QAAQ,CAAC,aAAa,EAAE;IACtB,IAAI,CAAC,MAAM,EAAE;;;YACL,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;YACnB,GAAG,GAAG,IAAI,mBAAQ,CAAC,GAAG,CAAC,CAAC;YACxB,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEtB,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;;;SACzC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE;;YACf,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAErB,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAE9D,IAAI,CAAC;gBACH,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;YAC1B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,sDAAsD;gBACtD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,qBAAS,CAAC,CAAC;gBACtC,sDAAsD;gBACtD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAClD,CAAC;;;SACF,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,EAAE;;;YACP,EAAE,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxD,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YAEhE,GAAG,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEnD,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,cAAM,OAAA,GAAG,CAAC,MAAM,EAAE,EAAZ,CAAY,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;;;SACrE,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"EntityId.spec.js","sourceRoot":"","sources":["../src/EntityId.spec.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { AnyDomainEvent } from './DomainEvent';
2
2
  import { DomainEventSubscriber } from "./DomainEventSubscriber";
3
3
  export interface EventBus {
4
+ push(event: AnyDomainEvent): Promise<void>;
5
+ clear(): Promise<void>;
4
6
  publish(events: AnyDomainEvent[]): Promise<void>;
5
7
  addSubscribers(subscribers: DomainEventSubscriber[]): void;
6
8
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var InMemoryEventBus_1 = require("./eventBus/InMemoryEventBus");
5
+ var DomainEvent_1 = require("./DomainEvent");
6
+ var EntityId_1 = require("./EntityId");
7
+ var Entity_1 = require("./Entity");
8
+ describe('EventBus', function () {
9
+ var NewUserCreated = /** @class */ (function (_super) {
10
+ tslib_1.__extends(NewUserCreated, _super);
11
+ function NewUserCreated() {
12
+ return _super !== null && _super.apply(this, arguments) || this;
13
+ }
14
+ return NewUserCreated;
15
+ }(DomainEvent_1.DomainEvent));
16
+ var NewUserCreated2 = /** @class */ (function (_super) {
17
+ tslib_1.__extends(NewUserCreated2, _super);
18
+ function NewUserCreated2() {
19
+ return _super !== null && _super.apply(this, arguments) || this;
20
+ }
21
+ NewUserCreated2.EVENT_NAME = 'Event2';
22
+ return NewUserCreated2;
23
+ }(DomainEvent_1.DomainEvent));
24
+ var NewUserSubscriber = /** @class */ (function () {
25
+ function NewUserSubscriber() {
26
+ }
27
+ NewUserSubscriber.prototype.subscribedTo = function () {
28
+ return [NewUserCreated, NewUserCreated2];
29
+ };
30
+ NewUserSubscriber.prototype.on = function (domainEvent) {
31
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
32
+ return tslib_1.__generator(this, function (_a) {
33
+ console.log('Event received:', domainEvent);
34
+ return [2 /*return*/];
35
+ });
36
+ });
37
+ };
38
+ return NewUserSubscriber;
39
+ }());
40
+ test('lifecycle', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
41
+ var newUserSubscriber, hub, event, event2;
42
+ return tslib_1.__generator(this, function (_a) {
43
+ switch (_a.label) {
44
+ case 0:
45
+ newUserSubscriber = new NewUserSubscriber();
46
+ newUserSubscriber.on = jest.fn();
47
+ hub = new InMemoryEventBus_1.InMemoryEventBus();
48
+ hub.addSubscribers([newUserSubscriber]);
49
+ event = new NewUserCreated({ username: 'test' });
50
+ event2 = new NewUserCreated2({ username: 'test2' });
51
+ expect(event.eventName).toEqual('NewUserCreated');
52
+ expect(event2.eventName).toEqual('Event2');
53
+ return [4 /*yield*/, hub.publish([event, event2])];
54
+ case 1:
55
+ _a.sent();
56
+ expect(newUserSubscriber.on).toHaveBeenCalledTimes(2);
57
+ return [2 /*return*/];
58
+ }
59
+ });
60
+ }); });
61
+ test('user example', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
62
+ var UserId, User, UserCreatedEvent, ChangeLoggerSubscriber, eventBus, subscriber, mockOn, user, event, diff;
63
+ return tslib_1.__generator(this, function (_a) {
64
+ switch (_a.label) {
65
+ case 0:
66
+ UserId = /** @class */ (function (_super) {
67
+ tslib_1.__extends(UserId, _super);
68
+ function UserId() {
69
+ return _super !== null && _super.apply(this, arguments) || this;
70
+ }
71
+ return UserId;
72
+ }(EntityId_1.EntityId));
73
+ User = /** @class */ (function (_super) {
74
+ tslib_1.__extends(User, _super);
75
+ function User() {
76
+ return _super !== null && _super.apply(this, arguments) || this;
77
+ }
78
+ User.create = function (props) {
79
+ return new User(props, props.id);
80
+ };
81
+ Object.defineProperty(User.prototype, "username", {
82
+ get: function () {
83
+ return this.props.username;
84
+ },
85
+ set: function (username) {
86
+ this.props.username = username;
87
+ },
88
+ enumerable: false,
89
+ configurable: true
90
+ });
91
+ return User;
92
+ }(Entity_1.Entity));
93
+ UserCreatedEvent = /** @class */ (function (_super) {
94
+ tslib_1.__extends(UserCreatedEvent, _super);
95
+ function UserCreatedEvent() {
96
+ var _this = _super !== null && _super.apply(this, arguments) || this;
97
+ _this.eventName = 'UserCreatedEvent'; // без цього не буде працювати статична типізація
98
+ return _this;
99
+ }
100
+ Object.defineProperty(UserCreatedEvent.prototype, "username", {
101
+ get: function () {
102
+ return this.props.username;
103
+ },
104
+ enumerable: false,
105
+ configurable: true
106
+ });
107
+ return UserCreatedEvent;
108
+ }(DomainEvent_1.DomainEvent));
109
+ ChangeLoggerSubscriber = /** @class */ (function () {
110
+ function ChangeLoggerSubscriber() {
111
+ }
112
+ // Підписуємося на події, які нас цікавлять
113
+ ChangeLoggerSubscriber.prototype.subscribedTo = function () {
114
+ return [UserCreatedEvent];
115
+ };
116
+ // Реалізуємо логіку обробки подій
117
+ ChangeLoggerSubscriber.prototype.on = function (domainEvent) {
118
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
119
+ return tslib_1.__generator(this, function (_a) {
120
+ console.log('Username changed:', domainEvent.username);
121
+ return [2 /*return*/];
122
+ });
123
+ });
124
+ };
125
+ return ChangeLoggerSubscriber;
126
+ }());
127
+ eventBus = new InMemoryEventBus_1.InMemoryEventBus();
128
+ subscriber = new ChangeLoggerSubscriber();
129
+ mockOn = jest.spyOn(subscriber, 'on');
130
+ eventBus.addSubscribers([subscriber]);
131
+ user = User.create({ id: new UserId('1'), username: 'john_doe' });
132
+ // Створюємо знімок початкового стану
133
+ user.snapshot();
134
+ // Змінюємо ім'я користувача
135
+ user.username = 'john_doe_updated';
136
+ // Перевіряємо, чи є зміни
137
+ if (user.isDirty()) {
138
+ diff = user.snapshotDiff();
139
+ if (diff) {
140
+ event = new UserCreatedEvent(diff);
141
+ // записуємо подію в чергу (не publish). Бо якщо в циклі може бути багато подій і їх треба назбирати, а потім виконати, тому збираємо через push
142
+ eventBus.push(event);
143
+ }
144
+ }
145
+ expect(mockOn).not.toHaveBeenCalled();
146
+ // Публікуємо всі події в черзі
147
+ return [4 /*yield*/, eventBus.publish()];
148
+ case 1:
149
+ // Публікуємо всі події в черзі
150
+ _a.sent();
151
+ expect(mockOn).toHaveBeenCalledWith(event);
152
+ return [2 /*return*/];
153
+ }
154
+ });
155
+ }); });
156
+ });
157
+ //# sourceMappingURL=EventBus.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBus.spec.js","sourceRoot":"","sources":["../src/EventBus.spec.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,14 @@ import { EventEmitter } from 'events';
3
3
  import { AnyDomainEvent } from '../DomainEvent';
4
4
  import { EventBus } from '../EventBus';
5
5
  import { DomainEventSubscriber } from "../DomainEventSubscriber";
6
- export declare class InMemoryEventBus extends EventEmitter implements EventBus {
7
- publish(events: AnyDomainEvent[]): Promise<void>;
6
+ export declare class InMemoryEventBus implements EventBus {
7
+ protected _events: AnyDomainEvent[];
8
+ protected _emitter: EventEmitter;
9
+ constructor();
10
+ push(event: AnyDomainEvent): Promise<void>;
11
+ clear(): Promise<void>;
12
+ publish(events?: AnyDomainEvent[]): Promise<void>;
13
+ on(event: string, listener: (...args: never[]) => void): void;
14
+ listenerCount(event: string): number;
8
15
  addSubscribers(subscribers: DomainEventSubscriber[]): void;
9
16
  }