zod 4.1.0-canary.20250723T222937 → 4.1.0-canary.20250724T211341

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.
Files changed (58) hide show
  1. package/package.json +1 -1
  2. package/src/v3/types.ts +3 -1
  3. package/src/v4/classic/errors.ts +9 -2
  4. package/src/v4/classic/schemas.ts +10 -7
  5. package/src/v4/classic/tests/error-utils.test.ts +43 -0
  6. package/src/v4/classic/tests/file.test.ts +0 -1
  7. package/src/v4/classic/tests/partial.test.ts +193 -0
  8. package/src/v4/classic/tests/pickomit.test.ts +5 -5
  9. package/src/v4/classic/tests/preprocess.test.ts +4 -15
  10. package/src/v4/classic/tests/record.test.ts +15 -1
  11. package/src/v4/classic/tests/recursive-types.test.ts +67 -0
  12. package/src/v4/classic/tests/string.test.ts +77 -0
  13. package/src/v4/classic/tests/to-json-schema.test.ts +1 -0
  14. package/src/v4/classic/tests/transform.test.ts +104 -0
  15. package/src/v4/classic/tests/union.test.ts +90 -3
  16. package/src/v4/core/checks.ts +2 -2
  17. package/src/v4/core/errors.ts +8 -15
  18. package/src/v4/core/registries.ts +3 -2
  19. package/src/v4/core/schemas.ts +92 -94
  20. package/src/v4/core/tests/extend.test.ts +18 -0
  21. package/src/v4/core/to-json-schema.ts +1 -0
  22. package/src/v4/core/util.ts +135 -98
  23. package/src/v4/core/versions.ts +1 -1
  24. package/src/v4/mini/schemas.ts +3 -1
  25. package/v3/types.cjs +2 -0
  26. package/v3/types.d.cts +4 -1
  27. package/v3/types.d.ts +4 -1
  28. package/v3/types.js +2 -0
  29. package/v4/classic/errors.cjs +9 -2
  30. package/v4/classic/errors.js +9 -2
  31. package/v4/classic/schemas.cjs +5 -3
  32. package/v4/classic/schemas.d.cts +2 -1
  33. package/v4/classic/schemas.d.ts +2 -1
  34. package/v4/classic/schemas.js +5 -3
  35. package/v4/core/checks.d.cts +2 -2
  36. package/v4/core/checks.d.ts +2 -2
  37. package/v4/core/errors.cjs +4 -9
  38. package/v4/core/errors.d.cts +4 -6
  39. package/v4/core/errors.d.ts +4 -6
  40. package/v4/core/errors.js +4 -9
  41. package/v4/core/registries.cjs +2 -1
  42. package/v4/core/registries.d.cts +1 -1
  43. package/v4/core/registries.d.ts +1 -1
  44. package/v4/core/registries.js +2 -1
  45. package/v4/core/schemas.cjs +50 -87
  46. package/v4/core/schemas.d.cts +8 -3
  47. package/v4/core/schemas.d.ts +8 -3
  48. package/v4/core/schemas.js +50 -87
  49. package/v4/core/to-json-schema.cjs +1 -0
  50. package/v4/core/to-json-schema.js +1 -0
  51. package/v4/core/util.cjs +123 -97
  52. package/v4/core/util.d.cts +2 -0
  53. package/v4/core/util.d.ts +2 -0
  54. package/v4/core/util.js +121 -97
  55. package/v4/core/versions.cjs +1 -1
  56. package/v4/core/versions.js +1 -1
  57. package/v4/mini/schemas.cjs +3 -1
  58. package/v4/mini/schemas.js +3 -1
