@sinclair/typebox 0.26.0-dev.3 → 0.26.0-dev.5

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/typebox.js CHANGED
@@ -27,106 +27,69 @@ THE SOFTWARE.
27
27
 
28
28
  ---------------------------------------------------------------------------*/
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.Type = exports.StandardType = exports.ExtendedTypeBuilder = exports.StandardTypeBuilder = exports.TypeBuilder = exports.KeyResolver = exports.ObjectMap = exports.TypeClone = exports.TypeExtends = exports.TypeExtendsResult = exports.ExtendsUndefined = exports.TypeGuard = exports.TypeGuardUnknownTypeError = exports.FormatRegistry = exports.ReferenceRegistry = exports.TypeRegistry = exports.Kind = exports.Hint = exports.Modifier = exports.Recursive = void 0;
30
+ exports.Type = exports.StandardType = exports.ExtendedTypeBuilder = exports.StandardTypeBuilder = exports.TypeBuilder = exports.KeyResolver = exports.ObjectMap = exports.TypeClone = exports.TypeExtends = exports.TypeExtendsResult = exports.ExtendsUndefined = exports.TypeGuard = exports.TypeGuardUnknownTypeError = exports.FormatRegistry = exports.TypeRegistry = exports.Kind = exports.Hint = exports.Modifier = void 0;
31
31
  // --------------------------------------------------------------------------
32
32
  // Compositing Symbols
33
33
  // --------------------------------------------------------------------------
34
- exports.Recursive = Symbol.for('TypeBox.Recursive');
35
34
  exports.Modifier = Symbol.for('TypeBox.Modifier');
36
35
  exports.Hint = Symbol.for('TypeBox.Hint');
37
36
  exports.Kind = Symbol.for('TypeBox.Kind');
38
37
  var TypeRegistry;
39
38
  (function (TypeRegistry) {
40
- const types = new Map();
39
+ const map = new Map();
40
+ /** Returns the entries in this registry */
41
+ function Entries() {
42
+ return new Map(map);
43
+ }
44
+ TypeRegistry.Entries = Entries;
41
45
  /** Clears all user defined types */
42
46
  function Clear() {
43
- return types.clear();
47
+ return map.clear();
44
48
  }
45
49
  TypeRegistry.Clear = Clear;
46
50
  /** Returns true if this registry contains this kind */
47
51
  function Has(kind) {
48
- return types.has(kind);
52
+ return map.has(kind);
49
53
  }
50
54
  TypeRegistry.Has = Has;
51
55
  /** Sets a validation function for a user defined type */
52
56
  function Set(kind, func) {
53
- types.set(kind, func);
57
+ map.set(kind, func);
54
58
  }
55
59
  TypeRegistry.Set = Set;
56
60
  /** Gets a custom validation function for a user defined type */
57
61
  function Get(kind) {
58
- return types.get(kind);
62
+ return map.get(kind);
59
63
  }
60
64
  TypeRegistry.Get = Get;
61
65
  })(TypeRegistry = exports.TypeRegistry || (exports.TypeRegistry = {}));
62
- // --------------------------------------------------------------------------
63
- // ReferenceRegistry
64
- // --------------------------------------------------------------------------
65
- var ReferenceRegistry;
66
- (function (ReferenceRegistry) {
67
- const references = new Map();
68
- /** Clears the reference registry */
69
- function Clear() {
70
- return references.clear();
71
- }
72
- ReferenceRegistry.Clear = Clear;
73
- /** Returns true if this registry contains this schema */
74
- function Has(schema) {
75
- return references.has(schema.$id);
76
- }
77
- ReferenceRegistry.Has = Has;
78
- /** Sets this schema on this registry if a $id exists */
79
- function Set(schema) {
80
- const $id = typeof schema === 'object' && schema !== null && typeof schema['$id'] === 'string' ? schema['$id'] : undefined;
81
- if ($id !== undefined)
82
- references.set($id, schema);
83
- }
84
- ReferenceRegistry.Set = Set;
85
- /** Dereferences the schema one level deep */
86
- function DerefOne(schema) {
87
- if (TypeGuard.TRef(schema) || TypeGuard.TSelf(schema)) {
88
- if (!references.has(schema.$ref))
89
- throw Error(`ReferenceRegistry: Cannot deref schema with $id '${schema.$ref}'`);
90
- return references.get(schema.$ref);
91
- }
92
- else {
93
- return schema;
94
- }
95
- }
96
- ReferenceRegistry.DerefOne = DerefOne;
97
- /** Dereferences the schema recursively */
98
- function Deref(schema) {
99
- if (TypeGuard.TRef(schema)) {
100
- return Deref(DerefOne(schema));
101
- }
102
- else {
103
- return schema;
104
- }
105
- }
106
- ReferenceRegistry.Deref = Deref;
107
- })(ReferenceRegistry = exports.ReferenceRegistry || (exports.ReferenceRegistry = {}));
108
66
  /** Provides functions to create user defined string formats */
