@sinclair/typebox 0.26.6 → 0.26.8

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.
@@ -341,6 +341,10 @@ var TypeCompiler;
341
341
  }
342
342
  function* Record(schema, references, value) {
343
343
  yield IsRecordCheck(value);
344
+ if (IsNumber(schema.minProperties))
345
+ yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`;
346
+ if (IsNumber(schema.maxProperties))
347
+ yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`;
344
348
  const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0];
345
349
  const local = PushLocal(`new RegExp(/${keyPattern}/)`);
346
350
  yield `(Object.getOwnPropertyNames(${value}).every(key => ${local}.test(key)))`;
package/errors/errors.js CHANGED
@@ -401,6 +401,12 @@ var ValueErrors;
401
401
  if (!IsRecordObject(value)) {
402
402
  return yield { type: ValueErrorType.Object, schema, path, value, message: `Expected record object` };
403
403
  }
404
+ if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) {
405
+ yield { type: ValueErrorType.ObjectMinProperties, schema, path, value, message: `Expected object to have at least ${schema.minProperties} properties` };
406
+ }
407
+ if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) {
408
+ yield { type: ValueErrorType.ObjectMaxProperties, schema, path, value, message: `Expected object to have less than ${schema.minProperties} properties` };
409
+ }
404
410
  const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0];
405
411
  const regex = new RegExp(keyPattern);
406
412
  if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinclair/typebox",
3
- "version": "0.26.6",
3
+ "version": "0.26.8",
4
4
  "description": "JSONSchema Type Builder with Static Type Resolution for TypeScript",
5
5
  "keywords": [
6
6
  "typescript",
package/readme.md CHANGED
@@ -444,12 +444,12 @@ The following table lists the Standard TypeBox types. These types are fully comp
444
444
  │ │ │ } │
445
445
  │ │ │ │
446
446
  ├────────────────────────────────┼─────────────────────────────┼────────────────────────────────┤
447
- │ const A = Type.Object({ │ type A = { │ const T = { │
448
- │ x: Type.Number(), │ x: number, │ $ref: 'A' │
447
+ │ const T = Type.Object({ │ type T = { │ const R = { │
448
+ │ x: Type.Number(), │ x: number, │ $ref: 'T' │
449
449
  │ y: Type.Number() │ y: number │ } │
450
450
  │ }, { $id: 'T' }) | } │ │
451
451
  │ │ │ │
452
- │ const T = Type.Ref(A) │ type T = A │ │
452
+ │ const R = Type.Ref(T) │ type R = T │ │
453
453
  │ │ │ │
454
454
  │ │ │ │
455
455
  │ │ │ │
package/typebox.d.ts CHANGED
@@ -477,6 +477,8 @@ export declare namespace TypeGuard {
477
477
  function TUint8Array(schema: unknown): schema is TUint8Array;
478
478
  /** Returns true if the given schema is TUnknown */
479
479
  function TUnknown(schema: unknown): schema is TUnknown;
480
+ /** Returns true if the given schema is a raw TUnsafe */
481
+ function TUnsafe(schema: unknown): schema is TUnsafe<unknown>;
480
482
  /** Returns true if the given schema is TVoid */
481
483
  function TVoid(schema: unknown): schema is TVoid;
482
484
  /** Returns true if this schema has the ReadonlyOptional modifier */
package/typebox.js CHANGED
@@ -513,6 +513,13 @@ var TypeGuard;
513
513
  IsOptionalString(schema.$id));
514
514
  }
515
515
  TypeGuard.TUnknown = TUnknown;
516
+ /** Returns true if the given schema is a raw TUnsafe */
517
+ function TUnsafe(schema) {
518
+ // prettier-ignore
519
+ return (TKind(schema) &&
520
+ schema[exports.Kind] === 'Unsafe');
521
+ }
522
+ TypeGuard.TUnsafe = TUnsafe;
516
523
  /** Returns true if the given schema is TVoid */
517
524
  function TVoid(schema) {
518
525
  // prettier-ignore
@@ -567,6 +574,7 @@ var TypeGuard;
567
574
  TUnion(schema) ||
568
575
  TUint8Array(schema) ||
569
576
  TUnknown(schema) ||
577
+ TUnsafe(schema) ||
570
578
  TVoid(schema) ||
571
579
  (TKind(schema) && TypeRegistry.Has(schema[exports.Kind]))));
572
580
  }
package/value/check.js CHANGED
@@ -291,6 +291,12 @@ var ValueCheck;
291
291
  if (!IsRecordObject(value)) {
292
292
  return false;
293
293
  }
294
+ if (IsDefined(schema.minProperties) && !(globalThis.Object.getOwnPropertyNames(value).length >= schema.minProperties)) {
295
+ return false;
296
+ }
297
+ if (IsDefined(schema.maxProperties) && !(globalThis.Object.getOwnPropertyNames(value).length <= schema.maxProperties)) {
298
+ return false;
299
+ }
294
300
  const [keyPattern, valueSchema] = globalThis.Object.entries(schema.patternProperties)[0];
295
301
  const regex = new RegExp(keyPattern);
296
302
  if (!globalThis.Object.getOwnPropertyNames(value).every((key) => regex.test(key))) {