[{"data":1,"prerenderedAt":2819},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-structured-errors":75,"-core-concepts-structured-errors-surround":2814},[4,30,50],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"children":54,"page":29},"Adapters","/adapters","3.adapters",[55,60,65,70],{"title":56,"path":57,"stem":58,"icon":59},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":61,"path":62,"stem":63,"icon":64},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":66,"path":67,"stem":68,"icon":69},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":71,"path":72,"stem":73,"icon":74},"Custom Adapters","/adapters/custom","3.adapters/4.custom","i-lucide-code",{"id":76,"title":41,"body":77,"description":2805,"extension":2806,"links":2807,"meta":2810,"navigation":2811,"path":42,"seo":2812,"stem":43,"__hash__":2813},"docs/2.core-concepts/2.structured-errors.md",{"type":78,"value":79,"toc":2787},"minimark",[80,89,94,97,147,163,166,417,421,514,518,523,650,654,862,866,869,1001,1005,1012,1516,1520,1523,1842,1845,1849,2126,2130,2286,2290,2293,2769,2773,2783],[81,82,83,84,88],"p",{},"evlog provides a ",[85,86,87],"code",{},"createError()"," function that creates errors with rich, actionable context.",[90,91,93],"h2",{"id":92},"why-structured-errors","Why Structured Errors?",[81,95,96],{},"Traditional errors are often unhelpful:",[98,99,105],"pre",{"className":100,"code":101,"filename":102,"language":103,"meta":104,"style":104},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Unhelpful error\nthrow new Error('Payment failed')\n","server/api/checkout.post.ts","typescript","",[85,106,107,116],{"__ignoreMap":104},[108,109,112],"span",{"class":110,"line":111},"line",1,[108,113,115],{"class":114},"sHwdD","// Unhelpful error\n",[108,117,119,123,127,131,135,138,142,144],{"class":110,"line":118},2,[108,120,122],{"class":121},"s7zQu","throw",[108,124,126],{"class":125},"sMK4o"," new",[108,128,130],{"class":129},"s2Zo4"," Error",[108,132,134],{"class":133},"sTEyZ","(",[108,136,137],{"class":125},"'",[108,139,141],{"class":140},"sfazB","Payment failed",[108,143,137],{"class":125},[108,145,146],{"class":133},")\n",[81,148,149,150,154,155,158,159,162],{},"This tells you ",[151,152,153],"em",{},"what"," happened, but not ",[151,156,157],{},"why"," or ",[151,160,161],{},"how to fix it",".",[81,164,165],{},"Structured errors provide context:",[167,168,169,285],"code-group",{},[98,170,173],{"className":100,"code":171,"filename":172,"language":103,"meta":104,"style":104},"// server/api/checkout.post.ts\nthrow createError({\n  message: 'Payment failed',\n  status: 402,\n  why: 'Card declined by issuer (insufficient funds)',\n  fix: 'Try a different payment method or contact your bank',\n  link: 'https://docs.example.com/payments/declined',\n})\n","Code",[85,174,175,180,192,212,226,243,260,277],{"__ignoreMap":104},[108,176,177],{"class":110,"line":111},[108,178,179],{"class":114},"// server/api/checkout.post.ts\n",[108,181,182,184,187,189],{"class":110,"line":118},[108,183,122],{"class":121},[108,185,186],{"class":129}," createError",[108,188,134],{"class":133},[108,190,191],{"class":125},"{\n",[108,193,195,199,202,205,207,209],{"class":110,"line":194},3,[108,196,198],{"class":197},"swJcz","  message",[108,200,201],{"class":125},":",[108,203,204],{"class":125}," '",[108,206,141],{"class":140},[108,208,137],{"class":125},[108,210,211],{"class":125},",\n",[108,213,215,218,220,224],{"class":110,"line":214},4,[108,216,217],{"class":197},"  status",[108,219,201],{"class":125},[108,221,223],{"class":222},"sbssI"," 402",[108,225,211],{"class":125},[108,227,229,232,234,236,239,241],{"class":110,"line":228},5,[108,230,231],{"class":197},"  why",[108,233,201],{"class":125},[108,235,204],{"class":125},[108,237,238],{"class":140},"Card declined by issuer (insufficient funds)",[108,240,137],{"class":125},[108,242,211],{"class":125},[108,244,246,249,251,253,256,258],{"class":110,"line":245},6,[108,247,248],{"class":197},"  fix",[108,250,201],{"class":125},[108,252,204],{"class":125},[108,254,255],{"class":140},"Try a different payment method or contact your bank",[108,257,137],{"class":125},[108,259,211],{"class":125},[108,261,263,266,268,270,273,275],{"class":110,"line":262},7,[108,264,265],{"class":197},"  link",[108,267,201],{"class":125},[108,269,204],{"class":125},[108,271,272],{"class":140},"https://docs.example.com/payments/declined",[108,274,137],{"class":125},[108,276,211],{"class":125},[108,278,280,283],{"class":110,"line":279},8,[108,281,282],{"class":125},"}",[108,284,146],{"class":133},[98,286,291],{"className":287,"code":288,"filename":289,"language":290,"meta":104,"style":104},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"statusCode\": 402,\n  \"message\": \"Payment failed\",\n  \"data\": {\n    \"why\": \"Card declined by issuer (insufficient funds)\",\n    \"fix\": \"Try a different payment method or contact your bank\",\n    \"link\": \"https://docs.example.com/payments/declined\"\n  }\n}\n","Response","json",[85,292,293,297,315,335,349,369,388,406,411],{"__ignoreMap":104},[108,294,295],{"class":110,"line":111},[108,296,191],{"class":125},[108,298,299,302,306,309,311,313],{"class":110,"line":118},[108,300,301],{"class":125},"  \"",[108,303,305],{"class":304},"spNyl","statusCode",[108,307,308],{"class":125},"\"",[108,310,201],{"class":125},[108,312,223],{"class":222},[108,314,211],{"class":125},[108,316,317,319,322,324,326,329,331,333],{"class":110,"line":194},[108,318,301],{"class":125},[108,320,321],{"class":304},"message",[108,323,308],{"class":125},[108,325,201],{"class":125},[108,327,328],{"class":125}," \"",[108,330,141],{"class":140},[108,332,308],{"class":125},[108,334,211],{"class":125},[108,336,337,339,342,344,346],{"class":110,"line":214},[108,338,301],{"class":125},[108,340,341],{"class":304},"data",[108,343,308],{"class":125},[108,345,201],{"class":125},[108,347,348],{"class":125}," {\n",[108,350,351,354,357,359,361,363,365,367],{"class":110,"line":228},[108,352,353],{"class":125},"    \"",[108,355,157],{"class":356},"sBMFI",[108,358,308],{"class":125},[108,360,201],{"class":125},[108,362,328],{"class":125},[108,364,238],{"class":140},[108,366,308],{"class":125},[108,368,211],{"class":125},[108,370,371,373,376,378,380,382,384,386],{"class":110,"line":245},[108,372,353],{"class":125},[108,374,375],{"class":356},"fix",[108,377,308],{"class":125},[108,379,201],{"class":125},[108,381,328],{"class":125},[108,383,255],{"class":140},[108,385,308],{"class":125},[108,387,211],{"class":125},[108,389,390,392,395,397,399,401,403],{"class":110,"line":262},[108,391,353],{"class":125},[108,393,394],{"class":356},"link",[108,396,308],{"class":125},[108,398,201],{"class":125},[108,400,328],{"class":125},[108,402,272],{"class":140},[108,404,405],{"class":125},"\"\n",[108,407,408],{"class":110,"line":279},[108,409,410],{"class":125},"  }\n",[108,412,414],{"class":110,"line":413},9,[108,415,416],{"class":125},"}\n",[90,418,420],{"id":419},"error-fields","Error Fields",[422,423,424,440],"table",{},[425,426,427],"thead",{},[428,429,430,434,437],"tr",{},[431,432,433],"th",{},"Field",[431,435,436],{},"Required",[431,438,439],{},"Description",[441,442,443,456,469,480,491,502],"tbody",{},[428,444,445,450,453],{},[446,447,448],"td",{},[85,449,321],{},[446,451,452],{},"Yes",[446,454,455],{},"What happened (shown to users)",[428,457,458,463,466],{},[446,459,460],{},[85,461,462],{},"status",[446,464,465],{},"No",[446,467,468],{},"HTTP status code (default: 500)",[428,470,471,475,477],{},[446,472,473],{},[85,474,157],{},[446,476,465],{},[446,478,479],{},"Technical reason (for debugging)",[428,481,482,486,488],{},[446,483,484],{},[85,485,375],{},[446,487,465],{},[446,489,490],{},"Actionable solution",[428,492,493,497,499],{},[446,494,495],{},[85,496,394],{},[446,498,465],{},[446,500,501],{},"Documentation URL",[428,503,504,509,511],{},[446,505,506],{},[85,507,508],{},"cause",[446,510,465],{},[446,512,513],{},"Original error (for error chaining)",[90,515,517],{"id":516},"basic-usage","Basic Usage",[519,520,522],"h3",{"id":521},"simple-error","Simple Error",[167,524,525,607],{},[98,526,528],{"className":100,"code":527,"filename":172,"language":103,"meta":104,"style":104},"// server/api/users/[id].get.ts\nimport { createError } from 'evlog'\n\nthrow createError({\n  message: 'User not found',\n  status: 404,\n})\n",[85,529,530,535,559,565,575,590,601],{"__ignoreMap":104},[108,531,532],{"class":110,"line":111},[108,533,534],{"class":114},"// server/api/users/[id].get.ts\n",[108,536,537,540,543,545,548,551,553,556],{"class":110,"line":118},[108,538,539],{"class":121},"import",[108,541,542],{"class":125}," {",[108,544,186],{"class":133},[108,546,547],{"class":125}," }",[108,549,550],{"class":121}," from",[108,552,204],{"class":125},[108,554,555],{"class":140},"evlog",[108,557,558],{"class":125},"'\n",[108,560,561],{"class":110,"line":194},[108,562,564],{"emptyLinePlaceholder":563},true,"\n",[108,566,567,569,571,573],{"class":110,"line":214},[108,568,122],{"class":121},[108,570,186],{"class":129},[108,572,134],{"class":133},[108,574,191],{"class":125},[108,576,577,579,581,583,586,588],{"class":110,"line":228},[108,578,198],{"class":197},[108,580,201],{"class":125},[108,582,204],{"class":125},[108,584,585],{"class":140},"User not found",[108,587,137],{"class":125},[108,589,211],{"class":125},[108,591,592,594,596,599],{"class":110,"line":245},[108,593,217],{"class":197},[108,595,201],{"class":125},[108,597,598],{"class":222}," 404",[108,600,211],{"class":125},[108,602,603,605],{"class":110,"line":262},[108,604,282],{"class":125},[108,606,146],{"class":133},[98,608,610],{"className":287,"code":609,"filename":289,"language":290,"meta":104,"style":104},"{\n  \"statusCode\": 404,\n  \"message\": \"User not found\"\n}\n",[85,611,612,616,630,646],{"__ignoreMap":104},[108,613,614],{"class":110,"line":111},[108,615,191],{"class":125},[108,617,618,620,622,624,626,628],{"class":110,"line":118},[108,619,301],{"class":125},[108,621,305],{"class":304},[108,623,308],{"class":125},[108,625,201],{"class":125},[108,627,598],{"class":222},[108,629,211],{"class":125},[108,631,632,634,636,638,640,642,644],{"class":110,"line":194},[108,633,301],{"class":125},[108,635,321],{"class":304},[108,637,308],{"class":125},[108,639,201],{"class":125},[108,641,328],{"class":125},[108,643,585],{"class":140},[108,645,405],{"class":125},[108,647,648],{"class":110,"line":214},[108,649,416],{"class":125},[519,651,653],{"id":652},"error-with-full-context","Error with Full Context",[167,655,656,749],{},[98,657,659],{"className":100,"code":658,"filename":172,"language":103,"meta":104,"style":104},"// server/api/checkout.post.ts\nthrow createError({\n  message: 'Payment failed',\n  status: 402,\n  why: 'Card declined by issuer',\n  fix: 'Try a different payment method',\n  link: 'https://docs.example.com/payments/declined',\n})\n",[85,660,661,665,675,689,699,714,729,743],{"__ignoreMap":104},[108,662,663],{"class":110,"line":111},[108,664,179],{"class":114},[108,666,667,669,671,673],{"class":110,"line":118},[108,668,122],{"class":121},[108,670,186],{"class":129},[108,672,134],{"class":133},[108,674,191],{"class":125},[108,676,677,679,681,683,685,687],{"class":110,"line":194},[108,678,198],{"class":197},[108,680,201],{"class":125},[108,682,204],{"class":125},[108,684,141],{"class":140},[108,686,137],{"class":125},[108,688,211],{"class":125},[108,690,691,693,695,697],{"class":110,"line":214},[108,692,217],{"class":197},[108,694,201],{"class":125},[108,696,223],{"class":222},[108,698,211],{"class":125},[108,700,701,703,705,707,710,712],{"class":110,"line":228},[108,702,231],{"class":197},[108,704,201],{"class":125},[108,706,204],{"class":125},[108,708,709],{"class":140},"Card declined by issuer",[108,711,137],{"class":125},[108,713,211],{"class":125},[108,715,716,718,720,722,725,727],{"class":110,"line":245},[108,717,248],{"class":197},[108,719,201],{"class":125},[108,721,204],{"class":125},[108,723,724],{"class":140},"Try a different payment method",[108,726,137],{"class":125},[108,728,211],{"class":125},[108,730,731,733,735,737,739,741],{"class":110,"line":262},[108,732,265],{"class":197},[108,734,201],{"class":125},[108,736,204],{"class":125},[108,738,272],{"class":140},[108,740,137],{"class":125},[108,742,211],{"class":125},[108,744,745,747],{"class":110,"line":279},[108,746,282],{"class":125},[108,748,146],{"class":133},[98,750,752],{"className":287,"code":751,"filename":289,"language":290,"meta":104,"style":104},"{\n  \"statusCode\": 402,\n  \"message\": \"Payment failed\",\n  \"data\": {\n    \"why\": \"Card declined by issuer\",\n    \"fix\": \"Try a different payment method\",\n    \"link\": \"https://docs.example.com/payments/declined\"\n  }\n}\n",[85,753,754,758,772,790,802,820,838,854,858],{"__ignoreMap":104},[108,755,756],{"class":110,"line":111},[108,757,191],{"class":125},[108,759,760,762,764,766,768,770],{"class":110,"line":118},[108,761,301],{"class":125},[108,763,305],{"class":304},[108,765,308],{"class":125},[108,767,201],{"class":125},[108,769,223],{"class":222},[108,771,211],{"class":125},[108,773,774,776,778,780,782,784,786,788],{"class":110,"line":194},[108,775,301],{"class":125},[108,777,321],{"class":304},[108,779,308],{"class":125},[108,781,201],{"class":125},[108,783,328],{"class":125},[108,785,141],{"class":140},[108,787,308],{"class":125},[108,789,211],{"class":125},[108,791,792,794,796,798,800],{"class":110,"line":214},[108,793,301],{"class":125},[108,795,341],{"class":304},[108,797,308],{"class":125},[108,799,201],{"class":125},[108,801,348],{"class":125},[108,803,804,806,808,810,812,814,816,818],{"class":110,"line":228},[108,805,353],{"class":125},[108,807,157],{"class":356},[108,809,308],{"class":125},[108,811,201],{"class":125},[108,813,328],{"class":125},[108,815,709],{"class":140},[108,817,308],{"class":125},[108,819,211],{"class":125},[108,821,822,824,826,828,830,832,834,836],{"class":110,"line":245},[108,823,353],{"class":125},[108,825,375],{"class":356},[108,827,308],{"class":125},[108,829,201],{"class":125},[108,831,328],{"class":125},[108,833,724],{"class":140},[108,835,308],{"class":125},[108,837,211],{"class":125},[108,839,840,842,844,846,848,850,852],{"class":110,"line":262},[108,841,353],{"class":125},[108,843,394],{"class":356},[108,845,308],{"class":125},[108,847,201],{"class":125},[108,849,328],{"class":125},[108,851,272],{"class":140},[108,853,405],{"class":125},[108,855,856],{"class":110,"line":279},[108,857,410],{"class":125},[108,859,860],{"class":110,"line":413},[108,861,416],{"class":125},[519,863,865],{"id":864},"error-chaining","Error Chaining",[81,867,868],{},"Wrap underlying errors while preserving the original:",[98,870,872],{"className":100,"code":871,"filename":102,"language":103,"meta":104,"style":104},"try {\n  await stripe.charges.create(charge)\n} catch (err) {\n  throw createError({\n    message: 'Payment processing failed',\n    status: 500,\n    why: 'Stripe API returned an error',\n    cause: err, // Original error preserved\n  })\n}\n",[85,873,874,881,906,918,929,945,957,973,989,996],{"__ignoreMap":104},[108,875,876,879],{"class":110,"line":111},[108,877,878],{"class":121},"try",[108,880,348],{"class":125},[108,882,883,886,889,891,894,896,899,901,904],{"class":110,"line":118},[108,884,885],{"class":121},"  await",[108,887,888],{"class":133}," stripe",[108,890,162],{"class":125},[108,892,893],{"class":133},"charges",[108,895,162],{"class":125},[108,897,898],{"class":129},"create",[108,900,134],{"class":197},[108,902,903],{"class":133},"charge",[108,905,146],{"class":197},[108,907,908,910,913,916],{"class":110,"line":194},[108,909,282],{"class":125},[108,911,912],{"class":121}," catch",[108,914,915],{"class":133}," (err) ",[108,917,191],{"class":125},[108,919,920,923,925,927],{"class":110,"line":214},[108,921,922],{"class":121},"  throw",[108,924,186],{"class":129},[108,926,134],{"class":197},[108,928,191],{"class":125},[108,930,931,934,936,938,941,943],{"class":110,"line":228},[108,932,933],{"class":197},"    message",[108,935,201],{"class":125},[108,937,204],{"class":125},[108,939,940],{"class":140},"Payment processing failed",[108,942,137],{"class":125},[108,944,211],{"class":125},[108,946,947,950,952,955],{"class":110,"line":245},[108,948,949],{"class":197},"    status",[108,951,201],{"class":125},[108,953,954],{"class":222}," 500",[108,956,211],{"class":125},[108,958,959,962,964,966,969,971],{"class":110,"line":262},[108,960,961],{"class":197},"    why",[108,963,201],{"class":125},[108,965,204],{"class":125},[108,967,968],{"class":140},"Stripe API returned an error",[108,970,137],{"class":125},[108,972,211],{"class":125},[108,974,975,978,980,983,986],{"class":110,"line":279},[108,976,977],{"class":197},"    cause",[108,979,201],{"class":125},[108,981,982],{"class":133}," err",[108,984,985],{"class":125},",",[108,987,988],{"class":114}," // Original error preserved\n",[108,990,991,994],{"class":110,"line":413},[108,992,993],{"class":125},"  }",[108,995,146],{"class":197},[108,997,999],{"class":110,"line":998},10,[108,1000,416],{"class":125},[90,1002,1004],{"id":1003},"frontend-error-handling","Frontend Error Handling",[81,1006,1007,1008,1011],{},"Use ",[85,1009,1010],{},"parseError()"," to extract all fields from caught errors:",[167,1013,1014,1230],{},[98,1015,1017],{"className":100,"code":1016,"filename":172,"language":103,"meta":104,"style":104},"// composables/useCheckout.ts\nimport { parseError } from 'evlog'\n\ntry {\n  await $fetch('/api/checkout', { method: 'POST', body: cart })\n} catch (err) {\n  const error = parseError(err)\n\n  console.log(error.message)  // \"Payment failed\"\n  console.log(error.status)   // 402\n  console.log(error.why)      // \"Card declined\"\n  console.log(error.fix)      // \"Try another card\"\n}\n",[85,1018,1019,1024,1043,1047,1053,1099,1109,1129,1133,1158,1180,1203,1225],{"__ignoreMap":104},[108,1020,1021],{"class":110,"line":111},[108,1022,1023],{"class":114},"// composables/useCheckout.ts\n",[108,1025,1026,1028,1030,1033,1035,1037,1039,1041],{"class":110,"line":118},[108,1027,539],{"class":121},[108,1029,542],{"class":125},[108,1031,1032],{"class":133}," parseError",[108,1034,547],{"class":125},[108,1036,550],{"class":121},[108,1038,204],{"class":125},[108,1040,555],{"class":140},[108,1042,558],{"class":125},[108,1044,1045],{"class":110,"line":194},[108,1046,564],{"emptyLinePlaceholder":563},[108,1048,1049,1051],{"class":110,"line":214},[108,1050,878],{"class":121},[108,1052,348],{"class":125},[108,1054,1055,1057,1060,1062,1064,1067,1069,1071,1073,1076,1078,1080,1083,1085,1087,1090,1092,1095,1097],{"class":110,"line":228},[108,1056,885],{"class":121},[108,1058,1059],{"class":129}," $fetch",[108,1061,134],{"class":197},[108,1063,137],{"class":125},[108,1065,1066],{"class":140},"/api/checkout",[108,1068,137],{"class":125},[108,1070,985],{"class":125},[108,1072,542],{"class":125},[108,1074,1075],{"class":197}," method",[108,1077,201],{"class":125},[108,1079,204],{"class":125},[108,1081,1082],{"class":140},"POST",[108,1084,137],{"class":125},[108,1086,985],{"class":125},[108,1088,1089],{"class":197}," body",[108,1091,201],{"class":125},[108,1093,1094],{"class":133}," cart",[108,1096,547],{"class":125},[108,1098,146],{"class":197},[108,1100,1101,1103,1105,1107],{"class":110,"line":245},[108,1102,282],{"class":125},[108,1104,912],{"class":121},[108,1106,915],{"class":133},[108,1108,191],{"class":125},[108,1110,1111,1114,1117,1120,1122,1124,1127],{"class":110,"line":262},[108,1112,1113],{"class":304},"  const",[108,1115,1116],{"class":133}," error",[108,1118,1119],{"class":125}," =",[108,1121,1032],{"class":129},[108,1123,134],{"class":197},[108,1125,1126],{"class":133},"err",[108,1128,146],{"class":197},[108,1130,1131],{"class":110,"line":279},[108,1132,564],{"emptyLinePlaceholder":563},[108,1134,1135,1138,1140,1143,1145,1148,1150,1152,1155],{"class":110,"line":413},[108,1136,1137],{"class":133},"  console",[108,1139,162],{"class":125},[108,1141,1142],{"class":129},"log",[108,1144,134],{"class":197},[108,1146,1147],{"class":133},"error",[108,1149,162],{"class":125},[108,1151,321],{"class":133},[108,1153,1154],{"class":197},")  ",[108,1156,1157],{"class":114},"// \"Payment failed\"\n",[108,1159,1160,1162,1164,1166,1168,1170,1172,1174,1177],{"class":110,"line":998},[108,1161,1137],{"class":133},[108,1163,162],{"class":125},[108,1165,1142],{"class":129},[108,1167,134],{"class":197},[108,1169,1147],{"class":133},[108,1171,162],{"class":125},[108,1173,462],{"class":133},[108,1175,1176],{"class":197},")   ",[108,1178,1179],{"class":114},"// 402\n",[108,1181,1183,1185,1187,1189,1191,1193,1195,1197,1200],{"class":110,"line":1182},11,[108,1184,1137],{"class":133},[108,1186,162],{"class":125},[108,1188,1142],{"class":129},[108,1190,134],{"class":197},[108,1192,1147],{"class":133},[108,1194,162],{"class":125},[108,1196,157],{"class":133},[108,1198,1199],{"class":197},")      ",[108,1201,1202],{"class":114},"// \"Card declined\"\n",[108,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222],{"class":110,"line":1205},12,[108,1207,1137],{"class":133},[108,1209,162],{"class":125},[108,1211,1142],{"class":129},[108,1213,134],{"class":197},[108,1215,1147],{"class":133},[108,1217,162],{"class":125},[108,1219,375],{"class":133},[108,1221,1199],{"class":197},[108,1223,1224],{"class":114},"// \"Try another card\"\n",[108,1226,1228],{"class":110,"line":1227},13,[108,1229,416],{"class":125},[98,1231,1234],{"className":100,"code":1232,"filename":1233,"language":103,"meta":104,"style":104},"// composables/useCheckout.ts\nimport { parseError } from 'evlog'\n\nconst toast = useToast()\n\ntry {\n  await $fetch('/api/checkout', { method: 'POST', body: cart })\n} catch (err) {\n  const error = parseError(err)\n\n  toast.add({\n    title: error.message,\n    description: error.why,\n    color: 'error',\n    actions: error.link\n      ? [{ label: 'Learn more', onClick: () => window.open(error.link) }]\n      : undefined,\n  })\n}\n","With Nuxt UI Toast",[85,1235,1236,1240,1258,1262,1279,1283,1289,1329,1339,1355,1359,1373,1388,1403,1419,1434,1495,1504,1511],{"__ignoreMap":104},[108,1237,1238],{"class":110,"line":111},[108,1239,1023],{"class":114},[108,1241,1242,1244,1246,1248,1250,1252,1254,1256],{"class":110,"line":118},[108,1243,539],{"class":121},[108,1245,542],{"class":125},[108,1247,1032],{"class":133},[108,1249,547],{"class":125},[108,1251,550],{"class":121},[108,1253,204],{"class":125},[108,1255,555],{"class":140},[108,1257,558],{"class":125},[108,1259,1260],{"class":110,"line":194},[108,1261,564],{"emptyLinePlaceholder":563},[108,1263,1264,1267,1270,1273,1276],{"class":110,"line":214},[108,1265,1266],{"class":304},"const",[108,1268,1269],{"class":133}," toast ",[108,1271,1272],{"class":125},"=",[108,1274,1275],{"class":129}," useToast",[108,1277,1278],{"class":133},"()\n",[108,1280,1281],{"class":110,"line":228},[108,1282,564],{"emptyLinePlaceholder":563},[108,1284,1285,1287],{"class":110,"line":245},[108,1286,878],{"class":121},[108,1288,348],{"class":125},[108,1290,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327],{"class":110,"line":262},[108,1292,885],{"class":121},[108,1294,1059],{"class":129},[108,1296,134],{"class":197},[108,1298,137],{"class":125},[108,1300,1066],{"class":140},[108,1302,137],{"class":125},[108,1304,985],{"class":125},[108,1306,542],{"class":125},[108,1308,1075],{"class":197},[108,1310,201],{"class":125},[108,1312,204],{"class":125},[108,1314,1082],{"class":140},[108,1316,137],{"class":125},[108,1318,985],{"class":125},[108,1320,1089],{"class":197},[108,1322,201],{"class":125},[108,1324,1094],{"class":133},[108,1326,547],{"class":125},[108,1328,146],{"class":197},[108,1330,1331,1333,1335,1337],{"class":110,"line":279},[108,1332,282],{"class":125},[108,1334,912],{"class":121},[108,1336,915],{"class":133},[108,1338,191],{"class":125},[108,1340,1341,1343,1345,1347,1349,1351,1353],{"class":110,"line":413},[108,1342,1113],{"class":304},[108,1344,1116],{"class":133},[108,1346,1119],{"class":125},[108,1348,1032],{"class":129},[108,1350,134],{"class":197},[108,1352,1126],{"class":133},[108,1354,146],{"class":197},[108,1356,1357],{"class":110,"line":998},[108,1358,564],{"emptyLinePlaceholder":563},[108,1360,1361,1364,1366,1369,1371],{"class":110,"line":1182},[108,1362,1363],{"class":133},"  toast",[108,1365,162],{"class":125},[108,1367,1368],{"class":129},"add",[108,1370,134],{"class":197},[108,1372,191],{"class":125},[108,1374,1375,1378,1380,1382,1384,1386],{"class":110,"line":1205},[108,1376,1377],{"class":197},"    title",[108,1379,201],{"class":125},[108,1381,1116],{"class":133},[108,1383,162],{"class":125},[108,1385,321],{"class":133},[108,1387,211],{"class":125},[108,1389,1390,1393,1395,1397,1399,1401],{"class":110,"line":1227},[108,1391,1392],{"class":197},"    description",[108,1394,201],{"class":125},[108,1396,1116],{"class":133},[108,1398,162],{"class":125},[108,1400,157],{"class":133},[108,1402,211],{"class":125},[108,1404,1406,1409,1411,1413,1415,1417],{"class":110,"line":1405},14,[108,1407,1408],{"class":197},"    color",[108,1410,201],{"class":125},[108,1412,204],{"class":125},[108,1414,1147],{"class":140},[108,1416,137],{"class":125},[108,1418,211],{"class":125},[108,1420,1422,1425,1427,1429,1431],{"class":110,"line":1421},15,[108,1423,1424],{"class":197},"    actions",[108,1426,201],{"class":125},[108,1428,1116],{"class":133},[108,1430,162],{"class":125},[108,1432,1433],{"class":133},"link\n",[108,1435,1437,1440,1443,1446,1449,1451,1453,1456,1458,1460,1463,1465,1468,1471,1474,1476,1479,1481,1483,1485,1487,1490,1492],{"class":110,"line":1436},16,[108,1438,1439],{"class":125},"      ?",[108,1441,1442],{"class":197}," [",[108,1444,1445],{"class":125},"{",[108,1447,1448],{"class":197}," label",[108,1450,201],{"class":125},[108,1452,204],{"class":125},[108,1454,1455],{"class":140},"Learn more",[108,1457,137],{"class":125},[108,1459,985],{"class":125},[108,1461,1462],{"class":129}," onClick",[108,1464,201],{"class":125},[108,1466,1467],{"class":125}," ()",[108,1469,1470],{"class":304}," =>",[108,1472,1473],{"class":133}," window",[108,1475,162],{"class":125},[108,1477,1478],{"class":129},"open",[108,1480,134],{"class":197},[108,1482,1147],{"class":133},[108,1484,162],{"class":125},[108,1486,394],{"class":133},[108,1488,1489],{"class":197},") ",[108,1491,282],{"class":125},[108,1493,1494],{"class":197},"]\n",[108,1496,1498,1501],{"class":110,"line":1497},17,[108,1499,1500],{"class":125},"      :",[108,1502,1503],{"class":125}," undefined,\n",[108,1505,1507,1509],{"class":110,"line":1506},18,[108,1508,993],{"class":125},[108,1510,146],{"class":197},[108,1512,1514],{"class":110,"line":1513},19,[108,1515,416],{"class":125},[519,1517,1519],{"id":1518},"error-display-component","Error Display Component",[81,1521,1522],{},"Create a reusable error display:",[98,1524,1529],{"className":1525,"code":1526,"filename":1527,"language":1528,"meta":104,"style":104},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { parseError } from 'evlog'\n\nconst { error } = defineProps\u003C{\n  error: unknown\n}>()\n\nconst parsed = computed(() => parseError(error))\n\u003C/script>\n\n\u003Ctemplate>\n  \u003CUAlert\n    :title=\"parsed.message\"\n    :description=\"parsed.why\"\n    color=\"error\"\n    icon=\"i-lucide-alert-circle\"\n  >\n    \u003Ctemplate v-if=\"parsed.fix\" #description>\n      \u003Cp>{{ parsed.why }}\u003C/p>\n      \u003Cp class=\"mt-2 font-medium\">{{ parsed.fix }}\u003C/p>\n    \u003C/template>\n  \u003C/UAlert>\n\u003C/template>\n","components/ErrorAlert.vue","vue",[85,1530,1531,1557,1575,1579,1598,1608,1615,1619,1643,1652,1656,1665,1673,1687,1701,1713,1727,1732,1763,1782,1812,1822,1833],{"__ignoreMap":104},[108,1532,1533,1536,1539,1542,1545,1547,1549,1552,1554],{"class":110,"line":111},[108,1534,1535],{"class":125},"\u003C",[108,1537,1538],{"class":197},"script",[108,1540,1541],{"class":304}," setup",[108,1543,1544],{"class":304}," lang",[108,1546,1272],{"class":125},[108,1548,308],{"class":125},[108,1550,1551],{"class":140},"ts",[108,1553,308],{"class":125},[108,1555,1556],{"class":125},">\n",[108,1558,1559,1561,1563,1565,1567,1569,1571,1573],{"class":110,"line":118},[108,1560,539],{"class":121},[108,1562,542],{"class":125},[108,1564,1032],{"class":133},[108,1566,547],{"class":125},[108,1568,550],{"class":121},[108,1570,204],{"class":125},[108,1572,555],{"class":140},[108,1574,558],{"class":125},[108,1576,1577],{"class":110,"line":194},[108,1578,564],{"emptyLinePlaceholder":563},[108,1580,1581,1583,1585,1588,1590,1592,1595],{"class":110,"line":214},[108,1582,1266],{"class":304},[108,1584,542],{"class":125},[108,1586,1587],{"class":133}," error ",[108,1589,282],{"class":125},[108,1591,1119],{"class":125},[108,1593,1594],{"class":129}," defineProps",[108,1596,1597],{"class":125},"\u003C{\n",[108,1599,1600,1603,1605],{"class":110,"line":228},[108,1601,1602],{"class":197},"  error",[108,1604,201],{"class":125},[108,1606,1607],{"class":356}," unknown\n",[108,1609,1610,1613],{"class":110,"line":245},[108,1611,1612],{"class":125},"}>",[108,1614,1278],{"class":133},[108,1616,1617],{"class":110,"line":262},[108,1618,564],{"emptyLinePlaceholder":563},[108,1620,1621,1623,1626,1628,1631,1633,1636,1638,1640],{"class":110,"line":279},[108,1622,1266],{"class":304},[108,1624,1625],{"class":133}," parsed ",[108,1627,1272],{"class":125},[108,1629,1630],{"class":129}," computed",[108,1632,134],{"class":133},[108,1634,1635],{"class":125},"()",[108,1637,1470],{"class":304},[108,1639,1032],{"class":129},[108,1641,1642],{"class":133},"(error))\n",[108,1644,1645,1648,1650],{"class":110,"line":413},[108,1646,1647],{"class":125},"\u003C/",[108,1649,1538],{"class":197},[108,1651,1556],{"class":125},[108,1653,1654],{"class":110,"line":998},[108,1655,564],{"emptyLinePlaceholder":563},[108,1657,1658,1660,1663],{"class":110,"line":1182},[108,1659,1535],{"class":125},[108,1661,1662],{"class":197},"template",[108,1664,1556],{"class":125},[108,1666,1667,1670],{"class":110,"line":1205},[108,1668,1669],{"class":125},"  \u003C",[108,1671,1672],{"class":197},"UAlert\n",[108,1674,1675,1678,1680,1682,1685],{"class":110,"line":1227},[108,1676,1677],{"class":304},"    :title",[108,1679,1272],{"class":125},[108,1681,308],{"class":125},[108,1683,1684],{"class":140},"parsed.message",[108,1686,405],{"class":125},[108,1688,1689,1692,1694,1696,1699],{"class":110,"line":1405},[108,1690,1691],{"class":304},"    :description",[108,1693,1272],{"class":125},[108,1695,308],{"class":125},[108,1697,1698],{"class":140},"parsed.why",[108,1700,405],{"class":125},[108,1702,1703,1705,1707,1709,1711],{"class":110,"line":1421},[108,1704,1408],{"class":304},[108,1706,1272],{"class":125},[108,1708,308],{"class":125},[108,1710,1147],{"class":140},[108,1712,405],{"class":125},[108,1714,1715,1718,1720,1722,1725],{"class":110,"line":1436},[108,1716,1717],{"class":304},"    icon",[108,1719,1272],{"class":125},[108,1721,308],{"class":125},[108,1723,1724],{"class":140},"i-lucide-alert-circle",[108,1726,405],{"class":125},[108,1728,1729],{"class":110,"line":1497},[108,1730,1731],{"class":125},"  >\n",[108,1733,1734,1737,1739,1742,1744,1746,1749,1751,1753,1755,1758,1761],{"class":110,"line":1506},[108,1735,1736],{"class":125},"    \u003C",[108,1738,1662],{"class":197},[108,1740,1741],{"class":121}," v-if",[108,1743,1272],{"class":125},[108,1745,308],{"class":125},[108,1747,1748],{"class":133},"parsed",[108,1750,162],{"class":125},[108,1752,375],{"class":133},[108,1754,308],{"class":125},[108,1756,1757],{"class":125}," #",[108,1759,1760],{"class":304},"description",[108,1762,1556],{"class":125},[108,1764,1765,1768,1770,1773,1776,1778,1780],{"class":110,"line":1513},[108,1766,1767],{"class":125},"      \u003C",[108,1769,81],{"class":197},[108,1771,1772],{"class":125},">",[108,1774,1775],{"class":133},"{{ parsed.why }}",[108,1777,1647],{"class":125},[108,1779,81],{"class":197},[108,1781,1556],{"class":125},[108,1783,1785,1787,1789,1792,1794,1796,1799,1801,1803,1806,1808,1810],{"class":110,"line":1784},20,[108,1786,1767],{"class":125},[108,1788,81],{"class":197},[108,1790,1791],{"class":304}," class",[108,1793,1272],{"class":125},[108,1795,308],{"class":125},[108,1797,1798],{"class":140},"mt-2 font-medium",[108,1800,308],{"class":125},[108,1802,1772],{"class":125},[108,1804,1805],{"class":133},"{{ parsed.fix }}",[108,1807,1647],{"class":125},[108,1809,81],{"class":197},[108,1811,1556],{"class":125},[108,1813,1815,1818,1820],{"class":110,"line":1814},21,[108,1816,1817],{"class":125},"    \u003C/",[108,1819,1662],{"class":197},[108,1821,1556],{"class":125},[108,1823,1825,1828,1831],{"class":110,"line":1824},22,[108,1826,1827],{"class":125},"  \u003C/",[108,1829,1830],{"class":197},"UAlert",[108,1832,1556],{"class":125},[108,1834,1836,1838,1840],{"class":110,"line":1835},23,[108,1837,1647],{"class":125},[108,1839,1662],{"class":197},[108,1841,1556],{"class":125},[90,1843,46],{"id":1844},"best-practices",[519,1846,1848],{"id":1847},"use-appropriate-status-codes","Use Appropriate Status Codes",[167,1850,1851,1919,2002,2054],{},[98,1852,1855],{"className":100,"code":1853,"filename":1854,"language":103,"meta":104,"style":104},"// Client error - user can fix\nthrow createError({\n  message: 'Invalid email format',\n  status: 400,\n  fix: 'Please enter a valid email address',\n})\n","400 - Bad Request",[85,1856,1857,1862,1872,1887,1898,1913],{"__ignoreMap":104},[108,1858,1859],{"class":110,"line":111},[108,1860,1861],{"class":114},"// Client error - user can fix\n",[108,1863,1864,1866,1868,1870],{"class":110,"line":118},[108,1865,122],{"class":121},[108,1867,186],{"class":129},[108,1869,134],{"class":133},[108,1871,191],{"class":125},[108,1873,1874,1876,1878,1880,1883,1885],{"class":110,"line":194},[108,1875,198],{"class":197},[108,1877,201],{"class":125},[108,1879,204],{"class":125},[108,1881,1882],{"class":140},"Invalid email format",[108,1884,137],{"class":125},[108,1886,211],{"class":125},[108,1888,1889,1891,1893,1896],{"class":110,"line":214},[108,1890,217],{"class":197},[108,1892,201],{"class":125},[108,1894,1895],{"class":222}," 400",[108,1897,211],{"class":125},[108,1899,1900,1902,1904,1906,1909,1911],{"class":110,"line":228},[108,1901,248],{"class":197},[108,1903,201],{"class":125},[108,1905,204],{"class":125},[108,1907,1908],{"class":140},"Please enter a valid email address",[108,1910,137],{"class":125},[108,1912,211],{"class":125},[108,1914,1915,1917],{"class":110,"line":245},[108,1916,282],{"class":125},[108,1918,146],{"class":133},[98,1920,1923],{"className":100,"code":1921,"filename":1922,"language":103,"meta":104,"style":104},"// Authentication required\nthrow createError({\n  message: 'Please log in to continue',\n  status: 401,\n  fix: 'Sign in to your account',\n  link: '/login',\n})\n","401 - Unauthorized",[85,1924,1925,1930,1940,1955,1966,1981,1996],{"__ignoreMap":104},[108,1926,1927],{"class":110,"line":111},[108,1928,1929],{"class":114},"// Authentication required\n",[108,1931,1932,1934,1936,1938],{"class":110,"line":118},[108,1933,122],{"class":121},[108,1935,186],{"class":129},[108,1937,134],{"class":133},[108,1939,191],{"class":125},[108,1941,1942,1944,1946,1948,1951,1953],{"class":110,"line":194},[108,1943,198],{"class":197},[108,1945,201],{"class":125},[108,1947,204],{"class":125},[108,1949,1950],{"class":140},"Please log in to continue",[108,1952,137],{"class":125},[108,1954,211],{"class":125},[108,1956,1957,1959,1961,1964],{"class":110,"line":214},[108,1958,217],{"class":197},[108,1960,201],{"class":125},[108,1962,1963],{"class":222}," 401",[108,1965,211],{"class":125},[108,1967,1968,1970,1972,1974,1977,1979],{"class":110,"line":228},[108,1969,248],{"class":197},[108,1971,201],{"class":125},[108,1973,204],{"class":125},[108,1975,1976],{"class":140},"Sign in to your account",[108,1978,137],{"class":125},[108,1980,211],{"class":125},[108,1982,1983,1985,1987,1989,1992,1994],{"class":110,"line":245},[108,1984,265],{"class":197},[108,1986,201],{"class":125},[108,1988,204],{"class":125},[108,1990,1991],{"class":140},"/login",[108,1993,137],{"class":125},[108,1995,211],{"class":125},[108,1997,1998,2000],{"class":110,"line":262},[108,1999,282],{"class":125},[108,2001,146],{"class":133},[98,2003,2006],{"className":100,"code":2004,"filename":2005,"language":103,"meta":104,"style":104},"// Resource not found\nthrow createError({\n  message: 'Order not found',\n  status: 404,\n})\n","404 - Not Found",[85,2007,2008,2013,2023,2038,2048],{"__ignoreMap":104},[108,2009,2010],{"class":110,"line":111},[108,2011,2012],{"class":114},"// Resource not found\n",[108,2014,2015,2017,2019,2021],{"class":110,"line":118},[108,2016,122],{"class":121},[108,2018,186],{"class":129},[108,2020,134],{"class":133},[108,2022,191],{"class":125},[108,2024,2025,2027,2029,2031,2034,2036],{"class":110,"line":194},[108,2026,198],{"class":197},[108,2028,201],{"class":125},[108,2030,204],{"class":125},[108,2032,2033],{"class":140},"Order not found",[108,2035,137],{"class":125},[108,2037,211],{"class":125},[108,2039,2040,2042,2044,2046],{"class":110,"line":214},[108,2041,217],{"class":197},[108,2043,201],{"class":125},[108,2045,598],{"class":222},[108,2047,211],{"class":125},[108,2049,2050,2052],{"class":110,"line":228},[108,2051,282],{"class":125},[108,2053,146],{"class":133},[98,2055,2058],{"className":100,"code":2056,"filename":2057,"language":103,"meta":104,"style":104},"// Server error - not user's fault\nthrow createError({\n  message: 'Something went wrong',\n  status: 500,\n  why: 'Database connection timeout',\n  // No 'fix' - user can't fix server errors\n})\n","500 - Server Error",[85,2059,2060,2065,2075,2090,2100,2115,2120],{"__ignoreMap":104},[108,2061,2062],{"class":110,"line":111},[108,2063,2064],{"class":114},"// Server error - not user's fault\n",[108,2066,2067,2069,2071,2073],{"class":110,"line":118},[108,2068,122],{"class":121},[108,2070,186],{"class":129},[108,2072,134],{"class":133},[108,2074,191],{"class":125},[108,2076,2077,2079,2081,2083,2086,2088],{"class":110,"line":194},[108,2078,198],{"class":197},[108,2080,201],{"class":125},[108,2082,204],{"class":125},[108,2084,2085],{"class":140},"Something went wrong",[108,2087,137],{"class":125},[108,2089,211],{"class":125},[108,2091,2092,2094,2096,2098],{"class":110,"line":214},[108,2093,217],{"class":197},[108,2095,201],{"class":125},[108,2097,954],{"class":222},[108,2099,211],{"class":125},[108,2101,2102,2104,2106,2108,2111,2113],{"class":110,"line":228},[108,2103,231],{"class":197},[108,2105,201],{"class":125},[108,2107,204],{"class":125},[108,2109,2110],{"class":140},"Database connection timeout",[108,2112,137],{"class":125},[108,2114,211],{"class":125},[108,2116,2117],{"class":110,"line":245},[108,2118,2119],{"class":114},"  // No 'fix' - user can't fix server errors\n",[108,2121,2122,2124],{"class":110,"line":262},[108,2123,282],{"class":125},[108,2125,146],{"class":133},[519,2127,2129],{"id":2128},"provide-actionable-fixes","Provide Actionable Fixes",[167,2131,2132,2189],{},[98,2133,2136],{"className":100,"code":2134,"filename":2135,"language":103,"meta":104,"style":104},"// Unhelpful fix\nthrow createError({\n  message: 'Upload failed',\n  fix: 'Try again',\n})\n","Bad",[85,2137,2138,2143,2153,2168,2183],{"__ignoreMap":104},[108,2139,2140],{"class":110,"line":111},[108,2141,2142],{"class":114},"// Unhelpful fix\n",[108,2144,2145,2147,2149,2151],{"class":110,"line":118},[108,2146,122],{"class":121},[108,2148,186],{"class":129},[108,2150,134],{"class":133},[108,2152,191],{"class":125},[108,2154,2155,2157,2159,2161,2164,2166],{"class":110,"line":194},[108,2156,198],{"class":197},[108,2158,201],{"class":125},[108,2160,204],{"class":125},[108,2162,2163],{"class":140},"Upload failed",[108,2165,137],{"class":125},[108,2167,211],{"class":125},[108,2169,2170,2172,2174,2176,2179,2181],{"class":110,"line":214},[108,2171,248],{"class":197},[108,2173,201],{"class":125},[108,2175,204],{"class":125},[108,2177,2178],{"class":140},"Try again",[108,2180,137],{"class":125},[108,2182,211],{"class":125},[108,2184,2185,2187],{"class":110,"line":228},[108,2186,282],{"class":125},[108,2188,146],{"class":133},[98,2190,2193],{"className":100,"code":2191,"filename":2192,"language":103,"meta":104,"style":104},"// Actionable fix\nthrow createError({\n  message: 'Upload failed',\n  status: 413,\n  why: 'File exceeds maximum size (10MB)',\n  fix: 'Reduce the file size or compress the image before uploading',\n  link: '/docs/upload-limits',\n})\n","Good",[85,2194,2195,2200,2210,2224,2235,2250,2265,2280],{"__ignoreMap":104},[108,2196,2197],{"class":110,"line":111},[108,2198,2199],{"class":114},"// Actionable fix\n",[108,2201,2202,2204,2206,2208],{"class":110,"line":118},[108,2203,122],{"class":121},[108,2205,186],{"class":129},[108,2207,134],{"class":133},[108,2209,191],{"class":125},[108,2211,2212,2214,2216,2218,2220,2222],{"class":110,"line":194},[108,2213,198],{"class":197},[108,2215,201],{"class":125},[108,2217,204],{"class":125},[108,2219,2163],{"class":140},[108,2221,137],{"class":125},[108,2223,211],{"class":125},[108,2225,2226,2228,2230,2233],{"class":110,"line":214},[108,2227,217],{"class":197},[108,2229,201],{"class":125},[108,2231,2232],{"class":222}," 413",[108,2234,211],{"class":125},[108,2236,2237,2239,2241,2243,2246,2248],{"class":110,"line":228},[108,2238,231],{"class":197},[108,2240,201],{"class":125},[108,2242,204],{"class":125},[108,2244,2245],{"class":140},"File exceeds maximum size (10MB)",[108,2247,137],{"class":125},[108,2249,211],{"class":125},[108,2251,2252,2254,2256,2258,2261,2263],{"class":110,"line":245},[108,2253,248],{"class":197},[108,2255,201],{"class":125},[108,2257,204],{"class":125},[108,2259,2260],{"class":140},"Reduce the file size or compress the image before uploading",[108,2262,137],{"class":125},[108,2264,211],{"class":125},[108,2266,2267,2269,2271,2273,2276,2278],{"class":110,"line":262},[108,2268,265],{"class":197},[108,2270,201],{"class":125},[108,2272,204],{"class":125},[108,2274,2275],{"class":140},"/docs/upload-limits",[108,2277,137],{"class":125},[108,2279,211],{"class":125},[108,2281,2282,2284],{"class":110,"line":279},[108,2283,282],{"class":125},[108,2285,146],{"class":133},[90,2287,2289],{"id":2288},"error-categories","Error Categories",[81,2291,2292],{},"Consider creating factory functions for common error types:",[167,2294,2295,2606],{},[98,2296,2299],{"className":100,"code":2297,"filename":2298,"language":103,"meta":104,"style":104},"// server/utils/errors.ts\nimport { createError } from 'evlog'\n\nexport const errors = {\n  notFound: (resource: string) =>\n    createError({\n      message: `${resource} not found`,\n      status: 404,\n    }),\n\n  unauthorized: () =>\n    createError({\n      message: 'Please log in to continue',\n      status: 401,\n      fix: 'Sign in to your account',\n    }),\n\n  validation: (field: string, issue: string) =>\n    createError({\n      message: `Invalid ${field}`,\n      status: 400,\n      why: issue,\n      fix: `Please provide a valid ${field}`,\n    }),\n}\n","Definition",[85,2300,2301,2306,2324,2328,2343,2368,2377,2399,2410,2419,2423,2434,2442,2456,2466,2481,2489,2493,2522,2530,2552,2562,2573,2592,2601],{"__ignoreMap":104},[108,2302,2303],{"class":110,"line":111},[108,2304,2305],{"class":114},"// server/utils/errors.ts\n",[108,2307,2308,2310,2312,2314,2316,2318,2320,2322],{"class":110,"line":118},[108,2309,539],{"class":121},[108,2311,542],{"class":125},[108,2313,186],{"class":133},[108,2315,547],{"class":125},[108,2317,550],{"class":121},[108,2319,204],{"class":125},[108,2321,555],{"class":140},[108,2323,558],{"class":125},[108,2325,2326],{"class":110,"line":194},[108,2327,564],{"emptyLinePlaceholder":563},[108,2329,2330,2333,2336,2339,2341],{"class":110,"line":214},[108,2331,2332],{"class":121},"export",[108,2334,2335],{"class":304}," const",[108,2337,2338],{"class":133}," errors ",[108,2340,1272],{"class":125},[108,2342,348],{"class":125},[108,2344,2345,2348,2350,2353,2357,2359,2362,2365],{"class":110,"line":228},[108,2346,2347],{"class":129},"  notFound",[108,2349,201],{"class":125},[108,2351,2352],{"class":125}," (",[108,2354,2356],{"class":2355},"sHdIc","resource",[108,2358,201],{"class":125},[108,2360,2361],{"class":356}," string",[108,2363,2364],{"class":125},")",[108,2366,2367],{"class":304}," =>\n",[108,2369,2370,2373,2375],{"class":110,"line":245},[108,2371,2372],{"class":129},"    createError",[108,2374,134],{"class":133},[108,2376,191],{"class":125},[108,2378,2379,2382,2384,2387,2389,2391,2394,2397],{"class":110,"line":262},[108,2380,2381],{"class":197},"      message",[108,2383,201],{"class":125},[108,2385,2386],{"class":125}," `${",[108,2388,2356],{"class":133},[108,2390,282],{"class":125},[108,2392,2393],{"class":140}," not found",[108,2395,2396],{"class":125},"`",[108,2398,211],{"class":125},[108,2400,2401,2404,2406,2408],{"class":110,"line":279},[108,2402,2403],{"class":197},"      status",[108,2405,201],{"class":125},[108,2407,598],{"class":222},[108,2409,211],{"class":125},[108,2411,2412,2415,2417],{"class":110,"line":413},[108,2413,2414],{"class":125},"    }",[108,2416,2364],{"class":133},[108,2418,211],{"class":125},[108,2420,2421],{"class":110,"line":998},[108,2422,564],{"emptyLinePlaceholder":563},[108,2424,2425,2428,2430,2432],{"class":110,"line":1182},[108,2426,2427],{"class":129},"  unauthorized",[108,2429,201],{"class":125},[108,2431,1467],{"class":125},[108,2433,2367],{"class":304},[108,2435,2436,2438,2440],{"class":110,"line":1205},[108,2437,2372],{"class":129},[108,2439,134],{"class":133},[108,2441,191],{"class":125},[108,2443,2444,2446,2448,2450,2452,2454],{"class":110,"line":1227},[108,2445,2381],{"class":197},[108,2447,201],{"class":125},[108,2449,204],{"class":125},[108,2451,1950],{"class":140},[108,2453,137],{"class":125},[108,2455,211],{"class":125},[108,2457,2458,2460,2462,2464],{"class":110,"line":1405},[108,2459,2403],{"class":197},[108,2461,201],{"class":125},[108,2463,1963],{"class":222},[108,2465,211],{"class":125},[108,2467,2468,2471,2473,2475,2477,2479],{"class":110,"line":1421},[108,2469,2470],{"class":197},"      fix",[108,2472,201],{"class":125},[108,2474,204],{"class":125},[108,2476,1976],{"class":140},[108,2478,137],{"class":125},[108,2480,211],{"class":125},[108,2482,2483,2485,2487],{"class":110,"line":1436},[108,2484,2414],{"class":125},[108,2486,2364],{"class":133},[108,2488,211],{"class":125},[108,2490,2491],{"class":110,"line":1497},[108,2492,564],{"emptyLinePlaceholder":563},[108,2494,2495,2498,2500,2502,2505,2507,2509,2511,2514,2516,2518,2520],{"class":110,"line":1506},[108,2496,2497],{"class":129},"  validation",[108,2499,201],{"class":125},[108,2501,2352],{"class":125},[108,2503,2504],{"class":2355},"field",[108,2506,201],{"class":125},[108,2508,2361],{"class":356},[108,2510,985],{"class":125},[108,2512,2513],{"class":2355}," issue",[108,2515,201],{"class":125},[108,2517,2361],{"class":356},[108,2519,2364],{"class":125},[108,2521,2367],{"class":304},[108,2523,2524,2526,2528],{"class":110,"line":1513},[108,2525,2372],{"class":129},[108,2527,134],{"class":133},[108,2529,191],{"class":125},[108,2531,2532,2534,2536,2539,2542,2545,2547,2550],{"class":110,"line":1784},[108,2533,2381],{"class":197},[108,2535,201],{"class":125},[108,2537,2538],{"class":125}," `",[108,2540,2541],{"class":140},"Invalid ",[108,2543,2544],{"class":125},"${",[108,2546,2504],{"class":133},[108,2548,2549],{"class":125},"}`",[108,2551,211],{"class":125},[108,2553,2554,2556,2558,2560],{"class":110,"line":1814},[108,2555,2403],{"class":197},[108,2557,201],{"class":125},[108,2559,1895],{"class":222},[108,2561,211],{"class":125},[108,2563,2564,2567,2569,2571],{"class":110,"line":1824},[108,2565,2566],{"class":197},"      why",[108,2568,201],{"class":125},[108,2570,2513],{"class":133},[108,2572,211],{"class":125},[108,2574,2575,2577,2579,2581,2584,2586,2588,2590],{"class":110,"line":1835},[108,2576,2470],{"class":197},[108,2578,201],{"class":125},[108,2580,2538],{"class":125},[108,2582,2583],{"class":140},"Please provide a valid ",[108,2585,2544],{"class":125},[108,2587,2504],{"class":133},[108,2589,2549],{"class":125},[108,2591,211],{"class":125},[108,2593,2595,2597,2599],{"class":110,"line":2594},24,[108,2596,2414],{"class":125},[108,2598,2364],{"class":133},[108,2600,211],{"class":125},[108,2602,2604],{"class":110,"line":2603},25,[108,2605,416],{"class":125},[98,2607,2610],{"className":100,"code":2608,"filename":2609,"language":103,"meta":104,"style":104},"// server/api/orders/[id].get.ts\nimport { errors } from '~/server/utils/errors'\n\nexport default defineEventHandler(async (event) => {\n  const order = await getOrder(event.context.params.id)\n\n  if (!order) {\n    throw errors.notFound('Order')\n  }\n\n  return order\n})\n","Usage",[85,2611,2612,2617,2637,2641,2667,2703,2707,2724,2747,2751,2755,2763],{"__ignoreMap":104},[108,2613,2614],{"class":110,"line":111},[108,2615,2616],{"class":114},"// server/api/orders/[id].get.ts\n",[108,2618,2619,2621,2623,2626,2628,2630,2632,2635],{"class":110,"line":118},[108,2620,539],{"class":121},[108,2622,542],{"class":125},[108,2624,2625],{"class":133}," errors",[108,2627,547],{"class":125},[108,2629,550],{"class":121},[108,2631,204],{"class":125},[108,2633,2634],{"class":140},"~/server/utils/errors",[108,2636,558],{"class":125},[108,2638,2639],{"class":110,"line":194},[108,2640,564],{"emptyLinePlaceholder":563},[108,2642,2643,2645,2648,2651,2653,2656,2658,2661,2663,2665],{"class":110,"line":214},[108,2644,2332],{"class":121},[108,2646,2647],{"class":121}," default",[108,2649,2650],{"class":129}," defineEventHandler",[108,2652,134],{"class":133},[108,2654,2655],{"class":304},"async",[108,2657,2352],{"class":125},[108,2659,2660],{"class":2355},"event",[108,2662,2364],{"class":125},[108,2664,1470],{"class":304},[108,2666,348],{"class":125},[108,2668,2669,2671,2674,2676,2679,2682,2684,2686,2688,2691,2693,2696,2698,2701],{"class":110,"line":228},[108,2670,1113],{"class":304},[108,2672,2673],{"class":133}," order",[108,2675,1119],{"class":125},[108,2677,2678],{"class":121}," await",[108,2680,2681],{"class":129}," getOrder",[108,2683,134],{"class":197},[108,2685,2660],{"class":133},[108,2687,162],{"class":125},[108,2689,2690],{"class":133},"context",[108,2692,162],{"class":125},[108,2694,2695],{"class":133},"params",[108,2697,162],{"class":125},[108,2699,2700],{"class":133},"id",[108,2702,146],{"class":197},[108,2704,2705],{"class":110,"line":245},[108,2706,564],{"emptyLinePlaceholder":563},[108,2708,2709,2712,2714,2717,2720,2722],{"class":110,"line":262},[108,2710,2711],{"class":121},"  if",[108,2713,2352],{"class":197},[108,2715,2716],{"class":125},"!",[108,2718,2719],{"class":133},"order",[108,2721,1489],{"class":197},[108,2723,191],{"class":125},[108,2725,2726,2729,2731,2733,2736,2738,2740,2743,2745],{"class":110,"line":279},[108,2727,2728],{"class":121},"    throw",[108,2730,2625],{"class":133},[108,2732,162],{"class":125},[108,2734,2735],{"class":129},"notFound",[108,2737,134],{"class":197},[108,2739,137],{"class":125},[108,2741,2742],{"class":140},"Order",[108,2744,137],{"class":125},[108,2746,146],{"class":197},[108,2748,2749],{"class":110,"line":413},[108,2750,410],{"class":125},[108,2752,2753],{"class":110,"line":998},[108,2754,564],{"emptyLinePlaceholder":563},[108,2756,2757,2760],{"class":110,"line":1182},[108,2758,2759],{"class":121},"  return",[108,2761,2762],{"class":133}," order\n",[108,2764,2765,2767],{"class":110,"line":1205},[108,2766,282],{"class":125},[108,2768,146],{"class":133},[90,2770,2772],{"id":2771},"next-steps","Next Steps",[2774,2775,2776],"ul",{},[2777,2778,2779,2782],"li",{},[2780,2781,20],"a",{"href":21}," - See all evlog APIs in action",[2784,2785,2786],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":104,"searchDepth":118,"depth":118,"links":2788},[2789,2790,2791,2796,2799,2803,2804],{"id":92,"depth":118,"text":93},{"id":419,"depth":118,"text":420},{"id":516,"depth":118,"text":517,"children":2792},[2793,2794,2795],{"id":521,"depth":194,"text":522},{"id":652,"depth":194,"text":653},{"id":864,"depth":194,"text":865},{"id":1003,"depth":118,"text":1004,"children":2797},[2798],{"id":1518,"depth":194,"text":1519},{"id":1844,"depth":118,"text":46,"children":2800},[2801,2802],{"id":1847,"depth":194,"text":1848},{"id":2128,"depth":194,"text":2129},{"id":2288,"depth":118,"text":2289},{"id":2771,"depth":118,"text":2772},"Create errors that explain why they occurred and how to fix them. Add actionable context with why, fix, and link fields.","md",[2808,2809],{"label":36,"icon":39,"to":37},{"label":46,"icon":49,"to":47},{},{"icon":44},{"title":41,"description":2805},"8JF7W2RN3406Rlk3L-ejMhGf-aoxbyubeUwYuGTJGlE",[2815,2817],{"title":36,"path":37,"stem":38,"description":2816,"icon":39,"children":-1},"Learn how to design effective wide events that capture everything you need in a single log. One comprehensive event per request with full context.",{"title":46,"path":47,"stem":48,"description":2818,"icon":49,"children":-1},"Security guidelines, data sanitization, and production tips for evlog. Learn what not to log and how to protect sensitive data.",1770218711953]