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