@@ -156,9 +156,10 @@ export const $ZodURL = /*@__PURE__*/ core.$constructor("$ZodURL", (inst, def) =>
156
156
  $ZodStringFormat.init(inst, def);
157
157
  inst._zod.check = (payload) => {
158
158
  try {
159
- const orig = payload.value;
160
- const url = new URL(orig);
161
- const href = url.href;
159
+ // Trim whitespace from input
160
+ const trimmed = payload.value.trim();
161
+ // @ts-ignore
162
+ const url = new URL(trimmed);
162
163
  if (def.hostname) {
163
164
  def.hostname.lastIndex = 0;
164
165
  if (!def.hostname.test(url.hostname)) {
@@ -187,12 +188,14 @@ export const $ZodURL = /*@__PURE__*/ core.$constructor("$ZodURL", (inst, def) =>
187
188
  });
188
189
  }
189
190
  }
190
- // payload.value = url.href;
191
- if (!orig.endsWith("/") && href.endsWith("/")) {
192
- payload.value = href.slice(0, -1);
191
+ // Set the output value based on normalize flag
192
+ if (def.normalize) {
193
+ // Use normalized URL
194
+ payload.value = url.href;
193
195
  }
194
196
  else {
195
- payload.value = href;
197
+ // Preserve the original input (trimmed)
198
+ payload.value = trimmed;
196
199
  }
197
200
  return;
198
201
  }
@@ -268,6 +271,7 @@ export const $ZodIPv6 = /*@__PURE__*/ core.$constructor("$ZodIPv6", (inst, def)
268
271
  });
269
272
  inst._zod.check = (payload) => {
270
273
  try {
274
+ // @ts-ignore
271
275
  new URL(`http://[${payload.value}]`);
272
276
  // return;
273
277
  }
@@ -299,6 +303,7 @@ export const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor("$ZodCIDRv6", (inst, d
299
303
  throw new Error();
300
304
  if (prefixNum < 0 || prefixNum > 128)
301
305
  throw new Error();
306
+ // @ts-ignore
302
307
  new URL(`http://[${address}]`);
303
308
  }
304
309
  catch {
@@ -319,6 +324,7 @@ export function isValidBase64(data) {
319
324
  if (data.length % 4 !== 0)
320
325
  return false;
321
326
  try {
327
+ // @ts-ignore
322
328
  atob(data);
323
329
  return true;
324
330
  }
@@ -383,6 +389,7 @@ export function isValidJWT(token, algorithm = null) {
383
389
  const [header] = tokensParts;
384
390
  if (!header)
385
391
  return false;
392
+ // @ts-ignore
386
393
  const parsedHeader = JSON.parse(atob(header));
387
394
  if ("typ" in parsedHeader && parsedHeader?.typ !== "JWT")
388
395
  return false;
@@ -653,36 +660,16 @@ export const $ZodArray = /*@__PURE__*/ core.$constructor("$ZodArray", (inst, def
653
660
  return payload; //handleArrayResultsAsync(parseResults, final);
654
661
  };
655
662
  });
656
- function handleObjectResult(result, final, key) {
657
- // if(isOptional)
663
+ function handlePropertyResult(result, final, key, input) {
658
664
  if (result.issues.length) {
659
665
  final.issues.push(...util.prefixIssues(key, result.issues));
660
666
  }
661
- final.value[key] = result.value;
662
- }
663
- function handleOptionalObjectResult(result, final, key, input) {
664
- if (result.issues.length) {
665
- // validation failed against value schema
666
- if (input[key] === undefined) {
667
- // if input was undefined, ignore the error
668
- if (key in input) {
669
- final.value[key] = undefined;
670
- }
671
- else {
672
- final.value[key] = result.value;
673
- }
674
- }
675
- else {
676
- final.issues.push(...util.prefixIssues(key, result.issues));
677
- }
678
- }
679
- else if (result.value === undefined) {
680
- // validation returned `undefined`
681
- if (key in input)
667
+ if (result.value === undefined) {
668
+ if (key in input) {
682
669
  final.value[key] = undefined;
670
+ }
683
671
  }
684
672
  else {
685
- // non-undefined value
686
673
  final.value[key] = result.value;
687
674
  }
688
675
  }
@@ -734,42 +721,25 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
734
721
  // A: preserve key order {
735
722
  doc.write(`const newResult = {}`);
736
723
  for (const key of normalized.keys) {
737
- if (normalized.optionalKeys.has(key)) {
738
- const id = ids[key];
739
- doc.write(`const ${id} = ${parseStr(key)};`);
740
- const k = util.esc(key);
741
- doc.write(`
724
+ const id = ids[key];
725
+ const k = util.esc(key);
726
+ doc.write(`const ${id} = ${parseStr(key)};`);
727
+ doc.write(`
742
728
  if (${id}.issues.length) {
743
- if (input[${k}] === undefined) {
744
- if (${k} in input) {
745
- newResult[${k}] = undefined;
746
- }
747
- } else {
748
- payload.issues = payload.issues.concat(
749
- ${id}.issues.map((iss) => ({
750
- ...iss,
751
- path: iss.path ? [${k}, ...iss.path] : [${k}],
752
- }))
753
- );
729
+ payload.issues = payload.issues.concat(${id}.issues.map(iss => ({
730
+ ...iss,
731
+ path: iss.path ? [${k}, ...iss.path] : [${k}]
732
+ })));
733
+ }
734
+
735
+ if (${id}.value === undefined) {
736
+ if (${k} in input) {
737
+ newResult[${k}] = undefined;
754
738
  }
755
- } else if (${id}.value === undefined) {
756
- if (${k} in input) newResult[${k}] = undefined;
757
739
  } else {
758
740
  newResult[${k}] = ${id}.value;
759
741
  }
760
- `);
761
- }
762
- else {
763
- const id = ids[key];
764
- // const id = ids[key];
765
- doc.write(`const ${id} = ${parseStr(key)};`);
766
- doc.write(`
767
- if (${id}.issues.length) payload.issues = payload.issues.concat(${id}.issues.map(iss => ({
768
- ...iss,
769
- path: iss.path ? [${util.esc(key)}, ...iss.path] : [${util.esc(key)}]
770
- })));`);
771
- doc.write(`newResult[${util.esc(key)}] = ${id}.value`);
772
- }
742
+ `);
773
743
  }
774
744
  doc.write(`payload.value = newResult;`);
775
745
  doc.write(`return payload;`);
@@ -807,33 +777,16 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
807
777
  const shape = value.shape;
808
778
  for (const key of value.keys) {
809
779
  const el = shape[key];
810
- // do not add omitted optional keys
811
- // if (!(key in input)) {
812
- // if (optionalKeys.has(key)) continue;
813
- // payload.issues.push({
814
- // code: "invalid_type",
815
- // path: [key],
816
- // expected: "nonoptional",
817
- // note: `Missing required key: "${key}"`,
818
- // input,
819
- // inst,
820
- // });
821
- // }
822
780
  const r = el._zod.run({ value: input[key], issues: [] }, ctx);
823
- const isOptional = el._zod.optin === "optional" && el._zod.optout === "optional";
824
781
  if (r instanceof Promise) {
825
- proms.push(r.then((r) => isOptional ? handleOptionalObjectResult(r, payload, key, input) : handleObjectResult(r, payload, key)));
826
- }
827
- else if (isOptional) {
828
- handleOptionalObjectResult(r, payload, key, input);
782
+ proms.push(r.then((r) => handlePropertyResult(r, payload, key, input)));
829
783
  }
830
784
  else {
831
- handleObjectResult(r, payload, key);
785
+ handlePropertyResult(r, payload, key, input);
832
786
  }
833
787
  }
834
788
  }
835
789
  if (!catchall) {
836
- // return payload;
837
790
  return proms.length ? Promise.all(proms).then(() => payload) : payload;
838
791
  }
839
792
  const unrecognized = [];
@@ -850,10 +803,10 @@ export const $ZodObject = /*@__PURE__*/ core.$constructor("$ZodObject", (inst, d
850
803
  }
851
804
  const r = _catchall.run({ value: input[key], issues: [] }, ctx);
852
805
  if (r instanceof Promise) {
853
- proms.push(r.then((r) => handleObjectResult(r, payload, key)));
806
+ proms.push(r.then((r) => handlePropertyResult(r, payload, key, input)));
854
807
  }
855
808
  else {
856
- handleObjectResult(r, payload, key);
809
+ handlePropertyResult(r, payload, key, input);
857
810
  }
858
811
  }
859
812
  if (unrecognized.length) {
@@ -878,6 +831,11 @@ function handleUnionResults(results, final, inst, ctx) {
878
831
  return final;
879
832
  }
880
833
  }
834
+ const nonaborted = results.filter((r) => !util.aborted(r));
835
+ if (nonaborted.length === 1) {
836
+ final.value = nonaborted[0].value;
837
+ return nonaborted[0];
838
+ }
881
839
  final.issues.push({
882
840
  code: "invalid_union",
883
841
  input: final.value,
@@ -1343,14 +1301,15 @@ function handleSetResult(result, final) {
1343
1301
  export const $ZodEnum = /*@__PURE__*/ core.$constructor("$ZodEnum", (inst, def) => {
1344
1302
  $ZodType.init(inst, def);
1345
1303
  const values = util.getEnumValues(def.entries);
1346
- inst._zod.values = new Set(values);
1304
+ const valuesSet = new Set(values);
1305
+ inst._zod.values = valuesSet;
1347
1306
  inst._zod.pattern = new RegExp(`^(${values
1348
1307
  .filter((k) => util.propertyKeyTypes.has(typeof k))
1349
1308
  .map((o) => (typeof o === "string" ? util.escapeRegex(o) : o.toString()))
1350
1309
  .join("|")})$`);
1351
1310
  inst._zod.parse = (payload, _ctx) => {
1352
1311
  const input = payload.value;
1353
- if (inst._zod.values.has(input)) {
1312
+ if (valuesSet.has(input)) {
1354
1313
  return payload;
1355
1314
  }
1356
1315
  payload.issues.push({
@@ -1364,6 +1323,9 @@ export const $ZodEnum = /*@__PURE__*/ core.$constructor("$ZodEnum", (inst, def)
1364
1323
  });
1365
1324
  export const $ZodLiteral = /*@__PURE__*/ core.$constructor("$ZodLiteral", (inst, def) => {
1366
1325
  $ZodType.init(inst, def);
1326
+ if (def.values.length === 0) {
1327
+ throw new Error("Cannot create literal schema with no valid values");
1328
+ }
1367
1329
  inst._zod.values = new Set(def.values);
1368
1330
  inst._zod.pattern = new RegExp(`^(${def.values
1369
1331
  .map((o) => (typeof o === "string" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))
@@ -1386,6 +1348,7 @@ export const $ZodFile = /*@__PURE__*/ core.$constructor("$ZodFile", (inst, def)
1386
1348
  $ZodType.init(inst, def);
1387
1349
  inst._zod.parse = (payload, _ctx) => {
1388
1350
  const input = payload.value;
1351
+ // @ts-ignore
1389
1352
  if (input instanceof File)
1390
1353
  return payload;
1391
1354
  payload.issues.push({
@@ -1531,7 +1494,7 @@ export const $ZodSuccess = /*@__PURE__*/ core.$constructor("$ZodSuccess", (inst,
1531
1494
  });
1532
1495
  export const $ZodCatch = /*@__PURE__*/ core.$constructor("$ZodCatch", (inst, def) => {
1533
1496
  $ZodType.init(inst, def);
1534
- inst._zod.optin = "optional";
1497
+ util.defineLazy(inst._zod, "optin", () => def.innerType._zod.optin);
1535
1498
  util.defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
1536
1499
  util.defineLazy(inst._zod, "values", () => def.innerType._zod.values);
1537
1500
  inst._zod.parse = (payload, ctx) => {
@@ -1596,7 +1559,7 @@ export const $ZodPipe = /*@__PURE__*/ core.$constructor("$ZodPipe", (inst, def)
1596
1559
  };
1597
1560
  });
1598
1561
  function handlePipeResult(left, def, ctx) {
1599
- if (util.aborted(left)) {
1562
+ if (left.issues.length) {
1600
1563
  return left;
1601
1564
  }
1602
1565
  return def.out._zod.run({ value: left.value, issues: left.issues }, ctx);
@@ -678,6 +678,7 @@ class JSONSchemaGenerator {
678
678
  result.$schema = "http://json-schema.org/draft-07/schema#";
679
679
  }
680
680
  else {
681
+ // @ts-ignore
681
682
  console.warn(`Invalid target: ${this.target}`);
682
683
  }
683
684
  if (params.external?.uri) {
@@ -674,6 +674,7 @@ export class JSONSchemaGenerator {
674
674
  result.$schema = "http://json-schema.org/draft-07/schema#";
675
675
  }
676
676
  else {
677
+ // @ts-ignore
677
678
  console.warn(`Invalid target: ${this.target}`);
678
679
  }
679
680
  if (params.external?.uri) {
package/v4/core/util.cjs CHANGED
@@ -15,6 +15,8 @@ exports.cleanRegex = cleanRegex;
15
15
  exports.floatSafeRemainder = floatSafeRemainder;
16
16
  exports.defineLazy = defineLazy;
17
17
  exports.assignProp = assignProp;
18
+ exports.mergeDefs = mergeDefs;
19
+ exports.cloneDef = cloneDef;
18
20
  exports.getElementAtPath = getElementAtPath;
19
21
  exports.promiseAllObject = promiseAllObject;
20
22
  exports.randomString = randomString;
@@ -127,6 +129,17 @@ function assignProp(target, prop, value) {
127
129
  configurable: true,
128
130
  });
129
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
+ }
140
+ function cloneDef(schema) {
141
+ return mergeDefs(schema._zod.def);
142
+ }
130
143
  function getElementAtPath(obj, path) {
131
144
  if (!path)
132
145
  return obj;
@@ -154,13 +167,12 @@ function randomString(length = 10) {
154
167
  function esc(str) {
155
168
  return JSON.stringify(str);
156
169
  }
157
- exports.captureStackTrace = Error.captureStackTrace
158
- ? Error.captureStackTrace
159
- : (..._args) => { };
170
+ exports.captureStackTrace = ("captureStackTrace" in Error ? Error.captureStackTrace : (..._args) => { });
160
171
  function isObject(data) {
161
172
  return typeof data === "object" && data !== null && !Array.isArray(data);
162
173
  }
163
174
  exports.allowsEval = cached(() => {
175
+ // @ts-ignore
164
176
  if (typeof navigator !== "undefined" && navigator?.userAgent?.includes("Cloudflare")) {
165
177
  return false;
166
178
  }
@@ -235,6 +247,7 @@ const getParsedType = (data) => {
235
247
  if (typeof Date !== "undefined" && data instanceof Date) {
236
248
  return "date";
237
249
  }
250
+ // @ts-ignore
238
251
  if (typeof File !== "undefined" && data instanceof File) {
239
252
  return "file";
240
253
  }
@@ -329,140 +342,152 @@ exports.BIGINT_FORMAT_RANGES = {
329
342
  uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt("18446744073709551615")],
330
343
  };
331
344
  function pick(schema, mask) {
332
- const newShape = {};
333
- const currDef = schema._zod.def; //.shape;
334
- for (const key in mask) {
335
- if (!(key in currDef.shape)) {
336
- throw new Error(`Unrecognized key: "${key}"`);
337
- }
338
- if (!mask[key])
339
- continue;
340
- // pick key
341
- newShape[key] = currDef.shape[key];
342
- }
343
- return clone(schema, {
344
- ...schema._zod.def,
345
- shape: newShape,
345
+ const currDef = schema._zod.def;
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}"`);
352
+ }
353
+ if (!mask[key])
354
+ continue;
355
+ newShape[key] = currDef.shape[key];
356
+ }
357
+ assignProp(this, "shape", newShape); // self-caching
358
+ return newShape;
359
+ },
346
360
  checks: [],
347
361
  });
362
+ return clone(schema, def);
348
363
  }
349
364
  function omit(schema, mask) {
350
- const newShape = { ...schema._zod.def.shape };
351
- const currDef = schema._zod.def; //.shape;
352
- for (const key in mask) {
353
- if (!(key in currDef.shape)) {
354
- throw new Error(`Unrecognized key: "${key}"`);
355
- }
356
- if (!mask[key])
357
- continue;
358
- delete newShape[key];
359
- }
360
- return clone(schema, {
361
- ...schema._zod.def,
362
- shape: newShape,
365
+ const currDef = schema._zod.def;
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}"`);
372
+ }
373
+ if (!mask[key])
374
+ continue;
375
+ delete newShape[key];
376
+ }
377
+ assignProp(this, "shape", newShape); // self-caching
378
+ return newShape;
379
+ },
363
380
  checks: [],
364
381
  });
382
+ return clone(schema, def);
365
383
  }
366
384
  function extend(schema, shape) {
367
385
  if (!isPlainObject(shape)) {
368
386
  throw new Error("Invalid input to extend: expected a plain object");
369
387
  }
370
- const def = {
371
- ...schema._zod.def,
388
+ const def = mergeDefs(schema._zod.def, {
372
389
  get shape() {
373
390
  const _shape = { ...schema._zod.def.shape, ...shape };
374
391
  assignProp(this, "shape", _shape); // self-caching
375
392
  return _shape;
376
393
  },
377
- checks: [], // delete existing checks
378
- };
394
+ checks: [],
395
+ });
379
396
  return clone(schema, def);
380
397
  }
381
398
  function merge(a, b) {
382
- return clone(a, {
383
- ...a._zod.def,
399
+ const def = mergeDefs(a._zod.def, {
384
400
  get shape() {
385
401
  const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };
386
402
  assignProp(this, "shape", _shape); // self-caching
387
403
  return _shape;
388
404
  },
389
- catchall: b._zod.def.catchall,
405
+ get catchall() {
406
+ return b._zod.def.catchall;
407
+ },
390
408
  checks: [], // delete existing checks
391
409
  });
410
+ return clone(a, def);
392
411
  }
393
412
  function partial(Class, schema, mask) {
394
- const oldShape = schema._zod.def.shape;
395
- const shape = { ...oldShape };
396
- if (mask) {
397
- for (const key in mask) {
398
- if (!(key in oldShape)) {
399
- throw new Error(`Unrecognized key: "${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}"`);
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];
431
+ }
400
432
  }
401
- if (!mask[key])
402
- continue;
403
- // if (oldShape[key]!._zod.optin === "optional") continue;
404
- shape[key] = Class
405
- ? new Class({
406
- type: "optional",
407
- innerType: oldShape[key],
408
- })
409
- : oldShape[key];
410
- }
411
- }
412
- else {
413
- for (const key in oldShape) {
414
- // if (oldShape[key]!._zod.optin === "optional") continue;
415
- shape[key] = Class
416
- ? new Class({
417
- type: "optional",
418
- innerType: oldShape[key],
419
- })
420
- : oldShape[key];
421
- }
422
- }
423
- return clone(schema, {
424
- ...schema._zod.def,
425
- shape,
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];
442
+ }
443
+ }
444
+ assignProp(this, "shape", shape); // self-caching
445
+ return shape;
446
+ },
426
447
  checks: [],
427
448
  });
449
+ return clone(schema, def);
428
450
  }
429
451
  function required(Class, schema, mask) {
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}"`);
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}"`);
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
+ });
468
+ }
436
469
  }
