You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
4.9 KiB

1 year ago
import { format } from "./index.js";
//import { Schema } from "element-plus";
const messages = {
default: "%s验证失败",
required: "%s是必填项",
enum: "%s必须是%s之一",
whitespace: "%s不能为空",
// date: {
// format: '%s date %s is invalid for format %s',
// parse: '%s date could not be parsed, %s is invalid ',
// invalid: '%s date %s is invalid',
// },
types: {
string: "%s不是有效的字符串",
method: "%s不是有效的函数",
array: "%s不是有效的数组",
object: "%s不是有效的对象",
number: "%s不是有效的数字",
date: "%s不是有效的日期",
boolean: "%s不是有效的布尔值",
integer: "%s不是有效的整数",
float: "%s不是有效的浮点数",
regexp: "%s不是有效的正则表达式",
email: "%s不是有效的邮箱",
url: "%s不是有效的 url",
hex: "%s不是有效的十六进制",
},
string: {
len: "%s长度必须是%s",
min: "%s最小长度为%s",
max: "%s最大长度为%s",
range: "%s长度必须在%s和%s之间",
},
number: {
len: "%s必须等于%s",
min: "%s不小于%s",
max: "%s不大于%s",
range: "%s必须在%s和%s之间",
},
array: {
len: "%s的数量必须是%s",
min: "%s的数量不小于%s",
max: "%s的数量不大于%s",
range: "%s的数量必须在%s和%s之间",
},
pattern: {
1 year ago
mismatch: "%s的值必须是正确的格式",
},
clone: function clone() {
const cloned = JSON.parse(JSON.stringify(this));
cloned.clone = this.clone;
return cloned;
},
//
compare: "%s 和 %s 输入必须一致",
true: "%s必须选中",
remote: "%s远程验证失败",
};
const validators = {
compare(rule, value, callback, source, options) {
const errors = [];
if (value && value !== rule.data[rule.compare]) {
const message = format(options.messages.compare, rule.title, rule.schema.properties[rule.compare].title);
errors.push(new Error(message));
}
callback(errors);
},
true(rule, value, callback, source, options) {
const errors = [];
if (!value) {
const message = format(options.messages.true, rule.title);
errors.push(new Error(message));
}
callback(errors);
},
remote(rule, value, callback, source, options) {
const errors = [];
const message = format(options.messages.remote, rule.title);
if (!value) {
callback(errors);
} else {
const config = {
url: rule.url,
method: rule.method ?? "GET",
};
const data = { [rule.field]: value };
if (config.method === "GET") {
config.params = data;
} else {
config.data = data;
}
request
.request(config)
.then((response) => {
if (response.status === 200) {
if (response.data.code) {
if (response.data.code !== 200) {
errors.push(new Error(1 + response.data.message));
}
}
} else {
errors.push(new Error(2 + response.data));
}
callback(errors);
})
.catch((o) => {
errors.push(o.response?.data?.message ?? message ?? o.message);
callback(errors);
});
}
},
};
1 year ago
//
const getRules = (parentSchema, property, data) => {
if (!property.rules) {
return null;
}
const rules = [...(Array.isArray(property.rules) ? property.rules : [property.rules])].map((o) =>
JSON.parse(JSON.stringify(o))
);
Object.values(rules).forEach((rule) => {
rule.data = data;
rule.schema = parentSchema;
rule.title ??= property.title;
if (!rule.type && property.type !== "object") {
rule.type = property.type;
}
1 year ago
if (rule.validator) {
rule.validator = validators[rule.validator];
}
if (!rule.message) {
if (rule.required) {
rule.message = format(messages.required, property.title);
} else if (rule.type === "email") {
rule.message = format(messages.types.email, property.title);
1 year ago
} else if (rule.pattern) {
rule.message = format(messages.pattern.mismatch, property.title);
} else if (property.type === "string" || property.type === "number" || property.type === "array") {
if (rule.len) {
rule.message = format(messages[property.type].len, property.title, rule.len);
} else if (rule.min) {
rule.message = format(messages[property.type].min, property.title, rule.min);
} else if (rule.max) {
rule.message = format(messages[property.type].max, property.title, rule.max);
} else if (rule.range) {
rule.message = format(messages[property.type].range, property.title, rule.range);
}
}
} else {
rule.message = format(rule.message, property.title);
}
});
return rules;
};
//Object.assign(Schema.messages, messages);
//Object.assign(Schema.validators, validators);
export { getRules };