@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
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base exception class for all Rich Domain exceptions
|
|
3
|
+
*/
|
|
4
|
+
declare abstract class DomainException extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly timestamp: Date;
|
|
7
|
+
readonly __isDomainException = true;
|
|
8
|
+
constructor(message: string, code?: string);
|
|
9
|
+
/**
|
|
10
|
+
* Check if an error is a DomainException
|
|
11
|
+
*/
|
|
12
|
+
static isDomainException(error: unknown): error is DomainException;
|
|
13
|
+
/**
|
|
14
|
+
* Convert to JSON for serialization
|
|
15
|
+
*/
|
|
16
|
+
toJSON(): {
|
|
17
|
+
name: string;
|
|
18
|
+
message: string;
|
|
19
|
+
code: string;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Thrown when a domain rule or business logic is violated
|
|
25
|
+
*/
|
|
26
|
+
export declare class DomainError extends DomainException {
|
|
27
|
+
constructor(message: string, code?: string);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when an entity or aggregate is not found
|
|
31
|
+
*/
|
|
32
|
+
export declare class EntityNotFoundError extends DomainException {
|
|
33
|
+
readonly entityType: string;
|
|
34
|
+
readonly entityId?: string;
|
|
35
|
+
constructor(entityType: string, entityId?: string, message?: string);
|
|
36
|
+
toJSON(): {
|
|
37
|
+
entityType: string;
|
|
38
|
+
entityId: string | undefined;
|
|
39
|
+
name: string;
|
|
40
|
+
message: string;
|
|
41
|
+
code: string;
|
|
42
|
+
timestamp: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Thrown when trying to create an entity that already exists
|
|
47
|
+
*/
|
|
48
|
+
export declare class EntityAlreadyExistsError extends DomainException {
|
|
49
|
+
readonly entityType: string;
|
|
50
|
+
readonly entityId?: string;
|
|
51
|
+
constructor(entityType: string, entityId?: string, message?: string);
|
|
52
|
+
toJSON(): {
|
|
53
|
+
entityType: string;
|
|
54
|
+
entityId: string | undefined;
|
|
55
|
+
name: string;
|
|
56
|
+
message: string;
|
|
57
|
+
code: string;
|
|
58
|
+
timestamp: string;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Base exception for repository operations
|
|
63
|
+
*/
|
|
64
|
+
export declare class RepositoryError extends DomainException {
|
|
65
|
+
constructor(message: string, code?: string);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Thrown when a persistence operation fails
|
|
69
|
+
*/
|
|
70
|
+
export declare class PersistenceError extends RepositoryError {
|
|
71
|
+
readonly operation: string;
|
|
72
|
+
readonly cause?: Error;
|
|
73
|
+
constructor(operation: string, message?: string, cause?: Error);
|
|
74
|
+
toJSON(): {
|
|
75
|
+
operation: string;
|
|
76
|
+
cause: string | undefined;
|
|
77
|
+
name: string;
|
|
78
|
+
message: string;
|
|
79
|
+
code: string;
|
|
80
|
+
timestamp: string;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Thrown when a concurrency conflict occurs (optimistic locking)
|
|
85
|
+
*/
|
|
86
|
+
export declare class ConcurrencyError extends RepositoryError {
|
|
87
|
+
readonly entityType: string;
|
|
88
|
+
readonly entityId: string;
|
|
89
|
+
constructor(entityType: string, entityId: string, message?: string);
|
|
90
|
+
toJSON(): {
|
|
91
|
+
entityType: string;
|
|
92
|
+
entityId: string;
|
|
93
|
+
name: string;
|
|
94
|
+
message: string;
|
|
95
|
+
code: string;
|
|
96
|
+
timestamp: string;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Thrown when a database constraint is violated
|
|
101
|
+
*/
|
|
102
|
+
export declare class ConstraintViolationError extends RepositoryError {
|
|
103
|
+
readonly constraint: string;
|
|
104
|
+
constructor(constraint: string, message?: string);
|
|
105
|
+
toJSON(): {
|
|
106
|
+
constraint: string;
|
|
107
|
+
name: string;
|
|
108
|
+
message: string;
|
|
109
|
+
code: string;
|
|
110
|
+
timestamp: string;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Thrown when a value object has invalid data
|
|
115
|
+
*/
|
|
116
|
+
export declare class InvalidValueObjectError extends DomainException {
|
|
117
|
+
readonly valueObjectType: string;
|
|
118
|
+
readonly invalidValue?: any;
|
|
119
|
+
constructor(valueObjectType: string, message: string, invalidValue?: any);
|
|
120
|
+
toJSON(): {
|
|
121
|
+
valueObjectType: string;
|
|
122
|
+
invalidValue: any;
|
|
123
|
+
name: string;
|
|
124
|
+
message: string;
|
|
125
|
+
code: string;
|
|
126
|
+
timestamp: string;
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Thrown when a domain event operation fails
|
|
131
|
+
*/
|
|
132
|
+
export declare class DomainEventError extends DomainException {
|
|
133
|
+
readonly eventType?: string;
|
|
134
|
+
constructor(message: string, eventType?: string);
|
|
135
|
+
toJSON(): {
|
|
136
|
+
eventType: string | undefined;
|
|
137
|
+
name: string;
|
|
138
|
+
message: string;
|
|
139
|
+
code: string;
|
|
140
|
+
timestamp: string;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Thrown when an event handler fails
|
|
145
|
+
*/
|
|
146
|
+
export declare class EventHandlerError extends DomainEventError {
|
|
147
|
+
readonly handlerName: string;
|
|
148
|
+
readonly cause?: Error;
|
|
149
|
+
constructor(handlerName: string, eventType: string, cause?: Error);
|
|
150
|
+
toJSON(): {
|
|
151
|
+
handlerName: string;
|
|
152
|
+
cause: string | undefined;
|
|
153
|
+
eventType: string | undefined;
|
|
154
|
+
name: string;
|
|
155
|
+
message: string;
|
|
156
|
+
code: string;
|
|
157
|
+
timestamp: string;
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Thrown when a criteria or query is invalid
|
|
162
|
+
*/
|
|
163
|
+
export declare class InvalidCriteriaError extends DomainException {
|
|
164
|
+
readonly field?: string;
|
|
165
|
+
constructor(message: string, field?: string);
|
|
166
|
+
toJSON(): {
|
|
167
|
+
field: string | undefined;
|
|
168
|
+
name: string;
|
|
169
|
+
message: string;
|
|
170
|
+
code: string;
|
|
171
|
+
timestamp: string;
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Thrown when a transaction operation fails
|
|
176
|
+
*/
|
|
177
|
+
export declare class TransactionError extends DomainException {
|
|
178
|
+
readonly operation: string;
|
|
179
|
+
readonly cause?: Error;
|
|
180
|
+
constructor(operation: string, message?: string, cause?: Error);
|
|
181
|
+
toJSON(): {
|
|
182
|
+
operation: string;
|
|
183
|
+
cause: string | undefined;
|
|
184
|
+
name: string;
|
|
185
|
+
message: string;
|
|
186
|
+
code: string;
|
|
187
|
+
timestamp: string;
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Thrown when an unexpected or unknown error occurs
|
|
192
|
+
*/
|
|
193
|
+
export declare class UnknownError extends DomainException {
|
|
194
|
+
readonly originalError?: Error;
|
|
195
|
+
constructor(message?: string, originalError?: Error);
|
|
196
|
+
toJSON(): {
|
|
197
|
+
originalError: string | undefined;
|
|
198
|
+
name: string;
|
|
199
|
+
message: string;
|
|
200
|
+
code: string;
|
|
201
|
+
timestamp: string;
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Thrown when a feature is not implemented yet
|
|
206
|
+
*/
|
|
207
|
+
export declare class NotImplementedError extends DomainException {
|
|
208
|
+
readonly feature: string;
|
|
209
|
+
constructor(feature: string, message?: string);
|
|
210
|
+
toJSON(): {
|
|
211
|
+
feature: string;
|
|
212
|
+
name: string;
|
|
213
|
+
message: string;
|
|
214
|
+
code: string;
|
|
215
|
+
timestamp: string;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Thrown when a required configuration is missing
|
|
220
|
+
*/
|
|
221
|
+
export declare class ConfigurationError extends DomainException {
|
|
222
|
+
readonly configKey?: string;
|
|
223
|
+
constructor(message: string, configKey?: string);
|
|
224
|
+
toJSON(): {
|
|
225
|
+
configKey: string | undefined;
|
|
226
|
+
name: string;
|
|
227
|
+
message: string;
|
|
228
|
+
code: string;
|
|
229
|
+
timestamp: string;
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Thrown when mapping between domain and persistence fails
|
|
234
|
+
*/
|
|
235
|
+
export declare class MapperError extends DomainException {
|
|
236
|
+
readonly direction: "toDomain" | "toPersistence";
|
|
237
|
+
readonly entityType: string;
|
|
238
|
+
readonly cause?: Error;
|
|
239
|
+
constructor(direction: "toDomain" | "toPersistence", entityType: string, message?: string, cause?: Error);
|
|
240
|
+
toJSON(): {
|
|
241
|
+
direction: "toDomain" | "toPersistence";
|
|
242
|
+
entityType: string;
|
|
243
|
+
cause: string | undefined;
|
|
244
|
+
name: string;
|
|
245
|
+
message: string;
|
|
246
|
+
code: string;
|
|
247
|
+
timestamp: string;
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
export {};
|
|
251
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../src/exceptions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base exception class for all Rich Domain exceptions
|
|
3
|
+
*/
|
|
4
|
+
class DomainException extends Error {
|
|
5
|
+
constructor(message, code) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.__isDomainException = true;
|
|
8
|
+
this.name = this.constructor.name;
|
|
9
|
+
this.code = code || this.constructor.name;
|
|
10
|
+
this.timestamp = new Date();
|
|
11
|
+
// Maintain proper stack trace
|
|
12
|
+
if (Error.captureStackTrace) {
|
|
13
|
+
Error.captureStackTrace(this, this.constructor);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if an error is a DomainException
|
|
18
|
+
*/
|
|
19
|
+
static isDomainException(error) {
|
|
20
|
+
return (error instanceof DomainException ||
|
|
21
|
+
(error instanceof Error &&
|
|
22
|
+
"__isDomainException" in error &&
|
|
23
|
+
error.__isDomainException === true));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Convert to JSON for serialization
|
|
27
|
+
*/
|
|
28
|
+
toJSON() {
|
|
29
|
+
return {
|
|
30
|
+
name: this.name,
|
|
31
|
+
message: this.message,
|
|
32
|
+
code: this.code,
|
|
33
|
+
timestamp: this.timestamp.toISOString(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Thrown when a domain rule or business logic is violated
|
|
39
|
+
*/
|
|
40
|
+
export class DomainError extends DomainException {
|
|
41
|
+
constructor(message, code) {
|
|
42
|
+
super(message, code || "DOMAIN_ERROR");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Entity & Aggregate Exceptions
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Thrown when an entity or aggregate is not found
|
|
50
|
+
*/
|
|
51
|
+
export class EntityNotFoundError extends DomainException {
|
|
52
|
+
constructor(entityType, entityId, message) {
|
|
53
|
+
const defaultMessage = entityId
|
|
54
|
+
? `${entityType} with id '${entityId}' not found`
|
|
55
|
+
: `${entityType} not found`;
|
|
56
|
+
super(message || defaultMessage, "ENTITY_NOT_FOUND");
|
|
57
|
+
this.entityType = entityType;
|
|
58
|
+
this.entityId = entityId;
|
|
59
|
+
}
|
|
60
|
+
toJSON() {
|
|
61
|
+
return {
|
|
62
|
+
...super.toJSON(),
|
|
63
|
+
entityType: this.entityType,
|
|
64
|
+
entityId: this.entityId,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Thrown when trying to create an entity that already exists
|
|
70
|
+
*/
|
|
71
|
+
export class EntityAlreadyExistsError extends DomainException {
|
|
72
|
+
constructor(entityType, entityId, message) {
|
|
73
|
+
const defaultMessage = entityId
|
|
74
|
+
? `${entityType} with id '${entityId}' already exists`
|
|
75
|
+
: `${entityType} already exists`;
|
|
76
|
+
super(message || defaultMessage, "ENTITY_ALREADY_EXISTS");
|
|
77
|
+
this.entityType = entityType;
|
|
78
|
+
this.entityId = entityId;
|
|
79
|
+
}
|
|
80
|
+
toJSON() {
|
|
81
|
+
return {
|
|
82
|
+
...super.toJSON(),
|
|
83
|
+
entityType: this.entityType,
|
|
84
|
+
entityId: this.entityId,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ============================================================================
|
|
89
|
+
// Repository & Persistence Exceptions
|
|
90
|
+
// ============================================================================
|
|
91
|
+
/**
|
|
92
|
+
* Base exception for repository operations
|
|
93
|
+
*/
|
|
94
|
+
export class RepositoryError extends DomainException {
|
|
95
|
+
constructor(message, code) {
|
|
96
|
+
super(message, code || "REPOSITORY_ERROR");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Thrown when a persistence operation fails
|
|
101
|
+
*/
|
|
102
|
+
export class PersistenceError extends RepositoryError {
|
|
103
|
+
constructor(operation, message, cause) {
|
|
104
|
+
const defaultMessage = `Persistence operation '${operation}' failed${message ? `: ${message}` : ""}`;
|
|
105
|
+
super(defaultMessage, "PERSISTENCE_ERROR");
|
|
106
|
+
this.operation = operation;
|
|
107
|
+
this.cause = cause;
|
|
108
|
+
}
|
|
109
|
+
toJSON() {
|
|
110
|
+
return {
|
|
111
|
+
...super.toJSON(),
|
|
112
|
+
operation: this.operation,
|
|
113
|
+
cause: this.cause?.message,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Thrown when a concurrency conflict occurs (optimistic locking)
|
|
119
|
+
*/
|
|
120
|
+
export class ConcurrencyError extends RepositoryError {
|
|
121
|
+
constructor(entityType, entityId, message) {
|
|
122
|
+
const defaultMessage = message ||
|
|
123
|
+
`Concurrency conflict detected for ${entityType} with id '${entityId}'`;
|
|
124
|
+
super(defaultMessage, "CONCURRENCY_ERROR");
|
|
125
|
+
this.entityType = entityType;
|
|
126
|
+
this.entityId = entityId;
|
|
127
|
+
}
|
|
128
|
+
toJSON() {
|
|
129
|
+
return {
|
|
130
|
+
...super.toJSON(),
|
|
131
|
+
entityType: this.entityType,
|
|
132
|
+
entityId: this.entityId,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Thrown when a database constraint is violated
|
|
138
|
+
*/
|
|
139
|
+
export class ConstraintViolationError extends RepositoryError {
|
|
140
|
+
constructor(constraint, message) {
|
|
141
|
+
const defaultMessage = message || `Database constraint '${constraint}' violated`;
|
|
142
|
+
super(defaultMessage, "CONSTRAINT_VIOLATION");
|
|
143
|
+
this.constraint = constraint;
|
|
144
|
+
}
|
|
145
|
+
toJSON() {
|
|
146
|
+
return {
|
|
147
|
+
...super.toJSON(),
|
|
148
|
+
constraint: this.constraint,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// ============================================================================
|
|
153
|
+
// Value Object Exceptions
|
|
154
|
+
// ============================================================================
|
|
155
|
+
/**
|
|
156
|
+
* Thrown when a value object has invalid data
|
|
157
|
+
*/
|
|
158
|
+
export class InvalidValueObjectError extends DomainException {
|
|
159
|
+
constructor(valueObjectType, message, invalidValue) {
|
|
160
|
+
super(message, "INVALID_VALUE_OBJECT");
|
|
161
|
+
this.valueObjectType = valueObjectType;
|
|
162
|
+
this.invalidValue = invalidValue;
|
|
163
|
+
}
|
|
164
|
+
toJSON() {
|
|
165
|
+
return {
|
|
166
|
+
...super.toJSON(),
|
|
167
|
+
valueObjectType: this.valueObjectType,
|
|
168
|
+
invalidValue: this.invalidValue,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// ============================================================================
|
|
173
|
+
// Domain Event Exceptions
|
|
174
|
+
// ============================================================================
|
|
175
|
+
/**
|
|
176
|
+
* Thrown when a domain event operation fails
|
|
177
|
+
*/
|
|
178
|
+
export class DomainEventError extends DomainException {
|
|
179
|
+
constructor(message, eventType) {
|
|
180
|
+
super(message, "DOMAIN_EVENT_ERROR");
|
|
181
|
+
this.eventType = eventType;
|
|
182
|
+
}
|
|
183
|
+
toJSON() {
|
|
184
|
+
return {
|
|
185
|
+
...super.toJSON(),
|
|
186
|
+
eventType: this.eventType,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Thrown when an event handler fails
|
|
192
|
+
*/
|
|
193
|
+
export class EventHandlerError extends DomainEventError {
|
|
194
|
+
constructor(handlerName, eventType, cause) {
|
|
195
|
+
const message = `Event handler '${handlerName}' failed for event '${eventType}'${cause ? `: ${cause.message}` : ""}`;
|
|
196
|
+
super(message, eventType);
|
|
197
|
+
this.handlerName = handlerName;
|
|
198
|
+
this.cause = cause;
|
|
199
|
+
}
|
|
200
|
+
toJSON() {
|
|
201
|
+
return {
|
|
202
|
+
...super.toJSON(),
|
|
203
|
+
handlerName: this.handlerName,
|
|
204
|
+
cause: this.cause?.message,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Criteria & Query Exceptions
|
|
210
|
+
// ============================================================================
|
|
211
|
+
/**
|
|
212
|
+
* Thrown when a criteria or query is invalid
|
|
213
|
+
*/
|
|
214
|
+
export class InvalidCriteriaError extends DomainException {
|
|
215
|
+
constructor(message, field) {
|
|
216
|
+
super(message, "INVALID_CRITERIA");
|
|
217
|
+
this.field = field;
|
|
218
|
+
}
|
|
219
|
+
toJSON() {
|
|
220
|
+
return {
|
|
221
|
+
...super.toJSON(),
|
|
222
|
+
field: this.field,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// ============================================================================
|
|
227
|
+
// Unit of Work Exceptions
|
|
228
|
+
// ============================================================================
|
|
229
|
+
/**
|
|
230
|
+
* Thrown when a transaction operation fails
|
|
231
|
+
*/
|
|
232
|
+
export class TransactionError extends DomainException {
|
|
233
|
+
constructor(operation, message, cause) {
|
|
234
|
+
const defaultMessage = `Transaction ${operation} failed${message ? `: ${message}` : ""}`;
|
|
235
|
+
super(defaultMessage, "TRANSACTION_ERROR");
|
|
236
|
+
this.operation = operation;
|
|
237
|
+
this.cause = cause;
|
|
238
|
+
}
|
|
239
|
+
toJSON() {
|
|
240
|
+
return {
|
|
241
|
+
...super.toJSON(),
|
|
242
|
+
operation: this.operation,
|
|
243
|
+
cause: this.cause?.message,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ============================================================================
|
|
248
|
+
// Generic/Unknown Exceptions
|
|
249
|
+
// ============================================================================
|
|
250
|
+
/**
|
|
251
|
+
* Thrown when an unexpected or unknown error occurs
|
|
252
|
+
*/
|
|
253
|
+
export class UnknownError extends DomainException {
|
|
254
|
+
constructor(message, originalError) {
|
|
255
|
+
const defaultMessage = message || originalError?.message || "An unknown error occurred";
|
|
256
|
+
super(defaultMessage, "UNKNOWN_ERROR");
|
|
257
|
+
this.originalError = originalError;
|
|
258
|
+
}
|
|
259
|
+
toJSON() {
|
|
260
|
+
return {
|
|
261
|
+
...super.toJSON(),
|
|
262
|
+
originalError: this.originalError?.message,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Thrown when a feature is not implemented yet
|
|
268
|
+
*/
|
|
269
|
+
export class NotImplementedError extends DomainException {
|
|
270
|
+
constructor(feature, message) {
|
|
271
|
+
const defaultMessage = message || `Feature '${feature}' is not implemented`;
|
|
272
|
+
super(defaultMessage, "NOT_IMPLEMENTED");
|
|
273
|
+
this.feature = feature;
|
|
274
|
+
}
|
|
275
|
+
toJSON() {
|
|
276
|
+
return {
|
|
277
|
+
...super.toJSON(),
|
|
278
|
+
feature: this.feature,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Thrown when a required configuration is missing
|
|
284
|
+
*/
|
|
285
|
+
export class ConfigurationError extends DomainException {
|
|
286
|
+
constructor(message, configKey) {
|
|
287
|
+
super(message, "CONFIGURATION_ERROR");
|
|
288
|
+
this.configKey = configKey;
|
|
289
|
+
}
|
|
290
|
+
toJSON() {
|
|
291
|
+
return {
|
|
292
|
+
...super.toJSON(),
|
|
293
|
+
configKey: this.configKey,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// ============================================================================
|
|
298
|
+
// Mapper Exceptions
|
|
299
|
+
// ============================================================================
|
|
300
|
+
/**
|
|
301
|
+
* Thrown when mapping between domain and persistence fails
|
|
302
|
+
*/
|
|
303
|
+
export class MapperError extends DomainException {
|
|
304
|
+
constructor(direction, entityType, message, cause) {
|
|
305
|
+
const defaultMessage = message ||
|
|
306
|
+
`Failed to map ${entityType} ${direction === "toDomain" ? "to domain" : "to persistence"}`;
|
|
307
|
+
super(defaultMessage, "MAPPER_ERROR");
|
|
308
|
+
this.direction = direction;
|
|
309
|
+
this.entityType = entityType;
|
|
310
|
+
this.cause = cause;
|
|
311
|
+
}
|
|
312
|
+
toJSON() {
|
|
313
|
+
return {
|
|
314
|
+
...super.toJSON(),
|
|
315
|
+
direction: this.direction,
|
|
316
|
+
entityType: this.entityType,
|
|
317
|
+
cause: this.cause?.message,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../src/exceptions.ts"],"names":[],"mappings":"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"}
|
package/dist/id.d.ts
CHANGED
|
@@ -8,11 +8,11 @@ export declare class Id {
|
|
|
8
8
|
* @example
|
|
9
9
|
* // New entity (generates UUID)
|
|
10
10
|
* const newId = new Id();
|
|
11
|
-
*
|
|
11
|
+
* newuser.isNew() // true
|
|
12
12
|
*
|
|
13
13
|
* // Existing entity (uses provided ID)
|
|
14
14
|
* const existingId = new Id("550e8400-e29b-41d4-a716-446655440000");
|
|
15
|
-
*
|
|
15
|
+
* existinguser.isNew() // false
|
|
16
16
|
*/
|
|
17
17
|
constructor(value?: string);
|
|
18
18
|
/**
|
|
@@ -22,7 +22,7 @@ export declare class Id {
|
|
|
22
22
|
/**
|
|
23
23
|
* Check if this ID represents a new entity
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
isNew(): boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Convert to string (for JSON serialization and comparisons)
|
|
28
28
|
*/
|
package/dist/id.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAkBA,qBAAa,EAAE;IACb,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IAEjC;;;;;;;;;;;;OAYG;gBACS,KAAK,CAAC,EAAE,MAAM;IAY1B;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACI,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,GAAG,OAAO;IAOnC;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,EAAE;IAInB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE;CAG/B"}
|
package/dist/id.js
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import { randomUUID } from 'crypto';
|
|
2
1
|
// ============================================================================
|
|
3
2
|
// Id Class - Smart Identity Management
|
|
4
3
|
// ============================================================================
|
|
4
|
+
function randomUUID() {
|
|
5
|
+
// If we are in the browser, use the browser's crypto API
|
|
6
|
+
// @ts-expect-error - window.crypto is not defined in the browser
|
|
7
|
+
if (typeof window !== "undefined" && window.crypto) {
|
|
8
|
+
// @ts-expect-error - window.crypto is not defined in the browser
|
|
9
|
+
return window.crypto.randomUUID();
|
|
10
|
+
}
|
|
11
|
+
// If we are in the server, use the crypto library
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
13
|
+
const crypto = require("crypto");
|
|
14
|
+
return crypto.randomUUID();
|
|
15
|
+
}
|
|
5
16
|
export class Id {
|
|
6
17
|
/**
|
|
7
18
|
* Create a new Id
|
|
@@ -10,11 +21,11 @@ export class Id {
|
|
|
10
21
|
* @example
|
|
11
22
|
* // New entity (generates UUID)
|
|
12
23
|
* const newId = new Id();
|
|
13
|
-
*
|
|
24
|
+
* newuser.isNew() // true
|
|
14
25
|
*
|
|
15
26
|
* // Existing entity (uses provided ID)
|
|
16
27
|
* const existingId = new Id("550e8400-e29b-41d4-a716-446655440000");
|
|
17
|
-
*
|
|
28
|
+
* existinguser.isNew() // false
|
|
18
29
|
*/
|
|
19
30
|
constructor(value) {
|
|
20
31
|
if (value !== undefined) {
|
|
@@ -37,7 +48,7 @@ export class Id {
|
|
|
37
48
|
/**
|
|
38
49
|
* Check if this ID represents a new entity
|
|
39
50
|
*/
|
|
40
|
-
|
|
51
|
+
isNew() {
|
|
41
52
|
return this._isNew;
|
|
42
53
|
}
|
|
43
54
|
/**
|
package/dist/id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../src/id.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uCAAuC;AACvC,+EAA+E;AAE/E,SAAS,UAAU;IACjB,yDAAyD;IACzD,iEAAiE;IACjE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnD,iEAAiE;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,CAAC;IACD,kDAAkD;IAClD,iEAAiE;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjC,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,OAAO,EAAE;IAIb;;;;;;;;;;;;OAYG;IACH,YAAY,KAAc;QACxB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,+CAA+C;YAC/C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,0DAA0D;YAC1D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAkB;QACvB,IAAI,KAAK,YAAY,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,gCAAgC;QAChC,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,EAAE,EAAE,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAa;QACvB,OAAO,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF"}
|