Validation.group() method
Groups Validation objects into one.
Syntax
Validation.group(validation1, validation2, /* ..., */ validationN)Validation.group([validation1, validation2, /* ..., */ validationN])Validation.group([validation1, validation2], /* ..., */ validationN)Validation.group(validation1, [validation2, /* ..., */ validationN])Validation.group([[validation1, validation2], /* ..., */ validationN])Validation.group(validation1, [[validation2], /* ..., */ validationN])Validation.group(validation1, [validation2], /* ..., */ [validationN])Parameters
validation1, ..., validationN
AValidationobject.
Return value
A new grouping Validation object.
Exceptions
If not a Validation was passed in or an Array that contains not a Validation, throws the corresponding error.
Description
Accepts Validation objects or arrays of Validation objects of any nesting level or both in any combination. The Validation objects passed in can be single as well as other grouping Validation objects. Repetitive Validation objects will be ignored, only the unique ones will be grouped. The returned grouping Validation object “subscribes” to state changes of the grouped Validation objects and its validity state depends on them.
Examples
Here validation1 and validation2 are grouped into validationGr and have the same set of predicate functions. First isGreaterOrEqual(1) and isGreaterOrEqual(2) are added to them respectively, then isNaturalNumber is added to them both through the grouping validation validationGr. See how a particular predicate group can be validated by passing its associated object into the Validation.validate() method. When both validation1 and validation2 are in “valid” state, validationGr also changes its state to “valid” even though not having been validated directly.
import { Validation } from 'isomorphic-validation';
const logFn = (fn) => (...args) => { const res = fn(...args); console.log(`${fn.name}(${args.join(',')}) \t--> ${res}`); return res;};
const nameReturnedFn = (fn) => (...args) => Object.defineProperty( fn(...args), 'name', { value: `${fn.name}(${args.join(',')})` }, );
// predicate functionsconst isNaturalNumber = (value) => /^[1-9]+[0-9]*$/.test(value);const isGreaterOrEqual = (number) => (value) => Number(value) >= Number(number);
// validatable objectsconst obj1 = { value: 0 };const obj2 = { value: 0 };
const validation1 = Validation(obj1) .started(() => console.log('started validation1...'));
const validation2 = Validation(obj2) .started(() => console.log('started validation2...'));
const validationGr = Validation.group(validation1, validation2) .started(() => console.log('started validationGr...'));
validation1.constraint(logFn(nameReturnedFn(isGreaterOrEqual)(1)));validation2.constraint(logFn(nameReturnedFn(isGreaterOrEqual)(2)));validationGr.constraint(logFn(isNaturalNumber)); // added to both validations
obj1.value = 1.1;validationGr.validate(obj1); // validating validation1 by its bound objectconsole.table({ validation1, validation2, validationGr}, ['isValid']);console.log('');
obj1.value = 1;validation1.validate(); // validating validation1 directlyconsole.table({ validation1, validation2, validationGr}, ['isValid']);console.log('');
obj2.value = 2.1;validationGr.validate(obj2); // validating validation2 by its bound objectconsole.table({ validation1, validation2, validationGr}, ['isValid']);console.log('');
obj2.value = 2;validation2.validate(); // validating validation2 directlyconsole.table({ validation1, validation2, validationGr}, ['isValid']);console.log('');
obj2.value = 3.1;validationGr.validate(); // validating both validation objectsconsole.table({ validation1, validation2, validationGr}, ['isValid']);console.log('');
// output://// started validationGr...// started validation1...// isGreaterOrEqual(1)(1.1) --> true// isNaturalNumber(1.1) --> false// ┌──────────────┬─────────┐// │ (index) │ isValid │// ├──────────────┼─────────┤// │ validation1 │ false │// │ validation2 │ false │// │ validationGr │ false │// └──────────────┴─────────┘//// started validation1...// isGreaterOrEqual(1)(1) --> true// isNaturalNumber(1) --> true// ┌──────────────┬─────────┐// │ (index) │ isValid │// ├──────────────┼─────────┤// │ validation1 │ true │// │ validation2 │ false │// │ validationGr │ false │// └──────────────┴─────────┘//// started validationGr...// started validation2...// isGreaterOrEqual(2)(2.1) --> true// isNaturalNumber(2.1) --> false// ┌──────────────┬─────────┐// │ (index) │ isValid │// ├──────────────┼─────────┤// │ validation1 │ true │// │ validation2 │ false │// │ validationGr │ false │// └──────────────┴─────────┘//// started validation2...// isGreaterOrEqual(2)(2) --> true// isNaturalNumber(2) --> true// ┌──────────────┬─────────┐// │ (index) │ isValid │// ├──────────────┼─────────┤// │ validation1 │ true │// │ validation2 │ true │// │ validationGr │ true │// └──────────────┴─────────┘//// started validationGr...// started validation1...// started validation2...// isGreaterOrEqual(1)(1) --> true// isNaturalNumber(1) --> true// isGreaterOrEqual(2)(3.1) --> true// isNaturalNumber(3.1) --> false// ┌──────────────┬─────────┐// │ (index) │ isValid │// ├──────────────┼─────────┤// │ validation1 │ true │// │ validation2 │ false │// │ validationGr │ false │// └──────────────┴─────────┘