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