Home > OS >  Conditional array items with Joi
Conditional array items with Joi

Time:03-29

I have an issue to create Joi schema for this input

{
  projects: ["*","ABC123","ABC456"]
}

With the input above, it should throw an error.

I did try to use Joi.alternatives() like this

const schema = Joi.object({
  projects: 
    Joi.array()
    .items(
      Joi.alternatives(
        Joi.string().equal('*'), 
        Joi.string().regex(new RegExp(/^ABC_([0-9]{3,3})$/))
      )
    )
})

but it appears to allow both ["*"] and ["ABC123","DEF456"] together. I wanted it to be either ["*"] or ["ABC123","DEF456"], else it will be an error.

How can I actually achieve it by using Joi?

CodePudding user response:

You can try something like this:

const schema = Joi.object({
  projects: Joi.alternatives(
    Joi.array().length(1).items(
      Joi.string().equal('*')
    ),
    Joi.array().items(
      Joi.string().regex(/^ABC[0-9]{3}$/)
    )
  )
});

That is, havingh two alternative array schemas instead of having a single array schema with alternative schemas of elements.

The .length(1) is there to reject values like ["*", "*"] if you want to reject arrays like that, but could be omitted otherwise.

Also, the regex could be written in a simpler way so I simplified it, but I guess that it was just an example so that is not so important. What is important though is that i removed the underscore ("_") from the regex, because a regex in your example didn't match values like "ABC123" in your example but e.g. "ABC_123".

  • Related