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