@amaui/ui-react
Version:
UI for React
220 lines (219 loc) • 12.3 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.onValidateError = void 0;
const is_1 = __importDefault(require("@amaui/utils/is"));
const isValid_1 = __importDefault(require("@amaui/utils/isValid"));
const utils_1 = require("@amaui/utils");
const errors_1 = require("@amaui/errors");
const onValidateError = (options, model, message) => {
const error = new errors_1.ValidationError(message);
// Entire model message
if (options.message !== undefined)
error.message = options.message;
// model item message
else if (model.message !== undefined)
error.message = model.message;
// error
throw error;
};
exports.onValidateError = onValidateError;
const validate = async (model, property, form, options_) => {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
const options = (0, utils_1.merge)((options_ && (0, is_1.default)('object', options_)) ? options_ : {}, { uriDecode: true, parse: true });
const name = (0, is_1.default)('function', model.propertyNameUpdate) ? model.propertyNameUpdate(model.name) : model.capitalize !== false ? (0, utils_1.capitalize)(model.name) : model.name;
const value = model.value;
// value validate
// with options above
// required
if (model.required) {
const response = value;
if (response === undefined)
(0, exports.onValidateError)(options, model, ((_a = model.messages) === null || _a === void 0 ? void 0 : _a.required) || `${name} is required`);
}
// only validate
// if value is not undefined
// as it is optional
if (value === undefined)
return;
// is
if (model.is !== undefined) {
const is_ = ((0, is_1.default)('array', model.is) ? model.is : [model.is]).filter(Boolean);
for (const item of is_) {
const itemType = (item === null || item === void 0 ? void 0 : item.type) || item;
const itemOptions = (item === null || item === void 0 ? void 0 : item.options) || undefined;
const response = (0, is_1.default)(itemType, value, itemOptions);
if (!response)
(0, exports.onValidateError)(options, model, ((_b = model.messages) === null || _b === void 0 ? void 0 : _b.is) || `${name} has to be a valid ${(0, utils_1.cleanValue)(itemType)}`);
}
}
// is valid
if (model.isValid !== undefined) {
const isValid_ = ((0, is_1.default)('array', model.isValid) ? model.isValid : [model.isValid]).filter(Boolean);
for (const item of isValid_) {
const itemType = (item === null || item === void 0 ? void 0 : item.type) || item;
const itemOptions = (item === null || item === void 0 ? void 0 : item.options) || undefined;
const response = (0, isValid_1.default)(itemType, value, itemOptions);
if (!response)
(0, exports.onValidateError)(options, model, ((_c = model.messages) === null || _c === void 0 ? void 0 : _c.isValid) || `${name} has to be a valid ${(0, utils_1.cleanValue)(itemType)}`);
}
}
// of
if (model.of !== undefined) {
const of_ = ((0, is_1.default)('array', model.of) ? model.of : [model.of]).filter(Boolean);
if ((0, is_1.default)('array', value)) {
const response = value.every(valueItem => {
return of_.some(item => {
const itemType = (item === null || item === void 0 ? void 0 : item.type) || item;
const itemOptions = (item === null || item === void 0 ? void 0 : item.options) || undefined;
return (0, is_1.default)(itemType, valueItem, itemOptions);
});
});
if (!response)
(0, exports.onValidateError)(options, model, ((_d = model.messages) === null || _d === void 0 ? void 0 : _d.of) || `${name} items have to be one of ${of_.map(item => (item === null || item === void 0 ? void 0 : item.type) || item).join(', ')}`);
}
}
// ofValid
if (model.ofValid !== undefined) {
const ofValid = ((0, is_1.default)('array', model.ofValid) ? model.ofValid : [model.ofValid]).filter(Boolean);
if ((0, is_1.default)('array', value)) {
const response = value.every(valueItem => {
return ofValid.some(item => {
const itemType = (item === null || item === void 0 ? void 0 : item.type) || item;
const itemOptions = (item === null || item === void 0 ? void 0 : item.options) || undefined;
return (0, isValid_1.default)(itemType, valueItem, itemOptions);
});
});
if (!response)
(0, exports.onValidateError)(options, model, ((_e = model.messages) === null || _e === void 0 ? void 0 : _e.ofValid) || `${name} items have to be one of valid ${ofValid.map(item => (item === null || item === void 0 ? void 0 : item.type) || item).join(', ')}`);
}
}
// equal
if (model.equal !== undefined) {
const response = value === model.equal;
if (!response)
(0, exports.onValidateError)(options, model, ((_f = model.messages) === null || _f === void 0 ? void 0 : _f.equal) || `${name} has to be equal to ${(0, utils_1.stringify)(model.equal)}`);
}
// not equal
if (model.notEqual !== undefined) {
const response = value !== model.equal;
if (!response)
(0, exports.onValidateError)(options, model, ((_g = model.messages) === null || _g === void 0 ? void 0 : _g.notEqual) || `${name} has to not be equal to ${(0, utils_1.stringify)(model.equal)}`);
}
// equal deep
if (model.equalDeep !== undefined) {
const response = (0, utils_1.equalDeep)(value, model.equalDeep);
if (!response)
(0, exports.onValidateError)(options, model, ((_h = model.messages) === null || _h === void 0 ? void 0 : _h.equalDeep) || `${name} has to be equal to ${(0, utils_1.stringify)(model.equalDeep)}`);
}
// not equal deep
if (model.notEqualDeep !== undefined) {
const response = !(0, utils_1.equalDeep)(value, model.notEqualDeep);
if (!response)
(0, exports.onValidateError)(options, model, ((_j = model.messages) === null || _j === void 0 ? void 0 : _j.notEqualDeep) || `${name} has to not be equal to ${(0, utils_1.stringify)(model.notEqualDeep)}`);
}
// some
if ((0, is_1.default)('array', model.some)) {
let response;
if ((0, is_1.default)('string', value)) {
response = !!model.some.find(item => (0, utils_1.equalDeep)(value, item));
if (!response)
(0, exports.onValidateError)(options, model, ((_k = model.messages) === null || _k === void 0 ? void 0 : _k.some) || `${name} has to be one of ${model.some.map(item => (0, utils_1.stringify)(item)).join(', ')}`);
}
else if ((0, is_1.default)('array', value)) {
response = value.some(item => !!model.some.find(item_ => (0, utils_1.equalDeep)(item, item_)));
if (!response)
(0, exports.onValidateError)(options, model, ((_l = model.messages) === null || _l === void 0 ? void 0 : _l.some) || `${name} has to include some of ${model.some.map(item => (0, utils_1.stringify)(item)).join(', ')}`);
}
}
// in
// every
const every = model.in || model.every;
if ((0, is_1.default)('array', every)) {
let response;
if ((0, is_1.default)('string', value)) {
response = !!every.find(item => (0, utils_1.equalDeep)(value, item));
if (!response)
(0, exports.onValidateError)(options, model, ((_m = model.messages) === null || _m === void 0 ? void 0 : _m.in) || ((_o = model.messages) === null || _o === void 0 ? void 0 : _o.every) || `${name} has to be one of ${every.map(item => (0, utils_1.stringify)(item)).join(', ')}`);
}
else if ((0, is_1.default)('array', value)) {
response = value.every(item => !!every.find(item_ => (0, utils_1.equalDeep)(item, item_)));
if (!response)
(0, exports.onValidateError)(options, model, ((_p = model.messages) === null || _p === void 0 ? void 0 : _p.in) || ((_q = model.messages) === null || _q === void 0 ? void 0 : _q.every) || `${name} has to include one of ${every.map(item => (0, utils_1.stringify)(item)).join(', ')}`);
}
}
// properties
if ((0, is_1.default)('array', model.properties)) {
const allowed = model.properties;
const keys = Object.keys(value);
const response = keys.every(item => allowed.includes(item));
if (!response)
(0, exports.onValidateError)(options, model, ((_r = model.messages) === null || _r === void 0 ? void 0 : _r.properties) || `${name} allowed properties are ${allowed.join(', ')}`);
}
// not properties
if ((0, is_1.default)('array', model.notProperties)) {
const notAllowed = model.notProperties;
const keys = Object.keys(value);
const response = keys.every(item => !notAllowed.includes(item));
if (!response)
(0, exports.onValidateError)(options, model, ((_s = model.messages) === null || _s === void 0 ? void 0 : _s.notProperties) || `${name} includes not allowed property. Not allowed properties are ${notAllowed.join(', ')}`);
}
// min
// max
// length
if (![undefined, null].includes(value) &&
((0, is_1.default)('number', model.min) ||
(0, is_1.default)('number', model.max) ||
(0, is_1.default)('number', model.length))) {
let length = value;
// object
if ((0, is_1.default)('object', value))
length = Object.keys(value).length;
// number
else if ((0, is_1.default)('number', value))
length = value;
// string, array, map, etc.
else {
length = (value === null || value === void 0 ? void 0 : value.length) !== undefined ? value === null || value === void 0 ? void 0 : value.length : value === null || value === void 0 ? void 0 : value.size;
}
if ((0, is_1.default)('number', model.min)) {
const response = length >= model.min;
if (!response)
(0, exports.onValidateError)(options, model, ((_t = model.messages) === null || _t === void 0 ? void 0 : _t.min) || `${name} has to be minimum ${model.min}`);
}
if ((0, is_1.default)('number', model.max)) {
const response = length <= model.max;
if (!response)
(0, exports.onValidateError)(options, model, ((_u = model.messages) === null || _u === void 0 ? void 0 : _u.max) || `${name} can be maximum ${model.max}`);
}
if ((0, is_1.default)('number', model.length)) {
const response = length === model.length;
if (!response)
(0, exports.onValidateError)(options, model, ((_v = model.messages) === null || _v === void 0 ? void 0 : _v.length) || `${name} has to be exactly ${model.length} in length/size`);
}
}
// method
const methods = ((0, is_1.default)('array', model.method) ? model.method : [model.method]).filter(Boolean);
for (const method_ of methods) {
try {
// either throw error or Promise.reject or return false
const response = await method_(value, {
form,
object: model,
property,
options
});
if (response !== undefined) {
if (!response)
throw new errors_1.ValidationError(`${name} is invalid`);
}
}
catch (error) {
const messageValue = (error === null || error === void 0 ? void 0 : error.message) !== undefined ? error.message : error;
(0, exports.onValidateError)(options, model, ((_w = model.messages) === null || _w === void 0 ? void 0 : _w.method) || messageValue);
}
}
};
exports.default = validate;
;