@meticoeus/ddd-es 0.5.0 → 0.6.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.
- package/dist/package.json +1 -1
- package/dist/src/AggregateRoot.d.ts +1 -1
- package/dist/src/AggregateRoot.d.ts.map +1 -1
- package/dist/src/AggregateRoot.js +4 -2
- package/dist/src/AggregateRoot.js.map +1 -1
- package/dist/src/AggregateRoot.mocks.d.ts +3 -5
- package/dist/src/AggregateRoot.mocks.d.ts.map +1 -1
- package/dist/src/AggregateRoot.mocks.js +11 -17
- package/dist/src/AggregateRoot.mocks.js.map +1 -1
- package/dist/src/AggregateRoot.mocks2.d.ts +75 -0
- package/dist/src/AggregateRoot.mocks2.d.ts.map +1 -0
- package/dist/src/AggregateRoot.mocks2.js +295 -0
- package/dist/src/AggregateRoot.mocks2.js.map +1 -0
- package/dist/src/AggregateRoot.mocks3.d.ts +48 -0
- package/dist/src/AggregateRoot.mocks3.d.ts.map +1 -0
- package/dist/src/AggregateRoot.mocks3.js +114 -0
- package/dist/src/AggregateRoot.mocks3.js.map +1 -0
- package/dist/src/Repository.d.ts +37 -3
- package/dist/src/Repository.d.ts.map +1 -1
- package/dist/src/Repository.js +85 -34
- package/dist/src/Repository.js.map +1 -1
- package/dist/src/Repository.mocks.d.ts +14 -1
- package/dist/src/Repository.mocks.d.ts.map +1 -1
- package/dist/src/Repository.mocks.js +16 -0
- package/dist/src/Repository.mocks.js.map +1 -1
- package/dist/src/Repository.test.js +223 -6
- package/dist/src/Repository.test.js.map +1 -1
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -38,7 +38,7 @@ export declare abstract class AggregateRoot<DomainEvent extends IEvent = IEvent>
|
|
|
38
38
|
/**
|
|
39
39
|
* Either return Ok() or return an error result representing the conflict.
|
|
40
40
|
*/
|
|
41
|
-
hasConflict(_event:
|
|
41
|
+
hasConflict(_event: DomainEvent): Result<void, IException>;
|
|
42
42
|
/**
|
|
43
43
|
* Get events that happened between after (exclusive) and to (inclusive).
|
|
44
44
|
* Set notation: (after, to]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateRoot.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAM,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIvF,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,kBAAkB,CAC5B,WAAW,SAAS,MAAM,EAC1B,CAAC,SAAS,aAAa,CAAC,WAAW,CAAC,IAClC,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5B,MAAM,WAAW,kBAAkB,CACjC,WAAW,SAAS,MAAM,EAC1B,CAAC,SAAS,aAAa,CAAC,WAAW,CAAC;IAEpC,KAAK,MAAM,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;IAEjC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IAEjC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAA;CACrE;AAED,8BAAsB,aAAa,CAAC,WAAW,SAAS,MAAM,GAAG,MAAM;IACrE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmD;IAE7E,SAAS,aAAa,MAAM,CAAC,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"AggregateRoot.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAM,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAIvF,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,MAAM,kBAAkB,CAC5B,WAAW,SAAS,MAAM,EAC1B,CAAC,SAAS,aAAa,CAAC,WAAW,CAAC,IAClC,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5B,MAAM,WAAW,kBAAkB,CACjC,WAAW,SAAS,MAAM,EAC1B,CAAC,SAAS,aAAa,CAAC,WAAW,CAAC;IAEpC,KAAK,MAAM,CAAC,EAAE,eAAe,GAAG,CAAC,CAAA;IAEjC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IAEjC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAA;CACrE;AAED,8BAAsB,aAAa,CAAC,WAAW,SAAS,MAAM,GAAG,MAAM;IACrE,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmD;IAE7E,SAAS,aAAa,MAAM,CAAC,EAAE,eAAe;IAe9C,SAAS,CAAC,GAAG,EAAE,MAAM,CAAA;IAErB,IAAW,EAAE,IAAI,MAAM,CAEtB;IAED,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAEvC,IAAW,QAAQ,IAAI,MAAM,GAAG,SAAS,CAExC;IAED,8CAA8C;IAC9C,IAAW,OAAO,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAE7C;IAED,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAQ;IAEnC,IAAW,OAAO,IAAI,OAAO,CAE5B;WAEa,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO;IAM3E,qBAAqB,IAAI,WAAW,EAAE;IAItC,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IASnD,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAYvE,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,GAAE,OAAc,GAAG,IAAI;IAiBtE;;OAEG;IACI,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC;IAKjE;;;;;;;OAOG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE;CAiB3E"}
|
|
@@ -33,8 +33,10 @@ export class AggregateRoot {
|
|
|
33
33
|
this.__storeHistory = config?.storeHistory ?? true;
|
|
34
34
|
const props = Object.getOwnPropertyNames(Object.getPrototypeOf(this));
|
|
35
35
|
for (const prop of props) {
|
|
36
|
+
if (!prop.startsWith('apply') || prop.length <= ApplyLength)
|
|
37
|
+
continue;
|
|
36
38
|
const fn = this[prop];
|
|
37
|
-
if (typeof fn === 'function'
|
|
39
|
+
if (typeof fn === 'function') {
|
|
38
40
|
this._appliers.set(prop.substring(ApplyLength), fn);
|
|
39
41
|
}
|
|
40
42
|
}
|
|
@@ -69,7 +71,7 @@ export class AggregateRoot {
|
|
|
69
71
|
this._revision = nextRevision;
|
|
70
72
|
}
|
|
71
73
|
else {
|
|
72
|
-
this._revision = (this._revision ??
|
|
74
|
+
this._revision = (this._revision ?? -1n) + BigInt(this.__changes.length);
|
|
73
75
|
}
|
|
74
76
|
this.__changes = [];
|
|
75
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateRoot.js","sourceRoot":"","sources":["../../src/AggregateRoot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;EAsBE;AAEF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAuC,EAAE,EAAqB,MAAM,YAAY,CAAA;AAEvF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAA;AA4BlC,MAAM,OAAgB,aAAa;IACzB,cAAc,CAAS;IACvB,SAAS,GAA6B,EAAE,CAAA;IACxC,SAAS,GAAkB,EAAE,CAAA;IACpB,SAAS,GAA0C,IAAI,GAAG,EAAE,CAAA;IAE7E,YAAsB,MAAwB;QAC5C,IAAI,CAAC,cAAc,GAAG,MAAM,EAAE,YAAY,IAAI,IAAI,CAAA;QAElD,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;QACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,
|
|
1
|
+
{"version":3,"file":"AggregateRoot.js","sourceRoot":"","sources":["../../src/AggregateRoot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AggregateRoot } from './AggregateRoot.js';
|
|
2
|
-
import { IEvent,
|
|
2
|
+
import { IEvent, Persisted, Result } from './types.js';
|
|
3
3
|
export interface TestData extends Record<string | number, unknown> {
|
|
4
4
|
readonly id: string;
|
|
5
5
|
readonly name: string;
|
|
@@ -12,13 +12,11 @@ export type TestDeletedEvent = IEvent<'TestDeleted', {
|
|
|
12
12
|
}>;
|
|
13
13
|
export declare class Test extends AggregateRoot<TestEvent> {
|
|
14
14
|
constructor();
|
|
15
|
-
static create(id: string, name: string): Promise<Result<Test>>;
|
|
16
15
|
static getStreamName(id: string): string;
|
|
17
|
-
static
|
|
16
|
+
static create(id: string, name: string): Promise<Result<Test>>;
|
|
18
17
|
rename(name: string): Promise<Result<void>>;
|
|
19
18
|
delete(): Promise<Result<void>>;
|
|
20
|
-
|
|
21
|
-
eventsConflict(pending: IEvent, committed: IPersistedEvent): boolean;
|
|
19
|
+
static eventsConflict(pending: TestEvent, committed: Persisted<TestEvent>): boolean;
|
|
22
20
|
private applyTestCreated;
|
|
23
21
|
private applyTestRenamed;
|
|
24
22
|
private applyTestDeleted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateRoot.mocks.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.mocks.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAe,MAAM,
|
|
1
|
+
{"version":3,"file":"AggregateRoot.mocks.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.mocks.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAe,MAAM,EAAM,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEvE,MAAM,WAAW,QAAS,SAAQ,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IAChE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAE9E,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;AAC9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAA;AAC9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,aAAa,EAAE;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAE7E,qBAAa,IAAK,SAAQ,aAAa,CAAC,SAAS,CAAC;;IAKhD,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;WAI3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAY9D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAW3C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;WAWrB,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO;IAU5F,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,gBAAgB;IAExB,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -28,6 +28,9 @@ export class Test extends AggregateRoot {
|
|
|
28
28
|
constructor() {
|
|
29
29
|
super();
|
|
30
30
|
}
|
|
31
|
+
static getStreamName(id) {
|
|
32
|
+
return `test-${id}`;
|
|
33
|
+
}
|
|
31
34
|
static async create(id, name) {
|
|
32
35
|
const instance = new Test();
|
|
33
36
|
instance.applyChange(createEvent({
|
|
@@ -37,18 +40,6 @@ export class Test extends AggregateRoot {
|
|
|
37
40
|
}));
|
|
38
41
|
return Ok(instance);
|
|
39
42
|
}
|
|
40
|
-
static getStreamName(id) {
|
|
41
|
-
return `test-${id}`;
|
|
42
|
-
}
|
|
43
|
-
static eventsConflict(pending, committed) {
|
|
44
|
-
switch (true) {
|
|
45
|
-
case pending.type === committed.type:
|
|
46
|
-
return true;
|
|
47
|
-
case committed.type === 'TestDeleted':
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
43
|
async rename(name) {
|
|
53
44
|
this.applyChange(createEvent({
|
|
54
45
|
type: 'TestRenamed',
|
|
@@ -65,11 +56,14 @@ export class Test extends AggregateRoot {
|
|
|
65
56
|
}));
|
|
66
57
|
return Ok();
|
|
67
58
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
59
|
+
static eventsConflict(pending, committed) {
|
|
60
|
+
switch (true) {
|
|
61
|
+
case pending.type === committed.type:
|
|
62
|
+
return true;
|
|
63
|
+
case committed.type === 'TestDeleted':
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
73
67
|
}
|
|
74
68
|
applyTestCreated(event) {
|
|
75
69
|
this._id = event.data.id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateRoot.mocks.js","sourceRoot":"","sources":["../../src/AggregateRoot.mocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;EAsBE;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"AggregateRoot.mocks.js","sourceRoot":"","sources":["../../src/AggregateRoot.mocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;EAsBE;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAU,EAAE,EAAqB,MAAM,YAAY,CAAA;AAavE,MAAM,OAAO,IAAK,SAAQ,aAAwB;IAChD;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,EAAU;QAC7B,OAAO,QAAQ,EAAE,EAAE,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAAY;QAC1C,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAA;QAC3B,QAAQ,CAAC,WAAW,CAClB,WAAW,CAAmB;YAC5B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;YAClB,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,WAAW,CACd,WAAW,CAAmB;YAC5B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;YAC5B,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,WAAW,CACd,WAAW,CAAmB;YAC5B,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,MAAM,CAAU,cAAc,CAAC,OAAkB,EAAE,SAA+B;QAChF,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI;gBAClC,OAAO,IAAI,CAAA;YACb,KAAK,SAAS,CAAC,IAAI,KAAK,aAAa;gBACnC,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,gBAAgB,CAAC,KAAuB;QAC9C,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA;IAC1B,CAAC;IAEO,gBAAgB,CAAC,MAAwB,IAAG,CAAC;IAE7C,gBAAgB,CAAC,MAAwB;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;CACF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { AggregateRoot } from './AggregateRoot.js';
|
|
2
|
+
import { Exception, IEvent, IException, IPersistedEvent, Result } from './types.js';
|
|
3
|
+
export declare class StatusConflictException extends Exception {
|
|
4
|
+
readonly entityName: string;
|
|
5
|
+
readonly entityId: string;
|
|
6
|
+
readonly expectedStatus: TodoChecklistStatus;
|
|
7
|
+
readonly actualStatus: TodoChecklistStatus;
|
|
8
|
+
constructor(entityName: string, entityId: string, expectedStatus: TodoChecklistStatus, actualStatus: TodoChecklistStatus);
|
|
9
|
+
}
|
|
10
|
+
export interface TodoChecklistIdData extends Record<string | number, unknown> {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TodoChecklistData extends TodoChecklistIdData {
|
|
14
|
+
readonly name: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TodoItemData extends Record<string | number, unknown> {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly itemId: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TodoItemNameData extends TodoItemData {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
}
|
|
23
|
+
export type TodoChecklistCreatedEvent = IEvent<'TodoChecklistCreated', TodoChecklistData>;
|
|
24
|
+
export type TodoChecklistRenamedEvent = IEvent<'TodoChecklistRenamed', TodoChecklistData>;
|
|
25
|
+
export type TodoChecklistDeletedEvent = IEvent<'TodoChecklistDeleted', TodoChecklistIdData>;
|
|
26
|
+
export type TodoChecklistStartedEvent = IEvent<'TodoChecklistStarted', TodoChecklistIdData>;
|
|
27
|
+
export type TodoChecklistCompletedEvent = IEvent<'TodoChecklistCompleted', TodoChecklistIdData>;
|
|
28
|
+
export type TodoChecklistReopenedEvent = IEvent<'TodoChecklistReopened', TodoChecklistIdData>;
|
|
29
|
+
export type TodoChecklistResetEvent = IEvent<'TodoChecklistReset', TodoChecklistIdData>;
|
|
30
|
+
export type TodoItemAddedEvent = IEvent<'TodoItemAdded', TodoItemNameData>;
|
|
31
|
+
export type TodoItemRemovedEvent = IEvent<'TodoItemRemoved', TodoItemData>;
|
|
32
|
+
export type TodoItemRenamedEvent = IEvent<'TodoItemRenamed', TodoItemNameData>;
|
|
33
|
+
export type TodoItemResetEvent = IEvent<'TodoItemReset', TodoItemData>;
|
|
34
|
+
export type TodoItemCompletedEvent = IEvent<'TodoItemCompleted', TodoItemData>;
|
|
35
|
+
export type TodoChecklistEvent = TodoChecklistCreatedEvent | TodoChecklistRenamedEvent | TodoChecklistDeletedEvent | TodoChecklistStartedEvent | TodoChecklistCompletedEvent | TodoChecklistReopenedEvent | TodoChecklistResetEvent | TodoItemAddedEvent | TodoItemRemovedEvent | TodoItemRenamedEvent | TodoItemResetEvent | TodoItemCompletedEvent;
|
|
36
|
+
export interface TodoItem {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly name: string;
|
|
39
|
+
readonly done: boolean;
|
|
40
|
+
}
|
|
41
|
+
export type TodoChecklistStatus = 'pending' | 'in_progress' | 'done';
|
|
42
|
+
export declare class TodoChecklist extends AggregateRoot<TodoChecklistEvent> {
|
|
43
|
+
constructor();
|
|
44
|
+
private _name;
|
|
45
|
+
get name(): string;
|
|
46
|
+
private _items;
|
|
47
|
+
get items(): TodoItem[];
|
|
48
|
+
getItem(itemId: string): TodoItem | undefined;
|
|
49
|
+
get status(): TodoChecklistStatus;
|
|
50
|
+
static getStreamName(id: string): string;
|
|
51
|
+
static create(id: string, name: string): Promise<Result<TodoChecklist>>;
|
|
52
|
+
rename(name: string): Result<void>;
|
|
53
|
+
delete(): Result<void>;
|
|
54
|
+
addItem(itemId: string, name: string): Result<void>;
|
|
55
|
+
removeItem(itemId: string): Result<void>;
|
|
56
|
+
renameItem(itemId: string, name: string): Result<void>;
|
|
57
|
+
completeItem(itemId: string): Result<void>;
|
|
58
|
+
resetItem(itemId: string): Result<void>;
|
|
59
|
+
static eventsConflict(pending: IEvent, committed: IPersistedEvent): boolean;
|
|
60
|
+
hasConflict(event: TodoChecklistEvent): Result<void, IException>;
|
|
61
|
+
private applyTodoChecklistCreated;
|
|
62
|
+
private applyTodoChecklistRenamed;
|
|
63
|
+
private applyTodoChecklistDeleted;
|
|
64
|
+
private applyTodoChecklistStarted;
|
|
65
|
+
private applyTodoChecklistCompleted;
|
|
66
|
+
private applyTodoChecklistReopened;
|
|
67
|
+
private applyTodoChecklistReset;
|
|
68
|
+
private applyTodoItemAdded;
|
|
69
|
+
private applyTodoItemRemoved;
|
|
70
|
+
private applyTodoItemRenamed;
|
|
71
|
+
private applyTodoItemCompleted;
|
|
72
|
+
private applyTodoItemReset;
|
|
73
|
+
private emitStatusChange;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=AggregateRoot.mocks2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AggregateRoot.mocks2.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.mocks2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/*
|
|
2
|
+
MIT License
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2024 Justin Bailey
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
import { AggregateRoot } from './AggregateRoot.js';
|
|
25
|
+
import { mockMetadata } from './types.fixtures.js';
|
|
26
|
+
import { EntityDNEException, Err, Exception, Ok, createEvent, } from './types.js';
|
|
27
|
+
export class StatusConflictException extends Exception {
|
|
28
|
+
entityName;
|
|
29
|
+
entityId;
|
|
30
|
+
expectedStatus;
|
|
31
|
+
actualStatus;
|
|
32
|
+
constructor(entityName, entityId, expectedStatus, actualStatus) {
|
|
33
|
+
super('StatusConflictException', `${entityName}:${entityId} expected status "${expectedStatus}" but found "${actualStatus}".`, 409);
|
|
34
|
+
this.entityName = entityName;
|
|
35
|
+
this.entityId = entityId;
|
|
36
|
+
this.expectedStatus = expectedStatus;
|
|
37
|
+
this.actualStatus = actualStatus;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class TodoChecklist extends AggregateRoot {
|
|
41
|
+
constructor() {
|
|
42
|
+
super();
|
|
43
|
+
}
|
|
44
|
+
_name = '';
|
|
45
|
+
get name() {
|
|
46
|
+
return this._name;
|
|
47
|
+
}
|
|
48
|
+
_items = new Map();
|
|
49
|
+
get items() {
|
|
50
|
+
return [...this._items.values()];
|
|
51
|
+
}
|
|
52
|
+
getItem(itemId) {
|
|
53
|
+
return this._items.get(itemId);
|
|
54
|
+
}
|
|
55
|
+
get status() {
|
|
56
|
+
if (this._items.size === 0)
|
|
57
|
+
return 'pending';
|
|
58
|
+
const total = this._items.size;
|
|
59
|
+
let doneCount = 0;
|
|
60
|
+
for (const item of this._items.values()) {
|
|
61
|
+
if (item.done)
|
|
62
|
+
doneCount++;
|
|
63
|
+
}
|
|
64
|
+
if (doneCount === total)
|
|
65
|
+
return 'done';
|
|
66
|
+
if (doneCount > 0)
|
|
67
|
+
return 'in_progress';
|
|
68
|
+
return 'pending';
|
|
69
|
+
}
|
|
70
|
+
static getStreamName(id) {
|
|
71
|
+
return `todochecklist-${id}`;
|
|
72
|
+
}
|
|
73
|
+
static async create(id, name) {
|
|
74
|
+
const instance = new TodoChecklist();
|
|
75
|
+
instance.applyChange(createEvent({
|
|
76
|
+
type: 'TodoChecklistCreated',
|
|
77
|
+
data: { id, name },
|
|
78
|
+
metadata: mockMetadata,
|
|
79
|
+
}));
|
|
80
|
+
return Ok(instance);
|
|
81
|
+
}
|
|
82
|
+
rename(name) {
|
|
83
|
+
this.applyChange(createEvent({
|
|
84
|
+
type: 'TodoChecklistRenamed',
|
|
85
|
+
data: { id: this._id, name },
|
|
86
|
+
metadata: mockMetadata,
|
|
87
|
+
}));
|
|
88
|
+
return Ok();
|
|
89
|
+
}
|
|
90
|
+
delete() {
|
|
91
|
+
this.applyChange(createEvent({
|
|
92
|
+
type: 'TodoChecklistDeleted',
|
|
93
|
+
data: { id: this._id },
|
|
94
|
+
metadata: mockMetadata,
|
|
95
|
+
}));
|
|
96
|
+
return Ok();
|
|
97
|
+
}
|
|
98
|
+
addItem(itemId, name) {
|
|
99
|
+
const before = this.status;
|
|
100
|
+
this.applyChange(createEvent({
|
|
101
|
+
type: 'TodoItemAdded',
|
|
102
|
+
data: { id: this._id, itemId, name },
|
|
103
|
+
metadata: mockMetadata,
|
|
104
|
+
}));
|
|
105
|
+
this.emitStatusChange(before);
|
|
106
|
+
return Ok();
|
|
107
|
+
}
|
|
108
|
+
removeItem(itemId) {
|
|
109
|
+
if (!this._items.has(itemId)) {
|
|
110
|
+
return Err(new EntityDNEException('TodoChecklist', this._id, 'TodoItem', itemId));
|
|
111
|
+
}
|
|
112
|
+
const before = this.status;
|
|
113
|
+
this.applyChange(createEvent({
|
|
114
|
+
type: 'TodoItemRemoved',
|
|
115
|
+
data: { id: this._id, itemId },
|
|
116
|
+
metadata: mockMetadata,
|
|
117
|
+
}));
|
|
118
|
+
this.emitStatusChange(before);
|
|
119
|
+
return Ok();
|
|
120
|
+
}
|
|
121
|
+
renameItem(itemId, name) {
|
|
122
|
+
if (!this._items.has(itemId)) {
|
|
123
|
+
return Err(new EntityDNEException('TodoChecklist', this._id, 'TodoItem', itemId));
|
|
124
|
+
}
|
|
125
|
+
this.applyChange(createEvent({
|
|
126
|
+
type: 'TodoItemRenamed',
|
|
127
|
+
data: { id: this._id, itemId, name },
|
|
128
|
+
metadata: mockMetadata,
|
|
129
|
+
}));
|
|
130
|
+
return Ok();
|
|
131
|
+
}
|
|
132
|
+
completeItem(itemId) {
|
|
133
|
+
if (!this._items.has(itemId)) {
|
|
134
|
+
return Err(new EntityDNEException('TodoChecklist', this._id, 'TodoItem', itemId));
|
|
135
|
+
}
|
|
136
|
+
const before = this.status;
|
|
137
|
+
this.applyChange(createEvent({
|
|
138
|
+
type: 'TodoItemCompleted',
|
|
139
|
+
data: { id: this._id, itemId },
|
|
140
|
+
metadata: mockMetadata,
|
|
141
|
+
}));
|
|
142
|
+
this.emitStatusChange(before);
|
|
143
|
+
return Ok();
|
|
144
|
+
}
|
|
145
|
+
resetItem(itemId) {
|
|
146
|
+
if (!this._items.has(itemId)) {
|
|
147
|
+
return Err(new EntityDNEException('TodoChecklist', this._id, 'TodoItem', itemId));
|
|
148
|
+
}
|
|
149
|
+
const before = this.status;
|
|
150
|
+
this.applyChange(createEvent({
|
|
151
|
+
type: 'TodoItemReset',
|
|
152
|
+
data: { id: this._id, itemId },
|
|
153
|
+
metadata: mockMetadata,
|
|
154
|
+
}));
|
|
155
|
+
this.emitStatusChange(before);
|
|
156
|
+
return Ok();
|
|
157
|
+
}
|
|
158
|
+
// --- Concurrency ---
|
|
159
|
+
static eventsConflict(pending, committed) {
|
|
160
|
+
// Everything conflicts with a deleted checklist
|
|
161
|
+
if (committed.type === 'TodoChecklistDeleted') {
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
const committedItemId = committed.data.itemId;
|
|
165
|
+
const pendingItemId = pending.data.itemId;
|
|
166
|
+
const sameItem = committedItemId === pendingItemId;
|
|
167
|
+
// Any operation on an item that was removed conflicts
|
|
168
|
+
if (sameItem) {
|
|
169
|
+
// Same event type on the same item always conflicts
|
|
170
|
+
if (pending.type === committed.type) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
// this check is handled in hasConflict()
|
|
174
|
+
// if (committed.type === 'TodoItemRemoved') {
|
|
175
|
+
// return true
|
|
176
|
+
// }
|
|
177
|
+
// Completing and resetting the same item conflicts
|
|
178
|
+
if (pending.type === 'TodoItemCompleted' && committed.type === 'TodoItemReset') {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
if (pending.type === 'TodoItemReset' && committed.type === 'TodoItemCompleted') {
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
hasConflict(event) {
|
|
188
|
+
// Lifecycle events: verify the source status still holds
|
|
189
|
+
switch (event.type) {
|
|
190
|
+
case 'TodoChecklistStarted':
|
|
191
|
+
if (this.status !== 'pending')
|
|
192
|
+
return Err(new StatusConflictException('TodoChecklist', this._id, 'pending', this.status));
|
|
193
|
+
return Ok();
|
|
194
|
+
case 'TodoChecklistReopened':
|
|
195
|
+
if (this.status !== 'done')
|
|
196
|
+
return Err(new StatusConflictException('TodoChecklist', this._id, 'done', this.status));
|
|
197
|
+
return Ok();
|
|
198
|
+
case 'TodoChecklistCompleted':
|
|
199
|
+
if (this.status === 'done')
|
|
200
|
+
return Err(new StatusConflictException('TodoChecklist', this._id, 'in_progress', this.status));
|
|
201
|
+
return Ok();
|
|
202
|
+
case 'TodoChecklistReset':
|
|
203
|
+
if (this.status === 'pending')
|
|
204
|
+
return Err(new StatusConflictException('TodoChecklist', this._id, 'in_progress', this.status));
|
|
205
|
+
return Ok();
|
|
206
|
+
}
|
|
207
|
+
const itemId = event.data.itemId;
|
|
208
|
+
if (!itemId)
|
|
209
|
+
return Ok();
|
|
210
|
+
// Operating on a removed item is a conflict
|
|
211
|
+
if (event.type !== 'TodoItemAdded' && !this._items.has(itemId)) {
|
|
212
|
+
return Err(new EntityDNEException('TodoChecklist', this._id, 'TodoItem', itemId));
|
|
213
|
+
}
|
|
214
|
+
return Ok();
|
|
215
|
+
}
|
|
216
|
+
// --- Apply handlers ---
|
|
217
|
+
applyTodoChecklistCreated(event) {
|
|
218
|
+
this._id = event.data.id;
|
|
219
|
+
this._name = event.data.name;
|
|
220
|
+
}
|
|
221
|
+
applyTodoChecklistRenamed(event) {
|
|
222
|
+
this._name = event.data.name;
|
|
223
|
+
}
|
|
224
|
+
applyTodoChecklistDeleted(_event) {
|
|
225
|
+
this._deleted = true;
|
|
226
|
+
}
|
|
227
|
+
applyTodoChecklistStarted(_event) { }
|
|
228
|
+
applyTodoChecklistCompleted(_event) { }
|
|
229
|
+
applyTodoChecklistReopened(_event) { }
|
|
230
|
+
applyTodoChecklistReset(_event) { }
|
|
231
|
+
applyTodoItemAdded(event) {
|
|
232
|
+
this._items.set(event.data.itemId, {
|
|
233
|
+
id: event.data.itemId,
|
|
234
|
+
name: event.data.name,
|
|
235
|
+
done: false,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
applyTodoItemRemoved(event) {
|
|
239
|
+
this._items.delete(event.data.itemId);
|
|
240
|
+
}
|
|
241
|
+
applyTodoItemRenamed(event) {
|
|
242
|
+
const item = this._items.get(event.data.itemId);
|
|
243
|
+
if (item) {
|
|
244
|
+
this._items.set(event.data.itemId, { ...item, name: event.data.name });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
applyTodoItemCompleted(event) {
|
|
248
|
+
const item = this._items.get(event.data.itemId);
|
|
249
|
+
if (item) {
|
|
250
|
+
this._items.set(event.data.itemId, { ...item, done: true });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
applyTodoItemReset(event) {
|
|
254
|
+
const item = this._items.get(event.data.itemId);
|
|
255
|
+
if (item) {
|
|
256
|
+
this._items.set(event.data.itemId, { ...item, done: false });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
emitStatusChange(before) {
|
|
260
|
+
const after = this.status;
|
|
261
|
+
if (before === after)
|
|
262
|
+
return;
|
|
263
|
+
const data = { id: this._id };
|
|
264
|
+
switch (after) {
|
|
265
|
+
case 'in_progress':
|
|
266
|
+
this.applyChange(before === 'done'
|
|
267
|
+
? createEvent({
|
|
268
|
+
type: 'TodoChecklistReopened',
|
|
269
|
+
data,
|
|
270
|
+
metadata: mockMetadata,
|
|
271
|
+
})
|
|
272
|
+
: createEvent({
|
|
273
|
+
type: 'TodoChecklistStarted',
|
|
274
|
+
data,
|
|
275
|
+
metadata: mockMetadata,
|
|
276
|
+
}));
|
|
277
|
+
break;
|
|
278
|
+
case 'done':
|
|
279
|
+
this.applyChange(createEvent({
|
|
280
|
+
type: 'TodoChecklistCompleted',
|
|
281
|
+
data,
|
|
282
|
+
metadata: mockMetadata,
|
|
283
|
+
}));
|
|
284
|
+
break;
|
|
285
|
+
case 'pending':
|
|
286
|
+
this.applyChange(createEvent({
|
|
287
|
+
type: 'TodoChecklistReset',
|
|
288
|
+
data,
|
|
289
|
+
metadata: mockMetadata,
|
|
290
|
+
}));
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=AggregateRoot.mocks2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AggregateRoot.mocks2.js","sourceRoot":"","sources":["../../src/AggregateRoot.mocks2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;EAsBE;AAEF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,kBAAkB,EAClB,GAAG,EACH,SAAS,EAIT,EAAE,EAEF,WAAW,GACZ,MAAM,YAAY,CAAA;AAEnB,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IAElC;IACA;IACA;IACA;IAJlB,YACkB,UAAkB,EAClB,QAAgB,EAChB,cAAmC,EACnC,YAAiC;QAEjD,KAAK,CACH,yBAAyB,EACzB,GAAG,UAAU,IAAI,QAAQ,qBAAqB,cAAc,gBAAgB,YAAY,IAAI,EAC5F,GAAG,CACJ,CAAA;QATe,eAAU,GAAV,UAAU,CAAQ;QAClB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,mBAAc,GAAd,cAAc,CAAqB;QACnC,iBAAY,GAAZ,YAAY,CAAqB;IAOnD,CAAC;CACF;AA8DD,MAAM,OAAO,aAAc,SAAQ,aAAiC;IAClE;QACE,KAAK,EAAE,CAAA;IACT,CAAC;IAEO,KAAK,GAAW,EAAE,CAAA;IAE1B,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAEO,MAAM,GAA0B,IAAI,GAAG,EAAE,CAAA;IAEjD,IAAI,KAAK;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,MAAM;QACR,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,SAAS,CAAA;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC9B,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,IAAI;gBAAE,SAAS,EAAE,CAAA;QAC5B,CAAC;QACD,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO,MAAM,CAAA;QACtC,IAAI,SAAS,GAAG,CAAC;YAAE,OAAO,aAAa,CAAA;QACvC,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,EAAU;QAC7B,OAAO,iBAAiB,EAAE,EAAE,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,IAAY;QAC1C,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;QACpC,QAAQ,CAAC,WAAW,CAClB,WAAW,CAA4B;YACrC,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;YAClB,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,IAAI,CAAC,WAAW,CACd,WAAW,CAA4B;YACrC,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;YAC5B,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,WAAW,CACd,WAAW,CAA4B;YACrC,IAAI,EAAE,sBAAsB;YAC5B,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,IAAY;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,WAAW,CACd,WAAW,CAAqB;YAC9B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;YACpC,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,WAAW,CACd,WAAW,CAAuB;YAChC,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;YAC9B,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,UAAU,CAAC,MAAc,EAAE,IAAY;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,IAAI,CAAC,WAAW,CACd,WAAW,CAAuB;YAChC,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;YACpC,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,WAAW,CACd,WAAW,CAAyB;YAClC,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;YAC9B,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QACnF,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAC1B,IAAI,CAAC,WAAW,CACd,WAAW,CAAqB;YAC9B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE;YAC9B,QAAQ,EAAE,YAAY;SACvB,CAAC,CACH,CAAA;QACD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAC7B,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,sBAAsB;IAEtB,MAAM,CAAU,cAAc,CAAC,OAAe,EAAE,SAA0B;QACxE,gDAAgD;QAChD,IAAI,SAAS,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,MAA4B,CAAA;QACnE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,MAA4B,CAAA;QAC/D,MAAM,QAAQ,GAAG,eAAe,KAAK,aAAa,CAAA;QAElD,sDAAsD;QACtD,IAAI,QAAQ,EAAE,CAAC;YACb,oDAAoD;YACpD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,yCAAyC;YACzC,8CAA8C;YAC9C,gBAAgB;YAChB,IAAI;YACJ,mDAAmD;YACnD,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,IAAI,SAAS,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC/E,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBAC/E,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAEQ,WAAW,CAAC,KAAyB;QAC5C,yDAAyD;QACzD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,sBAAsB;gBACzB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;oBAC3B,OAAO,GAAG,CAAC,IAAI,uBAAuB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;gBAC5F,OAAO,EAAE,EAAE,CAAA;YACb,KAAK,uBAAuB;gBAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;oBACxB,OAAO,GAAG,CAAC,IAAI,uBAAuB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;gBACzF,OAAO,EAAE,EAAE,CAAA;YACb,KAAK,wBAAwB;gBAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;oBACxB,OAAO,GAAG,CACR,IAAI,uBAAuB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CACnF,CAAA;gBACH,OAAO,EAAE,EAAE,CAAA;YACb,KAAK,oBAAoB;gBACvB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;oBAC3B,OAAO,GAAG,CACR,IAAI,uBAAuB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CACnF,CAAA;gBACH,OAAO,EAAE,EAAE,CAAA;QACf,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAA4B,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,CAAA;QAExB,4CAA4C;QAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,OAAO,GAAG,CAAC,IAAI,kBAAkB,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;QACnF,CAAC;QAED,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IAED,yBAAyB;IAEjB,yBAAyB,CAAC,KAAgC;QAChE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA;IAC9B,CAAC;IAEO,yBAAyB,CAAC,KAAgC;QAChE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAA;IAC9B,CAAC;IAEO,yBAAyB,CAAC,MAAiC;QACjE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC;IAEO,yBAAyB,CAAC,MAAiC,IAAG,CAAC;IAC/D,2BAA2B,CAAC,MAAmC,IAAG,CAAC;IACnE,0BAA0B,CAAC,MAAkC,IAAG,CAAC;IACjE,uBAAuB,CAAC,MAA+B,IAAG,CAAC;IAE3D,kBAAkB,CAAC,KAAyB;QAClD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;YACjC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;YACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;YACrB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAA;IACJ,CAAC;IAEO,oBAAoB,CAAC,KAA2B;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAEO,oBAAoB,CAAC,KAA2B;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,KAA6B;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,KAAyB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,MAA2B;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,MAAM,KAAK,KAAK;YAAE,OAAM;QAE5B,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAA;QAC7B,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,aAAa;gBAChB,IAAI,CAAC,WAAW,CACd,MAAM,KAAK,MAAM;oBACf,CAAC,CAAC,WAAW,CAA6B;wBACtC,IAAI,EAAE,uBAAuB;wBAC7B,IAAI;wBACJ,QAAQ,EAAE,YAAY;qBACvB,CAAC;oBACJ,CAAC,CAAC,WAAW,CAA4B;wBACrC,IAAI,EAAE,sBAAsB;wBAC5B,IAAI;wBACJ,QAAQ,EAAE,YAAY;qBACvB,CAAC,CACP,CAAA;gBACD,MAAK;YACP,KAAK,MAAM;gBACT,IAAI,CAAC,WAAW,CACd,WAAW,CAA8B;oBACvC,IAAI,EAAE,wBAAwB;oBAC9B,IAAI;oBACJ,QAAQ,EAAE,YAAY;iBACvB,CAAC,CACH,CAAA;gBACD,MAAK;YACP,KAAK,SAAS;gBACZ,IAAI,CAAC,WAAW,CACd,WAAW,CAA0B;oBACnC,IAAI,EAAE,oBAAoB;oBAC1B,IAAI;oBACJ,QAAQ,EAAE,YAAY;iBACvB,CAAC,CACH,CAAA;gBACD,MAAK;QACT,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AggregateRoot } from './AggregateRoot.js';
|
|
2
|
+
import { IEvent, Persisted, Result } from './types.js';
|
|
3
|
+
export interface CounterIdData extends Record<string | number, unknown> {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CounterCreatedData extends CounterIdData {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly description: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CounterNameData extends CounterIdData {
|
|
11
|
+
readonly name: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CounterDescriptionData extends CounterIdData {
|
|
14
|
+
readonly description: string;
|
|
15
|
+
}
|
|
16
|
+
export type CounterCreatedEvent = IEvent<'CounterCreated', CounterCreatedData>;
|
|
17
|
+
export type CounterNameChangedEvent = IEvent<'CounterNameChanged', CounterNameData>;
|
|
18
|
+
export type CounterDescriptionChangedEvent = IEvent<'CounterDescriptionChanged', CounterDescriptionData>;
|
|
19
|
+
export type CounterDeletedEvent = IEvent<'CounterDeleted', CounterIdData>;
|
|
20
|
+
export type CounterEvent = CounterCreatedEvent | CounterNameChangedEvent | CounterDescriptionChangedEvent | CounterDeletedEvent;
|
|
21
|
+
/**
|
|
22
|
+
* Test aggregate that tracks how many times each apply handler is invoked.
|
|
23
|
+
* Used to detect double-application of events (e.g., from overlapping history loads).
|
|
24
|
+
*/
|
|
25
|
+
export declare class Counter extends AggregateRoot<CounterEvent> {
|
|
26
|
+
constructor();
|
|
27
|
+
private _name;
|
|
28
|
+
get name(): string;
|
|
29
|
+
private _nameApplyCount;
|
|
30
|
+
/** Number of times name was set (via CounterCreated or CounterNameChanged) */
|
|
31
|
+
get nameApplyCount(): number;
|
|
32
|
+
private _description;
|
|
33
|
+
get description(): string;
|
|
34
|
+
private _descriptionApplyCount;
|
|
35
|
+
/** Number of times description was set (via CounterCreated or CounterDescriptionChanged) */
|
|
36
|
+
get descriptionApplyCount(): number;
|
|
37
|
+
static getStreamName(id: string): string;
|
|
38
|
+
static create(id: string, name: string, description: string): Promise<Result<Counter>>;
|
|
39
|
+
changeName(name: string): Result<void>;
|
|
40
|
+
changeDescription(description: string): Result<void>;
|
|
41
|
+
delete(): Result<void>;
|
|
42
|
+
static eventsConflict(pending: CounterEvent, committed: Persisted<CounterEvent>): boolean;
|
|
43
|
+
private applyCounterCreated;
|
|
44
|
+
private applyCounterNameChanged;
|
|
45
|
+
private applyCounterDescriptionChanged;
|
|
46
|
+
private applyCounterDeleted;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AggregateRoot.mocks3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AggregateRoot.mocks3.d.ts","sourceRoot":"","sources":["../../src/AggregateRoot.mocks3.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAE,MAAM,EAAM,SAAS,EAAE,MAAM,EAAe,MAAM,YAAY,CAAA;AAIvE,MAAM,WAAW,aAAc,SAAQ,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC;IACrE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAID,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;AAC9E,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAA;AACnF,MAAM,MAAM,8BAA8B,GAAG,MAAM,CACjD,2BAA2B,EAC3B,sBAAsB,CACvB,CAAA;AACD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAA;AAEzE,MAAM,MAAM,YAAY,GACpB,mBAAmB,GACnB,uBAAuB,GACvB,8BAA8B,GAC9B,mBAAmB,CAAA;AAIvB;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,aAAa,CAAC,YAAY,CAAC;;IAKtD,OAAO,CAAC,KAAK,CAAa;IAE1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,OAAO,CAAC,eAAe,CAAY;IAEnC,8EAA8E;IAC9E,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,OAAO,CAAC,YAAY,CAAa;IAEjC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,sBAAsB,CAAY;IAE1C,4FAA4F;IAC5F,IAAI,qBAAqB,IAAI,MAAM,CAElC;IAED,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;WAI3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAY5F,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAWtC,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;IAWpD,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC;WAaN,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,GACjC,OAAO;IAMV,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,8BAA8B;IAKtC,OAAO,CAAC,mBAAmB;CAG5B"}
|