TYPE: TOOL LANG: MARKDOWN

validation

Validate input data, ensure data integrity, and implement data checking rules. Use when validating forms, API inputs, data models, or user input.

DIRECTIVE_TEXTUELLE

Validation Skill

Validate input data and ensure data integrity.

When to Use

Use this skill when the user wants to:

  • Validate user inputs
  • Check data types
  • Enforce data format rules
  • Implement validation schemas
  • Validate API request/response
  • Ensure data consistency
  • Provide user-friendly validation errors

Validation Types

Client-Side Validation

  • Form validation: Before submission
  • Input type validation: Email, URL, date
  • Format validation: Email, phone, zip code
  • Length validation: Min/max length
  • Pattern validation: Regex patterns

Server-Side Validation

  • API request validation: All requests
  • Data model validation: Database constraints
  • Business rules validation: Custom rules
  • Security validation: No injection attacks

Data Integrity Validation

  • Format validation: JSON, XML, CSV
  • Type validation: Correct types
  • Range validation: Value ranges
  • Required fields: All required fields present

Common Validation Rules

Email Validation

// Email pattern
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

// Validate
if (!emailRegex.test(email)) {
  return { error: 'Invalid email format' };
}

Password Validation

// Password requirements
const password = req.body.password;
const isValid =
  password.length >= 8 &&
  /[A-Z]/.test(password) &&
  /[0-9]/.test(password) &&
  /[^A-Za-z0-9]/.test(password);

URL Validation

// URL regex
const urlRegex = /^https?:\/\/.+/;

if (!urlRegex.test(url)) {
  return { error: 'Invalid URL format' };
}

Phone Validation

// Phone regex (US format)
const phoneRegex = /^\d{3}-\d{3}-\d{4}$/;

if (!phoneRegex.test(phone)) {
  return { error: 'Invalid phone format (use XXX-XXX-XXXX)' };
}

Validation Libraries

JavaScript

  • Joi: Schema validation
  • Zod: Runtime type validation
  • Yup: Schema validation
  • validator.js: Utility functions
  • ajv: JSON Schema validation

Python

  • Pydantic: Data validation
  • Marshmallow: Data validation and serialization
  • email-validator: Email validation
  • validators: Utility validators

Schema Validation

Joi Schema

const Joi = require('joi');

const schema = Joi.object({
  email: Joi.string()
    .email()
    .required(),
  age: Joi.number()
    .integer()
    .min(18)
    .max(120)
    .required(),
  username: Joi.string()
    .alphanum()
    .min(3)
    .max(30)
    .required(),
  password: Joi.string()
    .min(8)
    .pattern(new RegExp('(?=.*[A-Z])'))
    .pattern(new RegExp('(?=.*[0-9])')),
});

Pydantic Model

from pydantic import BaseModel, EmailStr, validator

class User(BaseModel):
    email: EmailStr
    age: int
    username: str
    password: str

    @validator('age')
    def validate_age(cls, v):
        if v < 18 or v > 120:
            raise ValueError('Age must be between 18 and 120')
        return v

API Validation

Request Validation

// Express middleware
const validate = (schema) => (req, res, next) => {
  const { error, value } = schema.validate(req.body);
  if (error) {
    return res.status(400).json({
      error: 'Validation failed',
      details: error.details
    });
  }
  req.body = value;
  next();
};

// Usage
app.post('/users', validate(userSchema), createUser);

Response Validation

// Validate API responses
const validateResponse = (schema) => (data) => {
  const { error } = schema.validate(data);
  if (error) {
    console.error('Invalid response:', error.details);
    throw new Error('Response validation failed');
  }
  return data;
};

Custom Validators

Conditional Validation

// If field is present, validate it
if (req.body.nickname) {
  if (req.body.nickname.length > 50) {
    return { error: 'Nickname too long' };
  }
}

Cross-Field Validation

// Password must match confirmation
if (req.body.password !== req.body.confirmPassword) {
  return { error: 'Passwords do not match' };
}

Complex Rules

// Date range validation
const startDate = new Date(req.body.startDate);
const endDate = new Date(req.body.endDate);

if (startDate >= endDate) {
  return { error: 'End date must be after start date' };
}

Error Messages

User-Friendly Errors

{
  email: [
    { type: 'string.empty', message: 'Email is required' },
    { type: 'string.email', message: 'Invalid email format' }
  ],
  age: 'Age must be between 18 and 120'
}

Technical Errors (Hidden)

// Don't expose validation internals
{
  error: 'Validation failed',
  field: 'email',
  message: 'Invalid email format'
}

Validation Best Practices

  • Fail fast: Validate early in the request
  • Be specific: Clear, actionable error messages
  • Server-side: Never trust client validation
  • Consistent: Same rules everywhere
  • Document: Validate input as documented
  • Type hints: Use type annotations

Deliverables

  • Validation schemas
  • Error handling implementation
  • Middleware components
  • Documentation
  • Test cases

Quality Checklist

  • Validation rules are enforced
  • Error messages are clear
  • Client validation doesn’t replace server validation
  • Invalid data is handled gracefully
  • Sanitization is applied
  • Validators are reusable
  • Edge cases are tested
[RETOUR_AUX_MODULES]

>> AUTRES_MODULES