| 
						 | 
						function _extends() {  _extends = Object.assign ? Object.assign.bind() : 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;  };  return _extends.apply(this, arguments);}
function _inheritsLoose(subClass, superClass) {  subClass.prototype = Object.create(superClass.prototype);  subClass.prototype.constructor = subClass;
  _setPrototypeOf(subClass, superClass);}
function _getPrototypeOf(o) {  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {    return o.__proto__ || Object.getPrototypeOf(o);  };  return _getPrototypeOf(o);}
function _setPrototypeOf(o, p) {  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {    o.__proto__ = p;    return o;  };  return _setPrototypeOf(o, p);}
function _isNativeReflectConstruct() {  if (typeof Reflect === "undefined" || !Reflect.construct) return false;  if (Reflect.construct.sham) return false;  if (typeof Proxy === "function") return true;
  try {    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));    return true;  } catch (e) {    return false;  }}
function _construct(Parent, args, Class) {  if (_isNativeReflectConstruct()) {    _construct = Reflect.construct.bind();  } else {    _construct = function _construct(Parent, args, Class) {      var a = [null];      a.push.apply(a, args);      var Constructor = Function.bind.apply(Parent, a);      var instance = new Constructor();      if (Class) _setPrototypeOf(instance, Class.prototype);      return instance;    };  }
  return _construct.apply(null, arguments);}
function _isNativeFunction(fn) {  return Function.toString.call(fn).indexOf("[native code]") !== -1;}
function _wrapNativeSuper(Class) {  var _cache = typeof Map === "function" ? new Map() : undefined;
  _wrapNativeSuper = function _wrapNativeSuper(Class) {    if (Class === null || !_isNativeFunction(Class)) return Class;
    if (typeof Class !== "function") {      throw new TypeError("Super expression must either be null or a function");    }
    if (typeof _cache !== "undefined") {      if (_cache.has(Class)) return _cache.get(Class);
      _cache.set(Class, Wrapper);    }
    function Wrapper() {      return _construct(Class, arguments, _getPrototypeOf(this).constructor);    }
    Wrapper.prototype = Object.create(Class.prototype, {      constructor: {        value: Wrapper,        enumerable: false,        writable: true,        configurable: true      }    });    return _setPrototypeOf(Wrapper, Class);  };
  return _wrapNativeSuper(Class);}
/* eslint no-console:0 */var formatRegExp = /%[sdj%]/g;var warning = function warning() {}; // don't print warning message when in production env or node runtime
if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {  warning = function warning(type, errors) {    if (typeof console !== 'undefined' && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === 'undefined') {      if (errors.every(function (e) {        return typeof e === 'string';      })) {        console.warn(type, errors);      }    }  };}
function convertFieldsError(errors) {  if (!errors || !errors.length) return null;  var fields = {};  errors.forEach(function (error) {    var field = error.field;    fields[field] = fields[field] || [];    fields[field].push(error);  });  return fields;}function format(template) {  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {    args[_key - 1] = arguments[_key];  }
  var i = 0;  var len = args.length;
  if (typeof template === 'function') {    return template.apply(null, args);  }
  if (typeof template === 'string') {    var str = template.replace(formatRegExp, function (x) {      if (x === '%%') {        return '%';      }
      if (i >= len) {        return x;      }
      switch (x) {        case '%s':          return String(args[i++]);
        case '%d':          return Number(args[i++]);
        case '%j':          try {            return JSON.stringify(args[i++]);          } catch (_) {            return '[Circular]';          }
          break;
        default:          return x;      }    });    return str;  }
  return template;}
