You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

38 lines
941 B
JavaScript

"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);
};