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