@woltz/rich-domain 0.2.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/.github/workflows/ci.yml +40 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.versionrc.json +21 -0
- package/.vscode/settings.json +3 -0
- package/CHANGELOG.md +81 -0
- package/LICENSE +21 -0
- package/README.md +712 -0
- package/commitlint.config.js +23 -0
- package/dist/base-entity.d.ts +67 -0
- package/dist/base-entity.d.ts.map +1 -0
- package/dist/base-entity.js +309 -0
- package/dist/base-entity.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/criteria.d.ts +60 -0
- package/dist/criteria.d.ts.map +1 -0
- package/dist/criteria.js +214 -0
- package/dist/criteria.js.map +1 -0
- package/dist/deep-proxy.d.ts +34 -0
- package/dist/deep-proxy.d.ts.map +1 -0
- package/dist/deep-proxy.js +297 -0
- package/dist/deep-proxy.js.map +1 -0
- package/dist/domain-event-bus.d.ts +57 -0
- package/dist/domain-event-bus.d.ts.map +1 -0
- package/dist/domain-event-bus.js +112 -0
- package/dist/domain-event-bus.js.map +1 -0
- package/dist/domain-event.d.ts +55 -0
- package/dist/domain-event.d.ts.map +1 -0
- package/dist/domain-event.js +42 -0
- package/dist/domain-event.js.map +1 -0
- package/dist/entity.d.ts +13 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/entity.js +15 -0
- package/dist/entity.js.map +1 -0
- package/dist/filtering.d.ts +107 -0
- package/dist/filtering.d.ts.map +1 -0
- package/dist/filtering.js +202 -0
- package/dist/filtering.js.map +1 -0
- package/dist/id.d.ts +51 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +84 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/ordering.d.ts +93 -0
- package/dist/ordering.d.ts.map +1 -0
- package/dist/ordering.js +154 -0
- package/dist/ordering.js.map +1 -0
- package/dist/paginated-result.d.ts +62 -0
- package/dist/paginated-result.d.ts.map +1 -0
- package/dist/paginated-result.js +201 -0
- package/dist/paginated-result.js.map +1 -0
- package/dist/pagination.d.ts +218 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +281 -0
- package/dist/pagination.js.map +1 -0
- package/dist/repository/base-repository.d.ts +77 -0
- package/dist/repository/base-repository.d.ts.map +1 -0
- package/dist/repository/base-repository.js +80 -0
- package/dist/repository/base-repository.js.map +1 -0
- package/dist/repository/in-memory-repository.d.ts +46 -0
- package/dist/repository/in-memory-repository.d.ts.map +1 -0
- package/dist/repository/in-memory-repository.js +85 -0
- package/dist/repository/in-memory-repository.js.map +1 -0
- package/dist/repository/index.d.ts +42 -0
- package/dist/repository/index.d.ts.map +1 -0
- package/dist/repository/index.js +47 -0
- package/dist/repository/index.js.map +1 -0
- package/dist/repository/mapper.d.ts +56 -0
- package/dist/repository/mapper.d.ts.map +1 -0
- package/dist/repository/mapper.js +15 -0
- package/dist/repository/mapper.js.map +1 -0
- package/dist/repository/types.d.ts +87 -0
- package/dist/repository/types.d.ts.map +1 -0
- package/dist/repository/types.js +6 -0
- package/dist/repository/types.js.map +1 -0
- package/dist/repository/unit-of-work.d.ts +70 -0
- package/dist/repository/unit-of-work.d.ts.map +1 -0
- package/dist/repository/unit-of-work.js +122 -0
- package/dist/repository/unit-of-work.js.map +1 -0
- package/dist/repository.d.ts +2 -0
- package/dist/repository.d.ts.map +1 -0
- package/dist/repository.js +21 -0
- package/dist/repository.js.map +1 -0
- package/dist/specification.d.ts +102 -0
- package/dist/specification.d.ts.map +1 -0
- package/dist/specification.js +187 -0
- package/dist/specification.js.map +1 -0
- package/dist/types/criteria.d.ts +35 -0
- package/dist/types/criteria.d.ts.map +1 -0
- package/dist/types/criteria.js +17 -0
- package/dist/types/criteria.js.map +1 -0
- package/dist/types/domain.d.ts +30 -0
- package/dist/types/domain.d.ts.map +1 -0
- package/dist/types/domain.js +2 -0
- package/dist/types/domain.js.map +1 -0
- package/dist/types/history-tracker.d.ts +36 -0
- package/dist/types/history-tracker.d.ts.map +1 -0
- package/dist/types/history-tracker.js +2 -0
- package/dist/types/history-tracker.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/repository.d.ts +43 -0
- package/dist/types/repository.d.ts.map +1 -0
- package/dist/types/repository.js +2 -0
- package/dist/types/repository.js.map +1 -0
- package/dist/types/standard-schema.d.ts +15 -0
- package/dist/types/standard-schema.d.ts.map +1 -0
- package/dist/types/standard-schema.js +2 -0
- package/dist/types/standard-schema.js.map +1 -0
- package/dist/types/unit-of-work.d.ts +39 -0
- package/dist/types/unit-of-work.d.ts.map +1 -0
- package/dist/types/unit-of-work.js +2 -0
- package/dist/types/unit-of-work.js.map +1 -0
- package/dist/types/utils.d.ts +14 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/validation-error.d.ts +42 -0
- package/dist/validation-error.d.ts.map +1 -0
- package/dist/validation-error.js +73 -0
- package/dist/validation-error.js.map +1 -0
- package/dist/value-object.d.ts +47 -0
- package/dist/value-object.d.ts.map +1 -0
- package/dist/value-object.js +136 -0
- package/dist/value-object.js.map +1 -0
- package/eslint.config.js +51 -0
- package/jest.config.js +21 -0
- package/package.json +58 -0
- package/src/base-entity.ts +401 -0
- package/src/constants.ts +7 -0
- package/src/criteria.ts +291 -0
- package/src/deep-proxy.ts +339 -0
- package/src/domain-event-bus.ts +166 -0
- package/src/domain-event.ts +90 -0
- package/src/entity.ts +16 -0
- package/src/id.ts +94 -0
- package/src/index.ts +33 -0
- package/src/paginated-result.ts +274 -0
- package/src/repository/base-repository.ts +152 -0
- package/src/repository/in-memory-repository.ts +104 -0
- package/src/repository/index.ts +55 -0
- package/src/repository/mapper.ts +74 -0
- package/src/repository/unit-of-work.ts +148 -0
- package/src/types/criteria.ts +79 -0
- package/src/types/domain.ts +37 -0
- package/src/types/history-tracker.ts +45 -0
- package/src/types/index.ts +7 -0
- package/src/types/repository.ts +51 -0
- package/src/types/standard-schema.ts +19 -0
- package/src/types/unit-of-work.ts +46 -0
- package/src/types/utils.ts +29 -0
- package/src/validation-error.ts +97 -0
- package/src/value-object.ts +187 -0
- package/tests/criteria.test.ts +432 -0
- package/tests/domain-events.test.ts +445 -0
- package/tests/entity-equality.test.ts +487 -0
- package/tests/entity-validation.test.ts +339 -0
- package/tests/entity.test.ts +33 -0
- package/tests/history-tracker.spec.ts +667 -0
- package/tests/id.test.ts +341 -0
- package/tests/repository.test.ts +641 -0
- package/tests/to-json.test.ts +91 -0
- package/tests/utils.ts +151 -0
- package/tests/value-object-validation.test.ts +228 -0
- package/tests/value-objects.test.ts +52 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
extends: ['@commitlint/config-conventional'],
|
|
3
|
+
rules: {
|
|
4
|
+
'type-enum': [
|
|
5
|
+
2,
|
|
6
|
+
'always',
|
|
7
|
+
[
|
|
8
|
+
'feat',
|
|
9
|
+
'fix',
|
|
10
|
+
'docs',
|
|
11
|
+
'style',
|
|
12
|
+
'refactor',
|
|
13
|
+
'perf',
|
|
14
|
+
'test',
|
|
15
|
+
'chore',
|
|
16
|
+
'revert',
|
|
17
|
+
'ci',
|
|
18
|
+
'build'
|
|
19
|
+
]
|
|
20
|
+
],
|
|
21
|
+
'subject-case': [0]
|
|
22
|
+
}
|
|
23
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Id } from "./id";
|
|
2
|
+
import { ValidationError } from "./validation-error";
|
|
3
|
+
import { IDomainEvent } from "./domain-event";
|
|
4
|
+
import { BaseProps, SubscriptionConfig, HistoryEntry, DeepJsonResult, EntityHooks, EntityValidation } from "./types";
|
|
5
|
+
import { DomainEventBus } from "./domain-event-bus";
|
|
6
|
+
export declare abstract class BaseEntity<T extends BaseProps> {
|
|
7
|
+
private _props;
|
|
8
|
+
private proxy;
|
|
9
|
+
private proxiedProps;
|
|
10
|
+
private snapshot;
|
|
11
|
+
private validationConfig;
|
|
12
|
+
private entityHooks?;
|
|
13
|
+
private entitySchema?;
|
|
14
|
+
private domainEvents;
|
|
15
|
+
protected static validation?: EntityValidation<any>;
|
|
16
|
+
protected static hooks?: EntityHooks<any, any>;
|
|
17
|
+
constructor(props: Omit<T, "id"> & {
|
|
18
|
+
id?: Id;
|
|
19
|
+
});
|
|
20
|
+
private validateProps;
|
|
21
|
+
private extractPathKey;
|
|
22
|
+
private setupUpdateValidation;
|
|
23
|
+
private takeSnapshot;
|
|
24
|
+
private deepCloneProps;
|
|
25
|
+
get id(): Id;
|
|
26
|
+
get isNew(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check equality with another entity by comparing IDs
|
|
29
|
+
* Entities are equal if they have the same ID, regardless of other properties
|
|
30
|
+
*
|
|
31
|
+
* @param other - Another entity or an ID to compare with
|
|
32
|
+
* @returns true if entities have the same ID
|
|
33
|
+
*/
|
|
34
|
+
equals(other: BaseEntity<T> | Id | string): boolean;
|
|
35
|
+
get props(): T;
|
|
36
|
+
/**
|
|
37
|
+
* Check if entity has validation errors (when throwOnError is false)
|
|
38
|
+
*/
|
|
39
|
+
get hasValidationErrors(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Get validation errors (when throwOnError is false)
|
|
42
|
+
*/
|
|
43
|
+
get validationErrors(): ValidationError | undefined;
|
|
44
|
+
subscribe(config: SubscriptionConfig<T>): void;
|
|
45
|
+
getHistory(): HistoryEntry[];
|
|
46
|
+
clearHistory(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Add a domain event to this entity
|
|
49
|
+
*/
|
|
50
|
+
protected addDomainEvent(event: IDomainEvent): void;
|
|
51
|
+
dispatchAll(bus: DomainEventBus): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Get all uncommitted domain events
|
|
54
|
+
*/
|
|
55
|
+
getUncommittedEvents(): IDomainEvent[];
|
|
56
|
+
/**
|
|
57
|
+
* Clear all domain events (call after publishing)
|
|
58
|
+
*/
|
|
59
|
+
clearEvents(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Check if entity has uncommitted events
|
|
62
|
+
*/
|
|
63
|
+
hasUncommittedEvents(): boolean;
|
|
64
|
+
toJson(): DeepJsonResult<T>;
|
|
65
|
+
private deepToJson;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=base-entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAWpD,8BAAsB,UAAU,CAAC,CAAC,SAAS,SAAS;IAClD,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAAC,CAAoB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAG1C,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAEnC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,EAAE,CAAA;KAAE;IAuD9C,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,qBAAqB;IAuE7B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAwDtB,IAAI,EAAE,IAAI,EAAE,CAEX;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,OAAO;IAuBnD,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED;;OAEG;IACH,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,eAAe,GAAG,SAAS,CAElD;IAED,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAS9C,UAAU,IAAI,YAAY,EAAE;IAI5B,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAItC,WAAW,CAAC,GAAG,EAAE,cAAc;IAI5C;;OAEG;IACH,oBAAoB,IAAI,YAAY,EAAE;IAItC;;OAEG;IACH,WAAW,IAAI,IAAI;IAInB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IAI3B,OAAO,CAAC,UAAU;CAenB"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Base Entity Class with Standard Schema Validation
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { Id } from "./id";
|
|
5
|
+
import { DeepProxy } from "./deep-proxy";
|
|
6
|
+
import { ValidationError } from "./validation-error";
|
|
7
|
+
import { DEFAULT_VALIDATION_CONFIG } from "./constants";
|
|
8
|
+
// Helper to get static properties from constructor
|
|
9
|
+
function getStaticProperty(instance, propertyName) {
|
|
10
|
+
return instance.constructor[propertyName];
|
|
11
|
+
}
|
|
12
|
+
export class BaseEntity {
|
|
13
|
+
constructor(props) {
|
|
14
|
+
this.snapshot = null;
|
|
15
|
+
this.domainEvents = [];
|
|
16
|
+
// Get static configuration from subclass
|
|
17
|
+
const validation = getStaticProperty(this, "validation");
|
|
18
|
+
const hooks = getStaticProperty(this, "hooks");
|
|
19
|
+
this.entityHooks = hooks;
|
|
20
|
+
if (validation?.schema) {
|
|
21
|
+
this.entitySchema = validation.schema;
|
|
22
|
+
}
|
|
23
|
+
this.validationConfig = {
|
|
24
|
+
...DEFAULT_VALIDATION_CONFIG,
|
|
25
|
+
...validation?.config,
|
|
26
|
+
};
|
|
27
|
+
// Apply defaultValues
|
|
28
|
+
let finalProps = { ...props };
|
|
29
|
+
// Generate ID if not provided
|
|
30
|
+
if (!finalProps.id) {
|
|
31
|
+
finalProps.id = new Id();
|
|
32
|
+
}
|
|
33
|
+
// Validate schema on creation
|
|
34
|
+
if (this.entitySchema && this.validationConfig.onCreate) {
|
|
35
|
+
this.validateProps(finalProps);
|
|
36
|
+
}
|
|
37
|
+
this._props = finalProps;
|
|
38
|
+
this.proxy = new DeepProxy(this._props);
|
|
39
|
+
this.proxiedProps = this.proxy.createProxy();
|
|
40
|
+
// Execute rules (custom validations)
|
|
41
|
+
if (hooks?.rules) {
|
|
42
|
+
hooks.rules(this);
|
|
43
|
+
}
|
|
44
|
+
// Hook onCreate
|
|
45
|
+
if (hooks?.onCreate) {
|
|
46
|
+
hooks.onCreate(this);
|
|
47
|
+
}
|
|
48
|
+
// Setup update validation
|
|
49
|
+
if (this.entitySchema && this.validationConfig.onUpdate) {
|
|
50
|
+
this.setupUpdateValidation();
|
|
51
|
+
}
|
|
52
|
+
// Take initial snapshot for onBeforeUpdate
|
|
53
|
+
this.takeSnapshot();
|
|
54
|
+
}
|
|
55
|
+
validateProps(props) {
|
|
56
|
+
if (!this.entitySchema)
|
|
57
|
+
return;
|
|
58
|
+
const result = this.entitySchema["~standard"].validate(props);
|
|
59
|
+
if (result instanceof Promise) {
|
|
60
|
+
throw new Error("Async validation not supported in constructor. Use sync validation schema.");
|
|
61
|
+
}
|
|
62
|
+
if (result.issues && result.issues.length > 0) {
|
|
63
|
+
const validationError = new ValidationError(result.issues.map((issue) => ({
|
|
64
|
+
path: issue.path?.map((p) => this.extractPathKey(p)) || [],
|
|
65
|
+
message: issue.message,
|
|
66
|
+
})));
|
|
67
|
+
if (this.validationConfig.throwOnError) {
|
|
68
|
+
throw validationError;
|
|
69
|
+
}
|
|
70
|
+
// If not throwing, store error for later retrieval
|
|
71
|
+
this._validationError = validationError;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
extractPathKey(pathSegment) {
|
|
75
|
+
if (pathSegment === null || pathSegment === undefined) {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
// Handle PropertyKey (string | number | symbol)
|
|
79
|
+
if (typeof pathSegment === "string" || typeof pathSegment === "number") {
|
|
80
|
+
return String(pathSegment);
|
|
81
|
+
}
|
|
82
|
+
if (typeof pathSegment === "symbol") {
|
|
83
|
+
return pathSegment.toString();
|
|
84
|
+
}
|
|
85
|
+
// Handle object with 'key' property (Zod's PathSegment)
|
|
86
|
+
if (typeof pathSegment === "object" && "key" in pathSegment) {
|
|
87
|
+
return String(pathSegment.key);
|
|
88
|
+
}
|
|
89
|
+
// Fallback
|
|
90
|
+
return String(pathSegment);
|
|
91
|
+
}
|
|
92
|
+
setupUpdateValidation() {
|
|
93
|
+
const self = this;
|
|
94
|
+
const validateOnChange = () => {
|
|
95
|
+
// Check onBeforeUpdate hook
|
|
96
|
+
if (self.entityHooks?.onBeforeUpdate && self.snapshot) {
|
|
97
|
+
const shouldContinue = self.entityHooks.onBeforeUpdate(self, self.snapshot);
|
|
98
|
+
if (!shouldContinue) {
|
|
99
|
+
// Revert changes
|
|
100
|
+
Object.assign(self._props, self.snapshot);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Validate with schema
|
|
105
|
+
if (self.entitySchema) {
|
|
106
|
+
const result = self.entitySchema["~standard"].validate(self._props);
|
|
107
|
+
if (result instanceof Promise) {
|
|
108
|
+
console.warn("Async validation on update not supported. Consider using sync validation.");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (result.issues && result.issues.length > 0) {
|
|
112
|
+
const validationError = new ValidationError(result.issues.map((issue) => ({
|
|
113
|
+
path: issue.path?.map((p) => self.extractPathKey(p)) || [],
|
|
114
|
+
message: issue.message,
|
|
115
|
+
})));
|
|
116
|
+
if (self.validationConfig.throwOnError) {
|
|
117
|
+
// Revert changes before throwing
|
|
118
|
+
if (self.snapshot) {
|
|
119
|
+
Object.assign(self._props, self.snapshot);
|
|
120
|
+
}
|
|
121
|
+
throw validationError;
|
|
122
|
+
}
|
|
123
|
+
console.error("Validation failed on update:", validationError);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Execute rules after schema validation
|
|
127
|
+
if (self.entityHooks?.rules) {
|
|
128
|
+
try {
|
|
129
|
+
self.entityHooks.rules(self);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (self.validationConfig.throwOnError) {
|
|
133
|
+
// Revert changes before throwing
|
|
134
|
+
if (self.snapshot) {
|
|
135
|
+
Object.assign(self._props, self.snapshot);
|
|
136
|
+
}
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
console.error("Rules validation failed on update:", error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Update snapshot after successful validation
|
|
143
|
+
self.takeSnapshot();
|
|
144
|
+
};
|
|
145
|
+
// Subscribe to all changes
|
|
146
|
+
this.proxy.subscribe("*", validateOnChange);
|
|
147
|
+
}
|
|
148
|
+
takeSnapshot() {
|
|
149
|
+
this.snapshot = this.deepCloneProps(this._props);
|
|
150
|
+
}
|
|
151
|
+
deepCloneProps(obj, seen = new WeakSet()) {
|
|
152
|
+
if (obj === null || obj === undefined)
|
|
153
|
+
return obj;
|
|
154
|
+
// Primitives
|
|
155
|
+
if (typeof obj !== "object")
|
|
156
|
+
return obj;
|
|
157
|
+
// Special cases - don't clone these, just return the reference
|
|
158
|
+
if (obj instanceof Id)
|
|
159
|
+
return obj;
|
|
160
|
+
if (obj instanceof Date)
|
|
161
|
+
return new Date(obj.getTime());
|
|
162
|
+
// Check for circular references
|
|
163
|
+
if (seen.has(obj)) {
|
|
164
|
+
return obj; // Return reference to avoid infinite loop
|
|
165
|
+
}
|
|
166
|
+
// Handle BaseEntity instances - just keep the reference
|
|
167
|
+
if (obj instanceof BaseEntity) {
|
|
168
|
+
return obj;
|
|
169
|
+
}
|
|
170
|
+
// Handle ValueObject instances - just keep the reference (they're immutable)
|
|
171
|
+
if (obj.constructor &&
|
|
172
|
+
obj.constructor.name !== "Object" &&
|
|
173
|
+
obj.constructor.name !== "Array") {
|
|
174
|
+
// Check if it has toJson method (likely a ValueObject or similar)
|
|
175
|
+
if (typeof obj.toJson === "function" &&
|
|
176
|
+
typeof obj.equals === "function") {
|
|
177
|
+
return obj; // Keep reference for ValueObjects
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
seen.add(obj);
|
|
181
|
+
if (Array.isArray(obj)) {
|
|
182
|
+
return obj.map((item) => this.deepCloneProps(item, seen));
|
|
183
|
+
}
|
|
184
|
+
// Plain objects only
|
|
185
|
+
if (obj.constructor === Object) {
|
|
186
|
+
const cloned = {};
|
|
187
|
+
for (const key in obj) {
|
|
188
|
+
if (obj.hasOwnProperty(key)) {
|
|
189
|
+
cloned[key] = this.deepCloneProps(obj[key], seen);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return cloned;
|
|
193
|
+
}
|
|
194
|
+
// For other object types (custom classes), just keep the reference
|
|
195
|
+
return obj;
|
|
196
|
+
}
|
|
197
|
+
get id() {
|
|
198
|
+
return this._props.id;
|
|
199
|
+
}
|
|
200
|
+
get isNew() {
|
|
201
|
+
return this._props.id.isNew;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Check equality with another entity by comparing IDs
|
|
205
|
+
* Entities are equal if they have the same ID, regardless of other properties
|
|
206
|
+
*
|
|
207
|
+
* @param other - Another entity or an ID to compare with
|
|
208
|
+
* @returns true if entities have the same ID
|
|
209
|
+
*/
|
|
210
|
+
equals(other) {
|
|
211
|
+
if (!other) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
// Compare with another entity
|
|
215
|
+
if (other instanceof BaseEntity) {
|
|
216
|
+
return this.id.equals(other.id);
|
|
217
|
+
}
|
|
218
|
+
// Compare with an ID
|
|
219
|
+
if (other instanceof Id) {
|
|
220
|
+
return this.id.equals(other);
|
|
221
|
+
}
|
|
222
|
+
// Compare with a string ID
|
|
223
|
+
if (typeof other === "string") {
|
|
224
|
+
return this.id.equals(other);
|
|
225
|
+
}
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
get props() {
|
|
229
|
+
return this.proxiedProps;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Check if entity has validation errors (when throwOnError is false)
|
|
233
|
+
*/
|
|
234
|
+
get hasValidationErrors() {
|
|
235
|
+
return !!this._validationError;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get validation errors (when throwOnError is false)
|
|
239
|
+
*/
|
|
240
|
+
get validationErrors() {
|
|
241
|
+
return this._validationError;
|
|
242
|
+
}
|
|
243
|
+
subscribe(config) {
|
|
244
|
+
Object.keys(config).forEach((key) => {
|
|
245
|
+
const sub = config[key];
|
|
246
|
+
if (sub && "onChange" in sub) {
|
|
247
|
+
this.proxy.subscribe(key, sub.onChange);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
getHistory() {
|
|
252
|
+
return this.proxy.getHistory();
|
|
253
|
+
}
|
|
254
|
+
clearHistory() {
|
|
255
|
+
this.proxy.clearHistory();
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Add a domain event to this entity
|
|
259
|
+
*/
|
|
260
|
+
addDomainEvent(event) {
|
|
261
|
+
this.domainEvents.push(event);
|
|
262
|
+
}
|
|
263
|
+
async dispatchAll(bus) {
|
|
264
|
+
await bus.publishAll(this.getUncommittedEvents());
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Get all uncommitted domain events
|
|
268
|
+
*/
|
|
269
|
+
getUncommittedEvents() {
|
|
270
|
+
return [...this.domainEvents];
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Clear all domain events (call after publishing)
|
|
274
|
+
*/
|
|
275
|
+
clearEvents() {
|
|
276
|
+
this.domainEvents = [];
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Check if entity has uncommitted events
|
|
280
|
+
*/
|
|
281
|
+
hasUncommittedEvents() {
|
|
282
|
+
return this.domainEvents.length > 0;
|
|
283
|
+
}
|
|
284
|
+
toJson() {
|
|
285
|
+
return this.deepToJson(this._props);
|
|
286
|
+
}
|
|
287
|
+
deepToJson(obj) {
|
|
288
|
+
if (obj === null || obj === undefined)
|
|
289
|
+
return obj;
|
|
290
|
+
if (obj instanceof Id)
|
|
291
|
+
return obj.value;
|
|
292
|
+
if (Array.isArray(obj))
|
|
293
|
+
return obj.map((item) => this.deepToJson(item));
|
|
294
|
+
if (obj instanceof BaseEntity)
|
|
295
|
+
return obj.toJson();
|
|
296
|
+
if (obj && typeof obj.toJson === "function")
|
|
297
|
+
return obj.toJson();
|
|
298
|
+
if (typeof obj === "object") {
|
|
299
|
+
const result = {};
|
|
300
|
+
for (const key in obj) {
|
|
301
|
+
if (obj.hasOwnProperty(key))
|
|
302
|
+
result[key] = this.deepToJson(obj[key]);
|
|
303
|
+
}
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
return obj;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=base-entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-entity.js","sourceRoot":"","sources":["../src/base-entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,GAAG,CAAC;AAErC,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,gBAAgB,CAIhE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,yBAAyB,GAA+B;IACnE,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;CACnB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { FieldPath, Filter, FilterOperator, FilterValueFor, Order, OrderDirection, Pagination, PathValue, TypedFilter } from "./types";
|
|
2
|
+
export declare class Criteria<T = unknown> {
|
|
3
|
+
private _filters;
|
|
4
|
+
private _orders;
|
|
5
|
+
private _pagination;
|
|
6
|
+
private _search?;
|
|
7
|
+
private constructor();
|
|
8
|
+
/**
|
|
9
|
+
* Create a new Criteria instance
|
|
10
|
+
*/
|
|
11
|
+
static create<T = unknown>(): Criteria<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Add a filter condition
|
|
14
|
+
*/
|
|
15
|
+
where<K extends FieldPath<T>>(field: K, operator: FilterOperator, value?: FilterValueFor<PathValue<T, K>>): this;
|
|
16
|
+
whereEquals<K extends FieldPath<T>>(field: K, value: PathValue<T, K>): this;
|
|
17
|
+
whereContains<K extends FieldPath<T>>(field: K, value: PathValue<T, K>): this;
|
|
18
|
+
whereIn<K extends FieldPath<T>>(field: K, values: PathValue<T, K>[]): this;
|
|
19
|
+
whereBetween<K extends FieldPath<T>>(field: K, min: PathValue<T, K>, max: PathValue<T, K>): this;
|
|
20
|
+
whereNull<K extends FieldPath<T>>(field: K): this;
|
|
21
|
+
whereNotNull<K extends FieldPath<T>>(field: K): this;
|
|
22
|
+
orderBy<K extends FieldPath<T>>(field: K, direction?: OrderDirection): this;
|
|
23
|
+
orderByAsc<K extends FieldPath<T>>(field: K): this;
|
|
24
|
+
orderByDesc<K extends FieldPath<T>>(field: K): this;
|
|
25
|
+
search<K extends FieldPath<T>>(fields: K[], value: string): this;
|
|
26
|
+
hasSearch(): boolean;
|
|
27
|
+
getSearch(): {
|
|
28
|
+
fields: FieldPath<T>[];
|
|
29
|
+
value: string;
|
|
30
|
+
} | undefined;
|
|
31
|
+
paginate(page: number, limit: number): this;
|
|
32
|
+
limit(limit: number): this;
|
|
33
|
+
getFilters(): Filter[];
|
|
34
|
+
getOrders(): Order[];
|
|
35
|
+
getPagination(): Pagination;
|
|
36
|
+
hasFilters(): boolean;
|
|
37
|
+
hasOrders(): boolean;
|
|
38
|
+
hasPagination(): boolean;
|
|
39
|
+
clone(): Criteria<T>;
|
|
40
|
+
toJSON(): {
|
|
41
|
+
filters: Filter<FieldPath<T>, any>[];
|
|
42
|
+
orders: Order[];
|
|
43
|
+
pagination: Pagination;
|
|
44
|
+
search: {
|
|
45
|
+
fields: FieldPath<T>[];
|
|
46
|
+
value: string;
|
|
47
|
+
} | undefined;
|
|
48
|
+
};
|
|
49
|
+
static fromObject<T>(obj: {
|
|
50
|
+
filters?: TypedFilter<T>[];
|
|
51
|
+
orders?: Order[];
|
|
52
|
+
pagination?: Pagination;
|
|
53
|
+
search?: {
|
|
54
|
+
fields: FieldPath<T>[];
|
|
55
|
+
value: string;
|
|
56
|
+
};
|
|
57
|
+
}): Criteria<T>;
|
|
58
|
+
static fromQueryParams<T>(query: Record<string, any>): Criteria<T>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=criteria.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../src/criteria.ts"],"names":[],"mappings":"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"}
|