zod 4.0.6 → 4.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod",
3
- "version": "4.0.6",
3
+ "version": "4.0.8",
4
4
  "type": "module",
5
5
  "author": "Colin McDonnell <zod@colinhacks.com>",
6
6
  "description": "TypeScript-first schema declaration and validation library with static type inference",
@@ -346,12 +346,6 @@ test("do not continue by default", () => {
346
346
  "code": "custom",
347
347
  "message": "custom error",
348
348
  "path": []
349
- },
350
- {
351
- "expected": "number",
352
- "code": "invalid_type",
353
- "path": [],
354
- "message": "Invalid input: expected number, received string"
355
349
  }
356
350
  ]],
357
351
  "success": false,
@@ -3445,7 +3445,7 @@ export const $ZodPipe: core.$constructor<$ZodPipe> = /*@__PURE__*/ core.$constru
3445
3445
  });
3446
3446
 
3447
3447
  function handlePipeResult(left: ParsePayload, def: $ZodPipeDef, ctx: ParseContext) {
3448
- if (util.aborted(left)) {
3448
+ if (left.issues.length) {
3449
3449
  return left;
3450
3450
  }
3451
3451
  return def.out._zod.run({ value: left.value, issues: left.issues }, ctx);
@@ -0,0 +1,18 @@
1
+ import { test } from "vitest";
2
+ import * as z from "zod/v4";
3
+
4
+ test("extend chaining preserves and overrides properties", () => {
5
+ const schema1 = z.object({
6
+ email: z.string(),
7
+ });
8
+
9
+ const schema2 = schema1.extend({
10
+ email: schema1.shape.email.check(z.email()),
11
+ });
12
+
13
+ const schema3 = schema2.extend({
14
+ email: schema2.shape.email.or(z.literal("")),
15
+ });
16
+
17
+ schema3.parse({ email: "test@example.com" });
18
+ });
@@ -283,10 +283,19 @@ export function assignProp<T extends object, K extends PropertyKey>(
283
283
  });
284
284
  }
285
285
 
286
+ export function mergeDefs(...defs: Record<string, any>[]): any {
287
+ const mergedDescriptors: Record<string, PropertyDescriptor> = {};
288
+
289
+ for (const def of defs) {
290
+ const descriptors = Object.getOwnPropertyDescriptors(def);
291
+ Object.assign(mergedDescriptors, descriptors);
292
+ }
293
+
294
+ return Object.defineProperties({}, mergedDescriptors);
295
+ }
296
+
286
297
  export function cloneDef(schema: schemas.$ZodType): any {
287
- const def: any = {};
288
- Object.defineProperties(def, Object.getOwnPropertyDescriptors(schema._zod.def));
289
- return def;
298
+ return mergeDefs(schema._zod.def);
290
299
  }
291
300
 
