Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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 1 month ago
JSON representation

NextJS API Validations, support Zod, Yup, Fastest-Validator, Joi, and more

Awesome Lists containing this project

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)
Dung Duc Huynh (Kaka)

πŸ’» πŸ“–
Alexis Rico
Alexis Rico

πŸ’»
AndrΓ© Costa
AndrΓ© Costa

πŸ’»

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