import { z } from "zod"; function securePassword(password: string, ctx: z.RefinementCtx): void { const lowercase = password.toLowerCase(); const uppercase = password.toUpperCase(); if(lowercase === password) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Votre mot de passe doit contenir au moins une majuscule", }); } if(uppercase === password) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Votre mot de passe doit contenir au moins une minuscule", }); } if(!/[0-9]/.test(password)) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Votre mot de passe doit contenir au moins un chiffre", }); } if(!" !\"#$%&'()*+,-./:;<=>?@[]^_`{|}~".split("").some(e => password.includes(e))) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Votre mot de passe doit contenir au moins un symbole", }); } } export const schema = z.object({ username: z.string({ required_error: "Nom d'utilisateur obligatoire" }).min(3, "Votre nom d'utilisateur doit contenir au moins 3 caractères").max(32, "Votre nom d'utilisateur doit contenir au plus 32 caractères").superRefine((user, ctx) => { const test = z.string().email().safeParse(user); if(test.success) { ctx.addIssue({ code: z.ZodIssueCode.invalid_string, validation: 'email', message: "Votre nom d'utilisateur ne peut pas être une addresse mail", }); } }), email: z.string({ required_error: "Email obligatoire" }).email("Adresse mail invalide"), password: z.string({ required_error: "Mot de passe obligatoire" }).min(8, "Votre mot de passe doit contenir au moins 8 caractères").max(128, "Votre mot de passe doit contenir au moins 8 caractères").superRefine(securePassword), data: z.object({ }).partial().nullish(), }); export type Registration = z.infer;