109
67
  var FormatRegistry;
110
68
  (function (FormatRegistry) {
111
- const formats = new Map();
69
+ const map = new Map();
70
+ /** Returns the entries in this registry */
71
+ function Entries() {
72
+ return new Map(map);
73
+ }
74
+ FormatRegistry.Entries = Entries;
112
75
  /** Clears all user defined string formats */
113
76
  function Clear() {
114
- return formats.clear();
77
+ return map.clear();
115
78
  }
116
79
  FormatRegistry.Clear = Clear;
117
80
  /** Returns true if the user defined string format exists */
118
81
  function Has(format) {
119
- return formats.has(format);
82
+ return map.has(format);
120
83
  }
121
84
  FormatRegistry.Has = Has;
122
85
  /** Sets a validation function for a user defined string format */
123
86
  function Set(format, func) {
124
- formats.set(format, func);
87
+ map.set(format, func);
125
88
  }
126
89
  FormatRegistry.Set = Set;
127
90
  /** Gets a validation function for a user defined string format */
128
91
  function Get(format) {
129
- return formats.get(format);
92
+ return map.get(format);
130
93
  }
131
94
  FormatRegistry.Get = Get;
132
95
  })(FormatRegistry = exports.FormatRegistry || (exports.FormatRegistry = {}));
@@ -346,18 +309,7 @@ var TypeGuard;
346
309
  TypeGuard.TLiteral = TLiteral;
347
310
  /** Returns true if the given schema is TNever */
348
311
  function TNever(schema) {
349
- return (TKind(schema) && schema[exports.Kind] === 'Never' && IsObject(schema.not) && globalThis.Object.getOwnPropertyNames(schema.not).length === 0
350
- // IsArray(schema.allOf) &&
351
- // schema.allOf.length === 2 &&
352
- // IsObject(schema.allOf[0]) &&
353
- // IsString(schema.allOf[0].type) &&
354
- // schema.allOf[0].type === 'boolean' &&
355
- // schema.allOf[0].const === false &&
356
- // IsObject(schema.allOf[1]) &&
357
- // IsString(schema.allOf[1].type) &&
358
- // schema.allOf[1].type === 'boolean' &&
359
- // schema.allOf[1].const === true
360
- );
312
+ return TKind(schema) && schema[exports.Kind] === 'Never' && IsObject(schema.not) && globalThis.Object.getOwnPropertyNames(schema.not).length === 0;
361
313
  }
362
314
  TypeGuard.TNever = TNever;
363
315
  /** Returns true if the given schema is TNot */
@@ -621,9 +573,9 @@ var TypeGuard;
621
573
  // --------------------------------------------------------------------------
622
574
  // ExtendsUndefined
623
575
  // --------------------------------------------------------------------------
576
+ /** Fast undefined check used for properties of type undefined */
624
577
  var ExtendsUndefined;
