UNPKG

@matatbread/typia

Version:

Superfast runtime validators with only one line

58 lines 2.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UnionPredicator = void 0; const Metadata_1 = require("../../schemas/metadata/Metadata"); const ArrayUtil_1 = require("../../utils/ArrayUtil"); const MapUtil_1 = require("../../utils/MapUtil"); var UnionPredicator; (function (UnionPredicator) { UnionPredicator.object = (objects) => { // PROPERTY MATRIX const matrix = new Map(); for (const obj of objects) for (const prop of obj.properties) { const key = prop.key.getSoleLiteral(); if (key !== null) MapUtil_1.MapUtil.take(matrix, key, () => ArrayUtil_1.ArrayUtil.repeat(objects.length, () => null)); } objects.forEach((obj, i) => { for (const prop of obj.properties) { const key = prop.key.getSoleLiteral(); if (key !== null) matrix.get(key)[i] = prop; } }); // EXPLORE SPECIALIZERS const output = []; objects.forEach((obj, i) => { const children = []; obj.properties.forEach((prop) => { // MUST BE REQUIRED if (prop.value.isRequired() === false) return; const key = prop.key.getSoleLiteral(); if (key === null) return; // FIND NEIGHBORHOOD PROPERTIES const neighbors = matrix .get(key) .filter((oppo, k) => i !== k && oppo !== null); // NO NEIGHBORHOOD const unique = neighbors.length === 0 || neighbors.every((n) => !Metadata_1.Metadata.intersects(prop.value, n.value)); if (unique === true) children.push({ property: prop, neighbor: neighbors.length !== 0, }); }); if (children.length === 0) return; const top = children.find((child) => child.property.value.isConstant()) || children[0]; output.push(Object.assign({ index: i, object: obj }, top)); }); return output; }; })(UnionPredicator || (exports.UnionPredicator = UnionPredicator = {})); //# sourceMappingURL=UnionPredicator.js.map