123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- "use strict";
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.validateRules = validateRules;
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
- var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
- var _asyncValidator = _interopRequireDefault(require("@rc-component/async-validator"));
- var React = _interopRequireWildcard(require("react"));
- var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
- var _messages = require("./messages");
- var _set = require("rc-util/lib/utils/set");
- // Remove incorrect original ts define
- var AsyncValidator = _asyncValidator.default;
- /**
- * Replace with template.
- * `I'm ${name}` + { name: 'bamboo' } = I'm bamboo
- */
- function replaceMessage(template, kv) {
- return template.replace(/\\?\$\{\w+\}/g, function (str) {
- if (str.startsWith('\\')) {
- return str.slice(1);
- }
- var key = str.slice(2, -1);
- return kv[key];
- });
- }
- var CODE_LOGIC_ERROR = 'CODE_LOGIC_ERROR';
- function validateRule(_x, _x2, _x3, _x4, _x5) {
- return _validateRule.apply(this, arguments);
- }
- /**
- * We use `async-validator` to validate the value.
- * But only check one value in a time to avoid namePath validate issue.
- */
- function _validateRule() {
- _validateRule = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee2(name, value, rule, options, messageVariables) {
- var cloneRule, originValidator, subRuleField, validator, messages, result, subResults, kv, fillVariableResult;
- return (0, _regeneratorRuntime2.default)().wrap(function _callee2$(_context2) {
- while (1) switch (_context2.prev = _context2.next) {
- case 0:
- cloneRule = (0, _objectSpread2.default)({}, rule); // Bug of `async-validator`
- // https://github.com/react-component/field-form/issues/316
- // https://github.com/react-component/field-form/issues/313
- delete cloneRule.ruleIndex;
- // https://github.com/ant-design/ant-design/issues/40497#issuecomment-1422282378
- AsyncValidator.warning = function () {
- return void 0;
- };
- if (cloneRule.validator) {
- originValidator = cloneRule.validator;
- cloneRule.validator = function () {
- try {
- return originValidator.apply(void 0, arguments);
- } catch (error) {
- console.error(error);
- return Promise.reject(CODE_LOGIC_ERROR);
- }
- };
- }
- // We should special handle array validate
- subRuleField = null;
- if (cloneRule && cloneRule.type === 'array' && cloneRule.defaultField) {
- subRuleField = cloneRule.defaultField;
- delete cloneRule.defaultField;
- }
- validator = new AsyncValidator((0, _defineProperty2.default)({}, name, [cloneRule]));
- messages = (0, _set.merge)(_messages.defaultValidateMessages, options.validateMessages);
- validator.messages(messages);
- result = [];
- _context2.prev = 10;
- _context2.next = 13;
- return Promise.resolve(validator.validate((0, _defineProperty2.default)({}, name, value), (0, _objectSpread2.default)({}, options)));
- case 13:
- _context2.next = 18;
- break;
- case 15:
- _context2.prev = 15;
- _context2.t0 = _context2["catch"](10);
- if (_context2.t0.errors) {
- result = _context2.t0.errors.map(function (_ref4, index) {
- var message = _ref4.message;
- var mergedMessage = message === CODE_LOGIC_ERROR ? messages.default : message;
- return /*#__PURE__*/React.isValidElement(mergedMessage) ?
- /*#__PURE__*/
- // Wrap ReactNode with `key`
- React.cloneElement(mergedMessage, {
- key: "error_".concat(index)
- }) : mergedMessage;
- });
- }
- case 18:
- if (!(!result.length && subRuleField)) {
- _context2.next = 23;
- break;
- }
- _context2.next = 21;
- return Promise.all(value.map(function (subValue, i) {
- return validateRule("".concat(name, ".").concat(i), subValue, subRuleField, options, messageVariables);
- }));
- case 21:
- subResults = _context2.sent;
- return _context2.abrupt("return", subResults.reduce(function (prev, errors) {
- return [].concat((0, _toConsumableArray2.default)(prev), (0, _toConsumableArray2.default)(errors));
- }, []));
- case 23:
- // Replace message with variables
- kv = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rule), {}, {
- name: name,
- enum: (rule.enum || []).join(', ')
- }, messageVariables);
- fillVariableResult = result.map(function (error) {
- if (typeof error === 'string') {
- return replaceMessage(error, kv);
- }
- return error;
- });
- return _context2.abrupt("return", fillVariableResult);
- case 26:
- case "end":
- return _context2.stop();
- }
- }, _callee2, null, [[10, 15]]);
- }));
- return _validateRule.apply(this, arguments);
- }
- function validateRules(namePath, value, rules, options, validateFirst, messageVariables) {
- var name = namePath.join('.');
- // Fill rule with context
- var filledRules = rules.map(function (currentRule, ruleIndex) {
- var originValidatorFunc = currentRule.validator;
- var cloneRule = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, currentRule), {}, {
- ruleIndex: ruleIndex
- });
- // Replace validator if needed
- if (originValidatorFunc) {
- cloneRule.validator = function (rule, val, callback) {
- var hasPromise = false;
- // Wrap callback only accept when promise not provided
- var wrappedCallback = function wrappedCallback() {
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
- args[_key] = arguments[_key];
- }
- // Wait a tick to make sure return type is a promise
- Promise.resolve().then(function () {
- (0, _warning.default)(!hasPromise, 'Your validator function has already return a promise. `callback` will be ignored.');
- if (!hasPromise) {
- callback.apply(void 0, args);
- }
- });
- };
- // Get promise
- var promise = originValidatorFunc(rule, val, wrappedCallback);
- hasPromise = promise && typeof promise.then === 'function' && typeof promise.catch === 'function';
- /**
- * 1. Use promise as the first priority.
- * 2. If promise not exist, use callback with warning instead
- */
- (0, _warning.default)(hasPromise, '`callback` is deprecated. Please return a promise instead.');
- if (hasPromise) {
- promise.then(function () {
- callback();
- }).catch(function (err) {
- callback(err || ' ');
- });
- }
- };
- }
- return cloneRule;
- }).sort(function (_ref, _ref2) {
- var w1 = _ref.warningOnly,
- i1 = _ref.ruleIndex;
- var w2 = _ref2.warningOnly,
- i2 = _ref2.ruleIndex;
- if (!!w1 === !!w2) {
- // Let keep origin order
- return i1 - i2;
- }
- if (w1) {
- return 1;
- }
- return -1;
- });
- // Do validate rules
- var summaryPromise;
- if (validateFirst === true) {
- // >>>>> Validate by serialization
- summaryPromise = new Promise( /*#__PURE__*/function () {
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(resolve, reject) {
- var i, rule, errors;
- return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
- while (1) switch (_context.prev = _context.next) {
- case 0:
- i = 0;
- case 1:
- if (!(i < filledRules.length)) {
- _context.next = 12;
- break;
- }
- rule = filledRules[i];
- _context.next = 5;
- return validateRule(name, value, rule, options, messageVariables);
- case 5:
- errors = _context.sent;
- if (!errors.length) {
- _context.next = 9;
- break;
- }
- reject([{
- errors: errors,
- rule: rule
- }]);
- return _context.abrupt("return");
- case 9:
- i += 1;
- _context.next = 1;
- break;
- case 12:
- /* eslint-enable */
- resolve([]);
- case 13:
- case "end":
- return _context.stop();
- }
- }, _callee);
- }));
- return function (_x6, _x7) {
- return _ref3.apply(this, arguments);
- };
- }());
- } else {
- // >>>>> Validate by parallel
- var rulePromises = filledRules.map(function (rule) {
- return validateRule(name, value, rule, options, messageVariables).then(function (errors) {
- return {
- errors: errors,
- rule: rule
- };
- });
- });
- summaryPromise = (validateFirst ? finishOnFirstFailed(rulePromises) : finishOnAllFailed(rulePromises)).then(function (errors) {
- // Always change to rejection for Field to catch
- return Promise.reject(errors);
- });
- }
- // Internal catch error to avoid console error log.
- summaryPromise.catch(function (e) {
- return e;
- });
- return summaryPromise;
- }
- function finishOnAllFailed(_x8) {
- return _finishOnAllFailed.apply(this, arguments);
- }
- function _finishOnAllFailed() {
- _finishOnAllFailed = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee3(rulePromises) {
- return (0, _regeneratorRuntime2.default)().wrap(function _callee3$(_context3) {
- while (1) switch (_context3.prev = _context3.next) {
- case 0:
- return _context3.abrupt("return", Promise.all(rulePromises).then(function (errorsList) {
- var _ref5;
- var errors = (_ref5 = []).concat.apply(_ref5, (0, _toConsumableArray2.default)(errorsList));
- return errors;
- }));
- case 1:
- case "end":
- return _context3.stop();
- }
- }, _callee3);
- }));
- return _finishOnAllFailed.apply(this, arguments);
- }
- function finishOnFirstFailed(_x9) {
- return _finishOnFirstFailed.apply(this, arguments);
- }
- function _finishOnFirstFailed() {
- _finishOnFirstFailed = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee4(rulePromises) {
- var count;
- return (0, _regeneratorRuntime2.default)().wrap(function _callee4$(_context4) {
- while (1) switch (_context4.prev = _context4.next) {
- case 0:
- count = 0;
- return _context4.abrupt("return", new Promise(function (resolve) {
- rulePromises.forEach(function (promise) {
- promise.then(function (ruleError) {
- if (ruleError.errors.length) {
- resolve([ruleError]);
- }
- count += 1;
- if (count === rulePromises.length) {
- resolve([]);
- }
- });
- });
- }));
- case 2:
- case "end":
- return _context4.stop();
- }
- }, _callee4);
- }));
- return _finishOnFirstFailed.apply(this, arguments);
- }
|