-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
118 lines (102 loc) · 3.25 KB
/
index.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
'use strict';
/**
* Define validators for JSON schema types
*/
var validators = {
'string': validateStringType,
'number': validateNumberType,
'integer': validateNumberType,
'object': validateObject,
'array': validateArray,
'boolean': validateBooleanType
};
function validateDateTimeType(schema, payload, property) {
if(payload[property] && isNaN(Date.parse(payload[property]))) {
return property;
}
}
function validateStringType(schema, payload, property, format) {
if(format === 'date-time') {
return validateDateTimeType(schema, payload, property);
}
if((typeof payload[property] === 'string' &&
!payload[property].length) ||
(typeof payload[property] !== 'string' &&
payload[property])) {
return property;
}
}
function validateNumberType(schema, payload, property) {
if(payload[property] && typeof payload[property] !== 'number') {
return property;
}
}
function validateObjectType(schema, payload, property) {
if(payload[property] && typeof payload[property] !== 'object') {
return property;
}
}
function validateObject(schema, payload, property) {
var propertyError = validateObjectType(schema, payload, property);
var subSchema = schema.properties[property];
if(propertyError) {
return propertyError;
}
else {
return validate(subSchema, payload[property]);
}
}
function validateArrayType(schema, payload, property) {
if(payload[property] && !Array.isArray(payload[property])) {
return property;
}
}
function validateArray(schema, payload, property) {
var propertyError = validateArrayType(schema, payload, property);
if(propertyError) return [propertyError];
else return validateArrayItems(schema, payload, property);
}
function validateArrayItems(schema, payload, property) {
var subSchema = schema.properties[property];
var errors = [];
if(payload[property]) {
payload[property].forEach(function (item) {
var error = validate(subSchema.items, item);
if(error && error.length) errors.push(error);
});
return errors;
}
}
function validateBooleanType(schema, payload, property) {
if(typeof payload[property] !== 'undefined' && payload[property] !== null && typeof payload[property] !== 'boolean') {
return property;
}
}
function validateRequiredProperties(schema, payload) {
var errors = [];
schema.required.forEach(function (property) {
if(typeof payload[property] === 'undefined' || payload[property] === null) errors.push(property);
});
return errors;
}
function validateDataTypes(schema, payload) {
var errors = [];
Object.keys(schema.properties).forEach(function (property) {
var type = schema.properties[property].type,
format = schema.properties[property].format,
error = validators[type](schema, payload, property, format);
if(error && error.length) errors.push(error);
});
return errors;
}
/**
* Validates and returns an array of errors
* @param {object} schema The schema to validate the payload against
* @param {object} payload The payload to validate
* @return {Array} An array of the fields that are not valid
*/
function validate(schema, payload) {
return validateRequiredProperties(schema, payload)
.concat(validateDataTypes(schema, payload));
}
module.exports = validate;