[{"data":1,"prerenderedAt":4777},["ShallowReactive",2],{"navigation_docs":3,"-logging-structured-errors":392,"-logging-structured-errors-surround":4772},[4,35,159,201,289,376],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Adapters","\u002Fadapters","6.adapters",[294,297,337,352],{"title":41,"path":295,"stem":296,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":298,"path":299,"stem":300,"children":301,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[302,307,312,317,322,327,332],{"title":303,"path":304,"stem":305,"icon":306},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":308,"path":309,"stem":310,"icon":311},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":313,"path":314,"stem":315,"icon":316},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":318,"path":319,"stem":320,"icon":321},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":323,"path":324,"stem":325,"icon":326},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":328,"path":329,"stem":330,"icon":331},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":333,"path":334,"stem":335,"icon":336},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":338,"path":339,"stem":340,"children":341,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[342,347],{"title":343,"path":344,"stem":345,"icon":346},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":348,"path":349,"stem":350,"icon":351},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":353,"path":354,"stem":355,"children":356,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[357,362,367,371],{"title":358,"path":359,"stem":360,"icon":361},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":363,"path":364,"stem":365,"icon":366},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":368,"path":369,"stem":370,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":372,"path":373,"stem":374,"icon":375},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":377,"path":378,"stem":379,"children":380,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[381,384,388],{"title":41,"path":382,"stem":383,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":385,"path":386,"stem":387,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":389,"path":390,"stem":391,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":393,"title":56,"body":394,"description":4762,"extension":4763,"links":4764,"meta":4768,"navigation":4769,"path":57,"seo":4770,"stem":58,"__hash__":4771},"docs\u002F2.logging\u002F3.structured-errors.md",{"type":395,"value":396,"toc":4734},"minimark",[397,406,499,504,507,510,560,575,578,885,889,1007,1013,1027,1170,1217,1224,1228,1233,1348,1352,1610,1614,1617,1770,1776,1784,1787,2033,2056,2065,2069,2074,2568,2572,2575,2895,2898,2902,3179,3183,3339,3343,3368,3373,3384,4013,4027,4076,4080,4090,4227,4248,4254,4260,4393,4397,4414,4657,4660,4685,4697,4704,4708,4730],[398,399,400,401,405],"p",{},"evlog provides a ",[402,403,404],"code",{},"createError()"," function that creates errors with rich, actionable context.",[407,408,411,414,490],"prompt",{":actions":409,"description":410,"icon":59},"[\"copy\",\"cursor\",\"windsurf\"]","Use structured errors in my app",[398,412,413],{},"Use structured errors with code \u002F why \u002F fix \u002F link fields throughout my app.",[415,416,417,425,439,457,464,471,474,481],"ul",{},[418,419,420,421,424],"li",{},"Replace plain ",[402,422,423],{},"throw new Error(...)"," calls with createError({ code, message, status, why, fix, link })",[418,426,427,428,430,431,434,435,438],{},"Use ",[402,429,402],{}," as a stable, machine-readable identifier (e.g. ",[402,432,433],{},"'PAYMENT_DECLINED'",", ",[402,436,437],{},"'auth\u002Finvalid-token'",") so clients and dashboards can branch on it",[418,440,427,441,444,445,448,449,452,453,456],{},[402,442,443],{},"message"," for what happened, ",[402,446,447],{},"why"," for the technical reason, ",[402,450,451],{},"fix"," for the actionable solution, and ",[402,454,455],{},"link"," for docs",[418,458,459,460,463],{},"Set the appropriate HTTP ",[402,461,462],{},"status"," for API routes (400 \u002F 401 \u002F 402 \u002F 403 \u002F 404 \u002F 422 \u002F 500)",[418,465,466,467,470],{},"For internal-only context, pass ",[402,468,469],{},"internal: { ... }"," (logged but never returned in HTTP responses)",[418,472,473],{},"On the client, use parseError(err) to extract { message, status, code, why, fix, link } from any thrown error",[418,475,476,477,480],{},"Branch on ",[402,478,479],{},"parseError(err).code === 'PAYMENT_DECLINED'"," rather than parsing user-facing messages",[418,482,483,484,486,487,489],{},"Render ",[402,485,447],{}," and ",[402,488,451],{}," in toasts\u002FUI so users get actionable feedback",[398,491,492,493],{},"Docs: ",[494,495,496],"a",{"href":496,"rel":497},"https:\u002F\u002Fwww.evlog.dev\u002Flogging\u002Fstructured-errors",[498],"nofollow",[500,501,503],"h2",{"id":502},"why-structured-errors","Why Structured Errors?",[505,506],"structured-error-context",{},[398,508,509],{},"Traditional errors are often unhelpful:",[511,512,518],"pre",{"className":513,"code":514,"filename":515,"language":516,"meta":517,"style":517},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Unhelpful error\nthrow new Error('Payment failed')\n","server\u002Fapi\u002Fcheckout.post.ts","typescript","",[402,519,520,529],{"__ignoreMap":517},[521,522,525],"span",{"class":523,"line":524},"line",1,[521,526,528],{"class":527},"sHwdD","\u002F\u002F Unhelpful error\n",[521,530,532,536,540,544,548,551,555,557],{"class":523,"line":531},2,[521,533,535],{"class":534},"s7zQu","throw",[521,537,539],{"class":538},"sMK4o"," new",[521,541,543],{"class":542},"s2Zo4"," Error",[521,545,547],{"class":546},"sTEyZ","(",[521,549,550],{"class":538},"'",[521,552,554],{"class":553},"sfazB","Payment failed",[521,556,550],{"class":538},[521,558,559],{"class":546},")\n",[398,561,562,563,567,568,570,571,574],{},"This tells you ",[564,565,566],"em",{},"what"," happened, but not ",[564,569,447],{}," or ",[564,572,573],{},"how to fix it",".",[398,576,577],{},"Structured errors provide context:",[579,580,581,739],"code-group",{},[511,582,584],{"className":513,"code":583,"filename":515,"language":516,"meta":517,"style":517},"import { createError } from 'evlog'\n\nthrow createError({\n  code: 'PAYMENT_DECLINED',\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:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n})\n",[402,585,586,612,618,630,650,666,680,697,714,731],{"__ignoreMap":517},[521,587,588,591,594,597,600,603,606,609],{"class":523,"line":524},[521,589,590],{"class":534},"import",[521,592,593],{"class":538}," {",[521,595,596],{"class":546}," createError",[521,598,599],{"class":538}," }",[521,601,602],{"class":534}," from",[521,604,605],{"class":538}," '",[521,607,608],{"class":553},"evlog",[521,610,611],{"class":538},"'\n",[521,613,614],{"class":523,"line":531},[521,615,617],{"emptyLinePlaceholder":616},true,"\n",[521,619,621,623,625,627],{"class":523,"line":620},3,[521,622,535],{"class":534},[521,624,596],{"class":542},[521,626,547],{"class":546},[521,628,629],{"class":538},"{\n",[521,631,633,637,640,642,645,647],{"class":523,"line":632},4,[521,634,636],{"class":635},"swJcz","  code",[521,638,639],{"class":538},":",[521,641,605],{"class":538},[521,643,644],{"class":553},"PAYMENT_DECLINED",[521,646,550],{"class":538},[521,648,649],{"class":538},",\n",[521,651,653,656,658,660,662,664],{"class":523,"line":652},5,[521,654,655],{"class":635},"  message",[521,657,639],{"class":538},[521,659,605],{"class":538},[521,661,554],{"class":553},[521,663,550],{"class":538},[521,665,649],{"class":538},[521,667,669,672,674,678],{"class":523,"line":668},6,[521,670,671],{"class":635},"  status",[521,673,639],{"class":538},[521,675,677],{"class":676},"sbssI"," 402",[521,679,649],{"class":538},[521,681,683,686,688,690,693,695],{"class":523,"line":682},7,[521,684,685],{"class":635},"  why",[521,687,639],{"class":538},[521,689,605],{"class":538},[521,691,692],{"class":553},"Card declined by issuer (insufficient funds)",[521,694,550],{"class":538},[521,696,649],{"class":538},[521,698,700,703,705,707,710,712],{"class":523,"line":699},8,[521,701,702],{"class":635},"  fix",[521,704,639],{"class":538},[521,706,605],{"class":538},[521,708,709],{"class":553},"Try a different payment method or contact your bank",[521,711,550],{"class":538},[521,713,649],{"class":538},[521,715,717,720,722,724,727,729],{"class":523,"line":716},9,[521,718,719],{"class":635},"  link",[521,721,639],{"class":538},[521,723,605],{"class":538},[521,725,726],{"class":553},"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined",[521,728,550],{"class":538},[521,730,649],{"class":538},[521,732,734,737],{"class":523,"line":733},10,[521,735,736],{"class":538},"}",[521,738,559],{"class":546},[511,740,745],{"className":741,"code":742,"filename":743,"language":744,"meta":517,"style":517},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"statusCode\": 402,\n  \"message\": \"Payment failed\",\n  \"data\": {\n    \"code\": \"PAYMENT_DECLINED\",\n    \"why\": \"Card declined by issuer (insufficient funds)\",\n    \"fix\": \"Try a different payment method or contact your bank\",\n    \"link\": \"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined\"\n  }\n}\n","Response","json",[402,746,747,751,769,788,802,822,840,858,875,880],{"__ignoreMap":517},[521,748,749],{"class":523,"line":524},[521,750,629],{"class":538},[521,752,753,756,760,763,765,767],{"class":523,"line":531},[521,754,755],{"class":538},"  \"",[521,757,759],{"class":758},"spNyl","statusCode",[521,761,762],{"class":538},"\"",[521,764,639],{"class":538},[521,766,677],{"class":676},[521,768,649],{"class":538},[521,770,771,773,775,777,779,782,784,786],{"class":523,"line":620},[521,772,755],{"class":538},[521,774,443],{"class":758},[521,776,762],{"class":538},[521,778,639],{"class":538},[521,780,781],{"class":538}," \"",[521,783,554],{"class":553},[521,785,762],{"class":538},[521,787,649],{"class":538},[521,789,790,792,795,797,799],{"class":523,"line":632},[521,791,755],{"class":538},[521,793,794],{"class":758},"data",[521,796,762],{"class":538},[521,798,639],{"class":538},[521,800,801],{"class":538}," {\n",[521,803,804,807,810,812,814,816,818,820],{"class":523,"line":652},[521,805,806],{"class":538},"    \"",[521,808,402],{"class":809},"sBMFI",[521,811,762],{"class":538},[521,813,639],{"class":538},[521,815,781],{"class":538},[521,817,644],{"class":553},[521,819,762],{"class":538},[521,821,649],{"class":538},[521,823,824,826,828,830,832,834,836,838],{"class":523,"line":668},[521,825,806],{"class":538},[521,827,447],{"class":809},[521,829,762],{"class":538},[521,831,639],{"class":538},[521,833,781],{"class":538},[521,835,692],{"class":553},[521,837,762],{"class":538},[521,839,649],{"class":538},[521,841,842,844,846,848,850,852,854,856],{"class":523,"line":682},[521,843,806],{"class":538},[521,845,451],{"class":809},[521,847,762],{"class":538},[521,849,639],{"class":538},[521,851,781],{"class":538},[521,853,709],{"class":553},[521,855,762],{"class":538},[521,857,649],{"class":538},[521,859,860,862,864,866,868,870,872],{"class":523,"line":699},[521,861,806],{"class":538},[521,863,455],{"class":809},[521,865,762],{"class":538},[521,867,639],{"class":538},[521,869,781],{"class":538},[521,871,726],{"class":553},[521,873,874],{"class":538},"\"\n",[521,876,877],{"class":523,"line":716},[521,878,879],{"class":538},"  }\n",[521,881,882],{"class":523,"line":733},[521,883,884],{"class":538},"}\n",[500,886,888],{"id":887},"error-fields","Error Fields",[890,891,892,908],"table",{},[893,894,895],"thead",{},[896,897,898,902,905],"tr",{},[899,900,901],"th",{},"Field",[899,903,904],{},"Required",[899,906,907],{},"Description",[909,910,911,924,939,950,961,972,983,995],"tbody",{},[896,912,913,918,921],{},[914,915,916],"td",{},[402,917,443],{},[914,919,920],{},"Yes",[914,922,923],{},"What happened (shown to users)",[896,925,926,930,933],{},[914,927,928],{},[402,929,402],{},[914,931,932],{},"No",[914,934,935,936,938],{},"Stable machine-readable identifier for client branching (e.g. ",[402,937,433],{},")",[896,940,941,945,947],{},[914,942,943],{},[402,944,462],{},[914,946,932],{},[914,948,949],{},"HTTP status code (default: 500)",[896,951,952,956,958],{},[914,953,954],{},[402,955,447],{},[914,957,932],{},[914,959,960],{},"Technical reason (for debugging)",[896,962,963,967,969],{},[914,964,965],{},[402,966,451],{},[914,968,932],{},[914,970,971],{},"Actionable solution",[896,973,974,978,980],{},[914,975,976],{},[402,977,455],{},[914,979,932],{},[914,981,982],{},"Documentation URL",[896,984,985,990,992],{},[914,986,987],{},[402,988,989],{},"cause",[914,991,932],{},[914,993,994],{},"Original error (for error chaining)",[896,996,997,1002,1004],{},[914,998,999],{},[402,1000,1001],{},"internal",[914,1003,932],{},[914,1005,1006],{},"Backend-only context (see below)",[500,1008,1010,1011,938],{"id":1009},"backend-only-context-internal","Backend-only context (",[402,1012,1001],{},[398,1014,427,1015,1017,1018,1022,1023,1026],{},[402,1016,1001],{}," when you need extra fields for logs, drains, or support tools, but ",[1019,1020,1021],"strong",{},"must not"," expose them in API responses or to ",[402,1024,1025],{},"parseError()"," on the client.",[511,1028,1030],{"className":513,"code":1029,"language":516,"meta":517,"style":517},"throw createError({\n  message: 'Payment could not be completed',\n  status: 402,\n  why: 'Your card was declined',\n  fix: 'Try another payment method',\n  internal: {\n    correlationId: 'pay_8x2k',\n    processorCode: 'insufficient_funds',\n    rawIssuerResponse: '…', \u002F\u002F never sent to the client\n  },\n})\n",[402,1031,1032,1042,1057,1067,1082,1097,1106,1122,1138,1158,1163],{"__ignoreMap":517},[521,1033,1034,1036,1038,1040],{"class":523,"line":524},[521,1035,535],{"class":534},[521,1037,596],{"class":542},[521,1039,547],{"class":546},[521,1041,629],{"class":538},[521,1043,1044,1046,1048,1050,1053,1055],{"class":523,"line":531},[521,1045,655],{"class":635},[521,1047,639],{"class":538},[521,1049,605],{"class":538},[521,1051,1052],{"class":553},"Payment could not be completed",[521,1054,550],{"class":538},[521,1056,649],{"class":538},[521,1058,1059,1061,1063,1065],{"class":523,"line":620},[521,1060,671],{"class":635},[521,1062,639],{"class":538},[521,1064,677],{"class":676},[521,1066,649],{"class":538},[521,1068,1069,1071,1073,1075,1078,1080],{"class":523,"line":632},[521,1070,685],{"class":635},[521,1072,639],{"class":538},[521,1074,605],{"class":538},[521,1076,1077],{"class":553},"Your card was declined",[521,1079,550],{"class":538},[521,1081,649],{"class":538},[521,1083,1084,1086,1088,1090,1093,1095],{"class":523,"line":652},[521,1085,702],{"class":635},[521,1087,639],{"class":538},[521,1089,605],{"class":538},[521,1091,1092],{"class":553},"Try another payment method",[521,1094,550],{"class":538},[521,1096,649],{"class":538},[521,1098,1099,1102,1104],{"class":523,"line":668},[521,1100,1101],{"class":635},"  internal",[521,1103,639],{"class":538},[521,1105,801],{"class":538},[521,1107,1108,1111,1113,1115,1118,1120],{"class":523,"line":682},[521,1109,1110],{"class":635},"    correlationId",[521,1112,639],{"class":538},[521,1114,605],{"class":538},[521,1116,1117],{"class":553},"pay_8x2k",[521,1119,550],{"class":538},[521,1121,649],{"class":538},[521,1123,1124,1127,1129,1131,1134,1136],{"class":523,"line":699},[521,1125,1126],{"class":635},"    processorCode",[521,1128,639],{"class":538},[521,1130,605],{"class":538},[521,1132,1133],{"class":553},"insufficient_funds",[521,1135,550],{"class":538},[521,1137,649],{"class":538},[521,1139,1140,1143,1145,1147,1150,1152,1155],{"class":523,"line":716},[521,1141,1142],{"class":635},"    rawIssuerResponse",[521,1144,639],{"class":538},[521,1146,605],{"class":538},[521,1148,1149],{"class":553},"…",[521,1151,550],{"class":538},[521,1153,1154],{"class":538},",",[521,1156,1157],{"class":527}," \u002F\u002F never sent to the client\n",[521,1159,1160],{"class":523,"line":733},[521,1161,1162],{"class":538},"  },\n",[521,1164,1166,1168],{"class":523,"line":1165},11,[521,1167,736],{"class":538},[521,1169,559],{"class":546},[415,1171,1172,1186,1200],{},[418,1173,1174,1177,1178,1183,1184,574],{},[1019,1175,1176],{},"HTTP responses"," (Nuxt\u002FNitro error handler, Next.js, SvelteKit, etc.) and ",[1019,1179,1180],{},[402,1181,1182],{},"toJSON()"," omit ",[402,1185,1001],{},[418,1187,1188,1192,1193,1195,1196,1199],{},[1019,1189,1190],{},[402,1191,1025],{}," does not surface ",[402,1194,1001],{}," for UI; the thrown error may still carry it server-side on ",[402,1197,1198],{},"raw"," when debugging.",[418,1201,1202,1205,1206,1209,1210,1213,1214,574],{},[1019,1203,1204],{},"Wide events",": when the framework records the error (e.g. ",[402,1207,1208],{},"log.error(err)"," or automatic capture on thrown ",[402,1211,1212],{},"EvlogError","), the emitted payload includes ",[402,1215,1216],{},"error.internal",[398,1218,1219,1220,574],{},"In debuggers, the payload may appear under a symbol key; in code, always use ",[1019,1221,1222],{},[402,1223,1216],{},[500,1225,1227],{"id":1226},"basic-usage","Basic Usage",[1229,1230,1232],"h3",{"id":1231},"simple-error","Simple Error",[579,1234,1235,1305],{},[511,1236,1239],{"className":513,"code":1237,"filename":1238,"language":516,"meta":517,"style":517},"import { createError } from 'evlog'\n\nthrow createError({\n  message: 'User not found',\n  status: 404,\n})\n","server\u002Fapi\u002Fusers\u002F[id].get.ts",[402,1240,1241,1259,1263,1273,1288,1299],{"__ignoreMap":517},[521,1242,1243,1245,1247,1249,1251,1253,1255,1257],{"class":523,"line":524},[521,1244,590],{"class":534},[521,1246,593],{"class":538},[521,1248,596],{"class":546},[521,1250,599],{"class":538},[521,1252,602],{"class":534},[521,1254,605],{"class":538},[521,1256,608],{"class":553},[521,1258,611],{"class":538},[521,1260,1261],{"class":523,"line":531},[521,1262,617],{"emptyLinePlaceholder":616},[521,1264,1265,1267,1269,1271],{"class":523,"line":620},[521,1266,535],{"class":534},[521,1268,596],{"class":542},[521,1270,547],{"class":546},[521,1272,629],{"class":538},[521,1274,1275,1277,1279,1281,1284,1286],{"class":523,"line":632},[521,1276,655],{"class":635},[521,1278,639],{"class":538},[521,1280,605],{"class":538},[521,1282,1283],{"class":553},"User not found",[521,1285,550],{"class":538},[521,1287,649],{"class":538},[521,1289,1290,1292,1294,1297],{"class":523,"line":652},[521,1291,671],{"class":635},[521,1293,639],{"class":538},[521,1295,1296],{"class":676}," 404",[521,1298,649],{"class":538},[521,1300,1301,1303],{"class":523,"line":668},[521,1302,736],{"class":538},[521,1304,559],{"class":546},[511,1306,1308],{"className":741,"code":1307,"filename":743,"language":744,"meta":517,"style":517},"{\n  \"statusCode\": 404,\n  \"message\": \"User not found\"\n}\n",[402,1309,1310,1314,1328,1344],{"__ignoreMap":517},[521,1311,1312],{"class":523,"line":524},[521,1313,629],{"class":538},[521,1315,1316,1318,1320,1322,1324,1326],{"class":523,"line":531},[521,1317,755],{"class":538},[521,1319,759],{"class":758},[521,1321,762],{"class":538},[521,1323,639],{"class":538},[521,1325,1296],{"class":676},[521,1327,649],{"class":538},[521,1329,1330,1332,1334,1336,1338,1340,1342],{"class":523,"line":620},[521,1331,755],{"class":538},[521,1333,443],{"class":758},[521,1335,762],{"class":538},[521,1337,639],{"class":538},[521,1339,781],{"class":538},[521,1341,1283],{"class":553},[521,1343,874],{"class":538},[521,1345,1346],{"class":523,"line":632},[521,1347,884],{"class":538},[1229,1349,1351],{"id":1350},"error-with-full-context","Error with Full Context",[579,1353,1354,1479],{},[511,1355,1357],{"className":513,"code":1356,"filename":515,"language":516,"meta":517,"style":517},"import { createError } from 'evlog'\n\nthrow createError({\n  code: 'PAYMENT_DECLINED',\n  message: 'Payment failed',\n  status: 402,\n  why: 'Card declined by issuer',\n  fix: 'Try a different payment method',\n  link: 'https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined',\n})\n",[402,1358,1359,1377,1381,1391,1405,1419,1429,1444,1459,1473],{"__ignoreMap":517},[521,1360,1361,1363,1365,1367,1369,1371,1373,1375],{"class":523,"line":524},[521,1362,590],{"class":534},[521,1364,593],{"class":538},[521,1366,596],{"class":546},[521,1368,599],{"class":538},[521,1370,602],{"class":534},[521,1372,605],{"class":538},[521,1374,608],{"class":553},[521,1376,611],{"class":538},[521,1378,1379],{"class":523,"line":531},[521,1380,617],{"emptyLinePlaceholder":616},[521,1382,1383,1385,1387,1389],{"class":523,"line":620},[521,1384,535],{"class":534},[521,1386,596],{"class":542},[521,1388,547],{"class":546},[521,1390,629],{"class":538},[521,1392,1393,1395,1397,1399,1401,1403],{"class":523,"line":632},[521,1394,636],{"class":635},[521,1396,639],{"class":538},[521,1398,605],{"class":538},[521,1400,644],{"class":553},[521,1402,550],{"class":538},[521,1404,649],{"class":538},[521,1406,1407,1409,1411,1413,1415,1417],{"class":523,"line":652},[521,1408,655],{"class":635},[521,1410,639],{"class":538},[521,1412,605],{"class":538},[521,1414,554],{"class":553},[521,1416,550],{"class":538},[521,1418,649],{"class":538},[521,1420,1421,1423,1425,1427],{"class":523,"line":668},[521,1422,671],{"class":635},[521,1424,639],{"class":538},[521,1426,677],{"class":676},[521,1428,649],{"class":538},[521,1430,1431,1433,1435,1437,1440,1442],{"class":523,"line":682},[521,1432,685],{"class":635},[521,1434,639],{"class":538},[521,1436,605],{"class":538},[521,1438,1439],{"class":553},"Card declined by issuer",[521,1441,550],{"class":538},[521,1443,649],{"class":538},[521,1445,1446,1448,1450,1452,1455,1457],{"class":523,"line":699},[521,1447,702],{"class":635},[521,1449,639],{"class":538},[521,1451,605],{"class":538},[521,1453,1454],{"class":553},"Try a different payment method",[521,1456,550],{"class":538},[521,1458,649],{"class":538},[521,1460,1461,1463,1465,1467,1469,1471],{"class":523,"line":716},[521,1462,719],{"class":635},[521,1464,639],{"class":538},[521,1466,605],{"class":538},[521,1468,726],{"class":553},[521,1470,550],{"class":538},[521,1472,649],{"class":538},[521,1474,1475,1477],{"class":523,"line":733},[521,1476,736],{"class":538},[521,1478,559],{"class":546},[511,1480,1482],{"className":741,"code":1481,"filename":743,"language":744,"meta":517,"style":517},"{\n  \"statusCode\": 402,\n  \"message\": \"Payment failed\",\n  \"data\": {\n    \"code\": \"PAYMENT_DECLINED\",\n    \"why\": \"Card declined by issuer\",\n    \"fix\": \"Try a different payment method\",\n    \"link\": \"https:\u002F\u002Fdocs.example.com\u002Fpayments\u002Fdeclined\"\n  }\n}\n",[402,1483,1484,1488,1502,1520,1532,1550,1568,1586,1602,1606],{"__ignoreMap":517},[521,1485,1486],{"class":523,"line":524},[521,1487,629],{"class":538},[521,1489,1490,1492,1494,1496,1498,1500],{"class":523,"line":531},[521,1491,755],{"class":538},[521,1493,759],{"class":758},[521,1495,762],{"class":538},[521,1497,639],{"class":538},[521,1499,677],{"class":676},[521,1501,649],{"class":538},[521,1503,1504,1506,1508,1510,1512,1514,1516,1518],{"class":523,"line":620},[521,1505,755],{"class":538},[521,1507,443],{"class":758},[521,1509,762],{"class":538},[521,1511,639],{"class":538},[521,1513,781],{"class":538},[521,1515,554],{"class":553},[521,1517,762],{"class":538},[521,1519,649],{"class":538},[521,1521,1522,1524,1526,1528,1530],{"class":523,"line":632},[521,1523,755],{"class":538},[521,1525,794],{"class":758},[521,1527,762],{"class":538},[521,1529,639],{"class":538},[521,1531,801],{"class":538},[521,1533,1534,1536,1538,1540,1542,1544,1546,1548],{"class":523,"line":652},[521,1535,806],{"class":538},[521,1537,402],{"class":809},[521,1539,762],{"class":538},[521,1541,639],{"class":538},[521,1543,781],{"class":538},[521,1545,644],{"class":553},[521,1547,762],{"class":538},[521,1549,649],{"class":538},[521,1551,1552,1554,1556,1558,1560,1562,1564,1566],{"class":523,"line":668},[521,1553,806],{"class":538},[521,1555,447],{"class":809},[521,1557,762],{"class":538},[521,1559,639],{"class":538},[521,1561,781],{"class":538},[521,1563,1439],{"class":553},[521,1565,762],{"class":538},[521,1567,649],{"class":538},[521,1569,1570,1572,1574,1576,1578,1580,1582,1584],{"class":523,"line":682},[521,1571,806],{"class":538},[521,1573,451],{"class":809},[521,1575,762],{"class":538},[521,1577,639],{"class":538},[521,1579,781],{"class":538},[521,1581,1454],{"class":553},[521,1583,762],{"class":538},[521,1585,649],{"class":538},[521,1587,1588,1590,1592,1594,1596,1598,1600],{"class":523,"line":699},[521,1589,806],{"class":538},[521,1591,455],{"class":809},[521,1593,762],{"class":538},[521,1595,639],{"class":538},[521,1597,781],{"class":538},[521,1599,726],{"class":553},[521,1601,874],{"class":538},[521,1603,1604],{"class":523,"line":716},[521,1605,879],{"class":538},[521,1607,1608],{"class":523,"line":733},[521,1609,884],{"class":538},[1229,1611,1613],{"id":1612},"error-chaining","Error Chaining",[398,1615,1616],{},"Wrap underlying errors while preserving the original:",[511,1618,1620],{"className":513,"code":1619,"filename":515,"language":516,"meta":517,"style":517},"import { createError } from 'evlog'\n\ntry {\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, \u002F\u002F Original error preserved\n  })\n}\n",[402,1621,1622,1640,1644,1651,1676,1688,1699,1715,1727,1743,1758,1765],{"__ignoreMap":517},[521,1623,1624,1626,1628,1630,1632,1634,1636,1638],{"class":523,"line":524},[521,1625,590],{"class":534},[521,1627,593],{"class":538},[521,1629,596],{"class":546},[521,1631,599],{"class":538},[521,1633,602],{"class":534},[521,1635,605],{"class":538},[521,1637,608],{"class":553},[521,1639,611],{"class":538},[521,1641,1642],{"class":523,"line":531},[521,1643,617],{"emptyLinePlaceholder":616},[521,1645,1646,1649],{"class":523,"line":620},[521,1647,1648],{"class":534},"try",[521,1650,801],{"class":538},[521,1652,1653,1656,1659,1661,1664,1666,1669,1671,1674],{"class":523,"line":632},[521,1654,1655],{"class":534},"  await",[521,1657,1658],{"class":546}," stripe",[521,1660,574],{"class":538},[521,1662,1663],{"class":546},"charges",[521,1665,574],{"class":538},[521,1667,1668],{"class":542},"create",[521,1670,547],{"class":635},[521,1672,1673],{"class":546},"charge",[521,1675,559],{"class":635},[521,1677,1678,1680,1683,1686],{"class":523,"line":652},[521,1679,736],{"class":538},[521,1681,1682],{"class":534}," catch",[521,1684,1685],{"class":546}," (err) ",[521,1687,629],{"class":538},[521,1689,1690,1693,1695,1697],{"class":523,"line":668},[521,1691,1692],{"class":534},"  throw",[521,1694,596],{"class":542},[521,1696,547],{"class":635},[521,1698,629],{"class":538},[521,1700,1701,1704,1706,1708,1711,1713],{"class":523,"line":682},[521,1702,1703],{"class":635},"    message",[521,1705,639],{"class":538},[521,1707,605],{"class":538},[521,1709,1710],{"class":553},"Payment processing failed",[521,1712,550],{"class":538},[521,1714,649],{"class":538},[521,1716,1717,1720,1722,1725],{"class":523,"line":699},[521,1718,1719],{"class":635},"    status",[521,1721,639],{"class":538},[521,1723,1724],{"class":676}," 500",[521,1726,649],{"class":538},[521,1728,1729,1732,1734,1736,1739,1741],{"class":523,"line":716},[521,1730,1731],{"class":635},"    why",[521,1733,639],{"class":538},[521,1735,605],{"class":538},[521,1737,1738],{"class":553},"Stripe API returned an error",[521,1740,550],{"class":538},[521,1742,649],{"class":538},[521,1744,1745,1748,1750,1753,1755],{"class":523,"line":733},[521,1746,1747],{"class":635},"    cause",[521,1749,639],{"class":538},[521,1751,1752],{"class":546}," err",[521,1754,1154],{"class":538},[521,1756,1757],{"class":527}," \u002F\u002F Original error preserved\n",[521,1759,1760,1763],{"class":523,"line":1165},[521,1761,1762],{"class":538},"  }",[521,1764,559],{"class":635},[521,1766,1768],{"class":523,"line":1767},12,[521,1769,884],{"class":538},[500,1771,1773,1774],{"id":1772},"branching-on-code","Branching on ",[402,1775,402],{},[398,1777,1778,1780,1781,1783],{},[402,1779,402],{}," is a stable, machine-readable identifier you control. Pair it with ",[402,1782,1025],{}," so the client can branch on logic without parsing user-facing messages or coupling to HTTP status codes.",[1785,1786],"structured-error-branching",{},[511,1788,1791],{"className":513,"code":1789,"filename":1790,"language":516,"meta":517,"style":517},"import { parseError } from 'evlog'\n\ntry {\n  await $fetch('\u002Fapi\u002Fcheckout', { method: 'POST', body: cart })\n} catch (err) {\n  const error = parseError(err)\n\n  switch (error.code) {\n    case 'PAYMENT_DECLINED':\n      return showRetryWithDifferentCard()\n    case 'CART_EXPIRED':\n      return rebuildCart()\n    default:\n      return toast.add({ title: error.message, color: 'error' })\n  }\n}\n","composables\u002FuseCheckout.ts",[402,1792,1793,1812,1816,1822,1868,1878,1898,1902,1922,1936,1947,1960,1969,1977,2023,2028],{"__ignoreMap":517},[521,1794,1795,1797,1799,1802,1804,1806,1808,1810],{"class":523,"line":524},[521,1796,590],{"class":534},[521,1798,593],{"class":538},[521,1800,1801],{"class":546}," parseError",[521,1803,599],{"class":538},[521,1805,602],{"class":534},[521,1807,605],{"class":538},[521,1809,608],{"class":553},[521,1811,611],{"class":538},[521,1813,1814],{"class":523,"line":531},[521,1815,617],{"emptyLinePlaceholder":616},[521,1817,1818,1820],{"class":523,"line":620},[521,1819,1648],{"class":534},[521,1821,801],{"class":538},[521,1823,1824,1826,1829,1831,1833,1836,1838,1840,1842,1845,1847,1849,1852,1854,1856,1859,1861,1864,1866],{"class":523,"line":632},[521,1825,1655],{"class":534},[521,1827,1828],{"class":542}," $fetch",[521,1830,547],{"class":635},[521,1832,550],{"class":538},[521,1834,1835],{"class":553},"\u002Fapi\u002Fcheckout",[521,1837,550],{"class":538},[521,1839,1154],{"class":538},[521,1841,593],{"class":538},[521,1843,1844],{"class":635}," method",[521,1846,639],{"class":538},[521,1848,605],{"class":538},[521,1850,1851],{"class":553},"POST",[521,1853,550],{"class":538},[521,1855,1154],{"class":538},[521,1857,1858],{"class":635}," body",[521,1860,639],{"class":538},[521,1862,1863],{"class":546}," cart",[521,1865,599],{"class":538},[521,1867,559],{"class":635},[521,1869,1870,1872,1874,1876],{"class":523,"line":652},[521,1871,736],{"class":538},[521,1873,1682],{"class":534},[521,1875,1685],{"class":546},[521,1877,629],{"class":538},[521,1879,1880,1883,1886,1889,1891,1893,1896],{"class":523,"line":668},[521,1881,1882],{"class":758},"  const",[521,1884,1885],{"class":546}," error",[521,1887,1888],{"class":538}," =",[521,1890,1801],{"class":542},[521,1892,547],{"class":635},[521,1894,1895],{"class":546},"err",[521,1897,559],{"class":635},[521,1899,1900],{"class":523,"line":682},[521,1901,617],{"emptyLinePlaceholder":616},[521,1903,1904,1907,1910,1913,1915,1917,1920],{"class":523,"line":699},[521,1905,1906],{"class":534},"  switch",[521,1908,1909],{"class":635}," (",[521,1911,1912],{"class":546},"error",[521,1914,574],{"class":538},[521,1916,402],{"class":546},[521,1918,1919],{"class":635},") ",[521,1921,629],{"class":538},[521,1923,1924,1927,1929,1931,1933],{"class":523,"line":716},[521,1925,1926],{"class":534},"    case",[521,1928,605],{"class":538},[521,1930,644],{"class":553},[521,1932,550],{"class":538},[521,1934,1935],{"class":538},":\n",[521,1937,1938,1941,1944],{"class":523,"line":733},[521,1939,1940],{"class":534},"      return",[521,1942,1943],{"class":542}," showRetryWithDifferentCard",[521,1945,1946],{"class":635},"()\n",[521,1948,1949,1951,1953,1956,1958],{"class":523,"line":1165},[521,1950,1926],{"class":534},[521,1952,605],{"class":538},[521,1954,1955],{"class":553},"CART_EXPIRED",[521,1957,550],{"class":538},[521,1959,1935],{"class":538},[521,1961,1962,1964,1967],{"class":523,"line":1767},[521,1963,1940],{"class":534},[521,1965,1966],{"class":542}," rebuildCart",[521,1968,1946],{"class":635},[521,1970,1972,1975],{"class":523,"line":1971},13,[521,1973,1974],{"class":534},"    default",[521,1976,1935],{"class":538},[521,1978,1980,1982,1985,1987,1990,1992,1995,1998,2000,2002,2004,2006,2008,2011,2013,2015,2017,2019,2021],{"class":523,"line":1979},14,[521,1981,1940],{"class":534},[521,1983,1984],{"class":546}," toast",[521,1986,574],{"class":538},[521,1988,1989],{"class":542},"add",[521,1991,547],{"class":635},[521,1993,1994],{"class":538},"{",[521,1996,1997],{"class":635}," title",[521,1999,639],{"class":538},[521,2001,1885],{"class":546},[521,2003,574],{"class":538},[521,2005,443],{"class":546},[521,2007,1154],{"class":538},[521,2009,2010],{"class":635}," color",[521,2012,639],{"class":538},[521,2014,605],{"class":538},[521,2016,1912],{"class":553},[521,2018,550],{"class":538},[521,2020,599],{"class":538},[521,2022,559],{"class":635},[521,2024,2026],{"class":523,"line":2025},15,[521,2027,879],{"class":538},[521,2029,2031],{"class":523,"line":2030},16,[521,2032,884],{"class":538},[398,2034,2035,2037,2038,2040,2041,434,2044,2047,2048,2051,2052,2055],{},[402,2036,1025],{}," also surfaces ",[402,2039,402],{}," from Node-style errors (e.g. ",[402,2042,2043],{},"'ENOENT'",[402,2045,2046],{},"'ECONNRESET'",") and any ",[402,2049,2050],{},"Error"," instance with a string ",[402,2053,2054],{},".code"," property, so existing system errors flow through the same branch.",[398,2057,2058,2060,2061,2064],{},[402,2059,402],{}," is also copied onto wide events under ",[402,2062,2063],{},"error.code",", so dashboards and drains can group, alert, and chart by code without parsing free-text messages.",[500,2066,2068],{"id":2067},"frontend-error-handling","Frontend Error Handling",[398,2070,427,2071,2073],{},[402,2072,1025],{}," to extract all fields from caught errors:",[579,2075,2076,2294],{},[511,2077,2079],{"className":513,"code":2078,"filename":1790,"language":516,"meta":517,"style":517},"import { parseError } from 'evlog'\n\ntry {\n  await $fetch('\u002Fapi\u002Fcheckout', { method: 'POST', body: cart })\n} catch (err) {\n  const error = parseError(err)\n\n  console.log(error.message)  \u002F\u002F \"Payment failed\"\n  console.log(error.status)   \u002F\u002F 402\n  console.log(error.code)     \u002F\u002F \"PAYMENT_DECLINED\"\n  console.log(error.why)      \u002F\u002F \"Card declined\"\n  console.log(error.fix)      \u002F\u002F \"Try another card\"\n}\n",[402,2080,2081,2099,2103,2109,2149,2159,2175,2179,2203,2225,2247,2269,2290],{"__ignoreMap":517},[521,2082,2083,2085,2087,2089,2091,2093,2095,2097],{"class":523,"line":524},[521,2084,590],{"class":534},[521,2086,593],{"class":538},[521,2088,1801],{"class":546},[521,2090,599],{"class":538},[521,2092,602],{"class":534},[521,2094,605],{"class":538},[521,2096,608],{"class":553},[521,2098,611],{"class":538},[521,2100,2101],{"class":523,"line":531},[521,2102,617],{"emptyLinePlaceholder":616},[521,2104,2105,2107],{"class":523,"line":620},[521,2106,1648],{"class":534},[521,2108,801],{"class":538},[521,2110,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147],{"class":523,"line":632},[521,2112,1655],{"class":534},[521,2114,1828],{"class":542},[521,2116,547],{"class":635},[521,2118,550],{"class":538},[521,2120,1835],{"class":553},[521,2122,550],{"class":538},[521,2124,1154],{"class":538},[521,2126,593],{"class":538},[521,2128,1844],{"class":635},[521,2130,639],{"class":538},[521,2132,605],{"class":538},[521,2134,1851],{"class":553},[521,2136,550],{"class":538},[521,2138,1154],{"class":538},[521,2140,1858],{"class":635},[521,2142,639],{"class":538},[521,2144,1863],{"class":546},[521,2146,599],{"class":538},[521,2148,559],{"class":635},[521,2150,2151,2153,2155,2157],{"class":523,"line":652},[521,2152,736],{"class":538},[521,2154,1682],{"class":534},[521,2156,1685],{"class":546},[521,2158,629],{"class":538},[521,2160,2161,2163,2165,2167,2169,2171,2173],{"class":523,"line":668},[521,2162,1882],{"class":758},[521,2164,1885],{"class":546},[521,2166,1888],{"class":538},[521,2168,1801],{"class":542},[521,2170,547],{"class":635},[521,2172,1895],{"class":546},[521,2174,559],{"class":635},[521,2176,2177],{"class":523,"line":682},[521,2178,617],{"emptyLinePlaceholder":616},[521,2180,2181,2184,2186,2189,2191,2193,2195,2197,2200],{"class":523,"line":699},[521,2182,2183],{"class":546},"  console",[521,2185,574],{"class":538},[521,2187,2188],{"class":542},"log",[521,2190,547],{"class":635},[521,2192,1912],{"class":546},[521,2194,574],{"class":538},[521,2196,443],{"class":546},[521,2198,2199],{"class":635},")  ",[521,2201,2202],{"class":527},"\u002F\u002F \"Payment failed\"\n",[521,2204,2205,2207,2209,2211,2213,2215,2217,2219,2222],{"class":523,"line":716},[521,2206,2183],{"class":546},[521,2208,574],{"class":538},[521,2210,2188],{"class":542},[521,2212,547],{"class":635},[521,2214,1912],{"class":546},[521,2216,574],{"class":538},[521,2218,462],{"class":546},[521,2220,2221],{"class":635},")   ",[521,2223,2224],{"class":527},"\u002F\u002F 402\n",[521,2226,2227,2229,2231,2233,2235,2237,2239,2241,2244],{"class":523,"line":733},[521,2228,2183],{"class":546},[521,2230,574],{"class":538},[521,2232,2188],{"class":542},[521,2234,547],{"class":635},[521,2236,1912],{"class":546},[521,2238,574],{"class":538},[521,2240,402],{"class":546},[521,2242,2243],{"class":635},")     ",[521,2245,2246],{"class":527},"\u002F\u002F \"PAYMENT_DECLINED\"\n",[521,2248,2249,2251,2253,2255,2257,2259,2261,2263,2266],{"class":523,"line":1165},[521,2250,2183],{"class":546},[521,2252,574],{"class":538},[521,2254,2188],{"class":542},[521,2256,547],{"class":635},[521,2258,1912],{"class":546},[521,2260,574],{"class":538},[521,2262,447],{"class":546},[521,2264,2265],{"class":635},")      ",[521,2267,2268],{"class":527},"\u002F\u002F \"Card declined\"\n",[521,2270,2271,2273,2275,2277,2279,2281,2283,2285,2287],{"class":523,"line":1767},[521,2272,2183],{"class":546},[521,2274,574],{"class":538},[521,2276,2188],{"class":542},[521,2278,547],{"class":635},[521,2280,1912],{"class":546},[521,2282,574],{"class":538},[521,2284,451],{"class":546},[521,2286,2265],{"class":635},[521,2288,2289],{"class":527},"\u002F\u002F \"Try another card\"\n",[521,2291,2292],{"class":523,"line":1971},[521,2293,884],{"class":538},[511,2295,2298],{"className":513,"code":2296,"filename":2297,"language":516,"meta":517,"style":517},"import { parseError } from 'evlog'\n\nconst toast = useToast()\n\ntry {\n  await $fetch('\u002Fapi\u002Fcheckout', { 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","composables\u002FuseCheckout.ts (Nuxt UI)",[402,2299,2300,2318,2322,2338,2342,2348,2388,2398,2414,2418,2431,2446,2461,2476,2490,2548,2556,2563],{"__ignoreMap":517},[521,2301,2302,2304,2306,2308,2310,2312,2314,2316],{"class":523,"line":524},[521,2303,590],{"class":534},[521,2305,593],{"class":538},[521,2307,1801],{"class":546},[521,2309,599],{"class":538},[521,2311,602],{"class":534},[521,2313,605],{"class":538},[521,2315,608],{"class":553},[521,2317,611],{"class":538},[521,2319,2320],{"class":523,"line":531},[521,2321,617],{"emptyLinePlaceholder":616},[521,2323,2324,2327,2330,2333,2336],{"class":523,"line":620},[521,2325,2326],{"class":758},"const",[521,2328,2329],{"class":546}," toast ",[521,2331,2332],{"class":538},"=",[521,2334,2335],{"class":542}," useToast",[521,2337,1946],{"class":546},[521,2339,2340],{"class":523,"line":632},[521,2341,617],{"emptyLinePlaceholder":616},[521,2343,2344,2346],{"class":523,"line":652},[521,2345,1648],{"class":534},[521,2347,801],{"class":538},[521,2349,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386],{"class":523,"line":668},[521,2351,1655],{"class":534},[521,2353,1828],{"class":542},[521,2355,547],{"class":635},[521,2357,550],{"class":538},[521,2359,1835],{"class":553},[521,2361,550],{"class":538},[521,2363,1154],{"class":538},[521,2365,593],{"class":538},[521,2367,1844],{"class":635},[521,2369,639],{"class":538},[521,2371,605],{"class":538},[521,2373,1851],{"class":553},[521,2375,550],{"class":538},[521,2377,1154],{"class":538},[521,2379,1858],{"class":635},[521,2381,639],{"class":538},[521,2383,1863],{"class":546},[521,2385,599],{"class":538},[521,2387,559],{"class":635},[521,2389,2390,2392,2394,2396],{"class":523,"line":682},[521,2391,736],{"class":538},[521,2393,1682],{"class":534},[521,2395,1685],{"class":546},[521,2397,629],{"class":538},[521,2399,2400,2402,2404,2406,2408,2410,2412],{"class":523,"line":699},[521,2401,1882],{"class":758},[521,2403,1885],{"class":546},[521,2405,1888],{"class":538},[521,2407,1801],{"class":542},[521,2409,547],{"class":635},[521,2411,1895],{"class":546},[521,2413,559],{"class":635},[521,2415,2416],{"class":523,"line":716},[521,2417,617],{"emptyLinePlaceholder":616},[521,2419,2420,2423,2425,2427,2429],{"class":523,"line":733},[521,2421,2422],{"class":546},"  toast",[521,2424,574],{"class":538},[521,2426,1989],{"class":542},[521,2428,547],{"class":635},[521,2430,629],{"class":538},[521,2432,2433,2436,2438,2440,2442,2444],{"class":523,"line":1165},[521,2434,2435],{"class":635},"    title",[521,2437,639],{"class":538},[521,2439,1885],{"class":546},[521,2441,574],{"class":538},[521,2443,443],{"class":546},[521,2445,649],{"class":538},[521,2447,2448,2451,2453,2455,2457,2459],{"class":523,"line":1767},[521,2449,2450],{"class":635},"    description",[521,2452,639],{"class":538},[521,2454,1885],{"class":546},[521,2456,574],{"class":538},[521,2458,447],{"class":546},[521,2460,649],{"class":538},[521,2462,2463,2466,2468,2470,2472,2474],{"class":523,"line":1971},[521,2464,2465],{"class":635},"    color",[521,2467,639],{"class":538},[521,2469,605],{"class":538},[521,2471,1912],{"class":553},[521,2473,550],{"class":538},[521,2475,649],{"class":538},[521,2477,2478,2481,2483,2485,2487],{"class":523,"line":1979},[521,2479,2480],{"class":635},"    actions",[521,2482,639],{"class":538},[521,2484,1885],{"class":546},[521,2486,574],{"class":538},[521,2488,2489],{"class":546},"link\n",[521,2491,2492,2495,2498,2500,2503,2505,2507,2510,2512,2514,2517,2519,2522,2525,2528,2530,2533,2535,2537,2539,2541,2543,2545],{"class":523,"line":2025},[521,2493,2494],{"class":538},"      ?",[521,2496,2497],{"class":635}," [",[521,2499,1994],{"class":538},[521,2501,2502],{"class":635}," label",[521,2504,639],{"class":538},[521,2506,605],{"class":538},[521,2508,2509],{"class":553},"Learn more",[521,2511,550],{"class":538},[521,2513,1154],{"class":538},[521,2515,2516],{"class":542}," onClick",[521,2518,639],{"class":538},[521,2520,2521],{"class":538}," ()",[521,2523,2524],{"class":758}," =>",[521,2526,2527],{"class":546}," window",[521,2529,574],{"class":538},[521,2531,2532],{"class":542},"open",[521,2534,547],{"class":635},[521,2536,1912],{"class":546},[521,2538,574],{"class":538},[521,2540,455],{"class":546},[521,2542,1919],{"class":635},[521,2544,736],{"class":538},[521,2546,2547],{"class":635},"]\n",[521,2549,2550,2553],{"class":523,"line":2030},[521,2551,2552],{"class":538},"      :",[521,2554,2555],{"class":538}," undefined,\n",[521,2557,2559,2561],{"class":523,"line":2558},17,[521,2560,1762],{"class":538},[521,2562,559],{"class":635},[521,2564,2566],{"class":523,"line":2565},18,[521,2567,884],{"class":538},[1229,2569,2571],{"id":2570},"error-display-component","Error Display Component",[398,2573,2574],{},"Create a reusable error display:",[511,2576,2581],{"className":2577,"code":2578,"filename":2579,"language":2580,"meta":517,"style":517},"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\u002Fscript>\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\u002Fp>\n      \u003Cp class=\"mt-2 font-medium\">{{ parsed.fix }}\u003C\u002Fp>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUAlert>\n\u003C\u002Ftemplate>\n","components\u002FErrorAlert.vue","vue",[402,2582,2583,2609,2627,2631,2650,2660,2667,2671,2695,2704,2708,2717,2725,2739,2753,2765,2779,2784,2815,2835,2865,2875,2886],{"__ignoreMap":517},[521,2584,2585,2588,2591,2594,2597,2599,2601,2604,2606],{"class":523,"line":524},[521,2586,2587],{"class":538},"\u003C",[521,2589,2590],{"class":635},"script",[521,2592,2593],{"class":758}," setup",[521,2595,2596],{"class":758}," lang",[521,2598,2332],{"class":538},[521,2600,762],{"class":538},[521,2602,2603],{"class":553},"ts",[521,2605,762],{"class":538},[521,2607,2608],{"class":538},">\n",[521,2610,2611,2613,2615,2617,2619,2621,2623,2625],{"class":523,"line":531},[521,2612,590],{"class":534},[521,2614,593],{"class":538},[521,2616,1801],{"class":546},[521,2618,599],{"class":538},[521,2620,602],{"class":534},[521,2622,605],{"class":538},[521,2624,608],{"class":553},[521,2626,611],{"class":538},[521,2628,2629],{"class":523,"line":620},[521,2630,617],{"emptyLinePlaceholder":616},[521,2632,2633,2635,2637,2640,2642,2644,2647],{"class":523,"line":632},[521,2634,2326],{"class":758},[521,2636,593],{"class":538},[521,2638,2639],{"class":546}," error ",[521,2641,736],{"class":538},[521,2643,1888],{"class":538},[521,2645,2646],{"class":542}," defineProps",[521,2648,2649],{"class":538},"\u003C{\n",[521,2651,2652,2655,2657],{"class":523,"line":652},[521,2653,2654],{"class":635},"  error",[521,2656,639],{"class":538},[521,2658,2659],{"class":809}," unknown\n",[521,2661,2662,2665],{"class":523,"line":668},[521,2663,2664],{"class":538},"}>",[521,2666,1946],{"class":546},[521,2668,2669],{"class":523,"line":682},[521,2670,617],{"emptyLinePlaceholder":616},[521,2672,2673,2675,2678,2680,2683,2685,2688,2690,2692],{"class":523,"line":699},[521,2674,2326],{"class":758},[521,2676,2677],{"class":546}," parsed ",[521,2679,2332],{"class":538},[521,2681,2682],{"class":542}," computed",[521,2684,547],{"class":546},[521,2686,2687],{"class":538},"()",[521,2689,2524],{"class":758},[521,2691,1801],{"class":542},[521,2693,2694],{"class":546},"(error))\n",[521,2696,2697,2700,2702],{"class":523,"line":716},[521,2698,2699],{"class":538},"\u003C\u002F",[521,2701,2590],{"class":635},[521,2703,2608],{"class":538},[521,2705,2706],{"class":523,"line":733},[521,2707,617],{"emptyLinePlaceholder":616},[521,2709,2710,2712,2715],{"class":523,"line":1165},[521,2711,2587],{"class":538},[521,2713,2714],{"class":635},"template",[521,2716,2608],{"class":538},[521,2718,2719,2722],{"class":523,"line":1767},[521,2720,2721],{"class":538},"  \u003C",[521,2723,2724],{"class":635},"UAlert\n",[521,2726,2727,2730,2732,2734,2737],{"class":523,"line":1971},[521,2728,2729],{"class":758},"    :title",[521,2731,2332],{"class":538},[521,2733,762],{"class":538},[521,2735,2736],{"class":553},"parsed.message",[521,2738,874],{"class":538},[521,2740,2741,2744,2746,2748,2751],{"class":523,"line":1979},[521,2742,2743],{"class":758},"    :description",[521,2745,2332],{"class":538},[521,2747,762],{"class":538},[521,2749,2750],{"class":553},"parsed.why",[521,2752,874],{"class":538},[521,2754,2755,2757,2759,2761,2763],{"class":523,"line":2025},[521,2756,2465],{"class":758},[521,2758,2332],{"class":538},[521,2760,762],{"class":538},[521,2762,1912],{"class":553},[521,2764,874],{"class":538},[521,2766,2767,2770,2772,2774,2777],{"class":523,"line":2030},[521,2768,2769],{"class":758},"    icon",[521,2771,2332],{"class":538},[521,2773,762],{"class":538},[521,2775,2776],{"class":553},"i-lucide-alert-circle",[521,2778,874],{"class":538},[521,2780,2781],{"class":523,"line":2558},[521,2782,2783],{"class":538},"  >\n",[521,2785,2786,2789,2791,2794,2796,2798,2801,2803,2805,2807,2810,2813],{"class":523,"line":2565},[521,2787,2788],{"class":538},"    \u003C",[521,2790,2714],{"class":635},[521,2792,2793],{"class":534}," v-if",[521,2795,2332],{"class":538},[521,2797,762],{"class":538},[521,2799,2800],{"class":546},"parsed",[521,2802,574],{"class":538},[521,2804,451],{"class":546},[521,2806,762],{"class":538},[521,2808,2809],{"class":538}," #",[521,2811,2812],{"class":758},"description",[521,2814,2608],{"class":538},[521,2816,2818,2821,2823,2826,2829,2831,2833],{"class":523,"line":2817},19,[521,2819,2820],{"class":538},"      \u003C",[521,2822,398],{"class":635},[521,2824,2825],{"class":538},">",[521,2827,2828],{"class":546},"{{ parsed.why }}",[521,2830,2699],{"class":538},[521,2832,398],{"class":635},[521,2834,2608],{"class":538},[521,2836,2838,2840,2842,2845,2847,2849,2852,2854,2856,2859,2861,2863],{"class":523,"line":2837},20,[521,2839,2820],{"class":538},[521,2841,398],{"class":635},[521,2843,2844],{"class":758}," class",[521,2846,2332],{"class":538},[521,2848,762],{"class":538},[521,2850,2851],{"class":553},"mt-2 font-medium",[521,2853,762],{"class":538},[521,2855,2825],{"class":538},[521,2857,2858],{"class":546},"{{ parsed.fix }}",[521,2860,2699],{"class":538},[521,2862,398],{"class":635},[521,2864,2608],{"class":538},[521,2866,2868,2871,2873],{"class":523,"line":2867},21,[521,2869,2870],{"class":538},"    \u003C\u002F",[521,2872,2714],{"class":635},[521,2874,2608],{"class":538},[521,2876,2878,2881,2884],{"class":523,"line":2877},22,[521,2879,2880],{"class":538},"  \u003C\u002F",[521,2882,2883],{"class":635},"UAlert",[521,2885,2608],{"class":538},[521,2887,2889,2891,2893],{"class":523,"line":2888},23,[521,2890,2699],{"class":538},[521,2892,2714],{"class":635},[521,2894,2608],{"class":538},[500,2896,185],{"id":2897},"best-practices",[1229,2899,2901],{"id":2900},"use-appropriate-status-codes","Use Appropriate Status Codes",[579,2903,2904,2972,3055,3107],{},[511,2905,2908],{"className":513,"code":2906,"filename":2907,"language":516,"meta":517,"style":517},"\u002F\u002F 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",[402,2909,2910,2915,2925,2940,2951,2966],{"__ignoreMap":517},[521,2911,2912],{"class":523,"line":524},[521,2913,2914],{"class":527},"\u002F\u002F Client error - user can fix\n",[521,2916,2917,2919,2921,2923],{"class":523,"line":531},[521,2918,535],{"class":534},[521,2920,596],{"class":542},[521,2922,547],{"class":546},[521,2924,629],{"class":538},[521,2926,2927,2929,2931,2933,2936,2938],{"class":523,"line":620},[521,2928,655],{"class":635},[521,2930,639],{"class":538},[521,2932,605],{"class":538},[521,2934,2935],{"class":553},"Invalid email format",[521,2937,550],{"class":538},[521,2939,649],{"class":538},[521,2941,2942,2944,2946,2949],{"class":523,"line":632},[521,2943,671],{"class":635},[521,2945,639],{"class":538},[521,2947,2948],{"class":676}," 400",[521,2950,649],{"class":538},[521,2952,2953,2955,2957,2959,2962,2964],{"class":523,"line":652},[521,2954,702],{"class":635},[521,2956,639],{"class":538},[521,2958,605],{"class":538},[521,2960,2961],{"class":553},"Please enter a valid email address",[521,2963,550],{"class":538},[521,2965,649],{"class":538},[521,2967,2968,2970],{"class":523,"line":668},[521,2969,736],{"class":538},[521,2971,559],{"class":546},[511,2973,2976],{"className":513,"code":2974,"filename":2975,"language":516,"meta":517,"style":517},"\u002F\u002F Authentication required\nthrow createError({\n  message: 'Please log in to continue',\n  status: 401,\n  fix: 'Sign in to your account',\n  link: '\u002Flogin',\n})\n","401 - Unauthorized",[402,2977,2978,2983,2993,3008,3019,3034,3049],{"__ignoreMap":517},[521,2979,2980],{"class":523,"line":524},[521,2981,2982],{"class":527},"\u002F\u002F Authentication required\n",[521,2984,2985,2987,2989,2991],{"class":523,"line":531},[521,2986,535],{"class":534},[521,2988,596],{"class":542},[521,2990,547],{"class":546},[521,2992,629],{"class":538},[521,2994,2995,2997,2999,3001,3004,3006],{"class":523,"line":620},[521,2996,655],{"class":635},[521,2998,639],{"class":538},[521,3000,605],{"class":538},[521,3002,3003],{"class":553},"Please log in to continue",[521,3005,550],{"class":538},[521,3007,649],{"class":538},[521,3009,3010,3012,3014,3017],{"class":523,"line":632},[521,3011,671],{"class":635},[521,3013,639],{"class":538},[521,3015,3016],{"class":676}," 401",[521,3018,649],{"class":538},[521,3020,3021,3023,3025,3027,3030,3032],{"class":523,"line":652},[521,3022,702],{"class":635},[521,3024,639],{"class":538},[521,3026,605],{"class":538},[521,3028,3029],{"class":553},"Sign in to your account",[521,3031,550],{"class":538},[521,3033,649],{"class":538},[521,3035,3036,3038,3040,3042,3045,3047],{"class":523,"line":668},[521,3037,719],{"class":635},[521,3039,639],{"class":538},[521,3041,605],{"class":538},[521,3043,3044],{"class":553},"\u002Flogin",[521,3046,550],{"class":538},[521,3048,649],{"class":538},[521,3050,3051,3053],{"class":523,"line":682},[521,3052,736],{"class":538},[521,3054,559],{"class":546},[511,3056,3059],{"className":513,"code":3057,"filename":3058,"language":516,"meta":517,"style":517},"\u002F\u002F Resource not found\nthrow createError({\n  message: 'Order not found',\n  status: 404,\n})\n","404 - Not Found",[402,3060,3061,3066,3076,3091,3101],{"__ignoreMap":517},[521,3062,3063],{"class":523,"line":524},[521,3064,3065],{"class":527},"\u002F\u002F Resource not found\n",[521,3067,3068,3070,3072,3074],{"class":523,"line":531},[521,3069,535],{"class":534},[521,3071,596],{"class":542},[521,3073,547],{"class":546},[521,3075,629],{"class":538},[521,3077,3078,3080,3082,3084,3087,3089],{"class":523,"line":620},[521,3079,655],{"class":635},[521,3081,639],{"class":538},[521,3083,605],{"class":538},[521,3085,3086],{"class":553},"Order not found",[521,3088,550],{"class":538},[521,3090,649],{"class":538},[521,3092,3093,3095,3097,3099],{"class":523,"line":632},[521,3094,671],{"class":635},[521,3096,639],{"class":538},[521,3098,1296],{"class":676},[521,3100,649],{"class":538},[521,3102,3103,3105],{"class":523,"line":652},[521,3104,736],{"class":538},[521,3106,559],{"class":546},[511,3108,3111],{"className":513,"code":3109,"filename":3110,"language":516,"meta":517,"style":517},"\u002F\u002F Server error - not user's fault\nthrow createError({\n  message: 'Something went wrong',\n  status: 500,\n  why: 'Database connection timeout',\n  \u002F\u002F No 'fix' - user can't fix server errors\n})\n","500 - Server Error",[402,3112,3113,3118,3128,3143,3153,3168,3173],{"__ignoreMap":517},[521,3114,3115],{"class":523,"line":524},[521,3116,3117],{"class":527},"\u002F\u002F Server error - not user's fault\n",[521,3119,3120,3122,3124,3126],{"class":523,"line":531},[521,3121,535],{"class":534},[521,3123,596],{"class":542},[521,3125,547],{"class":546},[521,3127,629],{"class":538},[521,3129,3130,3132,3134,3136,3139,3141],{"class":523,"line":620},[521,3131,655],{"class":635},[521,3133,639],{"class":538},[521,3135,605],{"class":538},[521,3137,3138],{"class":553},"Something went wrong",[521,3140,550],{"class":538},[521,3142,649],{"class":538},[521,3144,3145,3147,3149,3151],{"class":523,"line":632},[521,3146,671],{"class":635},[521,3148,639],{"class":538},[521,3150,1724],{"class":676},[521,3152,649],{"class":538},[521,3154,3155,3157,3159,3161,3164,3166],{"class":523,"line":652},[521,3156,685],{"class":635},[521,3158,639],{"class":538},[521,3160,605],{"class":538},[521,3162,3163],{"class":553},"Database connection timeout",[521,3165,550],{"class":538},[521,3167,649],{"class":538},[521,3169,3170],{"class":523,"line":668},[521,3171,3172],{"class":527},"  \u002F\u002F No 'fix' - user can't fix server errors\n",[521,3174,3175,3177],{"class":523,"line":682},[521,3176,736],{"class":538},[521,3178,559],{"class":546},[1229,3180,3182],{"id":3181},"provide-actionable-fixes","Provide Actionable Fixes",[579,3184,3185,3242],{},[511,3186,3189],{"className":513,"code":3187,"filename":3188,"language":516,"meta":517,"style":517},"\u002F\u002F Unhelpful fix\nthrow createError({\n  message: 'Upload failed',\n  fix: 'Try again',\n})\n","Bad",[402,3190,3191,3196,3206,3221,3236],{"__ignoreMap":517},[521,3192,3193],{"class":523,"line":524},[521,3194,3195],{"class":527},"\u002F\u002F Unhelpful fix\n",[521,3197,3198,3200,3202,3204],{"class":523,"line":531},[521,3199,535],{"class":534},[521,3201,596],{"class":542},[521,3203,547],{"class":546},[521,3205,629],{"class":538},[521,3207,3208,3210,3212,3214,3217,3219],{"class":523,"line":620},[521,3209,655],{"class":635},[521,3211,639],{"class":538},[521,3213,605],{"class":538},[521,3215,3216],{"class":553},"Upload failed",[521,3218,550],{"class":538},[521,3220,649],{"class":538},[521,3222,3223,3225,3227,3229,3232,3234],{"class":523,"line":632},[521,3224,702],{"class":635},[521,3226,639],{"class":538},[521,3228,605],{"class":538},[521,3230,3231],{"class":553},"Try again",[521,3233,550],{"class":538},[521,3235,649],{"class":538},[521,3237,3238,3240],{"class":523,"line":652},[521,3239,736],{"class":538},[521,3241,559],{"class":546},[511,3243,3246],{"className":513,"code":3244,"filename":3245,"language":516,"meta":517,"style":517},"\u002F\u002F 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: '\u002Fdocs\u002Fupload-limits',\n})\n","Good",[402,3247,3248,3253,3263,3277,3288,3303,3318,3333],{"__ignoreMap":517},[521,3249,3250],{"class":523,"line":524},[521,3251,3252],{"class":527},"\u002F\u002F Actionable fix\n",[521,3254,3255,3257,3259,3261],{"class":523,"line":531},[521,3256,535],{"class":534},[521,3258,596],{"class":542},[521,3260,547],{"class":546},[521,3262,629],{"class":538},[521,3264,3265,3267,3269,3271,3273,3275],{"class":523,"line":620},[521,3266,655],{"class":635},[521,3268,639],{"class":538},[521,3270,605],{"class":538},[521,3272,3216],{"class":553},[521,3274,550],{"class":538},[521,3276,649],{"class":538},[521,3278,3279,3281,3283,3286],{"class":523,"line":632},[521,3280,671],{"class":635},[521,3282,639],{"class":538},[521,3284,3285],{"class":676}," 413",[521,3287,649],{"class":538},[521,3289,3290,3292,3294,3296,3299,3301],{"class":523,"line":652},[521,3291,685],{"class":635},[521,3293,639],{"class":538},[521,3295,605],{"class":538},[521,3297,3298],{"class":553},"File exceeds maximum size (10MB)",[521,3300,550],{"class":538},[521,3302,649],{"class":538},[521,3304,3305,3307,3309,3311,3314,3316],{"class":523,"line":668},[521,3306,702],{"class":635},[521,3308,639],{"class":538},[521,3310,605],{"class":538},[521,3312,3313],{"class":553},"Reduce the file size or compress the image before uploading",[521,3315,550],{"class":538},[521,3317,649],{"class":538},[521,3319,3320,3322,3324,3326,3329,3331],{"class":523,"line":682},[521,3321,719],{"class":635},[521,3323,639],{"class":538},[521,3325,605],{"class":538},[521,3327,3328],{"class":553},"\u002Fdocs\u002Fupload-limits",[521,3330,550],{"class":538},[521,3332,649],{"class":538},[521,3334,3335,3337],{"class":523,"line":699},[521,3336,736],{"class":538},[521,3338,559],{"class":546},[500,3340,3342],{"id":3341},"error-catalogs","Error Catalogs",[398,3344,3345,3346,3349,3350,3353,3354,3357,3358,3360,3361,3364,3365,3367],{},"For anything beyond a handful of one-off errors, group them in a typed ",[1019,3347,3348],{},"catalog",". evlog ships two primitives for this — ",[402,3351,3352],{},"defineError"," (single factory) and ",[402,3355,3356],{},"defineErrorCatalog"," (bundle prefixed). The wire ",[402,3359,402],{}," is auto-derived as ",[402,3362,3363],{},"${prefix}.${KEY}"," and the ",[402,3366,1212],{}," instance is built with all defaults applied.",[1229,3369,3371],{"id":3370},"defineerrorcatalog",[402,3372,3356],{},[398,3374,3375,3376,3379,3380,3383],{},"Define a bundle of errors that share a prefix. Convention: ",[402,3377,3378],{},"UPPER_SNAKE_CASE"," keys, ",[402,3381,3382],{},"lower.dot.case"," prefix.",[579,3385,3386,3686],{},[511,3387,3390],{"className":513,"code":3388,"filename":3389,"language":516,"meta":517,"style":517},"import { defineErrorCatalog } from 'evlog'\n\nexport const billingErrors = defineErrorCatalog('billing', {\n  CART_EMPTY: {\n    status: 400,\n    message: 'Cart is empty',\n  },\n  PAYMENT_DECLINED: {\n    status: 402,\n    message: 'Card declined',\n    why: 'Issuer declined the charge',\n    fix: 'Try a different payment method',\n    link: 'https:\u002F\u002Fdocs.example.com\u002Ferrors\u002Fbilling.payment_declined',\n  },\n  INSUFFICIENT_FUNDS: {\n    status: 402,\n    message: ({ available, required }: { available: number, required: number }) =>\n      `Insufficient funds: $${available} available, $${required} required`,\n    fix: 'Add funds and retry',\n  },\n})\n","errors\u002Fbilling.ts",[402,3391,3392,3411,3415,3443,3452,3462,3477,3481,3490,3500,3515,3530,3545,3561,3565,3574,3584,3628,3661,3676,3680],{"__ignoreMap":517},[521,3393,3394,3396,3398,3401,3403,3405,3407,3409],{"class":523,"line":524},[521,3395,590],{"class":534},[521,3397,593],{"class":538},[521,3399,3400],{"class":546}," defineErrorCatalog",[521,3402,599],{"class":538},[521,3404,602],{"class":534},[521,3406,605],{"class":538},[521,3408,608],{"class":553},[521,3410,611],{"class":538},[521,3412,3413],{"class":523,"line":531},[521,3414,617],{"emptyLinePlaceholder":616},[521,3416,3417,3420,3423,3426,3428,3430,3432,3434,3437,3439,3441],{"class":523,"line":620},[521,3418,3419],{"class":534},"export",[521,3421,3422],{"class":758}," const",[521,3424,3425],{"class":546}," billingErrors ",[521,3427,2332],{"class":538},[521,3429,3400],{"class":542},[521,3431,547],{"class":546},[521,3433,550],{"class":538},[521,3435,3436],{"class":553},"billing",[521,3438,550],{"class":538},[521,3440,1154],{"class":538},[521,3442,801],{"class":538},[521,3444,3445,3448,3450],{"class":523,"line":632},[521,3446,3447],{"class":635},"  CART_EMPTY",[521,3449,639],{"class":538},[521,3451,801],{"class":538},[521,3453,3454,3456,3458,3460],{"class":523,"line":652},[521,3455,1719],{"class":635},[521,3457,639],{"class":538},[521,3459,2948],{"class":676},[521,3461,649],{"class":538},[521,3463,3464,3466,3468,3470,3473,3475],{"class":523,"line":668},[521,3465,1703],{"class":635},[521,3467,639],{"class":538},[521,3469,605],{"class":538},[521,3471,3472],{"class":553},"Cart is empty",[521,3474,550],{"class":538},[521,3476,649],{"class":538},[521,3478,3479],{"class":523,"line":682},[521,3480,1162],{"class":538},[521,3482,3483,3486,3488],{"class":523,"line":699},[521,3484,3485],{"class":635},"  PAYMENT_DECLINED",[521,3487,639],{"class":538},[521,3489,801],{"class":538},[521,3491,3492,3494,3496,3498],{"class":523,"line":716},[521,3493,1719],{"class":635},[521,3495,639],{"class":538},[521,3497,677],{"class":676},[521,3499,649],{"class":538},[521,3501,3502,3504,3506,3508,3511,3513],{"class":523,"line":733},[521,3503,1703],{"class":635},[521,3505,639],{"class":538},[521,3507,605],{"class":538},[521,3509,3510],{"class":553},"Card declined",[521,3512,550],{"class":538},[521,3514,649],{"class":538},[521,3516,3517,3519,3521,3523,3526,3528],{"class":523,"line":1165},[521,3518,1731],{"class":635},[521,3520,639],{"class":538},[521,3522,605],{"class":538},[521,3524,3525],{"class":553},"Issuer declined the charge",[521,3527,550],{"class":538},[521,3529,649],{"class":538},[521,3531,3532,3535,3537,3539,3541,3543],{"class":523,"line":1767},[521,3533,3534],{"class":635},"    fix",[521,3536,639],{"class":538},[521,3538,605],{"class":538},[521,3540,1454],{"class":553},[521,3542,550],{"class":538},[521,3544,649],{"class":538},[521,3546,3547,3550,3552,3554,3557,3559],{"class":523,"line":1971},[521,3548,3549],{"class":635},"    link",[521,3551,639],{"class":538},[521,3553,605],{"class":538},[521,3555,3556],{"class":553},"https:\u002F\u002Fdocs.example.com\u002Ferrors\u002Fbilling.payment_declined",[521,3558,550],{"class":538},[521,3560,649],{"class":538},[521,3562,3563],{"class":523,"line":1979},[521,3564,1162],{"class":538},[521,3566,3567,3570,3572],{"class":523,"line":2025},[521,3568,3569],{"class":635},"  INSUFFICIENT_FUNDS",[521,3571,639],{"class":538},[521,3573,801],{"class":538},[521,3575,3576,3578,3580,3582],{"class":523,"line":2030},[521,3577,1719],{"class":635},[521,3579,639],{"class":538},[521,3581,677],{"class":676},[521,3583,649],{"class":538},[521,3585,3586,3588,3590,3593,3597,3599,3602,3605,3607,3609,3611,3614,3616,3618,3620,3622,3625],{"class":523,"line":2558},[521,3587,1703],{"class":542},[521,3589,639],{"class":538},[521,3591,3592],{"class":538}," ({",[521,3594,3596],{"class":3595},"sHdIc"," available",[521,3598,1154],{"class":538},[521,3600,3601],{"class":3595}," required",[521,3603,3604],{"class":538}," }:",[521,3606,593],{"class":538},[521,3608,3596],{"class":635},[521,3610,639],{"class":538},[521,3612,3613],{"class":809}," number",[521,3615,1154],{"class":538},[521,3617,3601],{"class":635},[521,3619,639],{"class":538},[521,3621,3613],{"class":809},[521,3623,3624],{"class":538}," })",[521,3626,3627],{"class":758}," =>\n",[521,3629,3630,3633,3636,3639,3642,3644,3647,3649,3652,3654,3656,3659],{"class":523,"line":2565},[521,3631,3632],{"class":538},"      `",[521,3634,3635],{"class":553},"Insufficient funds: $",[521,3637,3638],{"class":538},"${",[521,3640,3641],{"class":546},"available",[521,3643,736],{"class":538},[521,3645,3646],{"class":553}," available, $",[521,3648,3638],{"class":538},[521,3650,3651],{"class":546},"required",[521,3653,736],{"class":538},[521,3655,3601],{"class":553},[521,3657,3658],{"class":538},"`",[521,3660,649],{"class":538},[521,3662,3663,3665,3667,3669,3672,3674],{"class":523,"line":2817},[521,3664,3534],{"class":635},[521,3666,639],{"class":538},[521,3668,605],{"class":538},[521,3670,3671],{"class":553},"Add funds and retry",[521,3673,550],{"class":538},[521,3675,649],{"class":538},[521,3677,3678],{"class":523,"line":2837},[521,3679,1162],{"class":538},[521,3681,3682,3684],{"class":523,"line":2867},[521,3683,736],{"class":538},[521,3685,559],{"class":546},[511,3687,3689],{"className":513,"code":3688,"filename":515,"language":516,"meta":517,"style":517},"import { billingErrors } from '~\u002Ferrors\u002Fbilling'\n\nexport default defineEventHandler(async (event) => {\n  const cart = await getCart(event)\n\n  if (!cart.items.length) throw billingErrors.CART_EMPTY()\n\n  try {\n    await stripe.charge(cart.total)\n  }\n  catch (e) {\n    if (e.code === 'card_declined') throw billingErrors.PAYMENT_DECLINED({ cause: e })\n    if (e.code === 'insufficient_funds') {\n      throw billingErrors.INSUFFICIENT_FUNDS({\n        available: e.balance,\n        required: cart.total,\n        cause: e,\n      })\n    }\n    throw e\n  }\n})\n",[402,3690,3691,3711,3715,3741,3761,3765,3801,3805,3812,3834,3838,3852,3901,3925,3941,3957,3972,3983,3990,3995,4003,4007],{"__ignoreMap":517},[521,3692,3693,3695,3697,3700,3702,3704,3706,3709],{"class":523,"line":524},[521,3694,590],{"class":534},[521,3696,593],{"class":538},[521,3698,3699],{"class":546}," billingErrors",[521,3701,599],{"class":538},[521,3703,602],{"class":534},[521,3705,605],{"class":538},[521,3707,3708],{"class":553},"~\u002Ferrors\u002Fbilling",[521,3710,611],{"class":538},[521,3712,3713],{"class":523,"line":531},[521,3714,617],{"emptyLinePlaceholder":616},[521,3716,3717,3719,3722,3725,3727,3730,3732,3735,3737,3739],{"class":523,"line":620},[521,3718,3419],{"class":534},[521,3720,3721],{"class":534}," default",[521,3723,3724],{"class":542}," defineEventHandler",[521,3726,547],{"class":546},[521,3728,3729],{"class":758},"async",[521,3731,1909],{"class":538},[521,3733,3734],{"class":3595},"event",[521,3736,938],{"class":538},[521,3738,2524],{"class":758},[521,3740,801],{"class":538},[521,3742,3743,3745,3747,3749,3752,3755,3757,3759],{"class":523,"line":632},[521,3744,1882],{"class":758},[521,3746,1863],{"class":546},[521,3748,1888],{"class":538},[521,3750,3751],{"class":534}," await",[521,3753,3754],{"class":542}," getCart",[521,3756,547],{"class":635},[521,3758,3734],{"class":546},[521,3760,559],{"class":635},[521,3762,3763],{"class":523,"line":652},[521,3764,617],{"emptyLinePlaceholder":616},[521,3766,3767,3770,3772,3775,3778,3780,3783,3785,3788,3790,3792,3794,3796,3799],{"class":523,"line":668},[521,3768,3769],{"class":534},"  if",[521,3771,1909],{"class":635},[521,3773,3774],{"class":538},"!",[521,3776,3777],{"class":546},"cart",[521,3779,574],{"class":538},[521,3781,3782],{"class":546},"items",[521,3784,574],{"class":538},[521,3786,3787],{"class":546},"length",[521,3789,1919],{"class":635},[521,3791,535],{"class":534},[521,3793,3699],{"class":546},[521,3795,574],{"class":538},[521,3797,3798],{"class":542},"CART_EMPTY",[521,3800,1946],{"class":635},[521,3802,3803],{"class":523,"line":682},[521,3804,617],{"emptyLinePlaceholder":616},[521,3806,3807,3810],{"class":523,"line":699},[521,3808,3809],{"class":534},"  try",[521,3811,801],{"class":538},[521,3813,3814,3817,3819,3821,3823,3825,3827,3829,3832],{"class":523,"line":716},[521,3815,3816],{"class":534},"    await",[521,3818,1658],{"class":546},[521,3820,574],{"class":538},[521,3822,1673],{"class":542},[521,3824,547],{"class":635},[521,3826,3777],{"class":546},[521,3828,574],{"class":538},[521,3830,3831],{"class":546},"total",[521,3833,559],{"class":635},[521,3835,3836],{"class":523,"line":733},[521,3837,879],{"class":538},[521,3839,3840,3843,3845,3848,3850],{"class":523,"line":1165},[521,3841,3842],{"class":534},"  catch",[521,3844,1909],{"class":635},[521,3846,3847],{"class":546},"e",[521,3849,1919],{"class":635},[521,3851,629],{"class":538},[521,3853,3854,3857,3859,3861,3863,3865,3868,3870,3873,3875,3877,3879,3881,3883,3885,3887,3889,3892,3894,3897,3899],{"class":523,"line":1767},[521,3855,3856],{"class":534},"    if",[521,3858,1909],{"class":635},[521,3860,3847],{"class":546},[521,3862,574],{"class":538},[521,3864,402],{"class":546},[521,3866,3867],{"class":538}," ===",[521,3869,605],{"class":538},[521,3871,3872],{"class":553},"card_declined",[521,3874,550],{"class":538},[521,3876,1919],{"class":635},[521,3878,535],{"class":534},[521,3880,3699],{"class":546},[521,3882,574],{"class":538},[521,3884,644],{"class":542},[521,3886,547],{"class":635},[521,3888,1994],{"class":538},[521,3890,3891],{"class":635}," cause",[521,3893,639],{"class":538},[521,3895,3896],{"class":546}," e",[521,3898,599],{"class":538},[521,3900,559],{"class":635},[521,3902,3903,3905,3907,3909,3911,3913,3915,3917,3919,3921,3923],{"class":523,"line":1971},[521,3904,3856],{"class":534},[521,3906,1909],{"class":635},[521,3908,3847],{"class":546},[521,3910,574],{"class":538},[521,3912,402],{"class":546},[521,3914,3867],{"class":538},[521,3916,605],{"class":538},[521,3918,1133],{"class":553},[521,3920,550],{"class":538},[521,3922,1919],{"class":635},[521,3924,629],{"class":538},[521,3926,3927,3930,3932,3934,3937,3939],{"class":523,"line":1979},[521,3928,3929],{"class":534},"      throw",[521,3931,3699],{"class":546},[521,3933,574],{"class":538},[521,3935,3936],{"class":542},"INSUFFICIENT_FUNDS",[521,3938,547],{"class":635},[521,3940,629],{"class":538},[521,3942,3943,3946,3948,3950,3952,3955],{"class":523,"line":2025},[521,3944,3945],{"class":635},"        available",[521,3947,639],{"class":538},[521,3949,3896],{"class":546},[521,3951,574],{"class":538},[521,3953,3954],{"class":546},"balance",[521,3956,649],{"class":538},[521,3958,3959,3962,3964,3966,3968,3970],{"class":523,"line":2030},[521,3960,3961],{"class":635},"        required",[521,3963,639],{"class":538},[521,3965,1863],{"class":546},[521,3967,574],{"class":538},[521,3969,3831],{"class":546},[521,3971,649],{"class":538},[521,3973,3974,3977,3979,3981],{"class":523,"line":2558},[521,3975,3976],{"class":635},"        cause",[521,3978,639],{"class":538},[521,3980,3896],{"class":546},[521,3982,649],{"class":538},[521,3984,3985,3988],{"class":523,"line":2565},[521,3986,3987],{"class":538},"      }",[521,3989,559],{"class":635},[521,3991,3992],{"class":523,"line":2817},[521,3993,3994],{"class":538},"    }\n",[521,3996,3997,4000],{"class":523,"line":2837},[521,3998,3999],{"class":534},"    throw",[521,4001,4002],{"class":546}," e\n",[521,4004,4005],{"class":523,"line":2867},[521,4006,879],{"class":538},[521,4008,4009,4011],{"class":523,"line":2877},[521,4010,736],{"class":538},[521,4012,559],{"class":546},[398,4014,4015,4016,486,4019,4022,4023,4026],{},"Each entry becomes a typed factory. Catalog metadata is exposed on ",[402,4017,4018],{},"_codes",[402,4020,4021],{},"_prefix"," for introspection (non-enumerable so ",[402,4024,4025],{},"Object.keys(billingErrors)"," still returns just the entry names).",[511,4028,4030],{"className":513,"code":4029,"language":516,"meta":517,"style":517},"billingErrors.PAYMENT_DECLINED.code   \u002F\u002F 'billing.PAYMENT_DECLINED' (literal type)\nbillingErrors.PAYMENT_DECLINED.status \u002F\u002F 402\nbillingErrors._codes                  \u002F\u002F readonly ['billing.CART_EMPTY', 'billing.PAYMENT_DECLINED', 'billing.INSUFFICIENT_FUNDS']\n",[402,4031,4032,4049,4064],{"__ignoreMap":517},[521,4033,4034,4037,4039,4041,4043,4046],{"class":523,"line":524},[521,4035,4036],{"class":546},"billingErrors",[521,4038,574],{"class":538},[521,4040,644],{"class":546},[521,4042,574],{"class":538},[521,4044,4045],{"class":546},"code   ",[521,4047,4048],{"class":527},"\u002F\u002F 'billing.PAYMENT_DECLINED' (literal type)\n",[521,4050,4051,4053,4055,4057,4059,4062],{"class":523,"line":531},[521,4052,4036],{"class":546},[521,4054,574],{"class":538},[521,4056,644],{"class":546},[521,4058,574],{"class":538},[521,4060,4061],{"class":546},"status ",[521,4063,2224],{"class":527},[521,4065,4066,4068,4070,4073],{"class":523,"line":620},[521,4067,4036],{"class":546},[521,4069,574],{"class":538},[521,4071,4072],{"class":546},"_codes                  ",[521,4074,4075],{"class":527},"\u002F\u002F readonly ['billing.CART_EMPTY', 'billing.PAYMENT_DECLINED', 'billing.INSUFFICIENT_FUNDS']\n",[1229,4077,4079],{"id":4078},"templated-messages-with-typed-params","Templated messages with typed params",[398,4081,4082,4083,4085,4086,4089],{},"Set ",[402,4084,443],{}," to a function and the params become ",[1019,4087,4088],{},"required and typed"," at the call site.",[511,4091,4093],{"className":513,"code":4092,"language":516,"meta":517,"style":517},"const InvoiceOverdue = defineError('billing.INVOICE_OVERDUE', {\n  status: 402,\n  message: ({ daysOverdue }: { daysOverdue: number }) =>\n    `Invoice overdue by ${daysOverdue} day(s)`,\n  fix: 'Pay outstanding invoice to resume service',\n})\n\nthrow InvoiceOverdue({ daysOverdue: 7 }) \u002F\u002F params required and type-checked\n",[402,4094,4095,4120,4130,4155,4177,4192,4198,4202],{"__ignoreMap":517},[521,4096,4097,4099,4102,4104,4107,4109,4111,4114,4116,4118],{"class":523,"line":524},[521,4098,2326],{"class":758},[521,4100,4101],{"class":546}," InvoiceOverdue ",[521,4103,2332],{"class":538},[521,4105,4106],{"class":542}," defineError",[521,4108,547],{"class":546},[521,4110,550],{"class":538},[521,4112,4113],{"class":553},"billing.INVOICE_OVERDUE",[521,4115,550],{"class":538},[521,4117,1154],{"class":538},[521,4119,801],{"class":538},[521,4121,4122,4124,4126,4128],{"class":523,"line":531},[521,4123,671],{"class":635},[521,4125,639],{"class":538},[521,4127,677],{"class":676},[521,4129,649],{"class":538},[521,4131,4132,4134,4136,4138,4141,4143,4145,4147,4149,4151,4153],{"class":523,"line":620},[521,4133,655],{"class":542},[521,4135,639],{"class":538},[521,4137,3592],{"class":538},[521,4139,4140],{"class":3595}," daysOverdue",[521,4142,3604],{"class":538},[521,4144,593],{"class":538},[521,4146,4140],{"class":635},[521,4148,639],{"class":538},[521,4150,3613],{"class":809},[521,4152,3624],{"class":538},[521,4154,3627],{"class":758},[521,4156,4157,4160,4163,4165,4168,4170,4173,4175],{"class":523,"line":632},[521,4158,4159],{"class":538},"    `",[521,4161,4162],{"class":553},"Invoice overdue by ",[521,4164,3638],{"class":538},[521,4166,4167],{"class":546},"daysOverdue",[521,4169,736],{"class":538},[521,4171,4172],{"class":553}," day(s)",[521,4174,3658],{"class":538},[521,4176,649],{"class":538},[521,4178,4179,4181,4183,4185,4188,4190],{"class":523,"line":652},[521,4180,702],{"class":635},[521,4182,639],{"class":538},[521,4184,605],{"class":538},[521,4186,4187],{"class":553},"Pay outstanding invoice to resume service",[521,4189,550],{"class":538},[521,4191,649],{"class":538},[521,4193,4194,4196],{"class":523,"line":668},[521,4195,736],{"class":538},[521,4197,559],{"class":546},[521,4199,4200],{"class":523,"line":682},[521,4201,617],{"emptyLinePlaceholder":616},[521,4203,4204,4206,4209,4211,4213,4215,4217,4220,4222,4224],{"class":523,"line":699},[521,4205,535],{"class":534},[521,4207,4208],{"class":542}," InvoiceOverdue",[521,4210,547],{"class":546},[521,4212,1994],{"class":538},[521,4214,4140],{"class":635},[521,4216,639],{"class":538},[521,4218,4219],{"class":676}," 7",[521,4221,599],{"class":538},[521,4223,1919],{"class":546},[521,4225,4226],{"class":527},"\u002F\u002F params required and type-checked\n",[398,4228,4229,4230,434,4232,434,4234,434,4236,434,4238,434,4240,434,4242,4244,4245,4247],{},"You can still override any field at the call site (",[402,4231,443],{},[402,4233,462],{},[402,4235,447],{},[402,4237,451],{},[402,4239,455],{},[402,4241,1001],{},[402,4243,989],{},"). Catalog defaults for ",[402,4246,1001],{}," are shallow-merged with call-site values (call-site wins on conflict).",[1229,4249,4251,4253],{"id":4250},"defineerror-standalone-factories",[402,4252,3352],{}," — standalone factories",[398,4255,4256,4257,4259],{},"For one-off errors that don't fit a catalog (or for very large repos that prefer one file per error), use ",[402,4258,3352],{}," directly. Same factory shape as a catalog entry, no prefix derivation.",[511,4261,4263],{"className":513,"code":4262,"language":516,"meta":517,"style":517},"\u002F\u002F errors\u002FFraudDetected.ts\nimport { defineError } from 'evlog'\n\nexport const FraudDetected = defineError('billing.FRAUD_DETECTED', {\n  status: 403,\n  message: 'Transaction flagged for review',\n  why: 'ML fraud-score above threshold',\n  fix: 'Contact support to verify your identity',\n})\n\nthrow FraudDetected()\n",[402,4264,4265,4270,4288,4292,4318,4329,4344,4359,4374,4380,4384],{"__ignoreMap":517},[521,4266,4267],{"class":523,"line":524},[521,4268,4269],{"class":527},"\u002F\u002F errors\u002FFraudDetected.ts\n",[521,4271,4272,4274,4276,4278,4280,4282,4284,4286],{"class":523,"line":531},[521,4273,590],{"class":534},[521,4275,593],{"class":538},[521,4277,4106],{"class":546},[521,4279,599],{"class":538},[521,4281,602],{"class":534},[521,4283,605],{"class":538},[521,4285,608],{"class":553},[521,4287,611],{"class":538},[521,4289,4290],{"class":523,"line":620},[521,4291,617],{"emptyLinePlaceholder":616},[521,4293,4294,4296,4298,4301,4303,4305,4307,4309,4312,4314,4316],{"class":523,"line":632},[521,4295,3419],{"class":534},[521,4297,3422],{"class":758},[521,4299,4300],{"class":546}," FraudDetected ",[521,4302,2332],{"class":538},[521,4304,4106],{"class":542},[521,4306,547],{"class":546},[521,4308,550],{"class":538},[521,4310,4311],{"class":553},"billing.FRAUD_DETECTED",[521,4313,550],{"class":538},[521,4315,1154],{"class":538},[521,4317,801],{"class":538},[521,4319,4320,4322,4324,4327],{"class":523,"line":652},[521,4321,671],{"class":635},[521,4323,639],{"class":538},[521,4325,4326],{"class":676}," 403",[521,4328,649],{"class":538},[521,4330,4331,4333,4335,4337,4340,4342],{"class":523,"line":668},[521,4332,655],{"class":635},[521,4334,639],{"class":538},[521,4336,605],{"class":538},[521,4338,4339],{"class":553},"Transaction flagged for review",[521,4341,550],{"class":538},[521,4343,649],{"class":538},[521,4345,4346,4348,4350,4352,4355,4357],{"class":523,"line":682},[521,4347,685],{"class":635},[521,4349,639],{"class":538},[521,4351,605],{"class":538},[521,4353,4354],{"class":553},"ML fraud-score above threshold",[521,4356,550],{"class":538},[521,4358,649],{"class":538},[521,4360,4361,4363,4365,4367,4370,4372],{"class":523,"line":699},[521,4362,702],{"class":635},[521,4364,639],{"class":538},[521,4366,605],{"class":538},[521,4368,4369],{"class":553},"Contact support to verify your identity",[521,4371,550],{"class":538},[521,4373,649],{"class":538},[521,4375,4376,4378],{"class":523,"line":716},[521,4377,736],{"class":538},[521,4379,559],{"class":546},[521,4381,4382],{"class":523,"line":733},[521,4383,617],{"emptyLinePlaceholder":616},[521,4385,4386,4388,4391],{"class":523,"line":1165},[521,4387,535],{"class":534},[521,4389,4390],{"class":542}," FraudDetected",[521,4392,1946],{"class":546},[1229,4394,4396],{"id":4395},"type-safe-codes-everywhere-opt-in","Type-safe codes everywhere (opt-in)",[398,4398,4399,4400,4403,4404,434,4407,4410,4411,4413],{},"Augment the ",[402,4401,4402],{},"RegisteredErrorCatalogs"," interface to make every registered code surface as autocomplete on ",[402,4405,4406],{},"createError({ code })",[402,4408,4409],{},"parseError(err).code",", and any other typed ",[402,4412,402],{}," field across the codebase.",[579,4415,4416,4531],{},[511,4417,4420],{"className":513,"code":4418,"filename":4419,"language":516,"meta":517,"style":517},"import type { billingErrors } from '.\u002Fbilling'\nimport type { authErrors }    from '.\u002Fauth'\n\ndeclare module 'evlog' {\n  interface RegisteredErrorCatalogs {\n    billing: typeof billingErrors\n    auth:    typeof authErrors\n  }\n}\n","errors\u002Ftypes.ts",[402,4421,4422,4444,4467,4471,4487,4497,4510,4523,4527],{"__ignoreMap":517},[521,4423,4424,4426,4429,4431,4433,4435,4437,4439,4442],{"class":523,"line":524},[521,4425,590],{"class":534},[521,4427,4428],{"class":534}," type",[521,4430,593],{"class":538},[521,4432,3699],{"class":546},[521,4434,599],{"class":538},[521,4436,602],{"class":534},[521,4438,605],{"class":538},[521,4440,4441],{"class":553},".\u002Fbilling",[521,4443,611],{"class":538},[521,4445,4446,4448,4450,4452,4455,4457,4460,4462,4465],{"class":523,"line":531},[521,4447,590],{"class":534},[521,4449,4428],{"class":534},[521,4451,593],{"class":538},[521,4453,4454],{"class":546}," authErrors",[521,4456,599],{"class":538},[521,4458,4459],{"class":534},"    from",[521,4461,605],{"class":538},[521,4463,4464],{"class":553},".\u002Fauth",[521,4466,611],{"class":538},[521,4468,4469],{"class":523,"line":620},[521,4470,617],{"emptyLinePlaceholder":616},[521,4472,4473,4476,4479,4481,4483,4485],{"class":523,"line":632},[521,4474,4475],{"class":758},"declare",[521,4477,4478],{"class":758}," module",[521,4480,605],{"class":538},[521,4482,608],{"class":553},[521,4484,550],{"class":538},[521,4486,801],{"class":538},[521,4488,4489,4492,4495],{"class":523,"line":652},[521,4490,4491],{"class":758},"  interface",[521,4493,4494],{"class":809}," RegisteredErrorCatalogs",[521,4496,801],{"class":538},[521,4498,4499,4502,4504,4507],{"class":523,"line":668},[521,4500,4501],{"class":635},"    billing",[521,4503,639],{"class":538},[521,4505,4506],{"class":538}," typeof",[521,4508,4509],{"class":546}," billingErrors\n",[521,4511,4512,4515,4517,4520],{"class":523,"line":682},[521,4513,4514],{"class":635},"    auth",[521,4516,639],{"class":538},[521,4518,4519],{"class":538},"    typeof",[521,4521,4522],{"class":546}," authErrors\n",[521,4524,4525],{"class":523,"line":699},[521,4526,879],{"class":538},[521,4528,4529],{"class":523,"line":716},[521,4530,884],{"class":538},[511,4532,4535],{"className":513,"code":4533,"filename":4534,"language":516,"meta":517,"style":517},"\u002F\u002F createError autocompletes registered codes (and still accepts ad-hoc strings)\nthrow createError({\n  code: 'billing.PAYMENT_DECLINED', \u002F\u002F ← autocomplete, TS error if typo\n  message: 'Card declined',\n  status: 402,\n})\n\n\u002F\u002F parseError().code is typed as the union of all registered codes\nconst err = parseError(caught)\nif (err.code === 'billing.PAYMENT_DECLINED') retry()\n\u002F\u002F                ↑ autocomplete, refactor-safe\n","Anywhere in your codebase",[402,4536,4537,4542,4552,4570,4584,4594,4600,4604,4609,4623,4652],{"__ignoreMap":517},[521,4538,4539],{"class":523,"line":524},[521,4540,4541],{"class":527},"\u002F\u002F createError autocompletes registered codes (and still accepts ad-hoc strings)\n",[521,4543,4544,4546,4548,4550],{"class":523,"line":531},[521,4545,535],{"class":534},[521,4547,596],{"class":542},[521,4549,547],{"class":546},[521,4551,629],{"class":538},[521,4553,4554,4556,4558,4560,4563,4565,4567],{"class":523,"line":620},[521,4555,636],{"class":635},[521,4557,639],{"class":538},[521,4559,605],{"class":538},[521,4561,4562],{"class":553},"billing.PAYMENT_DECLINED",[521,4564,550],{"class":538},[521,4566,1154],{"class":538},[521,4568,4569],{"class":527}," \u002F\u002F ← autocomplete, TS error if typo\n",[521,4571,4572,4574,4576,4578,4580,4582],{"class":523,"line":632},[521,4573,655],{"class":635},[521,4575,639],{"class":538},[521,4577,605],{"class":538},[521,4579,3510],{"class":553},[521,4581,550],{"class":538},[521,4583,649],{"class":538},[521,4585,4586,4588,4590,4592],{"class":523,"line":652},[521,4587,671],{"class":635},[521,4589,639],{"class":538},[521,4591,677],{"class":676},[521,4593,649],{"class":538},[521,4595,4596,4598],{"class":523,"line":668},[521,4597,736],{"class":538},[521,4599,559],{"class":546},[521,4601,4602],{"class":523,"line":682},[521,4603,617],{"emptyLinePlaceholder":616},[521,4605,4606],{"class":523,"line":699},[521,4607,4608],{"class":527},"\u002F\u002F parseError().code is typed as the union of all registered codes\n",[521,4610,4611,4613,4616,4618,4620],{"class":523,"line":716},[521,4612,2326],{"class":758},[521,4614,4615],{"class":546}," err ",[521,4617,2332],{"class":538},[521,4619,1801],{"class":542},[521,4621,4622],{"class":546},"(caught)\n",[521,4624,4625,4628,4631,4633,4636,4639,4641,4643,4645,4647,4650],{"class":523,"line":733},[521,4626,4627],{"class":534},"if",[521,4629,4630],{"class":546}," (err",[521,4632,574],{"class":538},[521,4634,4635],{"class":546},"code ",[521,4637,4638],{"class":538},"===",[521,4640,605],{"class":538},[521,4642,4562],{"class":553},[521,4644,550],{"class":538},[521,4646,1919],{"class":546},[521,4648,4649],{"class":542},"retry",[521,4651,1946],{"class":546},[521,4653,4654],{"class":523,"line":1165},[521,4655,4656],{"class":527},"\u002F\u002F                ↑ autocomplete, refactor-safe\n",[398,4658,4659],{},"This is purely type-level — no runtime registration, no init step. Skip it entirely if you don't need it; the runtime API is identical either way.",[4661,4662,4665,4668,4669,4672,4673,4676,4677,4680,4681,4684],"callout",{"color":4663,"icon":4664},"neutral","i-lucide-package",[1019,4666,4667],{},"Packaging tip."," A catalog is regular TypeScript. Publish ",[402,4670,4671],{},"@acme\u002Ferrors-billing"," exporting your ",[402,4674,4675],{},"defineErrorCatalog(...)"," plus the ",[402,4678,4679],{},"declare module 'evlog'"," augmentation in its ",[402,4682,4683],{},"index.d.ts",", and the typing flows transitively to every consumer that depends on it. Each shared package owns its prefix, no conflicts possible.",[4661,4686,4689,4692,4693,4696],{"color":4687,"icon":4688,"to":62},"primary","i-lucide-arrow-right",[1019,4690,4691],{},"Going further."," The dedicated ",[494,4694,4695],{"href":62},"Catalogs page"," covers the scaling story (single file → folder → feature → npm package), the full npm packaging recipe, composition patterns, the type-augmentation deep dive, and common pitfalls.",[4661,4698,4699,4700,4703],{"color":4663,"icon":83},"See the ",[494,4701,4702],{"href":217},"Next.js guide"," for a working implementation.",[500,4705,4707],{"id":4706},"next-steps","Next Steps",[415,4709,4710,4715,4720,4725],{},[418,4711,4712,4714],{},[494,4713,51],{"href":52},": Accumulate context and emit comprehensive events",[418,4716,4717,4719],{},[494,4718,290],{"href":295},": Send errors and events to Axiom, Sentry, PostHog, and more",[418,4721,4722,4724],{},[494,4723,202],{"href":207},": Auto-managed request logging per framework",[418,4726,4727,4729],{},[494,4728,20],{"href":21},": See all evlog APIs in action",[4731,4732,4733],"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":517,"searchDepth":531,"depth":531,"links":4735},[4736,4737,4738,4740,4745,4747,4750,4754,4761],{"id":502,"depth":531,"text":503},{"id":887,"depth":531,"text":888},{"id":1009,"depth":531,"text":4739},"Backend-only context (internal)",{"id":1226,"depth":531,"text":1227,"children":4741},[4742,4743,4744],{"id":1231,"depth":620,"text":1232},{"id":1350,"depth":620,"text":1351},{"id":1612,"depth":620,"text":1613},{"id":1772,"depth":531,"text":4746},"Branching on code",{"id":2067,"depth":531,"text":2068,"children":4748},[4749],{"id":2570,"depth":620,"text":2571},{"id":2897,"depth":531,"text":185,"children":4751},[4752,4753],{"id":2900,"depth":620,"text":2901},{"id":3181,"depth":620,"text":3182},{"id":3341,"depth":531,"text":3342,"children":4755},[4756,4757,4758,4760],{"id":3370,"depth":620,"text":3356},{"id":4078,"depth":620,"text":4079},{"id":4250,"depth":620,"text":4759},"defineError — standalone factories",{"id":4395,"depth":620,"text":4396},{"id":4706,"depth":531,"text":4707},"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",[4765,4767],{"label":51,"icon":54,"to":52,"color":4663,"variant":4766},"subtle",{"label":185,"icon":129,"to":186,"color":4663,"variant":4766},{},{"icon":59},{"title":56,"description":4762},"Q_75TUaGXMEZxXzzc6-imOvzbwE6NYo7BATDAdlzMxI",[4773,4775],{"title":51,"path":52,"stem":53,"description":4774,"icon":54,"children":-1},"Accumulate context over any unit of work and emit a single comprehensive event. Works for HTTP requests, scripts, background jobs, queue workers, and workflows.",{"title":61,"path":62,"stem":63,"description":4776,"icon":64,"children":-1},"Scale typed error and audit catalogs from a single file to multi-package monorepos. Conventions, npm packaging recipe, composition patterns, and the type-augmentation deep dive.",1778106399757]