Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

next-validations

jellydn10.3kMIT1.1.0TypeScript support: included

nextjs, validation, next-validation, yup, joi, fastest-validator, valibot

readme

Welcome to next-validations 👋

All Contributors

Version Downloads/week Prerequisite License: MIT Twitter: jellydn

NextJS API Validations

🏠 Homepage

Demo

https://gyazo.com/bf4582f7b7aa0f0ae67c4cc337c4e974.gif

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,
  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

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,
  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,
  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,
  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({
  // 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

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,
  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!

kofi paypal buymeacoffee

Star History

Star History Chart

Contributors ✨

Thanks goes to these wonderful people (emoji key):

Dung Duc Huynh (Kaka)
Dung Duc Huynh (Kaka)

💻 📖
Alexis Rico
Alexis Rico

💻
André Costa
André Costa

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

changelog

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, adheres to Semantic Versioning, and is generated by Changie.

1.1.0 (2025-05-23)

Features

  • improve request validation with headers support (96e7d1b)

Bug Fixes

  • deps: update all non-major dependencies (#1006) (3841dfb)
  • deps: update all non-major dependencies (#1015) (1e2ace1)
  • deps: update all non-major dependencies (#1031) (26bab72)
  • deps: update all non-major dependencies (#1033) (d11c4d5)
  • deps: update all non-major dependencies (#1040) (3ae1425)
  • deps: update all non-major dependencies (#1046) (2756a08)
  • deps: update all non-major dependencies (#1052) (033493b)
  • deps: update all non-major dependencies (#1053) (dd04d80)
  • deps: update all non-major dependencies (#1065) (c8d04dd)
  • deps: update all non-major dependencies (#1066) (31ca273)
  • deps: update all non-major dependencies (#1073) (4daf7ee)
  • deps: update all non-major dependencies (#1081) (62a5586)
  • deps: update all non-major dependencies (#1082) (bb40d1e)
  • deps: update all non-major dependencies (#1083) (42c815b)
  • deps: update all non-major dependencies (#999) (fccf5eb)
  • deps: update all non-major dependencies to v19.1.0 (#1026) (b78d5bb)
  • deps: update dependency caniuse-lite to v1.0.30001676 (0194fe1)
  • deps: update dependency caniuse-lite to v1.0.30001677 (98dd6f8)
  • deps: update dependency caniuse-lite to v1.0.30001678 (377c90e)
  • deps: update dependency caniuse-lite to v1.0.30001679 (#969) (ad17a6c)
  • deps: update dependency caniuse-lite to v1.0.30001680 (#970) (b7a816d)
  • deps: update dependency caniuse-lite to v1.0.30001683 (#980) (fe5ea1d)
  • deps: update dependency caniuse-lite to v1.0.30001684 (#982) (3890d17)
  • deps: update dependency caniuse-lite to v1.0.30001686 (#990) (5b454ad)
  • deps: update dependency caniuse-lite to v1.0.30001687 (#996) (483b808)
  • deps: update dependency caniuse-lite to v1.0.30001703 (#1003) (693e9e8)
  • deps: update dependency caniuse-lite to v1.0.30001704 (#1008) (6eecb43)
  • deps: update dependency caniuse-lite to v1.0.30001705 (#1012) (501fa64)
  • deps: update dependency caniuse-lite to v1.0.30001706 (#1016) (16a8ab1)
  • deps: update dependency caniuse-lite to v1.0.30001707 (#1020) (a9f55f6)
  • deps: update dependency caniuse-lite to v1.0.30001709 (#1032) (d24d928)
  • deps: update dependency caniuse-lite to v1.0.30001710 (#1034) (14fa2d8)
  • deps: update dependency caniuse-lite to v1.0.30001711 (#1037) (bb3ff12)
  • deps: update dependency caniuse-lite to v1.0.30001712 (#1038) (093be99)
  • deps: update dependency caniuse-lite to v1.0.30001715 (#1057) (2004b41)
  • deps: update dependency caniuse-lite to v1.0.30001717 (#1070) (faa38f7)
  • deps: update dependency caniuse-lite to v1.0.30001718 (#1077) (c4ad40a)
  • deps: update dependency next to v15.2.4 (#1023) (dc603ed)
  • deps: update dependency next to v15.2.5 (#1043) (30c510e)
  • deps: update dependency next to v15.3.0 (#1045) (e284af0)
  • deps: update dependency next to v15.3.1 (#1054) (8a126cb)
  • deps: update dependency qs to v6.13.1 (#975) (b2cf99b)
  • deps: update dependency swagger-ui-react to v5.18.0 (#965) (2d279b6)
  • deps: update dependency swagger-ui-react to v5.20.1 (#1005) (ee2a3a6)
  • deps: update dependency swagger-ui-react to v5.20.2 (#1025) (018a4d9)
  • deps: update dependency swagger-ui-react to v5.20.6 (#1035) (a121fe3)
  • deps: update dependency swagger-ui-react to v5.21.0 (#1048) (f82394d)
  • deps: update dependency zod to v3.24.4 (#1068) (aebf50c)
  • deps: update dependency zod to v3.25.23 (#1084) (6491963)
  • deps: update react monorepo to v19 (#994) (7bc2de2)

1.0.2 (2024-09-15)

Bug Fixes

  • deps: update all non-major dependencies (655c778)
  • deps: update all non-major dependencies (1dae42c)
  • deps: update all non-major dependencies (7fec067)
  • deps: update all non-major dependencies (e503aa1)
  • deps: update all non-major dependencies (190dd9f)
  • deps: update all non-major dependencies (c975f5a)
  • deps: update all non-major dependencies (#885) (3eb9d0a)
  • deps: update dependency caniuse-lite to v1.0.30001645 (fd076f6)
  • deps: update dependency caniuse-lite to v1.0.30001649 (2645ea4)
  • deps: update dependency caniuse-lite to v1.0.30001650 (b597f39)
  • deps: update dependency caniuse-lite to v1.0.30001653 (c0cce1c)
  • deps: update dependency caniuse-lite to v1.0.30001654 (bc11b0b)
  • deps: update dependency caniuse-lite to v1.0.30001657 (9281321)
  • deps: update dependency caniuse-lite to v1.0.30001658 (020fadf)
  • deps: update dependency caniuse-lite to v1.0.30001659 (54240c0)
  • deps: update dependency qs to v6.13.0 (6dc69ed)

1.0.0 (2024-03-13)

⚠ BREAKING CHANGES

  • package.json: Update Node.js engine version to 18
  • resolvers: replace resolvers with typeschema

Bug Fixes

  • deps: update dependency next-validations to v0.4.2 (#792) (0010d87)

Code Refactoring

  • package.json: Update Node.js engine version to 18 (8ffb3c0)
  • resolvers: replace resolvers with typeschema (cc97da4)

0.3.0 - 2022-11-26

Added

  • Validation of multiple modes