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