function isNativeStringType(type) {  return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern';}
function isEmptyValue(value, type) {  if (value === undefined || value === null) {    return true;  }
  if (type === 'array' && Array.isArray(value) && !value.length) {    return true;  }
  if (isNativeStringType(type) && typeof value === 'string' && !value) {    return true;  }
  return false;}
function asyncParallelArray(arr, func, callback) {  var results = [];  var total = 0;  var arrLength = arr.length;
  function count(errors) {    results.push.apply(results, errors || []);    total++;
    if (total === arrLength) {      callback(results);    }  }
  arr.forEach(function (a) {    func(a, count);  });}
function asyncSerialArray(arr, func, callback) {  var index = 0;  var arrLength = arr.length;
  function next(errors) {    if (errors && errors.length) {      callback(errors);      return;    }
    var original = index;    index = index + 1;
    if (original < arrLength) {      func(arr[original], next);    } else {      callback([]);    }  }
  next([]);}
function flattenObjArr(objArr) {  var ret = [];  Object.keys(objArr).forEach(function (k) {    ret.push.apply(ret, objArr[k] || []);  });  return ret;}
var AsyncValidationError = /*#__PURE__*/function (_Error) {  _inheritsLoose(AsyncValidationError, _Error);
  function AsyncValidationError(errors, fields) {    var _this;
    _this = _Error.call(this, 'Async Validation Error') || this;    _this.errors = errors;    _this.fields = fields;    return _this;  }
  return AsyncValidationError;}( /*#__PURE__*/_wrapNativeSuper(Error));function asyncMap(objArr, option, func, callback, source) {  if (option.first) {    var _pending = new Promise(function (resolve, reject) {      var next = function next(errors) {        callback(errors);        return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);      };
      var flattenArr = flattenObjArr(objArr);      asyncSerialArray(flattenArr, func, next);    });
    _pending["catch"](function (e) {      return e;    });
    return _pending;  }
  var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];  var objArrKeys = Object.keys(objArr);  var objArrLength = objArrKeys.length;  var total = 0;  var results = [];  var pending = new Promise(function (resolve, reject) {    var next = function next(errors) {      results.push.apply(results, errors);      total++;
      if (total === objArrLength) {        callback(results);        return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);      }    };
    if (!objArrKeys.length) {      callback(results);      resolve(source);    }
    objArrKeys.forEach(function (key) {      var arr = objArr[key];
      if (firstFields.indexOf(key) !== -1) {        asyncSerialArray(arr, func, next);      } else {        asyncParallelArray(arr, func, next);      }    });  });  pending["catch"](function (e) {    return e;  });  return pending;}
function isErrorObj(obj) {  return !!(obj && obj.message !== undefined);}
function getValue(value, path) {  var v = value;
  for (var i = 0; i < path.length; i++) {    if (v == undefined) {      return v;    }
    v = v[path[i]];  }
  return v;}
function complementError(rule, source) {  return function (oe) {    var fieldValue;
    if (rule.fullFields) {      fieldValue = getValue(source, rule.fullFields);    } else {      fieldValue = source[oe.field || rule.fullField];    }
    if (isErrorObj(oe)) {      oe.field = oe.field || rule.fullField;      oe.fieldValue = fieldValue;      return oe;    }
    return {      message: typeof oe === 'function' ? oe() : oe,      fieldValue: fieldValue,      field: oe.field || rule.fullField    };  };}function deepMerge(target, source) {  if (source) {    for (var s in source) {      if (source.hasOwnProperty(s)) {        var value = source[s];
        if (typeof value === 'object' && typeof target[s] === 'object') {          target[s] = _extends({}, target[s], value);        } else {          target[s] = value;        }      }    }  }
  return target;}
