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: about 2 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 (about 4 years ago)
- Default Branch: main
- Last Pushed: 2025-04-02T17:22:39.000Z (about 2 months ago)
- Last Synced: 2025-04-02T18:29:26.918Z (about 2 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!