437
- if (!mask[key])
438
- continue;
439
- // overwrite with non-optional
440
- shape[key] = new Class({
441
- type: "nonoptional",
442
- innerType: oldShape[key],
443
- });
444
- }
445
- }
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
- }
454
- }
455
- return clone(schema, {
456
- ...schema._zod.def,
457
- shape,
458
- // optional: [],
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
+ });
477
+ }
478
+ }
479
+ assignProp(this, "shape", shape); // self-caching
480
+ return shape;
481
+ },
459
482
  checks: [],
460
483
  });
484
+ return clone(schema, def);
461
485
  }
462
486
  function aborted(x, startIndex = 0) {
463
487
  for (let i = startIndex; i < x.issues.length; i++) {
464
- if (x.issues[i]?.continue !== true)
488
+ if (x.issues[i]?.continue !== true) {
465
489
  return true;
490
+ }
466
491
  }
467
492
  return false;
468
493
  }
@@ -501,6 +526,7 @@ function getSizableOrigin(input) {
501
526
  return "set";
502
527
  if (input instanceof Map)
503
528
  return "map";
529
+ // @ts-ignore
504
530
  if (input instanceof File)
505
531
  return "file";
506
532
  return "unknown";
@@ -121,6 +121,8 @@ 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;
125
+ export declare function cloneDef(schema: schemas.$ZodType): any;
124
126
  export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
125
127
  export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
126
128
  [k in keyof T]: Awaited<T[k]>;
package/v4/core/util.d.ts CHANGED
@@ -121,6 +121,8 @@ 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;
125
+ export declare function cloneDef(schema: schemas.$ZodType): any;
124
126
  export declare function getElementAtPath(obj: any, path: (string | number)[] | null | undefined): any;
125
127
  export declare function promiseAllObject<T extends object>(promisesObj: T): Promise<{
126
128
  [k in keyof T]: Awaited<T[k]>;