@woltz/rich-domain 0.2.2 → 1.1.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/CHANGELOG.md +23 -75
- package/LICENSE +20 -20
- package/README.md +37 -20
- package/dist/base-entity.d.ts +2 -2
- package/dist/base-entity.d.ts.map +1 -1
- package/dist/base-entity.js +6 -4
- package/dist/base-entity.js.map +1 -1
- package/dist/criteria.d.ts +5 -11
- package/dist/criteria.d.ts.map +1 -1
- package/dist/criteria.js +4 -3
- package/dist/criteria.js.map +1 -1
- package/dist/deep-proxy.d.ts +3 -1
- package/dist/deep-proxy.d.ts.map +1 -1
- package/dist/deep-proxy.js +116 -29
- package/dist/deep-proxy.js.map +1 -1
- package/dist/domain-event-bus.d.ts +5 -6
- package/dist/domain-event-bus.d.ts.map +1 -1
- package/dist/domain-event-bus.js +3 -11
- package/dist/domain-event-bus.js.map +1 -1
- package/dist/domain-event.d.ts +1 -31
- package/dist/domain-event.d.ts.map +1 -1
- package/dist/domain-event.js +2 -1
- package/dist/domain-event.js.map +1 -1
- package/dist/entity.d.ts +2 -2
- package/dist/entity.js +1 -1
- package/dist/exceptions.d.ts +251 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +321 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/id.d.ts +3 -3
- package/dist/id.d.ts.map +1 -1
- package/dist/id.js +15 -4
- package/dist/id.js.map +1 -1
- package/dist/index.d.ts +2 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -8
- package/dist/index.js.map +1 -1
- package/dist/paginated-result.d.ts.map +1 -1
- package/dist/paginated-result.js +12 -1
- package/dist/paginated-result.js.map +1 -1
- package/dist/repository/index.d.ts +2 -39
- package/dist/repository/index.d.ts.map +1 -1
- package/dist/repository/index.js +2 -39
- package/dist/repository/index.js.map +1 -1
- package/dist/repository/unit-of-work.d.ts +0 -11
- package/dist/repository/unit-of-work.d.ts.map +1 -1
- package/dist/repository/unit-of-work.js +0 -35
- package/dist/repository/unit-of-work.js.map +1 -1
- package/dist/types/criteria.d.ts +6 -2
- package/dist/types/criteria.d.ts.map +1 -1
- package/dist/types/criteria.js +1 -1
- package/dist/types/criteria.js.map +1 -1
- package/dist/types/domain-event.d.ts +32 -0
- package/dist/types/domain-event.d.ts.map +1 -0
- package/dist/types/domain-event.js +2 -0
- package/dist/types/domain-event.js.map +1 -0
- package/dist/types/domain.d.ts +2 -2
- package/dist/types/domain.d.ts.map +1 -1
- package/dist/types/history-tracker.d.ts +1 -1
- package/dist/types/history-tracker.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/value-object.d.ts +1 -1
- package/dist/value-object.d.ts.map +1 -1
- package/dist/value-object.js +2 -5
- package/dist/value-object.js.map +1 -1
- package/eslint.config.js +3 -3
- package/jest.config.js +1 -1
- package/package.json +14 -20
- package/src/base-entity.ts +6 -5
- package/src/criteria.ts +11 -11
- package/src/deep-proxy.ts +447 -339
- package/src/domain-event-bus.ts +152 -166
- package/src/domain-event.ts +53 -90
- package/src/entity.ts +16 -16
- package/src/exceptions.ts +435 -0
- package/src/id.ts +107 -94
- package/src/index.ts +26 -9
- package/src/paginated-result.ts +14 -1
- package/src/repository/index.ts +2 -44
- package/src/repository/unit-of-work.ts +1 -44
- package/src/types/criteria.ts +7 -2
- package/src/types/domain-event.ts +38 -0
- package/src/types/domain.ts +2 -3
- package/src/types/history-tracker.ts +1 -1
- package/src/types/index.ts +1 -0
- package/src/validation-error.ts +97 -97
- package/src/value-object.ts +3 -6
- package/tests/criteria.test.ts +8 -0
- package/tests/domain-events.test.ts +431 -445
- package/tests/entity-validation.test.ts +2 -2
- package/tests/entity.test.ts +33 -33
- package/tests/history-tracker.spec.ts +57 -17
- package/tests/id.test.ts +341 -341
- package/tests/repository.test.ts +8 -4
- package/tests/to-json.test.ts +103 -91
- package/tests/utils.ts +254 -151
- package/tests/value-object-validation.test.ts +0 -9
- package/tests/value-objects.test.ts +52 -52
- package/tsconfig.json +2 -24
- package/.github/workflows/ci.yml +0 -40
- package/.husky/commit-msg +0 -1
- package/.husky/pre-commit +0 -1
- package/.vscode/settings.json +0 -3
- package/commitlint.config.js +0 -23
- package/dist/filtering.d.ts +0 -107
- package/dist/filtering.d.ts.map +0 -1
- package/dist/filtering.js +0 -202
- package/dist/filtering.js.map +0 -1
- package/dist/ordering.d.ts +0 -93
- package/dist/ordering.d.ts.map +0 -1
- package/dist/ordering.js +0 -154
- package/dist/ordering.js.map +0 -1
- package/dist/pagination.d.ts +0 -218
- package/dist/pagination.d.ts.map +0 -1
- package/dist/pagination.js +0 -281
- package/dist/pagination.js.map +0 -1
- package/dist/repository/in-memory-repository.d.ts +0 -50
- package/dist/repository/in-memory-repository.d.ts.map +0 -1
- package/dist/repository/in-memory-repository.js +0 -93
- package/dist/repository/in-memory-repository.js.map +0 -1
- package/dist/repository/mapper.d.ts +0 -56
- package/dist/repository/mapper.d.ts.map +0 -1
- package/dist/repository/mapper.js +0 -15
- package/dist/repository/mapper.js.map +0 -1
- package/dist/repository/types.d.ts +0 -87
- package/dist/repository/types.d.ts.map +0 -1
- package/dist/repository/types.js +0 -6
- package/dist/repository/types.js.map +0 -1
- package/dist/repository.d.ts +0 -2
- package/dist/repository.d.ts.map +0 -1
- package/dist/repository.js +0 -21
- package/dist/repository.js.map +0 -1
- package/dist/specification.d.ts +0 -102
- package/dist/specification.d.ts.map +0 -1
- package/dist/specification.js +0 -187
- package/dist/specification.js.map +0 -1
- package/dist/types/repository.d.ts +0 -43
- package/dist/types/repository.d.ts.map +0 -1
- package/dist/types/repository.js +0 -2
- package/dist/types/repository.js.map +0 -1
- package/dist/types.d.ts +0 -88
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -12
- package/dist/types.js.map +0 -1
- package/src/repository/in-memory-repository.ts +0 -116
package/src/domain-event-bus.ts
CHANGED
|
@@ -1,166 +1,152 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
private
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
`Error handling event ${event.eventName}:`,
|
|
154
|
-
error
|
|
155
|
-
);
|
|
156
|
-
// Don't throw - we don't want one handler failure to break others
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Convenience function to get the event bus instance
|
|
163
|
-
*/
|
|
164
|
-
export function getEventBus(): DomainEventBus {
|
|
165
|
-
return DomainEventBus.getInstance();
|
|
166
|
-
}
|
|
1
|
+
import { IDomainEvent, DomainEventHandler, IDomainEventHandler } from ".";
|
|
2
|
+
|
|
3
|
+
type EventConstructor<T extends IDomainEvent = IDomainEvent> = new (
|
|
4
|
+
...args: any[]
|
|
5
|
+
) => T;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Domain Event Bus - Singleton pattern for event pub/sub
|
|
9
|
+
*/
|
|
10
|
+
export class DomainEventBus {
|
|
11
|
+
private static instance: DomainEventBus;
|
|
12
|
+
private handlers: Map<
|
|
13
|
+
string,
|
|
14
|
+
Set<DomainEventHandler<any> | IDomainEventHandler<any>>
|
|
15
|
+
> = new Map();
|
|
16
|
+
private wildcardHandlers: Set<
|
|
17
|
+
DomainEventHandler<any> | IDomainEventHandler<any>
|
|
18
|
+
> = new Set();
|
|
19
|
+
|
|
20
|
+
private constructor() {}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Get the singleton instance
|
|
24
|
+
*/
|
|
25
|
+
static getInstance(): DomainEventBus {
|
|
26
|
+
if (!DomainEventBus.instance) {
|
|
27
|
+
DomainEventBus.instance = new DomainEventBus();
|
|
28
|
+
}
|
|
29
|
+
return DomainEventBus.instance;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to a specific event type
|
|
34
|
+
*/
|
|
35
|
+
subscribe<T extends IDomainEvent>(props: {
|
|
36
|
+
event: EventConstructor<T> | string;
|
|
37
|
+
handler: DomainEventHandler<T> | IDomainEventHandler<T>;
|
|
38
|
+
}): void {
|
|
39
|
+
const { event, handler } = props;
|
|
40
|
+
const eventName = typeof event === "string" ? event : event.name;
|
|
41
|
+
|
|
42
|
+
if (!this.handlers.has(eventName)) {
|
|
43
|
+
this.handlers.set(eventName, new Set());
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
this.handlers.get(eventName)!.add(handler);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Subscribe to all events (wildcard)
|
|
51
|
+
*/
|
|
52
|
+
subscribeAll(
|
|
53
|
+
handler:
|
|
54
|
+
| DomainEventHandler<IDomainEvent>
|
|
55
|
+
| IDomainEventHandler<IDomainEvent>
|
|
56
|
+
): void {
|
|
57
|
+
this.wildcardHandlers.add(handler);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Unsubscribe from a specific event type
|
|
62
|
+
*/
|
|
63
|
+
unsubscribe<T extends IDomainEvent>(
|
|
64
|
+
eventType: EventConstructor<T> | string,
|
|
65
|
+
handler: DomainEventHandler<T> | IDomainEventHandler<T>
|
|
66
|
+
): void {
|
|
67
|
+
const eventName =
|
|
68
|
+
typeof eventType === "string" ? eventType : eventType.name;
|
|
69
|
+
const handlers = this.handlers.get(eventName);
|
|
70
|
+
|
|
71
|
+
if (handlers) {
|
|
72
|
+
handlers.delete(handler);
|
|
73
|
+
if (handlers.size === 0) {
|
|
74
|
+
this.handlers.delete(eventName);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Unsubscribe from all events
|
|
81
|
+
*/
|
|
82
|
+
unsubscribeAll(
|
|
83
|
+
handler:
|
|
84
|
+
| DomainEventHandler<IDomainEvent>
|
|
85
|
+
| IDomainEventHandler<IDomainEvent>
|
|
86
|
+
): void {
|
|
87
|
+
this.wildcardHandlers.delete(handler);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Publish a single event
|
|
92
|
+
*/
|
|
93
|
+
async publish<T extends IDomainEvent>(event: T): Promise<void> {
|
|
94
|
+
const eventName = event.eventName;
|
|
95
|
+
const handlers = this.handlers.get(eventName) || new Set();
|
|
96
|
+
|
|
97
|
+
// Execute specific handlers
|
|
98
|
+
const specificPromises = Array.from(handlers).map((handler) =>
|
|
99
|
+
this.executeHandler(handler, event)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// Execute wildcard handlers
|
|
103
|
+
const wildcardPromises = Array.from(this.wildcardHandlers).map((handler) =>
|
|
104
|
+
this.executeHandler(handler, event)
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
await Promise.all([...specificPromises, ...wildcardPromises]);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Publish multiple events
|
|
112
|
+
*/
|
|
113
|
+
async publishAll(events: IDomainEvent[]): Promise<void> {
|
|
114
|
+
await Promise.all(events.map((event) => this.publish(event)));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Clear all handlers (useful for testing)
|
|
119
|
+
*/
|
|
120
|
+
clearAllHandlers(): void {
|
|
121
|
+
this.handlers.clear();
|
|
122
|
+
this.wildcardHandlers.clear();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Get count of handlers for an event type
|
|
127
|
+
*/
|
|
128
|
+
getHandlerCount(eventType: EventConstructor | string): number {
|
|
129
|
+
const eventName =
|
|
130
|
+
typeof eventType === "string" ? eventType : eventType.name;
|
|
131
|
+
return this.handlers.get(eventName)?.size || 0;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Execute a handler (function or class)
|
|
136
|
+
*/
|
|
137
|
+
private async executeHandler(
|
|
138
|
+
handler: DomainEventHandler<any> | IDomainEventHandler<any>,
|
|
139
|
+
event: IDomainEvent
|
|
140
|
+
): Promise<void> {
|
|
141
|
+
try {
|
|
142
|
+
if (typeof handler === "function") {
|
|
143
|
+
await handler(event);
|
|
144
|
+
} else {
|
|
145
|
+
await handler.handle(event);
|
|
146
|
+
}
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.error(`Error handling event ${event.eventName}:`, error);
|
|
149
|
+
// Don't throw - we don't want one handler failure to break others
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
package/src/domain-event.ts
CHANGED
|
@@ -1,90 +1,53 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Domain Events - Event-Driven Architecture Support
|
|
3
|
-
// ============================================================================
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
readonly
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Convert event to JSON
|
|
59
|
-
*/
|
|
60
|
-
toJSON(): Record<string, any> {
|
|
61
|
-
return {
|
|
62
|
-
eventId: this.eventId,
|
|
63
|
-
eventName: this.eventName,
|
|
64
|
-
occurredOn: this.occurredOn.toISOString(),
|
|
65
|
-
aggregateId: this.aggregateId,
|
|
66
|
-
...this.getPayload(),
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Override this to provide event-specific data
|
|
72
|
-
*/
|
|
73
|
-
protected getPayload(): Record<string, any> {
|
|
74
|
-
return {};
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Event handler function type
|
|
80
|
-
*/
|
|
81
|
-
export type DomainEventHandler<T extends IDomainEvent = IDomainEvent> = (
|
|
82
|
-
event: T
|
|
83
|
-
) => void | Promise<void>;
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Event handler class type
|
|
87
|
-
*/
|
|
88
|
-
export interface IDomainEventHandler<T extends IDomainEvent = IDomainEvent> {
|
|
89
|
-
handle(event: T): void | Promise<void>;
|
|
90
|
-
}
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Domain Events - Event-Driven Architecture Support
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
import { IDomainEvent } from ".";
|
|
6
|
+
import { Id } from "./id";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Base class for domain events
|
|
10
|
+
*/
|
|
11
|
+
export abstract class DomainEvent implements IDomainEvent {
|
|
12
|
+
public readonly eventId: string;
|
|
13
|
+
public readonly occurredOn: Date;
|
|
14
|
+
public readonly aggregateId: string;
|
|
15
|
+
|
|
16
|
+
constructor(aggregateId: Id | string) {
|
|
17
|
+
this.eventId = this.generateEventId();
|
|
18
|
+
this.occurredOn = new Date();
|
|
19
|
+
this.aggregateId =
|
|
20
|
+
aggregateId instanceof Id ? aggregateId.value : aggregateId;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get the event name (defaults to class name)
|
|
25
|
+
*/
|
|
26
|
+
get eventName(): string {
|
|
27
|
+
return this.constructor.name;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private generateEventId(): string {
|
|
31
|
+
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Convert event to JSON
|
|
36
|
+
*/
|
|
37
|
+
toJSON(): Record<string, any> {
|
|
38
|
+
return {
|
|
39
|
+
eventId: this.eventId,
|
|
40
|
+
eventName: this.eventName,
|
|
41
|
+
occurredOn: this.occurredOn.toISOString(),
|
|
42
|
+
aggregateId: this.aggregateId,
|
|
43
|
+
...this.getPayload(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Override this to provide event-specific data
|
|
49
|
+
*/
|
|
50
|
+
protected getPayload(): Record<string, any> {
|
|
51
|
+
return {};
|
|
52
|
+
}
|
|
53
|
+
}
|
package/src/entity.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Entity & Aggregate Classes
|
|
3
|
-
// ============================================================================
|
|
4
|
-
|
|
5
|
-
import { BaseEntity } from
|
|
6
|
-
import { BaseProps } from
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Entity - Has identity and lifecycle, but is not an aggregate root
|
|
10
|
-
*/
|
|
11
|
-
export class Entity<T extends BaseProps> extends BaseEntity<T> {}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Aggregate - Aggregate root that manages a consistency boundary
|
|
15
|
-
*/
|
|
16
|
-
export class Aggregate<T extends BaseProps> extends BaseEntity<T> {}
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Entity & Aggregate Classes
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
import { BaseEntity } from "./base-entity";
|
|
6
|
+
import { BaseProps } from "./types";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Entity - Has identity and lifecycle, but is not an aggregate root
|
|
10
|
+
*/
|
|
11
|
+
export class Entity<T extends BaseProps> extends BaseEntity<T> {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Aggregate - Aggregate root that manages a consistency boundary
|
|
15
|
+
*/
|
|
16
|
+
export class Aggregate<T extends BaseProps> extends BaseEntity<T> {}
|