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) => ...)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.