UNPKG

company-cafeteria-shared-demo

Version:

Package partagé pour l'écosystème Cafétéria Entreprise

253 lines 7.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.nutritionalInfoSchema = exports.addressSchema = exports.coordinatesSchema = exports.percentageSchema = exports.promoCodeSchema = exports.commentSchema = exports.ratingSchema = exports.dateISOSchema = exports.urlSchema = exports.firestoreIdSchema = exports.quantitySchema = exports.priceSchema = exports.phoneSchema = exports.usernameSchema = exports.passwordSchema = exports.emailSchema = void 0; exports.isValidEmail = isValidEmail; exports.isValidPassword = isValidPassword; exports.isValidName = isValidName; exports.isValidPrice = isValidPrice; exports.isValidQuantity = isValidQuantity; exports.isValidFirestoreId = isValidFirestoreId; exports.isValidRating = isValidRating; exports.sanitizeString = sanitizeString; exports.sanitizeName = sanitizeName; exports.sanitizeEmail = sanitizeEmail; exports.formatPrice = formatPrice; exports.validateAndTruncate = validateAndTruncate; exports.validateWithSchema = validateWithSchema; const zod_1 = require("zod"); /** * Validation d'email */ exports.emailSchema = zod_1.z.string().email('Adresse email invalide'); /** * Validation de mot de passe */ exports.passwordSchema = zod_1.z .string() .min(8, 'Le mot de passe doit contenir au moins 8 caractères') .regex(/[A-Z]/, 'Le mot de passe doit contenir au moins une majuscule') .regex(/[a-z]/, 'Le mot de passe doit contenir au moins une minuscule') .regex(/[0-9]/, 'Le mot de passe doit contenir au moins un chiffre') .regex(/[^A-Za-z0-9]/, 'Le mot de passe doit contenir au moins un caractère spécial'); /** * Validation de nom utilisateur */ exports.usernameSchema = zod_1.z .string() .min(2, 'Le nom doit contenir au moins 2 caractères') .max(50, 'Le nom ne peut pas dépasser 50 caractères') .regex(/^[a-zA-ZÀ-ÿ\s'-]+$/, 'Le nom ne peut contenir que des lettres, espaces, apostrophes et tirets'); /** * Validation de téléphone */ exports.phoneSchema = zod_1.z .string() .regex(/^(?:\+33|0)[1-9](?:[0-9]{8})$/, 'Numéro de téléphone français invalide') .optional(); /** * Validation de prix */ exports.priceSchema = zod_1.z .number() .positive('Le prix doit être positif') .max(1000, 'Le prix ne peut pas dépasser 1000€') .refine((val) => Number(val.toFixed(2)) === val, 'Le prix ne peut avoir que 2 décimales'); /** * Validation de quantité */ exports.quantitySchema = zod_1.z .number() .int('La quantité doit être un nombre entier') .positive('La quantité doit être positive') .max(20, 'La quantité ne peut pas dépasser 20'); /** * Validation d'ID Firestore */ exports.firestoreIdSchema = zod_1.z .string() .min(1, 'ID requis') .max(1500, 'ID trop long') .regex(/^[a-zA-Z0-9_-]+$/, 'ID invalide'); /** * Validation d'URL */ exports.urlSchema = zod_1.z .string() .url('URL invalide') .optional(); /** * Validation de date ISO */ exports.dateISOSchema = zod_1.z .string() .datetime('Date ISO invalide'); /** * Validation de rating (note de 1 à 5) */ exports.ratingSchema = zod_1.z .number() .int('La note doit être un nombre entier') .min(1, 'La note minimale est 1') .max(5, 'La note maximale est 5'); /** * Validation de commentaire */ exports.commentSchema = zod_1.z .string() .min(1, 'Commentaire requis') .max(500, 'Le commentaire ne peut pas dépasser 500 caractères') .optional(); /** * Validation de code promo */ exports.promoCodeSchema = zod_1.z .string() .min(3, 'Le code promo doit contenir au moins 3 caractères') .max(20, 'Le code promo ne peut pas dépasser 20 caractères') .regex(/^[A-Z0-9]+$/, 'Le code promo ne peut contenir que des lettres majuscules et des chiffres'); /** * Validation de pourcentage */ exports.percentageSchema = zod_1.z .number() .min(0, 'Le pourcentage ne peut pas être négatif') .max(100, 'Le pourcentage ne peut pas dépasser 100'); /** * Fonctions utilitaires de validation */ /** * Valide une adresse email */ function isValidEmail(email) { return exports.emailSchema.safeParse(email).success; } /** * Valide un mot de passe */ function isValidPassword(password) { return exports.passwordSchema.safeParse(password).success; } /** * Valide un nom */ function isValidName(name) { return exports.usernameSchema.safeParse(name).success; } /** * Valide un prix */ function isValidPrice(price) { return exports.priceSchema.safeParse(price).success; } /** * Valide une quantité */ function isValidQuantity(quantity) { return exports.quantitySchema.safeParse(quantity).success; } /** * Valide un ID Firestore */ function isValidFirestoreId(id) { return exports.firestoreIdSchema.safeParse(id).success; } /** * Valide une note */ function isValidRating(rating) { return exports.ratingSchema.safeParse(rating).success; } /** * Nettoie et valide une chaîne de caractères */ function sanitizeString(input) { return input.trim().replace(/\s+/g, ' '); } /** * Nettoie un nom d'utilisateur */ function sanitizeName(name) { return sanitizeString(name) .replace(/[^a-zA-ZÀ-ÿ\s'-]/g, '') .toLowerCase() .replace(/\b\w/g, l => l.toUpperCase()); } /** * Nettoie un email */ function sanitizeEmail(email) { return email.trim().toLowerCase(); } /** * Valide et formate un prix */ function formatPrice(price) { const formatted = Math.round(price * 100) / 100; if (!isValidPrice(formatted)) { throw new Error('Prix invalide'); } return formatted; } /** * Valide et limite une chaîne de caractères */ function validateAndTruncate(input, maxLength) { const sanitized = sanitizeString(input); return sanitized.length > maxLength ? sanitized.substring(0, maxLength).trim() + '...' : sanitized; } /** * Valide un objet selon un schéma Zod et retourne les erreurs formatées */ function validateWithSchema(schema, data) { const result = schema.safeParse(data); if (result.success) { return { success: true, data: result.data }; } const errors = {}; result.error.errors.forEach(error => { const path = error.path.join('.'); errors[path] = error.message; }); return { success: false, errors }; } /** * Schémas de validation composés */ /** * Validation de coordonnées GPS */ exports.coordinatesSchema = zod_1.z.object({ latitude: zod_1.z.number().min(-90).max(90), longitude: zod_1.z.number().min(-180).max(180) }); /** * Validation d'adresse */ exports.addressSchema = zod_1.z.object({ street: zod_1.z.string().min(1, 'Rue requise').max(100), city: zod_1.z.string().min(1, 'Ville requise').max(50), postalCode: zod_1.z.string().regex(/^[0-9]{5}$/, 'Code postal français invalide'), country: zod_1.z.string().default('France'), coordinates: exports.coordinatesSchema.optional() }); /** * Validation d'informations nutritionnelles */ exports.nutritionalInfoSchema = zod_1.z.object({ calories: zod_1.z.number().int().min(0).max(5000), protein: zod_1.z.number().min(0).max(200), carbs: zod_1.z.number().min(0).max(500), fat: zod_1.z.number().min(0).max(200), fiber: zod_1.z.number().min(0).max(100).optional(), sugar: zod_1.z.number().min(0).max(200).optional(), sodium: zod_1.z.number().min(0).max(10000).optional() }); //# sourceMappingURL=validation.js.map