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
package/src/v4/core/schemas.ts
CHANGED
|
@@ -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
|
|
3797
|
-
util.defineLazy(inst._zod, "optout", () => def.innerType
|
|
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
|
|
4190
|
-
util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod
|
|
4191
|
-
util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod
|
|
4192
|
-
util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod
|
|
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
|
+
});
|
package/v4/core/schemas.cjs
CHANGED
|
@@ -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
|
|
1784
|
-
util.defineLazy(inst._zod, "optout", () => def.innerType
|
|
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
|
|
1945
|
-
util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod
|
|
1946
|
-
util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod
|
|
1947
|
-
util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod
|
|
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);
|
package/v4/core/schemas.js
CHANGED
|
@@ -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
|
|
1753
|
-
util.defineLazy(inst._zod, "optout", () => def.innerType
|
|
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
|
|
1914
|
-
util.defineLazy(inst._zod, "propValues", () => inst._zod.innerType?._zod
|
|
1915
|
-
util.defineLazy(inst._zod, "optin", () => inst._zod.innerType?._zod
|
|
1916
|
-
util.defineLazy(inst._zod, "optout", () => inst._zod.innerType?._zod
|
|
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);
|