var required$1 = function required(rule, value, source, errors, options, type) {  if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {    errors.push(format(options.messages.required, rule.fullField));  }};
/** *  Rule for validating whitespace. * *  @param rule The validation rule. *  @param value The value of the field on the source object. *  @param source The source object being validated. *  @param errors An array of errors that this rule may add *  validation errors to. *  @param options The validation options. *  @param options.messages The validation messages. */
var whitespace = function whitespace(rule, value, source, errors, options) {  if (/^\s+$/.test(value) || value === '') {    errors.push(format(options.messages.whitespace, rule.fullField));  }};
// https://github.com/kevva/url-regex/blob/master/index.js
var urlReg;var getUrlRegex = (function () {  if (urlReg) {    return urlReg;  }
  var word = '[a-fA-F\\d:]';
  var b = function b(options) {    return options && options.includeBoundaries ? "(?:(?<=\\s|^)(?=" + word + ")|(?<=" + word + ")(?=\\s|$))" : '';  };
  var v4 = '(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}';  var v6seg = '[a-fA-F\\d]{1,4}';  var v6 = ("\n(?:\n(?:" + v6seg + ":){7}(?:" + v6seg + "|:)|                                    // 1:2:3:4:5:6:7::  1:2:3:4:5:6:7:8\n(?:" + v6seg + ":){6}(?:" + v4 + "|:" + v6seg + "|:)|                             // 1:2:3:4:5:6::    1:2:3:4:5:6::8   1:2:3:4:5:6::8  1:2:3:4:5:6::1.2.3.4\n(?:" + v6seg + ":){5}(?::" + v4 + "|(?::" + v6seg + "){1,2}|:)|                   // 1:2:3:4:5::      1:2:3:4:5::7:8   1:2:3:4:5::8    1:2:3:4:5::7:1.2.3.4\n(?:" + v6seg + ":){4}(?:(?::" + v6seg + "){0,1}:" + v4 + "|(?::" + v6seg + "){1,3}|:)| // 1:2:3:4::        1:2:3:4::6:7:8   1:2:3:4::8      1:2:3:4::6:7:1.2.3.4\n(?:" + v6seg + ":){3}(?:(?::" + v6seg + "){0,2}:" + v4 + "|(?::" + v6seg + "){1,4}|:)| // 1:2:3::          1:2:3::5:6:7:8   1:2:3::8        1:2:3::5:6:7:1.2.3.4\n(?:" + v6seg + ":){2}(?:(?::" + v6seg + "){0,3}:" + v4 + "|(?::" + v6seg + "){1,5}|:)| // 1:2::            1:2::4:5:6:7:8   1:2::8          1:2::4:5:6:7:1.2.3.4\n(?:" + v6seg + ":){1}(?:(?::" + v6seg + "){0,4}:" + v4 + "|(?::" + v6seg + "){1,6}|:)| // 1::              1::3:4:5:6:7:8   1::8            1::3:4:5:6:7:1.2.3.4\n(?::(?:(?::" + v6seg + "){0,5}:" + v4 + "|(?::" + v6seg + "){1,7}|:))             // ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8  ::8             ::1.2.3.4\n)(?:%[0-9a-zA-Z]{1,})?                                             // %eth0            %1\n").replace(/\s*\/\/.*$/gm, '').replace(/\n/g, '').trim(); // Pre-compile only the exact regexes because adding a global flag make regexes stateful
  var v46Exact = new RegExp("(?:^" + v4 + "$)|(?:^" + v6 + "$)");  var v4exact = new RegExp("^" + v4 + "$");  var v6exact = new RegExp("^" + v6 + "$");
  var ip = function ip(options) {    return options && options.exact ? v46Exact : new RegExp("(?:" + b(options) + v4 + b(options) + ")|(?:" + b(options) + v6 + b(options) + ")", 'g');  };
  ip.v4 = function (options) {    return options && options.exact ? v4exact : new RegExp("" + b(options) + v4 + b(options), 'g');  };
  ip.v6 = function (options) {    return options && options.exact ? v6exact : new RegExp("" + b(options) + v6 + b(options), 'g');  };
  var protocol = "(?:(?:[a-z]+:)?//)";  var auth = '(?:\\S+(?::\\S*)?@)?';  var ipv4 = ip.v4().source;  var ipv6 = ip.v6().source;  var host = "(?:(?:[a-z\\u00a1-\\uffff0-9][-_]*)*[a-z\\u00a1-\\uffff0-9]+)";  var domain = "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*";  var tld = "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))";  var port = '(?::\\d{2,5})?';  var path = '(?:[/?#][^\\s"]*)?';  var regex = "(?:" + protocol + "|www\\.)" + auth + "(?:localhost|" + ipv4 + "|" + ipv6 + "|" + host + domain + tld + ")" + port + path;  urlReg = new RegExp("(?:^" + regex + "$)", 'i');  return urlReg;});
