@sinclair/typebox 0.26.0-dev.4 → 0.26.0

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/create.js CHANGED
@@ -27,7 +27,7 @@ THE SOFTWARE.
27
27
 
28
28
  ---------------------------------------------------------------------------*/
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.ValueCreate = exports.ValueCreateIntersectTypeError = exports.ValueCreateNeverTypeError = exports.ValueCreateUnknownTypeError = void 0;
30
+ exports.ValueCreate = exports.ValueCreateDereferenceError = exports.ValueCreateIntersectTypeError = exports.ValueCreateNeverTypeError = exports.ValueCreateUnknownTypeError = void 0;
31
31
  const Types = require("../typebox");
32
32
  const check_1 = require("./check");
33
33
  // --------------------------------------------------------------------------
@@ -54,12 +54,28 @@ class ValueCreateIntersectTypeError extends Error {
54
54
  }
55
55
  }
56
56
  exports.ValueCreateIntersectTypeError = ValueCreateIntersectTypeError;
57
+ class ValueCreateDereferenceError extends Error {
58
+ constructor(schema) {
59
+ super(`ValueCreate: Unable to dereference schema with $id '${schema.$ref}'`);
60
+ this.schema = schema;
61
+ }
62
+ }
63
+ exports.ValueCreateDereferenceError = ValueCreateDereferenceError;
57
64
  // --------------------------------------------------------------------------
58
65
  // ValueCreate
59
66
  // --------------------------------------------------------------------------
60
67
  var ValueCreate;
