Zod 4 sürümü yayınlandı
(zod.dev)- Şema tanımlama ve doğrulama kütüphanesi Zod'un 4. sürümü yayınlandı. Büyük performans iyileştirmeleri ve uzun süredir talep edilen özelliklerle birlikte kararlı sürüm çıktı
- Hız ve bundle boyutu tarafında büyük iyileştirmeler yapıldı; yeni mini sürüm (v4-mini) bundle boyutunu ciddi ölçüde azaltıyor
- Yeni metadata registry ve JSON Schema dönüşümü ile özyinelemeli tip çıkarımı özelliği eklendi
- Hata mesajı özelleştirme ve çok dilli locale sistemi gibi geliştirici deneyimini güçlendiren yenilikler sunuldu
- Gelecekte kütüphane geliştirmede kullanılabilecek core alt paketinin eklenmesiyle genişletilebilirlik daha da arttı
Zod 4'e giriş
Önemli sürüm duyurusu
- 1 yıllık yoğun geliştirmenin ardından Zod 4 kararlı sürüm olarak yayınlandı
- Geliştirme süreci Clerk'ün OSS Fellowship desteğiyle yürütüldü
- Şu anda Zod 3 ile paralel olarak dağıtılıyor; bu da Zod 4'e kademeli geçişi kolaylaştırıyor
- Bazı breaking change'lere dair ayrıntılı bilgi Migration guide içinde bulunabilir
Büyümenin arka planı
- 2021'de çıkan Zod 3'e kıyasla Zod 4, GitHub yıldız sayısı ve haftalık indirme sayısında katlanarak büyüdü
- Zod 4 çok daha hızlı, daha hafif ve TypeScript derleyici verimliliği açısından daha iyi
- Uzun süredir çokça talep edilen 9 önemli sorun çözüldü
Benchmark ve performans
- Hız artışı:
- String parsing: 14.71 kat daha hızlı sonuç
- Dizi parsing: 7.43 kat daha hızlı
- Nesne parsing (
safeParse): 6.5 kat daha hızlı
- Depoda benchmark'ı doğrudan çalıştırabilmeniz için script sağlanıyor
- İyileştirilen generic yapısı sayesinde
.extend(),.omit()gibi metotları zincirlerken derleme performansı 10 kat arttı - Büyük şemalarda ve geniş kod tabanlarında TypeScript derleme hızı önemli ölçüde iyileşti
Bundle boyutu ve Zod Mini
- Varsayılan bundle boyutu %57 küçüldü; v4, v3'e göre 2.3 kat daha küçük bir boyut sunuyor
- zod/v4-mini, fonksiyon tabanlı ve tree-shake edilebilir bir API sunarak bundle boyutunu %85'e kadar azaltıyor
- Core ile v4-mini arasındaki API farkları resmi dokümantasyonda ayrıntılı biçimde açıklanıyor
- Kullanılmayan metotların bundler tarafından kolayca atılabilmesi için yapı buna göre tasarlandı
Metadata registry ve JSON Schema desteği
- Typed metadata şemalara güçlü tip desteğiyle kaydedilip yönetilebiliyor
- Global registry(
z.globalRegistry) içinde JSON Schema uyumlu metadata işleme ve otomatik ekleme özelliği sunuluyor .meta(),.describe()ile şema dokümantasyonu kolaylaşıyor.toJSONSchema()ile şemaları JSON Schema formatına dönüştürmek mümkün; metadata da otomatik olarak yansıtılıyor
Özyinelemeli tiplerin otomatik çıkarımı
- Özyinelemeli nesne tipleri ve karşılıklı özyinelemeli tipler, ayrı bir type cast gerekmeden doğal biçimde tanımlanıp çıkarılabiliyor
- Kullanım deneyimi, önceki Zod 3 kalıplarına göre ciddi biçimde iyileştirildi
- Özyinelemeli ve karşılıklı özyinelemeli tiplerde de tüm şema metotları kullanılabiliyor
Dosya tipi ve doğrulama özellikleri
- Yeni
file()tipi ileFileinstance'ları doğrulanabiliyor - Dosya boyutu (
min,max) ve MIME type gibi çeşitli dosya kısıtları doğrulanabiliyor
Hata mesajları ve locale sistemi
- Global locale API'si (
z.locales) ile hata mesajları için çok dilli destek sağlanabiliyor - Resmi
z.prettifyErrorfonksiyonu ile kullanıcı dostu hata biçimlendirmesi sunuluyor
Format fonksiyonları ve template literal
- Mevcut string formatları (
emailvb.) üst seviye fonksiyonlara taşınarak okunabilirlik ve tree shaking iyileştirildi - Çeşitli email regex seçenekleri sunularak farklı doğrulama ihtiyaçları karşılanıyor
- Template literal tipi desteği: tip sisteminde ifade edilebilen string kalıpları ve karmaşık kombinasyonlar kolayca kurulabiliyor
Yeni sayı ve bigint formatları
- Sabit genişlikli tamsayı ve kayan noktalı sayı tipleri (
int32,uint64vb.) destekleniyor - Güvenli aralık içinde otomatik minimum/maksimum kısıtlar eklenmiş şemalar oluşturulabiliyor
z.stringbool tanıtımı
- String tabanlı boolean parsing (
yes,novb.) yapılabiliyor; environment variable tarzı parsing de destekleniyor - Truthy/falsy değerler özelleştirilebiliyor
Hata özelleştirme API'sinin birleştirilmesi
- Birleştirilmiş
errorparametresi ile hata mesajları ve işleme mantığı daha düzenli hale getirildi - Mevcut çeşitli hata API'leri (
message,invalid_type_error,errorMap) deprecated oldu
Diğer temel iyileştirmeler
- Discriminated union'lar çeşitli şemaları, iç içe yapıları ve kombinasyonları destekliyor
.literal()artık aynı anda birden fazla değere izin veriyor.refine()gibi özel doğrulamalar daha sezgisel biçimde entegre edildi- Transform ile ilgili
.overwrite()sayesinde dönüşüm tipi değiştirilmeden sonradan işleme yapılabiliyor
Kütüphane genişletilebilirliği ve yeni core
- zod/v4/core ile çekirdek işlevler ayrı bir alt pakete ayrıldı; böylece farklı kütüphane ve platformlara entegrasyon/genişletme mümkün hale geldi
- Kütüphane geliştiricileri için kılavuz belgeler ve genişletme örnekleri sağlanıyor
Kapanış
- Zod 4, tip güvenliği, performans, genişletilebilirlik ve geliştirici deneyimi alanlarının tamamında büyük ilerleme kaydeden bir veri doğrulama kütüphanesi olarak konumlanıyor
- Gelecekte ek tasarım yazıları ve güncellemelerin geleceği duyuruldu
- Hem mevcut kullanıcılar hem de kütüphane geliştiricileri için geniş kapsamlı destek hazırlanıyor
Mutlu parsing'ler
— Colin McDonnell @colinhacks
1 yorum
Hacker News görüşleri
Yazar, kendi görüşlerinin paylaşılmasını istiyor ve sürümleme yaklaşımını ayrıntılı biçimde açıklıyor; npm'in Zod gibi bir durumu ele almak için uygun olmadığını vurguluyor. Pek çok kütüphanenin Zod arayüzlerini/sınıflarını doğrudan içe aktarıp kullandığını, Zod büyük sürüm değiştirirse bu kütüphanelerin hepsinin aynı anda uyum sağlaması gerekeceğini ve bir sürüm patlaması yaşanabileceğini belirtiyor. Go'ya benzer şekilde, kırıcı değişiklikler için yeni bir alt yol ekleme yönteminin kullanıldığını, TypeScript ortamında
zod@^3.25.0ile"zod/v3"ve"zod/v4"ün aynı anda desteklenebildiğini ve bunun son kullanıcıya kademeli bir yükseltme yolu sunduğunu açıklıyorZod'a yapılan katkılar için teşekkür ediyor; özellikle
tscperformansı ve discriminated unions iyileştirmeleri konusunda heyecanlı olduğunu söylüyor. Sürümleme yaklaşımını tamamen anladığını, ancak kendisi gibi transitive dependency çakışmalarından endişe etmeyen kullanıcılar için bunun tek başına4.0.0paketi olarak da sunulmasının güzel olabileceğini öneriyor."zod/v4"olarak import değiştirmenin kodda gürültü yaratacağını ve IDE otomatik importlarıyla ek uğraş doğurabileceğini düşünüyor; yine de genel olarak çok umut verici bir yükseltme olduğunu belirterek teşekkür ediyorHabere mobilde bakarken gözünden kaçtıysa affedilmesini istiyor ve
.optional()ile ilgili en büyük sıkıntının bu kez çözülen ilk 9/10 sorun arasında olup olmadığını soruyor. Zod'un çok iyi olduğu için can sıkıcı yanlarına rağmen kullanmaya devam ettiğini ve harika bir kütüphane olduğunu söyleyerek teşekkür ediyorYeni Zod sürümüyle birlikte çok sayıda elle yapılmış hack kodunu kaldırabilecek olmaktan memnun olduğunu söylüyor. Yazım hatalarını azaltmak için bizzat
zod-key-parserkullandığını, buna benzer bir özelliğin neden doğrudan kütüphanede yer almadığını merak ediyor; bunun kapsam dışı mı görüldüğünü yoksa henüz uygulanmadığını soruyor ve ilgili açık tartışmaları paylaşıyorKısa vadeli acıyı en aza indirmenin çoğu zaman en iyi yaklaşım olduğunu vurguluyor ve Python 2/3 geçişindeki büyük karmaşayı hatırlatıyor
Recursive type ile discriminated union yapısını aynı anda kullanırken, örneğin XML'i JSON içine gömmek gibi durumlarda, ciddi zorluk yaşadığını paylaşıyor ve bu güncellemeyle durumun çok daha iyi olmasını umuyor
zod/v4-miniimportuna şüpheyle yaklaştığını söylüyor; bunun tersine bundle boyutunu artırabileceğini tahmin ediyor. Resmî belgelerdezod/v4ün çoğu durumda önerildiği yazdığı için uygulama geliştiricilerininzod/v4kullanacağını, ancak kütüphane yazarlarının bundle boyutunu azaltmak içinzod/v4-miniyi de eklemesi halinde ikisinin de bundle'a girerek tekrar yaratabileceğinden endişe ediyor. Eğerzod/v4,zod/v4-miniiçin bir wrapper olsaydı bu sorunun azalabilir olup olmadığını soruyorZod 4'e geçişi kolaylaştırmak için v3 ve v4'ün
zod@3.25içinde birlikte sunulması yönteminin getirildiğini, bu yapının npm'in bağımlılık yönetimi sınırları yüzünden v4'ün v3 gibi görünmek zorunda kaldığı anlamına geldiğini eleştiriyor. npm'in peer dependencies sisteminin verimsizliğine işaret ediyorYazar, Go tarzı alt yol eklemeli sürümleme stratejisini yeniden açıklıyor. Bunun npm'in doğası nedeniyle Zod ekosistemine doğrudan uygulanmasının zor olduğunu, ancak v3 ve v4'ü aynı anda destekleyerek kademeli geçiş sağlama avantajı sunduğunu vurguluyor
Peer dependencies bozuk olduğu için v4'ün v3 gibi gösterildiği yönündeki önceki görüşe tam katılmadığını söylüyor. Bunun, kademeli geçiş için seçilmiş bir yöntem olduğunu; her şeyi yavaş yavaş
zod/v4ile değiştirdikten sonra tamamen v4'e geçmenin hedeflendiğini belirtiyorİnsanların çok eleştirdiğini, ancak bunun aslında npm'in temel bir kusurundan çok, büyük değişiklikler içeren bir kütüphaneyi aşamalı biçimde güncellenebilir kılmak için alınmış pratik bir karar olduğunu savunuyor
Uzun zamandır yalnızca npm kullandığı için önyargılı olabileceğini söylüyor ama v3'ten v4'e bir anda toplu geçiş yapmak yerine kademeli destek sağlamanın bundan daha iyi bir yolu ne olabilirdi diye soruyor
Zod 4 beta ile zaten büyük iyileşmeler gördüğünü, ancak büyük bir kod tabanında modül çözümleme ayarlarının zorluğu yüzünden düzgün yükseltme yapamadığını anlatıyor. Keşke eski katman olmadan, yalnızca ana sürüm olarak da yayımlansaydı diyor. Yazarın "sürüm patlaması"nı önlemeye dönük açıklamasını paylaşıyor, ancak yine de v3 desteği sürerken geçişin şokunu azaltmanın mümkün olduğunu düşündüğünü ekliyor
Sunucudan dönen tiplerin endpoint'e göre değiştiği veya bazı alanların anonim kullanıcı örneğinde olduğu gibi
nullgelebildiği karmaşık durumlarda, sunucu yanıtının hangi tip modeliyle ele alınması gerektiğini soruyor.normalizeUser/normalizePostgibi çok sayıda fonksiyon yazdıkça yönetimin giderek karmaşıklaştığını belirtiyor ve bunun pratikte nasıl çözüldüğüne dair deneyim istiyorÇözüm olarak bir discriminated union örneği veriyor. Şemanın ortak kısmını bir nesne olarak tanımlayıp, özel durumlar için bunu genişletme yaklaşımını açıklıyor. Çok fazla varyasyon olduğunda işin yine karmaşıklaşabileceğini, ancak bir schema validator ile en azından yapının sistemli tutulabileceğini söylüyor
İdeal olarak
Usertip yapısının tek bir kaynaktan, örneğin discriminated union biçiminde tanımlanmasının en iyisi olduğunu belirtiyor. Python backend varsayımıyla, birden fazla Pydantic model + union ve ardından OpenAPI/GraphQL code generation ile TypeScript istemci tipleri üretme yapısını öneriyorGerçek kullanım örneğini bilseler daha iyi yanıt verebileceklerini, ancak union type içine ayırt edici bir özellik, örneğin
"user_type", eklenirse ilgili alanlara erişimin kolaylaşacağını açıklıyor. Böylece tip sistemi duruma göre uygun özellikleri anlayabiliyorSunucunun tipleri doğrudan dışa vermesi gerektiğini söylüyor. İstemci tarafında ayrı tipleri baştan yeniden yazmanın verimsiz olduğunu; Python backend için Pydantic ile OpenAPI şeması otomatik üretilip buradan TypeScript istemci tiplerinin türetilebileceğini anlatıyor
GraphQL'in bu tür kullanım senaryolarına uygun tasarlandığını belirtiyor. TypeScript GraphQL kütüphaneleriyle sorgu sonucunun biçiminin otomatik çıkarılabildiğini ve seçilen alanlara göre yanıt tiplerinin dinamik biçimde oluştuğunu örnekliyor
Zod 4'ün iyileşmiş olmasına rağmen ArkType'ın hâlâ çok daha hızlı olduğunu söylüyor. Yerleşik kütüphanelerde geriye dönük uyumluluk ve sözdizimini koruma gereği nedeniyle performans sınırları bulunduğunu, kendi proje analizleri sonucunda ArkType'ı performans ve TypeScript kullanım deneyimi nedeniyle seçtiğini belirtiyor
ArkType'ın hız metriklerini gördüğünü ama bunun pratikte neyi değiştirdiğini merak ettiğini söylüyor. Form doğrulama gibi genel senaryolarda etkisinin az göründüğünü, belki ultra hızlı API girdi doğrulaması gibi performansa duyarlı yerlerde mi kullanıldığını soruyor
ArkType araştırmada yer almamış olsa da TypeScript kullanım deneyimini önemseyerek buna baktığını, yine de Zod'dan geçmeyi planlamadığını söylüyor
ArkType deneyiminin kendisi için oldukça zor olduğunu, Zod'un ise çok daha kullanışlı geldiğini ve bu yüzden tercih ettiğini belirtiyor
TypeBox yerine ArkType'ı seçmek için özel bir nedeni olup olmadığını soruyor
Zod ekibini yeni sürüm için kutluyor. Migration guide'daki kırıcı değişikliklerin çokluğu nedeniyle, Zod'a büyük ölçüde bağımlı projelerde bunun ciddi bir yük ve yönetim zorluğu yaratabileceğinden endişe ettiğini söylüyor. Eski frontend projelerini sürdürme deneyimine dayanarak, her kütüphanede büyük değişiklikler ve yetersiz belgeler görmenin bugünkü JS ekosistemindeki can sıkıcı yönlerden biri olduğunu ifade ediyor
Birkaç büyük Next.js uygulaması yönettiğini, son bir yılda Next.js 14→15, Next.js pages→app router, React 18→19, Eslint 8→9, Tailwind 3→4 gibi çok büyük ve zor geçişler yaşadığını ve gerçekten yıpratıcı olduğunu anlatıyor. Hatta bazen keşke bunu Django ile yapmış olsaydık diye düşündüğünü, özellikle de Tailwind 3→4 geçişinin şaşırtıcı biçimde en acı verici olanı olduğunu söylüyor
Bu tür sorunları hafifletmek için eşzamanlı
minisürüm stratejisinin getirildiğini, bunun kademeli geçişi kolaylaştırdığını ve tree-shaking verimliliği açısındanminisürümün alternatiflere karşı rekabet edebilmek için gerekli olduğunu açıklıyorLLM gibi araçlarla migration'ın sanıldığı kadar zor olmayabileceğini öneriyor
Zod'un mevcut diğer alternatiflere göre çok daha iyi olduğunu söylüyor. Ancak web geliştirmede aynı veri yapısını birden fazla şekilde tanımlamak zorunda kalmanın can sıkıcı bir gerçek olduğunu; JS girdi doğrulaması, Swagger ile API tanımı, sunucu ve istemci için ayrı tanımlar derken bunun fazlasıyla tekrar ve uğraş yarattığını belirtiyor
TypeScript'in yalnızca statik kontrol aracı olarak kalmasından memnun olmadığını; çalışma zamanında kontrol istemese bile sınıf/fonksiyon/nesne tip verilerinin dışarıya kolayca aktarılabilmesini istediğini söylüyor. Şu anda birçok aracın kendi modelini ve builder yapısını tanımlamak zorunda kalması nedeniyle tekrarın kaçınılmaz olduğunu, standartlaşma girişimi olan Standard Schema projesinin büyük doğrulama kütüphaneleriyle bütünleşmeye başladığını ama API tanımı ve ORM tarafına genişlemesinin henüz erken aşamada olduğunu paylaşıyor
Bu tür araçların asıl değerinin, bir şeyi tek sefer tanımlayıp type safety'yi tüm uygulamaya yayabilmek olduğunu söylüyor. Zod şemasının bir tür tek doğruluk kaynağı olarak kullanılabileceğini vurguluyor
Bu kadar karmaşık yapılardan rahatsız olan kişiler arasında bile, gerçekte her şeyi TypeScript'le, Zod dahil, tek yerde birleştirme önerisine karşı çıkanların az olmadığını da ekliyor
Tüm API'lerin ve sistemlerin sürekli değişim ve deneme hâlinde olduğunu, katmanların artmasının bir dezavantaj olduğunu ama "projede iş yürüsün yeter" denilen ortamlarda bunun sonunda yalnızca daha fazla iş çıkardığını söylüyor
Genel olarak
trpcgibi uçtan uca type safety sağlayan yaklaşımların kullanılabileceğini, ancak bunun için hem frontend hem backend'in TypeScript olması gerektiğini ve web dışı platformlarda, örneğin mobilde, bunun pratikte zorlaştığını belirtiyorUzman olmadığını söylüyor ama schema tabanlı JSON-Schema'nın, TypeScript dışındaki dillerde de validator uygulanabildiği için iyi bir seçenek olabileceğini düşünüyor.
ajv.js.orggibi kütüphaneler örneği üzerinden Zod ile nasıl kıyaslanacağını soruyorZod'un yalnızca JSON biçimlerini değil, tüm JS nesnelerini de, örneğin tarihleri ve sınıf örneklerini, doğrulayabildiğini; yani JSON'da temsil edilemeyen veriler üzerinde de çalışabildiğini açıklıyor. Ayrıca JSON dönüştürme sürecinde de kullanılabileceğini; örneğin bir ISO tarih string'ini doğrulayıp
Datenesnesine dönüştürebildiğini söylüyorZod 4'ün artık Zod şemalarını JSON-Schema'ya dönüştürmeyi desteklediğini, eskiden bunun için harici kütüphane gerektiğini belirtiyor. Zod'un asıl farkının
preprocess/refineözellikleri olduğunu; doğrulama öncesi callback ekleyerek örneğinMM/DD/YYYYbiçiminiDD/MM/YYYYbiçimine çevirip sonra doğrulama yapılabildiğini ve JSON-Schema'da bunun mümkün olmadığını vurguluyorJSON-Schema'nın da iyi bir seçenek olduğunu, bu senaryoda üretim için TypeBox'ın uygun olabileceğini;
avjkullanılabileceği gibi kendi doğrulama sisteminin de tercih edilebileceğini söylüyor. Kendi doğrulama sisteminin daha hızlı olduğunu ama yalnızca senkron çalıştığını,avj'nin ise asenkron doğrulamayı da desteklediğini ve daha derin doğrulamalar için avantaj sağladığını belirtiyorBirden fazla dilde kullanılacaksa JSON-Schema'nın en yaygın çözüm olduğunu, OpenAPI ile sarıldığında otomatik API dokümantasyonu da üretilebildiğini ekliyor
Zod'u yeni projede kullanmaya yeni başladığını ve bu sürüm zamanlamasının tam isabet olduğunu söylüyor. Her şey plana göre gitseydi v4'e geçmek için çok daha fazla değişiklik yapması gerekeceğini, bu yüzden zamanlamanın mükemmel olduğunu belirtiyor
Beklediğinden çok daha fazla olumsuz yorum görünce şaşırdığını söylüyor. v4'ün ilk sürümlerini test ederken yeni API'yi beğendiğini ama migration yolunun nasıl olacağı konusunda endişelendiğini, hatta ayrı bir paket adıyla yayımlanmasının daha iyi olup olmayacağını düşündüğünü anlatıyor. Ancak yazarın seçtiği yöntemin sorunu çok iyi çözdüğünü ve bu sayede bağımlılık güncellemelerini beklemeden hemen v4'ü benimseyebildiğini söylüyor