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