PolyVal: Çok Dilli ve Özelleştirilebilir Doğrulama Kütüphanesi
Merhaba, ben Metehan Şenyer. Bu proje, geliştiricilere basitleştirilmiş bir API sunarken, arka planda Zod'u kullanan çok dilli ve son derece özelleştirilebilir bir doğrulama kütüphanesi olan PolyVal'dir.
🚀 Proje Hakkında
PolyVal, karmaşık tip tanımlarına veya doğrulama kuralları bilgisine ihtiyaç duymadan kullanım kolaylığı sağlamak amacıyla geliştirilmiştir. Özellikle çok dilli projelerde ve özelleştirilmiş hata mesajlarına ihtiyaç duyulan durumlarda güçlü bir çözüm sunar.
🎯 Projenin Temel Amaçları
- Basitleştirilmiş API: Geliştiricilerin karmaşık tanımlamalarla uğraşmadan doğrulama yapmasını sağlamak.
- Çok Dilli Destek:
en
(İngilizce) vetr
(Türkçe) için varsayılan destek sunmak. - Esnek Hata Mesajları: Hata mesajlarını alana, kural türüne veya genel olarak tamamen özelleştirebilme imkanı.
- Özel Kurallar: Geliştiricilerin kendi doğrulama kurallarını kolayca tanımlayabilmesi.
- TypeScript Desteği: Tamamen tip güvenli bir geliştirme deneyimi sunmak.
🛠️ Kullanılan Araçlar
📦 Kurulum
npm install polyval
🚀 Temel Kullanım
import { validate } from 'polyval';
// Basit şema tanımı
const userSchema = {
username: {
type: 'string',
required: true,
min: 3,
max: 20
},
email: {
type: 'string',
required: true,
email: true
},
age: {
type: 'number',
min: 18
}
};
// Doğrulanacak veri
const userData = {
username: 'jo',
email: 'invalid-email',
age: 16
};
// Doğrulama (Türkçe dilinde)
const errors = validate(userSchema, userData, { lang: 'tr' });
console.log(errors);
// [
// "Username: En az 3 karakter uzunluğunda olmalıdır",
// "Email: Geçersiz e-posta adresi",
// "Age: En az 18 olmalıdır"
// ]
📝 Şema Tanımlama
PolyVal şemaları, basit JavaScript nesneleri kullanılarak tanımlanır. Her alan bir yapılandırma nesnesi kullanır:
const schema = {
fieldName: {
type: 'string' | 'number' | 'boolean' | 'date', // Alan türü (zorunlu)
required: boolean, // Alan zorunlu mu? (varsayılan: false)
// Diğer doğrulama kuralları...
}
};
Desteklenen Doğrulama Kuralları
String Alanları İçin
{
type: 'string',
required: boolean, // Zorunlu mu?
min: number, // Minimum uzunluk
max: number, // Maksimum uzunluk
length: number, // Tam uzunluk
email: boolean, // E-posta formatı
url: boolean, // URL formatı
uuid: boolean, // UUID formatı
cuid: boolean, // CUID formatı
datetime: boolean, // ISO 8601 tarih-saat formatı
ip: 'v4' | 'v6', // IP adresi formatı
regex: string, // Regex deseni (string olarak)
startsWith: string, // Bu değerle başlamalı
endsWith: string, // Bu değerle bitmeli
numeric: boolean // Sadece sayısal karakterler
}
Number Alanları İçin
{
type: 'number',
required: boolean, // Zorunlu mu?
min: number, // Minimum değer
max: number // Maksimum değer
}
Date Alanları İçin
{
type: 'date',
required: boolean, // Zorunlu mu?
min: number, // Minimum tarih (timestamp)
max: number // Maksimum tarih (timestamp)
}
Boolean Alanları İçin
{
type: 'boolean',
required: boolean, // Zorunlu mu?
equals: boolean // Belirli bir değere (true/false) eşit olması beklenir mi?
}
Alan Karşılaştırma Kuralları
Bir alanı başka bir alana göre doğrulamak için:
{
password: {
type: 'string',
required: true,
min: 8
},
confirmPassword: {
type: 'string',
required: true,
equals: 'password' // 'password' alanı ile eşleşmeli
},
oldPassword: {
type: 'string',
required: true,
notEquals: 'password' // 'password' alanı ile eşleşmemeli
}
}
Özel Doğrulama Kuralları
Kendi doğrulama mantığınızı tanımlamak için:
{
username: {
type: 'string',
required: true,
customValidators: [
{
validator: (value, data) => {
// Alfanümerik karakter kontrolü
if (!/^[a-zA-Z0-9]+/.test(value)) {
return 'Sadece harf ve rakam kullanabilirsiniz';
}
// Admin adı kontrolü
if (value.toLowerCase() === 'admin') {
return 'Bu kullanıcı adı kullanılamaz'; // Hata mesajı döndür
}
return undefined; // Başarılı doğrulama için undefined döndür
},
messageKey: 'noAdminUsername' // Özel mesajlar için kullanılacak anahtar
}
]
}
}
🎨 Hata Mesajlarını Özelleştirme
PolyVal, hata mesajlarını tamamen özelleştirmenize olanak tanır:
const errors = validate(schema, data, {
lang: 'tr',
customMessages: {
// 1. Genel hata mesajları
required: 'Bu alan boş bırakılamaz',
invalid_type: 'Geçersiz değer türü',
// 2. Türe dayalı hata mesajları
string: {
min: (min) => `Lütfen en az ${min} karakter girin`,
email: 'Lütfen geçerli bir e-posta adresi girin'
},
number: {
min: (min) => `Değer en az ${min} olmalıdır`
},
// 3. Özel karşılaştırma kuralı mesajları
equals: (field) => `Bu alan, ${field} alanı ile eşleşmelidir`,
// 4. Alana dayalı özel mesajlar (en yüksek öncelik)
fields: {
username: {
min: (min) => `Kullanıcı adı en az ${min} karakter olmalıdır`,
required: 'Kullanıcı adı zorunludur',
// Özel doğrulama kuralı için mesaj
noAdminUsername: 'Admin kullanıcı adı rezerve edilmiştir'
}
},
// 5. Genel özel doğrulayıcı mesajları
custom: {
noAdminUsername: 'Admin kullanıcı adı kullanılamaz'
}
}
});
Mesaj Öncelik Sırası
Hata mesajları aşağıdaki öncelik sırasına göre belirlenir (en yüksekten en düşüğe):
- Alana dayalı özel doğrulayıcı mesajları (
customMessages.fields['fieldName']['customMessageKey']
) - Diğer alana dayalı özel mesajlar (
customMessages.fields['fieldName']['min']
) - Genel özel doğrulayıcı mesajları (
customMessages.custom['messageKey']
) - Genel kural tabanlı özel mesajlar (
customMessages.string.email
,customMessages.number.min
) - Genel hata türü mesajları (
customMessages.required
,customMessages.invalid_type
) - Seçilen dildeki varsayılan mesajlar
🌟 Kapsamlı Örnekler
Kullanıcı Kayıt Doğrulama Örneği
import { validate } from 'polyval';
// Kullanıcı kayıt şeması
const userRegistrationSchema = {
username: {
type: 'string',
required: true,
min: 3,
max: 20,
customValidators: [{
validator: (value) => value.toLowerCase() !== 'admin' ? undefined : 'Admin kullanıcı adı kullanılamaz',
messageKey: 'noAdminUsername'
}]
},
email: {
type: 'string',
required: true,
email: true
},
age: {
type: 'number',
min: 18,
required: false
},
password: {
type: 'string',
required: true,
min: 8,
max: 100 // Güçlü şifre için minimum/maksimum uzunluk kontrolü
},
confirmPassword: {
type: 'string',
required: true,
equals: 'password', // 'password' alanı ile eşleşmeli
customValidators: [{
validator: (value, data) => value !== data.password + '123' ? undefined : 'Tahmin edilebilir bir şifre kullandınız',
messageKey: 'predictablePassword'
}]
},
acceptTerms: {
type: 'boolean',
required: true,
equals: true // Kullanıcı şartları kabul etmeli
}
};
// Geçersiz veri
const userData = {
username: "al",
email: "invalid-email",
password: "123",
confirmPassword: "456",
acceptTerms: false
};
// Türkçe hata mesajları ile doğrulama
const errorsTR = validate(userRegistrationSchema, userData, { lang: 'tr' });
console.log(errorsTR);
// İngilizce ve özelleştirilmiş mesajlarla doğrulama
const errorsEN = validate(userRegistrationSchema, userData, {
lang: 'en',
customMessages: {
string: {
min: (min) => `Please ensure this field has at least ${min} characters.`,
email: "That doesn't look like a valid email address."
},
fields: {
username: {
noAdminUsername: "Sorry, 'admin' is a reserved username."
},
confirmPassword: {
equals: "Passwords must match exactly."
}
}
}
});
console.log(errorsEN);
💻 Geliştirme
Kurulum
git clone https://github.com/metehansenyer/polyval.git
cd polyval
npm install
Test
npm test
Build
npm run build
✨ Örnek Kullanım
example
dizininde kütüphanenin nasıl kullanılacağını gösteren bir örnek proje bulunmaktadır. Bu örneği incelemek ve çalıştırmak için:
-
Ana PolyVal projesini kurun ve build edin:
npm install npm run build
-
Örnek projeye gidin ve çalıştırın:
cd example npm install npm run dev
Bu örnek, kullanıcı kaydı doğrulamasını, çok dilli hata mesajlarını ve özelleştirilmiş mesajların nasıl kullanılacağını gösterir.
📄 Lisans
MIT
🌟 İletişim
Eğer bu proje ilginizi çektiyse ve benimle iletişime geçmek isterseniz:
- Email: mthansnyr@gmail.com
- LinkedIn: @metehansenyer
Yazılım projeleri hakkında her zaman sohbet etmeye açığım!