Skip to content

cuonqcon333/form-request

Repository files navigation

Form Request

Laravel-inspired request validation for Express.

Simple, clean, and developer-friendly validation with automatic 422 responses and validated data extraction.

npm version License: MIT


Installation

npm install @caplab/form-request

Quick Example

import express from "express";
import { validation } from "@caplab/form-request";

const app = express();

app.use(express.json());
app.use(validation());

app.post("/register", async (req, res) => {
	await req.validate({
		email: "required|email",
		password: "required|min:6",
	});

	const data = req.validated();

	res.json({
		success: true,
		data,
	});
});

Why Form Request?

Validation in Express is often verbose or fragmented across middleware.

Form Request brings a Laravel-style validation experience to Express:

  • Laravel-like validation syntax
  • Automatic 422 JSON responses
  • Clean validated data extraction
  • Removes unvalidated fields automatically
  • Inline validation or class-based requests
  • Works with both JavaScript and TypeScript

Features

  • Pipe-style validation rules
'email': 'required|email|min:5'
  • Automatic validation error responses
  • req.validated() returns only validated fields
  • Nested object validation
  • Array wildcard validation
  • Custom validation rules
  • Custom error messages
  • TypeScript support
  • FormRequest classes

Basic Usage

Inline Validation

app.post("/login", async (req, res) => {
	const data = await req.validate({
		email: "required|email",
		password: "required|min:6",
	});

	res.json(data);
});

FormRequest Classes

import { FormRequest } from "@caplab/form-request";

class RegisterRequest extends FormRequest {
	rules() {
		return {
			email: "required|email",
			password: "required|min:6",
		};
	}

	messages() {
		return {
			"email.required": "Email is required",
			"email.email": "Email must be valid",
		};
	}
}

app.post("/register", async (req, res) => {
	await req.validate(RegisterRequest);

	const data = req.validated();

	res.json(data);
});

Validated Data Only

Extra fields are automatically removed.

Request body:

{
	"email": "john@example.com",
	"password": "123456",
	"is_admin": true
}

Validated result:

const data = req.validated();

Output:

{
	"email": "john@example.com",
	"password": "123456"
}

Nested Validation

await req.validate({
	"user.email": "required|email",
	"user.name": "required",
	"users.*.email": "required|email",
});

Custom Rules

import { extend } from "@caplab/form-request";

extend("phone", async (value) => {
	return /^\d{10}$/.test(value);
});

await req.validate({
	phone: "required|phone",
});

Custom Messages

await req.validate(
	{
		email: "required|email",
	},
	{
		attributes: {
			email: "email address",
		},
	},
);

Response:

{
	"message": "The email address field is required."
}

Available Rules

Rule Description
required Field is required
nullable Field may be null
string Must be a string
number Must be a number
integer Must be an integer
boolean Must be a boolean
array Must be an array
object Must be an object
email Must be a valid email
min:n Minimum value or length
max:n Maximum value or length
same:field Must match another field
confirmed Requires {field}_confirmation

Example Validation Error

{
	"message": "The given data was invalid.",
	"errors": {
		"email": ["The email field is required."]
	}
}

License

MIT

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors