Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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: 10 days 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 3 years ago)
- Default Branch: main
- Last Pushed: 2024-05-01T19:58:55.000Z (6 months ago)
- Last Synced: 2024-05-02T02:28:51.047Z (6 months ago)
- Topics: api, fastest-validator, hacktoberfest, joi-validation, nextjs, validations, yup-validation, zod
- Language: TypeScript
- Homepage: https://next-validations.productsway.com/
- Size: 7.19 MB
- Stars: 43
- Watchers: 3
- 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 π
[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-)
[![Version](https://img.shields.io/npm/v/next-validations.svg)](https://npmjs.org/package/next-validations)
[![Downloads/week](https://img.shields.io/npm/dw/next-validations.svg)](https://npmjs.org/package/next-validations)
![Prerequisite](https://img.shields.io/badge/node-%3E%3D10-blue.svg)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](#)
[![Twitter: jellydn](https://img.shields.io/twitter/follow/jellydn.svg?style=social)](https://twitter.com/jellydn)> NextJS API Validations
## π [Homepage](https://github.com/jellydn/next-validations)
### β¨ [Demo](https://next-validations-demo.productsway.com/)
![https://gyazo.com/bf4582f7b7aa0f0ae67c4cc337c4e974.gif](https://gyazo.com/bf4582f7b7aa0f0ae67c4cc337c4e974.gif)
## 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,
type: 'Yup',
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,
type: 'Joi',
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,
type: 'Yup',
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,
type: 'Zod',
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,
type: 'Valibot',
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({
schema,
type: 'FastestValidator',
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,
type: 'Joi',
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!
[![kofi](https://img.shields.io/badge/Ko--fi-F16061?style=for-the-badge&logo=ko-fi&logoColor=white)](https://ko-fi.com/dunghd)
[![paypal](https://img.shields.io/badge/PayPal-00457C?style=for-the-badge&logo=paypal&logoColor=white)](https://paypal.me/dunghd)
[![buymeacoffee](https://img.shields.io/badge/Buy_Me_A_Coffee-FFDD00?style=for-the-badge&logo=buy-me-a-coffee&logoColor=black)](https://www.buymeacoffee.com/dunghd)## Star History
[![Star History Chart](https://api.star-history.com/svg?repos=jellydn/next-validations&type=Date)](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!