J'utilise ajv et que vous souhaitez ajouter un validateur personnalisé pour inspecter un objet donné. Ce validateur personnalisé doit soit renvoyer vrai, soit échouer avec le bon message d'erreur. En se basant sur
- (syntaxe obsolète) Validation des mots-clés personnalisés AJV
- https://ajv.js.org/keywords.html#define-keyword-with-code-generation-function
J'ai commencé par l'exemple de code suivant
const Ajv = require("ajv");
const ajv = new Ajv({ allErrors: true });
ajv.addKeyword({
keyword: "eachPropIsTrue",
type: "object",
schemaType: "boolean",
code(context) {
const { data } = context;
const eachPropIsTrue = Object.values(data).every(value => !!value);
context.fail(!eachPropIsTrue);
},
})
const schema = {
type: "object",
eachPropIsTrue: true,
properties: {
a: { type: "boolean" }
},
required: [ "a" ],
additionalProperties: false
};
const validate = ajv.compile(schema);
console.log(validate({ a: true })); // true
console.log(validate({ a: false })); // true but should be false!
console.log(validate({ })); // false
Malheureusement, je suis confronté à deux problèmes :
- La deuxième validation n'échoue pas, alors que je m'attendais à ce qu'elle échoue
- Où dois-je transmettre des informations sur le message d'erreur construit ?
Lors de l'inspection du data
à l'intérieur de la variable code
je peux voir qu'il ne contient pas l'objet actuel. Quelle est donc la bonne façon de mettre en place un mot-clé personnalisé ?
Je cherche un exemple de fonction du type
validate(theObject): boolean | string => {
const anyPropIsFalse = Object.values(data).some(value => value === false);
if(anyPropIsFalse) {
return 'Any prop is false!';
}
return true;
};
ou peut-être une fonction renvoyant void
mais en utilisant context.fail('Any prop is false!');
Sidenote :
Mon cas d'utilisation réel est un objet avec deux propriétés dont l'une est un objet avec un identifiant et l'autre un tableau contenant des objets avec des identifiants. Je dois m'assurer que tous Les identifiants des deux propriétés sont totalement uniques.