NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #911 most downloaded on npm
React Hook Form validation resolvers: Yup, Joi, Superstruct, Zod, Vest, Class Validator, io-ts, Nope, computed-types, TypeBox, arktype, Typanion, Effect-TS and VineJS
Last release 1 months ago
17 Aug 2026
Ships unpredictably
gaps range from 8 days to 8 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
151 releases · first in 2020
One column per quarter.
exchange fp-ts/Either over fp-ts/lib/Either
ajv resolver to work with unlimited layers of nesting
```tsx import { useForm } from 'react-hook-form'; import { ajvResolver } from '@hookform/resolvers/ajv';
import { useForm } from 'react-hook-form';
import { ajvResolver } from '@hookform/resolvers/ajv';
// must use `minLength: 1` to implement required field
const schema = {
type: 'object',
properties: {
username: {
type: 'string',
minLength: 1,
errorMessage: { minLength: 'username field is required' },
},
password: {
type: 'string',
minLength: 1,
errorMessage: { minLength: 'password field is required' },
},
},
required: ['username', 'password'],
additionalProperties: false,
};
const App = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: ajvResolver(schema),
});
return (
<form onSubmit={handleSubmit((data) => console.log(data))}>
<input {...register('username')} />
{errors.username && <span>{errors.username.message}</span>}
<input {...register('password')} />
{errors.password && <span>{errors.password.message}</span>}
<button type="submit">submit</button>
</form>
);
};
update for other resolvers with new option
zod: add ability to skip zod's parsing
zodResolver: remove duplicated code
native validation with inputs array
## 2.8.6 (2022-01-18) ### Bug Fixes * yupResolver: yup silently fail
yupResolver: prevent reduce to throw error (#300) (8a938cc), closes #299
zodResolver: no exported member ParseParamsNoData
TypeScript issues with the latest react-hook-form version
typings with react-hook-form@7.15.0
# 2.8.0 (2021-08-19) BREAKING CHANGES * zod resolver: require Zod >= 3
## 2.7.1 (2021-08-04) ### Performance Improvements * typanion: reduce bundle size
```tsx import { useForm } from 'react-hook-form'; import { typanionResolver } from '@hookform/resolvers/typanion'; import * as t from 'typanion';
import { useForm } from 'react-hook-form';
import { typanionResolver } from '@hookform/resolvers/typanion';
import * as t from 'typanion';
const isUser = t.isObject({
username: t.applyCascade(t.isString(), [t.hasMinLength(1)]),
age: t.applyCascade(t.isNumber(), [t.isInteger(), t.isInInclusiveRange(1, 100)]),
});
const App = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: typanionResolver(isUser),
});
return (
<form onSubmit={handleSubmit((d) => console.log(d))}>
<input {...register('name')} />
{errors.name?.message && <p>{errors.name?.message}</p>}
<input type="number" {...register('age')} />
{errors.age?.message && <p>{errors.age?.message}</p>}
<input type="submit" />
</form>
);
};
## 2.6.1 (2021-07-13) ### Bug Fixes * native-validation: clear error
support browser native form control
yupResolver: merge yup's options (#172) (7bf09fd), closes #170
zodResolver: improve unionErrors parsing
```tsx import React from 'react'; import { useForm } from 'react-hook-form'; import { computedTypesResolver } from '@hookform/resolvers/computed-types
import React from 'react';
import { useForm } from 'react-hook-form';
import { computedTypesResolver } from '@hookform/resolvers/computed-types';
import Schema, { number, string } from 'computed-types';
const schema = Schema({
username: string.min(1).error('username field is required'),
password: string.min(1).error('password field is required'),
password: number,
});
const App = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm({
resolver: computedTypesResolver(schema),
});
return (
<form onSubmit={handleSubmit((d) => console.log(d))}>
<input {...register('name')} />
{errors.name?.message && <p>{errors.name?.message}</p>}
<input type="number" {...register('age', { valueAsNumber: true })} />
{errors.age?.message && <p>{errors.age?.message}</p>}
<input type="submit" />
</form>
);
};
export default App;
nope resolver (#158) (c8b961b) ```tsx import React from 'react'; import { useForm } from 'react-hook-form'; import { nopeResolver } from '@hookform/re
import React from 'react';
import { useForm } from 'react-hook-form';
import { nopeResolver } from '@hookform/resolvers/nope';
import Nope from 'nope-validator';
const schema = Nope.object().shape({
name: Nope.string().required(),
age: Nope.number().required(),
});
const App = () => {
const { register, handleSubmit } = useForm({
resolver: nopeResolver(schema),
});
return (
<form onSubmit={handleSubmit((d) => console.log(d))}>
<input name="name" ref={register} />
<input name="age" type="number" ref={register} />
<input type="submit" />
</form>
);
};
export default App;
errors with criteriaMode: 'all'
yupResolver: multiple errors messages with same type (#156) (4f87888), closes #155
io-ts resolver (#152) (73dfad7) Huge thanks to @euphocat
import React from 'react';
import { useForm } from 'react-hook-form';
import { ioTsResolver } from '@hookform/resolvers/io-ts';
import t from 'io-ts';
// you don't have to use io-ts-types but it's very useful
import tt from 'io-ts-types';
const schema = t.type({
username: t.string,
age: tt.NumberFromString,
});
const App = () => {
const { register, handleSubmit } = useForm({
resolver: ioTsResolver(schema),
});
return (
<form onSubmit={handleSubmit((d) => console.log(d))}>
<input name="username" ref={register} />
<input name="age" type="number" ref={register} />
<input type="submit" />
</form>
);
};
export default App;
class-validator: add criteriaMode: all support
class-validator resolver 🎉 (#147) (defa00b) Huge thanks to @mzalevski
import 'reflect-metadata';
import React from 'react';
import { useForm } from 'react-hook-form';
import { classValidatorResolver } from '@hookform/resolvers/class-validator';
import { Length, Min, IsEmail } from 'class-validator';
class User {
@Length(2, 30)
username: string;
@Min(18)
age: number;
@IsEmail()
email: string;
}
const App = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<User>({ resolver: classValidatorResolver(User) });
return (
<form onSubmit={handleSubmit((data) => console.log(data))} >
<input type="text" {...register('username')} />
{errors.username && <span>{errors.username.message}</span>}
<input type="text" {...register('email')} />
{errors.email && <span>{errors.email.message}</span>}
<input type="number" {...register('age', { valueAsNumber: true })} />
{errors.age && <span>{errors.age.message}</span>}
<input type="submit" value="Submit" />
</form>
);
};
export default App;
## 2.0.1 (2021-04-08) ### Bug Fixes * use correct peerDependencies
expose array element validation errors in zod resolver
V2 🚀 (#108) (fe53179), closes #108 #97 #114 #116 #115 #117 #123 #125 #124 #126 #127 #128 #129 #131 #130 #132 #134 #136
Nothing published for this version
# 2.0.0-beta.17 (2021-03-31)
types: add Lazy schema support to resolver
types: add Lazy schema support to resolver (#135) (ac2128e), closes #92 #31
# 2.0.0-beta.13 (2021-02-15) ### Performance Improvements * reduce joi and yup bundle size
# 2.0.0-beta.12 (2021-02-06) ### Performance Improvements * reduce joi resolver's size (#131) (3af7bd7) * reduce yup resolver's size
# 2.0.0-beta.11 (2021-02-03) ### Performance Improvements * reduce vest resolver size
# 2.0.0-beta.10 (2021-02-03) ### Features * add error's ref
# 2.0.0-beta.9 (2021-02-03) ### Bug Fixes * zod union error + reduce size
# 2.0.0-beta.8 (2021-02-02) ### Bug Fixes * pass down Joi context
# 2.0.0-beta.7 (2021-01-28) ### Features * update to react-hook-form v7 (5fdc7f9) ### BREAKING CHANGES * Require react-hook-form >= 7
add Vest sync validation + update to v3
# 2.0.0-beta.5 (2021-01-22) ### Features * add Joi sync validation (#116) (8e3b54a) * add Yup sync validation
# 2.0.0-beta.4 (2021-01-21) ### Features * add Zod async validation
# 2.0.0-beta.3 (2021-01-05) ### Bug Fixes * yup resolver typescript errors
# 2.0.0-beta.2 (2021-01-05) ### Features * improve modules support
there will be some breaking changes in the next versions
Nothing published for this version
yupResolver: Yup fails silently
support ie11 (#144) (260448a), closes #143
## 1.3.6 (2021-03-26) ### Bug Fixes * bundles cjs, esm & umd
## 1.3.4 (2021-02-02) ### Bug Fixes * Joi pass context from useForm
expose array element validation errors in zod resolver
yup resolver TypeScript error (#106) (115f041), closes #97
Nothing published for this version
esm support to fix bundler incompatibility
esm support to fix bundler incompatibility (#95)
Nothing published for this version
```tsx import * as React from 'react'; import { useForm } from 'react-hook-form'; import { vestResolver } from '@hookform/resolvers/vest'; import vest
vestResolver (#82)
import * as React from 'react';
import { useForm } from 'react-hook-form';
import { vestResolver } from '@hookform/resolvers/vest';
import vest, { test, enforce } from 'vest';
const validationSuite = vest.create((data = {}) => {
test('username', 'Username is required', () => {
enforce(data.username).isNotEmpty();
});
test('username', 'Must be longer than 3 chars', () => {
enforce(data.username).longerThan(3);
});
test('password', 'Password is required', () => {
enforce(data.password).isNotEmpty();
});
test('password', 'Password must be at least 5 chars', () => {
enforce(data.password).longerThanOrEquals(5);
});
test('password', 'Password must contain a digit', () => {
enforce(data.password).matches(/[0-9]/);
});
test('password', 'Password must contain a symbol', () => {
enforce(data.password).matches(/[^A-Za-z0-9]/);
});
});
const App = () => {
const { register, handleSubmit, errors } = useForm({
resolver: vestResolver(validationSuite),
});
return (
<form onSubmit={handleSubmit((data) => console.log(data))}>
<input type="text" name="username" ref={register} />
<input type="text" name="password" ref={register} />
<input type="submit" />
</form>
);
};
fix: superstruct filename typo
fix: superstruct filename typo (#89)
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →