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