next-validations
v1.0.3
Published
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
Downloads
10,958
Maintainers
Readme
Welcome to next-validations 👋
NextJS API Validations
🏠 Homepage
✨ Demo
Prerequisites
- node >=18
- nextjs >= 9
Install
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, Fastest-Validator, Joi, Zod, and 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. This allows for even more flexibility and compatibility with additional validation libraries.
Usage
Validation of multiple modes
yarn add yup joi next-validations @typeschema/yup @typeschema/yoi
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
yarn add yup next-validations @typeschema/yup
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
yarn add zod next-validations @typeschema/zod
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
yarn add valibot next-validations @typeschema/valibot
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
yarn add fastest-validator next-validations @typeschema/fastest-validator
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
yarn add joi next-connect next-validations @typeschema/joi
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
yarn test
Author
👤 Huynh Duc Dung
Show your support
Give a ⭐️ if this project helped you!
Star History
Contributors ✨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!