All files / validator/yupSource Condition.js

0% Statements 0/29
0% Branches 0/22
0% Functions 0/6
0% Lines 0/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                                                                                                         
import { has } from '../../utils'
import isSchema from './util/isSchema'
 
class Condition {
  constructor(refs, options) {
    this.refs = refs
 
    if (typeof options === 'function') {
      this.fn = options
      return
    }
 
    if (!has(options, 'is'))
      throw new TypeError('`is:` is required for `when()` conditions')
 
    if (!options.then && !options.otherwise)
      throw new TypeError(
        'either `then:` or `otherwise:` is required for `when()` conditions',
      )
 
    let { is, then, otherwise } = options
 
    let check =
      typeof is === 'function'
        ? is
        : (...values) => values.every(value => value === is)
 
    this.fn = function (...args) {
      let options = args.pop()
      let schema = args.pop()
      let branch = check(...args) ? then : otherwise
 
      if (!branch) return undefined
      if (typeof branch === 'function') return branch(schema)
      return schema.concat(branch.resolve(options))
    }
  }
 
  resolve(base, options) {
    let values = this.refs.map(ref =>
      ref.getValue(
        options?.value,
        options?.parent,
        options?.context,
        options?.rootValue,
      ),
    )
 
    let schema = this.fn.apply(base, values.concat(base, options))
 
    if (schema === undefined || schema === base) return base
 
    if (!isSchema(schema))
      throw new TypeError('conditions must return a schema object')
 
    return schema.resolve(options)
  }
}
 
export default Condition