util.js 5.6 KB

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