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