@sinclair/typebox 0.29.6 → 0.30.0-dev-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/compiler/compiler.d.ts +7 -4
- package/compiler/compiler.js +208 -194
- package/errors/errors.d.ts +65 -60
- package/errors/errors.js +515 -492
- package/package.json +14 -2
- package/readme.md +161 -169
- package/system/system.js +0 -6
- package/typebox.d.ts +99 -52
- package/typebox.js +496 -573
- package/value/cast.d.ts +5 -4
- package/value/cast.js +255 -260
- package/value/check.d.ts +4 -3
- package/value/check.js +412 -397
- package/value/clone.d.ts +2 -3
- package/value/clone.js +62 -42
- package/value/convert.d.ts +5 -4
- package/value/convert.js +305 -318
- package/value/create.d.ts +6 -6
- package/value/create.js +388 -376
- package/value/delta.d.ts +2 -4
- package/value/delta.js +121 -130
- package/value/equal.d.ts +2 -3
- package/value/equal.js +48 -51
- package/value/guard.d.ts +44 -0
- package/value/guard.js +146 -0
- package/value/hash.d.ts +14 -3
- package/value/hash.js +124 -166
- package/value/index.d.ts +3 -4
- package/value/index.js +6 -20
- package/value/mutate.d.ts +2 -4
- package/value/mutate.js +75 -67
- package/value/pointer.js +8 -2
- package/value/value.d.ts +15 -15
- package/value/value.js +27 -27
- package/value/is.d.ts +0 -11
- package/value/is.js +0 -53
package/value/cast.d.ts
CHANGED
|
@@ -24,7 +24,8 @@ export declare class ValueCastDereferenceError extends Error {
|
|
|
24
24
|
readonly schema: Types.TRef | Types.TThis;
|
|
25
25
|
constructor(schema: Types.TRef | Types.TThis);
|
|
26
26
|
}
|
|
27
|
-
export declare
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
export declare function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): any;
|
|
28
|
+
/** Casts a value into a given type. The return value will retain as much information of the original value as possible. */
|
|
29
|
+
export declare function Cast<T extends Types.TSchema>(schema: T, references: Types.TSchema[], value: unknown): Types.Static<T>;
|
|
30
|
+
/** Casts a value into a given type. The return value will retain as much information of the original value as possible. */
|
|
31
|
+
export declare function Cast<T extends Types.TSchema>(schema: T, value: unknown): Types.Static<T>;
|
package/value/cast.js
CHANGED
|
@@ -27,14 +27,15 @@ THE SOFTWARE.
|
|
|
27
27
|
|
|
28
28
|
---------------------------------------------------------------------------*/
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.
|
|
30
|
+
exports.Cast = exports.Visit = exports.ValueCastDereferenceError = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0;
|
|
31
31
|
const Types = require("../typebox");
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
32
|
+
const ValueCreate = require("./create");
|
|
33
|
+
const ValueCheck = require("./check");
|
|
34
|
+
const ValueClone = require("./clone");
|
|
35
|
+
const ValueGuard = require("./guard");
|
|
36
|
+
// --------------------------------------------------------------------------
|
|
36
37
|
// Errors
|
|
37
|
-
//
|
|
38
|
+
// --------------------------------------------------------------------------
|
|
38
39
|
class ValueCastReferenceTypeError extends Error {
|
|
39
40
|
constructor(schema) {
|
|
40
41
|
super(`ValueCast: Cannot locate referenced schema with $id '${schema.$ref}'`);
|
|
@@ -78,29 +79,30 @@ class ValueCastDereferenceError extends Error {
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
exports.ValueCastDereferenceError = ValueCastDereferenceError;
|
|
81
|
-
//
|
|
82
|
-
// The following will score a schema against a value. For objects, the score
|
|
83
|
-
// points awarded for each property of the value. Property
|
|
84
|
-
// to prevent large property counts biasing
|
|
85
|
-
//
|
|
86
|
-
//
|
|
82
|
+
// --------------------------------------------------------------------------
|
|
83
|
+
// The following will score a schema against a value. For objects, the score
|
|
84
|
+
// is the tally of points awarded for each property of the value. Property
|
|
85
|
+
// points are (1.0 / propertyCount) to prevent large property counts biasing
|
|
86
|
+
// results. Properties that match literal values are maximally awarded as
|
|
87
|
+
// literals are typically used as union discriminator fields.
|
|
88
|
+
// --------------------------------------------------------------------------
|
|
87
89
|
var UnionCastCreate;
|
|
88
90
|
(function (UnionCastCreate) {
|
|
89
91
|
function Score(schema, references, value) {
|
|
90
|
-
if (schema[Types.Kind] === 'Object' && typeof value === 'object' && value
|
|
92
|
+
if (schema[Types.Kind] === 'Object' && typeof value === 'object' && !ValueGuard.IsNull(value)) {
|
|
91
93
|
const object = schema;
|
|
92
|
-
const keys = Object.
|
|
93
|
-
const entries =
|
|
94
|
+
const keys = Object.getOwnPropertyNames(value);
|
|
95
|
+
const entries = Object.entries(object.properties);
|
|
94
96
|
const [point, max] = [1 / entries.length, entries.length];
|
|
95
97
|
return entries.reduce((acc, [key, schema]) => {
|
|
96
98
|
const literal = schema[Types.Kind] === 'Literal' && schema.const === value[key] ? max : 0;
|
|
97
|
-
const checks =
|
|
99
|
+
const checks = ValueCheck.Check(schema, references, value[key]) ? point : 0;
|
|
98
100
|
const exists = keys.includes(key) ? point : 0;
|
|
99
101
|
return acc + (literal + checks + exists);
|
|
100
102
|
}, 0);
|
|
101
103
|
}
|
|
102
104
|
else {
|
|
103
|
-
return
|
|
105
|
+
return ValueCheck.Check(schema, references, value) ? 1 : 0;
|
|
104
106
|
}
|
|
105
107
|
}
|
|
106
108
|
function Select(union, references, value) {
|
|
@@ -115,258 +117,251 @@ var UnionCastCreate;
|
|
|
115
117
|
return select;
|
|
116
118
|
}
|
|
117
119
|
function Create(union, references, value) {
|
|
118
|
-
if (
|
|
120
|
+
if ('default' in union) {
|
|
119
121
|
return union.default;
|
|
120
122
|
}
|
|
121
123
|
else {
|
|
122
124
|
const schema = Select(union, references, value);
|
|
123
|
-
return
|
|
125
|
+
return Cast(schema, references, value);
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
128
|
UnionCastCreate.Create = Create;
|
|
127
129
|
})(UnionCastCreate || (UnionCastCreate = {}));
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const result = {};
|
|
219
|
-
for (const [key, property] of globalThis.Object.entries(schema.properties)) {
|
|
220
|
-
if (!required.has(key) && value[key] === undefined)
|
|
130
|
+
// --------------------------------------------------------------------------
|
|
131
|
+
// Cast
|
|
132
|
+
// --------------------------------------------------------------------------
|
|
133
|
+
function TAny(schema, references, value) {
|
|
134
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
135
|
+
}
|
|
136
|
+
function TArray(schema, references, value) {
|
|
137
|
+
if (ValueCheck.Check(schema, references, value))
|
|
138
|
+
return ValueClone.Clone(value);
|
|
139
|
+
const created = ValueGuard.IsArray(value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
140
|
+
const minimum = ValueGuard.IsNumber(schema.minItems) && created.length < schema.minItems ? [...created, ...Array.from({ length: schema.minItems - created.length }, () => null)] : created;
|
|
141
|
+
const maximum = ValueGuard.IsNumber(schema.maxItems) && minimum.length > schema.maxItems ? minimum.slice(0, schema.maxItems) : minimum;
|
|
142
|
+
const casted = maximum.map((value) => Visit(schema.items, references, value));
|
|
143
|
+
if (schema.uniqueItems !== true)
|
|
144
|
+
return casted;
|
|
145
|
+
const unique = [...new Set(casted)];
|
|
146
|
+
if (!ValueCheck.Check(schema, references, unique))
|
|
147
|
+
throw new ValueCastArrayUniqueItemsTypeError(schema, unique);
|
|
148
|
+
return unique;
|
|
149
|
+
}
|
|
150
|
+
function TAsyncIterator(schema, references, value) {
|
|
151
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
152
|
+
}
|
|
153
|
+
function TBigInt(schema, references, value) {
|
|
154
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
155
|
+
}
|
|
156
|
+
function TBoolean(schema, references, value) {
|
|
157
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
158
|
+
}
|
|
159
|
+
function TConstructor(schema, references, value) {
|
|
160
|
+
if (ValueCheck.Check(schema, references, value))
|
|
161
|
+
return ValueCreate.Create(schema, references);
|
|
162
|
+
const required = new Set(schema.returns.required || []);
|
|
163
|
+
const result = function () { };
|
|
164
|
+
for (const [key, property] of Object.entries(schema.returns.properties)) {
|
|
165
|
+
if (!required.has(key) && value.prototype[key] === undefined)
|
|
166
|
+
continue;
|
|
167
|
+
result.prototype[key] = Visit(property, references, value.prototype[key]);
|
|
168
|
+
}
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
function TDate(schema, references, value) {
|
|
172
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
173
|
+
}
|
|
174
|
+
function TFunction(schema, references, value) {
|
|
175
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
176
|
+
}
|
|
177
|
+
function TInteger(schema, references, value) {
|
|
178
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
179
|
+
}
|
|
180
|
+
function TIntersect(schema, references, value) {
|
|
181
|
+
const created = ValueCreate.Create(schema, references);
|
|
182
|
+
const mapped = ValueGuard.IsPlainObject(created) && ValueGuard.IsPlainObject(value) ? { ...created, ...value } : value;
|
|
183
|
+
return ValueCheck.Check(schema, references, mapped) ? mapped : ValueCreate.Create(schema, references);
|
|
184
|
+
}
|
|
185
|
+
function TIterator(schema, references, value) {
|
|
186
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
187
|
+
}
|
|
188
|
+
function TLiteral(schema, references, value) {
|
|
189
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
190
|
+
}
|
|
191
|
+
function TNever(schema, references, value) {
|
|
192
|
+
throw new ValueCastNeverTypeError(schema);
|
|
193
|
+
}
|
|
194
|
+
function TNot(schema, references, value) {
|
|
195
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
196
|
+
}
|
|
197
|
+
function TNull(schema, references, value) {
|
|
198
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
199
|
+
}
|
|
200
|
+
function TNumber(schema, references, value) {
|
|
201
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
202
|
+
}
|
|
203
|
+
function TObject(schema, references, value) {
|
|
204
|
+
if (ValueCheck.Check(schema, references, value))
|
|
205
|
+
return value;
|
|
206
|
+
if (value === null || typeof value !== 'object')
|
|
207
|
+
return ValueCreate.Create(schema, references);
|
|
208
|
+
const required = new Set(schema.required || []);
|
|
209
|
+
const result = {};
|
|
210
|
+
for (const [key, property] of Object.entries(schema.properties)) {
|
|
211
|
+
if (!required.has(key) && value[key] === undefined)
|
|
212
|
+
continue;
|
|
213
|
+
result[key] = Visit(property, references, value[key]);
|
|
214
|
+
}
|
|
215
|
+
// additional schema properties
|
|
216
|
+
if (typeof schema.additionalProperties === 'object') {
|
|
217
|
+
const propertyNames = Object.getOwnPropertyNames(schema.properties);
|
|
218
|
+
for (const propertyName of Object.getOwnPropertyNames(value)) {
|
|
219
|
+
if (propertyNames.includes(propertyName))
|
|
221
220
|
continue;
|
|
222
|
-
result[
|
|
223
|
-
}
|
|
224
|
-
// additional schema properties
|
|
225
|
-
if (typeof schema.additionalProperties === 'object') {
|
|
226
|
-
const propertyNames = globalThis.Object.getOwnPropertyNames(schema.properties);
|
|
227
|
-
for (const propertyName of globalThis.Object.getOwnPropertyNames(value)) {
|
|
228
|
-
if (propertyNames.includes(propertyName))
|
|
229
|
-
continue;
|
|
230
|
-
result[propertyName] = Visit(schema.additionalProperties, references, value[propertyName]);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return result;
|
|
234
|
-
}
|
|
235
|
-
function Promise(schema, references, value) {
|
|
236
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
237
|
-
}
|
|
238
|
-
function Record(schema, references, value) {
|
|
239
|
-
if (check_1.ValueCheck.Check(schema, references, value))
|
|
240
|
-
return clone_1.ValueClone.Clone(value);
|
|
241
|
-
if (value === null || typeof value !== 'object' || globalThis.Array.isArray(value) || value instanceof globalThis.Date)
|
|
242
|
-
return create_1.ValueCreate.Create(schema, references);
|
|
243
|
-
const subschemaPropertyName = globalThis.Object.getOwnPropertyNames(schema.patternProperties)[0];
|
|
244
|
-
const subschema = schema.patternProperties[subschemaPropertyName];
|
|
245
|
-
const result = {};
|
|
246
|
-
for (const [propKey, propValue] of globalThis.Object.entries(value)) {
|
|
247
|
-
result[propKey] = Visit(subschema, references, propValue);
|
|
248
|
-
}
|
|
249
|
-
return result;
|
|
250
|
-
}
|
|
251
|
-
function Ref(schema, references, value) {
|
|
252
|
-
const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
|
|
253
|
-
if (index === -1)
|
|
254
|
-
throw new ValueCastDereferenceError(schema);
|
|
255
|
-
const target = references[index];
|
|
256
|
-
return Visit(target, references, value);
|
|
257
|
-
}
|
|
258
|
-
function String(schema, references, value) {
|
|
259
|
-
return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
|
|
260
|
-
}
|
|
261
|
-
function Symbol(schema, references, value) {
|
|
262
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
263
|
-
}
|
|
264
|
-
function TemplateLiteral(schema, references, value) {
|
|
265
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
266
|
-
}
|
|
267
|
-
function This(schema, references, value) {
|
|
268
|
-
const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
|
|
269
|
-
if (index === -1)
|
|
270
|
-
throw new ValueCastDereferenceError(schema);
|
|
271
|
-
const target = references[index];
|
|
272
|
-
return Visit(target, references, value);
|
|
273
|
-
}
|
|
274
|
-
function Tuple(schema, references, value) {
|
|
275
|
-
if (check_1.ValueCheck.Check(schema, references, value))
|
|
276
|
-
return clone_1.ValueClone.Clone(value);
|
|
277
|
-
if (!globalThis.Array.isArray(value))
|
|
278
|
-
return create_1.ValueCreate.Create(schema, references);
|
|
279
|
-
if (schema.items === undefined)
|
|
280
|
-
return [];
|
|
281
|
-
return schema.items.map((schema, index) => Visit(schema, references, value[index]));
|
|
282
|
-
}
|
|
283
|
-
function Undefined(schema, references, value) {
|
|
284
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
285
|
-
}
|
|
286
|
-
function Union(schema, references, value) {
|
|
287
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value);
|
|
288
|
-
}
|
|
289
|
-
function Uint8Array(schema, references, value) {
|
|
290
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
291
|
-
}
|
|
292
|
-
function Unknown(schema, references, value) {
|
|
293
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
294
|
-
}
|
|
295
|
-
function Void(schema, references, value) {
|
|
296
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
297
|
-
}
|
|
298
|
-
function UserDefined(schema, references, value) {
|
|
299
|
-
return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
|
|
300
|
-
}
|
|
301
|
-
function Visit(schema, references, value) {
|
|
302
|
-
const references_ = IsString(schema.$id) ? [...references, schema] : references;
|
|
303
|
-
const schema_ = schema;
|
|
304
|
-
switch (schema[Types.Kind]) {
|
|
305
|
-
case 'Any':
|
|
306
|
-
return Any(schema_, references_, value);
|
|
307
|
-
case 'Array':
|
|
308
|
-
return Array(schema_, references_, value);
|
|
309
|
-
case 'BigInt':
|
|
310
|
-
return BigInt(schema_, references_, value);
|
|
311
|
-
case 'Boolean':
|
|
312
|
-
return Boolean(schema_, references_, value);
|
|
313
|
-
case 'Constructor':
|
|
314
|
-
return Constructor(schema_, references_, value);
|
|
315
|
-
case 'Date':
|
|
316
|
-
return Date(schema_, references_, value);
|
|
317
|
-
case 'Function':
|
|
318
|
-
return Function(schema_, references_, value);
|
|
319
|
-
case 'Integer':
|
|
320
|
-
return Integer(schema_, references_, value);
|
|
321
|
-
case 'Intersect':
|
|
322
|
-
return Intersect(schema_, references_, value);
|
|
323
|
-
case 'Literal':
|
|
324
|
-
return Literal(schema_, references_, value);
|
|
325
|
-
case 'Never':
|
|
326
|
-
return Never(schema_, references_, value);
|
|
327
|
-
case 'Not':
|
|
328
|
-
return Not(schema_, references_, value);
|
|
329
|
-
case 'Null':
|
|
330
|
-
return Null(schema_, references_, value);
|
|
331
|
-
case 'Number':
|
|
332
|
-
return Number(schema_, references_, value);
|
|
333
|
-
case 'Object':
|
|
334
|
-
return Object(schema_, references_, value);
|
|
335
|
-
case 'Promise':
|
|
336
|
-
return Promise(schema_, references_, value);
|
|
337
|
-
case 'Record':
|
|
338
|
-
return Record(schema_, references_, value);
|
|
339
|
-
case 'Ref':
|
|
340
|
-
return Ref(schema_, references_, value);
|
|
341
|
-
case 'String':
|
|
342
|
-
return String(schema_, references_, value);
|
|
343
|
-
case 'Symbol':
|
|
344
|
-
return Symbol(schema_, references_, value);
|
|
345
|
-
case 'TemplateLiteral':
|
|
346
|
-
return TemplateLiteral(schema_, references_, value);
|
|
347
|
-
case 'This':
|
|
348
|
-
return This(schema_, references_, value);
|
|
349
|
-
case 'Tuple':
|
|
350
|
-
return Tuple(schema_, references_, value);
|
|
351
|
-
case 'Undefined':
|
|
352
|
-
return Undefined(schema_, references_, value);
|
|
353
|
-
case 'Union':
|
|
354
|
-
return Union(schema_, references_, value);
|
|
355
|
-
case 'Uint8Array':
|
|
356
|
-
return Uint8Array(schema_, references_, value);
|
|
357
|
-
case 'Unknown':
|
|
358
|
-
return Unknown(schema_, references_, value);
|
|
359
|
-
case 'Void':
|
|
360
|
-
return Void(schema_, references_, value);
|
|
361
|
-
default:
|
|
362
|
-
if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
|
|
363
|
-
throw new ValueCastUnknownTypeError(schema_);
|
|
364
|
-
return UserDefined(schema_, references_, value);
|
|
221
|
+
result[propertyName] = Visit(schema.additionalProperties, references, value[propertyName]);
|
|
365
222
|
}
|
|
366
223
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
function TPromise(schema, references, value) {
|
|
227
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
228
|
+
}
|
|
229
|
+
function TRecord(schema, references, value) {
|
|
230
|
+
if (ValueCheck.Check(schema, references, value))
|
|
231
|
+
return ValueClone.Clone(value);
|
|
232
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value) || value instanceof Date)
|
|
233
|
+
return ValueCreate.Create(schema, references);
|
|
234
|
+
const subschemaPropertyName = Object.getOwnPropertyNames(schema.patternProperties)[0];
|
|
235
|
+
const subschema = schema.patternProperties[subschemaPropertyName];
|
|
236
|
+
const result = {};
|
|
237
|
+
for (const [propKey, propValue] of Object.entries(value)) {
|
|
238
|
+
result[propKey] = Visit(subschema, references, propValue);
|
|
239
|
+
}
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
function TRef(schema, references, value) {
|
|
243
|
+
const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
|
|
244
|
+
if (index === -1)
|
|
245
|
+
throw new ValueCastDereferenceError(schema);
|
|
246
|
+
const target = references[index];
|
|
247
|
+
return Visit(target, references, value);
|
|
248
|
+
}
|
|
249
|
+
function TString(schema, references, value) {
|
|
250
|
+
return ValueCheck.Check(schema, references, value) ? value : ValueCreate.Create(schema, references);
|
|
251
|
+
}
|
|
252
|
+
function TSymbol(schema, references, value) {
|
|
253
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
254
|
+
}
|
|
255
|
+
function TTemplateLiteral(schema, references, value) {
|
|
256
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
257
|
+
}
|
|
258
|
+
function TThis(schema, references, value) {
|
|
259
|
+
const index = references.findIndex((foreign) => foreign.$id === schema.$ref);
|
|
260
|
+
if (index === -1)
|
|
261
|
+
throw new ValueCastDereferenceError(schema);
|
|
262
|
+
const target = references[index];
|
|
263
|
+
return Visit(target, references, value);
|
|
264
|
+
}
|
|
265
|
+
function TTuple(schema, references, value) {
|
|
266
|
+
if (ValueCheck.Check(schema, references, value))
|
|
267
|
+
return ValueClone.Clone(value);
|
|
268
|
+
if (!ValueGuard.IsArray(value))
|
|
269
|
+
return ValueCreate.Create(schema, references);
|
|
270
|
+
if (schema.items === undefined)
|
|
271
|
+
return [];
|
|
272
|
+
return schema.items.map((schema, index) => Visit(schema, references, value[index]));
|
|
273
|
+
}
|
|
274
|
+
function TUndefined(schema, references, value) {
|
|
275
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
276
|
+
}
|
|
277
|
+
function TUnion(schema, references, value) {
|
|
278
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : UnionCastCreate.Create(schema, references, value);
|
|
279
|
+
}
|
|
280
|
+
function TUint8Array(schema, references, value) {
|
|
281
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
282
|
+
}
|
|
283
|
+
function TUnknown(schema, references, value) {
|
|
284
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
285
|
+
}
|
|
286
|
+
function TVoid(schema, references, value) {
|
|
287
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
288
|
+
}
|
|
289
|
+
function TKind(schema, references, value) {
|
|
290
|
+
return ValueCheck.Check(schema, references, value) ? ValueClone.Clone(value) : ValueCreate.Create(schema, references);
|
|
291
|
+
}
|
|
292
|
+
function Visit(schema, references, value) {
|
|
293
|
+
const references_ = ValueGuard.IsString(schema.$id) ? [...references, schema] : references;
|
|
294
|
+
const schema_ = schema;
|
|
295
|
+
switch (schema[Types.Kind]) {
|
|
296
|
+
case 'Any':
|
|
297
|
+
return TAny(schema_, references_, value);
|
|
298
|
+
case 'Array':
|
|
299
|
+
return TArray(schema_, references_, value);
|
|
300
|
+
case 'AsyncIterator':
|
|
301
|
+
return TAsyncIterator(schema_, references_, value);
|
|
302
|
+
case 'BigInt':
|
|
303
|
+
return TBigInt(schema_, references_, value);
|
|
304
|
+
case 'Boolean':
|
|
305
|
+
return TBoolean(schema_, references_, value);
|
|
306
|
+
case 'Constructor':
|
|
307
|
+
return TConstructor(schema_, references_, value);
|
|
308
|
+
case 'Date':
|
|
309
|
+
return TDate(schema_, references_, value);
|
|
310
|
+
case 'Function':
|
|
311
|
+
return TFunction(schema_, references_, value);
|
|
312
|
+
case 'Integer':
|
|
313
|
+
return TInteger(schema_, references_, value);
|
|
314
|
+
case 'Intersect':
|
|
315
|
+
return TIntersect(schema_, references_, value);
|
|
316
|
+
case 'Iterator':
|
|
317
|
+
return TIterator(schema_, references_, value);
|
|
318
|
+
case 'Literal':
|
|
319
|
+
return TLiteral(schema_, references_, value);
|
|
320
|
+
case 'Never':
|
|
321
|
+
return TNever(schema_, references_, value);
|
|
322
|
+
case 'Not':
|
|
323
|
+
return TNot(schema_, references_, value);
|
|
324
|
+
case 'Null':
|
|
325
|
+
return TNull(schema_, references_, value);
|
|
326
|
+
case 'Number':
|
|
327
|
+
return TNumber(schema_, references_, value);
|
|
328
|
+
case 'Object':
|
|
329
|
+
return TObject(schema_, references_, value);
|
|
330
|
+
case 'Promise':
|
|
331
|
+
return TPromise(schema_, references_, value);
|
|
332
|
+
case 'Record':
|
|
333
|
+
return TRecord(schema_, references_, value);
|
|
334
|
+
case 'Ref':
|
|
335
|
+
return TRef(schema_, references_, value);
|
|
336
|
+
case 'String':
|
|
337
|
+
return TString(schema_, references_, value);
|
|
338
|
+
case 'Symbol':
|
|
339
|
+
return TSymbol(schema_, references_, value);
|
|
340
|
+
case 'TemplateLiteral':
|
|
341
|
+
return TTemplateLiteral(schema_, references_, value);
|
|
342
|
+
case 'This':
|
|
343
|
+
return TThis(schema_, references_, value);
|
|
344
|
+
case 'Tuple':
|
|
345
|
+
return TTuple(schema_, references_, value);
|
|
346
|
+
case 'Undefined':
|
|
347
|
+
return TUndefined(schema_, references_, value);
|
|
348
|
+
case 'Union':
|
|
349
|
+
return TUnion(schema_, references_, value);
|
|
350
|
+
case 'Uint8Array':
|
|
351
|
+
return TUint8Array(schema_, references_, value);
|
|
352
|
+
case 'Unknown':
|
|
353
|
+
return TUnknown(schema_, references_, value);
|
|
354
|
+
case 'Void':
|
|
355
|
+
return TVoid(schema_, references_, value);
|
|
356
|
+
default:
|
|
357
|
+
if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
|
|
358
|
+
throw new ValueCastUnknownTypeError(schema_);
|
|
359
|
+
return TKind(schema_, references_, value);
|
|
370
360
|
}
|
|
371
|
-
|
|
372
|
-
|
|
361
|
+
}
|
|
362
|
+
exports.Visit = Visit;
|
|
363
|
+
/** Casts a value into a given type. The return value will retain as much information of the original value as possible. */
|
|
364
|
+
function Cast(...args) {
|
|
365
|
+
return args.length === 3 ? Visit(args[0], args[1], args[2]) : Visit(args[0], [], args[1]);
|
|
366
|
+
}
|
|
367
|
+
exports.Cast = Cast;
|
package/value/check.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare class ValueCheckDereferenceError extends Error {
|
|
|
7
7
|
readonly schema: Types.TRef | Types.TThis;
|
|
8
8
|
constructor(schema: Types.TRef | Types.TThis);
|
|
9
9
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
/** Returns true if the value matches the given type. */
|
|
11
|
+
export declare function Check<T extends Types.TSchema>(schema: T, references: Types.TSchema[], value: unknown): value is Types.Static<T>;
|
|
12
|
+
/** Returns true if the value matches the given type. */
|
|
13
|
+
export declare function Check<T extends Types.TSchema>(schema: T, value: unknown): value is Types.Static<T>;
|