[{"data":1,"prerenderedAt":1039},["ShallowReactive",2],{"content-\u002Fdocs\u002Fschemas\u002Foptional-nullable":3},{"id":4,"title":5,"body":6,"description":1021,"extension":1022,"meta":1023,"metaRows":1024,"navigation":166,"path":1034,"seo":1035,"source":1036,"stem":1037,"__hash__":1038},"docs\u002Fdocs\u002Fschemas\u002Foptional-nullable.md","Optional, nullable, defaulted",{"type":7,"value":8,"toc":1004},"minimark",[9,13,37,40,43,48,53,216,219,301,307,331,341,351,362,367,396,400,416,425,447,456,465,478,486,495,523,537,548,556,560,563,640,650,658,803,821,829,844,932,965,969,1000],[10,11,5],"h1",{"id":12},"optional-nullable-defaulted",[14,15,16],"blockquote",{},[17,18,19,20,24,25,28,29,32,33,36],"p",{},"Three modifiers that look similar and mean three different things: ",[21,22,23],"code",{},".optional()"," lets the slot stay absent, ",[21,26,27],{},".nullable()"," makes ",[21,30,31],{},"null"," a valid value, ",[21,34,35],{},".default(x)"," fills the slot when input is missing.",[38,39],"docs-meta-table",{},[17,41,42],{},"The demo runs the same field through all three modifiers side by side. Watch how each one reports its value when nothing has been typed, and how each one validates when you do start typing.",[44,45],"docs-demo",{"label":46,"slug":47},"Optional & Nullable Demo","optional-nullable",[49,50,52],"h2",{"id":51},"the-trichotomy-at-a-glance","The trichotomy at a glance",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-ts shiki shiki-themes github-light github-dark","const schema = z.object({\n  optional: z.string().optional(), \u002F\u002F string | undefined\n  nullable: z.string().nullable(), \u002F\u002F string | null\n  defaulted: z.string().default('seed'), \u002F\u002F string\n})\n\nconst form = useForm({ schema })\n\nform.values.optional \u002F\u002F undefined (slot may be absent)\nform.values.nullable \u002F\u002F '' (synthesized falsy: string default '')\nform.values.defaulted \u002F\u002F 'seed' (schema-declared default applied)\n","ts","",[21,61,62,89,111,129,155,161,168,184,189,198,207],{"__ignoreMap":59},[63,64,67,71,75,78,82,86],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"szBVR","const",[63,72,74],{"class":73},"sj4cs"," schema",[63,76,77],{"class":69}," =",[63,79,81],{"class":80},"sVt8B"," z.",[63,83,85],{"class":84},"sScJk","object",[63,87,88],{"class":80},"({\n",[63,90,92,95,98,101,104,107],{"class":65,"line":91},2,[63,93,94],{"class":80},"  optional: z.",[63,96,97],{"class":84},"string",[63,99,100],{"class":80},"().",[63,102,103],{"class":84},"optional",[63,105,106],{"class":80},"(), ",[63,108,110],{"class":109},"sJ8bj","\u002F\u002F string | undefined\n",[63,112,114,117,119,121,124,126],{"class":65,"line":113},3,[63,115,116],{"class":80},"  nullable: z.",[63,118,97],{"class":84},[63,120,100],{"class":80},[63,122,123],{"class":84},"nullable",[63,125,106],{"class":80},[63,127,128],{"class":109},"\u002F\u002F string | null\n",[63,130,132,135,137,139,142,145,149,152],{"class":65,"line":131},4,[63,133,134],{"class":80},"  defaulted: z.",[63,136,97],{"class":84},[63,138,100],{"class":80},[63,140,141],{"class":84},"default",[63,143,144],{"class":80},"(",[63,146,148],{"class":147},"sZZnC","'seed'",[63,150,151],{"class":80},"), ",[63,153,154],{"class":109},"\u002F\u002F string\n",[63,156,158],{"class":65,"line":157},5,[63,159,160],{"class":80},"})\n",[63,162,164],{"class":65,"line":163},6,[63,165,167],{"emptyLinePlaceholder":166},true,"\n",[63,169,171,173,176,178,181],{"class":65,"line":170},7,[63,172,70],{"class":69},[63,174,175],{"class":73}," form",[63,177,77],{"class":69},[63,179,180],{"class":84}," useForm",[63,182,183],{"class":80},"({ schema })\n",[63,185,187],{"class":65,"line":186},8,[63,188,167],{"emptyLinePlaceholder":166},[63,190,192,195],{"class":65,"line":191},9,[63,193,194],{"class":80},"form.values.optional ",[63,196,197],{"class":109},"\u002F\u002F undefined (slot may be absent)\n",[63,199,201,204],{"class":65,"line":200},10,[63,202,203],{"class":80},"form.values.nullable ",[63,205,206],{"class":109},"\u002F\u002F '' (synthesized falsy: string default '')\n",[63,208,210,213],{"class":65,"line":209},11,[63,211,212],{"class":80},"form.values.defaulted ",[63,214,215],{"class":109},"\u002F\u002F 'seed' (schema-declared default applied)\n",[17,217,218],{},"Each modifier sends a different signal at validate time:",[220,221,222,238],"table",{},[223,224,225],"thead",{},[226,227,228,232,235],"tr",{},[229,230,231],"th",{},"Modifier",[229,233,234],{},"Empty case is valid?",[229,236,237],{},"Empty case looks like",[239,240,241,256,268,281],"tbody",{},[226,242,243,248,251],{},[244,245,246],"td",{},[21,247,23],{},[244,249,250],{},"yes",[244,252,253],{},[21,254,255],{},"undefined",[226,257,258,262,264],{},[244,259,260],{},[21,261,27],{},[244,263,250],{},[244,265,266],{},[21,267,31],{},[226,269,270,274,276],{},[244,271,272],{},[21,273,35],{},[244,275,250],{},[244,277,278],{},[21,279,280],{},"x",[226,282,283,286,289],{},[244,284,285],{},"(plain)",[244,287,288],{},"no",[244,290,291,294,295,294,298],{},[21,292,293],{},"''"," \u002F ",[21,296,297],{},"0",[21,299,300],{},"false",[49,302,304,306],{"id":303},"optional-this-slot-may-be-absent",[21,305,23],{},": \"this slot may be absent\"",[54,308,310],{"className":56,"code":309,"language":58,"meta":59,"style":59},"z.object({ bio: z.string().optional() })\n",[21,311,312],{"__ignoreMap":59},[63,313,314,317,319,322,324,326,328],{"class":65,"line":66},[63,315,316],{"class":80},"z.",[63,318,85],{"class":84},[63,320,321],{"class":80},"({ bio: z.",[63,323,97],{"class":84},[63,325,100],{"class":80},[63,327,103],{"class":84},[63,329,330],{"class":80},"() })\n",[17,332,333,336,337,340],{},[21,334,335],{},"form.values.bio"," reads ",[21,338,339],{},"string | undefined",". The schema accepts both:",[342,343,344,348],"ul",{},[345,346,347],"li",{},"The slot being absent (the field never gets a value).",[345,349,350],{},"A typed string.",[17,352,353,354,356,357,361],{},"Use ",[21,355,23],{}," when ",[358,359,360],"em",{},"not filling the field is a valid choice",": a \"tell us more about yourself\" prompt that's genuinely skippable.",[363,364,366],"h3",{"id":365},"the-empty-input-cycle","The empty-input cycle",[17,368,369,370,372,373,376,377,379,380,382,383,386,387,389,390,392,393,395],{},"When a user clears an ",[21,371,23],{}," input via ",[21,374,375],{},"v-register",", storage returns to ",[21,378,255],{}," rather than ",[21,381,293],{},". The schema's \"absent\" path stays reachable through the DOM after any interaction, which closes a real validation hole: typing invalid text into an optional field with a strict inner check (e.g. ",[21,384,385],{},"z.url().optional()",") and then clearing the input also clears the validation error. Without this contract, ",[21,388,293],{}," would land in storage and parse would fail forever (",[21,391,293],{}," is neither ",[21,394,255],{}," nor a valid URL), leaving the user stuck.",[44,397],{"label":398,"slug":399},"Optional Clear Cycle Demo","optional-clear-cycle",[17,401,402,403,405,406,408,409,412,413,415],{},"Required string leaves keep ",[21,404,293],{}," on clear, because ",[21,407,293],{}," IS a valid string and the schema can decide what to do with it (accept, fail ",[21,410,411],{},"min(1)",", etc.). The optional escape only fires when the schema admits ",[21,414,255],{}," at that leaf.",[49,417,419,421,422,424],{"id":418},"nullable-null-is-an-explicit-signal",[21,420,27],{},": \"",[21,423,31],{}," is an explicit signal\"",[54,426,428],{"className":56,"code":427,"language":58,"meta":59,"style":59},"z.object({ assignedTo: z.string().nullable() })\n",[21,429,430],{"__ignoreMap":59},[63,431,432,434,436,439,441,443,445],{"class":65,"line":66},[63,433,316],{"class":80},[63,435,85],{"class":84},[63,437,438],{"class":80},"({ assignedTo: z.",[63,440,97],{"class":84},[63,442,100],{"class":80},[63,444,123],{"class":84},[63,446,330],{"class":80},[17,448,449,336,452,455],{},[21,450,451],{},"form.values.assignedTo",[21,453,454],{},"string | null",". The schema accepts:",[342,457,458,463],{},[345,459,460,462],{},[21,461,31],{},", meaning \"explicitly unassigned.\"",[345,464,350],{},[17,466,467,468,470,471,474,475,477],{},"But NOT ",[21,469,255],{},". The slot is required to hold ",[358,472,473],{},"some"," value; ",[21,476,31],{}," is the signal you've decided \"no value here on purpose.\"",[17,479,353,480,356,482,485],{},[21,481,27],{},[358,483,484],{},"unassigned is a meaningful state"," that the data model needs to distinguish from \"not yet decided\" or \"empty string.\"",[49,487,489,491,492,494],{"id":488},"defaultx-fill-the-slot-with-x-when-input-is-missing",[21,490,35],{},": \"fill the slot with ",[21,493,280],{}," when input is missing\"",[54,496,498],{"className":56,"code":497,"language":58,"meta":59,"style":59},"z.object({ priority: z.string().default('normal') })\n",[21,499,500],{"__ignoreMap":59},[63,501,502,504,506,509,511,513,515,517,520],{"class":65,"line":66},[63,503,316],{"class":80},[63,505,85],{"class":84},[63,507,508],{"class":80},"({ priority: z.",[63,510,97],{"class":84},[63,512,100],{"class":80},[63,514,141],{"class":84},[63,516,144],{"class":80},[63,518,519],{"class":147},"'normal'",[63,521,522],{"class":80},") })\n",[17,524,525,336,528,530,531,533,534,536],{},[21,526,527],{},"form.values.priority",[21,529,97],{},": no union, no ",[21,532,31],{},", no ",[21,535,255],{},". The schema:",[342,538,539,545],{},[345,540,541,542,544],{},"Applies ",[21,543,519],{}," when no input is supplied.",[345,546,547],{},"Otherwise uses whatever the caller passed.",[17,549,353,550,356,552,555],{},[21,551,35],{},[358,553,554],{},"every record needs a value and you have a sensible starting point",": the \"Priority\" dropdown that should start at \"Normal,\" the \"Notifications\" toggle that should start on.",[49,557,559],{"id":558},"stacking-modifiers","Stacking modifiers",[17,561,562],{},"The modifiers compose, but the order changes the meaning:",[54,564,566],{"className":56,"code":565,"language":58,"meta":59,"style":59},"z.string().optional().default('seed') \u002F\u002F (string | undefined).default → string\nz.string().default('seed').optional() \u002F\u002F string.optional → string | undefined\nz.string().nullable().default(null) \u002F\u002F (string | null).default → string | null\n",[21,567,568,592,617],{"__ignoreMap":59},[63,569,570,572,574,576,578,580,582,584,586,589],{"class":65,"line":66},[63,571,316],{"class":80},[63,573,97],{"class":84},[63,575,100],{"class":80},[63,577,103],{"class":84},[63,579,100],{"class":80},[63,581,141],{"class":84},[63,583,144],{"class":80},[63,585,148],{"class":147},[63,587,588],{"class":80},") ",[63,590,591],{"class":109},"\u002F\u002F (string | undefined).default → string\n",[63,593,594,596,598,600,602,604,606,609,611,614],{"class":65,"line":91},[63,595,316],{"class":80},[63,597,97],{"class":84},[63,599,100],{"class":80},[63,601,141],{"class":84},[63,603,144],{"class":80},[63,605,148],{"class":147},[63,607,608],{"class":80},").",[63,610,103],{"class":84},[63,612,613],{"class":80},"() ",[63,615,616],{"class":109},"\u002F\u002F string.optional → string | undefined\n",[63,618,619,621,623,625,627,629,631,633,635,637],{"class":65,"line":113},[63,620,316],{"class":80},[63,622,97],{"class":84},[63,624,100],{"class":80},[63,626,123],{"class":84},[63,628,100],{"class":80},[63,630,141],{"class":84},[63,632,144],{"class":80},[63,634,31],{"class":73},[63,636,588],{"class":80},[63,638,639],{"class":109},"\u002F\u002F (string | null).default → string | null\n",[17,641,642,643,645,646,649],{},"For form ergonomics, ",[21,644,35],{}," last is the usual move; it peels the optionality back off, so ",[21,647,648],{},"form.values.\u003Cpath>"," reads as a concrete type.",[49,651,653,654,657],{"id":652},"what-formerrorspath-does-for-each","What ",[21,655,656],{},"form.errors.\u003Cpath>"," does for each",[54,659,661],{"className":56,"code":660,"language":58,"meta":59,"style":59},"const schema = z.object({\n  optional: z.string().optional(),\n  nullable: z.string().nullable(),\n  defaulted: z.string().default('seed'),\n  required: z.string().min(1, 'Name is required'),\n})\nconst form = useForm({ schema })\n\n\u002F\u002F Before any user input\nform.errors.optional \u002F\u002F undefined (empty slot is valid)\nform.errors.nullable \u002F\u002F undefined ('' satisfies z.string())\nform.errors.defaulted \u002F\u002F undefined ('seed' satisfies z.string())\nform.errors.required \u002F\u002F [...] (z.string().min(1) rejects '')\n",[21,662,663,677,690,702,719,744,748,760,764,769,777,785,794],{"__ignoreMap":59},[63,664,665,667,669,671,673,675],{"class":65,"line":66},[63,666,70],{"class":69},[63,668,74],{"class":73},[63,670,77],{"class":69},[63,672,81],{"class":80},[63,674,85],{"class":84},[63,676,88],{"class":80},[63,678,679,681,683,685,687],{"class":65,"line":91},[63,680,94],{"class":80},[63,682,97],{"class":84},[63,684,100],{"class":80},[63,686,103],{"class":84},[63,688,689],{"class":80},"(),\n",[63,691,692,694,696,698,700],{"class":65,"line":113},[63,693,116],{"class":80},[63,695,97],{"class":84},[63,697,100],{"class":80},[63,699,123],{"class":84},[63,701,689],{"class":80},[63,703,704,706,708,710,712,714,716],{"class":65,"line":131},[63,705,134],{"class":80},[63,707,97],{"class":84},[63,709,100],{"class":80},[63,711,141],{"class":84},[63,713,144],{"class":80},[63,715,148],{"class":147},[63,717,718],{"class":80},"),\n",[63,720,721,724,726,728,731,733,736,739,742],{"class":65,"line":157},[63,722,723],{"class":80},"  required: z.",[63,725,97],{"class":84},[63,727,100],{"class":80},[63,729,730],{"class":84},"min",[63,732,144],{"class":80},[63,734,735],{"class":73},"1",[63,737,738],{"class":80},", ",[63,740,741],{"class":147},"'Name is required'",[63,743,718],{"class":80},[63,745,746],{"class":65,"line":163},[63,747,160],{"class":80},[63,749,750,752,754,756,758],{"class":65,"line":170},[63,751,70],{"class":69},[63,753,175],{"class":73},[63,755,77],{"class":69},[63,757,180],{"class":84},[63,759,183],{"class":80},[63,761,762],{"class":65,"line":186},[63,763,167],{"emptyLinePlaceholder":166},[63,765,766],{"class":65,"line":191},[63,767,768],{"class":109},"\u002F\u002F Before any user input\n",[63,770,771,774],{"class":65,"line":200},[63,772,773],{"class":80},"form.errors.optional ",[63,775,776],{"class":109},"\u002F\u002F undefined (empty slot is valid)\n",[63,778,779,782],{"class":65,"line":209},[63,780,781],{"class":80},"form.errors.nullable ",[63,783,784],{"class":109},"\u002F\u002F undefined ('' satisfies z.string())\n",[63,786,788,791],{"class":65,"line":787},12,[63,789,790],{"class":80},"form.errors.defaulted ",[63,792,793],{"class":109},"\u002F\u002F undefined ('seed' satisfies z.string())\n",[63,795,797,800],{"class":65,"line":796},13,[63,798,799],{"class":80},"form.errors.required ",[63,801,802],{"class":109},"\u002F\u002F [...] (z.string().min(1) rejects '')\n",[17,804,805,806,809,810,812,813,816,817,820],{},"The errors flow from the schema; the modifiers shape what counts as empty. A required ",[21,807,808],{},"z.string()"," with no modifier sees ",[21,811,293],{}," and accepts it (an empty string ",[358,814,815],{},"is"," a string). Add ",[21,818,819],{},".min(1, …)"," to require a non-empty string; that's the schema speaking, not a side-channel.",[49,822,824,825,828],{"id":823},"when-to-reach-for-unset-instead","When to reach for ",[21,826,827],{},"unset"," instead",[17,830,831,833,834,836,837,840,841,843],{},[21,832,23],{}," and ",[21,835,27],{}," are schema-level; they declare that the empty case is type-valid. Sometimes you want a leaf that's ",[358,838,839],{},"type-required"," but starts in a deliberate \"no value yet\" state without changing the schema. That's ",[21,842,827],{},":",[54,845,847],{"className":56,"code":846,"language":58,"meta":59,"style":59},"import { unset } from 'attaform\u002Fzod'\n\nconst schema = z.object({ pickup: z.string().min(1, 'Required') })\nconst form = useForm({ schema, defaultValues: { pickup: unset } })\n\nform.fields.pickup.blank \u002F\u002F true\nform.errors.pickup \u002F\u002F [{ code: 'atta:no-value-supplied', … }]\n",[21,848,849,863,867,899,912,916,924],{"__ignoreMap":59},[63,850,851,854,857,860],{"class":65,"line":66},[63,852,853],{"class":69},"import",[63,855,856],{"class":80}," { unset } ",[63,858,859],{"class":69},"from",[63,861,862],{"class":147}," 'attaform\u002Fzod'\n",[63,864,865],{"class":65,"line":91},[63,866,167],{"emptyLinePlaceholder":166},[63,868,869,871,873,875,877,879,882,884,886,888,890,892,894,897],{"class":65,"line":113},[63,870,70],{"class":69},[63,872,74],{"class":73},[63,874,77],{"class":69},[63,876,81],{"class":80},[63,878,85],{"class":84},[63,880,881],{"class":80},"({ pickup: z.",[63,883,97],{"class":84},[63,885,100],{"class":80},[63,887,730],{"class":84},[63,889,144],{"class":80},[63,891,735],{"class":73},[63,893,738],{"class":80},[63,895,896],{"class":147},"'Required'",[63,898,522],{"class":80},[63,900,901,903,905,907,909],{"class":65,"line":131},[63,902,70],{"class":69},[63,904,175],{"class":73},[63,906,77],{"class":69},[63,908,180],{"class":84},[63,910,911],{"class":80},"({ schema, defaultValues: { pickup: unset } })\n",[63,913,914],{"class":65,"line":157},[63,915,167],{"emptyLinePlaceholder":166},[63,917,918,921],{"class":65,"line":163},[63,919,920],{"class":80},"form.fields.pickup.blank ",[63,922,923],{"class":109},"\u002F\u002F true\n",[63,925,926,929],{"class":65,"line":170},[63,927,928],{"class":80},"form.errors.pickup ",[63,930,931],{"class":109},"\u002F\u002F [{ code: 'atta:no-value-supplied', … }]\n",[17,933,934,936,937,940,941,944,945,948,949,955,956,964],{},[21,935,827],{}," joins the path to ",[21,938,939],{},"form.blankPaths",", which surfaces ",[21,942,943],{},"atta:no-value-supplied"," reactively when the schema is required. The schema stays strict; the consumer signals intent at the call site. The same sentinel works at containers, arrays, records, discriminated unions, wrappers, and the root: ",[21,946,947],{},"defaultValues: { profile: unset }"," recursively marks every primitive descendant. See ",[950,951,953],"a",{"href":952},"\u002Fdocs\u002Fwriting-and-mutating\u002Funset",[21,954,827],{}," for the full contract and ",[950,957,959,960,963],{"href":958},"\u002Fdocs\u002Fvalidation\u002Fblank","the ",[21,961,962],{},"blank"," field-state bit"," for the lifecycle.",[49,966,968],{"id":967},"where-to-next","Where to next",[342,970,971,985,992],{},[345,972,973,977,978,980,981,984],{},[950,974,976],{"href":975},"\u002Fdocs\u002Fschemas\u002Fdefaults","Defaults from the schema",": ",[21,979,35],{}," is the most common case; per-form ",[21,982,983],{},"defaultValues"," overlays it.",[345,986,987,991],{},[950,988,990],{"href":989},"\u002Fdocs\u002Fschemas\u002Fstorage-shape","How values are stored",": the per-wrapper read-shape policy in full.",[345,993,994,999],{},[950,995,996,997,963],{"href":958},"The ",[21,998,962],{},": the storage \u002F display side-channel that handles \"user supplied nothing\" without lying about the value.",[1001,1002,1003],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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":59,"searchDepth":91,"depth":91,"links":1005},[1006,1007,1011,1013,1015,1016,1018,1020],{"id":51,"depth":91,"text":52},{"id":303,"depth":91,"text":1008,"children":1009},".optional(): \"this slot may be absent\"",[1010],{"id":365,"depth":113,"text":366},{"id":418,"depth":91,"text":1012},".nullable(): \"null is an explicit signal\"",{"id":488,"depth":91,"text":1014},".default(x): \"fill the slot with x when input is missing\"",{"id":558,"depth":91,"text":559},{"id":652,"depth":91,"text":1017},"What form.errors.\u003Cpath> does for each",{"id":823,"depth":91,"text":1019},"When to reach for unset instead",{"id":967,"depth":91,"text":968},"Three modifiers, three different runtime behaviors. .optional() makes the slot absent, .nullable() makes null a valid value, .default(x) fills the slot when input is missing.","md",{},[1025,1028,1030,1032],{"label":1026,"value":1027},"Category","Conceptual",{"label":23,"value":1029,"kind":21},"inner | undefined",{"label":27,"value":1031,"kind":21},"inner | null",{"label":35,"value":1033,"kind":21},"inner, slot filled at mount","\u002Fdocs\u002Fschemas\u002Foptional-nullable",{"title":5,"description":1021},null,"docs\u002Fschemas\u002Foptional-nullable","A32qrWRyhsRXGTWsWyzfZMrnfPG-B7nTM8Ypl-ZIKvE",1780949757708]