Optional
opts: deepNoDefaults.Optionsimport * as vi from "vitest"
import { zx } from "@traversable/zod"
// Using `zx.deepNoDefaults.writeable` here to make it easier to visualize `zx.deepNoDefaults`'s behavior:
vi.expect.soft(zx.deepNoDefaults.writeable(
z.object({
a: z.number().default(0),
b: z.boolean().default(false).optional(),
c: z.boolean().optional().default(false),
d: z.union([z.string().default(''), z.number().default(0)]),
e: z.array(
z.object({
f: z.number().default(0),
g: z.boolean().default(false).optional(),
h: z.boolean().optional().default(false),
i: z.union([z.string().default(''), z.number().default(0)]),
}).default({
f: 0,
g: false,
h: false,
i: '',
})
).default([])
})
)).toMatchInlineSnapshot
(`
"z.object({
a: z.number().optional(),
b: z.boolean().optional(),
c: z.boolean().optional(),
d: z.union([z.string(), z.number()]).optional(),
e: z
.array(
z.object({
f: z.number().optional(),
g: z.boolean().optional(),
h: z.boolean().optional(),
i: z.union([z.string(), z.number()]).optional(),
}),
)
.optional(),
})
"
`)
zx.deepNoDefaults
Recursively removes any z._default
z.default
nodes.Unless you opt out, if the node is an object property, the property will be wrapped with z.optional
z.optional
.To opt out, pass
{ replaceWithOptional: false }
as the second argument tozx.deepNoDefaults
.