spected
Version:
Validation Library
121 lines (95 loc) • 5.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.validate = undefined;
var _identity2 = require('ramda/src/identity');
var _identity3 = _interopRequireDefault(_identity2);
var _map2 = require('ramda/src/map');
var _map3 = _interopRequireDefault(_map2);
var _reduce2 = require('ramda/src/reduce');
var _reduce3 = _interopRequireDefault(_reduce2);
var _curry2 = require('ramda/src/curry');
var _curry3 = _interopRequireDefault(_curry2);
var _filter2 = require('ramda/src/filter');
var _filter3 = _interopRequireDefault(_filter2);
var _equals2 = require('ramda/src/equals');
var _equals3 = _interopRequireDefault(_equals2);
var _all2 = require('ramda/src/all');
var _all3 = _interopRequireDefault(_all2);
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
*
* @param {Function} successFn callback function in case of valid input
* @param {Function} failFn callback function in case of invalid input
* @param {Array} input
* @returns {*}
*/
var transform = function transform(successFn, failFn, input) {
var valid = (0, _all3.default)((0, _equals3.default)(true), input);
return valid ? successFn() : failFn((0, _filter3.default)(function (a) {
return a !== true;
}, input));
};
/**
*
* @param {Function} predicate validation function to apply inputs on
* @param {String|Function} errorMsg error message to return in case of fail
* @param {*} value the actual value
* @param {Object} inputs the input object - in case the predicate function needs access to dependent values
* @returns {Boolean}
*/
var runPredicate = function runPredicate(_ref, value, inputs, field) {
var _ref2 = _slicedToArray(_ref, 2),
predicate = _ref2[0],
errorMsg = _ref2[1];
return predicate(value, inputs) // eslint-disable-line no-nested-ternary
? true : typeof errorMsg === 'function' ? errorMsg(value, field) : errorMsg;
};
/**
*
* @param {Function} successFn callback function in case of valid input
* @param {Function} failFn callback function in case of invalid input
* @param {Object} spec the rule object
* @param {Object|Function} input the validation input data
* @returns {{}}
*/
var validate = exports.validate = (0, _curry3.default)(function (successFn, failFn, spec, input) {
var inputFn = typeof input === 'function' ? input : function (key) {
return key ? input : input;
};
var keys = Object.keys(inputFn());
return (0, _reduce3.default)(function (result, key) {
var inputObj = inputFn(key);
var value = inputObj[key];
var predicates = spec[key];
if (Array.isArray(predicates)) {
return _extends({}, result, _defineProperty({}, key, transform(function () {
return successFn(value);
}, failFn, (0, _map3.default)(function (f) {
return runPredicate(f, value, inputObj, key);
}, predicates))));
} else if ((typeof predicates === 'undefined' ? 'undefined' : _typeof(predicates)) === 'object') {
return _extends({}, result, _defineProperty({}, key, validate(successFn, failFn, predicates, value)));
} else if (typeof predicates === 'function') {
var rules = predicates(value);
return _extends({}, result, _defineProperty({}, key, validate(successFn, failFn, rules, value)));
} else {
return _extends({}, result, _defineProperty({}, key, successFn([])));
}
}, {}, keys);
});
/**
*
* @param {Object} spec the rule object
* @param {Object} input the validation input data
* @returns {{}}
*/
var spected = validate(function () {
return true;
}, _identity3.default);
exports.default = spected;