company-cafeteria-shared-demo
Version:
Package partagé pour l'écosystème Cafétéria Entreprise
253 lines • 7.51 kB
JavaScript
;
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