/* eslint max-len:0 */
var pattern$2 = {  // http://emailregex.com/
  email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,  // url: new RegExp(
  //   '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
  //   'i',
  // ),
  hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i};var types = {  integer: function integer(value) {    return types.number(value) && parseInt(value, 10) === value;  },  "float": function float(value) {    return types.number(value) && !types.integer(value);  },  array: function array(value) {    return Array.isArray(value);  },  regexp: function regexp(value) {    if (value instanceof RegExp) {      return true;    }
    try {      return !!new RegExp(value);    } catch (e) {      return false;    }  },  date: function date(value) {    return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear === 'function' && !isNaN(value.getTime());  },  number: function number(value) {    if (isNaN(value)) {      return false;    }
    return typeof value === 'number';  },  object: function object(value) {    return typeof value === 'object' && !types.array(value);  },  method: function method(value) {    return typeof value === 'function';  },  email: function email(value) {    return typeof value === 'string' && value.length <= 320 && !!value.match(pattern$2.email);  },  url: function url(value) {    return typeof value === 'string' && value.length <= 2048 && !!value.match(getUrlRegex());  },  hex: function hex(value) {    return typeof value === 'string' && !!value.match(pattern$2.hex);  }};
var type$1 = function type(rule, value, source, errors, options) {  if (rule.required && value === undefined) {    required$1(rule, value, source, errors, options);    return;  }
  var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];  var ruleType = rule.type;
  if (custom.indexOf(ruleType) > -1) {    if (!types[ruleType](value)) {      errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));    } // straight typeof check
  } else if (ruleType && typeof value !== rule.type) {    errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));  }};
var range = function range(rule, value, source, errors, options) {  var len = typeof rule.len === 'number';  var min = typeof rule.min === 'number';  var max = typeof rule.max === 'number'; // 正则匹配码点范围从U+010000一直到U+10FFFF的文字(补充平面Supplementary Plane)
  var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;  var val = value;  var key = null;  var num = typeof value === 'number';  var str = typeof value === 'string';  var arr = Array.isArray(value);
  if (num) {    key = 'number';  } else if (str) {    key = 'string';  } else if (arr) {    key = 'array';  } // if the value is not of a supported type for range validation
  // the validation rule rule should use the
  // type property to also test for a particular type
  if (!key) {    return false;  }
  if (arr) {    val = value.length;  }
  if (str) {    // 处理码点大于U+010000的文字length属性不准确的bug,如"𠮷𠮷𠮷".lenght !== 3
    val = value.replace(spRegexp, '_').length;  }
  if (len) {    if (val !== rule.len) {      errors.push(format(options.messages[key].len, rule.fullField, rule.len));    }  } else if (min && !max && val < rule.min) {    errors.push(format(options.messages[key].min, rule.fullField, rule.min));  } else if (max && !min && val > rule.max) {    errors.push(format(options.messages[key].max, rule.fullField, rule.max));  } else if (min && max && (val < rule.min || val > rule.max)) {    errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));  }};
var ENUM$1 = 'enum';
var enumerable$1 = function enumerable(rule, value, source, errors, options) {  rule[ENUM$1] = Array.isArray(rule[ENUM$1]) ? rule[ENUM$1] : [];
  if (rule[ENUM$1].indexOf(value) === -1) {    errors.push(format(options.messages[ENUM$1], rule.fullField, rule[ENUM$1].join(', ')));  }};
var pattern$1 = function pattern(rule, value, source, errors, options) {  if (rule.pattern) {    if (rule.pattern instanceof RegExp) {      // if a RegExp instance is passed, reset `lastIndex` in case its `global`
      // flag is accidentally set to `true`, which in a validation scenario
      // is not necessary and the result might be misleading
      rule.pattern.lastIndex = 0;
      if (!rule.pattern.test(value)) {        errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));      }    } else if (typeof rule.pattern === 'string') {      var _pattern = new RegExp(rule.pattern);
      if (!_pattern.test(value)) {        errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));      }    }  }};
