@pocket-architect/core 0.1.19 → 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.
package/build/Entity.d.ts CHANGED
@@ -10,5 +10,6 @@ export declare abstract class Entity<T, E, H extends EntityId<E>> {
10
10
  equals(object?: Entity<T, E, H>): boolean;
11
11
  get id(): H;
12
12
  toPrimitive(): T;
13
- toJSON(): T;
13
+ toJSON(): any;
14
+ toSnapshot(): any;
14
15
  }
package/build/Entity.js CHANGED
@@ -62,9 +62,14 @@ var Entity = /** @class */ (function () {
62
62
  Entity.prototype.toPrimitive = function () {
63
63
  return this.props;
64
64
  };
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
66
  Entity.prototype.toJSON = function () {
66
67
  return this.toPrimitive();
67
68
  };
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ Entity.prototype.toSnapshot = function () {
71
+ return this.toPrimitive();
72
+ };
68
73
  return Entity;
69
74
  }());
70
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;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,uBAAM,GAAN;QACE,OAAO,IAAI,CAAC,WAAW,EAAE,CAAA;IAC3B,CAAC;IACH,aAAC;AAAD,CAAC,AArED,IAqEC;AArEqB,wBAAM"}
1
+ {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":"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"}
@@ -18,12 +18,19 @@ var TestEntity = /** @class */ (function (_super) {
18
18
  enumerable: false,
19
19
  configurable: true
20
20
  });
21
+ Object.defineProperty(TestEntity.prototype, "testId", {
22
+ set: function (val) {
23
+ this.props.testId = val;
24
+ },
25
+ enumerable: false,
26
+ configurable: true
27
+ });
21
28
  return TestEntity;
22
29
  }(Entity_1.Entity));
