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