UNPKG

@storable/model

Version:

Base class providing typed properties, validation and serialization

76 lines (61 loc) 2.2 kB
"use strict"; 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; }