Release notes are now stored in Github Releases: https://github.com/colinhacks/zod/releases
- New parser that allows parsing to continue after non-fatal errors have occurred. This allows Zod to surface more errors to the user at once.
- Custom error messages in schemas
const name = z.string({
invalid_type_error: "Name must be string",
required_error: "Name is required",
});
Under the hood, this creates a custom error map that's bound to the schema. You can also pass a custom error map explicitly.
const name = z.string({ errorMap: myErrorMap });
- Rest parameters for tuples
const myTuple = z.tuple([z.string(), z.number()]).rest(z.boolean());
type t1 = z.output<typeof myTuple>; // [string, number, ...boolean[]]
- Selective
.partial
You can specify certain fields to make optional with the ZodObject.partial
method.
const user = z.object({
name: z.string(),
age: z.number(),
});
const optionalNameUser = user.partial({ name: true });
// { name?: string; age: number; }
- Specify key schema in ZodRecord
Previously, z.record
only accepted a single schema:
z.record(z.boolean()); // Record<string, boolean>;
Now z.record
has been overloaded to support two schemas. The first validates the keys of the record, and the second validates the values.
const schema = z.record(z.number(), z.boolean());
type schema = z.infer<typeof schema>; // Record<number, boolean>
const schema = z.record(z.enum(["Tuna", "Trout"]), z.boolean());
type schema = z.infer<typeof schema>; // Record<"Tuna" | "Trout", boolean>
- Add
z.preprocess
- Implement CUID validation on ZodString (
z.string().cuid()
) - Improved
.deepPartial()
: now recursively operates on arrays, tuples, optionals, and nullables (in addition to objects)
- Eliminate
ZodNonEmptyArray
, addCardinality
toZodArray
- Add optional error message to
ZodArray.nonempty
- Add
.gt/.gte/.lt/.lte
toZodNumber
- Add IE11 support
ZodError.flatten
now optionally accepts a map function for customizing the output.void()
now only accepts undefined, not null.z.enum
now supportsReadonly
string tuples
- Add discriminator to all first-party schema defs
unknown
andany
schemas are always interpreted as optional. Reverts change from 3.3.
- HUGE speed improvements
- Added benchmarking:
yarn benchmark
- Type signature of
ZodType#_parse
has changed. This will affects users who have implemented custom subclasses ofZodType
. - [reverted] Object fields of type
unknown
are no longer inferred as optional.
- Certain methods (
.or
,.transform
) now return a new instance that wrap the current instance, instead of trying to avoid additional nesting. For example:
z.union([z.string(), z.number()]).or(z.boolean());
// previously
// => ZodUnion<[ZodString, ZodNumber, ZodBoolean]>
// now
// => ZodUnion<[ZodUnion<[ZodString, ZodNumber]>, ZodBoolean]>
This change was made due to recursion limitations in TypeScript 4.3 that made it impossible to properly type these methods.
- Moved default value logic into ZodDefault. Implemented
.nullish()
method.
- Added
.returnType
and.parameters
methods to ZodFunction
- Added
.required()
method to ZodObject
- Added Rollup for bundling ESM module
- Added back ZodIntersection
- Added .and() method to base class
- Added
z.strictCreate
- Allowing optional default values on ZodOptional
March 17, 2021
- Refactored parsing logic into individual subclass methods
- Eliminated ZodTypes to enable custom ZodType subclasses
- Removed ZodIntersection
- Added ZodEffects as a container for refinement and transform logic
- Added
or
method toZodType
- Added
format
method toZodError
- Added
unwrap
method toZodOptional
andZodNullable
- Added new
default
method and moved default functionality into ZodOptional - Implemented
z.setErrorMap
- Exporting
z
variable fromindex.ts
to enableimport { z } from 'zod';
Jan 25, 2021
- New implementation of transformers
- Removed type guards
- Added ZodTransformer
- Async refinements
- Introduced
.safeParse
option - Introduced .regex method on string schemas
- Implemented
.primitives()
and.nonprimitives()
on object schemas - Implemented
z.nativeEnum()
for creating schemas from TypeScriptenum
s - Switched to
new URL()
constructor to check valid URLs
- Dropping support for TypeScript 3.2
- Added z.instanceof() and z.custom()
- Implemented ZodSchema.array() method
- Introduced z.void()
- Major overhaul to error handling system, including the introduction of custom error maps
- Wrote new error handling guide
- Added several built-in validators to string, number, and array schemas
- Calls to
.refine
now return new instance
- Introduces ZodAny and ZodUnknown
- Refinement types (
.refine
) - Parsing no longer returns deep clone
- Promise schemas
.parse
acceptsunknown
bigint
schemas
.partial
and.deepPartial
on object schemas
- Added ZodDate
- Added
.pick
,.omit
, and.extend
on object schemas
- Added ZodRecord
- Added
.nonstrict
- Added type assertions with
.check
- Support for empty tuples
- Added type assertions
- Added ZodLiteral
- Added ZodEnum
- Improved error reporting
- Initial release