"use strict"; const flatten = require("flatten"); const assureArray = require("assure-array"); const required = require("@validatem/required"); const forbidden = require("@validatem/forbidden"); const allowExtraProperties = require("@validatem/allow-extra-properties"); const either = require("@validatem/either"); module.exports = function requireEither(alternatives, options = {}) { let allKeys = flatten(alternatives); let allUniqueKeys = Array.from(new Set(allKeys)); let predicates = alternatives.map((alternative) => { let requiredKeys = assureArray(alternative); let requiredKeysSet = new Set(requiredKeys); let object = {}; for (let key of requiredKeys) { object[key] = required; } if (!options.allowMultiple) { for (let key of allUniqueKeys) { if (!requiredKeysSet.has(key)) { object[key] = forbidden; } } } return allowExtraProperties(object); }); return either(predicates); };