1
votes

I'm trying to define a Yup validation for an object - if a defined sibling is set to true, the field of type object should be required, otherwise not

Example:

const { object, string, number, date, boolean } = require('yup')

const contactSchema = object({
  isBig: boolean(),
  count: number()
    .when('isBig', {
      is: true, // alternatively: (val) => val == true
      then: number().min(5),
      otherwise: number().min(0),
    }),
 complexOne: object({
    simpleOne: string(),
 })
 .when('isBig', {
     is: true,
     then: object().required(),
     otherwise: object(),
 })
})

The object passed into the validation:

{
    isBig: true,
    count: -1,
}

As you can see, I intentionally don't pass the complexOne since I want Yup to display the error. The validation for the count works correctly - if the value is less than 0 and the isBig is set to true, Yup will correctly display an error message ValidationError: count must be greater than or equal to 5

Unfortunately, it completely ignores the conditional validation set for the complexOne field. Either yup does not support the when for object types or I'm doing something incorrectly.

Thanks for any help

1

1 Answers

1
votes

you must set strict option to true in order to only validate the object, and skip any coercion or transformation:

contactSchema.validate(contact, { strict: true })
.then(obj => {
  console.log(obj)
}, err => {
  console.log(err.message)
})

Demo:

Edit yup-strict-validation