zod 4.1.0-canary.20250821T014930 → 4.1.0-canary.20250823T071040

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 (158) hide show
  1. package/index.cjs +17 -7
  2. package/package.json +1 -1
  3. package/src/v4/classic/external.ts +0 -1
  4. package/src/v4/classic/parse.ts +49 -0
  5. package/src/v4/classic/schemas.ts +145 -7
  6. package/src/v4/classic/tests/catch.test.ts +25 -0
  7. package/src/v4/classic/tests/codec-examples.test.ts +538 -0
  8. package/src/v4/classic/tests/codec.test.ts +532 -0
  9. package/src/v4/classic/tests/continuability.test.ts +1 -1
  10. package/src/v4/classic/tests/default.test.ts +32 -0
  11. package/src/v4/classic/tests/firstparty.test.ts +4 -0
  12. package/src/v4/classic/tests/function.test.ts +31 -31
  13. package/src/v4/classic/tests/hash.test.ts +68 -0
  14. package/src/v4/classic/tests/nonoptional.test.ts +15 -0
  15. package/src/v4/classic/tests/object.test.ts +31 -0
  16. package/src/v4/classic/tests/pipe.test.ts +25 -5
  17. package/src/v4/classic/tests/prefault.test.ts +25 -0
  18. package/src/v4/classic/tests/preprocess.test.ts +1 -6
  19. package/src/v4/classic/tests/refine.test.ts +76 -3
  20. package/src/v4/classic/tests/string-formats.test.ts +16 -0
  21. package/src/v4/classic/tests/string.test.ts +82 -1
  22. package/src/v4/classic/tests/stringbool.test.ts +40 -0
  23. package/src/v4/classic/tests/template-literal.test.ts +1 -1
  24. package/src/v4/classic/tests/to-json-schema.test.ts +21 -2
  25. package/src/v4/classic/tests/transform.test.ts +7 -0
  26. package/src/v4/classic/tests/union.test.ts +1 -1
  27. package/src/v4/core/api.ts +25 -35
  28. package/src/v4/core/core.ts +7 -26
  29. package/src/v4/core/index.ts +0 -1
  30. package/src/v4/core/json-schema.ts +1 -0
  31. package/src/v4/core/parse.ts +101 -0
  32. package/src/v4/core/regexes.ts +40 -1
  33. package/src/v4/core/schemas.ts +521 -129
  34. package/src/v4/core/to-json-schema.ts +43 -8
  35. package/src/v4/core/util.ts +73 -0
  36. package/src/v4/mini/external.ts +0 -1
  37. package/src/v4/mini/parse.ts +14 -1
  38. package/src/v4/mini/schemas.ts +153 -12
  39. package/src/v4/mini/tests/codec.test.ts +499 -0
  40. package/src/v4/mini/tests/object.test.ts +9 -0
  41. package/src/v4/mini/tests/string.test.ts +16 -0
  42. package/v3/index.cjs +17 -7
  43. package/v4/classic/coerce.cjs +17 -7
  44. package/v4/classic/compat.cjs +17 -7
  45. package/v4/classic/errors.cjs +17 -7
  46. package/v4/classic/external.cjs +18 -9
  47. package/v4/classic/external.d.cts +1 -1
  48. package/v4/classic/external.d.ts +1 -1
  49. package/v4/classic/external.js +1 -1
  50. package/v4/classic/index.cjs +17 -7
  51. package/v4/classic/iso.cjs +17 -7
  52. package/v4/classic/parse.cjs +27 -8
  53. package/v4/classic/parse.d.cts +8 -0
  54. package/v4/classic/parse.d.ts +8 -0
  55. package/v4/classic/parse.js +9 -0
  56. package/v4/classic/schemas.cjs +76 -11
  57. package/v4/classic/schemas.d.cts +48 -2
  58. package/v4/classic/schemas.d.ts +48 -2
  59. package/v4/classic/schemas.js +51 -3
  60. package/v4/core/api.cjs +36 -35
  61. package/v4/core/api.d.cts +3 -4
  62. package/v4/core/api.d.ts +3 -4
  63. package/v4/core/api.js +19 -24
  64. package/v4/core/checks.cjs +17 -7
  65. package/v4/core/core.cjs +8 -1
  66. package/v4/core/core.d.cts +3 -0
  67. package/v4/core/core.d.ts +3 -0
  68. package/v4/core/core.js +6 -0
  69. package/v4/core/errors.cjs +17 -7
  70. package/v4/core/index.cjs +17 -8
  71. package/v4/core/index.d.cts +0 -1
  72. package/v4/core/index.d.ts +0 -1
  73. package/v4/core/index.js +0 -1
  74. package/v4/core/json-schema.d.cts +1 -0
  75. package/v4/core/json-schema.d.ts +1 -0
  76. package/v4/core/parse.cjs +62 -8
  77. package/v4/core/parse.d.cts +24 -0
  78. package/v4/core/parse.d.ts +24 -0
  79. package/v4/core/parse.js +36 -0
  80. package/v4/core/regexes.cjs +34 -2
  81. package/v4/core/regexes.d.cts +16 -0
  82. package/v4/core/regexes.d.ts +16 -0
  83. package/v4/core/regexes.js +32 -1
  84. package/v4/core/schemas.cjs +326 -84
  85. package/v4/core/schemas.d.cts +61 -3
  86. package/v4/core/schemas.d.ts +61 -3
  87. package/v4/core/schemas.js +308 -76
  88. package/v4/core/to-json-schema.cjs +42 -5
  89. package/v4/core/to-json-schema.d.cts +4 -3
  90. package/v4/core/to-json-schema.d.ts +4 -3
  91. package/v4/core/to-json-schema.js +42 -5
  92. package/v4/core/util.cjs +69 -0
  93. package/v4/core/util.d.cts +10 -0
  94. package/v4/core/util.d.ts +10 -0
  95. package/v4/core/util.js +62 -0
  96. package/v4/locales/ar.cjs +17 -7
  97. package/v4/locales/az.cjs +17 -7
  98. package/v4/locales/be.cjs +17 -7
  99. package/v4/locales/bg.cjs +17 -7
  100. package/v4/locales/ca.cjs +17 -7
  101. package/v4/locales/cs.cjs +17 -7
  102. package/v4/locales/da.cjs +17 -7
  103. package/v4/locales/de.cjs +17 -7
  104. package/v4/locales/en.cjs +17 -7
  105. package/v4/locales/eo.cjs +17 -7
  106. package/v4/locales/es.cjs +17 -7
  107. package/v4/locales/fa.cjs +17 -7
  108. package/v4/locales/fi.cjs +17 -7
  109. package/v4/locales/fr-CA.cjs +17 -7
  110. package/v4/locales/fr.cjs +17 -7
  111. package/v4/locales/he.cjs +17 -7
  112. package/v4/locales/hu.cjs +17 -7
  113. package/v4/locales/id.cjs +17 -7
  114. package/v4/locales/is.cjs +17 -7
  115. package/v4/locales/it.cjs +17 -7
  116. package/v4/locales/ja.cjs +17 -7
  117. package/v4/locales/kh.cjs +17 -7
  118. package/v4/locales/ko.cjs +17 -7
  119. package/v4/locales/mk.cjs +17 -7
  120. package/v4/locales/ms.cjs +17 -7
  121. package/v4/locales/nl.cjs +17 -7
  122. package/v4/locales/no.cjs +17 -7
  123. package/v4/locales/ota.cjs +17 -7
  124. package/v4/locales/pl.cjs +17 -7
  125. package/v4/locales/ps.cjs +17 -7
  126. package/v4/locales/pt.cjs +17 -7
  127. package/v4/locales/ru.cjs +17 -7
  128. package/v4/locales/sl.cjs +17 -7
  129. package/v4/locales/sv.cjs +17 -7
  130. package/v4/locales/ta.cjs +17 -7
  131. package/v4/locales/th.cjs +17 -7
  132. package/v4/locales/tr.cjs +17 -7
  133. package/v4/locales/ua.cjs +17 -7
  134. package/v4/locales/ur.cjs +17 -7
  135. package/v4/locales/vi.cjs +17 -7
  136. package/v4/locales/yo.cjs +17 -7
  137. package/v4/locales/zh-CN.cjs +17 -7
  138. package/v4/locales/zh-TW.cjs +17 -7
  139. package/v4/mini/coerce.cjs +17 -7
  140. package/v4/mini/external.cjs +18 -9
  141. package/v4/mini/external.d.cts +1 -1
  142. package/v4/mini/external.d.ts +1 -1
  143. package/v4/mini/external.js +1 -1
  144. package/v4/mini/index.cjs +17 -7
  145. package/v4/mini/iso.cjs +17 -7
  146. package/v4/mini/parse.cjs +9 -1
  147. package/v4/mini/parse.d.cts +1 -1
  148. package/v4/mini/parse.d.ts +1 -1
  149. package/v4/mini/parse.js +1 -1
  150. package/v4/mini/schemas.cjs +75 -10
  151. package/v4/mini/schemas.d.cts +49 -1
  152. package/v4/mini/schemas.d.ts +49 -1
  153. package/v4/mini/schemas.js +49 -2
  154. package/src/v4/core/function.ts +0 -176
  155. package/v4/core/function.cjs +0 -102
  156. package/v4/core/function.d.cts +0 -52
  157. package/v4/core/function.d.ts +0 -52
  158. package/v4/core/function.js +0 -75
