[{"data":1,"prerenderedAt":3869},["ShallowReactive",2],{"blog-/blog/how-ive-been-trying-to-improve-mocking-with-zod":3},{"id":4,"title":5,"body":6,"date":3857,"description":3858,"extension":3859,"meta":3860,"navigation":256,"path":3861,"published":256,"seo":3862,"stem":3863,"tags":3864,"__hash__":3868},"blog/blog/how-ive-been-trying-to-improve-mocking-with-zod.md","How I've been trying to improve mocking with Zod",{"type":7,"value":8,"toc":3855},"minimark",[9,13,16,19,848,851,854,857,860,933,936,1159,1167,1435,1438,1441,1691,1694,1936,1939,1942,2197,2203,2213,3666,3669,3831,3837,3851],[10,11,12],"p",{},"If you're a Frontend Engineer, you've likely been in a situation where you've been required to start implementing a feature before the API that serves the back end portion of that feature exists. Engineers will often turn to mocking to enable parallel development (meaning both the front-end and back-end portions of the feature are developed in parallel).",[10,14,15],{},"Mocking however can come with some disadvantages. The first and most obvious is that mocks can drift from the actual implementation, causing them to be unreliable. A second problematic issues is that mocks can often be verbose; With mocks that contain a lot of data, it might be unclear as to what a certain mock response is actually mocking.",[10,17,18],{},"The below data is an example of some data you might find in a code-base:",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-typescript shiki shiki-themes vitesse-black","type Order = {\n  orderId: string;\n  customerInfo: CustomerInfo; // omitted these types for brevity\n  orderDate: string;\n  items: OrderItem[];\n  paymentInfo: PaymentInfo;\n  subtotal: number;\n  shippingCost: number;\n  tax: number;\n  totalAmount: number;\n  status: 'pending' | 'processing' | 'shipped' | 'delivered' | 'cancelled';\n  trackingNumber: string | null;\n};\n\nconst mockOrders: Order[] = [\n  {\n    orderId: \"ORD-2024-001\",\n    customerInfo: {\n      id: \"CUST-1234\",\n      name: \"Alice Johnson\",\n      email: \"alice.j@email.com\",\n      shippingAddress: {\n        street: \"123 Pine Street\",\n        city: \"Portland\",\n        state: \"OR\",\n        zipCode: \"97201\",\n        country: \"USA\"\n      }\n    },\n    orderDate: \"2024-03-15T14:30:00Z\",\n    items: [\n      {\n        productId: \"PROD-789\",\n        name: \"Organic Cotton T-Shirt\",\n        quantity: 2,\n        pricePerUnit: 29.99,\n        color: \"Navy\",\n        size: \"M\"\n      },\n      {\n        productId: \"PROD-456\",\n        name: \"Recycled Canvas Tote\",\n        quantity: 1,\n        pricePerUnit: 35.00,\n        color: \"Natural\"\n      }\n    ],\n    paymentInfo: {\n      method: \"credit_card\",\n      status: \"completed\",\n      transactionId: \"TXN-88776655\"\n    },\n    subtotal: 94.98,\n    shippingCost: 5.99,\n    tax: 9.50,\n    totalAmount: 110.47,\n    status: \"shipped\",\n    trackingNumber: \"1Z999AA1234567890\"\n  },\n  // Imagine more objects here, with various values changed...\n];\n","typescript","",[27,28,29,49,65,83,95,109,122,135,147,159,171,228,245,251,258,278,284,304,313,330,347,364,372,389,406,423,440,456,462,468,485,494,500,517,534,548,561,578,593,599,604,620,636,648,660,674,679,685,693,710,727,742,747,760,773,786,799,815,830,836,842],"code",{"__ignoreMap":25},[30,31,34,38,42,46],"span",{"class":32,"line":33},"line",1,[30,35,37],{"class":36},"s_wWq","type",[30,39,41],{"class":40},"syEag"," Order",[30,43,45],{"class":44},"sK117"," =",[30,47,48],{"class":44}," {\n",[30,50,52,56,59,62],{"class":32,"line":51},2,[30,53,55],{"class":54},"st-jp","  orderId",[30,57,58],{"class":44},": ",[30,60,61],{"class":40},"string",[30,63,64],{"class":44},";\n",[30,66,68,71,73,76,79],{"class":32,"line":67},3,[30,69,70],{"class":54},"  customerInfo",[30,72,58],{"class":44},[30,74,75],{"class":40},"CustomerInfo",[30,77,78],{"class":44},";",[30,80,82],{"class":81},"sux-A"," // omitted these types for brevity\n",[30,84,86,89,91,93],{"class":32,"line":85},4,[30,87,88],{"class":54},"  orderDate",[30,90,58],{"class":44},[30,92,61],{"class":40},[30,94,64],{"class":44},[30,96,98,101,103,106],{"class":32,"line":97},5,[30,99,100],{"class":54},"  items",[30,102,58],{"class":44},[30,104,105],{"class":40},"OrderItem",[30,107,108],{"class":44},"[];\n",[30,110,112,115,117,120],{"class":32,"line":111},6,[30,113,114],{"class":54},"  paymentInfo",[30,116,58],{"class":44},[30,118,119],{"class":40},"PaymentInfo",[30,121,64],{"class":44},[30,123,125,128,130,133],{"class":32,"line":124},7,[30,126,127],{"class":54},"  subtotal",[30,129,58],{"class":44},[30,131,132],{"class":40},"number",[30,134,64],{"class":44},[30,136,138,141,143,145],{"class":32,"line":137},8,[30,139,140],{"class":54},"  shippingCost",[30,142,58],{"class":44},[30,144,132],{"class":40},[30,146,64],{"class":44},[30,148,150,153,155,157],{"class":32,"line":149},9,[30,151,152],{"class":54},"  tax",[30,154,58],{"class":44},[30,156,132],{"class":40},[30,158,64],{"class":44},[30,160,162,165,167,169],{"class":32,"line":161},10,[30,163,164],{"class":54},"  totalAmount",[30,166,58],{"class":44},[30,168,132],{"class":40},[30,170,64],{"class":44},[30,172,174,177,179,183,187,189,192,194,197,199,201,203,206,208,210,212,215,217,219,221,224,226],{"class":32,"line":173},11,[30,175,176],{"class":54},"  status",[30,178,58],{"class":44},[30,180,182],{"class":181},"sNJcY","'",[30,184,186],{"class":185},"s7rlk","pending",[30,188,182],{"class":181},[30,190,191],{"class":44}," | ",[30,193,182],{"class":181},[30,195,196],{"class":185},"processing",[30,198,182],{"class":181},[30,200,191],{"class":44},[30,202,182],{"class":181},[30,204,205],{"class":185},"shipped",[30,207,182],{"class":181},[30,209,191],{"class":44},[30,211,182],{"class":181},[30,213,214],{"class":185},"delivered",[30,216,182],{"class":181},[30,218,191],{"class":44},[30,220,182],{"class":181},[30,222,223],{"class":185},"cancelled",[30,225,182],{"class":181},[30,227,64],{"class":44},[30,229,231,234,236,238,240,243],{"class":32,"line":230},12,[30,232,233],{"class":54},"  trackingNumber",[30,235,58],{"class":44},[30,237,61],{"class":40},[30,239,191],{"class":44},[30,241,242],{"class":36},"null",[30,244,64],{"class":44},[30,246,248],{"class":32,"line":247},13,[30,249,250],{"class":44},"};\n",[30,252,254],{"class":32,"line":253},14,[30,255,257],{"emptyLinePlaceholder":256},true,"\n",[30,259,261,264,267,269,272,275],{"class":32,"line":260},15,[30,262,263],{"class":36},"const ",[30,265,266],{"class":54},"mockOrders",[30,268,58],{"class":44},[30,270,271],{"class":40},"Order",[30,273,274],{"class":44},"[] =",[30,276,277],{"class":44}," [\n",[30,279,281],{"class":32,"line":280},16,[30,282,283],{"class":44},"  {\n",[30,285,287,291,293,296,299,301],{"class":32,"line":286},17,[30,288,290],{"class":289},"sm68I","    orderId",[30,292,58],{"class":44},[30,294,295],{"class":181},"\"",[30,297,298],{"class":185},"ORD-2024-001",[30,300,295],{"class":181},[30,302,303],{"class":44},",\n",[30,305,307,310],{"class":32,"line":306},18,[30,308,309],{"class":289},"    customerInfo",[30,311,312],{"class":44},": {\n",[30,314,316,319,321,323,326,328],{"class":32,"line":315},19,[30,317,318],{"class":289},"      id",[30,320,58],{"class":44},[30,322,295],{"class":181},[30,324,325],{"class":185},"CUST-1234",[30,327,295],{"class":181},[30,329,303],{"class":44},[30,331,333,336,338,340,343,345],{"class":32,"line":332},20,[30,334,335],{"class":289},"      name",[30,337,58],{"class":44},[30,339,295],{"class":181},[30,341,342],{"class":185},"Alice Johnson",[30,344,295],{"class":181},[30,346,303],{"class":44},[30,348,350,353,355,357,360,362],{"class":32,"line":349},21,[30,351,352],{"class":289},"      email",[30,354,58],{"class":44},[30,356,295],{"class":181},[30,358,359],{"class":185},"alice.j@email.com",[30,361,295],{"class":181},[30,363,303],{"class":44},[30,365,367,370],{"class":32,"line":366},22,[30,368,369],{"class":289},"      shippingAddress",[30,371,312],{"class":44},[30,373,375,378,380,382,385,387],{"class":32,"line":374},23,[30,376,377],{"class":289},"        street",[30,379,58],{"class":44},[30,381,295],{"class":181},[30,383,384],{"class":185},"123 Pine Street",[30,386,295],{"class":181},[30,388,303],{"class":44},[30,390,392,395,397,399,402,404],{"class":32,"line":391},24,[30,393,394],{"class":289},"        city",[30,396,58],{"class":44},[30,398,295],{"class":181},[30,400,401],{"class":185},"Portland",[30,403,295],{"class":181},[30,405,303],{"class":44},[30,407,409,412,414,416,419,421],{"class":32,"line":408},25,[30,410,411],{"class":289},"        state",[30,413,58],{"class":44},[30,415,295],{"class":181},[30,417,418],{"class":185},"OR",[30,420,295],{"class":181},[30,422,303],{"class":44},[30,424,426,429,431,433,436,438],{"class":32,"line":425},26,[30,427,428],{"class":289},"        zipCode",[30,430,58],{"class":44},[30,432,295],{"class":181},[30,434,435],{"class":185},"97201",[30,437,295],{"class":181},[30,439,303],{"class":44},[30,441,443,446,448,450,453],{"class":32,"line":442},27,[30,444,445],{"class":289},"        country",[30,447,58],{"class":44},[30,449,295],{"class":181},[30,451,452],{"class":185},"USA",[30,454,455],{"class":181},"\"\n",[30,457,459],{"class":32,"line":458},28,[30,460,461],{"class":44},"      }\n",[30,463,465],{"class":32,"line":464},29,[30,466,467],{"class":44},"    },\n",[30,469,471,474,476,478,481,483],{"class":32,"line":470},30,[30,472,473],{"class":289},"    orderDate",[30,475,58],{"class":44},[30,477,295],{"class":181},[30,479,480],{"class":185},"2024-03-15T14:30:00Z",[30,482,295],{"class":181},[30,484,303],{"class":44},[30,486,488,491],{"class":32,"line":487},31,[30,489,490],{"class":289},"    items",[30,492,493],{"class":44},": [\n",[30,495,497],{"class":32,"line":496},32,[30,498,499],{"class":44},"      {\n",[30,501,503,506,508,510,513,515],{"class":32,"line":502},33,[30,504,505],{"class":289},"        productId",[30,507,58],{"class":44},[30,509,295],{"class":181},[30,511,512],{"class":185},"PROD-789",[30,514,295],{"class":181},[30,516,303],{"class":44},[30,518,520,523,525,527,530,532],{"class":32,"line":519},34,[30,521,522],{"class":289},"        name",[30,524,58],{"class":44},[30,526,295],{"class":181},[30,528,529],{"class":185},"Organic Cotton T-Shirt",[30,531,295],{"class":181},[30,533,303],{"class":44},[30,535,537,540,542,546],{"class":32,"line":536},35,[30,538,539],{"class":289},"        quantity",[30,541,58],{"class":44},[30,543,545],{"class":544},"sxA9i","2",[30,547,303],{"class":44},[30,549,551,554,556,559],{"class":32,"line":550},36,[30,552,553],{"class":289},"        pricePerUnit",[30,555,58],{"class":44},[30,557,558],{"class":544},"29.99",[30,560,303],{"class":44},[30,562,564,567,569,571,574,576],{"class":32,"line":563},37,[30,565,566],{"class":289},"        color",[30,568,58],{"class":44},[30,570,295],{"class":181},[30,572,573],{"class":185},"Navy",[30,575,295],{"class":181},[30,577,303],{"class":44},[30,579,581,584,586,588,591],{"class":32,"line":580},38,[30,582,583],{"class":289},"        size",[30,585,58],{"class":44},[30,587,295],{"class":181},[30,589,590],{"class":185},"M",[30,592,455],{"class":181},[30,594,596],{"class":32,"line":595},39,[30,597,598],{"class":44},"      },\n",[30,600,602],{"class":32,"line":601},40,[30,603,499],{"class":44},[30,605,607,609,611,613,616,618],{"class":32,"line":606},41,[30,608,505],{"class":289},[30,610,58],{"class":44},[30,612,295],{"class":181},[30,614,615],{"class":185},"PROD-456",[30,617,295],{"class":181},[30,619,303],{"class":44},[30,621,623,625,627,629,632,634],{"class":32,"line":622},42,[30,624,522],{"class":289},[30,626,58],{"class":44},[30,628,295],{"class":181},[30,630,631],{"class":185},"Recycled Canvas Tote",[30,633,295],{"class":181},[30,635,303],{"class":44},[30,637,639,641,643,646],{"class":32,"line":638},43,[30,640,539],{"class":289},[30,642,58],{"class":44},[30,644,645],{"class":544},"1",[30,647,303],{"class":44},[30,649,651,653,655,658],{"class":32,"line":650},44,[30,652,553],{"class":289},[30,654,58],{"class":44},[30,656,657],{"class":544},"35.00",[30,659,303],{"class":44},[30,661,663,665,667,669,672],{"class":32,"line":662},45,[30,664,566],{"class":289},[30,666,58],{"class":44},[30,668,295],{"class":181},[30,670,671],{"class":185},"Natural",[30,673,455],{"class":181},[30,675,677],{"class":32,"line":676},46,[30,678,461],{"class":44},[30,680,682],{"class":32,"line":681},47,[30,683,684],{"class":44},"    ],\n",[30,686,688,691],{"class":32,"line":687},48,[30,689,690],{"class":289},"    paymentInfo",[30,692,312],{"class":44},[30,694,696,699,701,703,706,708],{"class":32,"line":695},49,[30,697,698],{"class":289},"      method",[30,700,58],{"class":44},[30,702,295],{"class":181},[30,704,705],{"class":185},"credit_card",[30,707,295],{"class":181},[30,709,303],{"class":44},[30,711,713,716,718,720,723,725],{"class":32,"line":712},50,[30,714,715],{"class":289},"      status",[30,717,58],{"class":44},[30,719,295],{"class":181},[30,721,722],{"class":185},"completed",[30,724,295],{"class":181},[30,726,303],{"class":44},[30,728,730,733,735,737,740],{"class":32,"line":729},51,[30,731,732],{"class":289},"      transactionId",[30,734,58],{"class":44},[30,736,295],{"class":181},[30,738,739],{"class":185},"TXN-88776655",[30,741,455],{"class":181},[30,743,745],{"class":32,"line":744},52,[30,746,467],{"class":44},[30,748,750,753,755,758],{"class":32,"line":749},53,[30,751,752],{"class":289},"    subtotal",[30,754,58],{"class":44},[30,756,757],{"class":544},"94.98",[30,759,303],{"class":44},[30,761,763,766,768,771],{"class":32,"line":762},54,[30,764,765],{"class":289},"    shippingCost",[30,767,58],{"class":44},[30,769,770],{"class":544},"5.99",[30,772,303],{"class":44},[30,774,776,779,781,784],{"class":32,"line":775},55,[30,777,778],{"class":289},"    tax",[30,780,58],{"class":44},[30,782,783],{"class":544},"9.50",[30,785,303],{"class":44},[30,787,789,792,794,797],{"class":32,"line":788},56,[30,790,791],{"class":289},"    totalAmount",[30,793,58],{"class":44},[30,795,796],{"class":544},"110.47",[30,798,303],{"class":44},[30,800,802,805,807,809,811,813],{"class":32,"line":801},57,[30,803,804],{"class":289},"    status",[30,806,58],{"class":44},[30,808,295],{"class":181},[30,810,205],{"class":185},[30,812,295],{"class":181},[30,814,303],{"class":44},[30,816,818,821,823,825,828],{"class":32,"line":817},58,[30,819,820],{"class":289},"    trackingNumber",[30,822,58],{"class":44},[30,824,295],{"class":181},[30,826,827],{"class":185},"1Z999AA1234567890",[30,829,455],{"class":181},[30,831,833],{"class":32,"line":832},59,[30,834,835],{"class":44},"  },\n",[30,837,839],{"class":32,"line":838},60,[30,840,841],{"class":81},"  // Imagine more objects here, with various values changed...\n",[30,843,845],{"class":32,"line":844},61,[30,846,847],{"class":44},"];\n",[10,849,850],{},"The data I work with everyday looks a lot like this. Arrays of orders or some sort of customer focused information, featuring nested values that help populate tables, popups and cards detailed with all sorts of information.",[10,852,853],{},"As an engineer tasked with maintaining applications that heavily rely on such mocks, you might ask 'what is this particular object in the response mocking?'. I've often found myself scrolling through hundreds of examples just like the one above, being unsure as to what each objects purpose was.",[10,855,856],{},"As I've become more sure of myself as an engineer, I've tasked myself with solving the above issue; What if every mock could more easily display its purpose? What if an engineer only had to write the lines they were intending to mock?",[10,858,859],{},"Whilst playing around with some code and a library called Zod, I found the following method called parse, which attempts to validate incoming data against a known type:",[20,861,863],{"className":22,"code":862,"language":24,"meta":25,"style":25},"const stringSchema = z.string();\n\nstringSchema.parse(\"fish\"); // => returns \"fish\"\nstringSchema.parse(12); // throws error\n",[27,864,865,886,890,915],{"__ignoreMap":25},[30,866,867,869,872,874,877,880,883],{"class":32,"line":33},[30,868,263],{"class":36},[30,870,871],{"class":54},"stringSchema",[30,873,45],{"class":44},[30,875,876],{"class":54}," z",[30,878,879],{"class":44},".",[30,881,61],{"class":882},"sCK9x",[30,884,885],{"class":44},"();\n",[30,887,888],{"class":32,"line":51},[30,889,257],{"emptyLinePlaceholder":256},[30,891,892,894,896,899,902,904,907,909,912],{"class":32,"line":67},[30,893,871],{"class":54},[30,895,879],{"class":44},[30,897,898],{"class":882},"parse",[30,900,901],{"class":44},"(",[30,903,295],{"class":181},[30,905,906],{"class":185},"fish",[30,908,295],{"class":181},[30,910,911],{"class":44},");",[30,913,914],{"class":81}," // => returns \"fish\"\n",[30,916,917,919,921,923,925,928,930],{"class":32,"line":85},[30,918,871],{"class":54},[30,920,879],{"class":44},[30,922,898],{"class":882},[30,924,901],{"class":44},[30,926,927],{"class":544},"12",[30,929,911],{"class":44},[30,931,932],{"class":81}," // throws error\n",[10,934,935],{},"This was a light-bulb moment; This little example in the Zod documentation was exactly what I had been looking for! If the parse method could accept a value and return it, then if I passed in a value, I would get it back. I also already knew that I could define default values to a Zod schema. What if passing an empty object would return a full object, with its values? Lo and behold it did; I could define default values on a Zod schema, and return the defaults:",[20,937,939],{"className":22,"code":938,"language":24,"meta":25,"style":25},"const UserSchema = z.object({\n  id: z.string().default('1'),\n  name: z.string().default('Craig R Broughton'),\n  settings: z.object({\n    theme: z.enum(['light', 'dark']),\n    notifications: z.boolean()\n  }).default({\n    theme: 'dark',\n    notifications: true,\n  })\n});\n\nconst user = UserSchema.parse({}) // returns a full user object\n",[27,940,941,960,991,1019,1034,1071,1088,1097,1111,1123,1128,1133,1137],{"__ignoreMap":25},[30,942,943,945,948,950,952,954,957],{"class":32,"line":33},[30,944,263],{"class":36},[30,946,947],{"class":54},"UserSchema",[30,949,45],{"class":44},[30,951,876],{"class":54},[30,953,879],{"class":44},[30,955,956],{"class":882},"object",[30,958,959],{"class":44},"({\n",[30,961,962,965,967,970,972,974,977,980,982,984,986,988],{"class":32,"line":51},[30,963,964],{"class":289},"  id",[30,966,58],{"class":44},[30,968,969],{"class":54},"z",[30,971,879],{"class":44},[30,973,61],{"class":882},[30,975,976],{"class":44},"().",[30,978,979],{"class":882},"default",[30,981,901],{"class":44},[30,983,182],{"class":181},[30,985,645],{"class":185},[30,987,182],{"class":181},[30,989,990],{"class":44},"),\n",[30,992,993,996,998,1000,1002,1004,1006,1008,1010,1012,1015,1017],{"class":32,"line":67},[30,994,995],{"class":289},"  name",[30,997,58],{"class":44},[30,999,969],{"class":54},[30,1001,879],{"class":44},[30,1003,61],{"class":882},[30,1005,976],{"class":44},[30,1007,979],{"class":882},[30,1009,901],{"class":44},[30,1011,182],{"class":181},[30,1013,1014],{"class":185},"Craig R Broughton",[30,1016,182],{"class":181},[30,1018,990],{"class":44},[30,1020,1021,1024,1026,1028,1030,1032],{"class":32,"line":85},[30,1022,1023],{"class":289},"  settings",[30,1025,58],{"class":44},[30,1027,969],{"class":54},[30,1029,879],{"class":44},[30,1031,956],{"class":882},[30,1033,959],{"class":44},[30,1035,1036,1039,1041,1043,1045,1048,1051,1053,1056,1058,1061,1063,1066,1068],{"class":32,"line":97},[30,1037,1038],{"class":289},"    theme",[30,1040,58],{"class":44},[30,1042,969],{"class":54},[30,1044,879],{"class":44},[30,1046,1047],{"class":882},"enum",[30,1049,1050],{"class":44},"([",[30,1052,182],{"class":181},[30,1054,1055],{"class":185},"light",[30,1057,182],{"class":181},[30,1059,1060],{"class":44},", ",[30,1062,182],{"class":181},[30,1064,1065],{"class":185},"dark",[30,1067,182],{"class":181},[30,1069,1070],{"class":44},"]),\n",[30,1072,1073,1076,1078,1080,1082,1085],{"class":32,"line":111},[30,1074,1075],{"class":289},"    notifications",[30,1077,58],{"class":44},[30,1079,969],{"class":54},[30,1081,879],{"class":44},[30,1083,1084],{"class":882},"boolean",[30,1086,1087],{"class":44},"()\n",[30,1089,1090,1093,1095],{"class":32,"line":124},[30,1091,1092],{"class":44},"  }).",[30,1094,979],{"class":882},[30,1096,959],{"class":44},[30,1098,1099,1101,1103,1105,1107,1109],{"class":32,"line":137},[30,1100,1038],{"class":289},[30,1102,58],{"class":44},[30,1104,182],{"class":181},[30,1106,1065],{"class":185},[30,1108,182],{"class":181},[30,1110,303],{"class":44},[30,1112,1113,1115,1117,1121],{"class":32,"line":149},[30,1114,1075],{"class":289},[30,1116,58],{"class":44},[30,1118,1120],{"class":1119},"s3QIE","true",[30,1122,303],{"class":44},[30,1124,1125],{"class":32,"line":161},[30,1126,1127],{"class":44},"  })\n",[30,1129,1130],{"class":32,"line":173},[30,1131,1132],{"class":44},"});\n",[30,1134,1135],{"class":32,"line":230},[30,1136,257],{"emptyLinePlaceholder":256},[30,1138,1139,1141,1144,1146,1149,1151,1153,1156],{"class":32,"line":247},[30,1140,263],{"class":36},[30,1142,1143],{"class":54},"user",[30,1145,45],{"class":44},[30,1147,1148],{"class":54}," UserSchema",[30,1150,879],{"class":44},[30,1152,898],{"class":882},[30,1154,1155],{"class":44},"({})",[30,1157,1158],{"class":81}," // returns a full user object\n",[10,1160,1161,1162,1166],{},"Now I had a way to generate objects, however it was still not quite what I was looking for. What I really wanted was a way to ",[1163,1164,1165],"em",{},"only"," write the exact lines I was 'mocking'. A simple solution might look like:",[20,1168,1170],{"className":22,"code":1169,"language":24,"meta":25,"style":25},"const UserSchema = z.object({\n  id: z.string().default('1'),\n  name: z.string().default('Craig R Broughton'),\n  settings: z.object({\n    theme: z.enum(['light', 'dark']),\n    notifications: z.boolean()\n  }).default({\n    theme: 'dark',\n    notifications: true,\n  })\n});\n\nconst user = UserSchema.parse({})\nconst overridenUser = {...user, ...{\n  name: \"My new name\",\n  settings: {}, // I would need to write every key:value for settings :(\n} satisfies Partial\u003Cz.infer\u003Ctypeof UserSchema>>} // overrides the base object\n",[27,1171,1172,1188,1214,1240,1254,1284,1298,1306,1320,1330,1334,1338,1342,1359,1376,1391,1401],{"__ignoreMap":25},[30,1173,1174,1176,1178,1180,1182,1184,1186],{"class":32,"line":33},[30,1175,263],{"class":36},[30,1177,947],{"class":54},[30,1179,45],{"class":44},[30,1181,876],{"class":54},[30,1183,879],{"class":44},[30,1185,956],{"class":882},[30,1187,959],{"class":44},[30,1189,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212],{"class":32,"line":51},[30,1191,964],{"class":289},[30,1193,58],{"class":44},[30,1195,969],{"class":54},[30,1197,879],{"class":44},[30,1199,61],{"class":882},[30,1201,976],{"class":44},[30,1203,979],{"class":882},[30,1205,901],{"class":44},[30,1207,182],{"class":181},[30,1209,645],{"class":185},[30,1211,182],{"class":181},[30,1213,990],{"class":44},[30,1215,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238],{"class":32,"line":67},[30,1217,995],{"class":289},[30,1219,58],{"class":44},[30,1221,969],{"class":54},[30,1223,879],{"class":44},[30,1225,61],{"class":882},[30,1227,976],{"class":44},[30,1229,979],{"class":882},[30,1231,901],{"class":44},[30,1233,182],{"class":181},[30,1235,1014],{"class":185},[30,1237,182],{"class":181},[30,1239,990],{"class":44},[30,1241,1242,1244,1246,1248,1250,1252],{"class":32,"line":85},[30,1243,1023],{"class":289},[30,1245,58],{"class":44},[30,1247,969],{"class":54},[30,1249,879],{"class":44},[30,1251,956],{"class":882},[30,1253,959],{"class":44},[30,1255,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282],{"class":32,"line":97},[30,1257,1038],{"class":289},[30,1259,58],{"class":44},[30,1261,969],{"class":54},[30,1263,879],{"class":44},[30,1265,1047],{"class":882},[30,1267,1050],{"class":44},[30,1269,182],{"class":181},[30,1271,1055],{"class":185},[30,1273,182],{"class":181},[30,1275,1060],{"class":44},[30,1277,182],{"class":181},[30,1279,1065],{"class":185},[30,1281,182],{"class":181},[30,1283,1070],{"class":44},[30,1285,1286,1288,1290,1292,1294,1296],{"class":32,"line":111},[30,1287,1075],{"class":289},[30,1289,58],{"class":44},[30,1291,969],{"class":54},[30,1293,879],{"class":44},[30,1295,1084],{"class":882},[30,1297,1087],{"class":44},[30,1299,1300,1302,1304],{"class":32,"line":124},[30,1301,1092],{"class":44},[30,1303,979],{"class":882},[30,1305,959],{"class":44},[30,1307,1308,1310,1312,1314,1316,1318],{"class":32,"line":137},[30,1309,1038],{"class":289},[30,1311,58],{"class":44},[30,1313,182],{"class":181},[30,1315,1065],{"class":185},[30,1317,182],{"class":181},[30,1319,303],{"class":44},[30,1321,1322,1324,1326,1328],{"class":32,"line":149},[30,1323,1075],{"class":289},[30,1325,58],{"class":44},[30,1327,1120],{"class":1119},[30,1329,303],{"class":44},[30,1331,1332],{"class":32,"line":161},[30,1333,1127],{"class":44},[30,1335,1336],{"class":32,"line":173},[30,1337,1132],{"class":44},[30,1339,1340],{"class":32,"line":230},[30,1341,257],{"emptyLinePlaceholder":256},[30,1343,1344,1346,1348,1350,1352,1354,1356],{"class":32,"line":247},[30,1345,263],{"class":36},[30,1347,1143],{"class":54},[30,1349,45],{"class":44},[30,1351,1148],{"class":54},[30,1353,879],{"class":44},[30,1355,898],{"class":882},[30,1357,1358],{"class":44},"({})\n",[30,1360,1361,1363,1366,1368,1371,1373],{"class":32,"line":253},[30,1362,263],{"class":36},[30,1364,1365],{"class":54},"overridenUser",[30,1367,45],{"class":44},[30,1369,1370],{"class":44}," {...",[30,1372,1143],{"class":54},[30,1374,1375],{"class":44},", ...{\n",[30,1377,1378,1380,1382,1384,1387,1389],{"class":32,"line":260},[30,1379,995],{"class":289},[30,1381,58],{"class":44},[30,1383,295],{"class":181},[30,1385,1386],{"class":185},"My new name",[30,1388,295],{"class":181},[30,1390,303],{"class":44},[30,1392,1393,1395,1398],{"class":32,"line":280},[30,1394,1023],{"class":289},[30,1396,1397],{"class":44},": {}, ",[30,1399,1400],{"class":81},"// I would need to write every key:value for settings :(\n",[30,1402,1403,1406,1409,1412,1415,1417,1419,1422,1424,1427,1429,1432],{"class":32,"line":286},[30,1404,1405],{"class":44},"} ",[30,1407,1408],{"class":1119},"satisfies",[30,1410,1411],{"class":40}," Partial",[30,1413,1414],{"class":44},"\u003C",[30,1416,969],{"class":40},[30,1418,879],{"class":44},[30,1420,1421],{"class":40},"infer",[30,1423,1414],{"class":44},[30,1425,1426],{"class":36},"typeof",[30,1428,1148],{"class":54},[30,1430,1431],{"class":44},">>}",[30,1433,1434],{"class":81}," // overrides the base object\n",[10,1436,1437],{},"However this has its own flaws; What if the value I wish to override is itself an object or array? I'd then have to manually type out each line that was previously required for that feature to continue to work and be mocked as expected, which defeats the purpose of our work in progress solution.",[10,1439,1440],{},"For a long while, this is as far as I had got, until very recently when I had another stab at improving the above. The first step was defining the 'API'; How did I want my users to interact with this functionality?",[20,1442,1444],{"className":22,"code":1443,"language":24,"meta":25,"style":25},"const UserSchema = z.object({\n  id: z.string().default('1'),\n  name: z.string().default('Craig R Broughton'),\n  settings: z.object({\n    theme: z.enum(['light', 'dark']),\n    notifications: z.boolean()\n  }).default({\n    theme: 'dark',\n    notifications: true,\n  })\n});\n\nconst user = zodObjectBuilder({\n  schema: UserSchema,\n  overrides: { name: 'My new name', settings: { theme: 'dark' } } // settings is missing the notifications key :(\n}); // returns a full user object with the overrides\n",[27,1445,1446,1462,1488,1514,1528,1558,1572,1580,1594,1604,1608,1612,1616,1629,1640,1683],{"__ignoreMap":25},[30,1447,1448,1450,1452,1454,1456,1458,1460],{"class":32,"line":33},[30,1449,263],{"class":36},[30,1451,947],{"class":54},[30,1453,45],{"class":44},[30,1455,876],{"class":54},[30,1457,879],{"class":44},[30,1459,956],{"class":882},[30,1461,959],{"class":44},[30,1463,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486],{"class":32,"line":51},[30,1465,964],{"class":289},[30,1467,58],{"class":44},[30,1469,969],{"class":54},[30,1471,879],{"class":44},[30,1473,61],{"class":882},[30,1475,976],{"class":44},[30,1477,979],{"class":882},[30,1479,901],{"class":44},[30,1481,182],{"class":181},[30,1483,645],{"class":185},[30,1485,182],{"class":181},[30,1487,990],{"class":44},[30,1489,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512],{"class":32,"line":67},[30,1491,995],{"class":289},[30,1493,58],{"class":44},[30,1495,969],{"class":54},[30,1497,879],{"class":44},[30,1499,61],{"class":882},[30,1501,976],{"class":44},[30,1503,979],{"class":882},[30,1505,901],{"class":44},[30,1507,182],{"class":181},[30,1509,1014],{"class":185},[30,1511,182],{"class":181},[30,1513,990],{"class":44},[30,1515,1516,1518,1520,1522,1524,1526],{"class":32,"line":85},[30,1517,1023],{"class":289},[30,1519,58],{"class":44},[30,1521,969],{"class":54},[30,1523,879],{"class":44},[30,1525,956],{"class":882},[30,1527,959],{"class":44},[30,1529,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1556],{"class":32,"line":97},[30,1531,1038],{"class":289},[30,1533,58],{"class":44},[30,1535,969],{"class":54},[30,1537,879],{"class":44},[30,1539,1047],{"class":882},[30,1541,1050],{"class":44},[30,1543,182],{"class":181},[30,1545,1055],{"class":185},[30,1547,182],{"class":181},[30,1549,1060],{"class":44},[30,1551,182],{"class":181},[30,1553,1065],{"class":185},[30,1555,182],{"class":181},[30,1557,1070],{"class":44},[30,1559,1560,1562,1564,1566,1568,1570],{"class":32,"line":111},[30,1561,1075],{"class":289},[30,1563,58],{"class":44},[30,1565,969],{"class":54},[30,1567,879],{"class":44},[30,1569,1084],{"class":882},[30,1571,1087],{"class":44},[30,1573,1574,1576,1578],{"class":32,"line":124},[30,1575,1092],{"class":44},[30,1577,979],{"class":882},[30,1579,959],{"class":44},[30,1581,1582,1584,1586,1588,1590,1592],{"class":32,"line":137},[30,1583,1038],{"class":289},[30,1585,58],{"class":44},[30,1587,182],{"class":181},[30,1589,1065],{"class":185},[30,1591,182],{"class":181},[30,1593,303],{"class":44},[30,1595,1596,1598,1600,1602],{"class":32,"line":149},[30,1597,1075],{"class":289},[30,1599,58],{"class":44},[30,1601,1120],{"class":1119},[30,1603,303],{"class":44},[30,1605,1606],{"class":32,"line":161},[30,1607,1127],{"class":44},[30,1609,1610],{"class":32,"line":173},[30,1611,1132],{"class":44},[30,1613,1614],{"class":32,"line":230},[30,1615,257],{"emptyLinePlaceholder":256},[30,1617,1618,1620,1622,1624,1627],{"class":32,"line":247},[30,1619,263],{"class":36},[30,1621,1143],{"class":54},[30,1623,45],{"class":44},[30,1625,1626],{"class":882}," zodObjectBuilder",[30,1628,959],{"class":44},[30,1630,1631,1634,1636,1638],{"class":32,"line":253},[30,1632,1633],{"class":289},"  schema",[30,1635,58],{"class":44},[30,1637,947],{"class":54},[30,1639,303],{"class":44},[30,1641,1642,1645,1648,1651,1653,1655,1657,1659,1661,1664,1666,1669,1671,1673,1675,1677,1680],{"class":32,"line":260},[30,1643,1644],{"class":289},"  overrides",[30,1646,1647],{"class":44},": { ",[30,1649,1650],{"class":289},"name",[30,1652,58],{"class":44},[30,1654,182],{"class":181},[30,1656,1386],{"class":185},[30,1658,182],{"class":181},[30,1660,1060],{"class":44},[30,1662,1663],{"class":289},"settings",[30,1665,1647],{"class":44},[30,1667,1668],{"class":289},"theme",[30,1670,58],{"class":44},[30,1672,182],{"class":181},[30,1674,1065],{"class":185},[30,1676,182],{"class":181},[30,1678,1679],{"class":44}," } } ",[30,1681,1682],{"class":81},"// settings is missing the notifications key :(\n",[30,1684,1685,1688],{"class":32,"line":280},[30,1686,1687],{"class":44},"});",[30,1689,1690],{"class":81}," // returns a full user object with the overrides\n",[10,1692,1693],{},"The above API would allow the user to specify a schema of their choice, and then provide the appropriate overrides and return a user object! Of course we'd want to properly account for arrays as well as a single object. For that purpose, a simple type check against the incoming overrides type proved sufficient:",[20,1695,1697],{"className":22,"code":1696,"language":24,"meta":25,"style":25},"// Some of the implementation of zodObjectBuilder\nif (overrides && Array.isArray(overrides)) {\n  const objects: z.infer\u003CT>[] = []\n  overrides.forEach((override) => {\n    if (config.preserveNestedDefaults) {\n      const base = buildDefaultObject(schema)\n      const newObject = merge(base, override)\n      objects.push(newObject)\n    }\n    else {\n      const base = schema.parse({})\n      objects.push({ ...base, ...override })\n    }\n  })\n  return objects\n}\n",[27,1698,1699,1704,1735,1762,1785,1804,1825,1849,1865,1870,1877,1894,1915,1919,1923,1931],{"__ignoreMap":25},[30,1700,1701],{"class":32,"line":33},[30,1702,1703],{"class":81},"// Some of the implementation of zodObjectBuilder\n",[30,1705,1706,1709,1712,1715,1718,1721,1723,1726,1728,1730,1733],{"class":32,"line":51},[30,1707,1708],{"class":1119},"if",[30,1710,1711],{"class":44}," (",[30,1713,1714],{"class":54},"overrides",[30,1716,1717],{"class":36}," &&",[30,1719,1720],{"class":54}," Array",[30,1722,879],{"class":44},[30,1724,1725],{"class":882},"isArray",[30,1727,901],{"class":44},[30,1729,1714],{"class":54},[30,1731,1732],{"class":44},"))",[30,1734,48],{"class":44},[30,1736,1737,1740,1743,1745,1747,1749,1751,1753,1756,1759],{"class":32,"line":67},[30,1738,1739],{"class":36},"  const ",[30,1741,1742],{"class":54},"objects",[30,1744,58],{"class":44},[30,1746,969],{"class":40},[30,1748,879],{"class":44},[30,1750,1421],{"class":40},[30,1752,1414],{"class":44},[30,1754,1755],{"class":40},"T",[30,1757,1758],{"class":44},">[] =",[30,1760,1761],{"class":44}," []\n",[30,1763,1764,1766,1768,1771,1774,1777,1780,1783],{"class":32,"line":85},[30,1765,1644],{"class":54},[30,1767,879],{"class":44},[30,1769,1770],{"class":882},"forEach",[30,1772,1773],{"class":44},"((",[30,1775,1776],{"class":54},"override",[30,1778,1779],{"class":44},")",[30,1781,1782],{"class":44}," =>",[30,1784,48],{"class":44},[30,1786,1787,1790,1792,1795,1797,1800,1802],{"class":32,"line":97},[30,1788,1789],{"class":1119},"    if",[30,1791,1711],{"class":44},[30,1793,1794],{"class":54},"config",[30,1796,879],{"class":44},[30,1798,1799],{"class":54},"preserveNestedDefaults",[30,1801,1779],{"class":44},[30,1803,48],{"class":44},[30,1805,1806,1809,1812,1814,1817,1819,1822],{"class":32,"line":111},[30,1807,1808],{"class":36},"      const ",[30,1810,1811],{"class":54},"base",[30,1813,45],{"class":44},[30,1815,1816],{"class":882}," buildDefaultObject",[30,1818,901],{"class":44},[30,1820,1821],{"class":54},"schema",[30,1823,1824],{"class":44},")\n",[30,1826,1827,1829,1832,1834,1837,1839,1841,1844,1847],{"class":32,"line":124},[30,1828,1808],{"class":36},[30,1830,1831],{"class":54},"newObject",[30,1833,45],{"class":44},[30,1835,1836],{"class":882}," merge",[30,1838,901],{"class":44},[30,1840,1811],{"class":54},[30,1842,1843],{"class":44},",",[30,1845,1846],{"class":54}," override",[30,1848,1824],{"class":44},[30,1850,1851,1854,1856,1859,1861,1863],{"class":32,"line":137},[30,1852,1853],{"class":54},"      objects",[30,1855,879],{"class":44},[30,1857,1858],{"class":882},"push",[30,1860,901],{"class":44},[30,1862,1831],{"class":54},[30,1864,1824],{"class":44},[30,1866,1867],{"class":32,"line":149},[30,1868,1869],{"class":44},"    }\n",[30,1871,1872,1875],{"class":32,"line":161},[30,1873,1874],{"class":1119},"    else",[30,1876,48],{"class":44},[30,1878,1879,1881,1883,1885,1888,1890,1892],{"class":32,"line":173},[30,1880,1808],{"class":36},[30,1882,1811],{"class":54},[30,1884,45],{"class":44},[30,1886,1887],{"class":54}," schema",[30,1889,879],{"class":44},[30,1891,898],{"class":882},[30,1893,1358],{"class":44},[30,1895,1896,1898,1900,1902,1905,1907,1910,1912],{"class":32,"line":230},[30,1897,1853],{"class":54},[30,1899,879],{"class":44},[30,1901,1858],{"class":882},[30,1903,1904],{"class":44},"({ ...",[30,1906,1811],{"class":54},[30,1908,1909],{"class":44},", ...",[30,1911,1776],{"class":54},[30,1913,1914],{"class":44}," })\n",[30,1916,1917],{"class":32,"line":247},[30,1918,1869],{"class":44},[30,1920,1921],{"class":32,"line":253},[30,1922,1127],{"class":44},[30,1924,1925,1928],{"class":32,"line":260},[30,1926,1927],{"class":1119},"  return",[30,1929,1930],{"class":54}," objects\n",[30,1932,1933],{"class":32,"line":280},[30,1934,1935],{"class":44},"}\n",[10,1937,1938],{},"The above is effectively the same code as before, however it's now encapsulating the parsing internally so users don't have to manually do so or know detailed information about Zod's parsing method. As you might have guessed from reading through the if/else statement included, we've also solved the preservation of nested objects and arrays through the use of a recursive builder function that parses each value and returns its default values specified in the Zod schema.",[10,1940,1941],{},"The above is quite a bit to wrap your head around, but the result is that a user can do the following:",[20,1943,1945],{"className":22,"code":1944,"language":24,"meta":25,"style":25},"const UserSchema = z.object({\n  id: z.string().default('1'),\n  name: z.string().default('Craig R Broughton'),\n  settings: z.object({\n    theme: z.enum(['light', 'dark']),\n    notifications: z.boolean()\n  }).default({\n    theme: 'dark',\n    notifications: true,\n  })\n});\n\nconst user = zodObjectBuilder({\n  schema: UserSchema,\n  config: { preserveNestedDefaults: true },\n  overrides: { name: 'My new name', settings: { theme: 'dark' } }\n}); // returns a full user object with the overrides, including nested values!\n",[27,1946,1947,1963,1989,2015,2029,2059,2073,2081,2095,2105,2109,2113,2117,2129,2139,2155,2190],{"__ignoreMap":25},[30,1948,1949,1951,1953,1955,1957,1959,1961],{"class":32,"line":33},[30,1950,263],{"class":36},[30,1952,947],{"class":54},[30,1954,45],{"class":44},[30,1956,876],{"class":54},[30,1958,879],{"class":44},[30,1960,956],{"class":882},[30,1962,959],{"class":44},[30,1964,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987],{"class":32,"line":51},[30,1966,964],{"class":289},[30,1968,58],{"class":44},[30,1970,969],{"class":54},[30,1972,879],{"class":44},[30,1974,61],{"class":882},[30,1976,976],{"class":44},[30,1978,979],{"class":882},[30,1980,901],{"class":44},[30,1982,182],{"class":181},[30,1984,645],{"class":185},[30,1986,182],{"class":181},[30,1988,990],{"class":44},[30,1990,1991,1993,1995,1997,1999,2001,2003,2005,2007,2009,2011,2013],{"class":32,"line":67},[30,1992,995],{"class":289},[30,1994,58],{"class":44},[30,1996,969],{"class":54},[30,1998,879],{"class":44},[30,2000,61],{"class":882},[30,2002,976],{"class":44},[30,2004,979],{"class":882},[30,2006,901],{"class":44},[30,2008,182],{"class":181},[30,2010,1014],{"class":185},[30,2012,182],{"class":181},[30,2014,990],{"class":44},[30,2016,2017,2019,2021,2023,2025,2027],{"class":32,"line":85},[30,2018,1023],{"class":289},[30,2020,58],{"class":44},[30,2022,969],{"class":54},[30,2024,879],{"class":44},[30,2026,956],{"class":882},[30,2028,959],{"class":44},[30,2030,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057],{"class":32,"line":97},[30,2032,1038],{"class":289},[30,2034,58],{"class":44},[30,2036,969],{"class":54},[30,2038,879],{"class":44},[30,2040,1047],{"class":882},[30,2042,1050],{"class":44},[30,2044,182],{"class":181},[30,2046,1055],{"class":185},[30,2048,182],{"class":181},[30,2050,1060],{"class":44},[30,2052,182],{"class":181},[30,2054,1065],{"class":185},[30,2056,182],{"class":181},[30,2058,1070],{"class":44},[30,2060,2061,2063,2065,2067,2069,2071],{"class":32,"line":111},[30,2062,1075],{"class":289},[30,2064,58],{"class":44},[30,2066,969],{"class":54},[30,2068,879],{"class":44},[30,2070,1084],{"class":882},[30,2072,1087],{"class":44},[30,2074,2075,2077,2079],{"class":32,"line":124},[30,2076,1092],{"class":44},[30,2078,979],{"class":882},[30,2080,959],{"class":44},[30,2082,2083,2085,2087,2089,2091,2093],{"class":32,"line":137},[30,2084,1038],{"class":289},[30,2086,58],{"class":44},[30,2088,182],{"class":181},[30,2090,1065],{"class":185},[30,2092,182],{"class":181},[30,2094,303],{"class":44},[30,2096,2097,2099,2101,2103],{"class":32,"line":149},[30,2098,1075],{"class":289},[30,2100,58],{"class":44},[30,2102,1120],{"class":1119},[30,2104,303],{"class":44},[30,2106,2107],{"class":32,"line":161},[30,2108,1127],{"class":44},[30,2110,2111],{"class":32,"line":173},[30,2112,1132],{"class":44},[30,2114,2115],{"class":32,"line":230},[30,2116,257],{"emptyLinePlaceholder":256},[30,2118,2119,2121,2123,2125,2127],{"class":32,"line":247},[30,2120,263],{"class":36},[30,2122,1143],{"class":54},[30,2124,45],{"class":44},[30,2126,1626],{"class":882},[30,2128,959],{"class":44},[30,2130,2131,2133,2135,2137],{"class":32,"line":253},[30,2132,1633],{"class":289},[30,2134,58],{"class":44},[30,2136,947],{"class":54},[30,2138,303],{"class":44},[30,2140,2141,2144,2146,2148,2150,2152],{"class":32,"line":260},[30,2142,2143],{"class":289},"  config",[30,2145,1647],{"class":44},[30,2147,1799],{"class":289},[30,2149,58],{"class":44},[30,2151,1120],{"class":1119},[30,2153,2154],{"class":44}," },\n",[30,2156,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2185,2187],{"class":32,"line":280},[30,2158,1644],{"class":289},[30,2160,1647],{"class":44},[30,2162,1650],{"class":289},[30,2164,58],{"class":44},[30,2166,182],{"class":181},[30,2168,1386],{"class":185},[30,2170,182],{"class":181},[30,2172,1060],{"class":44},[30,2174,1663],{"class":289},[30,2176,1647],{"class":44},[30,2178,1668],{"class":289},[30,2180,58],{"class":44},[30,2182,182],{"class":181},[30,2184,1065],{"class":185},[30,2186,182],{"class":181},[30,2188,2189],{"class":44}," } }\n",[30,2191,2192,2194],{"class":32,"line":286},[30,2193,1687],{"class":44},[30,2195,2196],{"class":81}," // returns a full user object with the overrides, including nested values!\n",[10,2198,2199,2200,2202],{},"When providing the ",[27,2201,1799],{}," configuration option to the builder, a user can preserve the key value pairs within a nested object or array! This solves the issue of a user overriding a key that is not a primitive type like a string, and is instead a more complex type — and retains all the values minus the ones we choose to override.",[10,2204,2205,2206,2209,2210,2212],{},"This has already been quite a read, so let us end with the result of all our hard work. Let's revisit that first mock, and how we could write it with ",[27,2207,2208],{},"zodObjectBuilder",". First let's define our types and our default values, and pass the resulting schema into the ",[27,2211,2208],{},":",[20,2214,2216],{"className":22,"code":2215,"language":24,"meta":25,"style":25},"const addressSchema = z.object({\n  street: z.string(),\n  city: z.string(),\n  state: z.string(),\n  zipCode: z.string(),\n  country: z.string()\n}).default({\n  street: \"123 Pine Street\",\n  city: \"Portland\",\n  state: \"OR\",\n  zipCode: \"97201\",\n  country: \"USA\"\n});\n\nconst customerInfoSchema = z.object({\n  id: z.string().regex(/^CUST-\\d{4}$/),\n  name: z.string().min(1),\n  email: z.string().email(),\n  shippingAddress: addressSchema\n}).default({\n  id: \"CUST-1234\",\n  name: \"Alice Johnson\",\n  email: \"alice.j@email.com\",\n});\n\nconst paymentInfoSchema = z.object({\n  method: z.enum(['credit_card', 'paypal']),\n  status: z.enum(['completed', 'pending', 'failed']),\n  transactionId: z.string()\n}).default({\n  method: 'credit_card',\n  status: 'pending',\n  transactionId: 'TXN-88776655'\n});\n\nconst orderItemSchema = z.object({\n  productId: z.string().regex(/^PROD-\\d{3}$/),\n  name: z.string().min(1),\n  quantity: z.number().int().positive(),\n  pricePerUnit: z.number().positive(),\n  color: z.string().optional(),\n  size: z.enum(['XS', 'S', 'M', 'L', 'XL', 'XXL']).optional(),\n  variety: z.string().optional(),\n  weight: z.enum(['8oz', '12oz', '16oz', '1lb']).optional()\n}).default({\n  productId: \"PROD-001\",\n  name: \"Sample Product\",\n  quantity: 1,\n  pricePerUnit: 29.99,\n  color: \"Black\",\n  size: \"M\"\n});\n\nconst generateOrderId = () => {\n  const year = new Date().getFullYear();\n  const randomNum = Math.floor(Math.random() * 1000).toString().padStart(3, '0');\n  return `ORD-${year}-${randomNum}`;\n};\n\nconst orderSchema = z.object({\n  orderId: z.string().regex(/^ORD-\\d{4}-\\d{3}$/).default(generateOrderId()),\n  customerInfo: customerInfoSchema,\n  orderDate: z.string().datetime().default(new Date().toISOString()),\n  items: z.array(orderItemSchema).min(1).default([orderItemSchema.parse(undefined)]),\n  paymentInfo: paymentInfoSchema,\n  subtotal: z.number().positive().default(29.99),\n  shippingCost: z.number().nonnegative().default(5.99),\n  tax: z.number().nonnegative().default(3.00),\n  totalAmount: z.number().positive().default(38.98),\n  status: z.enum(['pending', 'processing', 'shipped', 'delivered', 'cancelled']).default('pending'),\n  trackingNumber: z.string().default('1Z999AA1234567890')\n});\n\nconst orderItem = zodObjectBuilder({\n  schema: orderSchema,\n});\n",[27,2217,2218,2235,2251,2266,2281,2296,2311,2320,2334,2348,2362,2376,2388,2392,2396,2413,2456,2479,2499,2509,2517,2531,2545,2559,2563,2567,2584,2616,2655,2670,2678,2692,2706,2719,2723,2727,2744,2781,2803,2828,2847,2867,2940,2959,3014,3022,3037,3052,3062,3072,3087,3099,3103,3107,3123,3145,3210,3242,3246,3250,3267,3316,3327,3364,3410,3421,3448,3476,3504,3532,3599,3626,3631,3636,3650,3661],{"__ignoreMap":25},[30,2219,2220,2222,2225,2227,2229,2231,2233],{"class":32,"line":33},[30,2221,263],{"class":36},[30,2223,2224],{"class":54},"addressSchema",[30,2226,45],{"class":44},[30,2228,876],{"class":54},[30,2230,879],{"class":44},[30,2232,956],{"class":882},[30,2234,959],{"class":44},[30,2236,2237,2240,2242,2244,2246,2248],{"class":32,"line":51},[30,2238,2239],{"class":289},"  street",[30,2241,58],{"class":44},[30,2243,969],{"class":54},[30,2245,879],{"class":44},[30,2247,61],{"class":882},[30,2249,2250],{"class":44},"(),\n",[30,2252,2253,2256,2258,2260,2262,2264],{"class":32,"line":67},[30,2254,2255],{"class":289},"  city",[30,2257,58],{"class":44},[30,2259,969],{"class":54},[30,2261,879],{"class":44},[30,2263,61],{"class":882},[30,2265,2250],{"class":44},[30,2267,2268,2271,2273,2275,2277,2279],{"class":32,"line":85},[30,2269,2270],{"class":289},"  state",[30,2272,58],{"class":44},[30,2274,969],{"class":54},[30,2276,879],{"class":44},[30,2278,61],{"class":882},[30,2280,2250],{"class":44},[30,2282,2283,2286,2288,2290,2292,2294],{"class":32,"line":97},[30,2284,2285],{"class":289},"  zipCode",[30,2287,58],{"class":44},[30,2289,969],{"class":54},[30,2291,879],{"class":44},[30,2293,61],{"class":882},[30,2295,2250],{"class":44},[30,2297,2298,2301,2303,2305,2307,2309],{"class":32,"line":111},[30,2299,2300],{"class":289},"  country",[30,2302,58],{"class":44},[30,2304,969],{"class":54},[30,2306,879],{"class":44},[30,2308,61],{"class":882},[30,2310,1087],{"class":44},[30,2312,2313,2316,2318],{"class":32,"line":124},[30,2314,2315],{"class":44},"}).",[30,2317,979],{"class":882},[30,2319,959],{"class":44},[30,2321,2322,2324,2326,2328,2330,2332],{"class":32,"line":137},[30,2323,2239],{"class":289},[30,2325,58],{"class":44},[30,2327,295],{"class":181},[30,2329,384],{"class":185},[30,2331,295],{"class":181},[30,2333,303],{"class":44},[30,2335,2336,2338,2340,2342,2344,2346],{"class":32,"line":149},[30,2337,2255],{"class":289},[30,2339,58],{"class":44},[30,2341,295],{"class":181},[30,2343,401],{"class":185},[30,2345,295],{"class":181},[30,2347,303],{"class":44},[30,2349,2350,2352,2354,2356,2358,2360],{"class":32,"line":161},[30,2351,2270],{"class":289},[30,2353,58],{"class":44},[30,2355,295],{"class":181},[30,2357,418],{"class":185},[30,2359,295],{"class":181},[30,2361,303],{"class":44},[30,2363,2364,2366,2368,2370,2372,2374],{"class":32,"line":173},[30,2365,2285],{"class":289},[30,2367,58],{"class":44},[30,2369,295],{"class":181},[30,2371,435],{"class":185},[30,2373,295],{"class":181},[30,2375,303],{"class":44},[30,2377,2378,2380,2382,2384,2386],{"class":32,"line":230},[30,2379,2300],{"class":289},[30,2381,58],{"class":44},[30,2383,295],{"class":181},[30,2385,452],{"class":185},[30,2387,455],{"class":181},[30,2389,2390],{"class":32,"line":247},[30,2391,1132],{"class":44},[30,2393,2394],{"class":32,"line":253},[30,2395,257],{"emptyLinePlaceholder":256},[30,2397,2398,2400,2403,2405,2407,2409,2411],{"class":32,"line":260},[30,2399,263],{"class":36},[30,2401,2402],{"class":54},"customerInfoSchema",[30,2404,45],{"class":44},[30,2406,876],{"class":54},[30,2408,879],{"class":44},[30,2410,956],{"class":882},[30,2412,959],{"class":44},[30,2414,2415,2417,2419,2421,2423,2425,2427,2430,2432,2435,2438,2442,2446,2449,2452,2454],{"class":32,"line":280},[30,2416,964],{"class":289},[30,2418,58],{"class":44},[30,2420,969],{"class":54},[30,2422,879],{"class":44},[30,2424,61],{"class":882},[30,2426,976],{"class":44},[30,2428,2429],{"class":882},"regex",[30,2431,901],{"class":44},[30,2433,2434],{"class":181},"/",[30,2436,2437],{"class":1119},"^",[30,2439,2441],{"class":2440},"sWcty","CUST-",[30,2443,2445],{"class":2444},"s4CB5","\\d",[30,2447,2448],{"class":544},"{4}",[30,2450,2451],{"class":1119},"$",[30,2453,2434],{"class":181},[30,2455,990],{"class":44},[30,2457,2458,2460,2462,2464,2466,2468,2470,2473,2475,2477],{"class":32,"line":286},[30,2459,995],{"class":289},[30,2461,58],{"class":44},[30,2463,969],{"class":54},[30,2465,879],{"class":44},[30,2467,61],{"class":882},[30,2469,976],{"class":44},[30,2471,2472],{"class":882},"min",[30,2474,901],{"class":44},[30,2476,645],{"class":544},[30,2478,990],{"class":44},[30,2480,2481,2484,2486,2488,2490,2492,2494,2497],{"class":32,"line":306},[30,2482,2483],{"class":289},"  email",[30,2485,58],{"class":44},[30,2487,969],{"class":54},[30,2489,879],{"class":44},[30,2491,61],{"class":882},[30,2493,976],{"class":44},[30,2495,2496],{"class":882},"email",[30,2498,2250],{"class":44},[30,2500,2501,2504,2506],{"class":32,"line":315},[30,2502,2503],{"class":289},"  shippingAddress",[30,2505,58],{"class":44},[30,2507,2508],{"class":54},"addressSchema\n",[30,2510,2511,2513,2515],{"class":32,"line":332},[30,2512,2315],{"class":44},[30,2514,979],{"class":882},[30,2516,959],{"class":44},[30,2518,2519,2521,2523,2525,2527,2529],{"class":32,"line":349},[30,2520,964],{"class":289},[30,2522,58],{"class":44},[30,2524,295],{"class":181},[30,2526,325],{"class":185},[30,2528,295],{"class":181},[30,2530,303],{"class":44},[30,2532,2533,2535,2537,2539,2541,2543],{"class":32,"line":366},[30,2534,995],{"class":289},[30,2536,58],{"class":44},[30,2538,295],{"class":181},[30,2540,342],{"class":185},[30,2542,295],{"class":181},[30,2544,303],{"class":44},[30,2546,2547,2549,2551,2553,2555,2557],{"class":32,"line":374},[30,2548,2483],{"class":289},[30,2550,58],{"class":44},[30,2552,295],{"class":181},[30,2554,359],{"class":185},[30,2556,295],{"class":181},[30,2558,303],{"class":44},[30,2560,2561],{"class":32,"line":391},[30,2562,1132],{"class":44},[30,2564,2565],{"class":32,"line":408},[30,2566,257],{"emptyLinePlaceholder":256},[30,2568,2569,2571,2574,2576,2578,2580,2582],{"class":32,"line":425},[30,2570,263],{"class":36},[30,2572,2573],{"class":54},"paymentInfoSchema",[30,2575,45],{"class":44},[30,2577,876],{"class":54},[30,2579,879],{"class":44},[30,2581,956],{"class":882},[30,2583,959],{"class":44},[30,2585,2586,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2612,2614],{"class":32,"line":442},[30,2587,2588],{"class":289},"  method",[30,2590,58],{"class":44},[30,2592,969],{"class":54},[30,2594,879],{"class":44},[30,2596,1047],{"class":882},[30,2598,1050],{"class":44},[30,2600,182],{"class":181},[30,2602,705],{"class":185},[30,2604,182],{"class":181},[30,2606,1060],{"class":44},[30,2608,182],{"class":181},[30,2610,2611],{"class":185},"paypal",[30,2613,182],{"class":181},[30,2615,1070],{"class":44},[30,2617,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2651,2653],{"class":32,"line":458},[30,2619,176],{"class":289},[30,2621,58],{"class":44},[30,2623,969],{"class":54},[30,2625,879],{"class":44},[30,2627,1047],{"class":882},[30,2629,1050],{"class":44},[30,2631,182],{"class":181},[30,2633,722],{"class":185},[30,2635,182],{"class":181},[30,2637,1060],{"class":44},[30,2639,182],{"class":181},[30,2641,186],{"class":185},[30,2643,182],{"class":181},[30,2645,1060],{"class":44},[30,2647,182],{"class":181},[30,2649,2650],{"class":185},"failed",[30,2652,182],{"class":181},[30,2654,1070],{"class":44},[30,2656,2657,2660,2662,2664,2666,2668],{"class":32,"line":464},[30,2658,2659],{"class":289},"  transactionId",[30,2661,58],{"class":44},[30,2663,969],{"class":54},[30,2665,879],{"class":44},[30,2667,61],{"class":882},[30,2669,1087],{"class":44},[30,2671,2672,2674,2676],{"class":32,"line":470},[30,2673,2315],{"class":44},[30,2675,979],{"class":882},[30,2677,959],{"class":44},[30,2679,2680,2682,2684,2686,2688,2690],{"class":32,"line":487},[30,2681,2588],{"class":289},[30,2683,58],{"class":44},[30,2685,182],{"class":181},[30,2687,705],{"class":185},[30,2689,182],{"class":181},[30,2691,303],{"class":44},[30,2693,2694,2696,2698,2700,2702,2704],{"class":32,"line":496},[30,2695,176],{"class":289},[30,2697,58],{"class":44},[30,2699,182],{"class":181},[30,2701,186],{"class":185},[30,2703,182],{"class":181},[30,2705,303],{"class":44},[30,2707,2708,2710,2712,2714,2716],{"class":32,"line":502},[30,2709,2659],{"class":289},[30,2711,58],{"class":44},[30,2713,182],{"class":181},[30,2715,739],{"class":185},[30,2717,2718],{"class":181},"'\n",[30,2720,2721],{"class":32,"line":519},[30,2722,1132],{"class":44},[30,2724,2725],{"class":32,"line":536},[30,2726,257],{"emptyLinePlaceholder":256},[30,2728,2729,2731,2734,2736,2738,2740,2742],{"class":32,"line":550},[30,2730,263],{"class":36},[30,2732,2733],{"class":54},"orderItemSchema",[30,2735,45],{"class":44},[30,2737,876],{"class":54},[30,2739,879],{"class":44},[30,2741,956],{"class":882},[30,2743,959],{"class":44},[30,2745,2746,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2770,2772,2775,2777,2779],{"class":32,"line":563},[30,2747,2748],{"class":289},"  productId",[30,2750,58],{"class":44},[30,2752,969],{"class":54},[30,2754,879],{"class":44},[30,2756,61],{"class":882},[30,2758,976],{"class":44},[30,2760,2429],{"class":882},[30,2762,901],{"class":44},[30,2764,2434],{"class":181},[30,2766,2437],{"class":1119},[30,2768,2769],{"class":2440},"PROD-",[30,2771,2445],{"class":2444},[30,2773,2774],{"class":544},"{3}",[30,2776,2451],{"class":1119},[30,2778,2434],{"class":181},[30,2780,990],{"class":44},[30,2782,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801],{"class":32,"line":580},[30,2784,995],{"class":289},[30,2786,58],{"class":44},[30,2788,969],{"class":54},[30,2790,879],{"class":44},[30,2792,61],{"class":882},[30,2794,976],{"class":44},[30,2796,2472],{"class":882},[30,2798,901],{"class":44},[30,2800,645],{"class":544},[30,2802,990],{"class":44},[30,2804,2805,2808,2810,2812,2814,2816,2818,2821,2823,2826],{"class":32,"line":595},[30,2806,2807],{"class":289},"  quantity",[30,2809,58],{"class":44},[30,2811,969],{"class":54},[30,2813,879],{"class":44},[30,2815,132],{"class":882},[30,2817,976],{"class":44},[30,2819,2820],{"class":882},"int",[30,2822,976],{"class":44},[30,2824,2825],{"class":882},"positive",[30,2827,2250],{"class":44},[30,2829,2830,2833,2835,2837,2839,2841,2843,2845],{"class":32,"line":601},[30,2831,2832],{"class":289},"  pricePerUnit",[30,2834,58],{"class":44},[30,2836,969],{"class":54},[30,2838,879],{"class":44},[30,2840,132],{"class":882},[30,2842,976],{"class":44},[30,2844,2825],{"class":882},[30,2846,2250],{"class":44},[30,2848,2849,2852,2854,2856,2858,2860,2862,2865],{"class":32,"line":606},[30,2850,2851],{"class":289},"  color",[30,2853,58],{"class":44},[30,2855,969],{"class":54},[30,2857,879],{"class":44},[30,2859,61],{"class":882},[30,2861,976],{"class":44},[30,2863,2864],{"class":882},"optional",[30,2866,2250],{"class":44},[30,2868,2869,2872,2874,2876,2878,2880,2882,2884,2887,2889,2891,2893,2896,2898,2900,2902,2904,2906,2908,2910,2913,2915,2917,2919,2922,2924,2926,2928,2931,2933,2936,2938],{"class":32,"line":622},[30,2870,2871],{"class":289},"  size",[30,2873,58],{"class":44},[30,2875,969],{"class":54},[30,2877,879],{"class":44},[30,2879,1047],{"class":882},[30,2881,1050],{"class":44},[30,2883,182],{"class":181},[30,2885,2886],{"class":185},"XS",[30,2888,182],{"class":181},[30,2890,1060],{"class":44},[30,2892,182],{"class":181},[30,2894,2895],{"class":185},"S",[30,2897,182],{"class":181},[30,2899,1060],{"class":44},[30,2901,182],{"class":181},[30,2903,590],{"class":185},[30,2905,182],{"class":181},[30,2907,1060],{"class":44},[30,2909,182],{"class":181},[30,2911,2912],{"class":185},"L",[30,2914,182],{"class":181},[30,2916,1060],{"class":44},[30,2918,182],{"class":181},[30,2920,2921],{"class":185},"XL",[30,2923,182],{"class":181},[30,2925,1060],{"class":44},[30,2927,182],{"class":181},[30,2929,2930],{"class":185},"XXL",[30,2932,182],{"class":181},[30,2934,2935],{"class":44},"]).",[30,2937,2864],{"class":882},[30,2939,2250],{"class":44},[30,2941,2942,2945,2947,2949,2951,2953,2955,2957],{"class":32,"line":638},[30,2943,2944],{"class":289},"  variety",[30,2946,58],{"class":44},[30,2948,969],{"class":54},[30,2950,879],{"class":44},[30,2952,61],{"class":882},[30,2954,976],{"class":44},[30,2956,2864],{"class":882},[30,2958,2250],{"class":44},[30,2960,2961,2964,2966,2968,2970,2972,2974,2976,2979,2981,2983,2985,2988,2990,2992,2994,2997,2999,3001,3003,3006,3008,3010,3012],{"class":32,"line":650},[30,2962,2963],{"class":289},"  weight",[30,2965,58],{"class":44},[30,2967,969],{"class":54},[30,2969,879],{"class":44},[30,2971,1047],{"class":882},[30,2973,1050],{"class":44},[30,2975,182],{"class":181},[30,2977,2978],{"class":185},"8oz",[30,2980,182],{"class":181},[30,2982,1060],{"class":44},[30,2984,182],{"class":181},[30,2986,2987],{"class":185},"12oz",[30,2989,182],{"class":181},[30,2991,1060],{"class":44},[30,2993,182],{"class":181},[30,2995,2996],{"class":185},"16oz",[30,2998,182],{"class":181},[30,3000,1060],{"class":44},[30,3002,182],{"class":181},[30,3004,3005],{"class":185},"1lb",[30,3007,182],{"class":181},[30,3009,2935],{"class":44},[30,3011,2864],{"class":882},[30,3013,1087],{"class":44},[30,3015,3016,3018,3020],{"class":32,"line":662},[30,3017,2315],{"class":44},[30,3019,979],{"class":882},[30,3021,959],{"class":44},[30,3023,3024,3026,3028,3030,3033,3035],{"class":32,"line":676},[30,3025,2748],{"class":289},[30,3027,58],{"class":44},[30,3029,295],{"class":181},[30,3031,3032],{"class":185},"PROD-001",[30,3034,295],{"class":181},[30,3036,303],{"class":44},[30,3038,3039,3041,3043,3045,3048,3050],{"class":32,"line":681},[30,3040,995],{"class":289},[30,3042,58],{"class":44},[30,3044,295],{"class":181},[30,3046,3047],{"class":185},"Sample Product",[30,3049,295],{"class":181},[30,3051,303],{"class":44},[30,3053,3054,3056,3058,3060],{"class":32,"line":687},[30,3055,2807],{"class":289},[30,3057,58],{"class":44},[30,3059,645],{"class":544},[30,3061,303],{"class":44},[30,3063,3064,3066,3068,3070],{"class":32,"line":695},[30,3065,2832],{"class":289},[30,3067,58],{"class":44},[30,3069,558],{"class":544},[30,3071,303],{"class":44},[30,3073,3074,3076,3078,3080,3083,3085],{"class":32,"line":712},[30,3075,2851],{"class":289},[30,3077,58],{"class":44},[30,3079,295],{"class":181},[30,3081,3082],{"class":185},"Black",[30,3084,295],{"class":181},[30,3086,303],{"class":44},[30,3088,3089,3091,3093,3095,3097],{"class":32,"line":729},[30,3090,2871],{"class":289},[30,3092,58],{"class":44},[30,3094,295],{"class":181},[30,3096,590],{"class":185},[30,3098,455],{"class":181},[30,3100,3101],{"class":32,"line":744},[30,3102,1132],{"class":44},[30,3104,3105],{"class":32,"line":749},[30,3106,257],{"emptyLinePlaceholder":256},[30,3108,3109,3111,3114,3116,3119,3121],{"class":32,"line":762},[30,3110,263],{"class":36},[30,3112,3113],{"class":882},"generateOrderId",[30,3115,45],{"class":44},[30,3117,3118],{"class":44}," ()",[30,3120,1782],{"class":44},[30,3122,48],{"class":44},[30,3124,3125,3127,3130,3132,3135,3138,3140,3143],{"class":32,"line":775},[30,3126,1739],{"class":36},[30,3128,3129],{"class":54},"year",[30,3131,45],{"class":44},[30,3133,3134],{"class":36}," new ",[30,3136,3137],{"class":882},"Date",[30,3139,976],{"class":44},[30,3141,3142],{"class":882},"getFullYear",[30,3144,885],{"class":44},[30,3146,3147,3149,3152,3154,3157,3159,3162,3164,3167,3169,3172,3175,3178,3181,3184,3187,3189,3192,3194,3197,3199,3202,3205,3207],{"class":32,"line":788},[30,3148,1739],{"class":36},[30,3150,3151],{"class":54},"randomNum",[30,3153,45],{"class":44},[30,3155,3156],{"class":54}," Math",[30,3158,879],{"class":44},[30,3160,3161],{"class":882},"floor",[30,3163,901],{"class":44},[30,3165,3166],{"class":54},"Math",[30,3168,879],{"class":44},[30,3170,3171],{"class":882},"random",[30,3173,3174],{"class":44},"()",[30,3176,3177],{"class":36}," * ",[30,3179,3180],{"class":544},"1000",[30,3182,3183],{"class":44},").",[30,3185,3186],{"class":882},"toString",[30,3188,976],{"class":44},[30,3190,3191],{"class":882},"padStart",[30,3193,901],{"class":44},[30,3195,3196],{"class":544},"3",[30,3198,1843],{"class":44},[30,3200,3201],{"class":181}," '",[30,3203,3204],{"class":185},"0",[30,3206,182],{"class":181},[30,3208,3209],{"class":44},");\n",[30,3211,3212,3214,3217,3220,3223,3225,3228,3231,3233,3235,3237,3240],{"class":32,"line":801},[30,3213,1927],{"class":1119},[30,3215,3216],{"class":181}," `",[30,3218,3219],{"class":185},"ORD-",[30,3221,3222],{"class":1119},"${",[30,3224,3129],{"class":185},[30,3226,3227],{"class":1119},"}",[30,3229,3230],{"class":185},"-",[30,3232,3222],{"class":1119},[30,3234,3151],{"class":185},[30,3236,3227],{"class":1119},[30,3238,3239],{"class":181},"`",[30,3241,64],{"class":44},[30,3243,3244],{"class":32,"line":817},[30,3245,250],{"class":44},[30,3247,3248],{"class":32,"line":832},[30,3249,257],{"emptyLinePlaceholder":256},[30,3251,3252,3254,3257,3259,3261,3263,3265],{"class":32,"line":838},[30,3253,263],{"class":36},[30,3255,3256],{"class":54},"orderSchema",[30,3258,45],{"class":44},[30,3260,876],{"class":54},[30,3262,879],{"class":44},[30,3264,956],{"class":882},[30,3266,959],{"class":44},[30,3268,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309,3311,3313],{"class":32,"line":844},[30,3270,55],{"class":289},[30,3272,58],{"class":44},[30,3274,969],{"class":54},[30,3276,879],{"class":44},[30,3278,61],{"class":882},[30,3280,976],{"class":44},[30,3282,2429],{"class":882},[30,3284,901],{"class":44},[30,3286,2434],{"class":181},[30,3288,2437],{"class":1119},[30,3290,3219],{"class":2440},[30,3292,2445],{"class":2444},[30,3294,2448],{"class":544},[30,3296,3230],{"class":2440},[30,3298,2445],{"class":2444},[30,3300,2774],{"class":544},[30,3302,2451],{"class":1119},[30,3304,2434],{"class":181},[30,3306,3183],{"class":44},[30,3308,979],{"class":882},[30,3310,901],{"class":44},[30,3312,3113],{"class":882},[30,3314,3315],{"class":44},"()),\n",[30,3317,3319,3321,3323,3325],{"class":32,"line":3318},62,[30,3320,70],{"class":289},[30,3322,58],{"class":44},[30,3324,2402],{"class":54},[30,3326,303],{"class":44},[30,3328,3330,3332,3334,3336,3338,3340,3342,3345,3347,3349,3351,3354,3357,3359,3362],{"class":32,"line":3329},63,[30,3331,88],{"class":289},[30,3333,58],{"class":44},[30,3335,969],{"class":54},[30,3337,879],{"class":44},[30,3339,61],{"class":882},[30,3341,976],{"class":44},[30,3343,3344],{"class":882},"datetime",[30,3346,976],{"class":44},[30,3348,979],{"class":882},[30,3350,901],{"class":44},[30,3352,3353],{"class":36},"new",[30,3355,3356],{"class":882}," Date",[30,3358,976],{"class":44},[30,3360,3361],{"class":882},"toISOString",[30,3363,3315],{"class":44},[30,3365,3367,3369,3371,3373,3375,3378,3380,3382,3384,3386,3388,3390,3392,3394,3396,3398,3400,3402,3404,3407],{"class":32,"line":3366},64,[30,3368,100],{"class":289},[30,3370,58],{"class":44},[30,3372,969],{"class":54},[30,3374,879],{"class":44},[30,3376,3377],{"class":882},"array",[30,3379,901],{"class":44},[30,3381,2733],{"class":54},[30,3383,3183],{"class":44},[30,3385,2472],{"class":882},[30,3387,901],{"class":44},[30,3389,645],{"class":544},[30,3391,3183],{"class":44},[30,3393,979],{"class":882},[30,3395,1050],{"class":44},[30,3397,2733],{"class":54},[30,3399,879],{"class":44},[30,3401,898],{"class":882},[30,3403,901],{"class":44},[30,3405,3406],{"class":36},"undefined",[30,3408,3409],{"class":44},")]),\n",[30,3411,3413,3415,3417,3419],{"class":32,"line":3412},65,[30,3414,114],{"class":289},[30,3416,58],{"class":44},[30,3418,2573],{"class":54},[30,3420,303],{"class":44},[30,3422,3424,3426,3428,3430,3432,3434,3436,3438,3440,3442,3444,3446],{"class":32,"line":3423},66,[30,3425,127],{"class":289},[30,3427,58],{"class":44},[30,3429,969],{"class":54},[30,3431,879],{"class":44},[30,3433,132],{"class":882},[30,3435,976],{"class":44},[30,3437,2825],{"class":882},[30,3439,976],{"class":44},[30,3441,979],{"class":882},[30,3443,901],{"class":44},[30,3445,558],{"class":544},[30,3447,990],{"class":44},[30,3449,3451,3453,3455,3457,3459,3461,3463,3466,3468,3470,3472,3474],{"class":32,"line":3450},67,[30,3452,140],{"class":289},[30,3454,58],{"class":44},[30,3456,969],{"class":54},[30,3458,879],{"class":44},[30,3460,132],{"class":882},[30,3462,976],{"class":44},[30,3464,3465],{"class":882},"nonnegative",[30,3467,976],{"class":44},[30,3469,979],{"class":882},[30,3471,901],{"class":44},[30,3473,770],{"class":544},[30,3475,990],{"class":44},[30,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3499,3502],{"class":32,"line":3478},68,[30,3480,152],{"class":289},[30,3482,58],{"class":44},[30,3484,969],{"class":54},[30,3486,879],{"class":44},[30,3488,132],{"class":882},[30,3490,976],{"class":44},[30,3492,3465],{"class":882},[30,3494,976],{"class":44},[30,3496,979],{"class":882},[30,3498,901],{"class":44},[30,3500,3501],{"class":544},"3.00",[30,3503,990],{"class":44},[30,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523,3525,3527,3530],{"class":32,"line":3506},69,[30,3508,164],{"class":289},[30,3510,58],{"class":44},[30,3512,969],{"class":54},[30,3514,879],{"class":44},[30,3516,132],{"class":882},[30,3518,976],{"class":44},[30,3520,2825],{"class":882},[30,3522,976],{"class":44},[30,3524,979],{"class":882},[30,3526,901],{"class":44},[30,3528,3529],{"class":544},"38.98",[30,3531,990],{"class":44},[30,3533,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597],{"class":32,"line":3534},70,[30,3536,176],{"class":289},[30,3538,58],{"class":44},[30,3540,969],{"class":54},[30,3542,879],{"class":44},[30,3544,1047],{"class":882},[30,3546,1050],{"class":44},[30,3548,182],{"class":181},[30,3550,186],{"class":185},[30,3552,182],{"class":181},[30,3554,1060],{"class":44},[30,3556,182],{"class":181},[30,3558,196],{"class":185},[30,3560,182],{"class":181},[30,3562,1060],{"class":44},[30,3564,182],{"class":181},[30,3566,205],{"class":185},[30,3568,182],{"class":181},[30,3570,1060],{"class":44},[30,3572,182],{"class":181},[30,3574,214],{"class":185},[30,3576,182],{"class":181},[30,3578,1060],{"class":44},[30,3580,182],{"class":181},[30,3582,223],{"class":185},[30,3584,182],{"class":181},[30,3586,2935],{"class":44},[30,3588,979],{"class":882},[30,3590,901],{"class":44},[30,3592,182],{"class":181},[30,3594,186],{"class":185},[30,3596,182],{"class":181},[30,3598,990],{"class":44},[30,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624],{"class":32,"line":3601},71,[30,3603,233],{"class":289},[30,3605,58],{"class":44},[30,3607,969],{"class":54},[30,3609,879],{"class":44},[30,3611,61],{"class":882},[30,3613,976],{"class":44},[30,3615,979],{"class":882},[30,3617,901],{"class":44},[30,3619,182],{"class":181},[30,3621,827],{"class":185},[30,3623,182],{"class":181},[30,3625,1824],{"class":44},[30,3627,3629],{"class":32,"line":3628},72,[30,3630,1132],{"class":44},[30,3632,3634],{"class":32,"line":3633},73,[30,3635,257],{"emptyLinePlaceholder":256},[30,3637,3639,3641,3644,3646,3648],{"class":32,"line":3638},74,[30,3640,263],{"class":36},[30,3642,3643],{"class":54},"orderItem",[30,3645,45],{"class":44},[30,3647,1626],{"class":882},[30,3649,959],{"class":44},[30,3651,3653,3655,3657,3659],{"class":32,"line":3652},75,[30,3654,1633],{"class":289},[30,3656,58],{"class":44},[30,3658,3256],{"class":54},[30,3660,303],{"class":44},[30,3662,3664],{"class":32,"line":3663},76,[30,3665,1132],{"class":44},[10,3667,3668],{},"The above implementation will return a single object using all of the default values! But we can do better than that — we can now (with the help of a few overload definitions and internal parsing) create arrays of objects, perfect for the use case of mocking API responses:",[20,3670,3672],{"className":22,"code":3671,"language":24,"meta":25,"style":25},"const orders = zodObjectBuilder({\n  schema: orderSchema,\n  config: { preserveNestedDefaults: true },\n  overrides: [\n    { // Each object is a fully defined object with the default values! :)\n      status: \"delivered\"\n    },\n    {\n      status: \"shipped\"\n    },\n    {\n      status: \"pending\"\n    },\n    {\n      status: \"processing\"\n    },\n    {\n      status: \"cancelled\"\n    },\n  ]\n});\n",[27,3673,3674,3687,3697,3711,3717,3725,3737,3741,3746,3758,3762,3766,3778,3782,3786,3798,3802,3806,3818,3822,3827],{"__ignoreMap":25},[30,3675,3676,3678,3681,3683,3685],{"class":32,"line":33},[30,3677,263],{"class":36},[30,3679,3680],{"class":54},"orders",[30,3682,45],{"class":44},[30,3684,1626],{"class":882},[30,3686,959],{"class":44},[30,3688,3689,3691,3693,3695],{"class":32,"line":51},[30,3690,1633],{"class":289},[30,3692,58],{"class":44},[30,3694,3256],{"class":54},[30,3696,303],{"class":44},[30,3698,3699,3701,3703,3705,3707,3709],{"class":32,"line":67},[30,3700,2143],{"class":289},[30,3702,1647],{"class":44},[30,3704,1799],{"class":289},[30,3706,58],{"class":44},[30,3708,1120],{"class":1119},[30,3710,2154],{"class":44},[30,3712,3713,3715],{"class":32,"line":85},[30,3714,1644],{"class":289},[30,3716,493],{"class":44},[30,3718,3719,3722],{"class":32,"line":97},[30,3720,3721],{"class":44},"    { ",[30,3723,3724],{"class":81},"// Each object is a fully defined object with the default values! :)\n",[30,3726,3727,3729,3731,3733,3735],{"class":32,"line":111},[30,3728,715],{"class":289},[30,3730,58],{"class":44},[30,3732,295],{"class":181},[30,3734,214],{"class":185},[30,3736,455],{"class":181},[30,3738,3739],{"class":32,"line":124},[30,3740,467],{"class":44},[30,3742,3743],{"class":32,"line":137},[30,3744,3745],{"class":44},"    {\n",[30,3747,3748,3750,3752,3754,3756],{"class":32,"line":149},[30,3749,715],{"class":289},[30,3751,58],{"class":44},[30,3753,295],{"class":181},[30,3755,205],{"class":185},[30,3757,455],{"class":181},[30,3759,3760],{"class":32,"line":161},[30,3761,467],{"class":44},[30,3763,3764],{"class":32,"line":173},[30,3765,3745],{"class":44},[30,3767,3768,3770,3772,3774,3776],{"class":32,"line":230},[30,3769,715],{"class":289},[30,3771,58],{"class":44},[30,3773,295],{"class":181},[30,3775,186],{"class":185},[30,3777,455],{"class":181},[30,3779,3780],{"class":32,"line":247},[30,3781,467],{"class":44},[30,3783,3784],{"class":32,"line":253},[30,3785,3745],{"class":44},[30,3787,3788,3790,3792,3794,3796],{"class":32,"line":260},[30,3789,715],{"class":289},[30,3791,58],{"class":44},[30,3793,295],{"class":181},[30,3795,196],{"class":185},[30,3797,455],{"class":181},[30,3799,3800],{"class":32,"line":280},[30,3801,467],{"class":44},[30,3803,3804],{"class":32,"line":286},[30,3805,3745],{"class":44},[30,3807,3808,3810,3812,3814,3816],{"class":32,"line":306},[30,3809,715],{"class":289},[30,3811,58],{"class":44},[30,3813,295],{"class":181},[30,3815,223],{"class":185},[30,3817,455],{"class":181},[30,3819,3820],{"class":32,"line":315},[30,3821,467],{"class":44},[30,3823,3824],{"class":32,"line":332},[30,3825,3826],{"class":44},"  ]\n",[30,3828,3829],{"class":32,"line":349},[30,3830,1132],{"class":44},[10,3832,3833,3834,3836],{},"The above outputs an array of orders with the full default values, with overridden delivery statuses! Hopefully this demonstrates how ",[27,3835,2208],{}," can minimise the effort required to create a new mock based on a reliable type-safe schema.",[10,3838,3839,3840,3842,3843,3850],{},"With that little demonstration we've reached the end of my first article 🙂 I hope you've enjoyed reading this journey of exploration into improving mocking. ",[27,3841,2208],{}," is still being built, but it's serving my needs well to minimise mocked objects. If you'd like to play around with the current version, you can find it at ",[3844,3845,3849],"a",{"href":3846,"rel":3847},"https://www.npmjs.com/package/@crbroughton/ts-utils",[3848],"nofollow","npmjs.com/package/@crbroughton/ts-utils"," which includes the function.",[3852,3853,3854],"style",{},"html pre.shiki code .s_wWq, html code.shiki .s_wWq{--shiki-default:#CB7676}html pre.shiki code .syEag, html code.shiki .syEag{--shiki-default:#5DA994}html pre.shiki code .sK117, html code.shiki .sK117{--shiki-default:#444444}html pre.shiki code .st-jp, html code.shiki .st-jp{--shiki-default:#BD976A}html pre.shiki code .sux-A, html code.shiki .sux-A{--shiki-default:#758575DD}html pre.shiki code .sNJcY, html code.shiki .sNJcY{--shiki-default:#C98A7D77}html pre.shiki code .s7rlk, html code.shiki .s7rlk{--shiki-default:#C98A7D}html pre.shiki code .sm68I, html code.shiki .sm68I{--shiki-default:#B8A965}html pre.shiki code .sxA9i, html code.shiki .sxA9i{--shiki-default:#4C9A91}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 pre.shiki code .sCK9x, html code.shiki .sCK9x{--shiki-default:#80A665}html pre.shiki code .s3QIE, html code.shiki .s3QIE{--shiki-default:#4D9375}html pre.shiki code .sWcty, html code.shiki .sWcty{--shiki-default:#C4704F}html pre.shiki code .s4CB5, html code.shiki .s4CB5{--shiki-default:#6872AB}",{"title":25,"searchDepth":51,"depth":51,"links":3856},[],"2024-12-27","An article detailing how to use zodObjectBuilder to improve your mocking experiences","md",{},"/blog/how-ive-been-trying-to-improve-mocking-with-zod",{"title":5,"description":3858},"blog/how-ive-been-trying-to-improve-mocking-with-zod",[3865,3866,3867],"TypeScript","Zod","Testing","_MNCbuKCmHtSfr3ezh-omWbWEbXm4ciW4DbWFkjIJkQ",1777827578753]