61
68
  (function (ValueCreate) {
62
- function Any(schema) {
69
+ // --------------------------------------------------------
70
+ // Guards
71
+ // --------------------------------------------------------
72
+ function IsString(value) {
73
+ return typeof value === 'string';
74
+ }
75
+ // --------------------------------------------------------
76
+ // Types
77
+ // --------------------------------------------------------
78
+ function Any(schema, references) {
63
79
  if ('default' in schema) {
64
80
  return schema.default;
65
81
  }
@@ -67,7 +83,7 @@ var ValueCreate;
67
83
  return {};
68
84
  }
69
85
  }
70
- function Array(schema) {
86
+ function Array(schema, references) {
71
87
  if (schema.uniqueItems === true && schema.default === undefined) {
72
88
  throw new Error('ValueCreate.Array: Arrays with uniqueItems require a default value');
73
89
  }
@@ -76,14 +92,14 @@ var ValueCreate;
76
92
  }
77
93
  else if (schema.minItems !== undefined) {
78
94
  return globalThis.Array.from({ length: schema.minItems }).map((item) => {
79
- return ValueCreate.Create(schema.items);
95
+ return ValueCreate.Create(schema.items, references);
80
96
  });
81
97
  }
82
98
  else {
83
99
  return [];
84
100
  }
85
101
  }
86
- function BigInt(schema) {
102
+ function BigInt(schema, references) {
87
103
  if ('default' in schema) {
88
104
  return schema.default;
89
105
  }
@@ -91,7 +107,7 @@ var ValueCreate;
91
107
  return globalThis.BigInt(0);
92
108
  }
93
109
  }
94
- function Boolean(schema) {
110
+ function Boolean(schema, references) {
95
111
  if ('default' in schema) {
96
112
  return schema.default;
97
113
  }
@@ -99,12 +115,12 @@ var ValueCreate;
99
115
  return false;
100
116
  }
101
117
  }
102
- function Constructor(schema) {
118
+ function Constructor(schema, references) {
103
119
  if ('default' in schema) {
104
120
  return schema.default;
105
121
  }
106
122
  else {
107
- const value = ValueCreate.Create(schema.returns);
123
+ const value = ValueCreate.Create(schema.returns, references);
108
124
  if (typeof value === 'object' && !globalThis.Array.isArray(value)) {
109
125
  return class {
110
126
  constructor() {
@@ -121,7 +137,7 @@ var ValueCreate;
121
137
  }
122
138
  }
123
139
  }
124
- function Date(schema) {
140
+ function Date(schema, references) {
125
141
  if ('default' in schema) {
126
142
  return schema.default;
127
143
  }
@@ -132,15 +148,15 @@ var ValueCreate;
132
148
  return new globalThis.Date(0);
133
149
  }
134
150
  }
135
- function Function(schema) {
151
+ function Function(schema, references) {
136
152
  if ('default' in schema) {
137
153
  return schema.default;
138
154
  }
139
155
  else {
140
- return () => ValueCreate.Create(schema.returns);
156
+ return () => ValueCreate.Create(schema.returns, references);
141
157
  }
142
158
  }
143
- function Integer(schema) {
159
+ function Integer(schema, references) {
144
160
  if ('default' in schema) {
145
161
  return schema.default;
146
162
  }
@@ -151,18 +167,18 @@ var ValueCreate;
151
167
  return 0;
152
168
  }
153
169
  }
154
- function Intersect(schema) {
170
+ function Intersect(schema, references) {
155
171
  if ('default' in schema) {
156
172
  return schema.default;
157
173
  }
158
174
  else {
159
- const value = schema.type === 'object' ? schema.allOf.reduce((acc, schema) => ({ ...acc, ...Visit(schema) }), {}) : schema.allOf.reduce((_, schema) => Visit(schema), undefined);
160
- if (!check_1.ValueCheck.Check(schema, value))
175
+ const value = schema.type === 'object' ? schema.allOf.reduce((acc, schema) => ({ ...acc, ...Visit(schema, references) }), {}) : schema.allOf.reduce((_, schema) => Visit(schema, references), undefined);
176
+ if (!check_1.ValueCheck.Check(schema, references, value))
161
177
  throw new ValueCreateIntersectTypeError(schema);
162
178
  return value;
163
179
  }
164
180
  }
165
- function Literal(schema) {
181
+ function Literal(schema, references) {
166
182
  if ('default' in schema) {
167
183
  return schema.default;
168
184
  }
@@ -170,18 +186,18 @@ var ValueCreate;
170
186
  return schema.const;
171
187
  }
172
188
  }
173
- function Never(schema) {
189
+ function Never(schema, references) {
174
190
  throw new ValueCreateNeverTypeError(schema);
175
191
  }
176
- function Not(schema) {
192
+ function Not(schema, references) {
177
193
  if ('default' in schema) {
178
194
  return schema.default;
179
195
  }
180
196
  else {
181
- return Visit(schema.allOf[1]);
197
+ return Visit(schema.allOf[1], references);
182
198
  }
183
199
  }
184
- function Null(schema) {
200
+ function Null(schema, references) {
185
201
  if ('default' in schema) {
186
202
  return schema.default;
187
203
  }
@@ -189,7 +205,7 @@ var ValueCreate;
189
205
  return null;
190
206
  }
191
207
  }
192
- function Number(schema) {
208
+ function Number(schema, references) {
193
209
  if ('default' in schema) {
194
210
  return schema.default;
195
211
  }
@@ -200,7 +216,7 @@ var ValueCreate;
200
216
  return 0;
201
217
  }
202
218
  }
203
- function Object(schema) {
219
+ function Object(schema, references) {
204
220
  if ('default' in schema) {
205
221
  return schema.default;
206
222
  }
@@ -208,19 +224,19 @@ var ValueCreate;
208
224
  const required = new Set(schema.required);
209
225
  return (schema.default ||
210
226
  globalThis.Object.entries(schema.properties).reduce((acc, [key, schema]) => {
211
- return required.has(key) ? { ...acc, [key]: ValueCreate.Create(schema) } : { ...acc };
227
+ return required.has(key) ? { ...acc, [key]: ValueCreate.Create(schema, references) } : { ...acc };
212
228
  }, {}));
213
229
  }
214
230
  }
215
- function Promise(schema) {
231
+ function Promise(schema, references) {
216
232
  if ('default' in schema) {
217
233
  return schema.default;
218
234
  }
219
235
  else {
220
- return globalThis.Promise.resolve(ValueCreate.Create(schema.item));
236
+ return globalThis.Promise.resolve(ValueCreate.Create(schema.item, references));
221
237
  }
222
238
  }
223
- function Record(schema) {
239
+ function Record(schema, references) {
224
240
  const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0];
225
241
  if ('default' in schema) {
226
242
  return schema.default;
@@ -228,30 +244,38 @@ var ValueCreate;
228
244
  else if (!(keyPattern === '^.*$' || keyPattern === '^(0|[1-9][0-9]*)$')) {
229
245
  const propertyKeys = keyPattern.slice(1, keyPattern.length - 1).split('|');
230
246
  return propertyKeys.reduce((acc, key) => {
231
- return { ...acc, [key]: Create(valueSchema) };
247
+ return { ...acc, [key]: Create(valueSchema, references) };
232
248
  }, {});
233
249
  }
234
250
  else {
235
251
  return {};
236
252
  }
237
253
  }
238
- function Ref(schema) {
254
+ function Ref(schema, references) {
239
255
  if ('default' in schema) {
240
256
  return schema.default;
241
257
  }
242
258
  else {
243
- return Visit(Types.ReferenceRegistry.DerefOne(schema));
259
+ const index = references.findIndex((foreign) => foreign.$id === schema.$id);
260
+ if (index === -1)
261
+ throw new ValueCreateDereferenceError(schema);
262
+ const target = references[index];
263
+ return Visit(target, references);
244
264
  }
245
265
  }
246
- function Self(schema) {
266
+ function Self(schema, references) {
247
267
  if ('default' in schema) {
248
268
  return schema.default;
249
269
  }
250
270
  else {
251
- return Visit(Types.ReferenceRegistry.DerefOne(schema));
271
+ const index = references.findIndex((foreign) => foreign.$id === schema.$id);
272
+ if (index === -1)
273
+ throw new ValueCreateDereferenceError(schema);
274
+ const target = references[index];
275
+ return Visit(target, references);
252
276
  }
253
277
  }
254
- function String(schema) {
278
+ function String(schema, references) {
255
279
  if (schema.pattern !== undefined) {
256
280
  if (!('default' in schema)) {
257
281
  throw new Error('ValueCreate.String: String types with patterns must specify a default value');
@@ -282,7 +306,7 @@ var ValueCreate;
282
306
  }
283
307
  }
284
308
  }
285
- function Symbol(schema) {
309
+ function Symbol(schema, references) {
286
310
  if ('default' in schema) {
287
311
  return schema.default;
288
312
  }
@@ -293,7 +317,7 @@ var ValueCreate;
293
317
  return globalThis.Symbol();
294
318
  }
295
319
  }
296
- function Tuple(schema) {
320
+ function Tuple(schema, references) {
297
321
  if ('default' in schema) {
298
322
  return schema.default;
299
323
  }
@@ -301,10 +325,10 @@ var ValueCreate;
301
325
  return [];
302
326
  }
303
327
  else {
304
- return globalThis.Array.from({ length: schema.minItems }).map((_, index) => ValueCreate.Create(schema.items[index]));
328
+ return globalThis.Array.from({ length: schema.minItems }).map((_, index) => ValueCreate.Create(schema.items[index], references));
305
329
  }
306
330
  }
307
- function Undefined(schema) {
331
+ function Undefined(schema, references) {
308
332
  if ('default' in schema) {
309
333
  return schema.default;
310
334
  }
@@ -312,7 +336,7 @@ var ValueCreate;
312
336
  return undefined;
313
337
  }
314
338
  }
315
- function Union(schema) {
339
+ function Union(schema, references) {
316
340
  if ('default' in schema) {
317
341
  return schema.default;
318
342
  }
@@ -320,10 +344,10 @@ var ValueCreate;
320
344
  throw new Error('ValueCreate.Union: Cannot create Union with zero variants');
321
345
  }
322
346
  else {
323
- return ValueCreate.Create(schema.anyOf[0]);
347
+ return ValueCreate.Create(schema.anyOf[0], references);
324
348
  }
325
349
  }
326
- function Uint8Array(schema) {
350
+ function Uint8Array(schema, references) {
327
351
  if ('default' in schema) {
328
352
  return schema.default;
329
353
  }
@@ -334,7 +358,7 @@ var ValueCreate;
334
358
  return new globalThis.Uint8Array(0);
335
359
  }
336
360
  }
337
- function Unknown(schema) {
361
+ function Unknown(schema, references) {
338
362
  if ('default' in schema) {
339
363
  return schema.default;
340
364
  }
@@ -342,7 +366,7 @@ var ValueCreate;
342
366
  return {};
343
367
  }
344
368
  }
345
- function Void(schema) {
369
+ function Void(schema, references) {
346
370
  if ('default' in schema) {
347
371
  return schema.default;
348
372
  }
@@ -350,7 +374,7 @@ var ValueCreate;
350
374
  return void 0;
351
375
  }
352
376
  }
353
- function UserDefined(schema) {
377
+ function UserDefined(schema, references) {
354
378
  if ('default' in schema) {
355
379
  return schema.default;
356
380
  }
@@ -359,72 +383,73 @@ var ValueCreate;
359
383
  }
360
384
  }
361
385
  /** Creates a value from the given schema. If the schema specifies a default value, then that value is returned. */
362
- function Visit(schema) {
363
- const anySchema = schema;
364
- switch (anySchema[Types.Kind]) {
386
+ function Visit(schema, references) {
387
+ const references_ = IsString(schema.$id) ? [...references, schema] : references;
388
+ const schema_ = schema;
389
+ switch (schema_[Types.Kind]) {
365
390
  case 'Any':
366
- return Any(anySchema);
391
+ return Any(schema_, references_);
367
392
  case 'Array':
368
- return Array(anySchema);
393
+ return Array(schema_, references_);
369
394
  case 'BigInt':
370
- return BigInt(anySchema);
395
+ return BigInt(schema_, references_);
371
396
  case 'Boolean':
372
- return Boolean(anySchema);
397
+ return Boolean(schema_, references_);
373
398
  case 'Constructor':
374
- return Constructor(anySchema);
399
+ return Constructor(schema_, references_);
375
400
  case 'Date':
376
- return Date(anySchema);
401
+ return Date(schema_, references_);
377
402
  case 'Function':
378
- return Function(anySchema);
403
+ return Function(schema_, references_);
379
404
  case 'Integer':
380
- return Integer(anySchema);
405
+ return Integer(schema_, references_);
381
406
  case 'Intersect':
382
- return Intersect(anySchema);
407
+ return Intersect(schema_, references_);
383
408
  case 'Literal':
384
- return Literal(anySchema);
409
+ return Literal(schema_, references_);
385
410
  case 'Never':
386
- return Never(anySchema);
411
+ return Never(schema_, references_);
387
412
  case 'Not':
388
- return Not(anySchema);
413
+ return Not(schema_, references_);
389
414
  case 'Null':
390
- return Null(anySchema);
415
+ return Null(schema_, references_);
391
416
  case 'Number':
392
- return Number(anySchema);
417
+ return Number(schema_, references_);
393
418
  case 'Object':
394
- return Object(anySchema);
419
+ return Object(schema_, references_);
395
420
  case 'Promise':
396
- return Promise(anySchema);
421
+ return Promise(schema_, references_);
397
422
  case 'Record':
398
- return Record(anySchema);
423
+ return Record(schema_, references_);
399
424
  case 'Ref':
400
- return Ref(anySchema);
425
+ return Ref(schema_, references_);
401
426
  case 'Self':
402
- return Self(anySchema);
427
+ return Self(schema_, references_);
403
428
  case 'String':
404
- return String(anySchema);
429
+ return String(schema_, references_);
405
430
  case 'Symbol':
406
- return Symbol(anySchema);
431
+ return Symbol(schema_, references_);
407
432
  case 'Tuple':
408
- return Tuple(anySchema);
433
+ return Tuple(schema_, references_);
409
434
  case 'Undefined':
410
- return Undefined(anySchema);
435
+ return Undefined(schema_, references_);
411
436
  case 'Union':
412
- return Union(anySchema);
437
+ return Union(schema_, references_);
413
438
  case 'Uint8Array':
414
- return Uint8Array(anySchema);
439
+ return Uint8Array(schema_, references_);
415
440
  case 'Unknown':
416
- return Unknown(anySchema);
441
+ return Unknown(schema_, references_);
417
442
  case 'Void':
418
- return Void(anySchema);
443
+ return Void(schema_, references_);
419
444
  default:
420
- if (!Types.TypeRegistry.Has(anySchema[Types.Kind]))
421
- throw new ValueCreateUnknownTypeError(anySchema);
422
- return UserDefined(anySchema);
445
+ if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
446
+ throw new ValueCreateUnknownTypeError(schema_);
447
+ return UserDefined(schema_, references_);
423
448
  }
424
449
  }
425
450
  ValueCreate.Visit = Visit;
426
- function Create(schema) {
427
- return Visit(schema);
451
+ function Create(schema, references) {
452
+ return Visit(schema, references);
428
453
  }
429
454
  ValueCreate.Create = Create;
430
455
  })(ValueCreate = exports.ValueCreate || (exports.ValueCreate = {}));
package/value/value.d.ts CHANGED
@@ -3,17 +3,27 @@ import { ValueErrorIterator } from '../errors/index';
3
3
  import { Edit } from './delta';
4
4
  /** Provides functions to perform structural updates to JavaScript values */
5
5
  export declare namespace Value {
6
+ /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */
7
+ function Cast<T extends Types.TSchema, R extends Types.TSchema[]>(schema: T, references: [...R], value: unknown): Types.Static<T>;
6
8
  /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */
7
9
  function Cast<T extends Types.TSchema>(schema: T, value: unknown): Types.Static<T>;
8
10
  /** Creates a value from the given type */
11
+ function Create<T extends Types.TSchema, R extends Types.TSchema[]>(schema: T, references: [...R]): Types.Static<T>;
12
+ /** Creates a value from the given type */
9
13
  function Create<T extends Types.TSchema>(schema: T): Types.Static<T>;
10
14
  /** Returns true if the value matches the given type. */
15
+ function Check<T extends Types.TSchema, R extends Types.TSchema[]>(schema: T, references: [...R], value: unknown): value is Types.Static<T>;
16
+ /** Returns true if the value matches the given type. */
11
17
  function Check<T extends Types.TSchema>(schema: T, value: unknown): value is Types.Static<T>;
12
18
  /** Converts any type mismatched values to their target type if a conversion is possible. */
19
+ function Convert<T extends Types.TSchema, R extends Types.TSchema[]>(schema: T, references: [...R], value: unknown): unknown;
20
+ /** Converts any type mismatched values to their target type if a conversion is possible. */
13
21
  function Convert<T extends Types.TSchema>(schema: T, value: unknown): unknown;
14
22
  /** Returns a structural clone of the given value */
15
23
  function Clone<T>(value: T): T;
16
24
  /** Returns an iterator for each error in this value. */
25
+ function Errors<T extends Types.TSchema, R extends Types.TSchema[]>(schema: T, references: [...R], value: unknown): ValueErrorIterator;
26
+ /** Returns an iterator for each error in this value. */
17
27
  function Errors<T extends Types.TSchema>(schema: T, value: unknown): ValueErrorIterator;
18
28
  /** Returns true if left and right values are structurally equal */
19
29
  function Equal<T>(left: T, right: unknown): right is T;
package/value/value.js CHANGED
@@ -40,24 +40,24 @@ const delta_1 = require("./delta");
40
40
  /** Provides functions to perform structural updates to JavaScript values */
41
41
  var Value;
42
42
  (function (Value) {
43
- /** Casts a value into a given type. The return value will retain as much information of the original value as possible. Cast will convert string, number, boolean and date values if a reasonable conversion is possible. */
44
- function Cast(schema, value) {
45
- return cast_1.ValueCast.Cast(schema, value);
43
+ function Cast(...args) {
44
+ const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]];
45
+ return cast_1.ValueCast.Cast(schema, references, value);
46
46
  }
47
47
  Value.Cast = Cast;
48
- /** Creates a value from the given type */
49
- function Create(schema) {
50
- return create_1.ValueCreate.Create(schema);
48
+ function Create(...args) {
49
+ const [schema, references] = args.length === 2 ? [args[0], args[1]] : [args[0], []];
50
+ return create_1.ValueCreate.Create(schema, references);
51
51
  }
52
52
  Value.Create = Create;
53
- /** Returns true if the value matches the given type. */
54
- function Check(schema, value) {
55
- return check_1.ValueCheck.Check(schema, value);
53
+ function Check(...args) {
54
+ const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]];
55
+ return check_1.ValueCheck.Check(schema, references, value);
56
56
  }
57
57
  Value.Check = Check;
58
- /** Converts any type mismatched values to their target type if a conversion is possible. */
59
- function Convert(schema, value) {
60
- return convert_1.ValueConvert.Convert(schema, value);
58
+ function Convert(...args) {
59
+ const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]];
60
+ return convert_1.ValueConvert.Convert(schema, references, value);
61
61
  }
62
62
  Value.Convert = Convert;
63
63
  /** Returns a structural clone of the given value */
@@ -65,9 +65,9 @@ var Value;
65
65
  return clone_1.ValueClone.Clone(value);
66
66
  }
67
67
  Value.Clone = Clone;
68
- /** Returns an iterator for each error in this value. */
69
- function Errors(schema, value) {
70
- return index_1.ValueErrors.Errors(schema, value);
68
+ function Errors(...args) {
69
+ const [schema, references, value] = args.length === 3 ? [args[0], args[1], args[2]] : [args[0], [], args[1]];
70
+ return index_1.ValueErrors.Errors(schema, references, value);
71
71
  }
72
72
  Value.Errors = Errors;
73
73
  /** Returns true if left and right values are structurally equal */