https://github.com/jellydn/next-validations
NextJS API Validations, support Zod, Yup, Fastest-Validator, Joi, and more
https://github.com/jellydn/next-validations
api fastest-validator hacktoberfest joi-validation nextjs validations yup-validation zod
Last synced: 9 months ago
JSON representation
NextJS API Validations, support Zod, Yup, Fastest-Validator, Joi, and more
- Host: GitHub
- URL: https://github.com/jellydn/next-validations
- Owner: jellydn
- License: mit
- Created: 2021-05-03T16:57:47.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2025-04-02T17:22:39.000Z (9 months ago)
- Last Synced: 2025-04-02T18:29:26.918Z (9 months ago)
- Topics: api, fastest-validator, hacktoberfest, joi-validation, nextjs, validations, yup-validation, zod
- Language: TypeScript
- Homepage: https://next-validations.productsway.com/
- Size: 8.1 MB
- Stars: 52
- Watchers: 2
- Forks: 5
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome - jellydn/next-validations - NextJS API Validations, support Zod, Yup, Fastest-Validator, Joi, and more (TypeScript)
README
# Welcome to next-validations 👋
[](#contributors-)
[](https://npmjs.org/package/next-validations)
[](https://npmjs.org/package/next-validations)

[](#)
[](https://twitter.com/jellydn)
> NextJS API Validations
## 🏠 [Homepage](https://github.com/jellydn/next-validations)
### ✨ [Demo](https://next-validations-demo.productsway.com/)

## Prerequisites
- node >=18
- nextjs >= 9
## Install
```sh
yarn add next-validations
```
## Features
- **Support for Multiple Validation Libraries**: This package is designed to work seamlessly with a variety of popular validation libraries. These include [Yup](https://github.com/jquense/yup), [Fastest-Validator](https://github.com/icebob/fastest-validator), [Joi](https://github.com/sideway/joi), [Zod](https://github.com/colinhacks/zod), and [Valibot](https://github.com/fabian-hiller/valibot). This means you can choose the library that best suits your project's needs.
- **Integration with TypeSchema**: `next-validations` integrates with [TypeSchema - Universal adapter for TypeScript schema validation](https://typeschema.com/). This allows for even more flexibility and compatibility with additional validation libraries.
## Usage
### Validation of multiple modes
```sh
yarn add yup joi next-validations @typeschema/yup @typeschema/yoi
```
```typescript
import Joi from 'joi';
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { withValidations } from 'next-validations';
import * as yup from 'yup';
const querySchema = yup.object().shape({
type: yup.string().oneOf(['email', 'sms']).required(),
});
const validateQuery = {
schema: querySchema,
mode: 'query',
} as const;
const bodySchema = Joi.object({
phone: Joi.string().required(),
email: Joi.string().email().required(),
name: Joi.string().required(),
});
const validateBody = {
schema: bodySchema,
mode: 'body',
} as const;
const validate = withValidations([validateQuery, validateBody]);
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json({ ...req.body, ...req.query });
};
export default connect().post(validate(), handler);
```
### Validate custom API endpoint with Yup
```sh
yarn add yup next-validations @typeschema/yup
```
```typescript
import { NextApiRequest, NextApiResponse } from 'next';
import { withValidation } from 'next-validations';
import * as yup from 'yup';
const schema = yup.object().shape({
name: yup.string().required(),
});
const validate = withValidation({
schema,
mode: 'query',
});
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json(req.query);
};
const router = createRouter();
router.post(validate(), handler);
export default router.handler({
onError: (err, _req, _event) => {
return new NextResponse('Something broke!', {
status: (err as any)?.statusCode ?? 500,
});
},
});
```
### Validate custom API endpoint with Zod
```sh
yarn add zod next-validations @typeschema/zod
```
```typescript
import { NextApiRequest, NextApiResponse } from 'next';
import { withValidation } from 'next-validations';
import { z } from 'zod';
const schema = z.object({
username: z.string().min(6),
});
const validate = withValidation({
schema,
mode: 'body',
});
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json(req.body);
};
export default validate(handler);
```
### Validate custom API endpoint with Valibot
```sh
yarn add valibot next-validations @typeschema/valibot
```
```typescript
import { NextApiRequest, NextApiResponse } from 'next';
import { withValidation } from 'next-validations';
import * as valibot from 'valibot';
const schema = valibot.object({
name: valibot.string([valibot.minLength(4)]),
});
const validate = withValidation({
schema,
mode: 'query',
});
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json(req.query);
};
export default validate(handler);
```
### Validate custom API endpoint with fastest-validator
```sh
yarn add fastest-validator next-validations @typeschema/fastest-validator
```
```typescript
import { NextApiRequest, NextApiResponse } from 'next';
import { withValidation } from 'next-validations';
const schema = {
name: { type: 'string', min: 3, max: 255 },
email: { type: 'email' },
age: 'number',
};
const validate = withValidation({
// This is fastest-validator schema, the type is not working nicely with TypeScript
schema: schema as any,
mode: 'body',
});
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json(req.body);
};
export default validate(handler);
```
### Validate custom API endpoint with joi
```sh
yarn add joi next-connect next-validations @typeschema/joi
```
```typescript
import Joi from 'joi';
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { withValidation } from 'next-validations';
const schema = Joi.object({
dob: Joi.date().iso(),
email: Joi.string().email().required(),
name: Joi.string().required(),
});
const validate = withValidation({
schema,
mode: 'body',
});
const handler = (req: NextApiRequest, res: NextApiResponse) => {
res.status(200).json(req.body);
};
const router = createRouter();
router.post(validate(), handler);
export default router.handler({
onError: (err, _req, _event) => {
return new NextResponse('Something broke!', {
status: (err as any)?.statusCode ?? 500,
});
},
});
```
## Run tests
```sh
yarn test
```
## Author
👤 **Huynh Duc Dung**
- Website: https://productsway.com/
- Twitter: [@jellydn](https://twitter.com/jellydn)
- Github: [@jellydn](https://github.com/jellydn)
## Show your support
Give a ⭐️ if this project helped you!
[](https://ko-fi.com/dunghd)
[](https://paypal.me/dunghd)
[](https://www.buymeacoffee.com/dunghd)
## Star History
[](https://star-history.com/#jellydn/next-validations&Date)
## Contributors ✨
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

Dung Duc Huynh (Kaka)
💻 📖

Alexis Rico
💻

André Costa
💻
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!