@sinclair/typebox 0.25.2 → 0.25.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/package.json +1 -1
- package/value/cast.js +63 -62
- package/value/create.js +0 -13
package/package.json
CHANGED
package/value/cast.js
CHANGED
|
@@ -32,50 +32,9 @@ const Types = require("../typebox");
|
|
|
32
32
|
const create_1 = require("./create");
|
|
33
33
|
const check_1 = require("./check");
|
|
34
34
|
const clone_1 = require("./clone");
|
|
35
|
-
|
|
36
|
-
(function (UnionValueCast) {
|
|
37
|
-
// ----------------------------------------------------------------------------------------------
|
|
38
|
-
// The following will score a schema against a value. For objects, the score is the tally of
|
|
39
|
-
// points awarded for each property of the value. Property points are (1.0 / propertyCount)
|
|
40
|
-
// to prevent large property counts biasing results. Properties that match literal values are
|
|
41
|
-
// maximally awarded as literals are typically used as union discriminator fields.
|
|
42
|
-
// ----------------------------------------------------------------------------------------------
|
|
43
|
-
function Score(schema, references, value) {
|
|
44
|
-
if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value !== null) {
|
|
45
|
-
const object = schema;
|
|
46
|
-
const keys = Object.keys(value);
|
|
47
|
-
const entries = globalThis.Object.entries(object.properties);
|
|
48
|
-
const [point, max] = [1 / entries.length, entries.length];
|
|
49
|
-
return entries.reduce((acc, [key, schema]) => {
|
|
50
|
-
const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0;
|
|
51
|
-
const checks = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0;
|
|
52
|
-
const exists = keys.includes(key) ? point : 0;
|
|
53
|
-
return acc + (literal + checks + exists);
|
|
54
|
-
}, 0);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return check_1.ValueCheck.Check(schema, references, value) ? 1 : 0;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function Select(union, references, value) {
|
|
61
|
-
let [select, best] = [union.anyOf[0], 0];
|
|
62
|
-
for (const schema of union.anyOf) {
|
|
63
|
-
const score = Score(schema, references, value);
|
|
64
|
-
if (score > best) {
|
|
65
|
-
select = schema;
|
|
66
|
-
best = score;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return select;
|
|
70
|
-
}
|
|
71
|
-
function Create(union, references, value) {
|
|
72
|
-
return check_1.ValueCheck.Check(union, references, value) ? clone_1.ValueClone.Clone(value) : ValueCast.Cast(Select(union, references, value), references, value);
|
|
73
|
-
}
|
|
74
|
-
UnionValueCast.Create = Create;
|
|
75
|
-
})(UnionValueCast || (UnionValueCast = {}));
|
|
76
|
-
// -----------------------------------------------------------
|
|
35
|
+
// ----------------------------------------------------------------------------------------------
|
|
77
36
|
// Errors
|
|
78
|
-
//
|
|
37
|
+
// ----------------------------------------------------------------------------------------------
|
|
79
38
|
class ValueCastReferenceTypeError extends Error {
|
|
80
39
|
constructor(schema) {
|
|
81
40
|
super(`ValueCast: Cannot locate referenced schema with $id '${schema.$ref}'`);
|
|
@@ -112,11 +71,58 @@ class ValueCastUnknownTypeError extends Error {
|
|
|
112
71
|
}
|
|
113
72
|
}
|
|
114
73
|
exports.ValueCastUnknownTypeError = ValueCastUnknownTypeError;
|
|
74
|
+
// ----------------------------------------------------------------------------------------------
|
|
75
|
+
// The following will score a schema against a value. For objects, the score is the tally of
|
|
76
|
+
// points awarded for each property of the value. Property points are (1.0 / propertyCount)
|
|
77
|
+
// to prevent large property counts biasing results. Properties that match literal values are
|
|
78
|
+
// maximally awarded as literals are typically used as union discriminator fields.
|
|
79
|
+
// ----------------------------------------------------------------------------------------------
|
|
80
|
+
var UnionCastCreate;
|
|
81
|
+
(function (UnionCastCreate) {
|
|
82
|
+
function Score(schema, references, value) {
|
|
83
|
+
if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value !== null) {
|
|
84
|
+
const object = schema;
|
|
85
|
+
const keys = Object.keys(value);
|
|
86
|
+
const entries = globalThis.Object.entries(object.properties);
|
|
87
|
+
const [point, max] = [1 / entries.length, entries.length];
|
|
88
|
+
return entries.reduce((acc, [key, schema]) => {
|
|
89
|
+
const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0;
|
|
90
|
+
const checks = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0;
|
|
91
|
+
const exists = keys.includes(key) ? point : 0;
|
|
92
|
+
return acc + (literal + checks + exists);
|
|
93
|
+
}, 0);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return check_1.ValueCheck.Check(schema, references, value) ? 1 : 0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function Select(union, references, value) {
|
|
100
|
+
let [select, best] = [union.anyOf[0], 0];
|
|
101
|
+
for (const schema of union.anyOf) {
|
|
102
|
+
const score = Score(schema, references, value);
|
|
103
|
+
if (score > best) {
|
|
104
|
+
select = schema;
|
|
105
|
+
best = score;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return select;
|
|
109
|
+
}
|
|
110
|
+
function Create(union, references, value) {
|
|
111
|
+
if (union.default !== undefined) {
|
|
112
|
+
return union.default;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const schema = Select(union, references, value);
|
|
116
|
+
return ValueCast.Cast(schema, references, value);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
UnionCastCreate.Create = Create;
|
|
120
|
+
})(UnionCastCreate || (UnionCastCreate = {}));
|
|
115
121
|
var ValueCast;
|
|
116
122
|
(function (ValueCast) {
|
|
117
|
-
//
|
|
123
|
+
// ----------------------------------------------------------------------------------------------
|
|
118
124
|
// Guards
|
|
119
|
-
//
|
|
125
|
+
// ----------------------------------------------------------------------------------------------
|
|
120
126
|
function IsArray(value) {
|
|
121
127
|
return typeof value === 'object' && globalThis.Array.isArray(value);
|
|
122
128
|
}
|
|
@@ -144,9 +150,9 @@ var ValueCast;
|
|
|
144
150
|
function IsValueFalse(value) {
|
|
145
151
|
return value === false || (IsNumber(value) && value === 0) || (IsBigInt(value) && value === 0n) || (IsString(value) && (value.toLowerCase() === 'false' || value === '0'));
|
|
146
152
|
}
|
|
147
|
-
//
|
|
153
|
+
// ----------------------------------------------------------------------------------------------
|
|
148
154
|
// Convert
|
|
149
|
-
//
|
|
155
|
+
// ----------------------------------------------------------------------------------------------
|
|
150
156
|
function TryConvertString(value) {
|
|
151
157
|
return IsValueToString(value) ? value.toString() : value;
|
|
152
158
|
}
|
|
@@ -159,11 +165,11 @@ var ValueCast;
|
|
|
159
165
|
function TryConvertBoolean(value) {
|
|
160
166
|
return IsValueTrue(value) ? true : IsValueFalse(value) ? false : value;
|
|
161
167
|
}
|
|
162
|
-
//
|
|
168
|
+
// ----------------------------------------------------------------------------------------------
|
|
163
169
|
// Cast
|
|
164
|
-
//
|
|
170
|
+
// ----------------------------------------------------------------------------------------------
|
|
165
171
|
function Any(schema, references, value) {
|
|
166
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
172
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
167
173
|
}
|
|
168
174
|
function Array(schema, references, value) {
|
|
169
175
|
if (check_1.ValueCheck.Check(schema, references, value))
|
|
@@ -198,9 +204,6 @@ var ValueCast;
|
|
|
198
204
|
function Date(schema, references, value) {
|
|
199
205
|
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
200
206
|
}
|
|
201
|
-
function Enum(schema, references, value) {
|
|
202
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
203
|
-
}
|
|
204
207
|
function Function(schema, references, value) {
|
|
205
208
|
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
206
209
|
}
|
|
@@ -209,13 +212,13 @@ var ValueCast;
|
|
|
209
212
|
return check_1.ValueCheck.Check(schema, references, conversion) ? conversion : create_1.ValueCreate.Create(schema, references);
|
|
210
213
|
}
|
|
211
214
|
function Literal(schema, references, value) {
|
|
212
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
215
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
213
216
|
}
|
|
214
217
|
function Never(schema, references, value) {
|
|
215
218
|
throw new ValueCastNeverTypeError(schema);
|
|
216
219
|
}
|
|
217
220
|
function Null(schema, references, value) {
|
|
218
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
221
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
219
222
|
}
|
|
220
223
|
function Number(schema, references, value) {
|
|
221
224
|
const conversion = TryConvertNumber(value);
|
|
@@ -289,19 +292,19 @@ var ValueCast;
|
|
|
289
292
|
return schema.items.map((schema, index) => Visit(schema, references, value[index]));
|
|
290
293
|
}
|
|
291
294
|
function Undefined(schema, references, value) {
|
|
292
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
295
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
293
296
|
}
|
|
294
297
|
function Union(schema, references, value) {
|
|
295
|
-
return
|
|
298
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value);
|
|
296
299
|
}
|
|
297
300
|
function Uint8Array(schema, references, value) {
|
|
298
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
301
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
299
302
|
}
|
|
300
303
|
function Unknown(schema, references, value) {
|
|
301
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
304
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
302
305
|
}
|
|
303
306
|
function Void(schema, references, value) {
|
|
304
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
307
|
+
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
305
308
|
}
|
|
306
309
|
function Visit(schema, references, value) {
|
|
307
310
|
const anyReferences = schema.$id === undefined ? references : [schema, ...references];
|
|
@@ -317,8 +320,6 @@ var ValueCast;
|
|
|
317
320
|
return Constructor(anySchema, anyReferences, value);
|
|
318
321
|
case 'Date':
|
|
319
322
|
return Date(anySchema, anyReferences, value);
|
|
320
|
-
case 'Enum':
|
|
321
|
-
return Enum(anySchema, anyReferences, value);
|
|
322
323
|
case 'Function':
|
|
323
324
|
return Function(anySchema, anyReferences, value);
|
|
324
325
|
case 'Integer':
|
package/value/create.js
CHANGED
|
@@ -110,17 +110,6 @@ var ValueCreate;
|
|
|
110
110
|
return new globalThis.Date(0);
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
|
-
function Enum(schema, references) {
|
|
114
|
-
if (schema.default !== undefined) {
|
|
115
|
-
return schema.default;
|
|
116
|
-
}
|
|
117
|
-
else if (schema.anyOf.length === 0) {
|
|
118
|
-
throw new Error('ValueCreate.Enum: Cannot create default enum value as this enum has no items');
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
return schema.anyOf[0].const;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
113
|
function Function(schema, references) {
|
|
125
114
|
if (schema.default !== undefined) {
|
|
126
115
|
return schema.default;
|
|
@@ -318,8 +307,6 @@ var ValueCreate;
|
|
|
318
307
|
return Constructor(anySchema, anyReferences);
|
|
319
308
|
case 'Date':
|
|
320
309
|
return Date(anySchema, anyReferences);
|
|
321
|
-
case 'Enum':
|
|
322
|
-
return Enum(anySchema, anyReferences);
|
|
323
310
|
case 'Function':
|
|
324
311
|
return Function(anySchema, anyReferences);
|
|
325
312
|
case 'Integer':
|