UNPKG

@berish/validate

Version:

Validation of complex objects with support for validation maps, rules and decorators

51 lines 2.52 kB
"use strict"; 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