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