@berish/validate
Version:
Validation of complex objects with support for validation maps, rules and decorators
51 lines • 2.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const isValidateMap_1 = require("./isValidateMap");
const isRuleArray_1 = require("../rule/isRuleArray");
const isRuleTuple_1 = require("../rule/isRuleTuple");
const isRuleMap_1 = require("../rule/isRuleMap");
function getRulesFromMap(map) {
const _getRules = (parentKeys, currentKey, map) => {
if (!map || !isValidateMap_1.isValidateMap(map))
return [];
if (isRuleArray_1.isRuleArray(map))
return [[[...parentKeys, currentKey], map]];
if (isRuleTuple_1.isRuleTuple(map)) {
const main = [[...parentKeys, currentKey], map[0]];
const child = _getRules(parentKeys, currentKey, map[1]);
return [main, ...child];
}
if (isRuleMap_1.isRuleMap(map)) {
return Object.entries(map).reduce((out, [key, value]) => [...out, ..._getRules([...parentKeys, currentKey], key, value)], []);
}
return [];
};
return (_getRules([], null, map)
// Объединяем по одинаковым ключам
.reduce((out, tuple, index, array) => {
// Избавляемся от пустых правил
if (tuple[1].length <= 0)
return out;
// Ищем одинаковые tuple по идентичному пути
const equalKeysTuples = array
.filter(m => m !== tuple)
.filter(m => m[0].length === tuple[0].length && m[0].every((key, i) => tuple[0][i] === key));
// Если одинаковых нет, то отдаем в привычном порядке
if (equalKeysTuples.length <= 0)
return [...out, tuple];
const rules = equalKeysTuples.reduce((out, m) => [...out, ...m[1]], []);
const data = [...out, [tuple[0], rules]];
equalKeysTuples.filter(m => m !== tuple).forEach(m => (m[1] = []));
return data;
}, [])
// Избавляемся от пустых правил
// .filter(tuple => tuple[1].length > 0)
// Избавляемся от null, если не в родительском элементе, а в детях
.map(tuple => tuple[0].length === 1 && tuple[0][0] === null
? [[], tuple[1]]
: tuple[0].length > 1 && tuple[0][0] === null
? [tuple[0].filter((m, i) => i > 0), tuple[1]]
: tuple));
}
exports.getRulesFromMap = getRulesFromMap;
//# sourceMappingURL=getRulesFromMap.js.map