625
578
  (function (ExtendsUndefined) {
626
- /** Fast undefined check for properties of type undefined */
627
579
  function Check(schema) {
628
580
  if (schema[exports.Kind] === 'Undefined')
629
581
  return true;
@@ -1307,56 +1259,54 @@ var TypeExtends;
1307
1259
  return TypeGuard.TVoid(right) ? TypeExtendsResult.True : TypeExtendsResult.False;
1308
1260
  }
1309
1261
  function Visit(left, right) {
1310
- const right_ = ReferenceRegistry.Deref(right);
1311
- const left_ = ReferenceRegistry.Deref(left);
1312
- if (TypeGuard.TAny(left_))
1313
- return Any(left_, right_);
1314
- if (TypeGuard.TArray(left_))
1315
- return Array(left_, right_);
1316
- if (TypeGuard.TBigInt(left_))
1317
- return BigInt(left_, right_);
1318
- if (TypeGuard.TBoolean(left_))
1319
- return Boolean(left_, right_);
1320
- if (TypeGuard.TConstructor(left_))
1321
- return Constructor(left_, right_);
1322
- if (TypeGuard.TDate(left_))
1323
- return Date(left_, right_);
1324
- if (TypeGuard.TFunction(left_))
1325
- return Function(left_, right_);
1326
- if (TypeGuard.TInteger(left_))
1327
- return Integer(left_, right_);
1328
- if (TypeGuard.TIntersect(left_))
1329
- return Intersect(left_, right_);
1330
- if (TypeGuard.TLiteral(left_))
1331
- return Literal(left_, right_);
1332
- if (TypeGuard.TNever(left_))
1333
- return Never(left_, right_);
1334
- if (TypeGuard.TNull(left_))
1335
- return Null(left_, right_);
1336
- if (TypeGuard.TNumber(left_))
1337
- return Number(left_, right_);
1338
- if (TypeGuard.TRecord(left_))
1339
- return Record(left_, right_);
1340
- if (TypeGuard.TString(left_))
1341
- return String(left_, right_);
1342
- if (TypeGuard.TSymbol(left_))
1343
- return Symbol(left_, right_);
1344
- if (TypeGuard.TObject(left_))
1345
- return Object(left_, right_);
1346
- if (TypeGuard.TTuple(left_))
1347
- return Tuple(left_, right_);
1348
- if (TypeGuard.TPromise(left_))
1349
- return Promise(left_, right_);
1350
- if (TypeGuard.TUint8Array(left_))
1351
- return Uint8Array(left_, right_);
1352
- if (TypeGuard.TUndefined(left_))
1353
- return Undefined(left_, right_);
1354
- if (TypeGuard.TUnion(left_))
1355
- return Union(left_, right_);
1356
- if (TypeGuard.TUnknown(left_))
1357
- return Unknown(left_, right_);
1358
- if (TypeGuard.TVoid(left_))
1359
- return Void(left_, right_);
1262
+ if (TypeGuard.TAny(left))
1263
+ return Any(left, right);
1264
+ if (TypeGuard.TArray(left))
1265
+ return Array(left, right);
1266
+ if (TypeGuard.TBigInt(left))
1267
+ return BigInt(left, right);
1268
+ if (TypeGuard.TBoolean(left))
1269
+ return Boolean(left, right);
1270
+ if (TypeGuard.TConstructor(left))
1271
+ return Constructor(left, right);
1272
+ if (TypeGuard.TDate(left))
1273
+ return Date(left, right);
1274
+ if (TypeGuard.TFunction(left))
1275
+ return Function(left, right);
1276
+ if (TypeGuard.TInteger(left))
1277
+ return Integer(left, right);
1278
+ if (TypeGuard.TIntersect(left))
1279
+ return Intersect(left, right);
1280
+ if (TypeGuard.TLiteral(left))
1281
+ return Literal(left, right);
1282
+ if (TypeGuard.TNever(left))
1283
+ return Never(left, right);
1284
+ if (TypeGuard.TNull(left))
1285
+ return Null(left, right);
1286
+ if (TypeGuard.TNumber(left))
1287
+ return Number(left, right);
1288
+ if (TypeGuard.TRecord(left))
1289
+ return Record(left, right);
1290
+ if (TypeGuard.TString(left))
1291
+ return String(left, right);
1292
+ if (TypeGuard.TSymbol(left))
1293
+ return Symbol(left, right);
1294
+ if (TypeGuard.TObject(left))
1295
+ return Object(left, right);
1296
+ if (TypeGuard.TTuple(left))
1297
+ return Tuple(left, right);
1298
+ if (TypeGuard.TPromise(left))
1299
+ return Promise(left, right);
1300
+ if (TypeGuard.TUint8Array(left))
1301
+ return Uint8Array(left, right);
1302
+ if (TypeGuard.TUndefined(left))
1303
+ return Undefined(left, right);
1304
+ if (TypeGuard.TUnion(left))
1305
+ return Union(left, right);
1306
+ if (TypeGuard.TUnknown(left))
1307
+ return Unknown(left, right);
1308
+ if (TypeGuard.TVoid(left))
1309
+ return Void(left, right);
1360
1310
  throw Error(`TypeExtends: Unknown left type operand '${left[exports.Kind]}'`);
1361
1311
  }
1362
1312
  function Extends(left, right) {
@@ -1367,14 +1317,11 @@ var TypeExtends;
1367
1317
  // --------------------------------------------------------------------------
1368
1318
  // TypeClone
1369
1319
  // --------------------------------------------------------------------------
1370
- /** Specialized Clone for Types. Clones and removes non self-referential identifiers */
1320
+ /** Specialized Clone for Types */
1371
1321
  var TypeClone;
1372
1322
  (function (TypeClone) {
1373
- function IsRecursive(value) {
1374
- return typeof value[exports.Recursive] === 'string';
1375
- }
1376
1323
  function IsObject(value) {
1377
- return typeof value === 'object' && value !== null && !globalThis.Array.isArray(value);
1324
+ return typeof value === 'object' && value !== null;
1378
1325
  }
1379
1326
  function IsArray(value) {
1380
1327
  return globalThis.Array.isArray(value);
@@ -1383,22 +1330,24 @@ var TypeClone;
1383
1330
  return value.map((value) => Visit(value));
1384
1331
  }
1385
1332
  function Object(value) {
1386
- const clone = globalThis.Object.getOwnPropertyNames(value).reduce((acc, key) => ({ ...acc, [key]: Visit(value[key]) }), globalThis.Object.getOwnPropertySymbols(value).reduce((acc, key) => ({ ...acc, [key]: Visit(value[key]) }), {}));
1387
- return clone;
1333
+ const clonedProperties = globalThis.Object.getOwnPropertyNames(value).reduce((acc, key) => {
1334
+ return { ...acc, [key]: Visit(value[key]) };
1335
+ }, {});
1336
+ const clonedSymbols = globalThis.Object.getOwnPropertySymbols(value).reduce((acc, key) => {
1337
+ return { ...acc, [key]: Visit(value[key]) };
1338
+ }, {});
1339
+ return { ...clonedProperties, ...clonedSymbols };
1388
1340
  }
1389
1341
  function Visit(value) {
1390
- const clone = IsObject(value) ? { ...value } : IsArray(value) ? [...value] : value;
1391
- if (IsObject(clone) && !IsRecursive(clone))
1392
- delete clone['$id'];
1393
- if (IsObject(clone))
1394
- return Object(clone);
1395
- if (IsArray(clone))
1396
- return Array(clone);
1397
- return clone;
1342
+ if (IsArray(value))
1343
+ return Array(value);
1344
+ if (IsObject(value))
1345
+ return Object(value);
1346
+ return value;
1398
1347
  }
1399
1348
  /** Clones a type. This function will omit non-self referential identifiers on the cloned type. */
1400
1349
  function Clone(schema, options) {
1401
- return { ...Visit({ ...schema }), ...options };
1350
+ return { ...Visit(schema), ...options };
1402
1351
  }
1403
1352
  TypeClone.Clone = Clone;
1404
1353
  })(TypeClone = exports.TypeClone || (exports.TypeClone = {}));
@@ -1408,10 +1357,10 @@ var TypeClone;
1408
1357
  var ObjectMap;
1409
1358
  (function (ObjectMap) {
1410
1359
  function Intersect(schema, callback) {
1411
- return exports.Type.Intersect(schema.allOf.map((inner) => Visit(ReferenceRegistry.Deref(inner), callback)), { ...schema });
1360
+ return exports.Type.Intersect(schema.allOf.map((inner) => Visit(inner, callback)), { ...schema });
1412
1361
  }
1413
1362
  function Union(schema, callback) {
1414
- return exports.Type.Union(schema.anyOf.map((inner) => Visit(ReferenceRegistry.Deref(inner), callback)), { ...schema });
1363
+ return exports.Type.Union(schema.anyOf.map((inner) => Visit(inner, callback)), { ...schema });
1415
1364
  }
1416
1365
  function Object(schema, callback) {
1417
1366
  return callback(schema);
@@ -1472,7 +1421,6 @@ let TypeOrdinal = 0;
1472
1421
  class TypeBuilder {
1473
1422
  /** `[Utility]` Creates a schema without `static` and `params` types */
1474
1423
  Create(schema) {
1475
- ReferenceRegistry.Set(schema);
1476
1424
  return schema;
1477
1425
  }
1478
1426
  /** `[Standard]` Omits compositing symbols from this schema */
@@ -1515,8 +1463,8 @@ class StandardTypeBuilder extends TypeBuilder {
1515
1463
  Boolean(options = {}) {
1516
1464
  return this.Create({ ...options, [exports.Kind]: 'Boolean', type: 'boolean' });
1517
1465
  }
1518
- /** `[Standard]` Creates a Composite object type that will Union any overlapping properties of the given Object array */
1519
- Composite(schemas, options = {}) {
1466
+ Composite(unresolved, options = {}) {
1467
+ const schemas = TypeGuard.TIntersect(unresolved) ? unresolved.allOf : unresolved;
1520
1468
  const optional = new Set();
1521
1469
  for (const schema of schemas) {
1522
1470
  for (const [key, property] of globalThis.Object.entries(schema.properties)) {
@@ -1533,10 +1481,6 @@ class StandardTypeBuilder extends TypeBuilder {
1533
1481
  }
1534
1482
  return this.Object(properties, options);
1535
1483
  }
1536
- /** `[Standard]` Dereferences the given TRef to its target type */
1537
- Deref(schema) {
1538
- return ReferenceRegistry.Deref(schema);
1539
- }
1540
1484
  /** `[Standard]` Creates a Enum type */
1541
1485
  Enum(item, options = {}) {
1542
1486
  // prettier-ignore
@@ -1546,7 +1490,7 @@ class StandardTypeBuilder extends TypeBuilder {
1546
1490
  }
1547
1491
  /** `[Standard]` A conditional type expression that will return the true type if the left type extends the right */
1548
1492
  Extends(left, right, trueType, falseType, options = {}) {
1549
- switch (TypeExtends.Extends(ReferenceRegistry.Deref(left), ReferenceRegistry.Deref(right))) {
1493
+ switch (TypeExtends.Extends(left, right)) {
1550
1494
  case TypeExtendsResult.Union:
1551
1495
  return this.Union([TypeClone.Clone(trueType, options), TypeClone.Clone(falseType, options)]);
1552
1496
  case TypeExtendsResult.True:
@@ -1596,7 +1540,7 @@ class StandardTypeBuilder extends TypeBuilder {
1596
1540
  }
1597
1541
  /** `[Standard]` Creates a KeyOf type */
1598
1542
  KeyOf(schema, options = {}) {
1599
- const keys = KeyResolver.Resolve(ReferenceRegistry.Deref(schema));
1543
+ const keys = KeyResolver.Resolve(schema);
1600
1544
  // prettier-ignore
1601
1545
  const keyof = keys.length === 0 ? this.Never(options) : this.Union(keys.map((key) => this.Literal(key)), options);
1602
1546
  return keyof;
@@ -1623,24 +1567,26 @@ class StandardTypeBuilder extends TypeBuilder {
1623
1567
  }
1624
1568
  /** `[Standard]` Creates an Object type */
1625
1569
  Object(properties, options = {}) {
1626
- const keys = globalThis.Object.keys(properties);
1627
- const optional = keys.filter((key) => TypeGuard.TOptional(properties[key]) || TypeGuard.TReadonlyOptional(properties[key]));
1628
- const required = keys.filter((name) => !optional.includes(name));
1570
+ const propertyKeys = globalThis.Object.getOwnPropertyNames(properties);
1571
+ const optionalKeys = propertyKeys.filter((key) => TypeGuard.TOptional(properties[key]) || TypeGuard.TReadonlyOptional(properties[key]));
1572
+ const requiredKeys = propertyKeys.filter((name) => !optionalKeys.includes(name));
1629
1573
  const clonedAdditionalProperties = TypeGuard.TSchema(options.additionalProperties) ? { additionalProperties: TypeClone.Clone(options.additionalProperties, {}) } : {};
1630
- const clonedProperties = globalThis.Object.getOwnPropertyNames(properties).reduce((acc, key) => {
1631
- return { ...acc, [key]: TypeClone.Clone(properties[key], {}) };
1632
- }, {});
1633
- if (required.length > 0) {
1634
- return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties, required });
1574
+ const clonedProperties = propertyKeys.reduce((acc, key) => ({ ...acc, [key]: TypeClone.Clone(properties[key], {}) }), {});
1575
+ if (requiredKeys.length > 0) {
1576
+ return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties, required: requiredKeys });
1635
1577
  }
1636
1578
  else {
1637
1579
  return this.Create({ ...options, ...clonedAdditionalProperties, [exports.Kind]: 'Object', type: 'object', properties: clonedProperties });
1638
1580
  }
1639
1581
  }
1640
1582
  Omit(schema, unresolved, options = {}) {
1641
- const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : unresolved;
1642
1583
  // prettier-ignore
1643
- return ObjectMap.Map(TypeClone.Clone(ReferenceRegistry.Deref(schema), {}), (schema) => {
1584
+ const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) :
1585
+ TypeGuard.TLiteral(unresolved) ? [unresolved.const] :
1586
+ TypeGuard.TNever(unresolved) ? [] :
1587
+ unresolved;
1588
+ // prettier-ignore
1589
+ return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => {
1644
1590
  if (schema.required) {
1645
1591
  schema.required = schema.required.filter((key) => !keys.includes(key));
1646
1592
  if (schema.required.length === 0)
@@ -1673,16 +1619,20 @@ class StandardTypeBuilder extends TypeBuilder {
1673
1619
  }
1674
1620
  }
1675
1621
  // prettier-ignore
1676
- return ObjectMap.Map(TypeClone.Clone(ReferenceRegistry.Deref(schema), {}), (schema) => {
1622
+ return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => {
1677
1623
  delete schema.required;
1678
1624
  globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key]));
1679
1625
  return schema;
1680
1626
  }, options);
1681
1627
  }
1682
1628
  Pick(schema, unresolved, options = {}) {
1683
- const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) : unresolved;
1684
1629
  // prettier-ignore
1685
- return ObjectMap.Map(TypeClone.Clone(ReferenceRegistry.Deref(schema), {}), (schema) => {
1630
+ const keys = TypeGuard.TUnionLiteral(unresolved) ? unresolved.anyOf.map((schema) => schema.const) :
1631
+ TypeGuard.TLiteral(unresolved) ? [unresolved.const] :
1632
+ TypeGuard.TNever(unresolved) ? [] :
1633
+ unresolved;
1634
+ // prettier-ignore
1635
+ return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => {
1686
1636
  if (schema.required) {
1687
1637
  schema.required = schema.required.filter((key) => keys.includes(key));
1688
1638
  if (schema.required.length === 0)
@@ -1725,9 +1675,8 @@ class StandardTypeBuilder extends TypeBuilder {
1725
1675
  if (options.$id === undefined)
1726
1676
  options.$id = `T${TypeOrdinal++}`;
1727
1677
  const self = callback({ [exports.Kind]: 'Self', $ref: `${options.$id}` });
1728
- const reassign = self;
1729
- reassign.$id = options.$id; // required as $id is readonly
1730
- return this.Create({ ...options, ...self, [exports.Recursive]: reassign.$id });
1678
+ self.$id = options.$id;
1679
+ return this.Create({ ...options, ...self });
1731
1680
  }
1732
1681
  /** `[Standard]` Creates a Ref type. The referenced type must contain a $id */
1733
1682
  Ref(schema, options = {}) {
@@ -1755,7 +1704,7 @@ class StandardTypeBuilder extends TypeBuilder {
1755
1704
  }
1756
1705
  }
1757
1706
  // prettier-ignore
1758
- return ObjectMap.Map(TypeClone.Clone(ReferenceRegistry.Deref(schema), {}), (schema) => {
1707
+ return ObjectMap.Map(TypeClone.Clone(schema, {}), (schema) => {
1759
1708
  schema.required = globalThis.Object.keys(schema.properties);
1760
1709
  globalThis.Object.keys(schema.properties).forEach(key => Apply(schema.properties[key]));
1761
1710
  return schema;
@@ -1779,7 +1728,7 @@ class StandardTypeBuilder extends TypeBuilder {
1779
1728
  if (anyOf.length === 0)
1780
1729
  return this.Never(options);
1781
1730
  if (anyOf.length === 1)
1782
- return TypeClone.Clone(anyOf[0], options);
1731
+ return this.Create(TypeClone.Clone(anyOf[0], options));
1783
1732
  const clonedAnyOf = anyOf.map((schema) => TypeClone.Clone(schema, {}));
1784
1733
  return this.Create({ ...options, [exports.Kind]: 'Union', anyOf: clonedAnyOf });
1785
1734
  }
package/value/cast.d.ts CHANGED
@@ -20,7 +20,11 @@ export declare class ValueCastUnknownTypeError extends Error {
20
20
  readonly schema: Types.TSchema;
21
21
  constructor(schema: Types.TSchema);
22
22
  }
23
+ export declare class ValueCastDereferenceError extends Error {
24
+ readonly schema: Types.TRef | Types.TSelf;
25
+ constructor(schema: Types.TRef | Types.TSelf);
26
+ }
23
27
  export declare namespace ValueCast {
24
- function Visit(schema: Types.TSchema, value: any): any;
25
- function Cast<T extends Types.TSchema>(schema: T, value: any): Types.Static<T>;
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>;
26
30
  }