All files / validator/yupSource/util reach.js

68% Statements 17/25
48% Branches 12/25
75% Functions 3/4
73.91% Lines 17/23

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    3x           112x   112x 112x   112x   112x                                   112x 112x 2x         110x 110x 110x     110x 110x     110x     3x 57x      
import { forEach } from 'property-expr'
 
let trim = part => part.substr(0, part.length - 1).substr(1)
 
export function getIn(schema, path, value, context = value) {
  let parent, lastPart, lastPartDebug
 
  // root path: ''
  Iif (!path) return { parent, parentPath: path, schema }
 
  forEach(path, (_part, isBracket, isArray) => {
    let part = isBracket ? trim(_part) : _part
 
    schema = schema.resolve({ context, parent, value })
 
    Iif (schema.innerType) {
      let idx = isArray ? parseInt(part, 10) : 0
 
      if (value && idx >= value.length) {
        throw new Error(
          `Yup.reach cannot resolve an array item at index: ${_part}, in the path: ${path}. ` +
            `because there is no value at that index. `,
        )
      }
      parent = value
      value = value && value[idx]
      schema = schema.innerType
    }
 
    // sometimes the array index part of a path doesn't exist: "nested.arr.child"
    // in these cases the current part is the next schema and should be processed
    // in this iteration. For cases where the index signature is included this
    // check will fail and we'll handle the `child` part on the next iteration like normal
    if (!isArray) {
      if (!schema.fields || !schema.fields[part])
        throw new Error(
          `The schema does not contain the path: ${path}. ` +
            `(failed at: ${lastPartDebug} which is a type: "${schema._type}")`,
        )
 
      parent = value
      value = value && value[part]
      schema = schema.fields[part]
    }
 
    lastPart = part
    lastPartDebug = isBracket ? '[' + _part + ']' : '.' + _part
  })
 
  return { schema, parent, parentPath: lastPart }
}
 
const reach = (obj, path, value, context) =>
  getIn(obj, path, value, context).schema
 
export default reach