// Validateurs partagés du répertoire (annuaire). Chaque validateur considère // une valeur VIDE comme valide : les champs email/téléphone/site web sont // facultatifs — la validation ne porte que sur le format quand c'est renseigné. /** Email basique (présence d'un @ entouré de caractères, un point dans le domaine). */ const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ /** * Téléphone français : 10 chiffres commençant par 0 (ex. `0549200910`) — format * saisi par l'utilisateur, sans séparateurs — ou notation internationale * `+33XXXXXXXXX` (9 chiffres après l'indicatif). Les espaces, points et tirets * sont tolérés à la frappe (retirés avant contrôle). */ const FR_PHONE_NATIONAL_RE = /^0\d{9}$/ const FR_PHONE_INTL_RE = /^\+33\d{9}$/ const URL_RE = /^https?:\/\/[^\s.]+\.[^\s]+$/ /** Retire les séparateurs usuels d'un numéro (espaces, points, tirets, parenthèses). */ export function stripPhoneSeparators(value: string): string { return value.replace(/[\s.\-()]/g, '') } export function isValidEmail(value: string | null | undefined): boolean { const v = (value ?? '').trim() if (v === '') return true return EMAIL_RE.test(v) } export function isValidFrPhone(value: string | null | undefined): boolean { const v = stripPhoneSeparators((value ?? '').trim()) if (v === '') return true return FR_PHONE_NATIONAL_RE.test(v) || FR_PHONE_INTL_RE.test(v) } export function isValidUrl(value: string | null | undefined): boolean { const v = (value ?? '').trim() if (v === '') return true return URL_RE.test(v) }