util.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _extends = Object.assign || 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; };
  6. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  7. exports.convertFieldsError = convertFieldsError;
  8. exports.format = format;
  9. exports.isEmptyValue = isEmptyValue;
  10. exports.isEmptyObject = isEmptyObject;
  11. exports.asyncMap = asyncMap;
  12. exports.complementError = complementError;
  13. exports.deepMerge = deepMerge;
  14. /* eslint no-console:0 */
  15. var formatRegExp = /%[sdj%]/g;
  16. var warning = exports.warning = function warning() {};
  17. // don't print warning message when in production env or node runtime
  18. if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && typeof document !== 'undefined') {
  19. exports.warning = warning = function warning(type, errors) {
  20. if (typeof console !== 'undefined' && console.warn) {
  21. if (errors.every(function (e) {
  22. return typeof e === 'string';
  23. })) {
  24. console.warn(type, errors);
  25. }
  26. }
  27. };
  28. }
  29. function convertFieldsError(errors) {
  30. if (!errors || !errors.length) return null;
  31. var fields = {};
  32. errors.forEach(function (error) {
  33. var field = error.field;
  34. fields[field] = fields[field] || [];
  35. fields[field].push(error);
  36. });
  37. return fields;
  38. }
  39. function format() {
  40. for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
  41. args[_key] = arguments[_key];
  42. }
  43. var i = 1;
  44. var f = args[0];
  45. var len = args.length;
  46. if (typeof f === 'function') {
  47. return f.apply(null, args.slice(1));
  48. }
  49. if (typeof f === 'string') {
  50. var str = String(f).replace(formatRegExp, function (x) {
  51. if (x === '%%') {
  52. return '%';
  53. }
  54. if (i >= len) {
  55. return x;
  56. }
  57. switch (x) {
  58. case '%s':
  59. return String(args[i++]);
  60. case '%d':
  61. return Number(args[i++]);
  62. case '%j':
  63. try {
  64. return JSON.stringify(args[i++]);
  65. } catch (_) {
  66. return '[Circular]';
  67. }
  68. break;
  69. default:
  70. return x;
  71. }
  72. });
  73. for (var arg = args[i]; i < len; arg = args[++i]) {
  74. str += ' ' + arg;
  75. }
  76. return str;
  77. }
  78. return f;
  79. }
  80. function isNativeStringType(type) {
  81. return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';
  82. }
  83. function isEmptyValue(value, type) {
  84. if (value === undefined || value === null) {
  85. return true;
  86. }
  87. if (type === 'array' && Array.isArray(value) && !value.length) {
  88. return true;
  89. }
  90. if (isNativeStringType(type) && typeof value === 'string' && !value) {
  91. return true;
  92. }
  93. return false;
  94. }
  95. function isEmptyObject(obj) {
  96. return Object.keys(obj).length === 0;
  97. }
  98. function asyncParallelArray(arr, func, callback) {
  99. var results = [];
  100. var total = 0;
  101. var arrLength = arr.length;
  102. function count(errors) {
  103. results.push.apply(results, errors);
  104. total++;
  105. if (total === arrLength) {
  106. callback(results);
  107. }
  108. }
  109. arr.forEach(function (a) {
  110. func(a, count);
  111. });
  112. }
  113. function asyncSerialArray(arr, func, callback) {
  114. var index = 0;
  115. var arrLength = arr.length;
  116. function next(errors) {
  117. if (errors && errors.length) {
  118. callback(errors);
  119. return;
  120. }
  121. var original = index;
  122. index = index + 1;
  123. if (original < arrLength) {
  124. func(arr[original], next);
  125. } else {
  126. callback([]);
  127. }
  128. }
  129. next([]);
  130. }
  131. function flattenObjArr(objArr) {
  132. var ret = [];
  133. Object.keys(objArr).forEach(function (k) {
  134. ret.push.apply(ret, objArr[k]);
  135. });
  136. return ret;
  137. }
  138. function asyncMap(objArr, option, func, callback) {
  139. if (option.first) {
  140. var flattenArr = flattenObjArr(objArr);
  141. return asyncSerialArray(flattenArr, func, callback);
  142. }
  143. var firstFields = option.firstFields || [];
  144. if (firstFields === true) {
  145. firstFields = Object.keys(objArr);
  146. }
  147. var objArrKeys = Object.keys(objArr);
  148. var objArrLength = objArrKeys.length;
  149. var total = 0;
  150. var results = [];
  151. var pending = new Promise(function (resolve, reject) {
  152. var next = function next(errors) {
  153. results.push.apply(results, errors);
  154. total++;
  155. if (total === objArrLength) {
  156. callback(results);
  157. return results.length ? reject({ errors: results, fields: convertFieldsError(results) }) : resolve();
  158. }
  159. };
  160. objArrKeys.forEach(function (key) {
  161. var arr = objArr[key];
  162. if (firstFields.indexOf(key) !== -1) {
  163. asyncSerialArray(arr, func, next);
  164. } else {
  165. asyncParallelArray(arr, func, next);
  166. }
  167. });
  168. });
  169. pending['catch'](function (e) {
  170. return e;
  171. });
  172. return pending;
  173. }
  174. function complementError(rule) {
  175. return function (oe) {
  176. if (oe && oe.message) {
  177. oe.field = oe.field || rule.fullField;
  178. return oe;
  179. }
  180. return {
  181. message: typeof oe === 'function' ? oe() : oe,
  182. field: oe.field || rule.fullField
  183. };
  184. };
  185. }
  186. function deepMerge(target, source) {
  187. if (source) {
  188. for (var s in source) {
  189. if (source.hasOwnProperty(s)) {
  190. var value = source[s];
  191. if ((typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && _typeof(target[s]) === 'object') {
  192. target[s] = _extends({}, target[s], value);
  193. } else {
  194. target[s] = value;
  195. }
  196. }
  197. }
  198. }
  199. return target;
  200. }