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