var rules = {  required: required$1,  whitespace: whitespace,  type: type$1,  range: range,  "enum": enumerable$1,  pattern: pattern$1};
var string = function string(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value, 'string') && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options, 'string');
    if (!isEmptyValue(value, 'string')) {      rules.type(rule, value, source, errors, options);      rules.range(rule, value, source, errors, options);      rules.pattern(rule, value, source, errors, options);
      if (rule.whitespace === true) {        rules.whitespace(rule, value, source, errors, options);      }    }  }
  callback(errors);};
var method = function method(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);    }  }
  callback(errors);};
var number = function number(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (value === '') {      value = undefined;    }
    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);      rules.range(rule, value, source, errors, options);    }  }
  callback(errors);};
var _boolean = function _boolean(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);    }  }
  callback(errors);};
var regexp = function regexp(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (!isEmptyValue(value)) {      rules.type(rule, value, source, errors, options);    }  }
  callback(errors);};
var integer = function integer(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);      rules.range(rule, value, source, errors, options);    }  }
  callback(errors);};
var floatFn = function floatFn(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);      rules.range(rule, value, source, errors, options);    }  }
  callback(errors);};
var array = function array(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if ((value === undefined || value === null) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options, 'array');
    if (value !== undefined && value !== null) {      rules.type(rule, value, source, errors, options);      rules.range(rule, value, source, errors, options);    }  }
  callback(errors);};
var object = function object(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules.type(rule, value, source, errors, options);    }  }
  callback(errors);};
var ENUM = 'enum';
var enumerable = function enumerable(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (value !== undefined) {      rules[ENUM](rule, value, source, errors, options);    }  }
  callback(errors);};
var pattern = function pattern(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value, 'string') && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (!isEmptyValue(value, 'string')) {      rules.pattern(rule, value, source, errors, options);    }  }
  callback(errors);};
var date = function date(rule, value, callback, source, options) {  // console.log('integer rule called %j', rule);
  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); // console.log('validate on %s value', value);
  if (validate) {    if (isEmptyValue(value, 'date') && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);
    if (!isEmptyValue(value, 'date')) {      var dateObject;
      if (value instanceof Date) {        dateObject = value;      } else {        dateObject = new Date(value);      }
      rules.type(rule, dateObject, source, errors, options);
      if (dateObject) {        rules.range(rule, dateObject.getTime(), source, errors, options);      }    }  }
  callback(errors);};
var required = function required(rule, value, callback, source, options) {  var errors = [];  var type = Array.isArray(value) ? 'array' : typeof value;  rules.required(rule, value, source, errors, options, type);  callback(errors);};
var type = function type(rule, value, callback, source, options) {  var ruleType = rule.type;  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value, ruleType) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options, ruleType);
    if (!isEmptyValue(value, ruleType)) {      rules.type(rule, value, source, errors, options);    }  }
  callback(errors);};
var any = function any(rule, value, callback, source, options) {  var errors = [];  var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
  if (validate) {    if (isEmptyValue(value) && !rule.required) {      return callback();    }
    rules.required(rule, value, source, errors, options);  }
  callback(errors);};
