@storable/model
Version:
Base class providing typed properties, validation and serialization
76 lines (61 loc) • 2.2 kB
JavaScript
exports.__esModule = true;
exports.createValidator = createValidator;
exports.runValidators = runValidators;
exports.normalizeValidator = normalizeValidator;
exports.validators = exports.REQUIRED_VALIDATOR_NAME = void 0;
var _fnName = _interopRequireDefault(require("fn-name"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const REQUIRED_VALIDATOR_NAME = 'required()';
exports.REQUIRED_VALIDATOR_NAME = REQUIRED_VALIDATOR_NAME;
const _validators = {
// Any values
anyOf: (value, array) => array.includes(value),
// Numbers
positive: value => value >= 0,
negative: value => value < 0,
lessThan: (value, number) => value < number,
lessThanOrEqual: (value, number) => value <= number,
greaterThan: (value, number) => value > number,
greaterThanOrEqual: (value, number) => value >= number,
integer: value => Number.isInteger(value),
// Strings and Arrays
notEmpty: value => value.length > 0,
minLength: (value, length) => value.length >= length,
maxLength: (value, length) => value.length <= length,
// Strings
match: (value, pattern) => pattern.test(value)
};
const validators = {};
exports.validators = validators;
for (const [name, func] of Object.entries(_validators)) {
validators[name] = (...args) => createValidator(name, func, ...args);
}
function createValidator(name, func, ...args) {
const validator = value => func(value, ...args);
validator.displayName = `${name}(${JSON.stringify(args).slice(1, -1)})`;
return validator;
}
function runValidators(value, validators) {
let failedValidators;
for (const validator of validators) {
if (!validator(value)) {
if (!failedValidators) {
failedValidators = [];
}
failedValidators.push((0, _fnName.default)(validator));
}
}
return failedValidators;
}
function normalizeValidator(validator, {
fieldName
}) {
if (typeof validator !== 'function') {
throw new Error(`A validator must be a function (field: '${fieldName}')`);
} // Ensure that validator builders are called
if (Object.values(validators).includes(validator)) {
validator = validator();
}
return validator;
}
;