@schorts/shared-kernel 2.5.2 → 2.5.3
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/README.md +1 -0
- package/dist/cjs/value-objects/array-value.js +67 -0
- package/dist/cjs/value-objects/array-value.js.map +1 -0
- package/dist/cjs/value-objects/index.js +3 -1
- package/dist/cjs/value-objects/index.js.map +1 -1
- package/dist/esm/value-objects/array-value.js +67 -0
- package/dist/esm/value-objects/array-value.js.map +1 -0
- package/dist/esm/value-objects/index.js +3 -1
- package/dist/esm/value-objects/index.js.map +1 -1
- package/dist/types/value-objects/array-value.d.ts +31 -0
- package/dist/types/value-objects/array-value.d.ts.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/package.json +1 -1
- package/src/value-objects/array-value.ts +88 -0
- package/src/value-objects/index.ts +1 -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.3] - 2025-10-13
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added `ArrayValue` to value-objects.
|
|
13
|
+
|
|
8
14
|
## [2.5.2] - 2025-10-13
|
|
9
15
|
|
|
10
16
|
### Changed
|
package/README.md
CHANGED
|
@@ -87,6 +87,7 @@ Translation keys are centralized in registries for discoverability and tooling,
|
|
|
87
87
|
- **UUIDValue**
|
|
88
88
|
- **BooleanValue**
|
|
89
89
|
- **DateValue**
|
|
90
|
+
- **ArrayValue**
|
|
90
91
|
|
|
91
92
|
Each value object enforces domain constraints and immutability, ensuring correctness at the boundary of your system.
|
|
92
93
|
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ArrayValue = void 0;
|
|
4
|
+
class ArrayValue {
|
|
5
|
+
valueType = "Array";
|
|
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.value.every((item) => {
|
|
14
|
+
return this.isPrimitive
|
|
15
|
+
? this.schema.every(rule => this.validateRule(item, rule))
|
|
16
|
+
: this.validateObject(item, this.schema);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
validateObject(obj, schema) {
|
|
20
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
21
|
+
const value = obj[key];
|
|
22
|
+
if (Array.isArray(rulesOrNested)) {
|
|
23
|
+
return rulesOrNested.every((rule) => this.validateRule(value, rule));
|
|
24
|
+
}
|
|
25
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
26
|
+
return this.validateObject(value, rulesOrNested);
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
validateRule(value, rule) {
|
|
32
|
+
if ("required" in rule)
|
|
33
|
+
return value !== undefined && value !== null;
|
|
34
|
+
if ("greater_than" in rule)
|
|
35
|
+
return typeof value === "number" && value > rule.greater_than;
|
|
36
|
+
if ("less_than" in rule)
|
|
37
|
+
return typeof value === "number" && value < rule.less_than;
|
|
38
|
+
if ("type" in rule)
|
|
39
|
+
return typeof value === rule.type;
|
|
40
|
+
if ("custom" in rule)
|
|
41
|
+
return rule.custom(value);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
equals(valueObject) {
|
|
45
|
+
if (!(valueObject instanceof ArrayValue))
|
|
46
|
+
return false;
|
|
47
|
+
if (!this.isValid || !valueObject.isValid)
|
|
48
|
+
return false;
|
|
49
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
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.ArrayValue = ArrayValue;
|
|
67
|
+
//# sourceMappingURL=array-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-value.js","sourceRoot":"","sources":["../../../src/value-objects/array-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.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.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");
|
|
@@ -37,5 +37,7 @@ var date_value_1 = require("./date-value");
|
|
|
37
37
|
Object.defineProperty(exports, "DateValue", { enumerable: true, get: function () { return date_value_1.DateValue; } });
|
|
38
38
|
var float_valuet_1 = require("./float-valuet");
|
|
39
39
|
Object.defineProperty(exports, "FloatValue", { enumerable: true, get: function () { return float_valuet_1.FloatValue; } });
|
|
40
|
+
var array_value_1 = require("./array-value");
|
|
41
|
+
Object.defineProperty(exports, "ArrayValue", { enumerable: true, get: function () { return array_value_1.ArrayValue; } });
|
|
40
42
|
__exportStar(require("./exceptions"), exports);
|
|
41
43
|
//# 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;AAEnB,+CAA6B"}
|
|
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;AAEnB,+CAA6B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ArrayValue = void 0;
|
|
4
|
+
class ArrayValue {
|
|
5
|
+
valueType = "Array";
|
|
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.value.every((item) => {
|
|
14
|
+
return this.isPrimitive
|
|
15
|
+
? this.schema.every(rule => this.validateRule(item, rule))
|
|
16
|
+
: this.validateObject(item, this.schema);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
validateObject(obj, schema) {
|
|
20
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
21
|
+
const value = obj[key];
|
|
22
|
+
if (Array.isArray(rulesOrNested)) {
|
|
23
|
+
return rulesOrNested.every((rule) => this.validateRule(value, rule));
|
|
24
|
+
}
|
|
25
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
26
|
+
return this.validateObject(value, rulesOrNested);
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
validateRule(value, rule) {
|
|
32
|
+
if ("required" in rule)
|
|
33
|
+
return value !== undefined && value !== null;
|
|
34
|
+
if ("greater_than" in rule)
|
|
35
|
+
return typeof value === "number" && value > rule.greater_than;
|
|
36
|
+
if ("less_than" in rule)
|
|
37
|
+
return typeof value === "number" && value < rule.less_than;
|
|
38
|
+
if ("type" in rule)
|
|
39
|
+
return typeof value === rule.type;
|
|
40
|
+
if ("custom" in rule)
|
|
41
|
+
return rule.custom(value);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
equals(valueObject) {
|
|
45
|
+
if (!(valueObject instanceof ArrayValue))
|
|
46
|
+
return false;
|
|
47
|
+
if (!this.isValid || !valueObject.isValid)
|
|
48
|
+
return false;
|
|
49
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
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.ArrayValue = ArrayValue;
|
|
67
|
+
//# sourceMappingURL=array-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-value.js","sourceRoot":"","sources":["../../../src/value-objects/array-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.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.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");
|
|
@@ -37,5 +37,7 @@ var date_value_1 = require("./date-value");
|
|
|
37
37
|
Object.defineProperty(exports, "DateValue", { enumerable: true, get: function () { return date_value_1.DateValue; } });
|
|
38
38
|
var float_valuet_1 = require("./float-valuet");
|
|
39
39
|
Object.defineProperty(exports, "FloatValue", { enumerable: true, get: function () { return float_valuet_1.FloatValue; } });
|
|
40
|
+
var array_value_1 = require("./array-value");
|
|
41
|
+
Object.defineProperty(exports, "ArrayValue", { enumerable: true, get: function () { return array_value_1.ArrayValue; } });
|
|
40
42
|
__exportStar(require("./exceptions"), exports);
|
|
41
43
|
//# 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;AAEnB,+CAA6B"}
|
|
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;AAEnB,+CAA6B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ValueObject } from "./value-object";
|
|
2
|
+
type Primitive = string | number | boolean | null | undefined;
|
|
3
|
+
type ValidationRule<Type> = {
|
|
4
|
+
required: true;
|
|
5
|
+
} | {
|
|
6
|
+
greater_than: number;
|
|
7
|
+
} | {
|
|
8
|
+
less_than: number;
|
|
9
|
+
} | {
|
|
10
|
+
type: "string" | "number" | "boolean";
|
|
11
|
+
} | {
|
|
12
|
+
custom: (value: Type) => boolean;
|
|
13
|
+
};
|
|
14
|
+
type ObjectSchema<Type> = {
|
|
15
|
+
[Key in keyof Type]?: Type[Key] extends Primitive ? ValidationRule<Type[Key]>[] : ObjectSchema<Type[Key]>;
|
|
16
|
+
};
|
|
17
|
+
export declare abstract class ArrayValue<Type = any> implements ValueObject {
|
|
18
|
+
readonly valueType = "Array";
|
|
19
|
+
readonly value: Type[];
|
|
20
|
+
readonly schema: ObjectSchema<Type> | ValidationRule<Type>[];
|
|
21
|
+
abstract readonly attributeName: string;
|
|
22
|
+
abstract readonly isPrimitive: boolean;
|
|
23
|
+
constructor(value: Type[], schema: ObjectSchema<Type> | ValidationRule<Type>[]);
|
|
24
|
+
get isValid(): boolean;
|
|
25
|
+
private validateObject;
|
|
26
|
+
private validateRule;
|
|
27
|
+
equals(valueObject: unknown): boolean;
|
|
28
|
+
private deepFreeze;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=array-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-value.d.ts","sourceRoot":"","sources":["../../../src/value-objects/array-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,KAAK,cAAc,CAAC,IAAI,IACpB;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAClB;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,GACxB;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAA;CAAE,CAAC;AAEzC,KAAK,YAAY,CAAC,IAAI,IAAI;KACvB,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,UAAU,CAAC,IAAI,GAAG,GAAG,CAAE,YAAW,WAAW;IACjE,QAAQ,CAAC,SAAS,WAAW;IAC7B,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7D,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;gBAGrC,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE;IAMrD,IAAI,OAAO,IAAI,OAAO,CAMrB;IAED,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,YAAY;IAUpB,MAAM,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO;IAOrC,OAAO,CAAC,UAAU;CAcnB"}
|
|
@@ -10,5 +10,6 @@ export { CoordinatesValue } from "./coordinates-value";
|
|
|
10
10
|
export { BooleanValue } from "./boolean-value";
|
|
11
11
|
export { DateValue } from "./date-value";
|
|
12
12
|
export { FloatValue } from "./float-valuet";
|
|
13
|
+
export { ArrayValue } from "./array-value";
|
|
13
14
|
export * from "./exceptions";
|
|
14
15
|
//# 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;
|
|
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;AAE3C,cAAc,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schorts/shared-kernel",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.3",
|
|
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",
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ValueObject } from "./value-object";
|
|
2
|
+
|
|
3
|
+
type Primitive = string | number | boolean | null | undefined;
|
|
4
|
+
|
|
5
|
+
type ValidationRule<Type> =
|
|
6
|
+
| { required: true }
|
|
7
|
+
| { greater_than: number }
|
|
8
|
+
| { less_than: number }
|
|
9
|
+
| { type: "string" | "number" | "boolean" }
|
|
10
|
+
| { custom: (value: Type) => boolean };
|
|
11
|
+
|
|
12
|
+
type ObjectSchema<Type> = {
|
|
13
|
+
[Key in keyof Type]?: Type[Key] extends Primitive
|
|
14
|
+
? ValidationRule<Type[Key]>[]
|
|
15
|
+
: ObjectSchema<Type[Key]>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export abstract class ArrayValue<Type = any> implements ValueObject {
|
|
19
|
+
readonly valueType = "Array";
|
|
20
|
+
readonly value: Type[];
|
|
21
|
+
readonly schema: ObjectSchema<Type> | ValidationRule<Type>[];
|
|
22
|
+
abstract readonly attributeName: string;
|
|
23
|
+
abstract readonly isPrimitive: boolean;
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
value: Type[],
|
|
27
|
+
schema: ObjectSchema<Type> | ValidationRule<Type>[],
|
|
28
|
+
) {
|
|
29
|
+
this.value = this.deepFreeze(value);
|
|
30
|
+
this.schema = schema;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get isValid(): boolean {
|
|
34
|
+
return this.value.every((item) => {
|
|
35
|
+
return this.isPrimitive
|
|
36
|
+
? (this.schema as ValidationRule<Type>[]).every(rule => this.validateRule(item, rule))
|
|
37
|
+
: this.validateObject(item, this.schema as ObjectSchema<Type>);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private validateObject(obj: any, schema: ObjectSchema<any>): boolean {
|
|
42
|
+
return Object.entries(schema).every(([key, rulesOrNested]) => {
|
|
43
|
+
const value = obj[key];
|
|
44
|
+
|
|
45
|
+
if (Array.isArray(rulesOrNested)) {
|
|
46
|
+
return rulesOrNested.every((rule) => this.validateRule(value, rule));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (typeof rulesOrNested === "object" && value !== null && typeof value === "object") {
|
|
50
|
+
return this.validateObject(value, rulesOrNested as ObjectSchema<any>);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return true;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private validateRule(value: any, rule: ValidationRule<any>): boolean {
|
|
58
|
+
if ("required" in rule) return value !== undefined && value !== null;
|
|
59
|
+
if ("greater_than" in rule) return typeof value === "number" && value > rule.greater_than;
|
|
60
|
+
if ("less_than" in rule) return typeof value === "number" && value < rule.less_than;
|
|
61
|
+
if ("type" in rule) return typeof value === rule.type;
|
|
62
|
+
if ("custom" in rule) return rule.custom(value);
|
|
63
|
+
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
equals(valueObject: unknown): boolean {
|
|
68
|
+
if (!(valueObject instanceof ArrayValue)) return false;
|
|
69
|
+
if (!this.isValid || !valueObject.isValid) return false;
|
|
70
|
+
|
|
71
|
+
return JSON.stringify(this.value) === JSON.stringify(valueObject.value);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private deepFreeze<Type>(obj: Type): Type {
|
|
75
|
+
if (Array.isArray(obj)) {
|
|
76
|
+
obj.forEach(item => this.deepFreeze(item));
|
|
77
|
+
} else if (obj && typeof obj === 'object') {
|
|
78
|
+
Object.getOwnPropertyNames(obj).forEach(prop => {
|
|
79
|
+
const value = (obj as any)[prop];
|
|
80
|
+
if (value && typeof value === 'object') {
|
|
81
|
+
this.deepFreeze(value);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return Object.freeze(obj);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -11,5 +11,6 @@ export { CoordinatesValue } from "./coordinates-value";
|
|
|
11
11
|
export { BooleanValue } from "./boolean-value";
|
|
12
12
|
export { DateValue } from "./date-value";
|
|
13
13
|
export { FloatValue } from "./float-valuet";
|
|
14
|
+
export { ArrayValue } from "./array-value";
|
|
14
15
|
|
|
15
16
|
export * from "./exceptions";
|