Skip to content

Validators

import { registerDefaultValidators, registerValidator } from 'formlayer';
// Register all 12 built-in validators at once
registerDefaultValidators();
// Register a single custom validator
registerValidator({
type: 'MyValidator',
validate(value, options) {
return { valid: true, message: '' };
},
});
interface Validator {
type: string;
validate(
value: string,
options: Record<string, unknown>
): ValidatorResult | Promise<ValidatorResult>;
}
interface ValidatorResult {
valid: boolean;
message: string;
}

The type must match the type field in data-validate JSON rules.

TypeOptionsPasses on empty?
NotEmptymessageNo
StringLengthminimum, maximum, messageYes
EmailAddressmessageYes
RegularExpressionregularExpression (PCRE delimited), messageYes
NumberRangeminimum, maximum, messageYes
IntegermessageYes
FloatmessageYes
NumbermessageYes
AlphanumericmessageYes
DateTimemessageYes
DateRangeminimum, maximum, messageYes
FileSizeminimum, maximum (e.g. "5M"), messageYes

Most validators pass on empty values by design. Combine with NotEmpty for required fields.

interface ValidatorRule {
type: string;
options?: Record<string, unknown>;
}

Used in HTML as a JSON array:

<div data-validate='[
{"type":"NotEmpty","options":{"message":"Required"}},
{"type":"StringLength","options":{"minimum":3}}
]'>
import { runValidators, runValidatorsAsync } from 'formlayer/validators';
// Synchronous (skips async validators with a warning)
const results = runValidators(rules, value);
// Async (awaits each validator)
const results = await runValidatorsAsync(rules, value);

Both return an array of failed ValidatorResult objects.