@@ -83,7 +83,9 @@ class JSONSchemaGenerator {
83
83
  else if (regexes.length > 1) {
84
84
  result.schema.allOf = [
85
85
  ...regexes.map((regex) => ({
86
- ...(this.target === "draft-7" || this.target === "draft-4" ? { type: "string" } : {}),
86
+ ...(this.target === "draft-7" || this.target === "draft-4" || this.target === "openapi-3.0"
87
+ ? { type: "string" }
88
+ : {}),
87
89
  pattern: regex.source,
88
90
  })),
89
91
  ];
@@ -244,10 +246,25 @@ class JSONSchemaGenerator {
244
246
  }
245
247
  case "union": {
246
248
  const json = _json;
247
- json.anyOf = def.options.map((x, i) => this.process(x, {
249
+ const options = def.options.map((x, i) => this.process(x, {
248
250
  ...params,
249
251
  path: [...params.path, "anyOf", i],
250
252
  }));
253
+ if (this.target === "openapi-3.0") {
254
+ const nonNull = options.filter((x) => x.type !== "null");
255
+ const hasNull = nonNull.length !== options.length;
256
+ if (nonNull.length === 1) {
257
+ Object.assign(json, nonNull[0]);
258
+ }
259
+ else {
260
+ json.anyOf = nonNull;
261
+ }
262
+ if (hasNull)
263
+ json.nullable = true;
264
+ }
265
+ else {
266
+ json.anyOf = options;
267
+ }
251
268
  break;
252
269
  }
253
270
  case "intersection": {
@@ -373,7 +390,7 @@ class JSONSchemaGenerator {
373
390
  else if (vals.length === 1) {
374
391
  const val = vals[0];
375
392
  json.type = val === null ? "null" : typeof val;
376
- if (this.target === "draft-4") {
393
+ if (this.target === "draft-4" || this.target === "openapi-3.0") {
377
394
  json.enum = [val];
378
395
  }
379
396
  else {
@@ -433,7 +450,14 @@ class JSONSchemaGenerator {
433
450
  }
434
451
  case "nullable": {
435
452
  const inner = this.process(def.innerType, params);
436
- _json.anyOf = [inner, { type: "null" }];
453
+ if (this.target === "openapi-3.0") {
454
+ Object.assign(_json, inner);
455
+ _json.nullable = true;
456
+ result.ref = def.innerType;
457
+ }
458
+ else {
459
+ _json.anyOf = [inner, { type: "null" }];
460
+ }
437
461
  break;
438
462
  }
439
463
  case "nonoptional": {
@@ -523,6 +547,12 @@ class JSONSchemaGenerator {
523
547
  }
524
548
  break;
525
549
  }
550
+ case "function": {
551
+ if (this.unrepresentable === "throw") {
552
+ throw new Error("Function types cannot be represented in JSON Schema");
553
+ }
554
+ break;
555
+ }
526
556
  default: {
527
557
  def;
528
558
  }
@@ -674,7 +704,8 @@ class JSONSchemaGenerator {
674
704
  flattenRef(ref, params);
675
705
  // merge referenced schema into current
676
706
  const refSchema = this.seen.get(ref).schema;
677
- if (refSchema.$ref && (params.target === "draft-7" || params.target === "draft-4")) {
707
+ if (refSchema.$ref &&
708
+ (params.target === "draft-7" || params.target === "draft-4" || params.target === "openapi-3.0")) {
678
709
  schema.allOf = schema.allOf ?? [];
679
710
  schema.allOf.push(refSchema);
680
711
  }
@@ -704,6 +735,9 @@ class JSONSchemaGenerator {
704
735
  else if (this.target === "draft-4") {
705
736
  result.$schema = "http://json-schema.org/draft-04/schema#";
706
737
  }
738
+ else if (this.target === "openapi-3.0") {
739
+ // OpenAPI 3.0 schema objects should not include a $schema property
740
+ }
707
741
  else {
708
742
  // @ts-ignore
709
743
  console.warn(`Invalid target: ${this.target}`);
@@ -875,6 +909,9 @@ function isTransforming(_schema, _ctx) {
875
909
  case "catch": {
876
910
  return false;
877
911
  }
912
+ case "function": {
913
+ return false;
914
+ }
878
915
  default:
879
916
  def;
880
917
  }
@@ -8,8 +8,9 @@ interface JSONSchemaGeneratorParams {
8
8
  /** The JSON Schema version to target.
9
9
  * - `"draft-2020-12"` — Default. JSON Schema Draft 2020-12
10
10
  * - `"draft-7"` — JSON Schema Draft 7
11
- * - `"draft-4"` — JSON Schema Draft 4 */
12
- target?: "draft-4" | "draft-7" | "draft-2020-12";
11
+ * - `"draft-4"` — JSON Schema Draft 4
12
+ * - `"openapi-3.0"` OpenAPI 3.0 Schema Object */
13
+ target?: "draft-4" | "draft-7" | "draft-2020-12" | "openapi-3.0";
13
14
  /** How to handle unrepresentable types.
14
15
  * - `"throw"` — Default. Unrepresentable types throw an error
15
16
  * - `"any"` — Unrepresentable types become `{}` */
@@ -61,7 +62,7 @@ interface Seen {
61
62
  }
62
63
  export declare class JSONSchemaGenerator {
63
64
  metadataRegistry: $ZodRegistry<Record<string, any>>;
64
- target: "draft-4" | "draft-7" | "draft-2020-12";
65
+ target: "draft-4" | "draft-7" | "draft-2020-12" | "openapi-3.0";
65
66
  unrepresentable: "throw" | "any";
66
67
  override: (ctx: {
67
68
  zodSchema: schemas.$ZodTypes;
@@ -8,8 +8,9 @@ interface JSONSchemaGeneratorParams {
8
8
  /** The JSON Schema version to target.
9
9
  * - `"draft-2020-12"` — Default. JSON Schema Draft 2020-12
10
10
  * - `"draft-7"` — JSON Schema Draft 7
11
- * - `"draft-4"` — JSON Schema Draft 4 */
12
- target?: "draft-4" | "draft-7" | "draft-2020-12";
11
+ * - `"draft-4"` — JSON Schema Draft 4
12
+ * - `"openapi-3.0"` OpenAPI 3.0 Schema Object */
13
+ target?: "draft-4" | "draft-7" | "draft-2020-12" | "openapi-3.0";
13
14
  /** How to handle unrepresentable types.
14
15
  * - `"throw"` — Default. Unrepresentable types throw an error
15
16
  * - `"any"` — Unrepresentable types become `{}` */
@@ -61,7 +62,7 @@ interface Seen {
61
62
  }
62
63
  export declare class JSONSchemaGenerator {
63
64
  metadataRegistry: $ZodRegistry<Record<string, any>>;
64
- target: "draft-4" | "draft-7" | "draft-2020-12";
65
+ target: "draft-4" | "draft-7" | "draft-2020-12" | "openapi-3.0";
65
66
  unrepresentable: "throw" | "any";
66
67
  override: (ctx: {
67
68
  zodSchema: schemas.$ZodTypes;
@@ -79,7 +79,9 @@ export class JSONSchemaGenerator {
79
79
  else if (regexes.length > 1) {
80
80
  result.schema.allOf = [
81
81
  ...regexes.map((regex) => ({
82
- ...(this.target === "draft-7" || this.target === "draft-4" ? { type: "string" } : {}),
82
+ ...(this.target === "draft-7" || this.target === "draft-4" || this.target === "openapi-3.0"
83
+ ? { type: "string" }
84
+ : {}),
83
85
  pattern: regex.source,
84
86
  })),
85
87
  ];
@@ -240,10 +242,25 @@ export class JSONSchemaGenerator {
240
242
  }
241
243
  case "union": {
242
244
  const json = _json;
243
- json.anyOf = def.options.map((x, i) => this.process(x, {
245
+ const options = def.options.map((x, i) => this.process(x, {
244
246
  ...params,
245
247
  path: [...params.path, "anyOf", i],
246
248
  }));
249
+ if (this.target === "openapi-3.0") {
250
+ const nonNull = options.filter((x) => x.type !== "null");
251
+ const hasNull = nonNull.length !== options.length;
252
+ if (nonNull.length === 1) {
253
+ Object.assign(json, nonNull[0]);
254
+ }
255
+ else {
256
+ json.anyOf = nonNull;
257
+ }
258
+ if (hasNull)
259
+ json.nullable = true;
260
+ }
261
+ else {
262
+ json.anyOf = options;
263
+ }
247
264
  break;
248
265
  }
249
266
  case "intersection": {
@@ -369,7 +386,7 @@ export class JSONSchemaGenerator {
369
386
  else if (vals.length === 1) {
370
387
  const val = vals[0];
371
388
  json.type = val === null ? "null" : typeof val;
372
- if (this.target === "draft-4") {
389
+ if (this.target === "draft-4" || this.target === "openapi-3.0") {
373
390
  json.enum = [val];
374
391
  }
375
392
  else {
@@ -429,7 +446,14 @@ export class JSONSchemaGenerator {
429
446
  }
430
447
  case "nullable": {
431
448
  const inner = this.process(def.innerType, params);
432
- _json.anyOf = [inner, { type: "null" }];
449
+ if (this.target === "openapi-3.0") {
450
+ Object.assign(_json, inner);
451
+ _json.nullable = true;
452
+ result.ref = def.innerType;
453
+ }
454
+ else {
455
+ _json.anyOf = [inner, { type: "null" }];
456
+ }
433
457
  break;
434
458
  }
435
459
  case "nonoptional": {
@@ -519,6 +543,12 @@ export class JSONSchemaGenerator {
519
543
  }
520
544
  break;
521
545
  }
546
+ case "function": {
547
+ if (this.unrepresentable === "throw") {
548
+ throw new Error("Function types cannot be represented in JSON Schema");
549
+ }
550
+ break;
551
+ }
522
552
  default: {
523
553
  def;
524
554
  }
@@ -670,7 +700,8 @@ export class JSONSchemaGenerator {
670
700
  flattenRef(ref, params);
671
701
  // merge referenced schema into current
672
702
  const refSchema = this.seen.get(ref).schema;
673
- if (refSchema.$ref && (params.target === "draft-7" || params.target === "draft-4")) {
703
+ if (refSchema.$ref &&
704
+ (params.target === "draft-7" || params.target === "draft-4" || params.target === "openapi-3.0")) {
674
705
  schema.allOf = schema.allOf ?? [];
675
706
  schema.allOf.push(refSchema);
676
707
  }
@@ -700,6 +731,9 @@ export class JSONSchemaGenerator {
700
731
  else if (this.target === "draft-4") {
701
732
  result.$schema = "http://json-schema.org/draft-04/schema#";
702
733
  }
734
+ else if (this.target === "openapi-3.0") {
735
+ // OpenAPI 3.0 schema objects should not include a $schema property
736
+ }
703
737
  else {
704
738
  // @ts-ignore
705
739
  console.warn(`Invalid target: ${this.target}`);
@@ -870,6 +904,9 @@ function isTransforming(_schema, _ctx) {
870
904
  case "catch": {
871
905
  return false;
872
906
  }
907
+ case "function": {
908
+ return false;
909
+ }
873
910
  default:
874
911
  def;
875
912
  }
package/v4/core/util.cjs CHANGED
@@ -35,6 +35,7 @@ exports.optionalKeys = optionalKeys;
35
35
  exports.pick = pick;
36
36
  exports.omit = omit;
37
37
  exports.extend = extend;
38
+ exports.safeExtend = safeExtend;
38
39
  exports.merge = merge;
39
40
  exports.partial = partial;
40
41
  exports.required = required;
@@ -46,6 +47,12 @@ exports.getSizableOrigin = getSizableOrigin;
46
47
  exports.getLengthableOrigin = getLengthableOrigin;
47
48
  exports.issue = issue;
48
49
  exports.cleanEnum = cleanEnum;
50
+ exports.base64ToUint8Array = base64ToUint8Array;
51
+ exports.uint8ArrayToBase64 = uint8ArrayToBase64;
52
+ exports.base64urlToUint8Array = base64urlToUint8Array;
53
+ exports.uint8ArrayToBase64url = uint8ArrayToBase64url;
54
+ exports.hexToUint8Array = hexToUint8Array;
55
+ exports.uint8ArrayToHex = uint8ArrayToHex;
49
56
  // functions
50
57
  function assertEqual(val) {
51
58
  return val;
@@ -406,6 +413,11 @@ function extend(schema, shape) {
406
413
  if (!isPlainObject(shape)) {
407
414
  throw new Error("Invalid input to extend: expected a plain object");
408
415
  }
416
+ const checks = schema._zod.def.checks;
417
+ const hasChecks = checks && checks.length > 0;
418
+ if (hasChecks) {
419
+ throw new Error("Object schemas containing refinements cannot be extended. Use `.safeExtend()` instead.");
420
+ }
409
421
  const def = mergeDefs(schema._zod.def, {
410
422
  get shape() {
411
423
  const _shape = { ...schema._zod.def.shape, ...shape };
@@ -416,6 +428,21 @@ function extend(schema, shape) {
416
428
  });
417
429
  return clone(schema, def);
418
430
  }
431
+ function safeExtend(schema, shape) {
432
+ if (!isPlainObject(shape)) {
433
+ throw new Error("Invalid input to safeExtend: expected a plain object");
434
+ }
435
+ const def = {
436
+ ...schema._zod.def,
437
+ get shape() {
438
+ const _shape = { ...schema._zod.def.shape, ...shape };
439
+ assignProp(this, "shape", _shape); // self-caching
440
+ return _shape;
441
+ },
442
+ checks: schema._zod.def.checks,
443
+ };
444
+ return clone(schema, def);
445
+ }
419
446
  function merge(a, b) {
420
447
  const def = mergeDefs(a._zod.def, {
421
448
  get shape() {
@@ -506,6 +533,8 @@ function required(Class, schema, mask) {
506
533
  }
507
534
  // invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom
508
535
  function aborted(x, startIndex = 0) {
536
+ if (x.aborted === true)
537
+ return true;
509
538
  for (let i = startIndex; i < x.issues.length; i++) {
510
539
  if (x.issues[i]?.continue !== true) {
511
540
  return true;
@@ -580,6 +609,46 @@ function cleanEnum(obj) {
580
609
  })
581
610
  .map((el) => el[1]);
582
611
  }
612
+ // Codec utility functions
613
+ function base64ToUint8Array(base64) {
614
+ const binaryString = atob(base64);
615
+ const bytes = new Uint8Array(binaryString.length);
616
+ for (let i = 0; i < binaryString.length; i++) {
617
+ bytes[i] = binaryString.charCodeAt(i);
618
+ }
619
+ return bytes;
620
+ }
621
+ function uint8ArrayToBase64(bytes) {
622
+ let binaryString = "";
623
+ for (let i = 0; i < bytes.length; i++) {
624
+ binaryString += String.fromCharCode(bytes[i]);
625
+ }
626
+ return btoa(binaryString);
627
+ }
628
+ function base64urlToUint8Array(base64url) {
629
+ const base64 = base64url.replace(/-/g, "+").replace(/_/g, "/");
630
+ const padding = "=".repeat((4 - (base64.length % 4)) % 4);
631
+ return base64ToUint8Array(base64 + padding);
632
+ }
633
+ function uint8ArrayToBase64url(bytes) {
634
+ return uint8ArrayToBase64(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
635
+ }
636
+ function hexToUint8Array(hex) {
637
+ const cleanHex = hex.replace(/^0x/, "");
638
+ if (cleanHex.length % 2 !== 0) {
639
+ throw new Error("Invalid hex string length");
640
+ }
641
+ const bytes = new Uint8Array(cleanHex.length / 2);
642
+ for (let i = 0; i < cleanHex.length; i += 2) {
643
+ bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);
644
+ }
645
+ return bytes;
646
+ }
647
+ function uint8ArrayToHex(bytes) {
648
+ return Array.from(bytes)
649
+ .map((b) => b.toString(16).padStart(2, "0"))
650
+ .join("");
651
+ }
583
652
  // instanceof
584
653
  class Class {
585
654
  constructor(..._args) { }
@@ -6,6 +6,9 @@ export type JSONType = string | number | boolean | null | JSONType[] | {
6
6
  [key: string]: JSONType;
7
7
  };
8
8
  export type JWTAlgorithm = "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | (string & {});
9
+ export type HashAlgorithm = "md5" | "sha1" | "sha256" | "sha384" | "sha512";
10
+ export type HashEncoding = "hex" | "base64" | "base64url";
11
+ export type HashFormat = `${HashAlgorithm}_${HashEncoding}`;
9
12
  export type IPVersion = "v4" | "v6";
10
13
  export type MimeTypes = "application/json" | "application/xml" | "application/x-www-form-urlencoded" | "application/javascript" | "application/pdf" | "application/zip" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/msword" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.ms-powerpoint" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "application/octet-stream" | "application/graphql" | "text/html" | "text/plain" | "text/css" | "text/javascript" | "text/csv" | "image/png" | "image/jpeg" | "image/gif" | "image/svg+xml" | "image/webp" | "audio/mpeg" | "audio/ogg" | "audio/wav" | "audio/webm" | "video/mp4" | "video/webm" | "video/ogg" | "font/woff" | "font/woff2" | "font/ttf" | "font/otf" | "multipart/form-data" | (string & {});
11
14
  export type ParsedTypes = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "file" | "date" | "array" | "map" | "set" | "nan" | "null" | "promise";
@@ -167,6 +170,7 @@ export declare const BIGINT_FORMAT_RANGES: Record<checks.$ZodBigIntFormats, [big
167
170
  export declare function pick(schema: schemas.$ZodObject, mask: Record<string, unknown>): any;
168
171
  export declare function omit(schema: schemas.$ZodObject, mask: object): any;
169
172
  export declare function extend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any;
173
+ export declare function safeExtend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any;
170
174
  export declare function merge(a: schemas.$ZodObject, b: schemas.$ZodObject): any;
171
175
  export declare function partial(Class: SchemaClass<schemas.$ZodOptional> | null, schema: schemas.$ZodObject, mask: object | undefined): any;
172
176
  export declare function required(Class: SchemaClass<schemas.$ZodNonOptional>, schema: schemas.$ZodObject, mask: object | undefined): any;
@@ -182,6 +186,12 @@ export declare function getLengthableOrigin(input: any): "array" | "string" | "u
182
186
  export declare function issue(_iss: string, input: any, inst: any): errors.$ZodRawIssue;
183
187
  export declare function issue(_iss: errors.$ZodRawIssue): errors.$ZodRawIssue;
184
188
  export declare function cleanEnum(obj: Record<string, EnumValue>): EnumValue[];
189
+ export declare function base64ToUint8Array(base64: string): Uint8Array<ArrayBuffer>;
190
+ export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
191
+ export declare function base64urlToUint8Array(base64url: string): Uint8Array<ArrayBuffer>;
192
+ export declare function uint8ArrayToBase64url(bytes: Uint8Array): string;
193
+ export declare function hexToUint8Array(hex: string): Uint8Array<ArrayBuffer>;
194
+ export declare function uint8ArrayToHex(bytes: Uint8Array): string;
185
195
  export declare abstract class Class {
186
196
  constructor(..._args: any[]);
187
197
  }
package/v4/core/util.d.ts CHANGED
@@ -6,6 +6,9 @@ export type JSONType = string | number | boolean | null | JSONType[] | {
6
6
  [key: string]: JSONType;
7
7
  };
8
8
  export type JWTAlgorithm = "HS256" | "HS384" | "HS512" | "RS256" | "RS384" | "RS512" | "ES256" | "ES384" | "ES512" | "PS256" | "PS384" | "PS512" | "EdDSA" | (string & {});
9
+ export type HashAlgorithm = "md5" | "sha1" | "sha256" | "sha384" | "sha512";
10
+ export type HashEncoding = "hex" | "base64" | "base64url";
11
+ export type HashFormat = `${HashAlgorithm}_${HashEncoding}`;
9
12
  export type IPVersion = "v4" | "v6";
10
13
  export type MimeTypes = "application/json" | "application/xml" | "application/x-www-form-urlencoded" | "application/javascript" | "application/pdf" | "application/zip" | "application/vnd.ms-excel" | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" | "application/msword" | "application/vnd.openxmlformats-officedocument.wordprocessingml.document" | "application/vnd.ms-powerpoint" | "application/vnd.openxmlformats-officedocument.presentationml.presentation" | "application/octet-stream" | "application/graphql" | "text/html" | "text/plain" | "text/css" | "text/javascript" | "text/csv" | "image/png" | "image/jpeg" | "image/gif" | "image/svg+xml" | "image/webp" | "audio/mpeg" | "audio/ogg" | "audio/wav" | "audio/webm" | "video/mp4" | "video/webm" | "video/ogg" | "font/woff" | "font/woff2" | "font/ttf" | "font/otf" | "multipart/form-data" | (string & {});
11
14
  export type ParsedTypes = "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" | "file" | "date" | "array" | "map" | "set" | "nan" | "null" | "promise";
@@ -167,6 +170,7 @@ export declare const BIGINT_FORMAT_RANGES: Record<checks.$ZodBigIntFormats, [big
167
170
  export declare function pick(schema: schemas.$ZodObject, mask: Record<string, unknown>): any;
168
171
  export declare function omit(schema: schemas.$ZodObject, mask: object): any;
169
172
  export declare function extend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any;
173
+ export declare function safeExtend(schema: schemas.$ZodObject, shape: schemas.$ZodShape): any;
170
174
  export declare function merge(a: schemas.$ZodObject, b: schemas.$ZodObject): any;
171
175
  export declare function partial(Class: SchemaClass<schemas.$ZodOptional> | null, schema: schemas.$ZodObject, mask: object | undefined): any;
172
176
  export declare function required(Class: SchemaClass<schemas.$ZodNonOptional>, schema: schemas.$ZodObject, mask: object | undefined): any;
@@ -182,6 +186,12 @@ export declare function getLengthableOrigin(input: any): "array" | "string" | "u
182
186
  export declare function issue(_iss: string, input: any, inst: any): errors.$ZodRawIssue;
183
187
  export declare function issue(_iss: errors.$ZodRawIssue): errors.$ZodRawIssue;
184
188
  export declare function cleanEnum(obj: Record<string, EnumValue>): EnumValue[];
189
+ export declare function base64ToUint8Array(base64: string): Uint8Array<ArrayBuffer>;
190
+ export declare function uint8ArrayToBase64(bytes: Uint8Array): string;
191
+ export declare function base64urlToUint8Array(base64url: string): Uint8Array<ArrayBuffer>;
192
+ export declare function uint8ArrayToBase64url(bytes: Uint8Array): string;
193
+ export declare function hexToUint8Array(hex: string): Uint8Array<ArrayBuffer>;
194
+ export declare function uint8ArrayToHex(bytes: Uint8Array): string;
185
195
  export declare abstract class Class {
186
196
  constructor(..._args: any[]);
187
197
  }
package/v4/core/util.js CHANGED
@@ -357,6 +357,11 @@ export function extend(schema, shape) {
357
357
  if (!isPlainObject(shape)) {
358
358
  throw new Error("Invalid input to extend: expected a plain object");
359
359
  }
360
+ const checks = schema._zod.def.checks;
361
+ const hasChecks = checks && checks.length > 0;
362
+ if (hasChecks) {
363
+ throw new Error("Object schemas containing refinements cannot be extended. Use `.safeExtend()` instead.");
364
+ }
360
365
  const def = mergeDefs(schema._zod.def, {
361
366
  get shape() {
362
367
  const _shape = { ...schema._zod.def.shape, ...shape };
@@ -367,6 +372,21 @@ export function extend(schema, shape) {
367
372
  });
368
373
  return clone(schema, def);
369
374
  }
375
+ export function safeExtend(schema, shape) {
376
+ if (!isPlainObject(shape)) {
377
+ throw new Error("Invalid input to safeExtend: expected a plain object");
378
+ }
379
+ const def = {
380
+ ...schema._zod.def,
381
+ get shape() {
382
+ const _shape = { ...schema._zod.def.shape, ...shape };
383
+ assignProp(this, "shape", _shape); // self-caching
384
+ return _shape;
385
+ },
386
+ checks: schema._zod.def.checks,
387
+ };
388
+ return clone(schema, def);
389
+ }
370
390
  export function merge(a, b) {
371
391
  const def = mergeDefs(a._zod.def, {
372
392
  get shape() {
@@ -457,6 +477,8 @@ export function required(Class, schema, mask) {
457
477
  }
458
478
  // invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom
459
479
  export function aborted(x, startIndex = 0) {
480
+ if (x.aborted === true)
481
+ return true;
460
482
  for (let i = startIndex; i < x.issues.length; i++) {
461
483
  if (x.issues[i]?.continue !== true) {
462
484
  return true;
@@ -531,6 +553,46 @@ export function cleanEnum(obj) {
531
553
  })
532
554
  .map((el) => el[1]);
533
555
  }
556
+ // Codec utility functions
557
+ export function base64ToUint8Array(base64) {
558
+ const binaryString = atob(base64);
559
+ const bytes = new Uint8Array(binaryString.length);
560
+ for (let i = 0; i < binaryString.length; i++) {
561
+ bytes[i] = binaryString.charCodeAt(i);
562
+ }
563
+ return bytes;
564
+ }
565
+ export function uint8ArrayToBase64(bytes) {
566
+ let binaryString = "";
567
+ for (let i = 0; i < bytes.length; i++) {
568
+ binaryString += String.fromCharCode(bytes[i]);
569
+ }
570
+ return btoa(binaryString);
571
+ }
572
+ export function base64urlToUint8Array(base64url) {
573
+ const base64 = base64url.replace(/-/g, "+").replace(/_/g, "/");
574
+ const padding = "=".repeat((4 - (base64.length % 4)) % 4);
575
+ return base64ToUint8Array(base64 + padding);
576
+ }
577
+ export function uint8ArrayToBase64url(bytes) {
578
+ return uint8ArrayToBase64(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
579
+ }
580
+ export function hexToUint8Array(hex) {
581
+ const cleanHex = hex.replace(/^0x/, "");
582
+ if (cleanHex.length % 2 !== 0) {
583
+ throw new Error("Invalid hex string length");
584
+ }
585
+ const bytes = new Uint8Array(cleanHex.length / 2);
586
+ for (let i = 0; i < cleanHex.length; i += 2) {
587
+ bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);
588
+ }
589
+ return bytes;
590
+ }
591
+ export function uint8ArrayToHex(bytes) {
592
+ return Array.from(bytes)
593
+ .map((b) => b.toString(16).padStart(2, "0"))
594
+ .join("");
595
+ }
534
596
  // instanceof
535
597
  export class Class {
536
598
  constructor(..._args) { }
package/v4/locales/ar.cjs CHANGED
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.default = default_1;
27
37
  const util = __importStar(require("../core/util.cjs"));
package/v4/locales/az.cjs CHANGED
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.default = default_1;
27
37
  const util = __importStar(require("../core/util.cjs"));
package/v4/locales/be.cjs CHANGED
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.default = default_1;
27
37
  const util = __importStar(require("../core/util.cjs"));
package/v4/locales/bg.cjs CHANGED
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  exports.parsedType = void 0;
27
37
  exports.default = default_1;