Aller au contenu principal
Version: 2.0.0

Premiers pas

ivo pour TypeScript vous permet de définir un schéma avec un constructeur de champs fluent, puis d'en dériver un modèle avec les méthodes create, update et delete.

Installation​

npm i ivo

Définir un schéma​

Un schéma est créé avec new Schema((b) => ...) où b est un FieldBuilder. Les champs sont déclarés avec b.required(...), b.lax(...), b.constant(...), b.dependent(...) ou b.virtual(...), puis passés à b.field(...).

Loading playground…

Méthodes du modèle​

Le modèle renvoyé par schema.getModel() expose des méthodes asynchrones :

MéthodeDescription
createCrée une nouvelle instance à partir d'une entrée partielle.
updateApplique une mise à jour partielle à une instance existante.
deleteDéclenche tous les écouteurs onDelete sur l'entité fournie.

Créer une entité​

Les propriétés inconnues et les propriétés réservées à la sortie (constant, dependent, timestamps) sont ignorées automatiquement.

const { data, error } = await UserModel.create({
email: "john.doe@mail.com",
id: 5, // ignoré car 'id' est constant
name: "John Doe", // ignoré car il n'est pas dans le schéma
username: "john_doe",
updatedAt: new Date(), // ignoré car c'est un timestamp
usernameLastUpdatedAt: new Date(), // ignoré car c'est un champ dépendant
});

if (error) return handleError(error);

console.log(data);
// {
// id: '...',
// createdAt: Date,
// email: 'john.doe@mail.com',
// phoneNumber: null,
// updatedAt: null,
// username: 'john_doe',
// usernameLastUpdatedAt: null
// }

Mettre à jour une entité​

const user = await usersDb.findByID(id);
if (!user) return handleError({ message: "Utilisateur non trouvé" });

const { data, error } = await UserModel.update(user, {
usernameLastUpdatedAt: new Date(), // dépendant -> ignoré
id: 75, // constant -> ignoré
age: 34, // non présent dans le schéma -> ignoré
username: "johndoe",
});

if (error) return handleError(error);

console.log(data);
// {
// updatedAt: Date,
// username: 'johndoe',
// usernameLastUpdatedAt: Date
// }

Catégories de champs​

Autres sujets​

Options du schéma​

Le deuxième argument de new Schema accepte des options :

new Schema((b) => ..., {
equalityDepth: 1,
sanitizeError: (payload, ctxOptions) => payload,
onDelete: [listener],
onSuccess: [listener],
postValidate: { fields: ['email', 'phoneNumber'], validator: ... },
ignore: { fields: ['secret'], handler: () => true },
ignoreUpdate: { fields: ['email'], handler: () => true },
required: { fields: ['email', 'phoneNumber'], handler: ... },
timestamps: true,
});
OptionDescription
equalityDepthProfondeur d'imbrication utilisée pour comparer les valeurs lors des mises à jour (défaut : 1).
sanitizeErrorTransforme le payload d'erreur avant qu'il ne soit renvoyé.
onDeleteÉcouteur(s) global(aux) invoqué(s) par model.delete.
onSuccessÉcouteur(s) global(aux) invoqué(s) après une création/mise à jour réussie.
postValidateConfiguration de validation transversale (fields + validator).
ignoreIgnore les champs d'entrée lorsque le gestionnaire renvoie true.
ignoreUpdateIgnore les valeurs de mise à jour des champs listés lorsque le gestionnaire renvoie true.
requiredContrainte requise transversale (fields + handler).
timestampsActive createdAt/updatedAt (booléen ou { createdAt?, updatedAt? }).

Voir Cycles de vie et Validateurs pour en savoir plus.

Étendre un schéma​

Utilisez .extend() pour créer un nouveau schéma qui hérite des champs et options du parent :

const AdminSchema = userSchema.extend<AdminInput, AdminOutput>(
(b) => b.field(b.required("role").validate(validateRole)),
{ useParentOptions: true },
);

Définissez useParentOptions: false pour abandonner les options du parent et ne partir que des options fournies. Les champs peuvent être supprimés avec l'option remove.