all files / src/validate/ validate.js

100% Statements 32/32
95.83% Branches 23/24
100% Functions 11/11
100% Lines 31/31
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              15× 15× 15× 15×       40× 13× 16× 14× 14× 11× 11×           13×                                           13× 11×        
class Validator {
  static add (name, fn) {
    Validator.prototype[name] = fn
  }
 
  constructor () {}
 
  validate (data, rules) {
    let errors = {}
    rules.forEach((rule) => {
      let value = data[rule.key]
      if (rule.required) {
        let error = this.required(value)
        if (error) {
          ensureObject(errors, rule.key)
          errors[rule.key].required = error
          return
        }
      }
      // 遍历 validators,并逐一调用对应的函数
      let validators = Object.keys(rule).filter(key => key !== 'key' && key !== 'required')
      validators.forEach((validatorKey) => {
        if (this[validatorKey]) {
          let error = this[validatorKey](value, rule[validatorKey])
          if (error) {
            ensureObject(errors, rule.key)
            errors[rule.key][validatorKey] = error
          }
        } else {
          throw `不存在的校验器: ${validatorKey}`
        }
      })
    })
    return errors
  }
 
  required (value) {
    if (value !== 0 && !value) {
      return '必填'
    }
  }
 
  pattern (value, pattern) {
    if (pattern === 'email') {
      pattern = /^.+@.+$/
    }
    if (pattern.test(value) === false) {
      return '格式不正确'
    }
  }
 
  minLength (value, minLength) {
    if (value.length < minLength) {
      return '太短'
    }
  }
 
  maxLength (value, maxLength) {
    Eif (value.length > maxLength) {
      return '太长'
    }
  }
}
 
function ensureObject (obj, key) {
  if (typeof obj[key] !== 'object') {
    obj[key] = {}
  }
}
 
export default Validator