import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; import _extends from "@babel/runtime/helpers/esm/extends"; import mapValues from "lodash-es/mapValues"; import ValidationError from '../ValidationError'; import Ref from '../Reference'; import { SynchronousPromise } from 'synchronous-promise'; var formatError = ValidationError.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.resolve(result); } function resolveParams(oldParams, newParams, resolve) { return mapValues(_extends({}, oldParams, newParams), resolve); } export function createErrorFactory(_ref) { var value = _ref.value, label = _ref.label, resolve = _ref.resolve, originalValue = _ref.originalValue, opts = _objectWithoutPropertiesLoose(_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 = _extends({ path: path, value: value, originalValue: originalValue, label: label }, resolveParams(opts.params, params, resolve)); return _extends(new ValidationError(formatError(message, params), value, path, type), { params: params }); }; } export default 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 = _objectWithoutPropertiesLoose(_ref3, ["value", "path", "label", "options", "originalValue", "sync"]); var parent = options.parent; var resolve = function resolve(item) { return Ref.isRef(item) ? item.getValue({ value: value, parent: parent, context: options.context }) : item; }; var createError = createErrorFactory({ message: message, path: path, value: value, originalValue: originalValue, params: params, label: label, resolve: resolve, name: name }); var ctx = _extends({ path: path, parent: parent, type: name, createError: createError, resolve: resolve, options: options }, rest); return runTest(test, ctx, value, sync).then(function (validOrError) { if (ValidationError.isError(validOrError)) throw validOrError;else if (!validOrError) throw createError(); }); } validate.OPTIONS = options; return validate; }