Validator Framework for javascript.
- Node.js v8+
- npm or yarn
$ npm install favalid
- Write higher order validator using
tester()
.tester()
takes two arguments. first argument is(value: any) => bool
function, which represent validation rules. Second argument is() => string
function, which represents validation error message.
import { tester } from 'favalid';
const validator = tester((targetValue) => {
return targetValue < 100;
}, () => {
return 'must be less than 100';
})
- Use it!
tester()
returns simple validator function,(value: any) => ({error: bool, message: string})
.
console.log(validator(99)); // => { error: false, message: '' }
console.log(validator(101)); // => { error: true, message: 'must ne less than 100' }
- You can combine these validators using
combine(...validators)
.combine()
returns also validator.
import { tester, combine } from 'favalid';
const validator1 = tester((targetValue) => {
return targetValue < 100;
}, () => {
return 'must be less than 100';
})
const validator2 = tester((targetValue) => {
return targetValue > 20;
}, () => {
return 'must be higher than 20';
})
const combinedValidator = combine(validator1, validator2)
- Use it.
console.log(combinedValidator(80)) // { error: false, message: '' }
console.log(combinedValidator(101)) // { error: true, message: 'must be less than 100' }
console.log(combinedValidator(19)) // { error: true, message: 'must be higher than 20' }
If target values are failed multiple tests, combined validator returns first failed message.
import { tester, combine } from 'favalid';
const minLength = tester((targetValue) => {
return [...targetValue].length > 2;
}, () => {
return 'too few letters';
})
const regex = tester((targetValue) => {
return /^[a-zA-Z]+$/.test(targetValue) // only contains alphabet letters.
}, () => {
return 'invalid format';
})
const combinedValidator = combine(minLength, regex)
console.log(combinedValidator('a')) // { error: true, message: 'too few letters' }
console.log(combinedValidator('1')) // { error: true, message: 'too few letters' }
console.log(combinedValidator('asdf1')) // { error: true, message: 'invalid format' }
You can also use predefined higher order validators found on favalid/lib/validators
.
These validators can be combined with your original validators.
import { tester, combine, minLength, regexp } from 'favalid';
const combinedValidator = combine(
minLength(3, () => 'too few letters'),
regexp(/^[a-zA-Z]+$/, () => "invalid format", {}),
tester(() => {
// some original validation rules
}, () => ('original error')),
)
You can aggregate validate errors with your customize error reducer using conbineWithReducer(validators, reducer, initialValue)
.
import { tester, combineWithReducer, minLength, maxLength, regexp } from 'favalid';
const REQUIRED_EMAIL_MESSAGE = () => "required.";
const EMAIL_REGEXP = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
const REGEXP_MESSAGE = () => "invalid email.";
const EMAIL_MAX_LENGTH = 100;
const MAX_LENGTH_MESSAGE = () => "exceeds 100 letters.";
const EMAIL_MIN_LENGTH = 10;
const MIN_LENGTH_MESSAGE = () => "at least 10 letters.";
const emailValidatorWithMultipleErrorReducer = (email: string) => {
const reducer = (prevError, currentError) => {
if (currentError.error) {
prevError.push(currentError);
}
return prevError;
};
return combineWithReducer(
[
required(REQUIRED_EMAIL_MESSAGE),
minLength(EMAIL_MIN_LENGTH, MIN_LENGTH_MESSAGE),
maxLength(EMAIL_MAX_LENGTH, MAX_LENGTH_MESSAGE),
regexp(EMAIL_REGEXP, REGEXP_MESSAGE, {}),
],
reducer,
[],
)(email);
};
console.log(emailValidatorWithMultipleErrorReducer('valid@valid.com')) // => []
console.log(emailValidatorWithMultipleErrorReducer('aaa')) // => [{error: true, message: 'at least 10 letters.'}, {error: true, message: 'invalid email.'}]
See src/examples.
This project is licensed under the Apache License 2.0 License - see the LICENSE file for details