const Yup = require('yup')
const greaterThanOrEqualTo = function (ref, msg) {
return this.test({
name: 'greaterThanOrEqualTo',
message: msg || '${path} must be greater than or equal to ${reference}',
params: { reference: ref.path },
test(value) {
return value >= this.resolve(ref)
}
})
}
Yup.addMethod(Yup.number, 'greaterThanOrEqualTo', greaterThanOrEqualTo);
const selectionAmountValidation = Yup.number()
.min(0)
.max(24)
.required()
.typeError('This must be a number.')
const nameValidation = Yup.string()
.min(1)
.max(255)
.required()
const contactSchema = Yup.object({
name: nameValidation,
selections: Yup.object()
.shape({
minSelection: selectionAmountValidation,
maxSelections: selectionAmountValidation
.greaterThanOrEqualTo(Yup.ref('minSelection'))
}),
modifiers: Yup.array().of(
Yup.object()
.shape({
name: nameValidation,
calories: Yup.number(),
pricing: Yup.object()
.shape({
basePrice: Yup.number()
})
})
)
})
await contactSchema.validate({
name: 'foo',
selections: {
minSelection: 3,
maxSelections: 4
},
modifiers: [
]
})