@sinclair/typebox 0.31.27 → 0.31.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinclair/typebox",
3
- "version": "0.31.27",
3
+ "version": "0.31.28",
4
4
  "description": "JSONSchema Type Builder with Static Type Resolution for TypeScript",
5
5
  "keywords": [
6
6
  "typescript",
package/readme.md CHANGED
@@ -1719,11 +1719,11 @@ The following table lists esbuild compiled and minified sizes for each TypeBox m
1719
1719
  ┌──────────────────────┬────────────┬────────────┬─────────────┐
1720
1720
  │ (index) │ Compiled │ Minified │ Compression │
1721
1721
  ├──────────────────────┼────────────┼────────────┼─────────────┤
1722
- │ typebox/compiler │ '148.9 kb' │ ' 65.8 kb' │ '2.26 x' │
1723
- │ typebox/errors │ '111.5 kb' │ ' 49.1 kb' │ '2.27 x' │
1724
- │ typebox/system │ ' 82.6 kb' │ ' 36.8 kb' │ '2.24 x' │
1725
- │ typebox/value │ '190.5 kb' │ ' 82.4 kb' │ '2.31 x' │
1726
- │ typebox │ ' 72.4 kb' │ ' 31.6 kb' │ '2.29 x' │
1722
+ │ typebox/compiler │ '163.6 kb' │ ' 71.6 kb' │ '2.28 x' │
1723
+ │ typebox/errors │ '113.3 kb' │ ' 50.1 kb' │ '2.26 x' │
1724
+ │ typebox/system │ ' 83.9 kb' │ ' 37.5 kb' │ '2.24 x' │
1725
+ │ typebox/value │ '191.1 kb' │ ' 82.3 kb' │ '2.32 x' │
1726
+ │ typebox │ ' 73.8 kb' │ ' 32.3 kb' │ '2.29 x' │
1727
1727
  └──────────────────────┴────────────┴────────────┴─────────────┘
1728
1728
  ```
1729
1729
 
@@ -1,10 +1,5 @@
1
1
  import { ValueError } from '../errors/errors';
2
2
  import * as Types from '../typebox';
3
- export type CheckFunction = (schema: Types.TSchema, references: Types.TSchema[], value: unknown) => boolean;
4
- export declare class TransformUnknownTypeError extends Types.TypeBoxError {
5
- readonly schema: Types.TRef | Types.TThis;
6
- constructor(schema: Types.TRef | Types.TThis);
7
- }
8
3
  export declare class TransformDecodeCheckError extends Types.TypeBoxError {
9
4
  readonly schema: Types.TSchema;
10
5
  readonly value: unknown;
@@ -27,7 +27,7 @@ THE SOFTWARE.
27
27
 
28
28
  ---------------------------------------------------------------------------*/
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.EncodeTransform = exports.DecodeTransform = exports.HasTransform = exports.TransformEncodeError = exports.TransformDecodeError = exports.TransformEncodeCheckError = exports.TransformDecodeCheckError = exports.TransformUnknownTypeError = void 0;
30
+ exports.EncodeTransform = exports.DecodeTransform = exports.HasTransform = exports.TransformEncodeError = exports.TransformDecodeError = exports.TransformEncodeCheckError = exports.TransformDecodeCheckError = void 0;
31
31
  const guard_1 = require("./guard");
32
32
  const deref_1 = require("./deref");
33
33
  const check_1 = require("./check");
@@ -35,13 +35,6 @@ const Types = require("../typebox");
35
35
  // -------------------------------------------------------------------------
36
36
  // Errors
37
37
  // -------------------------------------------------------------------------
38
- class TransformUnknownTypeError extends Types.TypeBoxError {
39
- constructor(schema) {
40
- super(`Unknown type`);
41
- this.schema = schema;
42
- }
43
- }
44
- exports.TransformUnknownTypeError = TransformUnknownTypeError;
45
38
  class TransformDecodeCheckError extends Types.TypeBoxError {
46
39
  constructor(schema, value, error) {
47
40
  super(`Unable to decode due to invalid value`);
@@ -76,9 +69,9 @@ class TransformEncodeError extends Types.TypeBoxError {
76
69
  }
77
70
  }
78
71
  exports.TransformEncodeError = TransformEncodeError;
79
- // -------------------------------------------------------------------------
72
+ // ------------------------------------------------------------------
80
73
  // HasTransform
81
- // -------------------------------------------------------------------------
74
+ // ------------------------------------------------------------------
82
75
  /** Recursively checks a schema for transform codecs */
83
76
  var HasTransform;
84
77
  (function (HasTransform) {
@@ -139,9 +132,6 @@ var HasTransform;
139
132
  if (schema.$id)
140
133
  visited.add(schema.$id);
141
134
  switch (schema[Types.Kind]) {
142
- // ------------------------------------------------------
143
- // Structural
144
- // ------------------------------------------------------
145
135
  case 'Array':
146
136
  return TArray(schema_, references_);
147
137
  case 'AsyncIterator':
@@ -170,29 +160,7 @@ var HasTransform;
170
160
  return TTuple(schema_, references_);
171
161
  case 'Union':
172
162
  return TUnion(schema_, references_);
173
- // ------------------------------------------------------
174
- // Default
175
- // ------------------------------------------------------
176
- case 'Any':
177
- case 'BigInt':
178
- case 'Boolean':
179
- case 'Date':
180
- case 'Integer':
181
- case 'Literal':
182
- case 'Never':
183
- case 'Null':
184
- case 'Number':
185
- case 'String':
186
- case 'Symbol':
187
- case 'TemplateLiteral':
188
- case 'Undefined':
189
- case 'Uint8Array':
190
- case 'Unknown':
191
- case 'Void':
192
- return Types.TypeGuard.TTransform(schema);
193
163
  default:
194
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
195
- throw new TransformUnknownTypeError(schema_);
196
164
  return Types.TypeGuard.TTransform(schema);
197
165
  }
198
166
  }
@@ -204,9 +172,9 @@ var HasTransform;
204
172
  }
205
173
  HasTransform.Has = Has;
206
174
  })(HasTransform || (exports.HasTransform = HasTransform = {}));
207
- // -------------------------------------------------------------------------
175
+ // ------------------------------------------------------------------
208
176
  // DecodeTransform
209
- // -------------------------------------------------------------------------
177
+ // ------------------------------------------------------------------
210
178
  /** Decodes a value using transform decoders if available. Does not ensure correct results. */
211
179
  var DecodeTransform;
212
180
  (function (DecodeTransform) {
@@ -218,89 +186,109 @@ var DecodeTransform;
218
186
  throw new TransformDecodeError(schema, value, error);
219
187
  }
220
188
  }
189
+ // prettier-ignore
221
190
  function TArray(schema, references, value) {
222
- const elements1 = value.map((value) => Visit(schema.items, references, value));
223
- return Default(schema, elements1);
191
+ return ((0, guard_1.IsArray)(value))
192
+ ? Default(schema, value.map((value) => Visit(schema.items, references, value)))
193
+ : Default(schema, value);
224
194
  }
195
+ // prettier-ignore
225
196
  function TIntersect(schema, references, value) {
226
197
  if (!(0, guard_1.IsPlainObject)(value) || (0, guard_1.IsValueType)(value))
227
198
  return Default(schema, value);
228
- const keys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
229
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
230
- return !keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(Types.IndexedAccessor.Resolve(schema, [key]), value) };
231
- }, {});
232
- if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties))
233
- return Default(schema, properties1);
234
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
235
- return keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(schema.unevaluatedProperties, value) };
236
- }, {});
237
- return Default(schema, properties2);
199
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
200
+ const knownProperties = knownKeys.reduce((value, key) => {
201
+ return (key in value)
202
+ ? { ...value, [key]: Visit(Types.IndexedAccessor.Resolve(schema, [key]), references, value[key]) }
203
+ : value;
204
+ }, value);
205
+ if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties)) {
206
+ return Default(schema, knownProperties);
207
+ }
208
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
209
+ const unevaluatedProperties = schema.unevaluatedProperties;
210
+ const unknownProperties = unknownKeys.reduce((value, key) => {
211
+ return !knownKeys.includes(key)
212
+ ? { ...value, [key]: Default(unevaluatedProperties, value[key]) }
213
+ : value;
214
+ }, knownProperties);
215
+ return Default(schema, unknownProperties);
238
216
  }
239
217
  function TNot(schema, references, value) {
240
- const value1 = Visit(schema.not, references, value);
241
- return Default(schema, value1);
218
+ return Default(schema, Visit(schema.not, references, value));
242
219
  }
220
+ // prettier-ignore
243
221
  function TObject(schema, references, value) {
244
222
  if (!(0, guard_1.IsPlainObject)(value))
245
223
  return Default(schema, value);
246
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
247
- return !(key in schema.properties) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(schema.properties[key], references, value) };
248
- }, {});
249
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
250
- return Default(schema, properties1);
224
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
225
+ const knownProperties = knownKeys.reduce((value, key) => {
226
+ return (key in value)
227
+ ? { ...value, [key]: Visit(schema.properties[key], references, value[key]) }
228
+ : value;
229
+ }, value);
230
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
231
+ return Default(schema, knownProperties);
232
+ }
233
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
251
234
  const additionalProperties = schema.additionalProperties;
252
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
253
- return key in schema.properties ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
254
- }, {});
255
- return Default(schema, properties2);
256
- }
235
+ const unknownProperties = unknownKeys.reduce((value, key) => {
236
+ return !knownKeys.includes(key)
237
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
238
+ : value;
239
+ }, knownProperties);
240
+ return Default(schema, unknownProperties);
241
+ }
242
+ // prettier-ignore
257
243
  function TRecord(schema, references, value) {
258
244
  if (!(0, guard_1.IsPlainObject)(value))
259
245
  return Default(schema, value);
260
246
  const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
261
- const property = schema.patternProperties[pattern];
262
- const regex = new RegExp(pattern);
263
- const properties1 = Object.entries(value).reduce((acc, [key, value]) => {
264
- return !regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(property, references, value) };
265
- }, {});
266
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
267
- return Default(schema, properties1);
247
+ const knownKeys = new RegExp(pattern);
248
+ const knownProperties = Object.getOwnPropertyNames(value).reduce((value, key) => {
249
+ return knownKeys.test(key)
250
+ ? { ...value, [key]: Visit(schema.patternProperties[pattern], references, value[key]) }
251
+ : value;
252
+ }, value);
253
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
254
+ return Default(schema, knownProperties);
255
+ }
256
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
268
257
  const additionalProperties = schema.additionalProperties;
269
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
270
- return regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
271
- }, {});
272
- return Default(schema, properties2);
258
+ const unknownProperties = unknownKeys.reduce((value, key) => {
259
+ return !knownKeys.test(key)
260
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
261
+ : value;
262
+ }, knownProperties);
263
+ return Default(schema, unknownProperties);
273
264
  }
274
265
  function TRef(schema, references, value) {
275
266
  const target = (0, deref_1.Deref)(schema, references);
276
- const resolved = Visit(target, references, value);
277
- return Default(schema, resolved);
267
+ return Default(schema, Visit(target, references, value));
278
268
  }
279
269
  function TThis(schema, references, value) {
280
270
  const target = (0, deref_1.Deref)(schema, references);
281
- const resolved = Visit(target, references, value);
282
- return Default(schema, resolved);
271
+ return Default(schema, Visit(target, references, value));
283
272
  }
273
+ // prettier-ignore
284
274
  function TTuple(schema, references, value) {
285
- const value1 = (0, guard_1.IsArray)(schema.items) ? schema.items.map((schema, index) => Visit(schema, references, value[index])) : [];
286
- return Default(schema, value1);
275
+ return ((0, guard_1.IsArray)(value) && (0, guard_1.IsArray)(schema.items))
276
+ ? Default(schema, schema.items.map((schema, index) => Visit(schema, references, value[index])))
277
+ : Default(schema, value);
287
278
  }
288
279
  function TUnion(schema, references, value) {
289
- const value1 = Default(schema, value);
280
+ const defaulted = Default(schema, value);
290
281
  for (const subschema of schema.anyOf) {
291
- if (!(0, check_1.Check)(subschema, references, value1))
282
+ if (!(0, check_1.Check)(subschema, references, defaulted))
292
283
  continue;
293
- return Visit(subschema, references, value1);
284
+ return Visit(subschema, references, defaulted);
294
285
  }
295
- return value1;
286
+ return defaulted;
296
287
  }
297
288
  function Visit(schema, references, value) {
298
289
  const references_ = typeof schema.$id === 'string' ? [...references, schema] : references;
299
290
  const schema_ = schema;
300
291
  switch (schema[Types.Kind]) {
301
- // ------------------------------------------------------
302
- // Structural
303
- // ------------------------------------------------------
304
292
  case 'Array':
305
293
  return TArray(schema_, references_, value);
306
294
  case 'Intersect':
@@ -321,33 +309,7 @@ var DecodeTransform;
321
309
  return TTuple(schema_, references_, value);
322
310
  case 'Union':
323
311
  return TUnion(schema_, references_, value);
324
- // ------------------------------------------------------
325
- // Default
326
- // ------------------------------------------------------
327
- case 'Any':
328
- case 'AsyncIterator':
329
- case 'BigInt':
330
- case 'Boolean':
331
- case 'Constructor':
332
- case 'Date':
333
- case 'Function':
334
- case 'Integer':
335
- case 'Iterator':
336
- case 'Literal':
337
- case 'Never':
338
- case 'Null':
339
- case 'Number':
340
- case 'Promise':
341
- case 'String':
342
- case 'TemplateLiteral':
343
- case 'Undefined':
344
- case 'Uint8Array':
345
- case 'Unknown':
346
- case 'Void':
347
- return Default(schema_, value);
348
312
  default:
349
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
350
- throw new TransformUnknownTypeError(schema_);
351
313
  return Default(schema_, value);
352
314
  }
353
315
  }
@@ -356,9 +318,9 @@ var DecodeTransform;
356
318
  }
357
319
  DecodeTransform.Decode = Decode;
358
320
  })(DecodeTransform || (exports.DecodeTransform = DecodeTransform = {}));
359
- // -------------------------------------------------------------------------
321
+ // ------------------------------------------------------------------
360
322
  // DecodeTransform
361
- // -------------------------------------------------------------------------
323
+ // ------------------------------------------------------------------
362
324
  /** Encodes a value using transform encoders if available. Does not ensure correct results. */
363
325
  var EncodeTransform;
364
326
  (function (EncodeTransform) {
@@ -370,58 +332,82 @@ var EncodeTransform;
370
332
  throw new TransformEncodeError(schema, value, error);
371
333
  }
372
334
  }
335
+ // prettier-ignore
373
336
  function TArray(schema, references, value) {
374
- const elements1 = Default(schema, value);
375
- return elements1.map((value) => Visit(schema.items, references, value));
337
+ const defaulted = Default(schema, value);
338
+ return (0, guard_1.IsArray)(defaulted)
339
+ ? defaulted.map((value) => Visit(schema.items, references, value))
340
+ : defaulted;
376
341
  }
342
+ // prettier-ignore
377
343
  function TIntersect(schema, references, value) {
378
- const properties1 = Default(schema, value);
344
+ const defaulted = Default(schema, value);
379
345
  if (!(0, guard_1.IsPlainObject)(value) || (0, guard_1.IsValueType)(value))
380
- return properties1;
381
- const keys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
382
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
383
- return !keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(Types.IndexedAccessor.Resolve(schema, [key]), value) };
384
- }, {});
385
- if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties))
386
- return Default(schema, properties2);
387
- return Object.entries(properties2).reduce((acc, [key, value]) => {
388
- return keys.includes(key) ? { ...acc, [key]: value } : { ...acc, [key]: Default(schema.unevaluatedProperties, value) };
389
- }, {});
346
+ return defaulted;
347
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
348
+ const knownProperties = knownKeys.reduce((value, key) => {
349
+ return key in defaulted
350
+ ? { ...value, [key]: Visit(Types.IndexedAccessor.Resolve(schema, [key]), references, value[key]) }
351
+ : value;
352
+ }, defaulted);
353
+ if (!Types.TypeGuard.TTransform(schema.unevaluatedProperties)) {
354
+ return Default(schema, knownProperties);
355
+ }
356
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
357
+ const unevaluatedProperties = schema.unevaluatedProperties;
358
+ return unknownKeys.reduce((value, key) => {
359
+ return !knownKeys.includes(key)
360
+ ? { ...value, [key]: Default(unevaluatedProperties, value[key]) }
361
+ : value;
362
+ }, knownProperties);
390
363
  }
391
364
  function TNot(schema, references, value) {
392
- const value1 = Default(schema, value);
393
- return Default(schema.not, value1);
365
+ return Default(schema.not, Default(schema, value));
394
366
  }
367
+ // prettier-ignore
395
368
  function TObject(schema, references, value) {
396
- const properties1 = Default(schema, value);
369
+ const defaulted = Default(schema, value);
397
370
  if (!(0, guard_1.IsPlainObject)(value))
398
- return properties1;
399
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
400
- return !(key in schema.properties) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(schema.properties[key], references, value) };
401
- }, {});
402
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
403
- return properties2;
371
+ return defaulted;
372
+ const knownKeys = Types.KeyResolver.ResolveKeys(schema, { includePatterns: false });
373
+ const knownProperties = knownKeys.reduce((value, key) => {
374
+ return key in value
375
+ ? { ...value, [key]: Visit(schema.properties[key], references, value[key]) }
376
+ : value;
377
+ }, defaulted);
378
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
379
+ return knownProperties;
380
+ }
381
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
404
382
  const additionalProperties = schema.additionalProperties;
405
- return Object.entries(properties2).reduce((acc, [key, value]) => {
406
- return key in schema.properties ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
407
- }, {});
383
+ return unknownKeys.reduce((value, key) => {
384
+ return !knownKeys.includes(key)
385
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
386
+ : value;
387
+ }, knownProperties);
408
388
  }
389
+ // prettier-ignore
409
390
  function TRecord(schema, references, value) {
410
- const properties1 = Default(schema, value);
391
+ const defaulted = Default(schema, value);
411
392
  if (!(0, guard_1.IsPlainObject)(value))
412
- return properties1;
393
+ return defaulted;
413
394
  const pattern = Object.getOwnPropertyNames(schema.patternProperties)[0];
414
- const property = schema.patternProperties[pattern];
415
- const regex = new RegExp(pattern);
416
- const properties2 = Object.entries(properties1).reduce((acc, [key, value]) => {
417
- return !regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(property, references, value) };
418
- }, {});
419
- if (!Types.TypeGuard.TSchema(schema.additionalProperties))
420
- return Default(schema, properties2);
395
+ const knownKeys = new RegExp(pattern);
396
+ const knownProperties = Object.getOwnPropertyNames(value).reduce((value, key) => {
397
+ return knownKeys.test(key)
398
+ ? { ...value, [key]: Visit(schema.patternProperties[pattern], references, value[key]) }
399
+ : value;
400
+ }, defaulted);
401
+ if (!Types.TypeGuard.TSchema(schema.additionalProperties)) {
402
+ return Default(schema, knownProperties);
403
+ }
404
+ const unknownKeys = Object.getOwnPropertyNames(knownProperties);
421
405
  const additionalProperties = schema.additionalProperties;
422
- return Object.entries(properties2).reduce((acc, [key, value]) => {
423
- return regex.test(key) ? { ...acc, [key]: value } : { ...acc, [key]: Visit(additionalProperties, references, value) };
424
- }, {});
406
+ return unknownKeys.reduce((value, key) => {
407
+ return !knownKeys.test(key)
408
+ ? { ...value, [key]: Default(additionalProperties, value[key]) }
409
+ : value;
410
+ }, knownProperties);
425
411
  }
426
412
  function TRef(schema, references, value) {
427
413
  const target = (0, deref_1.Deref)(schema, references);
@@ -458,9 +444,6 @@ var EncodeTransform;
458
444
  const references_ = typeof schema.$id === 'string' ? [...references, schema] : references;
459
445
  const schema_ = schema;
460
446
  switch (schema[Types.Kind]) {
461
- // ------------------------------------------------------
462
- // Structural
463
- // ------------------------------------------------------
464
447
  case 'Array':
465
448
  return TArray(schema_, references_, value);
466
449
  case 'Intersect':
@@ -479,34 +462,7 @@ var EncodeTransform;
479
462
  return TTuple(schema_, references_, value);
480
463
  case 'Union':
481
464
  return TUnion(schema_, references_, value);
482
- // ------------------------------------------------------
483
- // Apply
484
- // ------------------------------------------------------
485
- case 'Any':
486
- case 'AsyncIterator':
487
- case 'BigInt':
488
- case 'Boolean':
489
- case 'Constructor':
490
- case 'Date':
491
- case 'Function':
492
- case 'Integer':
493
- case 'Iterator':
494
- case 'Literal':
495
- case 'Never':
496
- case 'Null':
497
- case 'Number':
498
- case 'Promise':
499
- case 'String':
500
- case 'Symbol':
501
- case 'TemplateLiteral':
502
- case 'Undefined':
503
- case 'Uint8Array':
504
- case 'Unknown':
505
- case 'Void':
506
- return Default(schema_, value);
507
465
  default:
508
- if (!Types.TypeRegistry.Has(schema_[Types.Kind]))
509
- throw new TransformUnknownTypeError(schema_);
510
466
  return Default(schema_, value);
511
467
  }
512
468
  }