next-validations
Version:
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
293 lines (211 loc) • 8.79 kB
Markdown
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->
[](https://npmjs.org/package/next-validations)
[](https://npmjs.org/package/next-validations)

[](#)
[](https://twitter.com/jellydn)
> NextJS API Validations

- node >=18
- nextjs >= 9
```sh
yarn add next-validations
```
- **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.
```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);
```
```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,
});
},
});
```
```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);
```
```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);
```
```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);
```
```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,
});
},
});
```
```sh
yarn test
```
👤 **Huynh Duc Dung**
- Website: https://productsway.com/
- Twitter: [@jellydn](https://twitter.com/jellydn)
- Github: [@jellydn](https://github.com/jellydn)
Give a ⭐️ if this project helped you!
[](https://ko-fi.com/dunghd)
[](https://paypal.me/dunghd)
[](https://www.buymeacoffee.com/dunghd)
[](https://star-history.com/#jellydn/next-validations&Date)
Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://productsway.com/"><img src="https://avatars.githubusercontent.com/u/870029?v=4?s=100" width="100px;" alt="Dung Duc Huynh (Kaka)"/><br /><sub><b>Dung Duc Huynh (Kaka)</b></sub></a><br /><a href="https://github.com/jellydn/next-validations/commits?author=jellydn" title="Code">💻</a> <a href="https://github.com/jellydn/next-validations/commits?author=jellydn" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://sferadev.com"><img src="https://avatars.githubusercontent.com/u/2181866?v=4?s=100" width="100px;" alt="Alexis Rico"/><br /><sub><b>Alexis Rico</b></sub></a><br /><a href="https://github.com/jellydn/next-validations/commits?author=SferaDev" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/decs"><img src="https://avatars.githubusercontent.com/u/601381?v=4?s=100" width="100px;" alt="André Costa"/><br /><sub><b>André Costa</b></sub></a><br /><a href="https://github.com/jellydn/next-validations/commits?author=decs" title="Code">💻</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!