zod 4.2.0-canary.20251118T055751 → 4.2.0-canary.20251118T062010

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.2.0-canary.20251118T055751",
3
+ "version": "4.2.0-canary.20251118T062010",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Colin McDonnell <zod@colinhacks.com>",
@@ -3793,8 +3793,8 @@ export const $ZodReadonly: core.$constructor<$ZodReadonly> = /*@__PURE__*/ core.
3793
3793
  $ZodType.init(inst, def);
3794
3794
  util.defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues);
3795
3795
  util.defineLazy(inst._zod, "values", () => def.innerType._zod.values);
3796
- util.defineLazy(inst._zod, "optin", () => def.innerType._zod.optin);
3797
- util.defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
3796
+ util.defineLazy(inst._zod, "optin", () => def.innerType?._zod?.optin);
3797
+ util.defineLazy(inst._zod, "optout", () => def.innerType?._zod?.optout);
3798
3798
 
3799
3799
  inst._zod.parse = (payload, ctx) => {
3800
3800
  if (ctx.direction === "backward") {
@@ -4186,10 +4186,10 @@ export const $ZodLazy: core.$constructor<$ZodLazy> = /*@__PURE__*/ core.$constru
4186
4186
  // return () => _innerType;
4187
4187
  // });
4188
4188
  util.defineLazy(inst._zod, "innerType", () => def.getter() as $ZodType);
4189
- util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod.pattern);
4190
- util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod.propValues);
4191
- util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod.optin ?? undefined);
4192
- util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod.optout ?? undefined);
4189
+ util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod?.pattern);
4190
+ util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod?.propValues);
4191
+ util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod?.optin ?? undefined);
4192
+ util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod?.optout ?? undefined);
4193
4193
  inst._zod.parse = (payload, ctx) => {
4194
4194
  const inner = inst._zod.innerType;
4195
4195
  return inner._zod.run(payload, ctx);
@@ -0,0 +1,45 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import * as z from "zod/v4";
3
+
4
+ describe("Recursive Tuples Regression #5089", () => {
5
+ it("creates recursive tuple without crash", () => {
6
+ expect(() => {
7
+ const y = z.lazy((): any => z.tuple([y, y]).or(z.string()));
8
+ }).not.toThrow();
9
+ });
10
+
11
+ it("parses recursive tuple data correctly", () => {
12
+ const y = z.lazy((): any => z.tuple([y, y]).or(z.string()));
13
+
14
+ // Base case
15
+ expect(y.parse("hello")).toBe("hello");
16
+
17
+ // Recursive cases
18
+ expect(() => y.parse(["a", "b"])).not.toThrow();
19
+ expect(() => y.parse(["a", ["b", "c"]])).not.toThrow();
20
+ });
21
+
22
+ it("matches #5089 expected behavior", () => {
23
+ // Exact code from the issue
24
+ expect(() => {
25
+ const y = z.lazy((): any => z.tuple([y, y]).or(z.string()));
26
+ y.parse(["a", ["b", "c"]]);
27
+ }).not.toThrow();
28
+ });
29
+
30
+ it("handles workaround pattern", () => {
31
+ // Alternative pattern from issue discussion
32
+ expect(() => {
33
+ const y = z.lazy((): any => z.string().or(z.lazy(() => z.tuple([y, y]))));
34
+ y.parse(["a", ["b", "c"]]);
35
+ }).not.toThrow();
36
+ });
37
+
38
+ it("recursive arrays still work (comparison)", () => {
39
+ const y = z.lazy((): any => z.array(y).or(z.string()));
40
+
41
+ expect(y.parse("hello")).toBe("hello");
42
+ expect(y.parse(["hello", "world"])).toEqual(["hello", "world"]);
43
+ expect(y.parse(["a", ["b", "c"]])).toEqual(["a", ["b", "c"]]);
44
+ });
45
+ });
@@ -1780,8 +1780,8 @@ exports.$ZodReadonly = core.$constructor("$ZodReadonly", (inst, def) => {
1780
1780
  exports.$ZodType.init(inst, def);
1781
1781
  util.defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues);
1782
1782
  util.defineLazy(inst._zod, "values", () => def.innerType._zod.values);
1783
- util.defineLazy(inst._zod, "optin", () => def.innerType._zod.optin);
1784
- util.defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
1783
+ util.defineLazy(inst._zod, "optin", () => def.innerType?._zod?.optin);
1784
+ util.defineLazy(inst._zod, "optout", () => def.innerType?._zod?.optout);
1785
1785
  inst._zod.parse = (payload, ctx) => {
1786
1786
  if (ctx.direction === "backward") {
1787
1787
  return def.innerType._zod.run(payload, ctx);
@@ -1941,10 +1941,10 @@ exports.$ZodLazy = core.$constructor("$ZodLazy", (inst, def) => {
1941
1941
  // return () => _innerType;
1942
1942
  // });
1943
1943
  util.defineLazy(inst._zod, "innerType", () => def.getter());
1944
- util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod.pattern);
1945
- util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod.propValues);
1946
- util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod.optin ?? undefined);
1947
- util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod.optout ?? undefined);
1944
+ util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod?.pattern);
1945
+ util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod?.propValues);
1946
+ util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod?.optin ?? undefined);
1947
+ util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod?.optout ?? undefined);
1948
1948
  inst._zod.parse = (payload, ctx) => {
1949
1949
  const inner = inst._zod.innerType;
1950
1950
  return inner._zod.run(payload, ctx);
@@ -1749,8 +1749,8 @@ export const $ZodReadonly = /*@__PURE__*/ core.$constructor("$ZodReadonly", (ins
1749
1749
  $ZodType.init(inst, def);
1750
1750
  util.defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues);
1751
1751
  util.defineLazy(inst._zod, "values", () => def.innerType._zod.values);
1752
- util.defineLazy(inst._zod, "optin", () => def.innerType._zod.optin);
1753
- util.defineLazy(inst._zod, "optout", () => def.innerType._zod.optout);
1752
+ util.defineLazy(inst._zod, "optin", () => def.innerType?._zod?.optin);
1753
+ util.defineLazy(inst._zod, "optout", () => def.innerType?._zod?.optout);
1754
1754
  inst._zod.parse = (payload, ctx) => {
1755
1755
  if (ctx.direction === "backward") {
1756
1756
  return def.innerType._zod.run(payload, ctx);
@@ -1910,10 +1910,10 @@ export const $ZodLazy = /*@__PURE__*/ core.$constructor("$ZodLazy", (inst, def)
1910
1910
  // return () => _innerType;
1911
1911
  // });
1912
1912
  util.defineLazy(inst._zod, "innerType", () => def.getter());
1913
- util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod.pattern);
1914
- util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod.propValues);
1915
- util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod.optin ?? undefined);
1916
- util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod.optout ?? undefined);
1913
+ util.defineLazy(inst._zod, "pattern", () => inst._zod.innerType?._zod?.pattern);
1914
+ util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod?.propValues);
1915
+ util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod?.optin ?? undefined);
1916
+ util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod?.optout ?? undefined);
1917
1917
  inst._zod.parse = (payload, ctx) => {
1918
1918
  const inner = inst._zod.innerType;
1919
1919
  return inner._zod.run(payload, ctx);