UNPKG

valia

Version:

Validation library for TypeScript and JavaScript.

1,457 lines (1,203 loc) 34.1 kB
<p align="center"> <br/> <img src="https://github.com/user-attachments/assets/ea937a53-9b80-43d7-93ac-81538d9526f8" align="center" alt="VALIA logo" /> <br/> <br/> <img src="https://img.shields.io/npm/v/valia.svg?style=flat" align="center" alt="NPM version" /> <br/> <h3 align="center">Bibliothèque de validation pour TypeScript et JavaScript</h3> </p> <br/> 🔌 S’intègre naturellement à vos projets, qu’ils soient front-end ou back-end, et permet de définir des schémas de manière intuitive tout en favorisant leur réutilisation. 💡 Pensée pour allier simplicité et puissance, elle propose des fonctionnalités avancées comme l’inférence de types, ainsi que des validateurs standards tels que <strong>isEmail</strong>, <strong>isUuid</strong> ou <strong>isIp</strong>. ## Table des matières - [Schema](#schema) - [Instances](#instances) - [Formats](#formats) - [Exemples](#exemples) - [Testers](#testers) - [Object](#object) - [String](#string-1) - [Helpers](#helpers) - [Object](#object-1) - [String](#string-2) ## Installation ``` > npm install valia ``` ```ts import { Schema } from 'valia'; const userSchema = new Schema({ type: "object", shape: { name: { type: "string" }, role: { type: "string", literal: ["WORKER", "CUSTOMER"] } } }); let data = { name: "Alice", role: "WORKER" }; if (userSchema.validate(data)) { console.log(data.name, data.role); } ``` ```ts import type { SchemaInfer } from 'valia'; type User = SchemaInfer<typeof userSchema>; ``` <br/> # Schema ## Instances ### Schema <ul> <li> <strong>criteria</strong> <br/> Propriété représentant la racine des noeuds de critères. </li> <li> <strong>validate(data)</strong> <br/> Methode qui valide les données fournies selon les critères et retourne un booléen. <br/> Cette méthode utilise la <a href="https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates"> prédiction de types ↗</a>. </li> <li> <strong>evaluate(data)</strong> <br/> Methode qui valide les données fournies selon les critères et retourne un objet avec les propriétés suivantes : <ul> <li> <strong>success</strong>: Un boolean qui indique si la validation a réussi. </li> <li> <strong>rejection</strong>: Instance de <strong>SchemaDataRejection</strong> si les données sont rejetées sinon <strong>null</strong>. </li> <li> <strong>admission</strong>: Instance de <strong>SchemaDataAdmission</strong> si les données sont admises sinon <strong>null</strong>. </li> </ul> </li> </ul> ### SchemaException <ul> <li> <strong>message</strong> <br/> Message décrivant le problème rencontré. </li> </ul> ### SchemaNodeException <ul> <li> <strong>code</strong> <br/> Code de l'exception. </li> <li> <strong>message</strong> <br/> Message décrivant le problème rencontré. </li> <li> <strong>node</strong> <br/> Noeud noeud lié à l'exception. </li> <li> <strong>nodePath</strong> Chemin du noeud noeud lié à l'exception. <ul> <li> <strong>explicit</strong>: Tableau représentant le chemin vers le noeud dans l'arbre des critères. </li> <li> <strong>implicit</strong>: Tableau représentant le chemin virtuel vers les données représentées par noeud. </li> </ul> </li> </ul> ### SchemaDataRejection <ul> <li> <strong>rootData</strong> <br/> Racine des données à valider. </li> <li> <strong>rootNode</strong> <br/> Noeud racine utilisé pour la validation. </li> <li> <strong>rootLabel</strong> <br/> Label du noeud racine utilisé pour la validation ou <strong>undefined</strong> si le label n'a pas été défini. </li> <li> <strong>data</strong> <br/> Données rejetées. </li> <li> <strong>code</strong> <br/> Code lié au rejet. </li> <li> <strong>node</strong> <br/> Noeud lié au rejet. </li> <li> <strong>nodePath</strong> <br/> Chemin du noeud noeud lié au rejet. <ul> <li> <strong>explicit</strong>: Tableau représentant le chemin vers le noeud dans l'arbre des critères. </li> <li> <strong>implicit</strong>: Tableau représentant le chemin virtuel vers les données représentées par noeud. </li> </ul> </li> <li> <strong>label</strong> <br/> Label défini sur le noeud lié au rejet ou <strong>undefined</strong> si le label n'a pas été défini. </li> <li> <strong>message</strong> <br/> Message défini sur le noeud lié au rejet ou <strong>undefined</strong> si le message n'a pas été défini. </li> </ul> ### SchemaDataAdmission <ul> <li> <strong>data</strong> <br/> Racine des données valider. </li> <li> <strong>node</strong> <br/> Noeud racine utilisé pour la validation. </li> <li> <strong>label</strong> <br/> Label du noeud racine utilisé pour la validation ou <strong>undefined</strong> si le label n'a pas été défini. </li> </ul> ## Formats [Number](#number) • [String](#string) • [Boolean](#boolean) • [Object](#object) • [Array](#array) • [Function](#function) • [Symbol](#symbol) • [Union](#union) • [Null](#null) • [Undefined](#undefined) Les formats représentent les noeuds de critères qui pourront être utilisés dans les schémas. <br/> *L'ordre des propriétés décrites pour chaque formats respecte l'ordre de validation.* ### Global #### **Propriétés :** <ul> <li> <strong>label?</strong> <br/> Une chaine de caratéres permetant d'idantifié le noeud, celle-ci vous sera retournée dans les instance de <strong>SchemaDataRejection</strong> et <strong>SchemaNodeException</strong>. </li> <br/> <li> <strong>message?</strong> <br/> <ul> <li><strong>string</strong>: Chaîne de caractères qui sera disponible dans l'instance de <strong>SchemaDataRejection</strong>.</li> <li><strong>function</strong>: Fonction qui doit renvoyer une chaîne de caractères qui sera disponible dans l'instance de <strong>SchemaDataRejection</strong>.</li> </ul> </li> </ul> ### Number #### **Propriétés :** <ul> <li> <strong>type: "number"</strong> </li> <br/> <li> <strong>min?</strong> <br/> Nombre minimale. </li> <br/> <li> <strong>max?</strong> <br/> Nombre maximale. </li> <br/> <li> <strong>literal?</strong> <br/> <ul> <li><strong>string</strong>: Restreint la valeur à une seul nombre valide.</li> <li><strong>array</strong>: Restreint la valeur avec un tableau dont les items représentent les nombres valides.</li> <li><strong>object</strong>: Restreint la valeur avec un objet dont les valeurs représentent les nombres valides.</li> </ul> </li> <br/> <li> <strong>custom(value)?</strong> <br/> Fonction de validation custom qui reçoit la valeur en paramètre et doit renvoyer un booléen indiquant si la celle-ci est valide. </li> </ul> #### **Exemples :** **Validé n'importe quel nombre** ```ts const schema = new Schema({ type: "number" }); ✅ schema.validate(0); ✅ schema.validate(10); ✅ schema.validate(-10); ``` **Valide des nombres qui appartiennent à une plage spécifique** ```ts const schema = new Schema({ type: "number", min: 0, max: 10 }); ✅ schema.validate(0); ✅ schema.validate(10); ❌ schema.validate(-1); ❌ schema.validate(-10); ``` **Validé un nombre spécifique** ```ts const schema = new Schema({ type: "number", literal: 141 }); ✅ schema.validate(141); ❌ schema.validate(-1); ❌ schema.validate(-10); ``` **Validé des nombres spécifique avec un tableau** ```ts const schema = new Schema({ type: "number", literal: [141, 282] }); ✅ schema.validate(141); ✅ schema.validate(282); ❌ schema.validate(0); ❌ schema.validate(100); ❌ schema.validate(200); ``` ### String #### **Propriétés :** <ul> <li> <strong>type: "string"</strong> </li> <br/> <li> <strong>min?</strong> <br/> Longueur minimale de la chaîne de caractères. </li> <br/> <li> <strong>max?</strong> <br/> Longueur maximale de la chaîne de caractères. </li> <br/> <li> <strong>regex?</strong> <br/> Une expression régulière fournie sous forme d'objet (<strong>RegExp</strong>). </li> <br/> <li> <strong>literal?</strong> <br/> <ul> <li><strong>string</strong>: Restreint la valeur à une seul chaîne de caractères valides.</li> <li><strong>array</strong>: Restreint la valeur avec un tableau où les items représentent les chaîne de caractères valides.</li> <li><strong>object</strong>: Restreint la valeur avec un objet où les valeurs représentent les chaîne de caractères valides.</li> </ul> </li> <br/> <li> <strong>constraint?</strong> <br/> Un objet dont les clés correspondent à des noms de testeurs de chaîne et dont les valeurs possible sont : <ul> <li><strong>boolean</strong> : active ou désactive le testeur.</li> <li><strong>objet</strong> : le testeur est activé avec les options spécifiés dans l'objet.</li> </ul> La valeur sera considérée comme valide si au moins un testeur renvoie un résultat positif. </li> <br/> <li> <strong>custom(value)?</strong> <br/> Fonction de validation custom qui reçoit la valeur en paramètre et doit renvoyer un booléen indiquant si la celle-ci est valide. </li> </ul> #### **Exemples :** **Validé n'importe quel chaîne de caractères** ```ts const schema = new Schema({ type: "string" }); ✅ schema.validate(""); ✅ schema.validate("abc"); ``` **Validé des chaînes de caractères ayant une longueur spécifique** ```ts const schema = new Schema({ type: "string", min: 3, max: 3 }); ✅ schema.validate("abc"); ❌ schema.validate(""); ❌ schema.validate("a"); ❌ schema.validate("abcd"); ``` **Validé des chaînes de caractères avec une expression régulière** ```ts const schema = new Schema({ type: "string", regex: /^#[a-fA-F0-9]{6}$/ }); ✅ schema.validate("#000000"); ✅ schema.validate("#FFFFFF"); ❌ schema.validate(""); ❌ schema.validate("#000"); ❌ schema.validate("#FFF"); ``` **Validé une chaîne de caractères spécifique** ```ts const schema = new Schema({ type: "string", literal: "ABC" }); ✅ schema.validate("ABC"); ❌ schema.validate(""); ❌ schema.validate("a"); ❌ schema.validate("abc"); ``` **Validé des chaînes de caractères spécifique avec un tableau** ```ts const schema = new Schema({ type: "string", literal: ["ABC", "XYZ"] }); ✅ schema.validate("ABC"); ✅ schema.validate("XYZ"); ❌ schema.validate(""); ❌ schema.validate("a"); ❌ schema.validate("abc"); ``` **Validé des chaînes de caractères avec un testeur de chaîne** ```ts const schema = new Schema({ type: "string", constraint: { idIp: { cidr: true } } }); ✅ schema.validate("127.0.0.1/24"); ❌ schema.validate(""); ❌ schema.validate("127.0.0.1"); ``` **Validé des chaînes de caractères avec plusieurs testeurs de chaîne** ```ts const schema = new Schema({ type: "string", constraint: { isEmail: true, idIp: { cidr: true } } }); ✅ schema.validate("foo@bar"); ✅ schema.validate("127.0.0.1/24"); ❌ schema.validate(""); ❌ schema.validate("foo@"); ❌ schema.validate("127.0.0.1"); ``` ### Boolean #### **Propriétés :** <ul> <li> <strong>type: "boolean"</strong> </li> <br/> <li> <strong>literal?</strong> <br/> Restreint la valeur à un seul état de booléen valide. </li> <br/> <li> <strong>custom(value)?</strong> <br/> Fonction de validation custom qui reçoit la valeur en paramètre et doit renvoyer un booléen indiquant si la celle-ci est valide. </li> </ul> #### **Exemples :** **Validé n'importe quel booléen** ```ts const schema = new Schema({ type: "boolean" }); ✅ schema.validate(true); ✅ schema.validate(false); ❌ schema.validate(""); ❌ schema.validate({}); ``` **Validé un booléen avec un état spécifique** ```ts const schema = new Schema({ type: "boolean", literal: true }); ✅ schema.validate(true); ❌ schema.validate(""); ❌ schema.validate({}); ❌ schema.validate(false); ``` ### Object #### **Propriétés :** <ul> <li> <strong>type: "object"</strong> </li> <br/> <li> <strong>nature?</strong> — (Default: <strong>"STANDARD"</strong>) <ul> <li> <strong>"STANDARD"</strong>: Accepte toute valeur de type <strong>object</strong>, c’est-à-dire tout ce pour quoi <strong>typeof value === "object"</strong>. </li> <li> <strong>"PLAIN"</strong>: Accepte uniquement les objets dont le prototype est soit <strong>Object.prototype</strong> (comme les objets créés via <strong>{}</strong>), soit <strong>null</strong> (créés via <strong>Object.create(null)</strong>). </li> </ul> </li> <br/> <li> <strong>min?</strong> <br/> Nombre de propriétés minimum. </li> <br/> <li> <strong>max?</strong> <br/> Nombre de propriétés maximun. </li> <br/> <li> <strong>shape?</strong> <br/> Un objet dont les clés sont de type <strong>string</strong> ou <strong>symbol</strong> et dont les valeurs sont des noeuds de critères. Représente des propriétés fixes que l'objet doit satisfaire. </li> <br/> <li> <strong>optional?</strong> — (Default: <strong>false</strong> | Utilisable seulement si <strong>shape</strong> est défini) <ul> <li> <strong>boolean</strong> <ul> <li><strong>true</strong>: Toutes les propriétés définies dans l'objet <strong>shape</strong> sont optionnelles.</li> <li><strong>false</strong>: Toutes les propriétés définies dans l'objet <strong>shape</strong> sont obligatoires.</li> </ul> </li> <li> <strong>array</strong> <br/> Un tableau dont les éléments sont des clés de l’objet <strong>shape</strong> qui sont optionnelles. </li> </ul> </li> <br/> <li> <strong>keys?</strong> <br/> Noeud de critères que les clés de l'objet doivent satisfaire.<br/> Les clés définies dans l'objet <strong>shape</strong> ne sont pas affectées. </li> <br/> <li> <strong>values?</strong> <br/> Noeud de critères que les valeurs doivent satisfaire.<br/> Les valeurs définies dans l'objet <strong>shape</strong> ne sont pas affectées. </li> </ul> #### **Exemples :** **Validé n'importe quel objet** ```ts const schema = new Schema({ type: "object" }); ✅ schema.validate({}); ✅ schema.validate([]); ✅ schema.validate(new Date()); ✅ schema.validate(Object.create(null)); ❌ schema.validate(""); ``` **Validé un objet de nature simple** ```ts const schema = new Schema({ type: "object", nature: "PLAIN" }); ✅ schema.validate({}); ✅ schema.validate(Object.create(null)); ❌ schema.validate(""); ❌ schema.validate([]); ❌ schema.validate(new Date()); ``` **Validé un objet avec des propriétés fixes** ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" } } }); ✅ schema.validate({ foo: "x", bar: "x" }); ❌ schema.validate({}); ❌ schema.validate({ foo: "x" }); ❌ schema.validate({ bar: "x" }); ❌ schema.validate({ foo: "x", bar: "x", a: "" }); ``` **Validé un objet et un sous-objet de propriétés fixes** <br/> ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" }, baz: { foo: { type: "number" }, bar: { type: "number" } } } }); ✅ schema.validate({ foo: "x", bar: "x", baz: { foo: 0, bar: 0 } }); ❌ schema.validate({}); ❌ schema.validate({ foo: "x" }); ❌ schema.validate({ foo: "x", bar: "x" }); ❌ schema.validate({ foo: "x", bar: "x", baz: {} }); ❌ schema.validate({ foo: "x", bar: "x", baz: { foo: 0 } }); ``` **Validé un objet avec des propriétés facultatives** ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" } }, optional: true }); ✅ schema.validate({}); ✅ schema.validate({ foo: "x" }); ✅ schema.validate({ bar: "x" }); ✅ schema.validate({ foo: "x", bar: "x" }); ❌ schema.validate({ foo: "x", bar: "x", a: "x" }); ``` **Validé un objet avec une propriété fixe et une propriété facultative** ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" } }, optional: ["bar"] }); ✅ schema.validate({ foo: "x" }); ✅ schema.validate({ foo: "x", bar: "x" }); ❌ schema.validate({}); ❌ schema.validate({ bar: "x" }); ❌ schema.validate({ foo: "x", bar: "x", a: "x" }); ``` **Validé un objet avec des propriétés fixes et des propriétés dynamiques libres** ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" } }, values: { type: "unknown" } }); ✅ schema.validate({ foo: "x", bar: "x" }); ✅ schema.validate({ foo: "x", bar: "x", a: "x", b: 0 }); ❌ schema.validate({}); ❌ schema.validate({ bar: "x" }); ❌ schema.validate({ foo: "x" }); ``` **Validé un objet avec des propriétés fixes et des propriétés dynamiques contraintes** ```ts const schema = new Schema({ type: "object", shape: { foo: { type: "string" }, bar: { type: "string" } }, keys: { type: "string" }, values: { type: "number" } }); ✅ schema.validate({ foo: "x", bar: "x" }); ✅ schema.validate({ foo: "x", bar: "x", a: 0 }); ✅ schema.validate({ foo: "x", bar: "x", a: 0, b: 0 }); ❌ schema.validate({}); ❌ schema.validate({ foo: "x" }); ❌ schema.validate({ bar: "x" }); ❌ schema.validate({ foo: "x", bar: "x", a: "x", b: 0 }); ``` **Validé un objet avec des propriétés dynamiques contraintes** ```ts const schema = new Schema({ type: "object", keys: { type: "string" }, values: { type: "string" } }); ✅ schema.validate({}); ✅ schema.validate({ a: "x" }); ✅ schema.validate({ a: "x", b: "x" }); ❌ schema.validate({ a: 0 }); ❌ schema.validate({ a: "x", b: 0 }); ``` ### Array #### **Propriétés :** <ul> <li> <strong>type: "array"</strong> </li> <br/> <li> <strong>min?</strong> <br/> Nombre d'éléments minimum. </li> <br/> <li> <strong>max?</strong> <br/> Nombre d'éléments maximum. </li> <br/> <li> <strong>tuple?</strong> <br/> Un tableau dont les éléments sont des noeuds de critères. Représente les éléments fixes que le tableau doit satisfaire. </li> <br/> <li> <strong>items?</strong> <br/> Noeud de critères que les éléments du tableau doivent satisfaire.<br/> Les éléments définies dans le tableau <strong>tuple</strong> ne sont pas affectées. </li> </ul> #### **Exemples :** **Validé n'importe quel tableau** ```ts const schema = new Schema({ type: "array" }); ✅ schema.validate([]); ✅ schema.validate(["x"]); ❌ schema.validate({}); ❌ schema.validate("x"); ``` **Validé un tableau d'éléments fixes** ```ts const schema = new Schema({ type: "array", tuple: [ { type: "string" }, { type: "string" } ] }); ✅ schema.validate(["x", "x"]); ❌ schema.validate([]); ❌ schema.validate(["x"]); ❌ schema.validate(["x", "x", "x"]); ``` **Validé un tableau et un sous-tableau d'éléments fixes** <br/> ```ts const schema = new Schema({ type: "array", tuple: [ { type: "string" }, { type: "string" }, [ { type: "number" }, { type: "number" } ] ] }); ✅ schema.validate(["x", "x", [0, 0]]); ❌ schema.validate([]); ❌ schema.validate(["x"]); ❌ schema.validate(["x", "x", []]); ❌ schema.validate(["x", "x", [0]]); ``` **Validé un tableau d'éléments fixes et des éléments dynamiques libres** ```ts const schema = new Schema({ type: "array", tuple: [ { type: "string" }, { type: "string" } ], items: { type: "unknown" } }); ✅ schema.validate(["x", "x"]); ✅ schema.validate(["x", "x", 0]); ✅ schema.validate(["x", "x", ""]); ✅ schema.validate(["x", "x", {}]); ❌ schema.validate([]); ❌ schema.validate(["x"]); ❌ schema.validate([0, "x"]); ``` **Validé un tableau d'éléments fixes et des éléments dynamiques contraints** ```ts const schema = new Schema({ type: "array", tuple: [ { type: "string" }, { type: "string" } ], items: { type: "number" } }); ✅ schema.validate(["x"]); ✅ schema.validate(["x", "x"]); ✅ schema.validate(["x", "x", 0]); ✅ schema.validate(["x", "x", 0, 0]); ❌ schema.validate([]); ❌ schema.validate(["x"]); ❌ schema.validate(["x", "x", "x"]); ❌ schema.validate(["x", "x", "x", "x"]); ``` **Validé un tableau avec éléments dynamiques contraints** ```ts const schema = new Schema({ type: "array", items: { type: "string" } }); ✅ schema.validate([]); ✅ schema.validate(["x"]); ✅ schema.validate(["x", "x"]); ❌ schema.validate([0]); ❌ schema.validate(["x", 0]); ❌ schema.validate(["x", "x", 0]); ``` ### Symbol #### **Propriétés :** <ul> <li> <strong>type: "symbol"</strong> </li> <br/> <li> <strong>literal?</strong> <br/> <ul> <li><strong>symbol</strong>: Restreint la valeur à un seul symbole valide.</li> <li><strong>array</strong>: Restreint la valeur avec un tableau où les items représentent les symboles valides.</li> <li><strong>object</strong>: Restreint la valeur avec un objet où les valeurs représentent les symboles valides.</li> </ul> </li> <br/> <li> <strong>custom(value)?</strong> <br/> Fonction de validation custom qui reçoit la valeur en paramètre et doit renvoyer un booléen indiquant si la celle-ci est valide. </li> </ul> #### **Exemples :** **Validé n'importe quel symbole** ```ts const xSymbol = Symbol("x"); const ySymbol = Symbol("y"); const schema = new Schema({ type: "symbol" }); ✅ schema.validate(xSymbol); ✅ schema.validate(ySymbol); ``` **Validé un symbole spécifique** ```ts const xSymbol = Symbol("x"); const ySymbol = Symbol("y"); const schema = new Schema({ type: "symbol", literal: xSymbol }); ✅ schema.validate(xSymbol); ❌ schema.validate(ySymbol); ``` **Validé des symboles spécifiques avec un tableau** ```ts const xSymbol = Symbol("x"); const ySymbol = Symbol("y"); const zSymbol = Symbol("z"); const schema = new Schema({ type: "symbol", literal: [xSymbol, ySymbol] }); ✅ schema.validate(xSymbol); ✅ schema.validate(ySymbol); ❌ schema.validate(zSymbol); ``` **Validé des symboles spécifiques avec un enum** ```ts enum mySymbol { X = Symbol("x"), Y = Symbol("y") }; enum otherSymbol { Z = Symbol("z") }; const schema = new Schema({ type: "symbol", literal: mySymbol }); ✅ schema.validate(mySymbol.X); ✅ schema.validate(mySymbol.Y); ❌ schema.validate(otherSymbol.Z); ``` ### Union #### **Propriétés :** <ul> <li> <strong>union</strong> <br/> Un tableau de noeuds de critères, où chaque noeud définit une valeur acceptable.<br/> Une valeur est considérée comme valide si elle correspond à au moins un des noeuds de critères fournis. </li> </ul> #### **Exemples :** ```ts const schema = new Schema({ type: "union", union: [ { type: "string" }, { type: "number" } ] }); ✅ schema.validate(0); ✅ schema.validate(""); ❌ schema.validate({}); ``` ### Null #### **Propriétés :** <ul> <li> <strong>type: "null"</strong> </li> </ul> #### **Exemples :** ```ts const schema = new Schema({ type: "null" }); ✅ schema.validate(null); ❌ schema.validate(0); ❌ schema.validate(""); ❌ schema.validate({}); ``` ### Undefined #### **Propriétés :** <ul> <li> <strong>type: "undefined"</strong> </li> </ul> #### **Exemples :** ```ts const schema = new Schema({ type: "undefined" }); ✅ schema.validate(undefined); ❌ schema.validate(0); ❌ schema.validate(""); ❌ schema.validate({}); ``` ## Exemples ### Schéma simple ```ts const user = new Schema({ type: "object", shape: { name: { type: "string", min: 3, max: 32 }, role: { type: "string", literal: ["WORKER", "CUSTOMER"] } } }); ✅ user.validate({ name: "Alice", role: "WORKER" }); ❌ user.validate({ name: "Alice", role: "MANAGER" }); ``` ### Schéma composite ```ts const name = new Schema({ type: "string", min: 3, max: 32 }); const role = new Schema({ type: "string", literal: ["WORKER", "CUSTOMER"] }); const user = new Schema({ type: "object", shape: { name: name.criteria, role: role.criteria } }); ✅ user.validate({ name: "Bob", role: "CUSTOMER" }); ❌ user.validate({ name: "Bob", role: "MANAGER" }); ``` ### Schéma composite profond ```ts const name = new Schema({ type: "string", min: 3, max: 32 }); const setting = new Schema({ type: "object", shape: { theme: { type: "string", literal: ["DARK", "LIGHT"] }, notification: { type: "boolean" } } }); const user = new Schema({ type: "object", object: { name: name.criteria, theme: setting.criteria.shape.theme } }); ✅ user.validate({ name: "Alice", theme: "DARK" }); ❌ user.validate({ name: "Alice", theme: "DEFAULT" }); ``` <br/><br/> # Testers ## Object #### `isObject(value): boolean` Vérifie si la valeur fournie est de type **object**. #### `isPlainObject(value): boolean` Vérifie si la valeur fournie est de type **object** et dont le prototype est soit **Object.prototype**, soit **null**. <br/>Par exemple les valeurs créées via le littérale **{}** ou via **Object.create(null)** font partie des valeurs acceptées. #### `isArray(value): boolean` Vérifie si la valeur fournie est de type **array**. #### `isTypedArray(value): boolean` Vérifie si la valeur fournie est de type **array** et si elle est une vue sur un **ArrayBuffer**, à l’exception des **DataView**. #### `isFunction(value): boolean` Vérifie si la valeur fournie est de type **function**. #### `isBasicFunction(value): boolean` Vérifie si la valeur fournie est de type **function** et qu'elle n'est pas de nature **async**, **generator** ou **async generator**. #### `isAsyncFunction(value): boolean` Vérifie si la valeur fournie est de type **function** et qu'elle n'est pas de nature **basic**, **generator** ou **async generator**. #### `isGeneratorFunction(value): boolean` Vérifie si la valeur fournie est de type **function** et qu'elle n'est pas de nature **basic**, **async** ou **async generator**. #### `isAsyncGeneratorFunction(value): boolean` Vérifie si la valeur fournie est de type **function** et qu'elle n'est pas de nature **basic**, **async** ou **generator**. <br/> ## String #### `isAscii(str): boolean` Vérifie si la chaîne fournie n'est composée que de caractères ASCII.  #### `isIpV4(str [, options]): boolean` Vérifie si la chaîne fournie correspond à une IPV4. #### `isIpV6(str [, options]): boolean` Vérifie si la chaîne fournie correspond à une IPV6. #### `isIp(str [, options]): boolean` Vérifie si la chaîne fournie correspond à une IPV4 ou une IPV6. **Options:** <ul> <li> <strong>cidr?</strong> — (Default: <strong>false</strong>) <br/> Si <strong>true</strong>, rend obligatoire la présence d'un suffixe CIDR, sinon si <strong>false</strong> un suffixe n'est pas accepté. </li> </ul> #### `isEmail(str [, options]): boolean` Vérifie si la chaîne fournie correspond à une adresse email. **Options:** <ul> <li> <strong>allowLocalQuotes?: boolean</strong> — (Default: <strong>false</strong>) <br/> Spécifie si la première partie (partie locale) de l'adresse email peut être formée à l'aide de guillemets. Par exemple, <strong>"Jean Dupont"@exemple.com</strong> sera considéré comme valide. </li> <li> <strong>allowIpAddress?: boolean</strong> — (Default: <strong>false</strong>) <br/> Spécifie si la deuxième partie (partie domain) de l'adresse email peut être une adresse IP. Par exemple, <strong>foo@8.8.8.8</strong> sera considéré comme valide. </li> <li> <strong>allowGeneralAddress?: boolean</strong> — (Default: <strong>false</strong>) <br/> Spécifie si la deuxième partie (partie domain) de l'adresse email peut être une adresse general. Par exemple, <strong>foo@8.8.8.8</strong> sera considéré comme valide. </li> </ul> **Standards:** RFC 5321 #### `isDomain(str): boolean` Vérifie si la chaîne fournie correspond un nom de domain. **Standards:** RFC 1035 #### `isDataURL(str [, options]): boolean` Vérifie si la chaîne fournie correspond à une **DataURL**. **Options:** <ul> <li> <strong>type?: string[]</strong> <br/> Spécifie un ou plusieurs types MIME autorisés. <br/> <a href="http://www.iana.org/assignments/media-types/">Liste des types MIME enregistrés par l'IANA ↗</a> </li> <li> <strong>subtype?: string[]</strong> <br/> Spécifie un ou plusieurs sous-types MIME autorisés. <br/> <a href="http://www.iana.org/assignments/media-types/">Liste des types MIME enregistrés par l'IANA ↗</a> </li> </ul> **Standards:** RFC 2397 #### `isUuid(str [, options]): boolean` Vérifie si la chaîne fournie correspond à un **UUID** valide. **Options:** <ul> <li> <strong>version?: number</strong> <br/> Spécifie le numéro de version autorisé, compris entre 1 et 7. </li> </ul> **Standards:** RFC 9562 #### `isBase16(str): boolean` Vérifie si la chaîne fournie correspond à un encodage **base16** valide. **Standards:** RFC 4648 #### `isBase32(str): boolean` Vérifie si la chaîne fournie correspond à un encodage **base32** valide. **Standards:** RFC 4648 #### `isBase32Hex(str): boolean` Vérifie si la chaîne fournie correspond à un encodage **base32Hex** valide. **Standards:** RFC 4648 #### `isBase64(str): boolean` Vérifie si la chaîne fournie correspond à un encodage **base64** valide. **Standards:** RFC 4648 #### `isBase64Url(str): boolean` Vérifie si la chaîne fournie correspond à un encodage **base64Url** valide. **Standards:** RFC 4648 <br/><br/> # Helpers ## Object #### `getInternalTag(target): string` Retourne le tag interne de la cible. Par exemple pour une cible **async () => {}** le tag retourné est **"AsyncFunction"**. <br/> ## String #### `base16ToBase32(str [, to, padding]): string` Convertie une chaîne en **base16** en une chaîne en **base32** ou **base32Hex**. **Arguments:** <ul> <li> <strong>to?: "B32" | "B32HEX"</strong> — (Default: <strong>"B32"</strong>) <br/> Spécifie dans quel encodage la chaîne doit être convertie. </li> <br/> <li> <strong>padding?: boolean</strong> — (Default: <strong>true</strong>) <br/> Spécifie si la chaîne doit être complétée par un remplissage si nécessaire. </li> </ul> **Standards:** RFC 4648 #### `base16ToBase64(str [, to, padding]): string` Convertie une chaîne en **base16** en une chaîne en **base64** ou **base64Url**. **Arguments:** <ul> <li> <strong>to?: "B64" | "B64URL"</strong> — (Default: <strong>"B64"</strong>) <br/> Spécifie dans quel encodage la chaîne doit être convertie. </li> <br/> <li> <strong>padding?: boolean</strong> — (Default: <strong>true</strong>) <br/> Spécifie si la chaîne doit être complétée par un remplissage si nécessaire. </li> </ul> **Standards:** RFC 4648 #### `base32ToBase16(str [, from]): string` Convertie une chaîne en **base32** ou **base32Hex** en une chaîne en **base16**. **Arguments:** <ul> <li> <strong>from?: "B32" | "B32HEX"</strong> — (Default: <strong>"B32"</strong>) <br/> Spécifie dans quel encodage la chaîne doit être fournie. </li> </ul> **Standards:** RFC 4648 #### `base64ToBase16(str [, from]): string` Convertie une chaîne en **base64** ou **base64Url** en une chaîne en **base16**. **Arguments:** <ul> <li> <strong>from?: "B64" | "B64URL"</strong> — (Default: <strong>"B64"</strong>) <br/> Spécifie dans quel encodage la chaîne doit être fournie. </li> </ul>