Zod 4 रिलीज़
(zod.dev)- Zod 4 एक साल के विकास के बाद stable version के रूप में जारी हुआ है, जिसमें Zod 3 की design limitations को ठीक किया गया और performance, bundle size, TypeScript compile efficiency में बड़ा सुधार किया गया
- मई 2021 में आया Zod 3 GitHub पर 2,700 stars और 6 लाख weekly downloads से बढ़कर अब 37.8k stars और 3.1 करोड़ weekly downloads तक पहुंच गया है; 24 minor versions के बाद बड़े सुधारों के लिए breaking changes ज़रूरी हो गए थे
- benchmarks में string parsing 14 गुना, array parsing 7 गुना, object parsing 6.5 गुना तेज़ हुई;
tsctype instantiation भी एक simple example में 25,000 से अधिक बार से घटकर लगभग 175 बार रह गई - core bundle size gzip के आधार पर Zod 3 के
12.47kbसे घटकर Zod 4 regular version में5.36kbहो गया, और tree-shaking योग्य functional API Zod Mini में यह1.88kbतक छोटा हो गया - नए features में JSON Schema conversion, metadata registry, recursive object type inference, internationalization, error pretty-printing, template literal types,
z.stringbool(), unifiederrorparameter, improvedz.discriminatedUnion()आदि शामिल हैं
Zod 4 के नए major version बनने की वजह
- Zod 4 एक साल के सक्रिय development के बाद stable version बना है, और तेज़, छोटा व बेहतर
tscefficiency वाला आधार देकर लंबे समय से मांगे जा रहे features लागू करता है - Zod v3.0 मई 2021 में release हुआ था; उस समय GitHub stars 2,700 और weekly downloads 6 लाख थे
- आज Zod के GitHub stars 37.8k और weekly downloads 3.1 करोड़ हैं
- beta आने से 6 हफ्ते पहले weekly downloads 2.3 करोड़ थे
- 24 minor versions जुड़ने के बाद Zod 3 codebase अपनी सीमा पर पहुंच गया था, और सबसे अधिक मांगे गए features व improvements के लिए breaking changes की जरूरत थी
- Zod 4 ने सबसे ज्यादा upvotes पाने वाले public issues में से 10 में 9 को बंद किया
Parsing performance और TypeScript compile efficiency
- Zod 4 repository में सीधे चलाए जा सकने वाले benchmarks देता है
- parsing performance improvements:
- string parsing: 14 गुना तेज़
- array parsing: 7 गुना तेज़
- object parsing: 6.5 गुना तेज़
- object parsing benchmark Moltar validation library benchmark चलाता है
tsc --extendedDiagnosticsके आधार पर simple file compile में type instantiation काफी कम हुई"zod/v3"इस्तेमाल करने पर 25,000 से अधिक बार"zod/v4"इस्तेमाल करने पर लगभग 175 बार
- Zod 4 ने
ZodObjectऔर दूसरी schema classes के generics को redesign और simplify करके instantiation explosion से बचाव किया .extend()और.omit()को बार-बार chain करने वाला pattern Zod 3 में compile होने में4000msलेता था, और अतिरिक्त.extend()call"Possibly infinite"error पैदा कर सकता था- वही pattern Zod 4 में
400msमें compile होता है, यानी 10 गुना तेज़ - भविष्य में
tsgocompiler के साथ इस्तेमाल करने पर Zod 4 की editor performance और बड़े schemas व codebases तक scale हो सकती है
Bundle size और Zod Mini
- simple
z.boolean()validation script कोrollupसे bundle करके core bundle size की तुलना की गई - gzip के आधार पर core bundle size:
- Zod 3:
12.47kb - Zod 4 regular version:
5.36kb
- Zod 3:
- Zod 4 regular version का core bundle Zod 3 से लगभग 57% छोटा है, यानी 2.3 गुना कम
- Zod का method-centric API मूल रूप से tree-shaking के लिए कठिन है, और simple
z.boolean()script भी.optional(),.array()जैसे unused method implementations को साथ खींच लाती है - Zod Mini
zodसे 1:1 match करने वाला functional और tree-shaking योग्य API देता है- जहां Zod methods इस्तेमाल करता है, वहां Zod Mini आम तौर पर wrapper functions इस्तेमाल करता है
- parsing methods Zod और Zod Mini में समान हैं
- general-purpose
.check()method से refinement जोड़ा जाता है
- regular Zod अधिकतर use cases के लिए अब भी recommended है, और जिन projects में असामान्य रूप से सख्त bundle size constraints हैं वे Zod Mini पर विचार कर सकते हैं
zod/miniइस्तेमाल करने पर gzip bundle size1.88kbहै- Zod 3 की तुलना में 85%, यानी 6.6 गुना कमी
- comparison table: Zod 3
12.47kb, Zod 4 regular5.36kb, Zod 4 Mini1.88kb
- अधिक जानकारी
zod/minidocs में देखी जा सकती है
Metadata और JSON Schema
- Zod 4 schemas में strongly typed metadata जोड़ने के लिए नया system लाता है
- metadata schema में ही नहीं, बल्कि schema और typed metadata को जोड़ने वाली schema registry में store होता है
z.registry()से registry बनाई जा सकती है, और schema के.register()method से convenient registration भी संभव है- Zod common JSON Schema-compatible metadata लेने वाली global registry
z.globalRegistryexport करता है .meta()method schema कोz.globalRegistryमें आसानी से जोड़ता है- Zod 3 compatibility के लिए
.describe()उपलब्ध रहता है, लेकिन Zod 4 में.meta()recommended है - Zod 4
z.toJSONSchema()के जरिए first-party JSON Schema conversion देता है z.globalRegistryका metadata JSON Schema output में automatically शामिल होता है- generated JSON Schema customization की जानकारी JSON Schema docs में है
नए schema expressions और type features
- Zod 4 recursive object types को सही तरीके से infer कर सकता है
- recursive types और mutually recursive types express किए जा सकते हैं
- Zod 3 के recursive type pattern के विपरीत type casting की जरूरत नहीं है
- result schema सामान्य
ZodObjectinstance है और सभी methods इस्तेमाल किए जा सकते हैं
Fileinstances validate करने के लिए File schema जोड़ा गया हैz.templateLiteral()TypeScript के template literal types को express करता है- stringified किए जा सकने वाले Zod schema types internal regex store करते हैं
- targets में strings,
z.email()जैसे string formats, numbers, boolean, bigint, enum, literal, undefined/optional, null/nullable, दूसरे template literal शामिल हैं z.templateLiteralconstructor इन्हें एक super-regex में जोड़ता हैz.email()जैसे string formats ठीक से enforce होते हैं, लेकिन custom refinement enforce नहीं होता- अधिक जानकारी template literal docs में है
- fixed-width integers और floating-point types express करने वाले नए number formats जोड़े गए हैं
- ये ऐसा
ZodNumberinstance लौटाते हैं जिसमें उचित inclusive minimum/maximum constraints पहले से जोड़े गए होते हैं
- ये ऐसा
- JavaScript
numberसे सुरक्षित रूप से represent की जा सकने वाली range से बाहर के bigint number formats भी जोड़े गए हैं- ये ऐसा
ZodBigIntinstance लौटाते हैं जिसमें उचित inclusive minimum/maximum constraints पहले से जोड़े गए होते हैं
- ये ऐसा
z.literal()अब optionally कई values ले सकता है
Errors, internationalization, string formats
- Zod 4 error messages को कई भाषाओं में globally translate करने के लिए नया
localesAPI पेश करता है - supported locales की पूरी list Customizing errors में है, और supported languages जुड़ने पर update होती है
- Zod ने
ZodErrorको user-friendly formatted string में बदलने वाला top-levelz.prettifyErrorfunction implement किया है- current format configurable नहीं है
- भविष्य में बदल सकता है
- अगर मौजूदा
zod-validation-errorइस्तेमाल कर रहे हैं, तो उसे जारी रख सकते हैं
- email आदि सभी string formats को
zmodule के top-level functions में promote किया गया है- यह अधिक concise और tree-shaking के लिए बेहतर है
z.string().email()जैसा method counterpart API अब भी इस्तेमाल किया जा सकता है, लेकिन deprecated है- अगले major version में हटाया जाएगा
z.email()API custom regular expression support करता है- कोई एक canonical email regex तय नहीं है, और हर application अधिक सख्त या ढीले criteria चुन सकता है
- convenience के लिए Zod कुछ common regex export करता है
Boolean conversion और error customization का सरलीकरण
- मौजूदा
z.coerce.boolean()falsy values कोfalseऔर truthy values कोtrueमें बदलने वाला simple API हैfalse,undefined,null,0,"",NaNआदिfalseबनते हैं- यह behavior दूसरे
z.coerceAPIs से मेल खाता है
- env-style की अधिक sophisticated boolean coercion के लिए Zod 4
z.stringbool()पेश करता है- truthy और falsy values customize की जा सकती हैं
- अधिक जानकारी
z.stringbool()docs में है
- Zod 4 के अधिकांश breaking changes error customization API से जुड़े हैं
- error customization को single
errorparameter में unify किया गया हैmessageकोerrorसे replace किया गया हैmessageparameter अब भी supported है, लेकिन deprecated हैinvalid_type_errorऔरrequired_errorको function syntax वालेerrorसे replace किया गया हैerrorMapको भी function syntax वालेerrorसे replace किया गया है
Composability, refinements, transforms
z.discriminatedUnion()अब कई ऐसे schema types support करता है जो पहले support नहीं थे- इसमें union और pipe शामिल हैं
- discriminated union को किसी दूसरे discriminated union का member बनाया जा सकता है, जिससे यह composable हो गया है
- Zod 3 में refinements original schema को wrap करने वाली
ZodEffectsclass में store होते थे- इस structure के कारण
.refine()को.min()जैसे दूसरे schema methods के साथ mix करके इस्तेमाल करना असुविधाजनक था
- इस structure के कारण
- Zod 4 में refinements schema के अंदर store होते हैं, इसलिए
.refine()और दूसरे schema methods को सहज रूप से साथ इस्तेमाल किया जा सकता है - नया
.overwrite()method ऐसा transform express करता है जो inferred type नहीं बदलता.transform()का output type runtime में introspectable नहीं होता, और transform function कुछ भी return कर सकता है, इसलिए यह black box है- इसी कारण इसे JSON Schema में सुरक्षित रूप से convert करने का कोई तरीका नहीं है
.overwrite()original class का instance लौटाता है- overwrite function refinement के रूप में store होता है और inferred type को modify नहीं करता
- मौजूदा
.trim(),.toLowerCase(),.toUpperCase()को.overwrite()इस्तेमाल करके फिर से implement किया गया है
Library authors के लिए आधार
- Zod Mini जुड़ने से
zod/v4/coresubpackage बनाया गया है, जिसमें Zod और Zod Mini द्वारा share की गई core functionality है zod/v4/coreZod को simple library से आगे बढ़ाकर दूसरी libraries में embedded किए जा सकने वाले fast validation foundation में बदलता है- अगर schema library बना रहे हैं, तो Zod और Zod Mini implementations देखकर
zod/v4/coreके ऊपर build कर सकते हैं - library authors के लिए For library authors guide उपलब्ध है
- यह Zod के ऊपर build करते समय best practices बताती है
- Zod 3, Zod 4 और Mini को साथ-साथ support करने के तरीकों पर common questions के जवाब देती है
1 टिप्पणियां
Hacker News की राय
मैं लेखक हूँ, कुछ भी पूछिए। version policy के बारे में इस approach की वजह काफी विस्तार से यहाँ लिखी है: https://github.com/colinhacks/zod/issues/4371
आखिरकार npm को Zod जैसी स्थिति को अच्छी तरह संभालने के लिए design नहीं किया गया है। दर्जनों से सैकड़ों libraries Zod के interfaces/classes को सीधे import करके अपने public API में इस्तेमाल कर रही हैं, इसलिए जब भी Zod major version बढ़ाता है, उन libraries को भी नया major version निकालना पड़ता है
अकेले में देखें तो यह reasonable है, लेकिन Zod में इससे सबके लिए दर्दनाक version avalanche हो सकता था, और लगा कि ecosystem का बड़ा हिस्सा हमेशा के लिए v3 पर pinned रह जाएगा
इसलिए Go वाले तरीके जैसा, package का नया breaking-compatibility version निकालने के बजाय नया subpath जोड़ने का तरीका चुना। TypeScript ecosystem में कोई library सिर्फ
zod@^3.25.0को peer dependency रखकर"zod/v3"और"zod/v4"से अपनी जरूरत की चीजें import कर दोनों versions को साथ-साथ support कर सकती हैहालांकि खास परिस्थितियों के कारण कुछ अजीब version policy चुनने की वजह समझ आती है, लेकिन जिन teams को transitive dependency में Zod version conflicts की चिंता नहीं करनी पड़ती, उनके लिए
4.0.0package भी होता तो अच्छा थाअगर मैंने सही समझा है तो import को
"zod/v4"में बदलना होगा, जो बहुत noisy change है, और IDE के'zod'से auto import करने की समस्या को lint rule से पकड़ना पड़ेगा, जो सिरदर्द हो सकता है.optional()को ठीक करने का काम top 9–10 issues के समाधान में शामिल है या नहीं: https://github.com/colinhacks/zod/issues/635Zod में यह मेरी सबसे बड़ी तकलीफ रही है, लेकिन Zod इतना अच्छा है कि इसे सहते हुए इस्तेमाल कर रहा हूँ
जानना चाहता हूँ कि आप इसे Zod के scope से बाहर मानते हैं, या बस अभी implement करने का समय नहीं मिला। संबंधित चर्चा https://github.com/colinhacks/zod/discussions/2134 में है
3.25.0है, तो यह थोड़ा बेतुका लगता हैमैं कई महीनों से Zod alpha version इस्तेमाल कर रहा था और बस
package.jsonबदलकर upgrade करना चाहता था, लेकिन अब लगता है कि पूरी git history खंगालनी पड़ेगीproject के लिए बहुत आभारी हूँ, लेकिन इस feedback के मामले में लगता है कि इसे जरूरत से ज्यादा कठिन बना दिया गया। शायद
3.xके साथ 4.x भी publish किया जा सकता था“migration को आसान बनाने के लिए Zod 4 को
zod@3.25release के हिस्से के रूप में Zod 3 के साथ ship करना, और"/v4"subpath से import कराना” यह संकेत लगता है कि npm dependency management पूरी तरह गड़बड़ हैpeer dependencies इतनी टूटी हुई हैं कि v4 को v3 होने का दिखावा करना पड़ रहा है
यह सही है कि npm Zod जैसी स्थिति को अच्छी तरह manage नहीं करता। हालांकि Zod पर यह constraint है कि वह लगभग कोई library स्वीकार नहीं करता। दर्जनों से सैकड़ों libraries
"zod"से interfaces/classes को सीधे import करके अपने public API में इस्तेमाल करती हैंऐसी libraries को Zod के हर major version bump पर नया major version निकालना पड़ता है, और Zod में यह version avalanche पैदा कर सकता है जो सबके लिए दर्दनाक होता। ईमानदारी से कहूँ तो लगा कि ecosystem का बड़ा हिस्सा हमेशा के लिए v3 पर pinned रह जाएगा
इसलिए Go जैसा, हर breaking-compatibility release के लिए नया package version निकालने के बजाय नया subpath जोड़ने का तरीका चुना। TypeScript ecosystem में
zod@^3.25.0की एक peer dependency से"zod/v3"और"zod/v4"दोनों को साथ-साथ support किया जा सकता हैयानी usage sites को एक-एक करके
import ... from 'zod/v4'में refactor करें, और अंत में पूरी तरह v4 पर चले जाएँबल्कि npm में जरूरत पड़ने पर कई versions साथ-साथ चला सकते हैं या transitive dependency graph के कुछ हिस्से selectively override कर सकते हैं, इसलिए escape routes ज्यादा हैं
कौन-सा package management system इस समस्या को हल करता है? Maven जैसे “stable” platforms भी Apache Commons के v2 से v3 जाने पर नए namespace के साथ version निकालकर ऐसी समस्याएँ संभालते हैं
एक सवाल मुझे बहुत पहले से परेशान करता रहा है। सुना है कि Zod इसमें फिट हो सकता है, लेकिन docs देखने के बाद भी ठीक से समझ नहीं आता कि करना कैसे है
मान लीजिए server API उससे ज़्यादा refined type लौटाता है जितना वह सीधे express कर सकता है। उदाहरण के लिए
api/:postid/authorUser लौटाता है, लेकिन वह सामान्य User भी हो सकता है और anonymous User भी, इसलिएusername,locationजैसे fields null आ सकते हैं। इस स्थिति में User object को discriminated union के रूप में express करना चाह सकते हैंदूसरे endpoints से आने वाले objects को भी type conversion की ज़रूरत हो सकती है। User कभी-कभी
Post[]शामिल करता है, और अगर Post moderator की post है तो उसमें special properties भी हो सकती हैंपहले मैं
normalizeUser()औरnormalizePost()जैसे functions लिखता था, लेकिन वे जल्दी ही messy हो गए। हर endpoint User/Post model के अलग-अलग subsets लौटाता था, इसलिएnormalizePostके करीब 5 variants बनाने पड़े, जो बहुत बिखरा हुआ था। जानना चाहता हूँ कि ऐसी समस्या आम तौर पर कैसे हल की जाती हैstatusजैसे discriminator field के आधार परsuccessऔरfailedobjects को अलग करने जैसा। अगर moderator के लिए बहुत सारी special properties हैं, लेकिन आप उन्हें सब list या check नहीं करना चाहते, तो passthrough behavior define कर सकते हैंभले ही अलग-अलग methods के schemas अलग हों, अगर उनमें common हिस्सा है तो shared object schema बनाकर उस पर extra fields वाले objects बनाए जा सकते हैं। possibilities बहुत हों तो फिर भी messy रहेगा, लेकिन अगर हालात पहले से messy हैं तो validator कम से कम उस mess को validate तो कर सकता है
अगर full-stack TypeScript नहीं है, तो उदाहरण के लिए Python backend में अलग-अलग
Usershapes को Pydantic models और unions से define किया जा सकता है, और OpenAPI/GraphQL schema generation व code generation के जरिए TypeScript client types बनाए जा सकते हैं"user_type"जैसी discriminating property जोड़ दें तो सामान्य और special cases को handle करना आसान हो जाता हैउदाहरण के लिए
user.user_type === 'authenticated'check करने पर type system समझ जाता है कि उसके बादuser.nameइस्तेमाल किया जा सकता हैGraphQL queries के लिए TypeScript libraries चुने गए fields के shape से response shape को dynamically infer कर सकती हैं।
{ user { username posts { text } } }चुनने पर response type मेंpostsहोगा, और अगर सिर्फ{ user { username } }चुनें तोpostsproperty पूरी तरह गायब रहेगीserver जानता है कि वह कौन-सा data भेज रहा है, इसलिए उसे वह जानकारी metadata के रूप में client को देनी चाहिए। Practical तौर पर इसका मतलब हो सकता है कि Python backend Pydantic schema इस्तेमाल करे, उसके आधार पर OpenAPI spec auto-generate करे, और client types generate करे
Zod देखे गए alternatives से काफी बेहतर है, लेकिन कभी-कभी यह बात ही कि ऐसी explicit validation की ज़रूरत पड़ती है, आधुनिक web development कहाँ पहुँच गया है इसकी असफलता जैसी लगती है
full-stack development में उसी shape को कई तरीकों से describe करना बहुत frustrating है। JS input validation, API definitions के लिए Swagger, server-side input validation, schema compatibility के लिए ORM, और server व client की अलग-अलग TypeScript definitions तक चाहिए होती हैं—सब बहुत tedious है
TypeScript हमारे पास मौजूद सबसे अच्छा single source of truth जैसा लगता है, लेकिन असल में reflection की कोशिश करने वाले tools अपनी-अपनी models और builders फिर से define कर रहे हैं। reflection core होने वाले बड़े क्षेत्रों की संख्या ही 5 है, और हर एक की कई implementations हैं
पुराना TypeScript type emission tool
reflect-metadataruntime type information का कुछ हिस्सा देता है, लेकिन वह बहुत पुराने decorators और metadata spec को target करता है: https://www.npmjs.com/package/reflect-metadataशायद हम integration की शुरुआती अवस्था में हों। Standard Schema project को ज़्यादातर प्रमुख validation libraries का support मिलता दिखता है। हालांकि इसे API definition या ORM tools तक फैलाना अभी बहुत शुरुआती चरण में है
https://github.com/standard-schema/standard-schema?tab=readm...
Zod schema में एक बार बदलाव करने पर वह type checking के साथ पूरे app में propagate हो जाता है। यानी Zod schema single source of truth बन जाता है
अगर आपके पास पहले से JSON Schema/Swagger schema है, तो उससे Zod generate कर लें। अगर TypeScript ORM इस्तेमाल कर रहे हैं, तो लगभग निश्चित रूप से कोई Zod generator होगा
सच कहूँ तो Zod इतना widely used है कि मेरे लिए यह वह unified schema definition बन गया है जिस पर stack की बाकी चीज़ें depend कर सकती हैं। types सीधे define होते हैं, इसलिए developers उन्हें सच में up to date रखते हैं। कंपनी का Swagger documentation बदलावों से हमेशा पीछे रहता है
status quo ठीक तभी लगता है जब आप ऐसे clients और employers से deal कर रहे हों जिन्हें बस result चाहिए और method से मतलब नहीं। उस context में complexity की ये दुर्भाग्यपूर्ण layers कम से कम billable hours बढ़ा देती हैं
बेशक, इस assumption पर कि Zod उनकी चुनी हुई TypeScript schema definition और validation library है
Zod 4 अच्छा दिखता है, लेकिन नवीनतम सुधारों के बावजूद ArkType अभी भी कई गुना—single-digit multiple—तेज़ है
backward compatibility और syntax compatibility के लिए कभी-कभी किसी पूरी तरह नए सिरे से बनी library जितना तेज़ बनाना मुश्किल होता है। हाल के project में मैंने इन सभी tools का विश्लेषण किया था, और आंशिक रूप से इसी वजह से ArkType चुना। TypeScript का उपयोग-अनुभव भी बेहतर लगा
हम Zod का इस्तेमाल सिर्फ form validation के लिए करते हैं, इसलिए लगता है “यह क्यों मायने रखता है?” क्या लोग high-throughput API input messages जैसी चीज़ें validate करते हैं, जहाँ performance अधिक महत्वपूर्ण हो जाती है?
फिर भी शायद मैं Zod से migrate नहीं करूँगा
Zod team को नए release की बधाई। बहुत negative लगने का जोखिम उठाते हुए भी, migration guide में लिखे breaking changes की संख्या देखकर डर लगता है
अगर कोई project Zod पर बहुत निर्भर है, तो यह developer focus और समय की बहुत मांग करने वाला भारी काम लग रहा है। काम पर 4–5 साल पुराने कुछ frontend projects maintain किए हैं, इसलिए यह खास तौर पर समझ आता है
बड़े React projects आमतौर पर बहुत सारी libraries पर निर्भर होते हैं, और जब हर library बड़ा बदलाव लेकर आती है, ऊपर से docs भी कम हों, तो चीज़ें तुरंत overwhelming हो जाती हैं। JavaScript के साथ काम करते समय यह मेरी सबसे नापसंद चीज़ों में से एक है, और सब कुछ sync में रखकर smoothly चलाते रहना एक कभी न खत्म होने वाली चढ़ाई जैसा लगता है
सच कहूँ तो यह nightmare था, और लगा कि काश इसे Django में बनाया होता। उम्मीद के उलट Tailwind 3 → 4 migration सबसे दर्दनाक चीज़ों में से एक निकला
miniedition के साथ dual offering का तरीका चुना है। package manager को छेड़े बिना gradual migration करना आसान हैजिन users को
miniedition में रुचि नहीं है, उन्हें उस हिस्से की चिंता करने की ज़रूरत नहीं। लेकिनminiedition के tree-shaking benefits इतने बड़े हैं कि वे alternative development को बढ़ावा दे रहे थे, और Zod को इसे अपनाना था या पीछे छूटना थाproduction में हजारों users वाला SaaS खुद चलाने वाले full-stack developer के रूप में, कभी-कभी अच्छा लगता है यह महसूस करके कि SPA न बनाने और JS frontend framework न इस्तेमाल करने के कारण कितनी समस्याएँ हैं जिनके बारे में मुझे पता ही नहीं
Zod/ArkType जैसी चीज़ की ज़रूरत के बारे में मैंने कभी सोचा भी नहीं, पहली बार सुना है और कभी इस्तेमाल भी नहीं करूँगा
SPA बनाने में जितना effort, complexity और tooling लगता है, वह हैरान करने वाला है। SPA न बनाने का फैसला करें तो समस्याओं का एक पूरा वर्ग बस मौजूद ही नहीं रहता। इसके बजाय browser को उसी तरह इस्तेमाल करते हैं जैसे वह मूल रूप से design किया गया था—full page reloads और backend development पर focus—और कभी-कभी Laravel Livewire जैसे backend-only framework से थोड़ी reactivity जोड़ देते हैं
access control से लेकर validation और state management तक सब कुछ सरल है। app तेज़, responsive, modern, SEO-friendly है, और production में हजारों लोगों को serve कर रहा है
आखिर कहीं न कहीं schema होता ही है। वह database system में define हो सकता है, या ORM model में define हो सकता है। लेकिन बड़े projects में schema को database system या ORM में रखने से बहुत कठिन समस्याएँ पैदा हो सकती हैं, इसलिए हम Zod और Protobuf इस्तेमाल करते हैं। मुझे लगता है Protobuf को भी Zod या किसी समान चीज़ से पूरी तरह replace किया जा सकता है
UK Post Office scandal में Horizon नाम का IT system शामिल था: https://en.wikipedia.org/wiki/British_Post_Office_scandal
details पढ़ने पर लगा कि Zod जैसी schema validation होती तो शायद इस scandal को रोकने में मदद मिल सकती थी। class action court documents के technical appendix में भी schema के इस्तेमाल की अनुपस्थिति का ज़िक्र है: https://en.wikipedia.org/wiki/Bates_%26_Others_v_Post_Office...
अभी तो ऐसा लग रहा है जैसे बहुत सारे defensive
ifstatements लिखते हैं। उससे भी बुरा, शायद सिर्फ HTML client-side form validation पर निर्भर करते होंमैं विशेषज्ञ नहीं हूँ, इसलिए सावधानी से कह रहा हूँ, लेकिन मुझे लगा कि JSON Schema schema-based है, इसलिए TypeScript के अलावा दूसरी भाषाओं में भी validator implement किया जा सकता है; इस लिहाज से यह अच्छा विकल्प हो सकता है
https://ajv.js.org ऐसी JSON Schema libraries में से एक है। Zod की तुलना में यह कैसा है, यह जानने की उत्सुकता है
चाहें तो इसे JSON converter की तरह भी इस्तेमाल कर सकते हैं। उदाहरण के लिए, ऐसी schema लिख सकते हैं जो string ले, verify करे कि वह ISO date string है या नहीं, और
Dateobject output करेअहम फर्क preprocessing और
refineहै। Zod में validation से पहले callback दिया जा सकता है, जो बहुत उपयोगी है लेकिन JSON में represent नहीं किया जा सकता। मसलन, date validation से पहलेMM/DD/YYYYकोDD/MM/YYYYमें बदलना उम्मीद से ज्यादा बार काम आता हैvalidation के लिए AJV इस्तेमाल कर सकते हैं या TypeBox का अपना schema validation system। दूसरा काफी तेज़ है, लेकिन सिर्फ synchronous support करता है; AJV में database check जैसी asynchronous validation options हैं
इस topic के आसपास की negative प्रतिक्रिया चौंकाने वाली है
मैंने Zod v4 के शुरुआती version को test किया था और नया API पसंद आया था, लेकिन migration path कैसा होगा, इसे लेकर बहुत चिंतित था। मैं तो इसे बिल्कुल नए package name से release करने का सुझाव देने की सोच रहा था
लेकिन author का approach समझदारी भरा है। यह मेरे जैसे लोगों को v4 तुरंत अपनाने देता है, बिना सभी dependencies के update होने का इंतज़ार किए
मैंने अभी-अभी एक नए project में Zod adopt करना शुरू किया है, और इससे बेहतर timing नहीं हो सकती थी
अभी जो दिख रहा है उसके आधार पर, v4 पर जाने के लिए सचमुच बहुत कुछ बदलना पड़ता