23
30
  describe('Entity', function () {
24
31
  var entity;
25
32
  beforeAll(function () {
26
- entity = TestEntity.create({ name: 'test' }, '1');
33
+ entity = TestEntity.create({ name: 'test', testId: new EntityId_1.EntityId('1') }, '1');
27
34
  });
28
35
  test('base', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
29
36
  var entityNew, entity2, entity3;
@@ -48,7 +55,7 @@ describe('Entity', function () {
48
55
  var snapshot;
49
56
  return tslib_1.__generator(this, function (_a) {
50
57
  snapshot = entity.snapshot();
51
- expect(snapshot).toEqual({ name: 'test' });
58
+ expect(snapshot).toEqual({ name: 'test', testId: new EntityId_1.EntityId('1') });
52
59
  expect(function () {
53
60
  snapshot.name = 'changed';
54
61
  }).toThrow();
@@ -1 +1 @@
1
- {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
@@ -3,10 +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 {
6
+ export declare class InMemoryEventBus implements EventBus {
7
7
  protected _events: AnyDomainEvent[];
8
+ protected _emitter: EventEmitter;
9
+ constructor();
8
10
  push(event: AnyDomainEvent): Promise<void>;
9
11
  clear(): Promise<void>;
10
12
  publish(events?: AnyDomainEvent[]): Promise<void>;
13
+ on(event: string, listener: (...args: never[]) => void): void;
14
+ listenerCount(event: string): number;
11
15
  addSubscribers(subscribers: DomainEventSubscriber[]): void;
12
16
  }
@@ -3,12 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InMemoryEventBus = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var events_1 = require("events");
6
- var InMemoryEventBus = /** @class */ (function (_super) {
7
- tslib_1.__extends(InMemoryEventBus, _super);
6
+ var InMemoryEventBus = /** @class */ (function () {
8
7
  function InMemoryEventBus() {
9
- var _this = _super !== null && _super.apply(this, arguments) || this;
10
- _this._events = [];
11
- return _this;
8
+ this._events = [];
9
+ this._emitter = new events_1.EventEmitter();
12
10
  }
13
11
  InMemoryEventBus.prototype.push = function (event) {
14
12
  return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -36,7 +34,7 @@ var InMemoryEventBus = /** @class */ (function (_super) {
36
34
  allEvents = (this._events || []).concat(events !== null && events !== void 0 ? events : []);
37
35
  for (_i = 0, allEvents_1 = allEvents; _i < allEvents_1.length; _i++) {
38
36
  event = allEvents_1[_i];
39
- this.emit(event.eventName, event);
37
+ this._emitter.emit(event.eventName, event);
40
38
  }
41
39
  return [4 /*yield*/, this.clear()];
42
40
  case 1:
@@ -46,6 +44,12 @@ var InMemoryEventBus = /** @class */ (function (_super) {
46
44
  });
47
45
  });
48
46
  };
47
+ InMemoryEventBus.prototype.on = function (event, listener) {
48
+ this._emitter.on(event, listener);
49
+ };
50
+ InMemoryEventBus.prototype.listenerCount = function (event) {
51
+ return this._emitter.listenerCount(event);
52
+ };
49
53
  InMemoryEventBus.prototype.addSubscribers = function (subscribers) {
50
54
  var _a;
51
55
  for (var _i = 0, subscribers_1 = subscribers; _i < subscribers_1.length; _i++) {
@@ -53,11 +57,11 @@ var InMemoryEventBus = /** @class */ (function (_super) {
53
57
  var events = subscriber.subscribedTo();
54
58
  for (var _b = 0, events_2 = events; _b < events_2.length; _b++) {
55
59
  var event = events_2[_b];
56
- this.on((_a = event.EVENT_NAME) !== null && _a !== void 0 ? _a : event.name, subscriber.on.bind(subscriber));
60
+ this._emitter.on((_a = event.EVENT_NAME) !== null && _a !== void 0 ? _a : event.name, subscriber.on.bind(subscriber));
57
61
  }
58
62
  }
59
63
  };
60
64
  return InMemoryEventBus;
61
- }(events_1.EventEmitter));
65
+ }());
62
66
  exports.InMemoryEventBus = InMemoryEventBus;
63
67
  //# sourceMappingURL=InMemoryEventBus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryEventBus.js","sourceRoot":"","sources":["../../src/eventBus/InMemoryEventBus.ts"],"names":[],"mappings":";;;;AAAA,iCAAsC;AAKtC;IAAsC,4CAAY;IAAlD;;QACY,aAAO,GAAqB,EAAE,CAAC;;IA0B3C,CAAC;IAxBO,+BAAI,GAAV,UAAW,KAAqB;;;gBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;KAC1B;IAEK,gCAAK,GAAX;;;gBACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;;;KACnB;IAEK,kCAAO,GAAb,UAAc,MAA6B;QAA7B,uBAAA,EAAA,WAA6B;;;;;;wBACnC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;wBAC5D,WAA6B,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE,CAAC;4BAArB,KAAK;4BACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBACpC,CAAC;wBACD,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;;;;;KACpB;IAED,yCAAc,GAAd,UAAe,WAAoC;;QACjD,KAAyB,UAAW,EAAX,2BAAW,EAAX,yBAAW,EAAX,IAAW,EAAE,CAAC;YAAlC,IAAM,UAAU,oBAAA;YACnB,IAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,KAAoB,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,EAAE,CAAC;gBAAxB,IAAM,KAAK,eAAA;gBACd,IAAI,CAAC,EAAE,CAAC,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AA3BD,CAAsC,qBAAY,GA2BjD;AA3BY,4CAAgB"}
1
+ {"version":3,"file":"InMemoryEventBus.js","sourceRoot":"","sources":["../../src/eventBus/InMemoryEventBus.ts"],"names":[],"mappings":";;;;AAAA,iCAAsC;AAKtC;IAIE;QAHU,YAAO,GAAqB,EAAE,CAAC;QAIvC,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAY,EAAE,CAAC;IACrC,CAAC;IAEK,+BAAI,GAAV,UAAW,KAAqB;;;gBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;KAC1B;IAEK,gCAAK,GAAX;;;gBACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;;;KACnB;IAEK,kCAAO,GAAb,UAAc,MAA6B;QAA7B,uBAAA,EAAA,WAA6B;;;;;;wBACnC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;wBAC5D,WAA6B,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE,CAAC;4BAArB,KAAK;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBAC7C,CAAC;wBACD,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;;;;;KACpB;IAED,6BAAE,GAAF,UAAG,KAAa,EAAE,QAAoC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,wCAAa,GAAb,UAAc,KAAa;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,yCAAc,GAAd,UAAe,WAAoC;;QACjD,KAAyB,UAAW,EAAX,2BAAW,EAAX,yBAAW,EAAX,IAAW,EAAE,CAAC;YAAlC,IAAM,UAAU,oBAAA;YACnB,IAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,KAAoB,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,EAAE,CAAC;gBAAxB,IAAM,KAAK,eAAA;gBACd,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,4CAAgB"}
@@ -0,0 +1 @@
1
+ export declare function createSnapshot<T>(obj: T): T;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSnapshot = void 0;
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ function createSnapshot(obj) {
6
+ if (!obj) {
7
+ return obj;
8
+ }
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore
11
+ if (typeof obj.toSnapshot === 'function') {
12
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
13
+ // @ts-ignore
14
+ return obj.toSnapshot();
15
+ }
16
+ var copy = {};
17
+ for (var key in obj) {
18
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
19
+ continue;
20
+ }
21
+ if (typeof obj[key] !== 'object') {
22
+ copy[key] = obj[key];
23
+ continue;
24
+ }
25
+ copy[key] = createSnapshot(obj[key]);
26
+ }
27
+ return copy;
28
+ }
29
+ exports.createSnapshot = createSnapshot;
30
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAAA,8DAA8D;AAC9D,SAAgB,cAAc,CAAI,GAAM;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IACD,6DAA6D;IAC7D,aAAa;IACb,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACzC,6DAA6D;QAC7D,aAAa;QACb,OAAO,GAAG,CAAC,UAAU,EAAO,CAAC;IAC/B,CAAC;IACD,IAAM,IAAI,GAAK,EAAO,CAAC;IACvB,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAvBD,wCAuBC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var helpers_1 = require("./helpers");
5
+ var EntityId_1 = require("./EntityId");
6
+ var Entity_1 = require("./Entity");
7
+ var TestEntity = /** @class */ (function (_super) {
8
+ tslib_1.__extends(TestEntity, _super);
9
+ function TestEntity() {
10
+ return _super !== null && _super.apply(this, arguments) || this;
11
+ }
12
+ TestEntity.create = function (props, id) {
13
+ return new TestEntity(props, id);
14
+ };
15
+ Object.defineProperty(TestEntity.prototype, "name", {
16
+ set: function (name) {
17
+ this.props.name = name;
18
+ },
19
+ enumerable: false,
20
+ configurable: true
21
+ });
22
+ Object.defineProperty(TestEntity.prototype, "testId", {
23
+ set: function (val) {
24
+ this.props.testId = val;
25
+ },
26
+ enumerable: false,
27
+ configurable: true
28
+ });
29
+ TestEntity.prototype.toSnapshot = function () {
30
+ return tslib_1.__assign(tslib_1.__assign({}, this.props), { testId: undefined });
31
+ };
32
+ return TestEntity;
33
+ }(Entity_1.Entity));
34
+ describe('helpers', function () {
35
+ test('createSnapshot', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
36
+ var original, snapshot, item, itemSnapshot;
37
+ return tslib_1.__generator(this, function (_a) {
38
+ original = {
39
+ a: 1,
40
+ b: 'test',
41
+ c: {
42
+ d: 2,
43
+ e: 'nested',
44
+ f: {
45
+ g: 3
46
+ }
47
+ },
48
+ id: new EntityId_1.EntityId('1'),
49
+ };
50
+ snapshot = (0, helpers_1.createSnapshot)(original);
51
+ expect(snapshot).toEqual(original);
52
+ expect(snapshot).not.toBe(original);
53
+ expect(snapshot.c).not.toBe(original.c);
54
+ expect(snapshot.c.f).not.toBe(original.c.f);
55
+ expect(snapshot.id).not.toBe(original.id);
56
+ expect(snapshot.id).toEqual(new EntityId_1.EntityId('1'));
57
+ item = TestEntity.create({
58
+ name: 'test',
59
+ testId: new EntityId_1.EntityId('2')
60
+ }, '2');
61
+ itemSnapshot = (0, helpers_1.createSnapshot)(item);
62
+ expect(itemSnapshot).toEqual({
63
+ name: 'test',
64
+ testId: undefined
65
+ });
66
+ return [2 /*return*/];
67
+ });
68
+ }); });
69
+ });
70
+ //# sourceMappingURL=helpers.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,uCAAoC;AACpC,mCAAgC;AAMhC;IAAyB,sCAA2C;IAApE;;IAmBA,CAAC;IAlBQ,iBAAM,GAAb,UAAc,KAAgB,EAAE,EAA2B;QACzD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,sBAAI,4BAAI;aAAR,UAAS,IAAY;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,CAAC;;;OAAA;IAED,sBAAI,8BAAM;aAAV,UAAW,GAAqB;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAC1B,CAAC;;;OAAA;IAED,+BAAU,GAAV;QACE,OAAO,sCACF,IAAI,CAAC,KAAK,KACb,MAAM,EAAE,SAAS,GACT,CAAC;IACb,CAAC;IACH,iBAAC;AAAD,CAAC,AAnBD,CAAyB,eAAM,GAmB9B;AAED,QAAQ,CAAC,SAAS,EAAE;IAClB,IAAI,CAAC,gBAAgB,EAAE;;;YACf,QAAQ,GAAG;gBACf,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,QAAQ;oBACX,CAAC,EAAE;wBACD,CAAC,EAAE,CAAC;qBACL;iBACF;gBACD,EAAE,EAAE,IAAI,mBAAQ,CAAS,GAAG,CAAC;aAC9B,CAAC;YACI,QAAQ,GAAG,IAAA,wBAAc,EAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,mBAAQ,CAAS,GAAG,CAAC,CAAC,CAAC;YAEjD,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC7B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI,mBAAQ,CAAC,GAAG,CAAC;aAC1B,EAAE,GAAG,CAAC,CAAC;YACF,YAAY,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;;;SACJ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/build/index.d.ts CHANGED
@@ -3,4 +3,7 @@ import { EntityId } from './EntityId';
3
3
  import { ValueObject } from './ValueObject';
4
4
  import { AggregateRoot } from './AggregateRoot';
5
5
  import { HashError } from './error/HashError';
6
- export { Entity, EntityId, ValueObject, AggregateRoot, HashError };
6
+ import { DomainEvent } from './DomainEvent';
7
+ import { DomainEventSubscriber } from './DomainEventSubscriber';
8
+ import { EventBus } from './EventBus';
9
+ export { Entity, EntityId, ValueObject, AggregateRoot, HashError, DomainEvent, DomainEventSubscriber, EventBus };
package/build/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
3
+ exports.DomainEvent = exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
4
4
  var Entity_1 = require("./Entity");
5
5
  Object.defineProperty(exports, "Entity", { enumerable: true, get: function () { return Entity_1.Entity; } });
6
6
  var EntityId_1 = require("./EntityId");
@@ -11,4 +11,6 @@ var AggregateRoot_1 = require("./AggregateRoot");
11
11
  Object.defineProperty(exports, "AggregateRoot", { enumerable: true, get: function () { return AggregateRoot_1.AggregateRoot; } });
12
12
  var HashError_1 = require("./error/HashError");
13
13
  Object.defineProperty(exports, "HashError", { enumerable: true, get: function () { return HashError_1.HashError; } });
14
+ var DomainEvent_1 = require("./DomainEvent");
15
+ Object.defineProperty(exports, "DomainEvent", { enumerable: true, get: function () { return DomainEvent_1.DomainEvent; } });
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAOhC,uFAPO,eAAM,OAOP;AANR,uCAAsC;AAOpC,yFAPO,mBAAQ,OAOP;AANV,6CAA4C;AAO1C,4FAPO,yBAAW,OAOP;AANb,iDAAgD;AAO9C,8FAPO,6BAAa,OAOP;AANf,+CAA8C;AAO5C,0FAPO,qBAAS,OAOP"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAUhC,uFAVO,eAAM,OAUP;AATR,uCAAsC;AAUpC,yFAVO,mBAAQ,OAUP;AATV,6CAA4C;AAU1C,4FAVO,yBAAW,OAUP;AATb,iDAAgD;AAU9C,8FAVO,6BAAa,OAUP;AATf,+CAA8C;AAU5C,0FAVO,qBAAS,OAUP;AATX,6CAA4C;AAU1C,4FAVO,yBAAW,OAUP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pocket-architect/core",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -3,6 +3,7 @@ import { EntityId } from './EntityId';
3
3
 
4
4
  interface TestProps {
5
5
  name: string;
6
+ testId?: EntityId<string>;
6
7
  }
7
8
  class TestEntity extends Entity<TestProps, string, EntityId<string>> {
8
9
  static create(props: TestProps, id?:EntityId<string>|string): TestEntity {
@@ -12,13 +13,17 @@ class TestEntity extends Entity<TestProps, string, EntityId<string>> {
12
13
  set name(name: string) {
13
14
  this.props.name = name;
14
15
  }
16
+
17
+ set testId(val: EntityId<string>) {
18
+ this.props.testId = val;
19
+ }
15
20
  }
16
21
 
17
22
  describe('Entity', () => {
18
23
  let entity: TestEntity;
19
24
 
20
25
  beforeAll(() => {
21
- entity = TestEntity.create({ name: 'test' }, '1');
26
+ entity = TestEntity.create({ name: 'test', testId: new EntityId('1') }, '1');
22
27
  });
23
28
 
24
29
  test('base', async () => {
@@ -41,7 +46,7 @@ describe('Entity', () => {
41
46
 
42
47
  test('snapshot', async () => {
43
48
  const snapshot = entity.snapshot();
44
- expect(snapshot).toEqual({ name: 'test' });
49
+ expect(snapshot).toEqual({ name: 'test', testId: new EntityId('1') });
45
50
 
46
51
  expect(() => {
47
52
  snapshot.name = 'changed';
package/src/Entity.ts CHANGED
@@ -70,7 +70,13 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
70
70
  return this.props
71
71
  }
72
72
 
73
- toJSON(): T {
74
- return this.toPrimitive()
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ toJSON(): any {
75
+ return this.toPrimitive();
76
+ }
77
+
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ toSnapshot(): any {
80
+ return this.toPrimitive();
75
81
  }
76
82
  }
@@ -3,8 +3,13 @@ import { AnyDomainEvent } from '../DomainEvent';
3
3
  import { EventBus } from '../EventBus';
4
4
  import {DomainEventSubscriber} from "../DomainEventSubscriber";
5
5
 
6
- export class InMemoryEventBus extends EventEmitter implements EventBus {
6
+ export class InMemoryEventBus implements EventBus {
7
7
  protected _events: AnyDomainEvent[] = [];
8
+ protected _emitter: EventEmitter;
9
+
10
+ constructor() {
11
+ this._emitter = new EventEmitter();
12
+ }
8
13
 
9
14
  async push(event: AnyDomainEvent): Promise<void> {
10
15
  this._events.push(event);
@@ -17,16 +22,24 @@ export class InMemoryEventBus extends EventEmitter implements EventBus {
17
22
  async publish(events: AnyDomainEvent[] = []): Promise<void> {
18
23
  const allEvents = (this._events || []).concat(events ?? []);
19
24
  for (const event of allEvents) {
20
- this.emit(event.eventName, event);
25
+ this._emitter.emit(event.eventName, event);
21
26
  }
22
27
  await this.clear();
23
28
  }
24
29
 
30
+ on(event: string, listener: (...args: never[]) => void): void {
31
+ this._emitter.on(event, listener);
32
+ }
33
+
34
+ listenerCount(event: string): number {
35
+ return this._emitter.listenerCount(event);
36
+ }
37
+
25
38
  addSubscribers(subscribers: DomainEventSubscriber[]): void {
26
39
  for (const subscriber of subscribers) {
27
40
  const events = subscriber.subscribedTo();
28
41
  for (const event of events) {
29
- this.on(event.EVENT_NAME ?? event.name, subscriber.on.bind(subscriber));
42
+ this._emitter.on(event.EVENT_NAME ?? event.name, subscriber.on.bind(subscriber));
30
43
  }
31
44
  }
32
45
  }
@@ -0,0 +1,62 @@
1
+ import {createSnapshot} from "./helpers";
2
+ import {EntityId} from "./EntityId";
3
+ import {Entity} from "./Entity";
4
+
5
+ interface TestProps {
6
+ name: string;
7
+ testId?: EntityId<string>;
8
+ }
9
+ class TestEntity extends Entity<TestProps, string, EntityId<string>> {
10
+ static create(props: TestProps, id?:EntityId<string>|string): TestEntity {
11
+ return new TestEntity(props, id);
12
+ }
13
+
14
+ set name(name: string) {
15
+ this.props.name = name;
16
+ }
17
+
18
+ set testId(val: EntityId<string>) {
19
+ this.props.testId = val;
20
+ }
21
+
22
+ toSnapshot():never {
23
+ return {
24
+ ...this.props,
25
+ testId: undefined
26
+ } as never;
27
+ }
28
+ }
29
+
30
+ describe('helpers', () => {
31
+ test('createSnapshot', async () => {
32
+ const original = {
33
+ a: 1,
34
+ b: 'test',
35
+ c: {
36
+ d: 2,
37
+ e: 'nested',
38
+ f: {
39
+ g: 3
40
+ }
41
+ },
42
+ id: new EntityId<string>('1'),
43
+ };
44
+ const snapshot = createSnapshot(original);
45
+ expect(snapshot).toEqual(original);
46
+ expect(snapshot).not.toBe(original);
47
+ expect(snapshot.c).not.toBe(original.c);
48
+ expect(snapshot.c.f).not.toBe(original.c.f);
49
+ expect(snapshot.id).not.toBe(original.id);
50
+ expect(snapshot.id).toEqual(new EntityId<string>('1'));
51
+
52
+ const item = TestEntity.create({
53
+ name: 'test',
54
+ testId: new EntityId('2')
55
+ }, '2');
56
+ const itemSnapshot = createSnapshot(item);
57
+ expect(itemSnapshot).toEqual({
58
+ name: 'test',
59
+ testId: undefined
60
+ });
61
+ });
62
+ });
package/src/helpers.ts ADDED
@@ -0,0 +1,25 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
2
+ export function createSnapshot<T>(obj: T): T {
3
+ if (!obj) {
4
+ return obj;
5
+ }
6
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
7
+ // @ts-ignore
8
+ if (typeof obj.toSnapshot === 'function') {
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
10
+ // @ts-ignore
11
+ return obj.toSnapshot() as T;
12
+ }
13
+ const copy:T = {} as T;
14
+ for (const key in obj) {
15
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
16
+ continue;
17
+ }
18
+ if (typeof obj[key] !== 'object') {
19
+ copy[key] = obj[key];
20
+ continue;
21
+ }
22
+ copy[key] = createSnapshot(obj[key]);
23
+ }
24
+ return copy;
25
+ }
package/src/index.ts CHANGED
@@ -3,11 +3,17 @@ import { EntityId } from './EntityId';
3
3
  import { ValueObject } from './ValueObject';
4
4
  import { AggregateRoot } from './AggregateRoot';
5
5
  import { HashError } from './error/HashError';
6
+ import { DomainEvent } from './DomainEvent';
7
+ import { DomainEventSubscriber } from './DomainEventSubscriber';
8
+ import { EventBus } from './EventBus';
6
9
 
7
10
  export {
8
11
  Entity,
9
12
  EntityId,
10
13
  ValueObject,
11
14
  AggregateRoot,
12
- HashError
15
+ HashError,
16
+ DomainEvent,
17
+ DomainEventSubscriber,
18
+ EventBus
13
19
  }