tame-validator
Version:
Validator module for tame schema
76 lines (69 loc) • 2.07 kB
JavaScript
let mandatory = ['name'];
let optional = ['Reference', 'widget', 'type', 'fields', 'schema', 'dependsOn', 'value'];
let values = {
dependsOn: /string/,
fields: /object/,
name: /string/,
Reference: /string/,
schema: /object/,
type: /string/,
value: /string|number/,
};
let corelation = {
fields: (schema, value) => {
if(schema.hasOwnProperty('schema'))
return 'keys "fields" and "schema" cannot exist at same level'
for (let i = 0; i < schema.fields.length; i++) {
let temp = validate(schema.fields[i])
if(temp)
return temp
}
return false
},
schema: (schema, value) => {
if(schema.hasOwnProperty('fields'))
return 'keys "fields" and "schema" cannot exist at same level'
return validate(schema.schema)
},
type: (schema, value) => {
switch (value) {
case 'Reference':
if(!schema.hasOwnProperty('Reference'))
return 'type Reference requires a key "Reference"'
break;
case undefined:
if(!schema.hasOwnProperty('fields'))
return 'type Reference requires a key "Reference"'
break;
}
return false
},
};
function validateKeys(schema) {
let message = false
mandatory.forEach((key) => {
if (!schema.hasOwnProperty(key))
message = `manditory Key "${key}" is not defined`
})
// all maditory have been defined
Object.keys(schema).forEach((key) => {
if(!(optional.indexOf(key) > -1 || mandatory.indexOf(key) > -1))
message = `Key name: "${key}" is not recognized`
if (values[key] && !values[key].test(typeof(schema[key])))
message = `expected value for key "${key}" is "${values[key]}" but given ${typeof(schema[key])}`
if(corelation[key])
message = corelation[key](schema, schema[key])
})
// all keys are valid and corelation satisfied
return message
}
function validate(schema) {
if(typeof(schema) === 'object')
return validateKeys(schema)
else
return `expected schema object found ${typeof(schema)}`
}
module.exports = {
validate
};