[{"data":1,"prerenderedAt":783},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fsecurity":335,"\u002Fguides\u002Fsecurity-surround":778},[4,27,73,95,121,135,305,331],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,22],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":23,"path":24,"stem":25},"MSRV","\u002Fgetting-started\u002Fmsrv","1.getting-started\u002F9.msrv",false,{"title":28,"icon":29,"path":30,"stem":31,"children":32,"page":26},"Schemas","i-lucide-shapes","\u002Fschemas","2.schemas",[33,37,41,45,49,53,57,61,65,69],{"title":34,"path":35,"stem":36},"Strings","\u002Fschemas\u002Fstrings","2.schemas\u002F1.strings",{"title":38,"path":39,"stem":40},"Custom rules","\u002Fschemas\u002Frules","2.schemas\u002F10.rules",{"title":42,"path":43,"stem":44},"Numbers","\u002Fschemas\u002Fnumbers","2.schemas\u002F2.numbers",{"title":46,"path":47,"stem":48},"Booleans, literals and enums","\u002Fschemas\u002Fprimitives","2.schemas\u002F3.primitives",{"title":50,"path":51,"stem":52},"Dates and times","\u002Fschemas\u002Fdates","2.schemas\u002F4.dates",{"title":54,"path":55,"stem":56},"Collections","\u002Fschemas\u002Fcollections","2.schemas\u002F5.collections",{"title":58,"path":59,"stem":60},"Dynamic objects","\u002Fschemas\u002Fobjects","2.schemas\u002F6.objects",{"title":62,"path":63,"stem":64},"Modifiers","\u002Fschemas\u002Fmodifiers","2.schemas\u002F7.modifiers",{"title":66,"path":67,"stem":68},"Combinators","\u002Fschemas\u002Fcombinators","2.schemas\u002F8.combinators",{"title":70,"path":71,"stem":72},"Other types","\u002Fschemas\u002Fspecial-types","2.schemas\u002F9.special-types",{"title":74,"icon":75,"path":76,"stem":77,"children":78,"page":26},"Structs","i-lucide-braces","\u002Fstructs","3.structs",[79,83,87,91],{"title":80,"path":81,"stem":82},"schema! macro","\u002Fstructs\u002Fschema-macro","3.structs\u002F1.schema-macro",{"title":84,"path":85,"stem":86},"#[derive(Validate)]","\u002Fstructs\u002Fderive","3.structs\u002F2.derive",{"title":88,"path":89,"stem":90},"Parse vs validate","\u002Fstructs\u002Fparse-vs-validate","3.structs\u002F3.parse-vs-validate",{"title":92,"path":93,"stem":94},"Lenient parsing","\u002Fstructs\u002Flenient","3.structs\u002F4.lenient",{"title":96,"icon":97,"path":98,"stem":99,"children":100,"page":26},"Errors","i-lucide-triangle-alert","\u002Ferrors","4.errors",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Error model","\u002Ferrors\u002Foverview","4.errors\u002F1.overview",{"title":106,"path":107,"stem":108},"Issue codes","\u002Ferrors\u002Fissue-codes","4.errors\u002F2.issue-codes",{"title":110,"path":111,"stem":112},"Formatting","\u002Ferrors\u002Fformatting","4.errors\u002F3.formatting",{"title":114,"path":115,"stem":116},"Custom messages","\u002Ferrors\u002Fcustom-messages","4.errors\u002F4.custom-messages",{"title":118,"path":119,"stem":120},"Translations","\u002Ferrors\u002Fi18n","4.errors\u002F5.i18n",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":26},"OpenAPI","i-lucide-file-json","\u002Fopenapi","5.openapi",[127,131],{"title":128,"path":129,"stem":130},"JSON Schema and OpenAPI","\u002Fopenapi\u002Fjson-schema","5.openapi\u002F1.json-schema",{"title":132,"path":133,"stem":134},"Schema diff","\u002Fopenapi\u002Fdiff","5.openapi\u002F2.diff",{"title":136,"icon":137,"path":138,"stem":139,"children":140,"page":26},"Integrations","i-lucide-plug","\u002Fintegrations","6.integrations",[141,191,209,223,245,259,273,291],{"title":142,"icon":143,"path":144,"stem":145,"children":146,"page":26},"Web frameworks","i-lucide-globe","\u002Fintegrations\u002Fweb","6.integrations\u002F1.web",[147,151,155,159,163,167,171,175,179,183,187],{"title":148,"path":149,"stem":150},"Web adapters overview","\u002Fintegrations\u002Fweb\u002Foverview","6.integrations\u002F1.web\u002F01.overview",{"title":152,"path":153,"stem":154},"vld-axum","\u002Fintegrations\u002Fweb\u002Faxum","6.integrations\u002F1.web\u002F02.axum",{"title":156,"path":157,"stem":158},"vld-actix","\u002Fintegrations\u002Fweb\u002Factix","6.integrations\u002F1.web\u002F03.actix",{"title":160,"path":161,"stem":162},"vld-ntex","\u002Fintegrations\u002Fweb\u002Fntex","6.integrations\u002F1.web\u002F04.ntex",{"title":164,"path":165,"stem":166},"vld-poem","\u002Fintegrations\u002Fweb\u002Fpoem","6.integrations\u002F1.web\u002F05.poem",{"title":168,"path":169,"stem":170},"vld-rama","\u002Fintegrations\u002Fweb\u002Frama","6.integrations\u002F1.web\u002F06.rama",{"title":172,"path":173,"stem":174},"vld-rocket","\u002Fintegrations\u002Fweb\u002Frocket","6.integrations\u002F1.web\u002F07.rocket",{"title":176,"path":177,"stem":178},"vld-salvo","\u002Fintegrations\u002Fweb\u002Fsalvo","6.integrations\u002F1.web\u002F08.salvo",{"title":180,"path":181,"stem":182},"vld-tower","\u002Fintegrations\u002Fweb\u002Ftower","6.integrations\u002F1.web\u002F09.tower",{"title":184,"path":185,"stem":186},"vld-warp","\u002Fintegrations\u002Fweb\u002Fwarp","6.integrations\u002F1.web\u002F10.warp",{"title":188,"path":189,"stem":190},"vld-tonic","\u002Fintegrations\u002Fweb\u002Ftonic","6.integrations\u002F1.web\u002F11.tonic",{"title":192,"icon":193,"path":194,"stem":195,"children":196,"page":26},"OpenAPI and JSON Schema","i-lucide-file-code","\u002Fintegrations\u002Fopenapi","6.integrations\u002F2.openapi",[197,201,205],{"title":198,"path":199,"stem":200},"vld-utoipa","\u002Fintegrations\u002Fopenapi\u002Futoipa","6.integrations\u002F2.openapi\u002F1.utoipa",{"title":202,"path":203,"stem":204},"vld-schemars","\u002Fintegrations\u002Fopenapi\u002Fschemars","6.integrations\u002F2.openapi\u002F2.schemars",{"title":206,"path":207,"stem":208},"vld-aide","\u002Fintegrations\u002Fopenapi\u002Faide","6.integrations\u002F2.openapi\u002F3.aide",{"title":210,"icon":211,"path":212,"stem":213,"children":214,"page":26},"Codegen and test data","i-lucide-wand","\u002Fintegrations\u002Fcodegen","6.integrations\u002F3.codegen",[215,219],{"title":216,"path":217,"stem":218},"vld-ts","\u002Fintegrations\u002Fcodegen\u002Fts","6.integrations\u002F3.codegen\u002F1.ts",{"title":220,"path":221,"stem":222},"vld-fake","\u002Fintegrations\u002Fcodegen\u002Ffake","6.integrations\u002F3.codegen\u002F2.fake",{"title":224,"icon":225,"path":226,"stem":227,"children":228,"page":26},"Databases","i-lucide-database","\u002Fintegrations\u002Fdatabase","6.integrations\u002F4.database",[229,233,237,241],{"title":230,"path":231,"stem":232},"vld-sqlx","\u002Fintegrations\u002Fdatabase\u002Fsqlx","6.integrations\u002F4.database\u002F1.sqlx",{"title":234,"path":235,"stem":236},"vld-diesel","\u002Fintegrations\u002Fdatabase\u002Fdiesel","6.integrations\u002F4.database\u002F2.diesel",{"title":238,"path":239,"stem":240},"vld-sea","\u002Fintegrations\u002Fdatabase\u002Fsea-orm","6.integrations\u002F4.database\u002F3.sea-orm",{"title":242,"path":243,"stem":244},"vld-surrealdb","\u002Fintegrations\u002Fdatabase\u002Fsurrealdb","6.integrations\u002F4.database\u002F4.surrealdb",{"title":246,"icon":247,"path":248,"stem":249,"children":250,"page":26},"Messaging","i-lucide-mail","\u002Fintegrations\u002Fmessaging","6.integrations\u002F5.messaging",[251,255],{"title":252,"path":253,"stem":254},"vld-redis","\u002Fintegrations\u002Fmessaging\u002Fredis","6.integrations\u002F5.messaging\u002F1.redis",{"title":256,"path":257,"stem":258},"vld-lapin","\u002Fintegrations\u002Fmessaging\u002Flapin","6.integrations\u002F5.messaging\u002F2.lapin",{"title":260,"icon":261,"path":262,"stem":263,"children":264,"page":26},"Config and CLI","i-lucide-terminal","\u002Fintegrations\u002Fconfig-cli","6.integrations\u002F6.config-cli",[265,269],{"title":266,"path":267,"stem":268},"vld-config","\u002Fintegrations\u002Fconfig-cli\u002Fconfig","6.integrations\u002F6.config-cli\u002F1.config",{"title":270,"path":271,"stem":272},"vld-clap","\u002Fintegrations\u002Fconfig-cli\u002Fclap","6.integrations\u002F6.config-cli\u002F2.clap",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":26},"UI frameworks","i-lucide-monitor","\u002Fintegrations\u002Fui","6.integrations\u002F7.ui",[279,283,287],{"title":280,"path":281,"stem":282},"vld-dioxus","\u002Fintegrations\u002Fui\u002Fdioxus","6.integrations\u002F7.ui\u002F1.dioxus",{"title":284,"path":285,"stem":286},"vld-leptos","\u002Fintegrations\u002Fui\u002Fleptos","6.integrations\u002F7.ui\u002F2.leptos",{"title":288,"path":289,"stem":290},"vld-tauri","\u002Fintegrations\u002Fui\u002Ftauri","6.integrations\u002F7.ui\u002F3.tauri",{"title":292,"icon":293,"path":294,"stem":295,"children":296,"page":26},"Shared crates","i-lucide-package","\u002Fintegrations\u002Fshared","6.integrations\u002F8.shared",[297,301],{"title":298,"path":299,"stem":300},"vld-http-common","\u002Fintegrations\u002Fshared\u002Fhttp-common","6.integrations\u002F8.shared\u002F1.http-common",{"title":302,"path":303,"stem":304},"vld-integration-common","\u002Fintegrations\u002Fshared\u002Fintegration-common","6.integrations\u002F8.shared\u002F2.integration-common",{"title":306,"icon":307,"path":308,"stem":309,"children":310,"page":26},"Guides","i-lucide-book-open","\u002Fguides","7.guides",[311,315,319,323,327],{"title":312,"path":313,"stem":314},"Migration","\u002Fguides\u002Fmigration","7.guides\u002F1.migration",{"title":316,"path":317,"stem":318},"Security notes","\u002Fguides\u002Fsecurity","7.guides\u002F2.security",{"title":320,"path":321,"stem":322},"Performance","\u002Fguides\u002Fperformance","7.guides\u002F3.performance",{"title":324,"path":325,"stem":326},"Contributing","\u002Fguides\u002Fcontributing","7.guides\u002F4.contributing",{"title":328,"path":329,"stem":330},"FAQ","\u002Fguides\u002Ffaq","7.guides\u002F5.faq",{"title":332,"path":333,"stem":334},"Changelog","\u002Fchangelog","9.changelog",{"id":336,"title":316,"body":337,"description":771,"extension":772,"links":773,"meta":774,"navigation":775,"path":317,"seo":776,"stem":318,"__hash__":777},"docs\u002F7.guides\u002F2.security.md",{"type":338,"value":339,"toc":762},"minimark",[340,344,349,365,398,401,523,554,574,578,610,619,623,640,656,660,663,691,698,702,726,730,740,744,758],[341,342,343],"p",{},"vld is usually the first code that touches untrusted input. These are the places where a schema alone is not enough or where the defaults matter.",[345,346,348],"h2",{"id":347},"filesystem-paths-and-files","Filesystem paths and files",[341,350,351,355,356,359,360,364],{},[352,353,354],"code",{},"vld::path()"," and ",[352,357,358],{},"vld::file()"," check the input against the ",[361,362,363],"strong",{},"server's"," filesystem. Without a base directory:",[366,367,368,376,389],"ul",{},[369,370,371,372,375],"li",{},"any absolute path or ",[352,373,374],{},".."," is accepted;",[369,377,378,381,382,355,385,388],{},[352,379,380],{},"exists()",", ",[352,383,384],{},"file()",[352,386,387],{},"dir()"," reveal to the client whether arbitrary paths exist;",[369,390,391,393,394,397],{},[352,392,358],{}," opens and reads whatever file the client names (",[352,395,396],{},"{\"path\": \"\u002Fetc\u002Fpasswd\"}",").",[341,399,400],{},"Always confine user-supplied paths:",[402,403,408],"pre",{"className":404,"code":405,"language":406,"meta":407,"style":407},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","let avatar = vld::file()\n    .within(\"\u002Fsrv\u002Fuploads\")\n    .max_size(5 * 1024 * 1024)\n    .media_types(&[\"image\u002Fpng\", \"image\u002Fjpeg\"]);\n","rust","",[352,409,410,441,465,491],{"__ignoreMap":407},[411,412,415,419,423,427,431,434,438],"span",{"class":413,"line":414},"line",1,[411,416,418],{"class":417},"spNyl","let",[411,420,422],{"class":421},"sTEyZ"," avatar ",[411,424,426],{"class":425},"sMK4o","=",[411,428,430],{"class":429},"sBMFI"," vld",[411,432,433],{"class":425},"::",[411,435,437],{"class":436},"s2Zo4","file",[411,439,440],{"class":425},"()\n",[411,442,444,447,450,453,456,460,462],{"class":413,"line":443},2,[411,445,446],{"class":425},"    .",[411,448,449],{"class":436},"within",[411,451,452],{"class":425},"(",[411,454,455],{"class":425},"\"",[411,457,459],{"class":458},"sfazB","\u002Fsrv\u002Fuploads",[411,461,455],{"class":425},[411,463,464],{"class":425},")\n",[411,466,468,470,473,475,479,482,485,487,489],{"class":413,"line":467},3,[411,469,446],{"class":425},[411,471,472],{"class":436},"max_size",[411,474,452],{"class":425},[411,476,478],{"class":477},"sbssI","5",[411,480,481],{"class":425}," *",[411,483,484],{"class":477}," 1024",[411,486,481],{"class":425},[411,488,484],{"class":477},[411,490,464],{"class":425},[411,492,494,496,499,502,504,507,509,512,515,518,520],{"class":413,"line":493},4,[411,495,446],{"class":425},[411,497,498],{"class":436},"media_types",[411,500,501],{"class":425},"(&[",[411,503,455],{"class":425},[411,505,506],{"class":458},"image\u002Fpng",[411,508,455],{"class":425},[411,510,511],{"class":425},",",[411,513,514],{"class":425}," \"",[411,516,517],{"class":458},"image\u002Fjpeg",[411,519,455],{"class":425},[411,521,522],{"class":425},"]);\n",[341,524,525,528,529,381,532,534,535,381,538,541,542,545,546,549,550,553],{},[352,526,527],{},"within(base)"," resolves ",[352,530,531],{},".",[352,533,374],{}," and the symlinks of existing ancestors before checking containment, so ",[352,536,537],{},"\"..\u002Fetc\u002Fx\"",[352,539,540],{},"\"\u002Fsrv\u002Fuploads\u002F..\u002Fetc\u002Fx\""," and a symlink pointing outside are rejected (",[352,543,544],{},"path_outside_base","), even when the target does not exist. It returns ",[352,547,548],{},"base.join(input)",", so later file operations use the checked path. File reads stop after ",[352,551,552],{},"max_size + 1"," bytes.",[555,556,557],"note",{},[341,558,559,561,562,565,566,569,570,573],{},[352,560,449],{}," is a lexical check plus symlink resolution at validation time. If an attacker can create symlinks inside ",[352,563,564],{},"base"," between validation and use, open the file with OS-level protections (",[352,567,568],{},"openat2"," with ",[352,571,572],{},"RESOLVE_BENEATH",", a chroot or a container) as well.",[345,575,577],{"id":576},"urls","URLs",[341,579,580,583,584,587,588,591,592,355,595,598,599,602,603,606,607,531],{},[352,581,582],{},"string().url()"," accepts any ",[352,585,586],{},"http"," \u002F ",[352,589,590],{},"https"," URL, including ",[352,593,594],{},"http:\u002F\u002Flocalhost",[352,596,597],{},"http:\u002F\u002F10.0.0.1",". If your server fetches the URL (webhooks, link previews, image proxies), use ",[352,600,601],{},"url_strict()"," (feature ",[352,604,605],{},"string-advanced","): it rejects localhost, private, loopback, link-local and unspecified addresses, including IPv4-mapped IPv6 forms such as ",[352,608,609],{},"http:\u002F\u002F[::ffff:127.0.0.1]",[341,611,612,614,615,618],{},[352,613,601],{}," checks the URL ",[361,616,617],{},"text",". A public hostname can still resolve to a private address (DNS rebinding), so an SSRF-sensitive fetcher should also check the resolved IP before connecting.",[345,620,622],{"id":621},"request-bodies","Request bodies",[341,624,625,626,629,630,633,634,639],{},"All web adapters cap JSON and form bodies at ",[361,627,628],{},"2 MiB"," by default and answer ",[361,631,632],{},"413"," above it, without buffering more. Raise the limit only for the routes that need it; see the ",[635,636,638],"a",{"href":637},"\u002Fintegrations\u002Fweb\u002Foverview#body-limits","body limits table",". Form bodies are limited to 1000 fields.",[341,641,642,643,381,646,381,649,355,652,655],{},"Set limits on collections inside the body too: ",[352,644,645],{},"vld::array(..).max_len(n)",[352,647,648],{},"vld::record(..).max_keys(n)",[352,650,651],{},"vld::string().max(n)",[352,653,654],{},"vld::json_value().max_depth(n)",". A 2 MiB body can still hold a million tiny array items.",[345,657,659],{"id":658},"headers-and-cookies","Headers and cookies",[341,661,662],{},"The adapters already defend against two classic tricks:",[366,664,665,680],{},[369,666,667,668,671,672,675,676,679],{},"Header names containing ",[352,669,670],{},"_"," are ignored, so ",[352,673,674],{},"x_user: admin"," cannot fill a field meant for ",[352,677,678],{},"X-User"," behind a proxy that only strips the dash form.",[369,681,682,683,686,687,690],{},"When a cookie name appears more than once (across all ",[352,684,685],{},"Cookie"," headers), the ",[361,688,689],{},"first"," value wins, which defeats cookie tossing from a sibling subdomain.",[341,692,693,694,531],{},"Details are in the ",[635,695,697],{"href":696},"\u002Fintegrations\u002Fweb\u002Foverview#headers","web overview",[345,699,701],{"id":700},"error-output","Error output",[341,703,704,705,381,708,355,711,713,714,717,718,721,722,725],{},"Issues carry the received value (truncated to 100 characters, cut on character boundaries). The default web error body contains only ",[352,706,707],{},"path",[352,709,710],{},"message",[352,712,352],{},", not the value. If you return ",[352,715,716],{},"VldError"," or ",[352,719,720],{},"ValidationIssue"," as JSON yourself, remember that ",[352,723,724],{},"received"," echoes client input; strip it for secrets such as passwords and tokens.",[345,727,729],{"id":728},"regex","Regex",[341,731,732,735,736,739],{},[352,733,734],{},"vld::string().pattern()"," uses ",[352,737,738],{},"regex-lite",", which has no backtracking and runs in linear time, so a pattern cannot be used for ReDoS. Patterns are compiled once, when the schema is built; the built-in formats use no regex at all.",[345,741,743],{"id":742},"fuzzing","Fuzzing",[341,745,746,747,750,751,754,755,531],{},"The ",[352,748,749],{},"fuzz\u002F"," directory has ",[352,752,753],{},"cargo-fuzz"," targets for the ISO date parsers, string formats, URL \u002F form \u002F cookie decoding and error truncation. See ",[635,756,324],{"href":757},"\u002Fguides\u002Fcontributing#fuzzing",[759,760,761],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":407,"searchDepth":443,"depth":467,"links":763},[764,765,766,767,768,769,770],{"id":347,"depth":443,"text":348},{"id":576,"depth":443,"text":577},{"id":621,"depth":443,"text":622},{"id":658,"depth":443,"text":659},{"id":700,"depth":443,"text":701},{"id":728,"depth":443,"text":729},{"id":742,"depth":443,"text":743},"Validating untrusted input safely — filesystem paths, URLs, body limits, headers, cookies and error output.","md",null,{},true,{"title":316,"description":771},"oXnOOrgBvH-_OkNFOgPr3JQtp-B-fxxZy-cesKiWoI8",[779,781],{"title":312,"path":313,"stem":314,"description":780,"children":-1},"Every breaking change in vld 0.6 and 0.5, with before\u002Fafter code.",{"title":320,"path":321,"stem":322,"description":782,"children":-1},"How vld avoids repeated work, and how to keep your schemas fast.",1794036360429]