292
301
  export function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any {
@@ -545,26 +554,21 @@ export const BIGINT_FORMAT_RANGES: Record<checks.$ZodBigIntFormats, [bigint, big
545
554
  export function pick(schema: schemas.$ZodObject, mask: Record<string, unknown>): any {
546
555
  const currDef = schema._zod.def;
547
556
 
548
- const def = cloneDef(schema);
549
- Object.defineProperties(def, {
550
- shape: {
551
- get() {
552
- const newShape: Writeable<schemas.$ZodShape> = {};
553
- for (const key in mask) {
554
- if (!(key in currDef.shape)) {
555
- throw new Error(`Unrecognized key: "${key}"`);
556
- }
557
- if (!mask[key]) continue;
558
- newShape[key] = currDef.shape[key]!;
557
+ const def = mergeDefs(schema._zod.def, {
558
+ get shape() {
559
+ const newShape: Writeable<schemas.$ZodShape> = {};
560
+ for (const key in mask) {
561
+ if (!(key in currDef.shape)) {
562
+ throw new Error(`Unrecognized key: "${key}"`);
559
563
  }
564
+ if (!mask[key]) continue;
565
+ newShape[key] = currDef.shape[key]!;
566
+ }
560
567
 
561
- assignProp(this, "shape", newShape); // self-caching
562
- return newShape;
563
- },
564
- },
565
- checks: {
566
- value: [],
568
+ assignProp(this, "shape", newShape); // self-caching
569
+ return newShape;
567
570
  },
571
+ checks: [],
568
572
  });
569
573
 
570
574
  return clone(schema, def) as any;
@@ -573,26 +577,21 @@ export function pick(schema: schemas.$ZodObject, mask: Record<string, unknown>):
573
577
  export function omit(schema: schemas.$ZodObject, mask: object): any {
574
578
  const currDef = schema._zod.def;
575
579
 
576
- const def = cloneDef(schema);
577
- Object.defineProperties(def, {
578
- shape: {
579
- get() {
580
- const newShape: Writeable<schemas.$ZodShape> = { ...schema._zod.def.shape };
581
- for (const key in mask) {
582
- if (!(key in currDef.shape)) {
583
- throw new Error(`Unrecognized key: "${key}"`);
584
- }
585
- if (!(mask as any)[key]) continue;
586
-
587
- delete newShape[key];
580
+ const def = mergeDefs(schema._zod.def, {
581
+ get shape() {
582
+ const newShape: Writeable<schemas.$ZodShape> = { ...schema._zod.def.shape };
583
+ for (const key in mask) {
584
+ if (!(key in currDef.shape)) {
585
+ throw new Error(`Unrecognized key: "${key}"`);
588
586
  }
589
- assignProp(this, "shape", newShape); // self-caching
590
- return newShape;
591
- },
592
- },
593
- checks: {
594
- value: [],
587
+ if (!(mask as any)[key]) continue;
588
+
589
+ delete newShape[key];
590
+ }
591
+ assignProp(this, "shape", newShape); // self-caching
592
+ return newShape;
595
593
  },
594
+ checks: [],
596
595
  });
597
596
 
598
597
  return clone(schema, def);
@@ -603,40 +602,28 @@ export function extend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): an
603
602
  throw new Error("Invalid input to extend: expected a plain object");
604
603
  }
605
604
 
606
- const def = cloneDef(schema);
607
- Object.defineProperties(def, {
608
- shape: {
609
- get() {
610
- const _shape = { ...schema._zod.def.shape, ...shape };
611
- assignProp(this, "shape", _shape); // self-caching
612
- return _shape;
613
- },
614
- },
615
- checks: {
616
- value: [],
605
+ const def = mergeDefs(schema._zod.def, {
606
+ get shape() {
607
+ const _shape = { ...schema._zod.def.shape, ...shape };
608
+ assignProp(this, "shape", _shape); // self-caching
609
+ return _shape;
617
610
  },
611
+ checks: [],
618
612
  });
619
613
  return clone(schema, def) as any;
620
614
  }
621
615
 
622
616
  export function merge(a: schemas.$ZodObject, b: schemas.$ZodObject): any {
623
- const def = cloneDef(a);
624
- Object.defineProperties(def, {
625
- shape: {
626
- get() {
627
- const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
628
- assignProp(this, "shape", _shape); // self-caching
629
- return _shape;
630
- },
617
+ const def = mergeDefs(a._zod.def, {
618
+ get shape() {
619
+ const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
620
+ assignProp(this, "shape", _shape); // self-caching
621
+ return _shape;
631
622
  },
632
- catchall: {
633
- get() {
634
- return b._zod.def.catchall;
635
- },
636
- },
637
- checks: {
638
- value: [], // delete existing checks
623
+ get catchall() {
624
+ return b._zod.def.catchall;
639
625
  },
626
+ checks: [], // delete existing checks
640
627
  });
641
628
 
642
629
  return clone(a, def) as any;
@@ -647,46 +634,41 @@ export function partial(
647
634
  schema: schemas.$ZodObject,
648
635
  mask: object | undefined
649
636
  ): any {
650
- const def = cloneDef(schema);
651
- Object.defineProperties(def, {
652
- shape: {
653
- get() {
654
- const oldShape = schema._zod.def.shape;
655
- const shape: Writeable<schemas.$ZodShape> = { ...oldShape };
656
-
657
- if (mask) {
658
- for (const key in mask) {
659
- if (!(key in oldShape)) {
660
- throw new Error(`Unrecognized key: "${key}"`);
661
- }
662
- if (!(mask as any)[key]) continue;
663
- // if (oldShape[key]!._zod.optin === "optional") continue;
664
- shape[key] = Class
665
- ? new Class({
666
- type: "optional",
667
- innerType: oldShape[key]!,
668
- })
669
- : oldShape[key]!;
670
- }
671
- } else {
672
- for (const key in oldShape) {
673
- // if (oldShape[key]!._zod.optin === "optional") continue;
674
- shape[key] = Class
675
- ? new Class({
676
- type: "optional",
677
- innerType: oldShape[key]!,
678
- })
679
- : oldShape[key]!;
637
+ const def = mergeDefs(schema._zod.def, {
638
+ get shape() {
639
+ const oldShape = schema._zod.def.shape;
640
+ const shape: Writeable<schemas.$ZodShape> = { ...oldShape };
641
+
642
+ if (mask) {
643
+ for (const key in mask) {
644
+ if (!(key in oldShape)) {
645
+ throw new Error(`Unrecognized key: "${key}"`);
680
646
  }
647
+ if (!(mask as any)[key]) continue;
648
+ // if (oldShape[key]!._zod.optin === "optional") continue;
649
+ shape[key] = Class
650
+ ? new Class({
651
+ type: "optional",
652
+ innerType: oldShape[key]!,
653
+ })
654
+ : oldShape[key]!;
655
+ }
656
+ } else {
657
+ for (const key in oldShape) {
658
+ // if (oldShape[key]!._zod.optin === "optional") continue;
659
+ shape[key] = Class
660
+ ? new Class({
661
+ type: "optional",
662
+ innerType: oldShape[key]!,
663
+ })
664
+ : oldShape[key]!;
681
665
  }
666
+ }
682
667
 
683
- assignProp(this, "shape", shape); // self-caching
684
- return shape;
685
- },
686
- },
687
- checks: {
688
- value: [],
668
+ assignProp(this, "shape", shape); // self-caching
669
+ return shape;
689
670
  },
671
+ checks: [],
690
672
  });
691
673
 
692
674
  return clone(schema, def) as any;
@@ -697,42 +679,37 @@ export function required(
697
679
  schema: schemas.$ZodObject,
698
680
  mask: object | undefined
699
681
  ): any {
700
- const def = cloneDef(schema);
701
- Object.defineProperties(def, {
702
- shape: {
703
- get() {
704
- const oldShape = schema._zod.def.shape;
705
- const shape: Writeable<schemas.$ZodShape> = { ...oldShape };
706
-
707
- if (mask) {
708
- for (const key in mask) {
709
- if (!(key in shape)) {
710
- throw new Error(`Unrecognized key: "${key}"`);
711
- }
712
- if (!(mask as any)[key]) continue;
713
- // overwrite with non-optional
714
- shape[key] = new Class({
715
- type: "nonoptional",
716
- innerType: oldShape[key]!,
717
- });
718
- }
719
- } else {
720
- for (const key in oldShape) {
721
- // overwrite with non-optional
722
- shape[key] = new Class({
723
- type: "nonoptional",
724
- innerType: oldShape[key]!,
725
- });
682
+ const def = mergeDefs(schema._zod.def, {
683
+ get shape() {
684
+ const oldShape = schema._zod.def.shape;
685
+ const shape: Writeable<schemas.$ZodShape> = { ...oldShape };
686
+
687
+ if (mask) {
688
+ for (const key in mask) {
689
+ if (!(key in shape)) {
690
+ throw new Error(`Unrecognized key: "${key}"`);
726
691
  }
692
+ if (!(mask as any)[key]) continue;
693
+ // overwrite with non-optional
694
+ shape[key] = new Class({
695
+ type: "nonoptional",
696
+ innerType: oldShape[key]!,
697
+ });
698
+ }
699
+ } else {
700
+ for (const key in oldShape) {
701
+ // overwrite with non-optional
702
+ shape[key] = new Class({
703
+ type: "nonoptional",
704
+ innerType: oldShape[key]!,
705
+ });
727
706
  }
707
+ }
728
708
 
729
- assignProp(this, "shape", shape); // self-caching
730
- return shape;
731
- },
732
- },
733
- checks: {
734
- value: [],
709
+ assignProp(this, "shape", shape); // self-caching
710
+ return shape;
735
711
  },
712
+ checks: [],
736
713
  });
737
714
 
738
715
  return clone(schema, def) as any;
@@ -1,5 +1,5 @@
1
1
  export const version = {
2
2
  major: 4,
3
3
  minor: 0,
4
- patch: 6 as number,
4
+ patch: 8 as number,
5
5
  } as const;
@@ -1587,7 +1587,7 @@ exports.$ZodPipe = core.$constructor("$ZodPipe", (inst, def) => {
1587
1587
  };
1588
1588
  });
1589
1589
  function handlePipeResult(left, def, ctx) {
1590
- if (util.aborted(left)) {
1590
+ if (left.issues.length) {
1591
1591
  return left;
1592
1592
  }
1593
1593
  return def.out._zod.run({ value: left.value, issues: left.issues }, ctx);
@@ -1556,7 +1556,7 @@ export const $ZodPipe = /*@__PURE__*/ core.$constructor("$ZodPipe", (inst, def)
1556
1556
  };
1557
1557
  });
1558
1558
  function handlePipeResult(left, def, ctx) {
1559
- if (util.aborted(left)) {
1559
+ if (left.issues.length) {
1560
1560
  return left;
1561
1561
  }
1562
1562
  return def.out._zod.run({ value: left.value, issues: left.issues }, ctx);
package/v4/core/util.cjs CHANGED
@@ -15,6 +15,7 @@ exports.cleanRegex = cleanRegex;
15
15
  exports.floatSafeRemainder = floatSafeRemainder;
16
16
  exports.defineLazy = defineLazy;
17
17
  exports.assignProp = assignProp;
18
+ exports.mergeDefs = mergeDefs;
18
19
  exports.cloneDef = cloneDef;
19
20
  exports.getElementAtPath = getElementAtPath;
20
21
  exports.promiseAllObject = promiseAllObject;
@@ -128,10 +129,16 @@ function assignProp(target, prop, value) {
128
129
  configurable: true,
129
130
  });
130
131
  }
132
+ function mergeDefs(...defs) {
133
+ const mergedDescriptors = {};
134
+ for (const def of defs) {
135
+ const descriptors = Object.getOwnPropertyDescriptors(def);
136
+ Object.assign(mergedDescriptors, descriptors);
137
+ }
138
+ return Object.defineProperties({}, mergedDescriptors);
139
+ }
131
140
  function cloneDef(schema) {
132
- const def = {};
133
- Object.defineProperties(def, Object.getOwnPropertyDescriptors(schema._zod.def));
134
- return def;
141
+ return mergeDefs(schema._zod.def);
135
142
  }
136
143
  function getElementAtPath(obj, path) {
137
144
  if (!path)
@@ -336,51 +343,41 @@ exports.BIGINT_FORMAT_RANGES = {
336
343
  };
337
344
  function pick(schema, mask) {
338
345
  const currDef = schema._zod.def;
339
- const def = cloneDef(schema);
340
- Object.defineProperties(def, {
341
- shape: {
342
- get() {
343
- const newShape = {};
344
- for (const key in mask) {
345
- if (!(key in currDef.shape)) {
346
- throw new Error(`Unrecognized key: "${key}"`);
347
- }
348
- if (!mask[key])
349
- continue;
350
- newShape[key] = currDef.shape[key];
346
+ const def = mergeDefs(schema._zod.def, {
347
+ get shape() {
348
+ const newShape = {};
349
+ for (const key in mask) {
350
+ if (!(key in currDef.shape)) {
351
+ throw new Error(`Unrecognized key: "${key}"`);
351
352
  }
352
- assignProp(this, "shape", newShape); // self-caching
353
- return newShape;
354
- },
355
- },
356
- checks: {
357
- value: [],
353
+ if (!mask[key])
354
+ continue;
355
+ newShape[key] = currDef.shape[key];
356
+ }
357
+ assignProp(this, "shape", newShape); // self-caching
358
+ return newShape;
358
359
  },
360
+ checks: [],
359
361
  });
360
362
  return clone(schema, def);
361
363
  }
362
364
  function omit(schema, mask) {
363
365
  const currDef = schema._zod.def;
364
- const def = cloneDef(schema);
365
- Object.defineProperties(def, {
366
- shape: {
367
- get() {
368
- const newShape = { ...schema._zod.def.shape };
369
- for (const key in mask) {
370
- if (!(key in currDef.shape)) {
371
- throw new Error(`Unrecognized key: "${key}"`);
372
- }
373
- if (!mask[key])
374
- continue;
375
- delete newShape[key];
366
+ const def = mergeDefs(schema._zod.def, {
367
+ get shape() {
368
+ const newShape = { ...schema._zod.def.shape };
369
+ for (const key in mask) {
370
+ if (!(key in currDef.shape)) {
371
+ throw new Error(`Unrecognized key: "${key}"`);
376
372
  }
377
- assignProp(this, "shape", newShape); // self-caching
378
- return newShape;
379
- },
380
- },
381
- checks: {
382
- value: [],
373
+ if (!mask[key])
374
+ continue;
375
+ delete newShape[key];
376
+ }
377
+ assignProp(this, "shape", newShape); // self-caching
378
+ return newShape;
383
379
  },
380
+ checks: [],
384
381
  });
385
382
  return clone(schema, def);
386
383
  }
@@ -388,123 +385,101 @@ function extend(schema, shape) {
388
385
  if (!isPlainObject(shape)) {
389
386
  throw new Error("Invalid input to extend: expected a plain object");
390
387
  }
391
- const def = cloneDef(schema);
392
- Object.defineProperties(def, {
393
- shape: {
394
- get() {
395
- const _shape = { ...schema._zod.def.shape, ...shape };
396
- assignProp(this, "shape", _shape); // self-caching
397
- return _shape;
398
- },
399
- },
400
- checks: {
401
- value: [],
388
+ const def = mergeDefs(schema._zod.def, {
389
+ get shape() {
390
+ const _shape = { ...schema._zod.def.shape, ...shape };
391
+ assignProp(this, "shape", _shape); // self-caching
392
+ return _shape;
402
393
  },
394
+ checks: [],
403
395
  });
404
396
  return clone(schema, def);
405
397
  }
406
398
  function merge(a, b) {
407
- const def = cloneDef(a);
408
- Object.defineProperties(def, {
409
- shape: {
410
- get() {
411
- const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
412
- assignProp(this, "shape", _shape); // self-caching
413
- return _shape;
414
- },
399
+ const def = mergeDefs(a._zod.def, {
400
+ get shape() {
401
+ const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
402
+ assignProp(this, "shape", _shape); // self-caching
403
+ return _shape;
415
404
  },
416
- catchall: {
417
- get() {
418
- return b._zod.def.catchall;
419
- },
420
- },
421
- checks: {
422
- value: [], // delete existing checks
405
+ get catchall() {
406
+ return b._zod.def.catchall;
423
407
  },
408
+ checks: [], // delete existing checks
424
409
  });
425
410
  return clone(a, def);
426
411
  }
427
412
  function partial(Class, schema, mask) {
428
- const def = cloneDef(schema);
429
- Object.defineProperties(def, {
430
- shape: {
431
- get() {
432
- const oldShape = schema._zod.def.shape;
433
- const shape = { ...oldShape };
434
- if (mask) {
435
- for (const key in mask) {
436
- if (!(key in oldShape)) {
437
- throw new Error(`Unrecognized key: "${key}"`);
438
- }
439
- if (!mask[key])
440
- continue;
441
- // if (oldShape[key]!._zod.optin === "optional") continue;
442
- shape[key] = Class
443
- ? new Class({
444
- type: "optional",
445
- innerType: oldShape[key],
446
- })
447
- : oldShape[key];
413
+ const def = mergeDefs(schema._zod.def, {
414
+ get shape() {
415
+ const oldShape = schema._zod.def.shape;
416
+ const shape = { ...oldShape };
417
+ if (mask) {
418
+ for (const key in mask) {
419
+ if (!(key in oldShape)) {
420
+ throw new Error(`Unrecognized key: "${key}"`);
448
421
  }
422
+ if (!mask[key])
423
+ continue;
424
+ // if (oldShape[key]!._zod.optin === "optional") continue;
425
+ shape[key] = Class
426
+ ? new Class({
427
+ type: "optional",
428
+ innerType: oldShape[key],
429
+ })
430
+ : oldShape[key];
449
431
  }
450
- else {
451
- for (const key in oldShape) {
452
- // if (oldShape[key]!._zod.optin === "optional") continue;
453
- shape[key] = Class
454
- ? new Class({
455
- type: "optional",
456
- innerType: oldShape[key],
457
- })
458
- : oldShape[key];
459
- }
432
+ }
433
+ else {
434
+ for (const key in oldShape) {
435
+ // if (oldShape[key]!._zod.optin === "optional") continue;
436
+ shape[key] = Class
437
+ ? new Class({
438
+ type: "optional",
439
+ innerType: oldShape[key],
440
+ })
441
+ : oldShape[key];
460
442
  }
461
- assignProp(this, "shape", shape); // self-caching
462
- return shape;
463
- },
464
- },
465
- checks: {
466
- value: [],
443
+ }
444
+ assignProp(this, "shape", shape); // self-caching
445
+ return shape;
467
446
  },
447
+ checks: [],
468
448
  });
469
449
  return clone(schema, def);
470
450
  }
471
451
  function required(Class, schema, mask) {
472
- const def = cloneDef(schema);
473
- Object.defineProperties(def, {
474
- shape: {
475
- get() {
476
- const oldShape = schema._zod.def.shape;
477
- const shape = { ...oldShape };
478
- if (mask) {
479
- for (const key in mask) {
480
- if (!(key in shape)) {
481
- throw new Error(`Unrecognized key: "${key}"`);
482
- }
483
- if (!mask[key])
484
- continue;
485
- // overwrite with non-optional
486
- shape[key] = new Class({
487
- type: "nonoptional",
488
- innerType: oldShape[key],
489
- });
452
+ const def = mergeDefs(schema._zod.def, {
453
+ get shape() {
454
+ const oldShape = schema._zod.def.shape;
455
+ const shape = { ...oldShape };
456
+ if (mask) {
457
+ for (const key in mask) {
458
+ if (!(key in shape)) {
459
+ throw new Error(`Unrecognized key: "${key}"`);
490
460
  }
461
+ if (!mask[key])
462
+ continue;
463
+ // overwrite with non-optional
464
+ shape[key] = new Class({
465
+ type: "nonoptional",
466
+ innerType: oldShape[key],
467
+ });
491
468
  }
492
- else {
493
- for (const key in oldShape) {
494
- // overwrite with non-optional
495
- shape[key] = new Class({
496
- type: "nonoptional",
497
- innerType: oldShape[key],
498
- });
499
- }
469
+ }
470
+ else {
471
+ for (const key in oldShape) {
472
+ // overwrite with non-optional
473
+ shape[key] = new Class({
474
+ type: "nonoptional",
475
+ innerType: oldShape[key],
476
+ });
500
477
  }
501
- assignProp(this, "shape", shape); // self-caching
502
- return shape;
503
- },
504
- },
505
- checks: {
506
- value: [],
478
+ }
479
+ assignProp(this, "shape", shape); // self-caching
480
+ return shape;
507
481
  },
482
+ checks: [],
508
483
  });
509
484
  return clone(schema, def);
510
485
  }
@@ -121,6 +121,7 @@ export declare function cleanRegex(source: string): string;
121
121
  export declare function floatSafeRemainder(val: number, step: number): number;
122
122
  export declare function defineLazy<T, K extends keyof T>(object: T, key: K, getter: () => T[K]): void;
123
123
  export declare function assignProp<T extends object, K extends PropertyKey>(target: T, prop: K, value: K extends keyof T ? T[K] : any): void;
124
+ export declare function mergeDefs(...defs: Record<string, any>[]): any;
124
125
  export declare function cloneDef(schema: schemas.$ZodType): any;
125
126
  export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
126
127
  export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
package/v4/core/util.d.ts CHANGED
@@ -121,6 +121,7 @@ export declare function cleanRegex(source: string): string;
121
121
  export declare function floatSafeRemainder(val: number, step: number): number;
122
122
  export declare function defineLazy<T, K extends keyof T>(object: T, key: K, getter: () => T[K]): void;
123
123
  export declare function assignProp<T extends object, K extends PropertyKey>(target: T, prop: K, value: K extends keyof T ? T[K] : any): void;
124
+ export declare function mergeDefs(...defs: Record<string, any>[]): any;
124
125
  export declare function cloneDef(schema: schemas.$ZodType): any;
125
126
  export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
126
127
  export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
package/v4/core/util.js CHANGED
@@ -83,10 +83,16 @@ export function assignProp(target, prop, value) {
83
83
  configurable: true,
84
84
  });
85
85
  }
86
+ export function mergeDefs(...defs) {
87
+ const mergedDescriptors = {};
88
+ for (const def of defs) {
89
+ const descriptors = Object.getOwnPropertyDescriptors(def);
90
+ Object.assign(mergedDescriptors, descriptors);
91
+ }
92
+ return Object.defineProperties({}, mergedDescriptors);
93
+ }
86
94
  export function cloneDef(schema) {
87
- const def = {};
88
- Object.defineProperties(def, Object.getOwnPropertyDescriptors(schema._zod.def));
89
- return def;
95
+ return mergeDefs(schema._zod.def);
90
96
  }
91
97
  export function getElementAtPath(obj, path) {
92
98
  if (!path)
@@ -290,51 +296,41 @@ export const BIGINT_FORMAT_RANGES = {
290
296
  };
291
297
  export function pick(schema, mask) {
292
298
  const currDef = schema._zod.def;
293
- const def = cloneDef(schema);
294
- Object.defineProperties(def, {
295
- shape: {
296
- get() {
297
- const newShape = {};
298
- for (const key in mask) {
299
- if (!(key in currDef.shape)) {
300
- throw new Error(`Unrecognized key: "${key}"`);
301
- }
302
- if (!mask[key])
303
- continue;
304
- newShape[key] = currDef.shape[key];
299
+ const def = mergeDefs(schema._zod.def, {
300
+ get shape() {
301
+ const newShape = {};
302
+ for (const key in mask) {
303
+ if (!(key in currDef.shape)) {
304
+ throw new Error(`Unrecognized key: "${key}"`);
305
305
  }
306
- assignProp(this, "shape", newShape); // self-caching
307
- return newShape;
308
- },
309
- },
310
- checks: {
311
- value: [],
306
+ if (!mask[key])
307
+ continue;
308
+ newShape[key] = currDef.shape[key];
309
+ }
310
+ assignProp(this, "shape", newShape); // self-caching
311
+ return newShape;
312
312
  },
313
+ checks: [],
313
314
  });
314
315
  return clone(schema, def);
315
316
  }
316
317
  export function omit(schema, mask) {
317
318
  const currDef = schema._zod.def;
318
- const def = cloneDef(schema);
319
- Object.defineProperties(def, {
320
- shape: {
321
- get() {
322
- const newShape = { ...schema._zod.def.shape };
323
- for (const key in mask) {
324
- if (!(key in currDef.shape)) {
325
- throw new Error(`Unrecognized key: "${key}"`);
326
- }
327
- if (!mask[key])
328
- continue;
329
- delete newShape[key];
319
+ const def = mergeDefs(schema._zod.def, {
320
+ get shape() {
321
+ const newShape = { ...schema._zod.def.shape };
322
+ for (const key in mask) {
323
+ if (!(key in currDef.shape)) {
324
+ throw new Error(`Unrecognized key: "${key}"`);
330
325
  }
331
- assignProp(this, "shape", newShape); // self-caching
332
- return newShape;
333
- },
334
- },
335
- checks: {
336
- value: [],
326
+ if (!mask[key])
327
+ continue;
328
+ delete newShape[key];
329
+ }
330
+ assignProp(this, "shape", newShape); // self-caching
331
+ return newShape;
337
332
  },
333
+ checks: [],
338
334
  });
339
335
  return clone(schema, def);
340
336
  }
@@ -342,123 +338,101 @@ export function extend(schema, shape) {
342
338
  if (!isPlainObject(shape)) {
343
339
  throw new Error("Invalid input to extend: expected a plain object");
344
340
  }
345
- const def = cloneDef(schema);
346
- Object.defineProperties(def, {
347
- shape: {
348
- get() {
349
- const _shape = { ...schema._zod.def.shape, ...shape };
350
- assignProp(this, "shape", _shape); // self-caching
351
- return _shape;
352
- },
353
- },
354
- checks: {
355
- value: [],
341
+ const def = mergeDefs(schema._zod.def, {
342
+ get shape() {
343
+ const _shape = { ...schema._zod.def.shape, ...shape };
344
+ assignProp(this, "shape", _shape); // self-caching
345
+ return _shape;
356
346
  },
347
+ checks: [],
357
348
  });
358
349
  return clone(schema, def);
359
350
  }
360
351
  export function merge(a, b) {
361
- const def = cloneDef(a);
362
- Object.defineProperties(def, {
363
- shape: {
364
- get() {
365
- const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
366
- assignProp(this, "shape", _shape); // self-caching
367
- return _shape;
368
- },
352
+ const def = mergeDefs(a._zod.def, {
353
+ get shape() {
354
+ const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
355
+ assignProp(this, "shape", _shape); // self-caching
356
+ return _shape;
369
357
  },
370
- catchall: {
371
- get() {
372
- return b._zod.def.catchall;
373
- },
374
- },
375
- checks: {
376
- value: [], // delete existing checks
358
+ get catchall() {
359
+ return b._zod.def.catchall;
377
360
  },
361
+ checks: [], // delete existing checks
378
362
  });
379
363
  return clone(a, def);
380
364
  }
381
365
  export function partial(Class, schema, mask) {
382
- const def = cloneDef(schema);
383
- Object.defineProperties(def, {
384
- shape: {
385
- get() {
386
- const oldShape = schema._zod.def.shape;
387
- const shape = { ...oldShape };
388
- if (mask) {
389
- for (const key in mask) {
390
- if (!(key in oldShape)) {
391
- throw new Error(`Unrecognized key: "${key}"`);
392
- }
393
- if (!mask[key])
394
- continue;
395
- // if (oldShape[key]!._zod.optin === "optional") continue;
396
- shape[key] = Class
397
- ? new Class({
398
- type: "optional",
399
- innerType: oldShape[key],
400
- })
401
- : oldShape[key];
366
+ const def = mergeDefs(schema._zod.def, {
367
+ get shape() {
368
+ const oldShape = schema._zod.def.shape;
369
+ const shape = { ...oldShape };
370
+ if (mask) {
371
+ for (const key in mask) {
372
+ if (!(key in oldShape)) {
373
+ throw new Error(`Unrecognized key: "${key}"`);
402
374
  }
375
+ if (!mask[key])
376
+ continue;
377
+ // if (oldShape[key]!._zod.optin === "optional") continue;
378
+ shape[key] = Class
379
+ ? new Class({
380
+ type: "optional",
381
+ innerType: oldShape[key],
382
+ })
383
+ : oldShape[key];
403
384
  }
404
- else {
405
- for (const key in oldShape) {
406
- // if (oldShape[key]!._zod.optin === "optional") continue;
407
- shape[key] = Class
408
- ? new Class({
409
- type: "optional",
410
- innerType: oldShape[key],
411
- })
412
- : oldShape[key];
413
- }
385
+ }
386
+ else {
387
+ for (const key in oldShape) {
388
+ // if (oldShape[key]!._zod.optin === "optional") continue;
389
+ shape[key] = Class
390
+ ? new Class({
391
+ type: "optional",
392
+ innerType: oldShape[key],
393
+ })
394
+ : oldShape[key];
414
395
  }
415
- assignProp(this, "shape", shape); // self-caching
416
- return shape;
417
- },
418
- },
419
- checks: {
420
- value: [],
396
+ }
397
+ assignProp(this, "shape", shape); // self-caching
398
+ return shape;
421
399
  },
400
+ checks: [],
422
401
  });
423
402
  return clone(schema, def);
424
403
  }
425
404
  export function required(Class, schema, mask) {
426
- const def = cloneDef(schema);
427
- Object.defineProperties(def, {
428
- shape: {
429
- get() {
430
- const oldShape = schema._zod.def.shape;
431
- const shape = { ...oldShape };
432
- if (mask) {
433
- for (const key in mask) {
434
- if (!(key in shape)) {
435
- throw new Error(`Unrecognized key: "${key}"`);
436
- }
437
- if (!mask[key])
438
- continue;
439
- // overwrite with non-optional
440
- shape[key] = new Class({
441
- type: "nonoptional",
442
- innerType: oldShape[key],
443
- });
405
+ const def = mergeDefs(schema._zod.def, {
406
+ get shape() {
407
+ const oldShape = schema._zod.def.shape;
408
+ const shape = { ...oldShape };
409
+ if (mask) {
410
+ for (const key in mask) {
411
+ if (!(key in shape)) {
412
+ throw new Error(`Unrecognized key: "${key}"`);
444
413
  }
414
+ if (!mask[key])
415
+ continue;
416
+ // overwrite with non-optional
417
+ shape[key] = new Class({
418
+ type: "nonoptional",
419
+ innerType: oldShape[key],
420
+ });
445
421
  }
446
- else {
447
- for (const key in oldShape) {
448
- // overwrite with non-optional
449
- shape[key] = new Class({
450
- type: "nonoptional",
451
- innerType: oldShape[key],
452
- });
453
- }
422
+ }
423
+ else {
424
+ for (const key in oldShape) {
425
+ // overwrite with non-optional
426
+ shape[key] = new Class({
427
+ type: "nonoptional",
428
+ innerType: oldShape[key],
429
+ });
454
430
  }
455
- assignProp(this, "shape", shape); // self-caching
456
- return shape;
457
- },
458
- },
459
- checks: {
460
- value: [],
431
+ }
432
+ assignProp(this, "shape", shape); // self-caching
433
+ return shape;
461
434
  },
435
+ checks: [],
462
436
  });
463
437
  return clone(schema, def);
464
438
  }
@@ -4,5 +4,5 @@ exports.version = void 0;
4
4
  exports.version = {
5
5
  major: 4,
6
6
  minor: 0,
7
- patch: 6,
7
+ patch: 8,
8
8
  };
@@ -1,5 +1,5 @@
1
1
  export const version = {
2
2
  major: 4,
3
3
  minor: 0,
4
- patch: 6,
4
+ patch: 8,
5
5
  };