@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/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 namespace ValueCast {
28
- function Visit(schema: Types.TSchema, references: Types.TSchema[], value: any): any;
29
- function Cast<T extends Types.TSchema>(schema: T, references: Types.TSchema[], value: any): Types.Static<T>;
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.ValueCast = exports.ValueCastDereferenceError = exports.ValueCastUnknownTypeError = exports.ValueCastRecursiveTypeError = exports.ValueCastNeverTypeError = exports.ValueCastArrayUniqueItemsTypeError = exports.ValueCastReferenceTypeError = void 0;
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 create_1 = require("./create");
33
- const check_1 = require("./check");
34
- const clone_1 = require("./clone");
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 is the tally of
83
- // points awarded for each property of the value. Property points are (1.0 / propertyCount)
84
- // to prevent large property counts biasing results. Properties that match literal values are
85
- // maximally awarded as literals are typically used as union discriminator fields.
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 !== null) {
92
+ if (schema[Types.Kind] === 'Object' && typeof value === 'object' && !ValueGuard.IsNull(value)) {
91
93
  const object = schema;
92
- const keys = Object.keys(value);
93
- const entries = globalThis.Object.entries(object.properties);
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 = check_1.ValueCheck.Check(schema, references, value[key]) ? point : 0;
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 check_1.ValueCheck.Check(schema, references, value) ? 1 : 0;
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 (union.default !== undefined) {
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 ValueCast.Cast(schema, references, value);
125
+ return Cast(schema, references, value);
124
126
  }
125
127
  }
126
128
  UnionCastCreate.Create = Create;
127
129
  })(UnionCastCreate || (UnionCastCreate = {}));
128
- var ValueCast;
129
- (function (ValueCast) {
130
- // ----------------------------------------------------------------------------------------------
131
- // Guards
132
- // ----------------------------------------------------------------------------------------------
133
- function IsObject(value) {
134
- return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value);
135
- }
136
- function IsArray(value) {
137
- return typeof value === 'object' && globalThis.Array.isArray(value);
138
- }
139
- function IsNumber(value) {
140
- return typeof value === 'number' && !isNaN(value);
141
- }
142
- function IsString(value) {
143
- return typeof value === 'string';
144
- }
145
- // ----------------------------------------------------------------------------------------------
146
- // Cast
147
- // ----------------------------------------------------------------------------------------------
148
- function Any(schema, references, value) {
149
- return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
150
- }
151
- function Array(schema, references, value) {
152
- if (check_1.ValueCheck.Check(schema, references, value))
153
- return clone_1.ValueClone.Clone(value);
154
- const created = IsArray(value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
155
- const minimum = IsNumber(schema.minItems) && created.length < schema.minItems ? [...created, ...globalThis.Array.from({ length: schema.minItems - created.length }, () => null)] : created;
156
- const maximum = IsNumber(schema.maxItems) && minimum.length > schema.maxItems ? minimum.slice(0, schema.maxItems) : minimum;
157
- const casted = maximum.map((value) => Visit(schema.items, references, value));
158
- if (schema.uniqueItems !== true)
159
- return casted;
160
- const unique = [...new Set(casted)];
161
- if (!check_1.ValueCheck.Check(schema, references, unique))
162
- throw new ValueCastArrayUniqueItemsTypeError(schema, unique);
163
- return unique;
164
- }
165
- function BigInt(schema, references, value) {
166
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
167
- }
168
- function Boolean(schema, references, value) {
169
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
170
- }
171
- function Constructor(schema, references, value) {
172
- if (check_1.ValueCheck.Check(schema, references, value))
173
- return create_1.ValueCreate.Create(schema, references);
174
- const required = new Set(schema.returns.required || []);
175
- const result = function () { };
176
- for (const [key, property] of globalThis.Object.entries(schema.returns.properties)) {
177
- if (!required.has(key) && value.prototype[key] === undefined)
178
- continue;
179
- result.prototype[key] = Visit(property, references, value.prototype[key]);
180
- }
181
- return result;
182
- }
183
- function Date(schema, references, value) {
184
- return check_1.ValueCheck.Check(schema, references, value) ? clone_1.ValueClone.Clone(value) : create_1.ValueCreate.Create(schema, references);
185
- }
186
- function Function(schema, references, value) {
187
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
188
- }
189
- function Integer(schema, references, value) {
190
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
191
- }
192
- function Intersect(schema, references, value) {
193
- const created = create_1.ValueCreate.Create(schema, references);
194
- const mapped = IsObject(created) && IsObject(value) ? { ...created, ...value } : value;
195
- return check_1.ValueCheck.Check(schema, references, mapped) ? mapped : create_1.ValueCreate.Create(schema, references);
196
- }
197
- function Literal(schema, references, value) {
198
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
199
- }
200
- function Never(schema, references, value) {
201
- throw new ValueCastNeverTypeError(schema);
202
- }
203
- function Not(schema, references, value) {
204
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
205
- }
206
- function Null(schema, references, value) {
207
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
208
- }
209
- function Number(schema, references, value) {
210
- return check_1.ValueCheck.Check(schema, references, value) ? value : create_1.ValueCreate.Create(schema, references);
211
- }
212
- function Object(schema, references, value) {
213
- if (check_1.ValueCheck.Check(schema, references, value))
214
- return value;
215
- if (value === null || typeof value !== 'object')
216
- return create_1.ValueCreate.Create(schema, references);
217
- const required = new Set(schema.required || []);
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[key] = Visit(property, references, value[key]);
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
- ValueCast.Visit = Visit;
368
- function Cast(schema, references, value) {
369
- return Visit(schema, references, clone_1.ValueClone.Clone(value));
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
- ValueCast.Cast = Cast;
372
- })(ValueCast || (exports.ValueCast = ValueCast = {}));
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
- export declare namespace ValueCheck {
11
- function Check<T extends Types.TSchema>(schema: T, references: Types.TSchema[], value: any): boolean;
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>;