"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); var _exportNames = {}; exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _messages2 = require("./messages"); var _util = require("./util"); var _index = _interopRequireDefault(require("./validator/index")); var _interface = require("./interface"); Object.keys(_interface).forEach(function (key) { if (key === "default" || key === "__esModule") return; if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; if (key in exports && exports[key] === _interface[key]) return; Object.defineProperty(exports, key, { enumerable: true, get: function get() { return _interface[key]; } }); }); /** * Encapsulates a validation schema. * * @param descriptor An object declaring validation rules * for this schema. */ var Schema = /*#__PURE__*/function () { function Schema(descriptor) { (0, _classCallCheck2.default)(this, Schema); // ======================== Instance ======================== (0, _defineProperty2.default)(this, "rules", null); (0, _defineProperty2.default)(this, "_messages", _messages2.messages); this.define(descriptor); } (0, _createClass2.default)(Schema, [{ key: "define", value: function define(rules) { var _this = this; if (!rules) { throw new Error('Cannot configure a schema with no rules'); } if ((0, _typeof2.default)(rules) !== 'object' || Array.isArray(rules)) { throw new Error('Rules must be an object'); } this.rules = {}; Object.keys(rules).forEach(function (name) { var item = rules[name]; _this.rules[name] = Array.isArray(item) ? item : [item]; }); } }, { key: "messages", value: function messages(_messages) { if (_messages) { this._messages = (0, _util.deepMerge)((0, _messages2.newMessages)(), _messages); } return this._messages; } }, { key: "validate", value: function validate(source_) { var _this2 = this; var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var oc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; var source = source_; var options = o; var callback = oc; if (typeof options === 'function') { callback = options; options = {}; } if (!this.rules || Object.keys(this.rules).length === 0) { if (callback) { callback(null, source); } return Promise.resolve(source); } function complete(results) { var errors = []; var fields = {}; function add(e) { if (Array.isArray(e)) { var _errors; errors = (_errors = errors).concat.apply(_errors, (0, _toConsumableArray2.default)(e)); } else { errors.push(e); } } for (var i = 0; i < results.length; i++) { add(results[i]); } if (!errors.length) { callback(null, source); } else { fields = (0, _util.convertFieldsError)(errors); callback(errors, fields); } } if (options.messages) { var messages = this.messages(); if (messages === _messages2.messages) { messages = (0, _messages2.newMessages)(); } (0, _util.deepMerge)(messages, options.messages); options.messages = messages; } else { options.messages = this.messages(); } var series = {}; var keys = options.keys || Object.keys(this.rules); keys.forEach(function (z) { var arr = _this2.rules[z]; var value = source[z]; arr.forEach(function (r) { var rule = r; if (typeof rule.transform === 'function') { if (source === source_) { source = (0, _objectSpread2.default)({}, source); } value = source[z] = rule.transform(value); if (value !== undefined && value !== null) { rule.type = rule.type || (Array.isArray(value) ? 'array' : (0, _typeof2.default)(value)); } } if (typeof rule === 'function') { rule = { validator: rule }; } else { rule = (0, _objectSpread2.default)({}, rule); } // Fill validator. Skip if nothing need to validate rule.validator = _this2.getValidationMethod(rule); if (!rule.validator) { return; } rule.field = z; rule.fullField = rule.fullField || z; rule.type = _this2.getType(rule); series[z] = series[z] || []; series[z].push({ rule: rule, value: value, source: source, field: z }); }); }); var errorFields = {}; return (0, _util.asyncMap)(series, options, function (data, doIt) { var rule = data.rule; var deep = (rule.type === 'object' || rule.type === 'array') && ((0, _typeof2.default)(rule.fields) === 'object' || (0, _typeof2.default)(rule.defaultField) === 'object'); deep = deep && (rule.required || !rule.required && data.value); rule.field = data.field; function addFullField(key, schema) { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, schema), {}, { fullField: "".concat(rule.fullField, ".").concat(key), fullFields: rule.fullFields ? [].concat((0, _toConsumableArray2.default)(rule.fullFields), [key]) : [key] }); } function cb() { var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var errorList = Array.isArray(e) ? e : [e]; if (!options.suppressWarning && errorList.length) { Schema.warning('async-validator:', errorList); } if (errorList.length && rule.message !== undefined) { errorList = [].concat(rule.message); } // Fill error info var filledErrors = errorList.map((0, _util.complementError)(rule, source)); if (options.first && filledErrors.length) { errorFields[rule.field] = 1; return doIt(filledErrors); } if (!deep) { doIt(filledErrors); } else { // if rule is required but the target object // does not exist fail at the rule level and don't // go deeper if (rule.required && !data.value) { if (rule.message !== undefined) { filledErrors = [].concat(rule.message).map((0, _util.complementError)(rule, source)); } else if (options.error) { filledErrors = [options.error(rule, (0, _util.format)(options.messages.required, rule.field))]; } return doIt(filledErrors); } var fieldsSchema = {}; if (rule.defaultField) { Object.keys(data.value).map(function (key) { fieldsSchema[key] = rule.defaultField; }); } fieldsSchema = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fieldsSchema), data.rule.fields); var paredFieldsSchema = {}; Object.keys(fieldsSchema).forEach(function (field) { var fieldSchema = fieldsSchema[field]; var fieldSchemaList = Array.isArray(fieldSchema) ? fieldSchema : [fieldSchema]; paredFieldsSchema[field] = fieldSchemaList.map(addFullField.bind(null, field)); }); var schema = new Schema(paredFieldsSchema); schema.messages(options.messages); if (data.rule.options) { data.rule.options.messages = options.messages; data.rule.options.error = options.error; } schema.validate(data.value, data.rule.options || options, function (errs) { var finalErrors = []; if (filledErrors && filledErrors.length) { finalErrors.push.apply(finalErrors, (0, _toConsumableArray2.default)(filledErrors)); } if (errs && errs.length) { finalErrors.push.apply(finalErrors, (0, _toConsumableArray2.default)(errs)); } doIt(finalErrors.length ? finalErrors : null); }); } } var res; if (rule.asyncValidator) { res = rule.asyncValidator(rule, data.value, cb, data.source, options); } else if (rule.validator) { try { res = rule.validator(rule, data.value, cb, data.source, options); } catch (error) { var _console$error, _console; (_console$error = (_console = console).error) === null || _console$error === void 0 || _console$error.call(_console, error); // rethrow to report error if (!options.suppressValidatorError) { setTimeout(function () { throw error; }, 0); } cb(error.message); } if (res === true) { cb(); } else if (res === false) { cb(typeof rule.message === 'function' ? rule.message(rule.fullField || rule.field) : rule.message || "".concat(rule.fullField || rule.field, " fails")); } else if (res instanceof Array) { cb(res); } else if (res instanceof Error) { cb(res.message); } } if (res && res.then) { res.then(function () { return cb(); }, function (e) { return cb(e); }); } }, function (results) { complete(results); }, source); } }, { key: "getType", value: function getType(rule) { if (rule.type === undefined && rule.pattern instanceof RegExp) { rule.type = 'pattern'; } if (typeof rule.validator !== 'function' && rule.type && !_index.default.hasOwnProperty(rule.type)) { throw new Error((0, _util.format)('Unknown rule type %s', rule.type)); } return rule.type || 'string'; } }, { key: "getValidationMethod", value: function getValidationMethod(rule) { if (typeof rule.validator === 'function') { return rule.validator; } var keys = Object.keys(rule); var messageIndex = keys.indexOf('message'); if (messageIndex !== -1) { keys.splice(messageIndex, 1); } if (keys.length === 1 && keys[0] === 'required') { return _index.default.required; } return _index.default[this.getType(rule)] || undefined; } }]); return Schema; }(); // ========================= Static ========================= (0, _defineProperty2.default)(Schema, "register", function register(type, validator) { if (typeof validator !== 'function') { throw new Error('Cannot register a validator by type, validator is not a function'); } _index.default[type] = validator; }); (0, _defineProperty2.default)(Schema, "warning", _util.warning); (0, _defineProperty2.default)(Schema, "messages", _messages2.messages); (0, _defineProperty2.default)(Schema, "validators", _index.default); var _default = exports.default = Schema;