var validators = {  string: string,  method: method,  number: number,  "boolean": _boolean,  regexp: regexp,  integer: integer,  "float": floatFn,  array: array,  object: object,  "enum": enumerable,  pattern: pattern,  date: date,  url: type,  hex: type,  email: type,  required: required,  any: any};
function newMessages() {  return {    "default": 'Validation error on field %s',    required: '%s is required',    "enum": '%s must be one of %s',    whitespace: '%s cannot be empty',    date: {      format: '%s date %s is invalid for format %s',      parse: '%s date could not be parsed, %s is invalid ',      invalid: '%s date %s is invalid'    },    types: {      string: '%s is not a %s',      method: '%s is not a %s (function)',      array: '%s is not an %s',      object: '%s is not an %s',      number: '%s is not a %s',      date: '%s is not a %s',      "boolean": '%s is not a %s',      integer: '%s is not an %s',      "float": '%s is not a %s',      regexp: '%s is not a valid %s',      email: '%s is not a valid %s',      url: '%s is not a valid %s',      hex: '%s is not a valid %s'    },    string: {      len: '%s must be exactly %s characters',      min: '%s must be at least %s characters',      max: '%s cannot be longer than %s characters',      range: '%s must be between %s and %s characters'    },    number: {      len: '%s must equal %s',      min: '%s cannot be less than %s',      max: '%s cannot be greater than %s',      range: '%s must be between %s and %s'    },    array: {      len: '%s must be exactly %s in length',      min: '%s cannot be less than %s in length',      max: '%s cannot be greater than %s in length',      range: '%s must be between %s and %s in length'    },    pattern: {      mismatch: '%s value %s does not match pattern %s'    },    clone: function clone() {      var cloned = JSON.parse(JSON.stringify(this));      cloned.clone = this.clone;      return cloned;    }  };}var messages = newMessages();
/** *  Encapsulates a validation schema. * *  @param descriptor An object declaring validation rules *  for this schema. */
var Schema = /*#__PURE__*/function () {  // ========================= Static =========================
  // ======================== Instance ========================
  function Schema(descriptor) {    this.rules = null;    this._messages = messages;    this.define(descriptor);  }
  var _proto = Schema.prototype;
  _proto.define = function define(rules) {    var _this = this;
    if (!rules) {      throw new Error('Cannot configure a schema with no rules');    }
    if (typeof rules !== 'object' || Array.isArray(rules)) {      throw new Error('Rules must be an object');    }
    this.rules = {};    Object.keys(rules).forEach(function (name) {      var item = rules[name];      _this.rules[name] = Array.isArray(item) ? item : [item];    });  };
  _proto.messages = function messages(_messages) {    if (_messages) {      this._messages = deepMerge(newMessages(), _messages);    }
    return this._messages;  };
  _proto.validate = function validate(source_, o, oc) {    var _this2 = this;
    if (o === void 0) {      o = {};    }
    if (oc === void 0) {      oc = function oc() {};    }
    var source = source_;    var options = o;    var callback = oc;
    if (typeof options === 'function') {      callback = options;      options = {};    }
    if (!this.rules || Object.keys(this.rules).length === 0) {      if (callback) {        callback(null, source);      }
      return Promise.resolve(source);    }
    function complete(results) {      var errors = [];      var fields = {};
      function add(e) {        if (Array.isArray(e)) {          var _errors;
          errors = (_errors = errors).concat.apply(_errors, e);        } else {          errors.push(e);        }      }
      for (var i = 0; i < results.length; i++) {        add(results[i]);      }
      if (!errors.length) {        callback(null, source);      } else {        fields = convertFieldsError(errors);        callback(errors, fields);      }    }
    if (options.messages) {      var messages$1 = this.messages();
      if (messages$1 === messages) {        messages$1 = newMessages();      }
      deepMerge(messages$1, options.messages);      options.messages = messages$1;    } else {      options.messages = this.messages();    }
    var series = {};    var keys = options.keys || Object.keys(this.rules);    keys.forEach(function (z) {      var arr = _this2.rules[z];      var value = source[z];      arr.forEach(function (r) {        var rule = r;
        if (typeof rule.transform === 'function') {          if (source === source_) {            source = _extends({}, source);          }
          value = source[z] = rule.transform(value);        }
        if (typeof rule === 'function') {          rule = {            validator: rule          };        } else {          rule = _extends({}, rule);        } // Fill validator. Skip if nothing need to validate
        rule.validator = _this2.getValidationMethod(rule);
        if (!rule.validator) {          return;        }
        rule.field = z;        rule.fullField = rule.fullField || z;        rule.type = _this2.getType(rule);        series[z] = series[z] || [];        series[z].push({          rule: rule,          value: value,          source: source,          field: z        });      });    });    var errorFields = {};    return asyncMap(series, options, function (data, doIt) {      var rule = data.rule;      var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField === 'object');      deep = deep && (rule.required || !rule.required && data.value);      rule.field = data.field;
      function addFullField(key, schema) {        return _extends({}, schema, {          fullField: rule.fullField + "." + key,          fullFields: rule.fullFields ? [].concat(rule.fullFields, [key]) : [key]        });      }
      function cb(e) {        if (e === void 0) {          e = [];        }
        var errorList = Array.isArray(e) ? e : [e];
        if (!options.suppressWarning && errorList.length) {          Schema.warning('async-validator:', errorList);        }
        if (errorList.length && rule.message !== undefined) {          errorList = [].concat(rule.message);        } // Fill error info
        var filledErrors = errorList.map(complementError(rule, source));
        if (options.first && filledErrors.length) {          errorFields[rule.field] = 1;          return doIt(filledErrors);        }
        if (!deep) {          doIt(filledErrors);        } else {          // if rule is required but the target object
          // does not exist fail at the rule level and don't
          // go deeper
          if (rule.required && !data.value) {            if (rule.message !== undefined) {              filledErrors = [].concat(rule.message).map(complementError(rule, source));            } else if (options.error) {              filledErrors = [options.error(rule, format(options.messages.required, rule.field))];            }
            return doIt(filledErrors);          }
          var fieldsSchema = {};
          if (rule.defaultField) {            Object.keys(data.value).map(function (key) {              fieldsSchema[key] = rule.defaultField;            });          }
          fieldsSchema = _extends({}, fieldsSchema, data.rule.fields);          var paredFieldsSchema = {};          Object.keys(fieldsSchema).forEach(function (field) {            var fieldSchema = fieldsSchema[field];            var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema];            paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field));          });          var schema = new Schema(paredFieldsSchema);          schema.messages(options.messages);
          if (data.rule.options) {            data.rule.options.messages = options.messages;            data.rule.options.error = options.error;          }
          schema.validate(data.value, data.rule.options || options, function (errs) {            var finalErrors = [];
            if (filledErrors && filledErrors.length) {              finalErrors.push.apply(finalErrors, filledErrors);            }
            if (errs && errs.length) {              finalErrors.push.apply(finalErrors, errs);            }
            doIt(finalErrors.length ? finalErrors : null);          });        }      }
      var res;
      if (rule.asyncValidator) {        res = rule.asyncValidator(rule, data.value, cb, data.source, options);      } else if (rule.validator) {        try {          res = rule.validator(rule, data.value, cb, data.source, options);        } catch (error) {          console.error == null ? void 0 : console.error(error); // rethrow to report error
          if (!options.suppressValidatorError) {            setTimeout(function () {              throw error;            }, 0);          }
          cb(error.message);        }
        if (res === true) {          cb();        } else if (res === false) {          cb(typeof rule.message === 'function' ? rule.message(rule.fullField || rule.field) : rule.message || (rule.fullField || rule.field) + " fails");        } else if (res instanceof Array) {          cb(res);        } else if (res instanceof Error) {          cb(res.message);        }      }
      if (res && res.then) {        res.then(function () {          return cb();        }, function (e) {          return cb(e);        });      }    }, function (results) {      complete(results);    }, source);  };
  _proto.getType = function getType(rule) {    if (rule.type === undefined && rule.pattern instanceof RegExp) {      rule.type = 'pattern';    }
    if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {      throw new Error(format('Unknown rule type %s', rule.type));    }
    return rule.type || 'string';  };
  _proto.getValidationMethod = function getValidationMethod(rule) {    if (typeof rule.validator === 'function') {      return rule.validator;    }
    var keys = Object.keys(rule);    var messageIndex = keys.indexOf('message');
    if (messageIndex !== -1) {      keys.splice(messageIndex, 1);    }
    if (keys.length === 1 && keys[0] === 'required') {      return validators.required;    }
    return validators[this.getType(rule)] || undefined;  };
  return Schema;}();
Schema.register = function register(type, validator) {  if (typeof validator !== 'function') {    throw new Error('Cannot register a validator by type, validator is not a function');  }
  validators[type] = validator;};
Schema.warning = warning;Schema.messages = messages;Schema.validators = validators;
export { Schema as default };//# sourceMappingURL=index.js.map
  |