Variants System
Two forms:
- Object-based (
variants.pure/input/result
) – enable flags + suffix + excludeFields + partial. - Array-based custom variants – each element:
{ name, suffix?, exclude?, additionalValidation?, makeOptional?, transformRequiredToOptional?, transformOptionalToRequired?, removeValidation?, partial? }
.
Generation behavior:
- Skips entirely if
emit.variants=false
or single-file mode active (variants suppressed in strict single-file). - Pure models may still generate separately (
emit.pureModels
). pureVariantOnlyMode
&pureModelsOnlyMode
heuristics reduce other schema categories.
Custom variant field building applies:
- Base inferred zod type
- Optionality transforms
- Additional validations from variant def or
@zod
doc comments - Enum imports resolved relative to variants directory
Partial Flag
The partial
flag automatically applies .partial()
to generated Zod schemas, making all fields optional. This is useful for update operations where you only want to provide some fields.
Configuration
Object-based variants:
{
"variants": {
"input": {
"enabled": true,
"partial": true
},
"result": {
"enabled": true,
"partial": false
}
}
}
Array-based custom variants:
{
"variants": [
{
"name": "UpdateInput",
"suffix": "UpdateInput",
"partial": true
},
{
"name": "CreateInput",
"suffix": "CreateInput",
"partial": false
}
]
}
Example Output
With partial: true
:
export const UserInputSchema = z.object({
id: z.number().int(),
name: z.string(),
email: z.string().email()
}).strict().partial();
With partial: false
(default):
export const UserResultSchema = z.object({
id: z.number().int(),
name: z.string(),
email: z.string().email()
}).strict();
Use Cases
- Update operations: Use
partial: true
for PATCH/PUT endpoints where users provide only fields to update - Create operations: Use
partial: false
for POST endpoints where all required fields must be provided - Form handling: Partial schemas for progressive form completion
- API flexibility: Allow clients to send minimal payloads