ddd-node 17.3.0 → 20.0.0
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/core/aggregate/aggregate-base/aggregate.builder.d.ts +7 -0
- package/dist/core/aggregate/aggregate-base/aggregate.builder.js +18 -0
- package/dist/core/aggregate/aggregate-base/aggregate.d.ts +16 -0
- package/dist/core/aggregate/{base.js → aggregate-base/aggregate.js} +12 -5
- package/dist/core/aggregate/aggregate-base/index.d.ts +2 -0
- package/dist/core/aggregate/aggregate-base/index.js +18 -0
- package/dist/core/aggregate/event-dispatcher.interface.d.ts +4 -0
- package/dist/core/aggregate/event-dispatcher.interface.js +2 -0
- package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.builder.d.ts +12 -0
- package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.builder.js +35 -0
- package/dist/core/aggregate/{event-sourced-aggregate.d.ts → event-sourced-aggregate/event-sourced-aggregate.d.ts} +11 -13
- package/dist/core/aggregate/{event-sourced-aggregate.js → event-sourced-aggregate/event-sourced-aggregate.js} +26 -36
- package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.model-metadata.d.ts +9 -0
- package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.model-metadata.js +22 -0
- package/dist/core/aggregate/event-sourced-aggregate/index.d.ts +3 -0
- package/dist/core/aggregate/event-sourced-aggregate/index.js +19 -0
- package/dist/core/aggregate/index.d.ts +2 -0
- package/dist/core/aggregate/index.js +2 -0
- package/dist/core/aggregate/state-aggregate/index.d.ts +2 -0
- package/dist/core/aggregate/state-aggregate/index.js +18 -0
- package/dist/core/aggregate/state-aggregate/state-aggregate.builder.d.ts +7 -0
- package/dist/core/aggregate/state-aggregate/state-aggregate.builder.js +19 -0
- package/dist/core/aggregate/{state-aggregate.d.ts → state-aggregate/state-aggregate.d.ts} +5 -9
- package/dist/core/aggregate/{state-aggregate.js → state-aggregate/state-aggregate.js} +2 -8
- package/dist/core/aggregate/types.d.ts +3 -3
- package/dist/core/entity/entity.builder.d.ts +9 -0
- package/dist/core/entity/entity.builder.js +17 -0
- package/dist/core/{entity.d.ts → entity/entity.d.ts} +4 -5
- package/dist/core/entity/entity.js +26 -0
- package/dist/core/entity/index.d.ts +2 -0
- package/dist/core/entity/index.js +18 -0
- package/dist/core/enum/enum.builder.d.ts +9 -0
- package/dist/core/enum/enum.builder.js +20 -0
- package/dist/core/enum/enum.d.ts +21 -0
- package/dist/core/enum/enum.js +60 -0
- package/dist/core/enum/index.d.ts +2 -0
- package/dist/{meta/helpers → core/enum}/index.js +2 -1
- package/dist/core/id/index.d.ts +1 -1
- package/dist/core/id/index.js +1 -1
- package/dist/core/index.d.ts +3 -4
- package/dist/core/index.js +3 -4
- package/dist/core/message/command/command.builder.d.ts +7 -0
- package/dist/core/message/command/command.builder.js +20 -0
- package/dist/core/message/{command.d.ts → command/command.d.ts} +10 -7
- package/dist/core/message/command/command.js +27 -0
- package/dist/core/message/command/index.d.ts +2 -0
- package/dist/core/message/command/index.js +18 -0
- package/dist/core/message/event/event.builder.d.ts +9 -0
- package/dist/core/message/event/event.builder.js +27 -0
- package/dist/core/message/{event.d.ts → event/event.d.ts} +13 -10
- package/dist/core/message/event/event.js +31 -0
- package/dist/core/message/event/index.d.ts +2 -0
- package/dist/core/message/event/index.js +18 -0
- package/dist/core/message/index.d.ts +1 -1
- package/dist/core/message/index.js +1 -1
- package/dist/core/message/message-base/index.d.ts +2 -0
- package/dist/core/message/message-base/index.js +18 -0
- package/dist/core/message/message-base/message.builder.d.ts +16 -0
- package/dist/core/message/message-base/message.builder.js +45 -0
- package/dist/core/message/message-base/message.d.ts +31 -0
- package/dist/core/message/message-base/message.js +47 -0
- package/dist/core/model-with-id/index.d.ts +2 -0
- package/dist/core/model-with-id/index.js +18 -0
- package/dist/core/model-with-id/model-with-id.builder.d.ts +11 -0
- package/dist/core/model-with-id/model-with-id.builder.js +22 -0
- package/dist/core/{model → model-with-id}/model-with-id.d.ts +1 -3
- package/dist/core/{model → model-with-id}/model-with-id.js +1 -10
- package/dist/core/value-object/index.d.ts +2 -0
- package/dist/core/value-object/index.js +18 -0
- package/dist/core/value-object/value-object.builder.d.ts +7 -0
- package/dist/core/value-object/value-object.builder.js +16 -0
- package/dist/core/{value-object.d.ts → value-object/value-object.d.ts} +2 -2
- package/dist/core/value-object/value-object.js +40 -0
- package/dist/decorators/aggregate-es/handle.js +1 -1
- package/dist/decorators/aggregate-es/when.js +1 -1
- package/dist/decorators/enum.d.ts +2 -0
- package/dist/decorators/{model/enum.js → enum.js} +2 -2
- package/dist/decorators/index.d.ts +1 -2
- package/dist/decorators/index.js +1 -2
- package/dist/decorators/message/command.js +1 -1
- package/dist/decorators/message/event.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/meta/aggregate-es/command-handler-map.d.ts +8 -0
- package/dist/meta/aggregate-es/command-handler-map.js +43 -0
- package/dist/meta/aggregate-es/event-applier-map.d.ts +9 -0
- package/dist/meta/aggregate-es/event-applier-map.js +43 -0
- package/dist/meta/aggregate-es/index.d.ts +2 -0
- package/dist/meta/aggregate-es/index.js +18 -0
- package/dist/meta/command.metadata.d.ts +6 -2
- package/dist/meta/command.metadata.js +19 -5
- package/dist/meta/event.metadata.d.ts +6 -2
- package/dist/meta/event.metadata.js +19 -5
- package/dist/meta/id.metadata.js +2 -3
- package/dist/meta/index.d.ts +1 -3
- package/dist/meta/index.js +1 -3
- package/dist/model/core/index.d.ts +2 -0
- package/dist/{core/model → model/core}/index.js +1 -1
- package/dist/model/core/model.builder.d.ts +11 -0
- package/dist/model/core/model.builder.js +18 -0
- package/dist/model/core/model.d.ts +41 -0
- package/dist/{core/model → model/core}/model.js +36 -57
- package/dist/model/decorators/index.d.ts +4 -0
- package/dist/{decorators/model → model/decorators}/index.js +1 -3
- package/dist/model/decorators/model.d.ts +12 -0
- package/dist/model/decorators/model.js +54 -0
- package/dist/model/decorators/mutable.d.ts +2 -0
- package/dist/model/decorators/mutable.js +10 -0
- package/dist/model/decorators/prop.d.ts +2 -0
- package/dist/{decorators/model → model/decorators}/prop.js +2 -2
- package/dist/model/decorators/static.d.ts +3 -0
- package/dist/model/decorators/static.js +11 -0
- package/dist/model/domain.d.ts +20 -0
- package/dist/model/domain.js +40 -0
- package/dist/model/index.d.ts +5 -0
- package/dist/model/index.js +21 -0
- package/dist/model/meta/index.d.ts +8 -0
- package/dist/model/meta/index.js +24 -0
- package/dist/model/meta/model-domain.d.ts +5 -0
- package/dist/model/meta/model-domain.js +15 -0
- package/dist/model/meta/model-id.d.ts +16 -0
- package/dist/model/meta/model-id.js +39 -0
- package/dist/model/meta/model-mutable.d.ts +2 -0
- package/dist/model/meta/model-mutable.js +14 -0
- package/dist/model/meta/model-name.d.ts +8 -0
- package/dist/model/meta/model-name.js +25 -0
- package/dist/model/meta/model-props-map.d.ts +6 -0
- package/dist/model/meta/model-props-map.js +45 -0
- package/dist/model/meta/model-props-validator.d.ts +6 -0
- package/dist/model/meta/model-props-validator.js +33 -0
- package/dist/model/meta/model-static-values.d.ts +13 -0
- package/dist/model/meta/model-static-values.js +54 -0
- package/dist/model/meta/model-version.d.ts +8 -0
- package/dist/model/meta/model-version.js +25 -0
- package/dist/model/model-registry.d.ts +17 -0
- package/dist/model/model-registry.js +55 -0
- package/dist/package.json +1 -1
- package/package.json +2 -2
- package/dist/core/aggregate/base.d.ts +0 -12
- package/dist/core/domain.d.ts +0 -17
- package/dist/core/domain.js +0 -47
- package/dist/core/entity.js +0 -20
- package/dist/core/enum.d.ts +0 -18
- package/dist/core/enum.js +0 -45
- package/dist/core/message/command.js +0 -25
- package/dist/core/message/event.js +0 -30
- package/dist/core/message/message.d.ts +0 -23
- package/dist/core/message/message.js +0 -33
- package/dist/core/model/index.d.ts +0 -2
- package/dist/core/model/model.d.ts +0 -47
- package/dist/core/value-object.js +0 -27
- package/dist/decorators/id.d.ts +0 -2
- package/dist/decorators/id.js +0 -10
- package/dist/decorators/model/enum.d.ts +0 -2
- package/dist/decorators/model/index.d.ts +0 -6
- package/dist/decorators/model/model.d.ts +0 -2
- package/dist/decorators/model/model.js +0 -10
- package/dist/decorators/model/prop.d.ts +0 -2
- package/dist/decorators/model/static.d.ts +0 -3
- package/dist/decorators/model/static.js +0 -20
- package/dist/decorators/model/validator.d.ts +0 -3
- package/dist/decorators/model/validator.js +0 -11
- package/dist/decorators/model/version.d.ts +0 -2
- package/dist/decorators/model/version.js +0 -10
- package/dist/meta/aggregate.metadata.d.ts +0 -8
- package/dist/meta/aggregate.metadata.js +0 -34
- package/dist/meta/helpers/index.d.ts +0 -1
- package/dist/meta/helpers/static-value.d.ts +0 -7
- package/dist/meta/helpers/static-value.js +0 -15
- package/dist/meta/model.metadata.d.ts +0 -24
- package/dist/meta/model.metadata.js +0 -145
- /package/dist/core/id/{common → services}/index.d.ts +0 -0
- /package/dist/core/id/{common → services}/index.js +0 -0
- /package/dist/core/id/{common → services}/snowflake.d.ts +0 -0
- /package/dist/core/id/{common → services}/snowflake.js +0 -0
- /package/dist/core/id/{common → services}/uuid4.d.ts +0 -0
- /package/dist/core/id/{common → services}/uuid4.js +0 -0
- /package/dist/{core/model → model/core}/errors.d.ts +0 -0
- /package/dist/{core/model → model/core}/errors.js +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EntityBuilderBase } from "../../entity";
|
|
2
|
+
import { AnyAggregate } from "./aggregate";
|
|
3
|
+
export declare abstract class AggregateBuilderBase<T extends AnyAggregate> extends EntityBuilderBase<T> {
|
|
4
|
+
protected _version?: number;
|
|
5
|
+
getVersion(): number;
|
|
6
|
+
withVersion(version: number): this;
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AggregateBuilderBase = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const entity_1 = require("../../entity");
|
|
9
|
+
class AggregateBuilderBase extends entity_1.EntityBuilderBase {
|
|
10
|
+
getVersion() {
|
|
11
|
+
return !lodash_1.default.isUndefined(this._version) ? this._version : 0;
|
|
12
|
+
}
|
|
13
|
+
withVersion(version) {
|
|
14
|
+
this._version = version;
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.AggregateBuilderBase = AggregateBuilderBase;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EntityBase, EntityMetadata } from "../../entity";
|
|
2
|
+
import { Props, PropsOf } from "../../../model";
|
|
3
|
+
import { AnyEvent, EventClassWithTypedConstructor, EventSource } from "../../message";
|
|
4
|
+
import { IEventDispatcher } from "../event-dispatcher.interface";
|
|
5
|
+
export interface AggregateMetadata extends EntityMetadata {
|
|
6
|
+
version: number;
|
|
7
|
+
}
|
|
8
|
+
export declare abstract class AggregateBase<P extends Props> extends EntityBase<P> {
|
|
9
|
+
protected readonly _version: number;
|
|
10
|
+
constructor(metadata: AggregateMetadata, props?: P);
|
|
11
|
+
abstract version(): number;
|
|
12
|
+
protected createEventSource(): EventSource;
|
|
13
|
+
protected newEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: PropsOf<E>): E;
|
|
14
|
+
abstract dispatchEvents(dispatcher: IEventDispatcher): void;
|
|
15
|
+
}
|
|
16
|
+
export type AnyAggregate = AggregateBase<Props>;
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AggregateBase = void 0;
|
|
4
|
-
const entity_1 = require("
|
|
4
|
+
const entity_1 = require("../../entity");
|
|
5
|
+
const message_1 = require("../../message");
|
|
5
6
|
class AggregateBase extends entity_1.EntityBase {
|
|
6
7
|
constructor(metadata, props) {
|
|
7
8
|
super(metadata, props);
|
|
8
9
|
this._version = metadata.version;
|
|
9
10
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
createEventSource() {
|
|
12
|
+
return {
|
|
13
|
+
aggregateModelId: this.modelMetadata().modelId,
|
|
13
14
|
aggregateId: this.id(),
|
|
14
15
|
aggregateVersion: this.version(),
|
|
15
16
|
};
|
|
16
|
-
|
|
17
|
+
}
|
|
18
|
+
newEvent(eventClass, props) {
|
|
19
|
+
const eventBuilder = new message_1.EventBuilder(eventClass);
|
|
20
|
+
return eventBuilder
|
|
21
|
+
.withSource(this.createEventSource())
|
|
22
|
+
.withProps(props)
|
|
23
|
+
.build();
|
|
17
24
|
}
|
|
18
25
|
}
|
|
19
26
|
exports.AggregateBase = AggregateBase;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./aggregate"), exports);
|
|
18
|
+
__exportStar(require("./aggregate.builder"), exports);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AnyEvent } from "../../message";
|
|
2
|
+
import { AggregateBuilderBase } from "../aggregate-base";
|
|
3
|
+
import { AnyEventSourcedAggregate, EventSourcedAggregateClassWithTypedConstructor, Snapshot } from "./event-sourced-aggregate";
|
|
4
|
+
export declare class EventSourcedAggregateBuilder<T extends AnyEventSourcedAggregate> extends AggregateBuilderBase<T> {
|
|
5
|
+
private aggregateClass;
|
|
6
|
+
private _pastEvents?;
|
|
7
|
+
private _snapshot?;
|
|
8
|
+
constructor(aggregateClass: EventSourcedAggregateClassWithTypedConstructor<T>);
|
|
9
|
+
withPastEvents(pastEvents: AnyEvent[]): this;
|
|
10
|
+
withSnapshot(snapshot: Snapshot<T>): this;
|
|
11
|
+
build(): T;
|
|
12
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventSourcedAggregateBuilder = void 0;
|
|
4
|
+
const aggregate_base_1 = require("../aggregate-base");
|
|
5
|
+
class EventSourcedAggregateBuilder extends aggregate_base_1.AggregateBuilderBase {
|
|
6
|
+
constructor(aggregateClass) {
|
|
7
|
+
super();
|
|
8
|
+
this.aggregateClass = aggregateClass;
|
|
9
|
+
}
|
|
10
|
+
withPastEvents(pastEvents) {
|
|
11
|
+
this._pastEvents = pastEvents;
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
withSnapshot(snapshot) {
|
|
15
|
+
this._snapshot = snapshot;
|
|
16
|
+
return this;
|
|
17
|
+
}
|
|
18
|
+
build() {
|
|
19
|
+
if (this._snapshot) {
|
|
20
|
+
const { id, version } = this._snapshot.metadata;
|
|
21
|
+
const { props } = this._snapshot;
|
|
22
|
+
this.withId(id).withVersion(version).withProps(props);
|
|
23
|
+
}
|
|
24
|
+
const instance = new this.aggregateClass({
|
|
25
|
+
id: this.getId(),
|
|
26
|
+
version: this.getVersion(),
|
|
27
|
+
}, this._props);
|
|
28
|
+
if (this._pastEvents) {
|
|
29
|
+
const pastEvents = this._pastEvents.filter((_pastEvent) => _pastEvent.source().aggregateVersion >= instance.version());
|
|
30
|
+
instance.applyPastEvents(pastEvents);
|
|
31
|
+
}
|
|
32
|
+
return instance;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.EventSourcedAggregateBuilder = EventSourcedAggregateBuilder;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Class } from "type-fest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { AnyCommand, AnyEvent, EventClassWithTypedConstructor } from "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { Props, PropsOf } from "../../../model";
|
|
3
|
+
import { ClassStatic } from "../../../types";
|
|
4
|
+
import { AnyCommand, AnyEvent, EventClassWithTypedConstructor } from "../../message";
|
|
5
|
+
import { AggregateBase, AggregateMetadata } from "../aggregate-base";
|
|
6
|
+
import { IEventDispatcher } from "../event-dispatcher.interface";
|
|
7
|
+
import { ESAModelMetadata } from "./event-sourced-aggregate.model-metadata";
|
|
7
8
|
export interface SnapshotMetadata extends AggregateMetadata {
|
|
8
9
|
}
|
|
9
10
|
export interface Snapshot<T extends AnyEventSourcedAggregate> {
|
|
@@ -15,30 +16,27 @@ export declare class EventSourcedAggregateBase<P extends Props> extends Aggregat
|
|
|
15
16
|
private _pastEvents;
|
|
16
17
|
private _events;
|
|
17
18
|
constructor(metadata: AggregateMetadata, props?: P);
|
|
18
|
-
static
|
|
19
|
-
|
|
20
|
-
static fromSnapshot<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClassWithTypedConstructor<T>, snapshot: Snapshot<T>, pastEventsAfterSnapshot?: AnyEvent[]): T;
|
|
21
|
-
static eventApplierMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): Map<string, EventApplier>;
|
|
22
|
-
static commandHandlerMap<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): Map<string, CommandHandler>;
|
|
19
|
+
static esaModelMetadata<T extends AnyEventSourcedAggregate>(this: EventSourcedAggregateClass<T>): ESAModelMetadata<T>;
|
|
20
|
+
esaModelMetadata(): ESAModelMetadata<this>;
|
|
23
21
|
version(): number;
|
|
24
22
|
pastEvents(): AnyEvent[];
|
|
25
23
|
events(): AnyEvent[];
|
|
26
24
|
handledCommands(): AnyCommand[];
|
|
27
|
-
eventApplierMap(): Map<string, EventApplier>;
|
|
28
25
|
hasNewEvent(): boolean;
|
|
29
26
|
getApplierForEvent<E extends AnyEvent>(event: E): EventApplier<E>;
|
|
30
27
|
private validateEventBeforeApply;
|
|
31
28
|
private _applyEvent;
|
|
32
29
|
private applyPastEvent;
|
|
33
|
-
|
|
30
|
+
applyPastEvents(pastEvents: AnyEvent[]): void;
|
|
34
31
|
applyEvent<E extends AnyEvent>(event: E): void;
|
|
35
32
|
applyEvents(events: AnyEvent[]): void;
|
|
36
33
|
applyNewEvent<E extends AnyEvent>(eventClass: EventClassWithTypedConstructor<E>, props: PropsOf<E>): void;
|
|
37
|
-
commandHandlerMap(): Map<string, CommandHandler>;
|
|
38
34
|
getHandlerForCommand<C extends AnyCommand>(command: C): CommandHandler<C, AnyEvent | AnyEvent[]>;
|
|
39
35
|
handleCommand<C extends AnyCommand>(command: C): AnyEvent[];
|
|
40
36
|
snapMetadata(): SnapshotMetadata;
|
|
41
37
|
snap(): Snapshot<this>;
|
|
38
|
+
protected archiveEvents(): void;
|
|
39
|
+
dispatchEvents(dispatcher: IEventDispatcher): void;
|
|
42
40
|
}
|
|
43
41
|
export type AnyEventSourcedAggregate = EventSourcedAggregateBase<Props>;
|
|
44
42
|
export interface EventSourcedAggregateClass<T extends AnyEventSourcedAggregate = AnyEventSourcedAggregate, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof EventSourcedAggregateBase<PropsOf<T>>> {
|
|
@@ -1,38 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EventSourcedAggregateBase = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
class EventSourcedAggregateBase extends
|
|
4
|
+
const utils_1 = require("../../../utils");
|
|
5
|
+
const aggregate_base_1 = require("../aggregate-base");
|
|
6
|
+
const event_sourced_aggregate_model_metadata_1 = require("./event-sourced-aggregate.model-metadata");
|
|
7
|
+
class EventSourcedAggregateBase extends aggregate_base_1.AggregateBase {
|
|
8
8
|
constructor(metadata, props) {
|
|
9
9
|
super(metadata, props);
|
|
10
10
|
this._handledCommands = [];
|
|
11
11
|
this._events = [];
|
|
12
12
|
this._pastEvents = [];
|
|
13
13
|
}
|
|
14
|
-
static
|
|
15
|
-
return new this
|
|
16
|
-
id: this.id(id),
|
|
17
|
-
version: 0,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
static fromStream(id, pastEvents = []) {
|
|
21
|
-
const instance = this.newStream(id);
|
|
22
|
-
instance.applyPastEvents(pastEvents);
|
|
23
|
-
return instance;
|
|
24
|
-
}
|
|
25
|
-
static fromSnapshot(snapshot, pastEventsAfterSnapshot = []) {
|
|
26
|
-
const { metadata, props } = snapshot;
|
|
27
|
-
const instance = new this(metadata, props);
|
|
28
|
-
instance.applyPastEvents(pastEventsAfterSnapshot);
|
|
29
|
-
return instance;
|
|
14
|
+
static esaModelMetadata() {
|
|
15
|
+
return new event_sourced_aggregate_model_metadata_1.ESAModelMetadata(this);
|
|
30
16
|
}
|
|
31
|
-
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
static commandHandlerMap() {
|
|
35
|
-
return (0, meta_1.getCommandHandlerMap)(this.prototype);
|
|
17
|
+
esaModelMetadata() {
|
|
18
|
+
return this.constructor.esaModelMetadata();
|
|
36
19
|
}
|
|
37
20
|
version() {
|
|
38
21
|
return this._version + this._pastEvents.length + this._events.length;
|
|
@@ -46,22 +29,20 @@ class EventSourcedAggregateBase extends base_1.AggregateBase {
|
|
|
46
29
|
handledCommands() {
|
|
47
30
|
return Array.from(this._handledCommands);
|
|
48
31
|
}
|
|
49
|
-
eventApplierMap() {
|
|
50
|
-
return this.constructor.eventApplierMap();
|
|
51
|
-
}
|
|
52
32
|
hasNewEvent() {
|
|
53
33
|
return Boolean(this._events.length);
|
|
54
34
|
}
|
|
55
35
|
getApplierForEvent(event) {
|
|
56
|
-
const eventType = event.
|
|
57
|
-
const
|
|
36
|
+
const { eventType } = event.eventModelMetadata();
|
|
37
|
+
const { eventApplierMap } = this.esaModelMetadata();
|
|
38
|
+
const applier = eventApplierMap.get(eventType);
|
|
58
39
|
if (!applier)
|
|
59
40
|
throw new Error("Event applier not found");
|
|
60
41
|
return applier;
|
|
61
42
|
}
|
|
62
43
|
validateEventBeforeApply(event) {
|
|
63
44
|
const eventSource = event.source();
|
|
64
|
-
if (eventSource.
|
|
45
|
+
if (eventSource.aggregateModelId !== this.modelMetadata().modelId)
|
|
65
46
|
throw new Error("Invalid source type");
|
|
66
47
|
if (!eventSource.aggregateId.equals(this._id))
|
|
67
48
|
throw new Error("Invalid source id");
|
|
@@ -96,12 +77,10 @@ class EventSourcedAggregateBase extends base_1.AggregateBase {
|
|
|
96
77
|
applyNewEvent(eventClass, props) {
|
|
97
78
|
this.applyEvent(this.newEvent(eventClass, props));
|
|
98
79
|
}
|
|
99
|
-
commandHandlerMap() {
|
|
100
|
-
return this.constructor.commandHandlerMap();
|
|
101
|
-
}
|
|
102
80
|
getHandlerForCommand(command) {
|
|
103
|
-
const commandType = command.
|
|
104
|
-
const
|
|
81
|
+
const { commandType } = command.commandModelMetadata();
|
|
82
|
+
const { commandHandlerMap } = this.esaModelMetadata();
|
|
83
|
+
const handler = commandHandlerMap.get(commandType);
|
|
105
84
|
if (!handler)
|
|
106
85
|
throw new Error("Command handler not found");
|
|
107
86
|
return handler;
|
|
@@ -133,5 +112,16 @@ class EventSourcedAggregateBase extends base_1.AggregateBase {
|
|
|
133
112
|
props: this.props(),
|
|
134
113
|
};
|
|
135
114
|
}
|
|
115
|
+
archiveEvents() {
|
|
116
|
+
const events = this.events();
|
|
117
|
+
this._events = [];
|
|
118
|
+
this._pastEvents.push(...events);
|
|
119
|
+
}
|
|
120
|
+
dispatchEvents(dispatcher) {
|
|
121
|
+
this.events().forEach((event) => {
|
|
122
|
+
dispatcher.dispatch(event);
|
|
123
|
+
});
|
|
124
|
+
this.archiveEvents();
|
|
125
|
+
}
|
|
136
126
|
}
|
|
137
127
|
exports.EventSourcedAggregateBase = EventSourcedAggregateBase;
|
package/dist/core/aggregate/event-sourced-aggregate/event-sourced-aggregate.model-metadata.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AnyEventSourcedAggregate, EventSourcedAggregateClass } from "..";
|
|
2
|
+
export declare class ESAModelMetadata<T extends AnyEventSourcedAggregate> {
|
|
3
|
+
private aggregateClass;
|
|
4
|
+
constructor(aggregateClass: EventSourcedAggregateClass<T>);
|
|
5
|
+
get ownEventApplierMap(): import("../../../meta").EventApplierMap;
|
|
6
|
+
get eventApplierMap(): import("../../../meta").EventApplierMap;
|
|
7
|
+
get ownCommandHandlerMap(): import("../../../meta").CommandHandlerMap;
|
|
8
|
+
get commandHandlerMap(): import("../../../meta").CommandHandlerMap;
|
|
9
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ESAModelMetadata = void 0;
|
|
4
|
+
const meta_1 = require("../../../meta");
|
|
5
|
+
class ESAModelMetadata {
|
|
6
|
+
constructor(aggregateClass) {
|
|
7
|
+
this.aggregateClass = aggregateClass;
|
|
8
|
+
}
|
|
9
|
+
get ownEventApplierMap() {
|
|
10
|
+
return (0, meta_1.getOwnEventApplierMap)(this.aggregateClass.prototype);
|
|
11
|
+
}
|
|
12
|
+
get eventApplierMap() {
|
|
13
|
+
return (0, meta_1.getEventApplierMap)(this.aggregateClass.prototype);
|
|
14
|
+
}
|
|
15
|
+
get ownCommandHandlerMap() {
|
|
16
|
+
return (0, meta_1.getOwnCommandHandlerMap)(this.aggregateClass.prototype);
|
|
17
|
+
}
|
|
18
|
+
get commandHandlerMap() {
|
|
19
|
+
return (0, meta_1.getCommandHandlerMap)(this.aggregateClass.prototype);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.ESAModelMetadata = ESAModelMetadata;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./event-sourced-aggregate"), exports);
|
|
18
|
+
__exportStar(require("./event-sourced-aggregate.builder"), exports);
|
|
19
|
+
__exportStar(require("./event-sourced-aggregate.model-metadata"), exports);
|
|
@@ -14,6 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./event-dispatcher.interface"), exports);
|
|
18
|
+
__exportStar(require("./aggregate-base"), exports);
|
|
17
19
|
__exportStar(require("./state-aggregate"), exports);
|
|
18
20
|
__exportStar(require("./event-sourced-aggregate"), exports);
|
|
19
21
|
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./state-aggregate"), exports);
|
|
18
|
+
__exportStar(require("./state-aggregate.builder"), exports);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AggregateBuilderBase } from "../aggregate-base";
|
|
2
|
+
import { AnyStateAggregate, StateAggregateClassWithTypedConstructor } from "./state-aggregate";
|
|
3
|
+
export declare class StateAggregateBuilder<T extends AnyStateAggregate> extends AggregateBuilderBase<T> {
|
|
4
|
+
private aggregateClass;
|
|
5
|
+
constructor(aggregateClass: StateAggregateClassWithTypedConstructor<T>);
|
|
6
|
+
build(): T;
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateAggregateBuilder = void 0;
|
|
4
|
+
const aggregate_base_1 = require("../aggregate-base");
|
|
5
|
+
class StateAggregateBuilder extends aggregate_base_1.AggregateBuilderBase {
|
|
6
|
+
constructor(aggregateClass) {
|
|
7
|
+
super();
|
|
8
|
+
this.aggregateClass = aggregateClass;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
if (!this._props)
|
|
12
|
+
throw new Error("The props must be set before build");
|
|
13
|
+
return new this.aggregateClass({
|
|
14
|
+
id: this.getId(),
|
|
15
|
+
version: this.getVersion(),
|
|
16
|
+
}, this._props);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.StateAggregateBuilder = StateAggregateBuilder;
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import { Class } from "type-fest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { AnyEvent, EventClass } from "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
export interface IEventDispatcher {
|
|
8
|
-
dispatch(event: AnyEvent): void;
|
|
9
|
-
}
|
|
2
|
+
import { Props, PropsOf } from "../../../model";
|
|
3
|
+
import { ClassStatic } from "../../../types";
|
|
4
|
+
import { AnyEvent, EventClass } from "../../message";
|
|
5
|
+
import { AggregateBase, AggregateMetadata } from "../aggregate-base";
|
|
6
|
+
import { IEventDispatcher } from "../event-dispatcher.interface";
|
|
10
7
|
export declare class StateAggregateBase<P extends Props> extends AggregateBase<P> {
|
|
11
8
|
private _events;
|
|
12
9
|
constructor(metadata: AggregateMetadata, props: P);
|
|
13
|
-
static newAggregate<T extends AnyStateAggregate>(this: StateAggregateClassWithTypedConstructor<T>, props: PropsOf<T>, id?: Id): T;
|
|
14
10
|
props(): P;
|
|
15
11
|
version(): number;
|
|
16
12
|
events(): AnyEvent[];
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.StateAggregateBase = void 0;
|
|
4
|
-
const
|
|
5
|
-
class StateAggregateBase extends
|
|
4
|
+
const aggregate_base_1 = require("../aggregate-base");
|
|
5
|
+
class StateAggregateBase extends aggregate_base_1.AggregateBase {
|
|
6
6
|
constructor(metadata, props) {
|
|
7
7
|
super(metadata, props);
|
|
8
8
|
this._events = [];
|
|
9
9
|
}
|
|
10
|
-
static newAggregate(props, id) {
|
|
11
|
-
return new this({
|
|
12
|
-
id: this.id(id),
|
|
13
|
-
version: 0,
|
|
14
|
-
}, props);
|
|
15
|
-
}
|
|
16
10
|
props() {
|
|
17
11
|
return super.props();
|
|
18
12
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AnyEventSourcedAggregate, EventSourcedAggregateClass } from "./event-sourced-aggregate";
|
|
1
|
+
import { AnyEventSourcedAggregate, EventSourcedAggregateClass } from "./event-sourced-aggregate/event-sourced-aggregate";
|
|
2
2
|
import { AnyStateAggregate, StateAggregateClass } from "./state-aggregate";
|
|
3
|
-
export type
|
|
4
|
-
export type
|
|
3
|
+
export type Aggregate = AnyStateAggregate | AnyEventSourcedAggregate;
|
|
4
|
+
export type AggregateClass = StateAggregateClass | EventSourcedAggregateClass;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ModelWithIdBuilder } from "..";
|
|
2
|
+
import { AnyEntity, EntityClassWithTypedConstructor } from "./entity";
|
|
3
|
+
export declare abstract class EntityBuilderBase<T extends AnyEntity> extends ModelWithIdBuilder<T> {
|
|
4
|
+
}
|
|
5
|
+
export declare class EntityBuilder<T extends AnyEntity> extends EntityBuilderBase<T> {
|
|
6
|
+
private entityClass;
|
|
7
|
+
constructor(entityClass: EntityClassWithTypedConstructor<T>);
|
|
8
|
+
build(): T;
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntityBuilder = exports.EntityBuilderBase = void 0;
|
|
4
|
+
const __1 = require("..");
|
|
5
|
+
class EntityBuilderBase extends __1.ModelWithIdBuilder {
|
|
6
|
+
}
|
|
7
|
+
exports.EntityBuilderBase = EntityBuilderBase;
|
|
8
|
+
class EntityBuilder extends EntityBuilderBase {
|
|
9
|
+
constructor(entityClass) {
|
|
10
|
+
super();
|
|
11
|
+
this.entityClass = entityClass;
|
|
12
|
+
}
|
|
13
|
+
build() {
|
|
14
|
+
return new this.entityClass({ id: this.getId() }, this._props);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.EntityBuilder = EntityBuilder;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Class } from "type-fest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { Props, PropsOf } from "../../model";
|
|
3
|
+
import { ClassStatic } from "../../types";
|
|
4
|
+
import { Id } from "../id";
|
|
5
|
+
import { ModelWithId } from "../model-with-id";
|
|
5
6
|
export interface EntityMetadata {
|
|
6
7
|
readonly id: Id;
|
|
7
8
|
}
|
|
8
9
|
export declare class EntityBase<P extends Props> extends ModelWithId<P> {
|
|
9
10
|
constructor(metadata: EntityMetadata, props?: P);
|
|
10
|
-
static mutable(): boolean;
|
|
11
|
-
static newEntity<T extends AnyEntity>(this: EntityClassWithTypedConstructor<T>, props: PropsOf<T>, id?: Id): T;
|
|
12
11
|
}
|
|
13
12
|
export type AnyEntity = EntityBase<Props>;
|
|
14
13
|
export interface EntityClass<T extends AnyEntity = AnyEntity, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof EntityBase<PropsOf<T>>> {
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EntityBase = void 0;
|
|
13
|
+
const model_1 = require("../../model");
|
|
14
|
+
const model_with_id_1 = require("../model-with-id");
|
|
15
|
+
let EntityBase = class EntityBase extends model_with_id_1.ModelWithId {
|
|
16
|
+
constructor(metadata, props) {
|
|
17
|
+
super(metadata.id);
|
|
18
|
+
if (props)
|
|
19
|
+
this.initializeProps(props);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.EntityBase = EntityBase;
|
|
23
|
+
exports.EntityBase = EntityBase = __decorate([
|
|
24
|
+
(0, model_1.Mutable)(true),
|
|
25
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
26
|
+
], EntityBase);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./entity"), exports);
|
|
18
|
+
__exportStar(require("./entity.builder"), exports);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ModelBuilder } from "../../model";
|
|
2
|
+
import { AnyEnum, EnumClassWithTypedConstructor, EnumValue } from "./enum";
|
|
3
|
+
export declare class EnumBuilder<T extends AnyEnum> extends ModelBuilder<T> {
|
|
4
|
+
private enumClass;
|
|
5
|
+
protected _value: EnumValue;
|
|
6
|
+
constructor(enumClass: EnumClassWithTypedConstructor<T>);
|
|
7
|
+
withValue(value: EnumValue): this;
|
|
8
|
+
build(): T;
|
|
9
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EnumBuilder = void 0;
|
|
4
|
+
const model_1 = require("../../model");
|
|
5
|
+
class EnumBuilder extends model_1.ModelBuilder {
|
|
6
|
+
constructor(enumClass) {
|
|
7
|
+
super();
|
|
8
|
+
this.enumClass = enumClass;
|
|
9
|
+
}
|
|
10
|
+
withValue(value) {
|
|
11
|
+
this._value = value;
|
|
12
|
+
return this;
|
|
13
|
+
}
|
|
14
|
+
build() {
|
|
15
|
+
if (!this._value)
|
|
16
|
+
throw new Error("The value must be set before build");
|
|
17
|
+
return this.enumClass.parse(this._value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.EnumBuilder = EnumBuilder;
|