util.js 7.2 KB

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