@schorts/shared-kernel 2.5.6 → 2.5.7
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 +6 -0
- package/dist/cjs/value-objects/array-value.js +2 -2
- package/dist/cjs/value-objects/index.js +3 -1
- package/dist/cjs/value-objects/index.js.map +1 -1
- package/dist/cjs/value-objects/object-value.js +67 -0
- package/dist/cjs/value-objects/object-value.js.map +1 -0
- package/dist/esm/value-objects/array-value.js +2 -2
- package/dist/esm/value-objects/index.js +3 -1
- package/dist/esm/value-objects/index.js.map +1 -1
- package/dist/esm/value-objects/object-value.js +67 -0
- package/dist/esm/value-objects/object-value.js.map +1 -0
- package/dist/types/value-objects/index.d.ts +1 -0
- package/dist/types/value-objects/index.d.ts.map +1 -1
- package/dist/types/value-objects/object-value.d.ts +34 -0
- package/dist/types/value-objects/object-value.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/value-objects/array-value.ts +2 -2
- package/src/value-objects/index.ts +1 -0
- package/src/value-objects/object-value.ts +84 -0
package/CHANGELOG
CHANGED
|
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [2.5.7] - 2025-10-13
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added `ObjectValue`.
|
|
13
|
+
|
|
8
14
|
## [2.5.6] - 2025-10-13
|
|
9
15
|
|
|
10
16
|
### Added
|
|
@@ -56,10 +56,10 @@ class ArrayValue {
|
|
|
56
56
|
if (Array.isArray(obj)) {
|
|
57
57
|
obj.forEach(item => this.deepFreeze(item));
|
|
58
58
|
}
|
|
59
|
-
else if (obj && typeof obj ===
|
|
59
|
+
else if (obj && typeof obj === "object") {
|
|
60
60
|
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
61
61
|
const value = obj[prop];
|
|
62
|
-
if (value && typeof value ===
|
|
62
|
+
if (value && typeof value === "object") {
|
|
63
63
|
this.deepFreeze(value);
|
|
64
64
|
}
|
|
65
65
|
});
|
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.ArrayValue = exports.FloatValue = exports.DateValue = exports.BooleanValue = exports.CoordinatesValue = exports.IntegerValue = exports.SlugValue = exports.PhoneValue = exports.EmailValue = exports.EnumValue = exports.StringValue = exports.UUIDValue = void 0;
|
|
17
|
+
exports.ObjectValue = exports.ArrayValue = exports.FloatValue = exports.DateValue = exports.BooleanValue = exports.CoordinatesValue = exports.IntegerValue = exports.SlugValue = exports.PhoneValue = exports.EmailValue = exports.EnumValue = exports.StringValue = exports.UUIDValue = void 0;
|
|
18
18
|
var uuid_value_1 = require("./uuid-value");
|
|
19
19
|
Object.defineProperty(exports, "UUIDValue", { enumerable: true, get: function () { return uuid_value_1.UUIDValue; } });
|
|
20
20
|
var string_value_1 = require("./string-value");
|
|
@@ -39,5 +39,7 @@ var float_valuet_1 = require("./float-valuet");
|
|
|
39
39
|
Object.defineProperty(exports, "FloatValue", { enumerable: true, get: function () { return float_valuet_1.FloatValue; } });
|
|
40
40
|
var array_value_1 = require("./array-value");
|
|
41
41
|
Object.defineProperty(exports, "ArrayValue", { enumerable: true, get: function () { return array_value_1.ArrayValue; } });
|
|
42
|
+
var object_value_1 = require("./object-value");
|
|
43
|
+
Object.defineProperty(exports, "ObjectValue", { enumerable: true, get: function () { return object_value_1.ObjectValue; } });
|
|
42
44
|
__exportStar(require("./exceptions"), exports);
|
|
43
45
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA4C;AAAnC,0GAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA4C;AAAnC,0GAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectValue = void 0;
|
|
4
|
+
class ObjectValue {
|
|
5
|
+
valueType = "Object";
|
|
6
|
+
value;
|
|
7
|
+
schema;
|
|
8
|
+
constructor(value, schema) {
|
|
9
|
+
this.value = this.deepFreeze(value);
|
|
10
|
+
this.schema = schema;
|
|
11
|
+
}
|
|
12
|
+
get isValid() {
|
|
13
|
+
return this.validateObject(this.value, this.schema);
|
|
14
|
+
}
|
|
15
|
+
equals(valueObject) {
|
|
16
|
+
if (!(valueObject instanceof ObjectValue))
|
|
17
|
+
return false;
|
|
18
|
+
if (!this.isValid || !valueObject.isValid)
|
|
19
|
+
return false;
|
|
20
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
21
|
+
}
|
|
22
|
+
validateObject(obj, schema) {
|
|
23
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
24
|
+
const value = obj[key];
|
|
25
|
+
if (Array.isArray(rulesOrNested)) {
|
|
26
|
+
return rulesOrNested.every(rule => this.validateRule(value, rule));
|
|
27
|
+
}
|
|
28
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
29
|
+
return this.validateObject(value, rulesOrNested);
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
validateRule(value, rule) {
|
|
35
|
+
if ("required" in rule)
|
|
36
|
+
return value !== undefined && value !== null;
|
|
37
|
+
if ("greater_than" in rule)
|
|
38
|
+
return typeof value === "number" && value > rule.greater_than;
|
|
39
|
+
if ("greater_than_or_equal" in rule)
|
|
40
|
+
return typeof value === "number" && value >= rule.greater_than_or_equal;
|
|
41
|
+
if ("less_than" in rule)
|
|
42
|
+
return typeof value === "number" && value < rule.less_than;
|
|
43
|
+
if ("less_than_or_equal" in rule)
|
|
44
|
+
return typeof value === "number" && value <= rule.less_than_or_equal;
|
|
45
|
+
if ("type" in rule)
|
|
46
|
+
return typeof value === rule.type;
|
|
47
|
+
if ("custom" in rule)
|
|
48
|
+
return rule.custom(value);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
deepFreeze(obj) {
|
|
52
|
+
if (Array.isArray(obj)) {
|
|
53
|
+
obj.forEach(item => this.deepFreeze(item));
|
|
54
|
+
}
|
|
55
|
+
else if (obj && typeof obj === "object") {
|
|
56
|
+
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
57
|
+
const value = obj[prop];
|
|
58
|
+
if (value && typeof value === "object") {
|
|
59
|
+
this.deepFreeze(value);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return Object.freeze(obj);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ObjectValue = ObjectValue;
|
|
67
|
+
//# sourceMappingURL=object-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-value.js","sourceRoot":"","sources":["../../../src/value-objects/object-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,10 +56,10 @@ class ArrayValue {
|
|
|
56
56
|
if (Array.isArray(obj)) {
|
|
57
57
|
obj.forEach(item => this.deepFreeze(item));
|
|
58
58
|
}
|
|
59
|
-
else if (obj && typeof obj ===
|
|
59
|
+
else if (obj && typeof obj === "object") {
|
|
60
60
|
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
61
61
|
const value = obj[prop];
|
|
62
|
-
if (value && typeof value ===
|
|
62
|
+
if (value && typeof value === "object") {
|
|
63
63
|
this.deepFreeze(value);
|
|
64
64
|
}
|
|
65
65
|
});
|
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.ArrayValue = exports.FloatValue = exports.DateValue = exports.BooleanValue = exports.CoordinatesValue = exports.IntegerValue = exports.SlugValue = exports.PhoneValue = exports.EmailValue = exports.EnumValue = exports.StringValue = exports.UUIDValue = void 0;
|
|
17
|
+
exports.ObjectValue = exports.ArrayValue = exports.FloatValue = exports.DateValue = exports.BooleanValue = exports.CoordinatesValue = exports.IntegerValue = exports.SlugValue = exports.PhoneValue = exports.EmailValue = exports.EnumValue = exports.StringValue = exports.UUIDValue = void 0;
|
|
18
18
|
var uuid_value_1 = require("./uuid-value");
|
|
19
19
|
Object.defineProperty(exports, "UUIDValue", { enumerable: true, get: function () { return uuid_value_1.UUIDValue; } });
|
|
20
20
|
var string_value_1 = require("./string-value");
|
|
@@ -39,5 +39,7 @@ var float_valuet_1 = require("./float-valuet");
|
|
|
39
39
|
Object.defineProperty(exports, "FloatValue", { enumerable: true, get: function () { return float_valuet_1.FloatValue; } });
|
|
40
40
|
var array_value_1 = require("./array-value");
|
|
41
41
|
Object.defineProperty(exports, "ArrayValue", { enumerable: true, get: function () { return array_value_1.ArrayValue; } });
|
|
42
|
+
var object_value_1 = require("./object-value");
|
|
43
|
+
Object.defineProperty(exports, "ObjectValue", { enumerable: true, get: function () { return object_value_1.ObjectValue; } });
|
|
42
44
|
__exportStar(require("./exceptions"), exports);
|
|
43
45
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA4C;AAAnC,0GAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAEA,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AACzB,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,+CAA4C;AAAnC,0GAAA,UAAU,OAAA;AACnB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AACnB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObjectValue = void 0;
|
|
4
|
+
class ObjectValue {
|
|
5
|
+
valueType = "Object";
|
|
6
|
+
value;
|
|
7
|
+
schema;
|
|
8
|
+
constructor(value, schema) {
|
|
9
|
+
this.value = this.deepFreeze(value);
|
|
10
|
+
this.schema = schema;
|
|
11
|
+
}
|
|
12
|
+
get isValid() {
|
|
13
|
+
return this.validateObject(this.value, this.schema);
|
|
14
|
+
}
|
|
15
|
+
equals(valueObject) {
|
|
16
|
+
if (!(valueObject instanceof ObjectValue))
|
|
17
|
+
return false;
|
|
18
|
+
if (!this.isValid || !valueObject.isValid)
|
|
19
|
+
return false;
|
|
20
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
21
|
+
}
|
|
22
|
+
validateObject(obj, schema) {
|
|
23
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
24
|
+
const value = obj[key];
|
|
25
|
+
if (Array.isArray(rulesOrNested)) {
|
|
26
|
+
return rulesOrNested.every(rule => this.validateRule(value, rule));
|
|
27
|
+
}
|
|
28
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
29
|
+
return this.validateObject(value, rulesOrNested);
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
validateRule(value, rule) {
|
|
35
|
+
if ("required" in rule)
|
|
36
|
+
return value !== undefined && value !== null;
|
|
37
|
+
if ("greater_than" in rule)
|
|
38
|
+
return typeof value === "number" && value > rule.greater_than;
|
|
39
|
+
if ("greater_than_or_equal" in rule)
|
|
40
|
+
return typeof value === "number" && value >= rule.greater_than_or_equal;
|
|
41
|
+
if ("less_than" in rule)
|
|
42
|
+
return typeof value === "number" && value < rule.less_than;
|
|
43
|
+
if ("less_than_or_equal" in rule)
|
|
44
|
+
return typeof value === "number" && value <= rule.less_than_or_equal;
|
|
45
|
+
if ("type" in rule)
|
|
46
|
+
return typeof value === rule.type;
|
|
47
|
+
if ("custom" in rule)
|
|
48
|
+
return rule.custom(value);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
deepFreeze(obj) {
|
|
52
|
+
if (Array.isArray(obj)) {
|
|
53
|
+
obj.forEach(item => this.deepFreeze(item));
|
|
54
|
+
}
|
|
55
|
+
else if (obj && typeof obj === "object") {
|
|
56
|
+
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
57
|
+
const value = obj[prop];
|
|
58
|
+
if (value && typeof value === "object") {
|
|
59
|
+
this.deepFreeze(value);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
return Object.freeze(obj);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.ObjectValue = ObjectValue;
|
|
67
|
+
//# sourceMappingURL=object-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-value.js","sourceRoot":"","sources":["../../../src/value-objects/object-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,5 +11,6 @@ export { BooleanValue } from "./boolean-value";
|
|
|
11
11
|
export { DateValue } from "./date-value";
|
|
12
12
|
export { FloatValue } from "./float-valuet";
|
|
13
13
|
export { ArrayValue } from "./array-value";
|
|
14
|
+
export { ObjectValue } from "./object-value";
|
|
14
15
|
export * from "./exceptions";
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/value-objects/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ValueObject } from "./value-object";
|
|
2
|
+
type Primitive = string | number | boolean | null | undefined;
|
|
3
|
+
export type ValidationRule<Type> = {
|
|
4
|
+
required: true;
|
|
5
|
+
} | {
|
|
6
|
+
greater_than: number;
|
|
7
|
+
} | {
|
|
8
|
+
greater_than_or_equal: number;
|
|
9
|
+
} | {
|
|
10
|
+
less_than: number;
|
|
11
|
+
} | {
|
|
12
|
+
less_than_or_equal: number;
|
|
13
|
+
} | {
|
|
14
|
+
type: "string" | "number" | "boolean";
|
|
15
|
+
} | {
|
|
16
|
+
custom: (value: Type) => boolean;
|
|
17
|
+
};
|
|
18
|
+
export type ObjectSchema<Type> = {
|
|
19
|
+
[Key in keyof Type]?: Type[Key] extends Primitive ? ValidationRule<Type[Key]>[] : ObjectSchema<Type[Key]>;
|
|
20
|
+
};
|
|
21
|
+
export declare abstract class ObjectValue<Type = any> implements ValueObject {
|
|
22
|
+
readonly valueType = "Object";
|
|
23
|
+
readonly value: Type;
|
|
24
|
+
readonly schema: ObjectSchema<Type>;
|
|
25
|
+
abstract readonly attributeName: string;
|
|
26
|
+
constructor(value: Type, schema: ObjectSchema<Type>);
|
|
27
|
+
get isValid(): boolean;
|
|
28
|
+
equals(valueObject: unknown): boolean;
|
|
29
|
+
private validateObject;
|
|
30
|
+
private validateRule;
|
|
31
|
+
private deepFreeze;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=object-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-value.d.ts","sourceRoot":"","sources":["../../../src/value-objects/object-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE9D,MAAM,MAAM,cAAc,CAAC,IAAI,IAC3B;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAClB;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GACxB;IAAE,qBAAqB,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACrB;IAAE,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAA;CAAE,CAAC;AAEzC,MAAM,MAAM,YAAY,CAAC,IAAI,IAAI;KAC9B,GAAG,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,SAAS,GAC7C,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAC3B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;CAC5B,CAAC;AAEF,8BAAsB,WAAW,CAAC,IAAI,GAAG,GAAG,CAAE,YAAW,WAAW;IAClE,QAAQ,CAAC,SAAS,YAAY;IAC9B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAE5B,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC;IAKnD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,MAAM,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO;IAOrC,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,UAAU;CAcnB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schorts/shared-kernel",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.7",
|
|
4
4
|
"description": "A modular, type-safe foundation for building expressive, maintainable applications. This package provides core abstractions for domain modeling, HTTP integration, authentication, state management, and more — designed to be framework-agnostic and highly extensible.",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"module": "./dist/esm/index.js",
|
|
@@ -78,10 +78,10 @@ export abstract class ArrayValue<Type = any> implements ValueObject {
|
|
|
78
78
|
private deepFreeze<Type>(obj: Type): Type {
|
|
79
79
|
if (Array.isArray(obj)) {
|
|
80
80
|
obj.forEach(item => this.deepFreeze(item));
|
|
81
|
-
} else if (obj && typeof obj ===
|
|
81
|
+
} else if (obj && typeof obj === "object") {
|
|
82
82
|
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
83
83
|
const value = (obj as any)[prop];
|
|
84
|
-
if (value && typeof value ===
|
|
84
|
+
if (value && typeof value === "object") {
|
|
85
85
|
this.deepFreeze(value);
|
|
86
86
|
}
|
|
87
87
|
});
|
|
@@ -12,5 +12,6 @@ export { BooleanValue } from "./boolean-value";
|
|
|
12
12
|
export { DateValue } from "./date-value";
|
|
13
13
|
export { FloatValue } from "./float-valuet";
|
|
14
14
|
export { ArrayValue } from "./array-value";
|
|
15
|
+
export { ObjectValue } from "./object-value";
|
|
15
16
|
|
|
16
17
|
export * from "./exceptions";
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ValueObject } from "./value-object";
|
|
2
|
+
|
|
3
|
+
type Primitive = string | number | boolean | null | undefined;
|
|
4
|
+
|
|
5
|
+
export type ValidationRule<Type> =
|
|
6
|
+
| { required: true }
|
|
7
|
+
| { greater_than: number }
|
|
8
|
+
| { greater_than_or_equal: number }
|
|
9
|
+
| { less_than: number }
|
|
10
|
+
| { less_than_or_equal: number }
|
|
11
|
+
| { type: "string" | "number" | "boolean" }
|
|
12
|
+
| { custom: (value: Type) => boolean };
|
|
13
|
+
|
|
14
|
+
export type ObjectSchema<Type> = {
|
|
15
|
+
[Key in keyof Type]?: Type[Key] extends Primitive
|
|
16
|
+
? ValidationRule<Type[Key]>[]
|
|
17
|
+
: ObjectSchema<Type[Key]>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export abstract class ObjectValue<Type = any> implements ValueObject {
|
|
21
|
+
readonly valueType = "Object";
|
|
22
|
+
readonly value: Type;
|
|
23
|
+
readonly schema: ObjectSchema<Type>;
|
|
24
|
+
abstract readonly attributeName: string;
|
|
25
|
+
|
|
26
|
+
constructor(value: Type, schema: ObjectSchema<Type>) {
|
|
27
|
+
this.value = this.deepFreeze(value);
|
|
28
|
+
this.schema = schema;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
get isValid(): boolean {
|
|
32
|
+
return this.validateObject(this.value, this.schema);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
equals(valueObject: unknown): boolean {
|
|
36
|
+
if (!(valueObject instanceof ObjectValue)) return false;
|
|
37
|
+
if (!this.isValid || !valueObject.isValid) return false;
|
|
38
|
+
|
|
39
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private validateObject(obj: any, schema: ObjectSchema<any>): boolean {
|
|
43
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
44
|
+
const value = obj[key];
|
|
45
|
+
|
|
46
|
+
if (Array.isArray(rulesOrNested)) {
|
|
47
|
+
return rulesOrNested.every(rule => this.validateRule(value, rule));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
51
|
+
return this.validateObject(value, rulesOrNested as ObjectSchema<any>);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private validateRule(value: any, rule: ValidationRule<any>): boolean {
|
|
59
|
+
if ("required" in rule) return value !== undefined && value !== null;
|
|
60
|
+
if ("greater_than" in rule) return typeof value === "number" && value > rule.greater_than;
|
|
61
|
+
if ("greater_than_or_equal" in rule) return typeof value === "number" && value >= rule.greater_than_or_equal;
|
|
62
|
+
if ("less_than" in rule) return typeof value === "number" && value < rule.less_than;
|
|
63
|
+
if ("less_than_or_equal" in rule) return typeof value === "number" && value <= rule.less_than_or_equal;
|
|
64
|
+
if ("type" in rule) return typeof value === rule.type;
|
|
65
|
+
if ("custom" in rule) return rule.custom(value);
|
|
66
|
+
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private deepFreeze<T>(obj: T): T {
|
|
71
|
+
if (Array.isArray(obj)) {
|
|
72
|
+
obj.forEach(item => this.deepFreeze(item));
|
|
73
|
+
} else if (obj && typeof obj === "object") {
|
|
74
|
+
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
75
|
+
const value = (obj as any)[prop];
|
|
76
|
+
if (value && typeof value === "object") {
|
|
77
|
+
this.deepFreeze(value);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return Object.freeze(obj);
|
|
83
|
+
}
|
|
84
|
+
}
|