const types = require('./types/index.js') const BaseType = require('./types/base.js') // eslint-disable-line const validator = {} module.exports = validator validator.Base = types.Base validator.string = () => new types.StringType() validator.number = () => new types.NumberType() validator.boolean = () => new types.BooleanType() validator.array = () => new types.ArrayType() validator.object = () => new types.ObjectType() /** * @exports * @typedef SchemaField * @property {BaseType} type * @property {SchemaField} children */ /** * @exports * @typedef {Object} Schema */ /** * validate * @param {Object} src * @param {Schema} schema */ validator.validate = function (src, schema) { if (typeof src !== 'object' || typeof schema !== 'object') throw new Error('source or schema not object') for (const it in schema) { if (schema[it] instanceof BaseType) { const result = schema[it].validate(src[it]) if (result) throw new Error(`field [${it}]: ${result}`) } else if (typeof schema[it] === 'object' && 'type' in schema[it] && schema[it].type instanceof BaseType) { const result = schema[it].type.validate(src[it]) if (result) throw new Error(`field [${it}]: ${result}`) } else { throw new Error('not get any check schema type') } if (typeof schema[it] === 'object' && 'children' in schema[it]) { validator.validate(src[it], schema[it].children) } } }