-
Notifications
You must be signed in to change notification settings - Fork 4
/
can-validate.js
102 lines (93 loc) · 2.54 KB
/
can-validate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"use strict";
var canReflect = require('can-reflect');
var validate = {};
var helpers = {
'object': function (normalizedErrors) {
var errors = normalizedErrors.length > 0 ? {}: undefined;
canReflect.eachIndex(normalizedErrors, function (error) {
canReflect.eachIndex(error.related, function (related) {
if (!errors[related]) {
errors[related] = [];
}
errors[related].push(error.message);
});
});
return errors;
},
'flat': function (normalizedErrors) {
var errors = normalizedErrors.length > 0 ? []: undefined;
canReflect.eachIndex(normalizedErrors, function (error) {
errors.push(error.message);
});
return errors;
},
'errors': function (normalizedErrors) {
return normalizedErrors.length > 0 ? normalizedErrors: undefined;
},
'errors-object': function (normalizedErrors) {
var errors = normalizedErrors.length > 0 ? {}: undefined;
canReflect.eachIndex(normalizedErrors, function (error) {
canReflect.eachIndex(error.related, function (related) {
if (!errors[related]) {
errors[related] = [];
}
errors[related].push(error);
});
});
return errors;
}
};
var parseErrorItem = function (rawErrors) {
var errors = [];
if (typeof rawErrors === 'string') {
errors.push({message: rawErrors, related: ['*']});
}
if (typeof rawErrors === 'object' && !Array.isArray(rawErrors)) {
// Although related can be a string, internally, it is easier if it is
// always an array
if (rawErrors.related) {
if (!Array.isArray(rawErrors.related)) {
rawErrors.related = [rawErrors.related];
}
} else {
rawErrors.related = '*';
}
errors.push(rawErrors);
}
if (Array.isArray(rawErrors)) {
canReflect.eachIndex(rawErrors, function (error) {
[].push.apply(errors, parseErrorItem(error));
});
}
return errors;
};
// Takes errors and normalizes them
var normalizeErrors = function (rawErrors) {
var normalizedErrors = [];
if (
typeof rawErrors === 'string' ||
(typeof rawErrors === 'object' && !Array.isArray(rawErrors))
) {
// Only one error set, which we can assume was for a single property
rawErrors = [rawErrors];
}
if (rawErrors != null) {
canReflect.eachIndex(rawErrors, function (error) {
[].push.apply(normalizedErrors, parseErrorItem(error));
});
}
return normalizedErrors;
};
validate.formatErrors = function (errors, format) {
var normalized = normalizeErrors(errors);
if (format) {
if (helpers[format]) {
return helpers[format](normalized);
} else {
return normalized;
}
} else {
return normalized;
}
};
module.exports = validate;