feat: amélioration majeure de la qualité du code et des tests - ajout de 20 nouveaux tests et fonctions utilitaires

This commit is contained in:
Yannick Le Duc
2025-08-28 20:53:53 +02:00
parent cea3b81994
commit 74189ac037
4 changed files with 243 additions and 1 deletions

View File

@@ -43,3 +43,63 @@ export function parseFooterMessage(message: string, repositoryUrl: string): { te
return { text: processedText, links };
}
/**
* Génère un slug à partir d'un titre
*/
export function generateSlug(title: string): string {
return title
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '') // Supprime les accents
.replace(/[^a-z0-9\s-]/g, '') // Garde seulement lettres, chiffres, espaces et tirets
.replace(/\s+/g, '-') // Remplace les espaces par des tirets
.replace(/-+/g, '-') // Remplace les tirets multiples par un seul
.trim();
}
/**
* Génère un ID court aléatoire
*/
export function generateShortId(): string {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
let result = '';
for (let i = 0; i < 8; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
/**
* Formate un montant en euros
*/
export function formatCurrency(amount: number): string {
return new Intl.NumberFormat('fr-FR', {
style: 'currency',
currency: 'EUR',
}).format(amount);
}
/**
* Formate une date
*/
export function formatDate(date: Date | string): string {
const dateObj = typeof date === 'string' ? new Date(date) : date;
return dateObj.toLocaleDateString('fr-FR');
}
/**
* Valide une adresse email
*/
export function validateEmail(email: string): boolean {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
}
/**
* Nettoie le HTML pour éviter les attaques XSS
*/
export function sanitizeHtml(html: string): string {
// Supprime les balises dangereuses
return html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
}