Built-In Validation Rules
Atlas Forms includes a comprehensive set of built-in validation rules that cover the most common data quality requirements. All built-in rules run synchronously in the browser — no server round-trip required. Each rule has a default error message that can be overridden with a custom message property.
Complete Built-In Rules Reference
| Rule | Type | Applies To | Default Message |
|---|---|---|---|
required | boolean | All controls | "This field is required" |
minLength | number | text, textarea, password, url | "Must be at least N characters" |
maxLength | number | text, textarea, password, url | "Must be no more than N characters" |
min | number | number | "Must be at least N" |
max | number | number | "Must be no more than N" |
pattern | string (regex) | text, textarea, email, url | "Invalid format" |
email | boolean | "Must be a valid email address" | |
url | boolean | url, text | "Must be a valid URL" |
minDate | string (ISO date) | date, datetime | "Date must be on or after [date]" |
maxDate | string (ISO date) | date, datetime | "Date must be on or before [date]" |
minSelections | number | multiselect, checkbox-group | "Select at least N options" |
maxSelections | number | multiselect, checkbox-group | "Select no more than N options" |
minRows | number | data-table | "At least N rows required" |
maxRows | number | data-table | "No more than N rows allowed" |
fileTypes | string[] | file-upload | "File type not allowed" |
maxFileSizeMb | number | file-upload | "File exceeds maximum size of N MB" |
Custom Error Messages
Every built-in rule supports a companion *Message property to override the default error text:
{
"id": "phone",
"type": "text",
"label": "Phone Number",
"validation": {
"required": true,
"requiredMessage": "A phone number is required to contact you",
"pattern": "^\\+?[0-9\\s\\-\\(\\)]{7,20}$",
"patternMessage": "Enter a valid phone number including country code"
}
}
required Rule
The required rule checks for empty values. What counts as "empty" depends on the control type:
| Control Type | Empty Condition |
|---|---|
| text, textarea, password, email, url | Empty string or whitespace-only |
| number | null or undefined (zero is valid) |
| select, radio | null or undefined |
| multiselect | Empty array [] |
| checkbox, switch | false or null — use to force acknowledgement |
| date, datetime | null or undefined |
| file-upload | No files selected |
| data-table | Zero rows |
pattern Rule
The pattern rule accepts a JavaScript regular expression string (without delimiters). The entire field value must match — equivalent to new RegExp('^' + pattern + '$').test(value):
// UK postcode
"pattern": "^[A-Z]{1,2}[0-9][0-9A-Z]?\\s?[0-9][A-Z]{2}$"
// US ZIP code (5 digit or ZIP+4)
"pattern": "^[0-9]{5}(-[0-9]{4})?$"
// IBAN (simplified — real validation should be custom)
"pattern": "^[A-Z]{2}[0-9]{2}[A-Z0-9]{11,30}$"
// No SQL injection characters (basic)
"pattern": "^[^;'\"\\\\]*$"
Date Validation with Dynamic Bounds
The minDate and maxDate rules support the special string "today" in addition to ISO date strings:
{
"id": "effective-date",
"type": "date",
"label": "Effective Date",
"validation": {
"required": true,
"minDate": "today",
"minDateMessage": "Effective date cannot be in the past",
"maxDate": "2030-12-31",
"maxDateMessage": "Effective date must be before 2031"
}
}