"use strict";
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
exports.__esModule = true;
|
exports.createErrorFactory = createErrorFactory;
|
exports.default = createValidation;
|
|
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
|
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
var _mapValues = _interopRequireDefault(require("lodash/mapValues"));
|
|
var _ValidationError = _interopRequireDefault(require("../ValidationError"));
|
|
var _Reference = _interopRequireDefault(require("../Reference"));
|
|
var _synchronousPromise = require("synchronous-promise");
|
|
var formatError = _ValidationError.default.formatError;
|
|
var thenable = function thenable(p) {
|
return p && typeof p.then === 'function' && typeof p.catch === 'function';
|
};
|
|
function runTest(testFn, ctx, value, sync) {
|
var result = testFn.call(ctx, value);
|
if (!sync) return Promise.resolve(result);
|
|
if (thenable(result)) {
|
throw new Error("Validation test of type: \"" + ctx.type + "\" returned a Promise during a synchronous validate. " + "This test will finish after the validate call has returned");
|
}
|
|
return _synchronousPromise.SynchronousPromise.resolve(result);
|
}
|
|
function resolveParams(oldParams, newParams, resolve) {
|
return (0, _mapValues.default)((0, _extends2.default)({}, oldParams, newParams), resolve);
|
}
|
|
function createErrorFactory(_ref) {
|
var value = _ref.value,
|
label = _ref.label,
|
resolve = _ref.resolve,
|
originalValue = _ref.originalValue,
|
opts = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["value", "label", "resolve", "originalValue"]);
|
return function createError(_temp) {
|
var _ref2 = _temp === void 0 ? {} : _temp,
|
_ref2$path = _ref2.path,
|
path = _ref2$path === void 0 ? opts.path : _ref2$path,
|
_ref2$message = _ref2.message,
|
message = _ref2$message === void 0 ? opts.message : _ref2$message,
|
_ref2$type = _ref2.type,
|
type = _ref2$type === void 0 ? opts.name : _ref2$type,
|
params = _ref2.params;
|
|
params = (0, _extends2.default)({
|
path: path,
|
value: value,
|
originalValue: originalValue,
|
label: label
|
}, resolveParams(opts.params, params, resolve));
|
return (0, _extends2.default)(new _ValidationError.default(formatError(message, params), value, path, type), {
|
params: params
|
});
|
};
|
}
|
|
function createValidation(options) {
|
var name = options.name,
|
message = options.message,
|
test = options.test,
|
params = options.params;
|
|
function validate(_ref3) {
|
var value = _ref3.value,
|
path = _ref3.path,
|
label = _ref3.label,
|
options = _ref3.options,
|
originalValue = _ref3.originalValue,
|
sync = _ref3.sync,
|
rest = (0, _objectWithoutPropertiesLoose2.default)(_ref3, ["value", "path", "label", "options", "originalValue", "sync"]);
|
var parent = options.parent;
|
|
var resolve = function resolve(value) {
|
return _Reference.default.isRef(value) ? value.getValue(parent, options.context) : value;
|
};
|
|
var createError = createErrorFactory({
|
message: message,
|
path: path,
|
value: value,
|
originalValue: originalValue,
|
params: params,
|
label: label,
|
resolve: resolve,
|
name: name
|
});
|
var ctx = (0, _extends2.default)({
|
path: path,
|
parent: parent,
|
type: name,
|
createError: createError,
|
resolve: resolve,
|
options: options
|
}, rest);
|
return runTest(test, ctx, value, sync).then(function (validOrError) {
|
if (_ValidationError.default.isError(validOrError)) throw validOrError;else if (!validOrError) throw createError();
|
});
|
}
|
|
validate.OPTIONS = options;
|
return validate;
|
}
|