util.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.AsyncValidationError = void 0;
  7. exports.asyncMap = asyncMap;
  8. exports.complementError = complementError;
  9. exports.convertFieldsError = convertFieldsError;
  10. exports.deepMerge = deepMerge;
  11. exports.format = format;
  12. exports.isEmptyObject = isEmptyObject;
  13. exports.isEmptyValue = isEmptyValue;
  14. exports.warning = void 0;
  15. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  16. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  17. var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
  18. var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
  19. var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
  20. var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
  21. var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
  22. var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapNativeSuper"));
  23. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  24. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  25. /* eslint no-console:0 */
  26. var formatRegExp = /%[sdj%]/g;
  27. var warning = exports.warning = function warning() {};
  28. // don't print warning message when in production env or node runtime
  29. if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {
  30. exports.warning = warning = function warning(type, errors) {
  31. if (typeof console !== 'undefined' && console.warn && typeof ASYNC_VALIDATOR_NO_WARNING === 'undefined') {
  32. if (errors.every(function (e) {
  33. return typeof e === 'string';
  34. })) {
  35. console.warn(type, errors);
  36. }
  37. }
  38. };
  39. }
  40. function convertFieldsError(errors) {
  41. if (!errors || !errors.length) return null;
  42. var fields = {};
  43. errors.forEach(function (error) {
  44. var field = error.field;
  45. fields[field] = fields[field] || [];
  46. fields[field].push(error);
  47. });
  48. return fields;
  49. }
  50. function format(template) {
  51. for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  52. args[_key - 1] = arguments[_key];
  53. }
  54. var i = 0;
  55. var len = args.length;
  56. if (typeof template === 'function') {
  57. // eslint-disable-next-line prefer-spread
  58. return template.apply(null, args);
  59. }
  60. if (typeof template === 'string') {
  61. var str = template.replace(formatRegExp, function (x) {
  62. if (x === '%%') {
  63. return '%';
  64. }
  65. if (i >= len) {
  66. return x;
  67. }
  68. switch (x) {
  69. case '%s':
  70. return String(args[i++]);
  71. case '%d':
  72. return Number(args[i++]);
  73. case '%j':
  74. try {
  75. return JSON.stringify(args[i++]);
  76. } catch (_) {
  77. return '[Circular]';
  78. }
  79. break;
  80. default:
  81. return x;
  82. }
  83. });
  84. return str;
  85. }
  86. return template;
  87. }
  88. function isNativeStringType(type) {
  89. return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'date' || type === 'pattern';
  90. }
  91. function isEmptyValue(value, type) {
  92. if (value === undefined || value === null) {
  93. return true;
  94. }
  95. if (type === 'array' && Array.isArray(value) && !value.length) {
  96. return true;
  97. }
  98. if (isNativeStringType(type) && typeof value === 'string' && !value) {
  99. return true;
  100. }
  101. return false;
  102. }
  103. function isEmptyObject(obj) {
  104. return Object.keys(obj).length === 0;
  105. }
  106. function asyncParallelArray(arr, func, callback) {
  107. var results = [];
  108. var total = 0;
  109. var arrLength = arr.length;
  110. function count(errors) {
  111. results.push.apply(results, (0, _toConsumableArray2.default)(errors || []));
  112. total++;
  113. if (total === arrLength) {
  114. callback(results);
  115. }
  116. }
  117. arr.forEach(function (a) {
  118. func(a, count);
  119. });
  120. }
  121. function asyncSerialArray(arr, func, callback) {
  122. var index = 0;
  123. var arrLength = arr.length;
  124. function next(errors) {
  125. if (errors && errors.length) {
  126. callback(errors);
  127. return;
  128. }
  129. var original = index;
  130. index = index + 1;
  131. if (original < arrLength) {
  132. func(arr[original], next);
  133. } else {
  134. callback([]);
  135. }
  136. }
  137. next([]);
  138. }
  139. function flattenObjArr(objArr) {
  140. var ret = [];
  141. Object.keys(objArr).forEach(function (k) {
  142. ret.push.apply(ret, (0, _toConsumableArray2.default)(objArr[k] || []));
  143. });
  144. return ret;
  145. }
  146. var AsyncValidationError = exports.AsyncValidationError = /*#__PURE__*/function (_Error) {
  147. (0, _inherits2.default)(AsyncValidationError, _Error);
  148. var _super = (0, _createSuper2.default)(AsyncValidationError);
  149. function AsyncValidationError(errors, fields) {
  150. var _this;
  151. (0, _classCallCheck2.default)(this, AsyncValidationError);
  152. _this = _super.call(this, 'Async Validation Error');
  153. (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "errors", void 0);
  154. (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "fields", void 0);
  155. _this.errors = errors;
  156. _this.fields = fields;
  157. return _this;
  158. }
  159. return (0, _createClass2.default)(AsyncValidationError);
  160. }( /*#__PURE__*/(0, _wrapNativeSuper2.default)(Error));
  161. function asyncMap(objArr, option, func, callback, source) {
  162. if (option.first) {
  163. var _pending = new Promise(function (resolve, reject) {
  164. var next = function next(errors) {
  165. callback(errors);
  166. return errors.length ? reject(new AsyncValidationError(errors, convertFieldsError(errors))) : resolve(source);
  167. };
  168. var flattenArr = flattenObjArr(objArr);
  169. asyncSerialArray(flattenArr, func, next);
  170. });
  171. _pending.catch(function (e) {
  172. return e;
  173. });
  174. return _pending;
  175. }
  176. var firstFields = option.firstFields === true ? Object.keys(objArr) : option.firstFields || [];
  177. var objArrKeys = Object.keys(objArr);
  178. var objArrLength = objArrKeys.length;
  179. var total = 0;
  180. var results = [];
  181. var pending = new Promise(function (resolve, reject) {
  182. var next = function next(errors) {
  183. // eslint-disable-next-line prefer-spread
  184. results.push.apply(results, errors);
  185. total++;
  186. if (total === objArrLength) {
  187. callback(results);
  188. return results.length ? reject(new AsyncValidationError(results, convertFieldsError(results))) : resolve(source);
  189. }
  190. };
  191. if (!objArrKeys.length) {
  192. callback(results);
  193. resolve(source);
  194. }
  195. objArrKeys.forEach(function (key) {
  196. var arr = objArr[key];
  197. if (firstFields.indexOf(key) !== -1) {
  198. asyncSerialArray(arr, func, next);
  199. } else {
  200. asyncParallelArray(arr, func, next);
  201. }
  202. });
  203. });
  204. pending.catch(function (e) {
  205. return e;
  206. });
  207. return pending;
  208. }
  209. function isErrorObj(obj) {
  210. return !!(obj && obj.message !== undefined);
  211. }
  212. function getValue(value, path) {
  213. var v = value;
  214. for (var i = 0; i < path.length; i++) {
  215. if (v == undefined) {
  216. return v;
  217. }
  218. v = v[path[i]];
  219. }
  220. return v;
  221. }
  222. function complementError(rule, source) {
  223. return function (oe) {
  224. var fieldValue;
  225. if (rule.fullFields) {
  226. fieldValue = getValue(source, rule.fullFields);
  227. } else {
  228. fieldValue = source[oe.field || rule.fullField];
  229. }
  230. if (isErrorObj(oe)) {
  231. oe.field = oe.field || rule.fullField;
  232. oe.fieldValue = fieldValue;
  233. return oe;
  234. }
  235. return {
  236. message: typeof oe === 'function' ? oe() : oe,
  237. fieldValue: fieldValue,
  238. field: oe.field || rule.fullField
  239. };
  240. };
  241. }
  242. function deepMerge(target, source) {
  243. if (source) {
  244. for (var s in source) {
  245. if (source.hasOwnProperty(s)) {
  246. var value = source[s];
  247. if ((0, _typeof2.default)(value) === 'object' && (0, _typeof2.default)(target[s]) === 'object') {
  248. target[s] = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, target[s]), value);
  249. } else {
  250. target[s] = value;
  251. }
  252. }
  253. }
  254. }
  255. return target;
  256. }