@woltz/rich-domain 1.8.9 → 1.9.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/README.md +7 -6
- package/dist/cjs/constants.d.ts.map +1 -1
- package/dist/cjs/constants.js +1 -0
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/core/base-entity.d.ts +26 -0
- package/dist/cjs/core/base-entity.d.ts.map +1 -1
- package/dist/cjs/core/base-entity.js +128 -35
- package/dist/cjs/core/base-entity.js.map +1 -1
- package/dist/cjs/core/change-tracker.js +1 -1
- package/dist/cjs/core/change-tracker.js.map +1 -1
- package/dist/cjs/core/value-object.d.ts +9 -0
- package/dist/cjs/core/value-object.d.ts.map +1 -1
- package/dist/cjs/core/value-object.js +42 -8
- package/dist/cjs/core/value-object.js.map +1 -1
- package/dist/cjs/criteria.d.ts +1 -1
- package/dist/cjs/t.d.ts +2 -0
- package/dist/cjs/t.d.ts.map +1 -0
- package/dist/cjs/t.js +96 -0
- package/dist/cjs/t.js.map +1 -0
- package/dist/cjs/types/domain.d.ts +9 -0
- package/dist/cjs/types/domain.d.ts.map +1 -1
- package/dist/cjs/validation-error.d.ts +26 -4
- package/dist/cjs/validation-error.d.ts.map +1 -1
- package/dist/cjs/validation-error.js +45 -9
- package/dist/cjs/validation-error.js.map +1 -1
- package/dist/esm/constants.d.ts.map +1 -1
- package/dist/esm/constants.js +1 -0
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/core/base-entity.d.ts +26 -0
- package/dist/esm/core/base-entity.d.ts.map +1 -1
- package/dist/esm/core/base-entity.js +129 -36
- package/dist/esm/core/base-entity.js.map +1 -1
- package/dist/esm/core/change-tracker.js +1 -1
- package/dist/esm/core/change-tracker.js.map +1 -1
- package/dist/esm/core/value-object.d.ts +9 -0
- package/dist/esm/core/value-object.d.ts.map +1 -1
- package/dist/esm/core/value-object.js +43 -9
- package/dist/esm/core/value-object.js.map +1 -1
- package/dist/esm/criteria.d.ts +1 -1
- package/dist/esm/t.d.ts +2 -0
- package/dist/esm/t.d.ts.map +1 -0
- package/dist/esm/t.js +94 -0
- package/dist/esm/t.js.map +1 -0
- package/dist/esm/types/domain.d.ts +9 -0
- package/dist/esm/types/domain.d.ts.map +1 -1
- package/dist/esm/validation-error.d.ts +26 -4
- package/dist/esm/validation-error.d.ts.map +1 -1
- package/dist/esm/validation-error.js +43 -8
- package/dist/esm/validation-error.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/core/base-entity.d.ts +26 -0
- package/dist/types/core/base-entity.d.ts.map +1 -1
- package/dist/types/core/value-object.d.ts +9 -0
- package/dist/types/core/value-object.d.ts.map +1 -1
- package/dist/types/criteria.d.ts +1 -1
- package/dist/types/t.d.ts +2 -0
- package/dist/types/t.d.ts.map +1 -0
- package/dist/types/types/domain.d.ts +9 -0
- package/dist/types/types/domain.d.ts.map +1 -1
- package/dist/types/validation-error.d.ts +26 -4
- package/dist/types/validation-error.d.ts.map +1 -1
- package/package.json +2 -6
|
@@ -10,9 +10,9 @@ function getStaticProperty(instance, propertyName) {
|
|
|
10
10
|
class ValueObject {
|
|
11
11
|
value;
|
|
12
12
|
validationConfig;
|
|
13
|
-
// @ts-expect-error - This is a private property
|
|
14
13
|
domainHooks;
|
|
15
14
|
domainSchema;
|
|
15
|
+
issueCollector = new validation_error_js_1.ValidationIssueCollector();
|
|
16
16
|
static validation;
|
|
17
17
|
static hooks;
|
|
18
18
|
constructor(value) {
|
|
@@ -34,27 +34,61 @@ class ValueObject {
|
|
|
34
34
|
}
|
|
35
35
|
this.value = value;
|
|
36
36
|
if (hooks?.rules) {
|
|
37
|
-
|
|
37
|
+
this.runRulesHook();
|
|
38
38
|
}
|
|
39
39
|
Object.freeze(this);
|
|
40
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Add a validation issue during rules hook execution (non-throwing mode).
|
|
43
|
+
*/
|
|
44
|
+
addValidationIssue(path, message) {
|
|
45
|
+
this.issueCollector.add(path, message);
|
|
46
|
+
}
|
|
47
|
+
beginValidationCycle() {
|
|
48
|
+
this.issueCollector.clear();
|
|
49
|
+
}
|
|
50
|
+
finalizeValidation(collectedIssues = []) {
|
|
51
|
+
const existing = this._validationError;
|
|
52
|
+
const merged = validation_error_js_1.ValidationError.merge(existing, collectedIssues);
|
|
53
|
+
if (!merged) {
|
|
54
|
+
delete this._validationError;
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (this.validationConfig.throwOnError) {
|
|
58
|
+
throw merged;
|
|
59
|
+
}
|
|
60
|
+
this._validationError = merged;
|
|
61
|
+
}
|
|
62
|
+
runRulesHook() {
|
|
63
|
+
if (!this.domainHooks?.rules)
|
|
64
|
+
return;
|
|
65
|
+
this.beginValidationCycle();
|
|
66
|
+
this.domainHooks.rules(this);
|
|
67
|
+
this.finalizeValidation([...this.issueCollector.getIssues()]);
|
|
68
|
+
}
|
|
41
69
|
validateValue(value) {
|
|
42
|
-
|
|
70
|
+
const schemaError = this.validateSchema(value);
|
|
71
|
+
if (!schemaError)
|
|
43
72
|
return;
|
|
73
|
+
if (this.validationConfig.throwOnError) {
|
|
74
|
+
throw schemaError;
|
|
75
|
+
}
|
|
76
|
+
this._validationError = schemaError;
|
|
77
|
+
}
|
|
78
|
+
validateSchema(value) {
|
|
79
|
+
if (!this.domainSchema)
|
|
80
|
+
return null;
|
|
44
81
|
const result = this.domainSchema["~standard"].validate(value);
|
|
45
82
|
if (result instanceof Promise) {
|
|
46
83
|
throw new exceptions_js_1.DomainError("Async validation not supported in constructor. Use sync validation schema.");
|
|
47
84
|
}
|
|
48
85
|
if (result.issues && result.issues.length > 0) {
|
|
49
|
-
|
|
86
|
+
return new validation_error_js_1.ValidationError(result.issues.map((issue) => ({
|
|
50
87
|
path: issue.path?.map((p) => this.extractPathKey(p)) || [],
|
|
51
88
|
message: issue.message,
|
|
52
89
|
})));
|
|
53
|
-
if (this.validationConfig.throwOnError) {
|
|
54
|
-
throw validationError;
|
|
55
|
-
}
|
|
56
|
-
this._validationError = validationError;
|
|
57
90
|
}
|
|
91
|
+
return null;
|
|
58
92
|
}
|
|
59
93
|
extractPathKey(pathSegment) {
|
|
60
94
|
if (pathSegment === null || pathSegment === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-object.js","sourceRoot":"","sources":["../../../src/core/value-object.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"value-object.js","sourceRoot":"","sources":["../../../src/core/value-object.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/criteria.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare class Criteria<T = any> {
|
|
|
37
37
|
toJSON(): {
|
|
38
38
|
filters: {
|
|
39
39
|
field: FieldPath<T>;
|
|
40
|
-
operator: "
|
|
40
|
+
operator: "in" | "notIn" | "isNull" | "isNotNull" | "equals" | "notEquals" | "greaterThan" | "greaterThanOrEqual" | "lessThan" | "lessThanOrEqual" | "between" | "contains" | "startsWith" | "endsWith";
|
|
41
41
|
value: any;
|
|
42
42
|
options: CriteriaOptions | undefined;
|
|
43
43
|
}[];
|
package/dist/cjs/t.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"t.d.ts","sourceRoot":"","sources":["../../src/t.ts"],"names":[],"mappings":""}
|
package/dist/cjs/t.js
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const core_1 = require("./core");
|
|
5
|
+
const AddressSchema = zod_1.z.object({
|
|
6
|
+
id: zod_1.z.instanceof(core_1.Id),
|
|
7
|
+
rua: zod_1.z.string(),
|
|
8
|
+
});
|
|
9
|
+
class Address extends core_1.Entity {
|
|
10
|
+
static validation = {
|
|
11
|
+
schema: AddressSchema,
|
|
12
|
+
};
|
|
13
|
+
changeRua(rua) {
|
|
14
|
+
this.props.rua = rua;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class Role extends core_1.ValueObject {
|
|
18
|
+
}
|
|
19
|
+
const UserSchema = zod_1.z.object({
|
|
20
|
+
id: zod_1.z.instanceof(core_1.Id),
|
|
21
|
+
name: zod_1.z.string().min(3),
|
|
22
|
+
email: zod_1.z.string().email(),
|
|
23
|
+
password: zod_1.z.string(),
|
|
24
|
+
address: zod_1.z.instanceof(Address).optional(),
|
|
25
|
+
role: zod_1.z.instanceof(Role),
|
|
26
|
+
age: zod_1.z.number().int().gte(18),
|
|
27
|
+
});
|
|
28
|
+
function generatePasswordRandom() {
|
|
29
|
+
return Math.random() + "oi";
|
|
30
|
+
}
|
|
31
|
+
class User extends core_1.Aggregate {
|
|
32
|
+
static validation = {
|
|
33
|
+
schema: UserSchema,
|
|
34
|
+
config: {
|
|
35
|
+
throwOnError: false,
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
static hooks = {
|
|
39
|
+
onBeforeCreate: (props) => {
|
|
40
|
+
if (!props.password) {
|
|
41
|
+
props.password = generatePasswordRandom();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
rules: (entity) => {
|
|
45
|
+
if (entity.age > 90) {
|
|
46
|
+
entity.addValidationIssue("age", "Idade nao pode passar de 90 anos.");
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
onCreate: (entity) => {
|
|
50
|
+
if (entity.isNew()) {
|
|
51
|
+
// entity.addDomainEvent(UserCreatedEvent)
|
|
52
|
+
}
|
|
53
|
+
console.log(`Criei um user, é novo?: ${entity.isNew()}`);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
get age() {
|
|
57
|
+
return this.props.age;
|
|
58
|
+
}
|
|
59
|
+
changeAge(newAge) {
|
|
60
|
+
this.props.age = newAge;
|
|
61
|
+
}
|
|
62
|
+
changeName(newName) {
|
|
63
|
+
this.props.name = newName;
|
|
64
|
+
}
|
|
65
|
+
get address() {
|
|
66
|
+
return this.props.address;
|
|
67
|
+
}
|
|
68
|
+
changeRole(role) {
|
|
69
|
+
this.props.role = role;
|
|
70
|
+
}
|
|
71
|
+
removeAddress() {
|
|
72
|
+
if (this.props.address) {
|
|
73
|
+
delete this.props.address;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const id = new core_1.Id().value;
|
|
78
|
+
const tarcisio = new User({
|
|
79
|
+
id: new core_1.Id(id),
|
|
80
|
+
age: 27,
|
|
81
|
+
email: "root@root.com",
|
|
82
|
+
name: "Tarcisio Andrade",
|
|
83
|
+
address: new Address({
|
|
84
|
+
rua: "Segunda Ligação",
|
|
85
|
+
}),
|
|
86
|
+
role: new Role("Admin"),
|
|
87
|
+
});
|
|
88
|
+
tarcisio.changeAge(91);
|
|
89
|
+
tarcisio.changeName("22");
|
|
90
|
+
tarcisio.changeRole(new Role("User"));
|
|
91
|
+
tarcisio.removeAddress();
|
|
92
|
+
if (tarcisio.hasValidationErrors) {
|
|
93
|
+
console.log(tarcisio.validationErrors.getFormattedErrors());
|
|
94
|
+
}
|
|
95
|
+
console.log(tarcisio.toJSON());
|
|
96
|
+
//# sourceMappingURL=t.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"t.js","sourceRoot":"","sources":["../../src/t.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,18 @@ export interface EntityHooks<T extends BaseProps, E> {
|
|
|
20
20
|
rules?: (entity: E) => void;
|
|
21
21
|
}
|
|
22
22
|
export interface ValidationConfig {
|
|
23
|
+
/** When true, validates the entity on creation. Default: true */
|
|
23
24
|
onCreate?: boolean;
|
|
25
|
+
/** When true, validates the entity on update. Default: true */
|
|
24
26
|
onUpdate?: boolean;
|
|
27
|
+
/** When true, throws a ValidationError when validation fails. Default: true */
|
|
25
28
|
throwOnError?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* When `throwOnError` is `false`, controls whether invalid updates are kept on the entity.
|
|
31
|
+
* - `true` (default): apply mutations and refresh `validationErrors` (dirty / form mode).
|
|
32
|
+
* - `false`: block mutations when errors already exist, and revert updates that fail validation.
|
|
33
|
+
*/
|
|
34
|
+
persistInvalidMutations?: boolean;
|
|
26
35
|
}
|
|
27
36
|
export {};
|
|
28
37
|
//# sourceMappingURL=domain.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/types/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAC;CACR;AAED,UAAU,gBAAgB,CAAC,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,EAAE;IAC5B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/types/domain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAC;CACR;AAED,UAAU,gBAAgB,CAAC,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAElD,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,EAAE;IAC5B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC;IACrD,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC"}
|
|
@@ -2,6 +2,20 @@ export interface ValidationIssue {
|
|
|
2
2
|
path: string[];
|
|
3
3
|
message: string;
|
|
4
4
|
}
|
|
5
|
+
export type FormattedValidationError = {
|
|
6
|
+
path: string;
|
|
7
|
+
message: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class ValidationIssueCollector {
|
|
10
|
+
private issues;
|
|
11
|
+
add(path: string | string[], message: string): void;
|
|
12
|
+
getIssues(): readonly ValidationIssue[];
|
|
13
|
+
hasIssues(): boolean;
|
|
14
|
+
clear(): void;
|
|
15
|
+
toValidationError(options?: {
|
|
16
|
+
entityName?: string;
|
|
17
|
+
}): ValidationError | undefined;
|
|
18
|
+
}
|
|
5
19
|
export declare class ValidationError extends Error {
|
|
6
20
|
readonly issues: ValidationIssue[];
|
|
7
21
|
readonly __isValidationError = true;
|
|
@@ -10,7 +24,15 @@ export declare class ValidationError extends Error {
|
|
|
10
24
|
message?: string;
|
|
11
25
|
entityName?: string;
|
|
12
26
|
});
|
|
27
|
+
static fromIssues(issues: ValidationIssue[], options?: {
|
|
28
|
+
message?: string;
|
|
29
|
+
entityName?: string;
|
|
30
|
+
}): ValidationError;
|
|
31
|
+
static merge(existing: ValidationError | undefined, extra: ValidationIssue[], options?: {
|
|
32
|
+
entityName?: string;
|
|
33
|
+
}): ValidationError | undefined;
|
|
13
34
|
private static formatMessage;
|
|
35
|
+
private static normalizePath;
|
|
14
36
|
/**
|
|
15
37
|
* Check if an error is a ValidationError (works across module boundaries)
|
|
16
38
|
*/
|
|
@@ -22,11 +44,11 @@ export declare class ValidationError extends Error {
|
|
|
22
44
|
/**
|
|
23
45
|
* Get errors for a specific field path
|
|
24
46
|
*/
|
|
25
|
-
getErrorsForPath(path: string): ValidationIssue[];
|
|
47
|
+
getErrorsForPath(path: string | string[]): ValidationIssue[];
|
|
26
48
|
/**
|
|
27
49
|
* Check if a specific path has errors
|
|
28
50
|
*/
|
|
29
|
-
hasErrorsForPath(path: string): boolean;
|
|
51
|
+
hasErrorsForPath(path: string | string[]): boolean;
|
|
30
52
|
/**
|
|
31
53
|
* Convert to a plain object for serialization
|
|
32
54
|
*/
|
|
@@ -37,9 +59,9 @@ export declare class ValidationError extends Error {
|
|
|
37
59
|
entityName?: string;
|
|
38
60
|
};
|
|
39
61
|
/**
|
|
40
|
-
* Get
|
|
62
|
+
* Get validation errors formatted for UI/API consumption
|
|
41
63
|
*/
|
|
42
|
-
getFormattedErrors():
|
|
64
|
+
getFormattedErrors(): FormattedValidationError[];
|
|
43
65
|
/**
|
|
44
66
|
* Get a summary of the error for logging
|
|
45
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../src/validation-error.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1C,SAAgB,mBAAmB,QAAQ;IAC3C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAGlC,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAerD,OAAO,CAAC,MAAM,CAAC,aAAa;IA4B5B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe;IAYlE;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,EAAE;
|
|
1
|
+
{"version":3,"file":"validation-error.d.ts","sourceRoot":"","sources":["../../src/validation-error.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAyB;IAEvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAInD,SAAS,IAAI,SAAS,eAAe,EAAE;IAIvC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAIb,iBAAiB,CAAC,OAAO,CAAC,EAAE;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,eAAe,GAAG,SAAS;CAMhC;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,SAAgB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1C,SAAgB,mBAAmB,QAAQ;IAC3C,SAAgB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAGlC,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAerD,MAAM,CAAC,UAAU,CACf,MAAM,EAAE,eAAe,EAAE,EACzB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,eAAe;IAIlB,MAAM,CAAC,KAAK,CACV,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,KAAK,EAAE,eAAe,EAAE,EACxB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,eAAe,GAAG,SAAS;IAW9B,OAAO,CAAC,MAAM,CAAC,aAAa;IA4B5B,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe;IAYlE;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,eAAe,EAAE;IAK5D;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAIlD;;OAEG;IACH,MAAM,IAAI;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IASD;;OAEG;IACH,kBAAkB,IAAI,wBAAwB,EAAE;IAOhD;;OAEG;IACH,UAAU,IAAI,MAAM;CAarB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,eAAe,CAKjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,GACd,KAAK,CAEP"}
|
|
@@ -1,8 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ValidationError = void 0;
|
|
3
|
+
exports.ValidationError = exports.ValidationIssueCollector = void 0;
|
|
4
4
|
exports.createValidationIssue = createValidationIssue;
|
|
5
5
|
exports.throwValidationError = throwValidationError;
|
|
6
|
+
class ValidationIssueCollector {
|
|
7
|
+
issues = [];
|
|
8
|
+
add(path, message) {
|
|
9
|
+
this.issues.push(createValidationIssue(path, message));
|
|
10
|
+
}
|
|
11
|
+
getIssues() {
|
|
12
|
+
return this.issues;
|
|
13
|
+
}
|
|
14
|
+
hasIssues() {
|
|
15
|
+
return this.issues.length > 0;
|
|
16
|
+
}
|
|
17
|
+
clear() {
|
|
18
|
+
this.issues = [];
|
|
19
|
+
}
|
|
20
|
+
toValidationError(options) {
|
|
21
|
+
if (!this.hasIssues()) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return new ValidationError([...this.issues], options);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ValidationIssueCollector = ValidationIssueCollector;
|
|
6
28
|
class ValidationError extends Error {
|
|
7
29
|
issues;
|
|
8
30
|
__isValidationError = true;
|
|
@@ -18,6 +40,18 @@ class ValidationError extends Error {
|
|
|
18
40
|
Error.captureStackTrace(this, ValidationError);
|
|
19
41
|
}
|
|
20
42
|
}
|
|
43
|
+
static fromIssues(issues, options) {
|
|
44
|
+
return new ValidationError(issues, options);
|
|
45
|
+
}
|
|
46
|
+
static merge(existing, extra, options) {
|
|
47
|
+
if (!existing && extra.length === 0) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const allIssues = [...(existing?.issues ?? []), ...extra];
|
|
51
|
+
return new ValidationError(allIssues, {
|
|
52
|
+
entityName: options?.entityName ?? existing?.entityName,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
21
55
|
static formatMessage(issues, entityName) {
|
|
22
56
|
const entityPrefix = entityName ? `[${entityName}] ` : "";
|
|
23
57
|
if (issues.length === 0) {
|
|
@@ -36,6 +70,9 @@ class ValidationError extends Error {
|
|
|
36
70
|
.join("\n");
|
|
37
71
|
return `${entityPrefix}Validation failed with ${issues.length} error(s):\n${errorLines}`;
|
|
38
72
|
}
|
|
73
|
+
static normalizePath(path) {
|
|
74
|
+
return Array.isArray(path) ? path.join(".") : path;
|
|
75
|
+
}
|
|
39
76
|
/**
|
|
40
77
|
* Check if an error is a ValidationError (works across module boundaries)
|
|
41
78
|
*/
|
|
@@ -58,7 +95,8 @@ class ValidationError extends Error {
|
|
|
58
95
|
* Get errors for a specific field path
|
|
59
96
|
*/
|
|
60
97
|
getErrorsForPath(path) {
|
|
61
|
-
|
|
98
|
+
const normalized = ValidationError.normalizePath(path);
|
|
99
|
+
return this.issues.filter((i) => i.path.join(".") === normalized);
|
|
62
100
|
}
|
|
63
101
|
/**
|
|
64
102
|
* Check if a specific path has errors
|
|
@@ -78,15 +116,13 @@ class ValidationError extends Error {
|
|
|
78
116
|
};
|
|
79
117
|
}
|
|
80
118
|
/**
|
|
81
|
-
* Get
|
|
119
|
+
* Get validation errors formatted for UI/API consumption
|
|
82
120
|
*/
|
|
83
121
|
getFormattedErrors() {
|
|
84
|
-
return this.issues
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
})
|
|
89
|
-
.join("\n");
|
|
122
|
+
return this.issues.map((issue) => ({
|
|
123
|
+
path: issue.path.length > 0 ? issue.path.join(".") : "",
|
|
124
|
+
message: issue.message,
|
|
125
|
+
}));
|
|
90
126
|
}
|
|
91
127
|
/**
|
|
92
128
|
* Get a summary of the error for logging
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/validation-error.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"validation-error.js","sourceRoot":"","sources":["../../src/validation-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EACjB,MAAM,GAAG,CAAC;AAEX,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EACjB,MAAM,GAAG,CAAC;AAEX,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,gBAAgB,CAKhE,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,cAAc,EAK3C,CAAC;AACF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EAK/C,CAAC;AACF,eAAO,MAAM,cAAc,EAAE,aAAa,EAYzC,CAAC;AACF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAY7C,CAAC;AACF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAU7C,CAAC;AACF,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAe5C,CAAC"}
|
package/dist/esm/constants.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,yBAAyB,GAA+B;IACnE,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,yBAAyB,GAA+B;IACnE,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,YAAY,EAAE,IAAI;IAClB,uBAAuB,EAAE,IAAI;CAC9B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,WAAW;CACZ,CAAC;AACF,MAAM,CAAC,MAAM,iBAAiB,GAAuB;IACnD,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,WAAW;CACZ,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,QAAQ;IACR,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,UAAU;IACV,iBAAiB;IACjB,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,WAAW;CACZ,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,QAAQ;IACR,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,UAAU;IACV,iBAAiB;IACjB,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,WAAW;CACZ,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,QAAQ;IACR,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,WAAW;CACZ,CAAC;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,QAAQ;IACR,WAAW;IACX,aAAa;IACb,oBAAoB;IACpB,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,OAAO;IACP,SAAS;IACT,QAAQ;IACR,WAAW;CACZ,CAAC"}
|
|
@@ -9,12 +9,38 @@ export declare abstract class BaseEntity<T extends BaseProps, TOptionalInput ext
|
|
|
9
9
|
private validationConfig;
|
|
10
10
|
private entityHooks?;
|
|
11
11
|
private entitySchema?;
|
|
12
|
+
private readonly issueCollector;
|
|
12
13
|
protected static validation?: EntityValidation<any>;
|
|
13
14
|
protected static hooks?: EntityHooks<any, any>;
|
|
14
15
|
constructor(props: Omit<T, TOptionalInput | "id"> & Partial<Pick<T, TOptionalInput>> & {
|
|
15
16
|
id?: Id;
|
|
16
17
|
});
|
|
18
|
+
/**
|
|
19
|
+
* Add a validation issue during rules hook execution (non-throwing mode).
|
|
20
|
+
*/
|
|
21
|
+
addValidationIssue(path: string | string[], message: string): void;
|
|
22
|
+
private beginValidationCycle;
|
|
23
|
+
private finalizeValidation;
|
|
24
|
+
private runRulesHook;
|
|
17
25
|
private validateProps;
|
|
26
|
+
private validateSchema;
|
|
27
|
+
private handleValidationFailure;
|
|
28
|
+
private clearValidationError;
|
|
29
|
+
/**
|
|
30
|
+
* Validates the full current props (schema + rules). Used on updates when
|
|
31
|
+
* throwOnError is false so validationErrors reflects every invalid field.
|
|
32
|
+
*/
|
|
33
|
+
private collectCurrentValidationIssues;
|
|
34
|
+
/**
|
|
35
|
+
* @returns true when the entity has no validation issues after refresh
|
|
36
|
+
*/
|
|
37
|
+
private refreshValidationStateFromCurrentProps;
|
|
38
|
+
/**
|
|
39
|
+
* When true, failed schema/rules updates keep the mutated value and refresh
|
|
40
|
+
* validationErrors (dirty / form mode). Requires throwOnError: false and
|
|
41
|
+
* persistInvalidMutations: true.
|
|
42
|
+
*/
|
|
43
|
+
private shouldPersistInvalidMutation;
|
|
18
44
|
private extractPathKey;
|
|
19
45
|
/**
|
|
20
46
|
* Setup validation that runs on every property change.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"base-entity.d.ts","sourceRoot":"","sources":["../../../src/core/base-entity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGhB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAiB,gBAAgB,EAAE,EAAE,EAAe,MAAM,SAAS,CAAC;AAwC3E,8BAAsB,UAAU,CAC9B,CAAC,SAAS,SAAS,EACnB,cAAc,SAAS,MAAM,CAAC,GAAG,KAAK;IAEtC,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,OAAO,CAAgB;IAC/B,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,QAAQ,CAAC,cAAc,CAAkC;IAEjE,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;gBAG7C,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,GACnC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,EAAE,CAAA;KAAE;IAsDlD;;OAEG;IACI,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzE,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,8BAA8B;IAmBtC;;OAEG;IACH,OAAO,CAAC,sCAAsC;IAY9C;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAOpC,OAAO,CAAC,cAAc;IAgBtB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAwE7B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,cAAc;IAkDtB,IAAI,EAAE,IAAI,EAAE,CAEX;IAEM,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,OAAO;IAoBnD,IAAW,KAAK,IAAI,CAAC,CAEpB;IAED;;OAEG;IACH,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,eAAe,GAAG,SAAS,CAElD;IAED;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,gBAAgB,CAAC,UAAU,CAAC;IAI5E;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;;OAGG;IACH,WAAW,IAAI,IAAI;IAMnB;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAOvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgB3B,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IAI3B,OAAO,CAAC,UAAU;CAiBnB"}
|