[{"data":1,"prerenderedAt":5237},["ShallowReactive",2],{"navigation_docs":3,"-learn-structured-errors":439,"-learn-structured-errors-surround":5232},[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":5222,"extension":5223,"links":5224,"meta":5228,"navigation":5229,"path":52,"seo":5230,"stem":53,"__hash__":5231},"docs\u002F2.learn\u002F3.structured-errors.md",{"type":442,"value":443,"toc":5191},"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,2109,2112,2116,2185,2210,2216,2224,2227,2471,2494,2503,2507,2512,3006,3010,3013,3333,3336,3340,3617,3621,3777,3781,3806,3811,3822,4448,4462,4533,4537,4547,4684,4705,4711,4717,4850,4854,4871,5114,5117,5142,5154,5161,5165,5187],[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,1963],{},[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})\n",[449,1855,1856,1874,1878,1888,1902,1917,1927,1942,1957],{"__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],{"class":570,"line":763},[568,1960,783],{"class":585},[568,1962,606],{"class":593},[558,1964,1969],{"className":1965,"code":1966,"filename":1967,"language":1968,"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  ├─ user: id=1 plan=pro\n  └─ cart: items=3 total=9999\n","Terminal (pretty dev)","bash",[449,1970,1971,1979,1993,2004,2027,2046,2073,2089],{"__ignoreMap":564},[568,1972,1973,1976],{"class":570,"line":571},[568,1974,1975],{"class":856},"ERROR",[568,1977,1978],{"class":593}," [checkout] POST \u002Fapi\u002Fcheckout 402 in 123ms\n",[568,1980,1981,1984,1987,1990],{"class":570,"line":578},[568,1982,1983],{"class":856},"  ├─",[568,1985,1986],{"class":600}," error:",[568,1988,1989],{"class":600}," Card",[568,1991,1992],{"class":600}," declined\n",[568,1994,1995,1998,2001],{"class":570,"line":667},[568,1996,1997],{"class":856},"  │",[568,1999,2000],{"class":600},"     at",[568,2002,2003],{"class":600}," server\u002Fapi\u002Fcheckout.post.ts:42\n",[568,2005,2006,2008,2011,2014,2017,2020,2022,2024],{"class":570,"line":679},[568,2007,1997],{"class":856},[568,2009,2010],{"class":600},"   ❯",[568,2012,2013],{"class":723}," 42",[568,2015,2016],{"class":600}," ┃",[568,2018,2019],{"class":600}," throw",[568,2021,643],{"class":600},[568,2023,594],{"class":585},[568,2025,2026],{"class":593},"{ code: 'PAYMENT_DECLINED', ... })\n",[568,2028,2029,2031,2034,2037,2040,2043],{"class":570,"line":699},[568,2030,1997],{"class":856},[568,2032,2033],{"class":600},"     Why:",[568,2035,2036],{"class":600}," Issuer",[568,2038,2039],{"class":600}," declined",[568,2041,2042],{"class":600}," the",[568,2044,2045],{"class":600}," charge\n",[568,2047,2048,2050,2053,2056,2058,2061,2064,2067,2070],{"class":570,"line":715},[568,2049,1997],{"class":856},[568,2051,2052],{"class":600},"     Fix:",[568,2054,2055],{"class":600}," Ask",[568,2057,2042],{"class":600},[568,2059,2060],{"class":600}," customer",[568,2062,2063],{"class":600}," to",[568,2065,2066],{"class":600}," use",[568,2068,2069],{"class":600}," another",[568,2071,2072],{"class":600}," card\n",[568,2074,2075,2077,2080,2083,2086],{"class":570,"line":729},[568,2076,1983],{"class":856},[568,2078,2079],{"class":600}," user:",[568,2081,2082],{"class":600}," id=",[568,2084,2085],{"class":723},"1",[568,2087,2088],{"class":600}," plan=pro\n",[568,2090,2091,2094,2097,2100,2103,2106],{"class":570,"line":746},[568,2092,2093],{"class":856},"  └─",[568,2095,2096],{"class":600}," cart:",[568,2098,2099],{"class":600}," items=",[568,2101,2102],{"class":723},"3",[568,2104,2105],{"class":600}," total=",[568,2107,2108],{"class":723},"9999\n",[445,2110,2111],{},"Colors and tree connectors render in the terminal; the example above omits ANSI for readability.",[1276,2113,2115],{"id":2114},"choosing-evlog-vs-nitro-console-output","Choosing evlog vs Nitro console output",[937,2117,2118,2128],{},[940,2119,2120],{},[943,2121,2122,2125],{},[946,2123,2124],{},"Goal",[946,2126,2127],{},"Config",[956,2129,2130,2148,2158,2172],{},[943,2131,2132,2139],{},[961,2133,2134,2135,2138],{},"One clean signal — wide event only, no Nitro ",[449,2136,2137],{},"[request error]"," overlay",[961,2140,2141,2144,2145,2147],{},[449,2142,2143],{},"dev: 'evlog'"," (default when ",[449,2146,1826],{}," in dev)",[943,2149,2150,2153],{},[961,2151,2152],{},"Wide event context + Nitro's native Youch stack (evlog prints Why\u002FFix only)",[961,2154,2155],{},[449,2156,2157],{},"dev: 'nitro'",[943,2159,2160,2167],{},[961,2161,2162,2163,2166],{},"Full evlog block ",[1066,2164,2165],{},"and"," Nitro overlay (debug)",[961,2168,2169],{},[449,2170,2171],{},"dev: 'both'",[943,2173,2174,2177],{},[961,2175,2176],{},"No pretty tree (JSON logs) but still suppress Nitro overlay",[961,2178,2179,481,2182],{},[449,2180,2181],{},"pretty: false",[449,2183,2184],{},"dev: { frameworkOverlay: false }",[445,2186,2187,2188,2191,2192,481,2195,481,2198,481,2201,2204,2205,533,2207,621],{},"Fine-grained control lives under ",[449,2189,2190],{},"dev.prettyError"," (",[449,2193,2194],{},"snippet",[449,2196,2197],{},"stackDepth",[449,2199,2200],{},"compact",[449,2202,2203],{},"detail: 'full' | 'guidance'","). See ",[541,2206,414],{"href":415},[541,2208,2209],{"href":168},"Nuxt integration",[547,2211,2213,2214],{"id":2212},"branching-on-code","Branching on ",[449,2215,449],{},[445,2217,2218,2220,2221,2223],{},[449,2219,449],{}," is a stable, machine-readable identifier you control. Pair it with ",[449,2222,1072],{}," so the client can branch on logic without parsing user-facing messages or coupling to HTTP status codes.",[2225,2226],"structured-error-branching",{},[558,2228,2231],{"className":560,"code":2229,"filename":2230,"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,2232,2233,2252,2256,2262,2308,2318,2338,2342,2360,2374,2385,2398,2407,2415,2461,2466],{"__ignoreMap":564},[568,2234,2235,2237,2239,2242,2244,2246,2248,2250],{"class":570,"line":571},[568,2236,637],{"class":581},[568,2238,640],{"class":585},[568,2240,2241],{"class":593}," parseError",[568,2243,646],{"class":585},[568,2245,649],{"class":581},[568,2247,652],{"class":585},[568,2249,655],{"class":600},[568,2251,658],{"class":585},[568,2253,2254],{"class":570,"line":578},[568,2255,664],{"emptyLinePlaceholder":663},[568,2257,2258,2260],{"class":570,"line":667},[568,2259,1695],{"class":581},[568,2261,848],{"class":585},[568,2263,2264,2266,2269,2271,2273,2276,2278,2280,2282,2285,2287,2289,2292,2294,2296,2299,2301,2304,2306],{"class":570,"line":679},[568,2265,1702],{"class":581},[568,2267,2268],{"class":589}," $fetch",[568,2270,594],{"class":682},[568,2272,597],{"class":585},[568,2274,2275],{"class":600},"\u002Fapi\u002Fcheckout",[568,2277,597],{"class":585},[568,2279,1201],{"class":585},[568,2281,640],{"class":585},[568,2283,2284],{"class":682}," method",[568,2286,686],{"class":585},[568,2288,652],{"class":585},[568,2290,2291],{"class":600},"POST",[568,2293,597],{"class":585},[568,2295,1201],{"class":585},[568,2297,2298],{"class":682}," body",[568,2300,686],{"class":585},[568,2302,2303],{"class":593}," cart",[568,2305,646],{"class":585},[568,2307,606],{"class":682},[568,2309,2310,2312,2314,2316],{"class":570,"line":699},[568,2311,783],{"class":585},[568,2313,1729],{"class":581},[568,2315,1732],{"class":593},[568,2317,676],{"class":585},[568,2319,2320,2323,2326,2329,2331,2333,2336],{"class":570,"line":715},[568,2321,2322],{"class":805},"  const",[568,2324,2325],{"class":593}," error",[568,2327,2328],{"class":585}," =",[568,2330,2241],{"class":589},[568,2332,594],{"class":682},[568,2334,2335],{"class":593},"err",[568,2337,606],{"class":682},[568,2339,2340],{"class":570,"line":729},[568,2341,664],{"emptyLinePlaceholder":663},[568,2343,2344,2347,2349,2351,2353,2355,2358],{"class":570,"line":746},[568,2345,2346],{"class":581},"  switch",[568,2348,2191],{"class":682},[568,2350,1832],{"class":593},[568,2352,621],{"class":585},[568,2354,449],{"class":593},[568,2356,2357],{"class":682},") ",[568,2359,676],{"class":585},[568,2361,2362,2365,2367,2369,2371],{"class":570,"line":763},[568,2363,2364],{"class":581},"    case",[568,2366,652],{"class":585},[568,2368,691],{"class":600},[568,2370,597],{"class":585},[568,2372,2373],{"class":585},":\n",[568,2375,2376,2379,2382],{"class":570,"line":780},[568,2377,2378],{"class":581},"      return",[568,2380,2381],{"class":589}," showRetryWithDifferentCard",[568,2383,2384],{"class":682},"()\n",[568,2386,2387,2389,2391,2394,2396],{"class":570,"line":1212},[568,2388,2364],{"class":581},[568,2390,652],{"class":585},[568,2392,2393],{"class":600},"CART_EXPIRED",[568,2395,597],{"class":585},[568,2397,2373],{"class":585},[568,2399,2400,2402,2405],{"class":570,"line":1814},[568,2401,2378],{"class":581},[568,2403,2404],{"class":589}," rebuildCart",[568,2406,2384],{"class":682},[568,2408,2410,2413],{"class":570,"line":2409},13,[568,2411,2412],{"class":581},"    default",[568,2414,2373],{"class":585},[568,2416,2418,2420,2423,2425,2428,2430,2433,2436,2438,2440,2442,2444,2446,2449,2451,2453,2455,2457,2459],{"class":570,"line":2417},14,[568,2419,2378],{"class":581},[568,2421,2422],{"class":593}," toast",[568,2424,621],{"class":585},[568,2426,2427],{"class":589},"add",[568,2429,594],{"class":682},[568,2431,2432],{"class":585},"{",[568,2434,2435],{"class":682}," title",[568,2437,686],{"class":585},[568,2439,2325],{"class":593},[568,2441,621],{"class":585},[568,2443,490],{"class":593},[568,2445,1201],{"class":585},[568,2447,2448],{"class":682}," color",[568,2450,686],{"class":585},[568,2452,652],{"class":585},[568,2454,1832],{"class":600},[568,2456,597],{"class":585},[568,2458,646],{"class":585},[568,2460,606],{"class":682},[568,2462,2464],{"class":570,"line":2463},15,[568,2465,926],{"class":585},[568,2467,2469],{"class":570,"line":2468},16,[568,2470,931],{"class":585},[445,2472,2473,2475,2476,2478,2479,481,2482,2485,2486,2489,2490,2493],{},[449,2474,1072],{}," also surfaces ",[449,2477,449],{}," from Node-style errors (e.g. ",[449,2480,2481],{},"'ENOENT'",[449,2483,2484],{},"'ECONNRESET'",") and any ",[449,2487,2488],{},"Error"," instance with a string ",[449,2491,2492],{},".code"," property, so existing system errors flow through the same branch.",[445,2495,2496,2498,2499,2502],{},[449,2497,449],{}," is also copied onto wide events under ",[449,2500,2501],{},"error.code",", so dashboards and drains can group, alert, and chart by code without parsing free-text messages.",[547,2504,2506],{"id":2505},"frontend-error-handling","Frontend Error Handling",[445,2508,474,2509,2511],{},[449,2510,1072],{}," to extract all fields from caught errors:",[626,2513,2514,2732],{},[558,2515,2517],{"className":560,"code":2516,"filename":2230,"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,2518,2519,2537,2541,2547,2587,2597,2613,2617,2641,2663,2685,2707,2728],{"__ignoreMap":564},[568,2520,2521,2523,2525,2527,2529,2531,2533,2535],{"class":570,"line":571},[568,2522,637],{"class":581},[568,2524,640],{"class":585},[568,2526,2241],{"class":593},[568,2528,646],{"class":585},[568,2530,649],{"class":581},[568,2532,652],{"class":585},[568,2534,655],{"class":600},[568,2536,658],{"class":585},[568,2538,2539],{"class":570,"line":578},[568,2540,664],{"emptyLinePlaceholder":663},[568,2542,2543,2545],{"class":570,"line":667},[568,2544,1695],{"class":581},[568,2546,848],{"class":585},[568,2548,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585],{"class":570,"line":679},[568,2550,1702],{"class":581},[568,2552,2268],{"class":589},[568,2554,594],{"class":682},[568,2556,597],{"class":585},[568,2558,2275],{"class":600},[568,2560,597],{"class":585},[568,2562,1201],{"class":585},[568,2564,640],{"class":585},[568,2566,2284],{"class":682},[568,2568,686],{"class":585},[568,2570,652],{"class":585},[568,2572,2291],{"class":600},[568,2574,597],{"class":585},[568,2576,1201],{"class":585},[568,2578,2298],{"class":682},[568,2580,686],{"class":585},[568,2582,2303],{"class":593},[568,2584,646],{"class":585},[568,2586,606],{"class":682},[568,2588,2589,2591,2593,2595],{"class":570,"line":699},[568,2590,783],{"class":585},[568,2592,1729],{"class":581},[568,2594,1732],{"class":593},[568,2596,676],{"class":585},[568,2598,2599,2601,2603,2605,2607,2609,2611],{"class":570,"line":715},[568,2600,2322],{"class":805},[568,2602,2325],{"class":593},[568,2604,2328],{"class":585},[568,2606,2241],{"class":589},[568,2608,594],{"class":682},[568,2610,2335],{"class":593},[568,2612,606],{"class":682},[568,2614,2615],{"class":570,"line":729},[568,2616,664],{"emptyLinePlaceholder":663},[568,2618,2619,2622,2624,2627,2629,2631,2633,2635,2638],{"class":570,"line":746},[568,2620,2621],{"class":593},"  console",[568,2623,621],{"class":585},[568,2625,2626],{"class":589},"log",[568,2628,594],{"class":682},[568,2630,1832],{"class":593},[568,2632,621],{"class":585},[568,2634,490],{"class":593},[568,2636,2637],{"class":682},")  ",[568,2639,2640],{"class":574},"\u002F\u002F \"Payment failed\"\n",[568,2642,2643,2645,2647,2649,2651,2653,2655,2657,2660],{"class":570,"line":763},[568,2644,2621],{"class":593},[568,2646,621],{"class":585},[568,2648,2626],{"class":589},[568,2650,594],{"class":682},[568,2652,1832],{"class":593},[568,2654,621],{"class":585},[568,2656,509],{"class":593},[568,2658,2659],{"class":682},")   ",[568,2661,2662],{"class":574},"\u002F\u002F 402\n",[568,2664,2665,2667,2669,2671,2673,2675,2677,2679,2682],{"class":570,"line":780},[568,2666,2621],{"class":593},[568,2668,621],{"class":585},[568,2670,2626],{"class":589},[568,2672,594],{"class":682},[568,2674,1832],{"class":593},[568,2676,621],{"class":585},[568,2678,449],{"class":593},[568,2680,2681],{"class":682},")     ",[568,2683,2684],{"class":574},"\u002F\u002F \"PAYMENT_DECLINED\"\n",[568,2686,2687,2689,2691,2693,2695,2697,2699,2701,2704],{"class":570,"line":1212},[568,2688,2621],{"class":593},[568,2690,621],{"class":585},[568,2692,2626],{"class":589},[568,2694,594],{"class":682},[568,2696,1832],{"class":593},[568,2698,621],{"class":585},[568,2700,494],{"class":593},[568,2702,2703],{"class":682},")      ",[568,2705,2706],{"class":574},"\u002F\u002F \"Card declined\"\n",[568,2708,2709,2711,2713,2715,2717,2719,2721,2723,2725],{"class":570,"line":1814},[568,2710,2621],{"class":593},[568,2712,621],{"class":585},[568,2714,2626],{"class":589},[568,2716,594],{"class":682},[568,2718,1832],{"class":593},[568,2720,621],{"class":585},[568,2722,498],{"class":593},[568,2724,2703],{"class":682},[568,2726,2727],{"class":574},"\u002F\u002F \"Try another card\"\n",[568,2729,2730],{"class":570,"line":2409},[568,2731,931],{"class":585},[558,2733,2736],{"className":560,"code":2734,"filename":2735,"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,2737,2738,2756,2760,2776,2780,2786,2826,2836,2852,2856,2869,2884,2899,2914,2928,2986,2994,3001],{"__ignoreMap":564},[568,2739,2740,2742,2744,2746,2748,2750,2752,2754],{"class":570,"line":571},[568,2741,637],{"class":581},[568,2743,640],{"class":585},[568,2745,2241],{"class":593},[568,2747,646],{"class":585},[568,2749,649],{"class":581},[568,2751,652],{"class":585},[568,2753,655],{"class":600},[568,2755,658],{"class":585},[568,2757,2758],{"class":570,"line":578},[568,2759,664],{"emptyLinePlaceholder":663},[568,2761,2762,2765,2768,2771,2774],{"class":570,"line":667},[568,2763,2764],{"class":805},"const",[568,2766,2767],{"class":593}," toast ",[568,2769,2770],{"class":585},"=",[568,2772,2773],{"class":589}," useToast",[568,2775,2384],{"class":593},[568,2777,2778],{"class":570,"line":679},[568,2779,664],{"emptyLinePlaceholder":663},[568,2781,2782,2784],{"class":570,"line":699},[568,2783,1695],{"class":581},[568,2785,848],{"class":585},[568,2787,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824],{"class":570,"line":715},[568,2789,1702],{"class":581},[568,2791,2268],{"class":589},[568,2793,594],{"class":682},[568,2795,597],{"class":585},[568,2797,2275],{"class":600},[568,2799,597],{"class":585},[568,2801,1201],{"class":585},[568,2803,640],{"class":585},[568,2805,2284],{"class":682},[568,2807,686],{"class":585},[568,2809,652],{"class":585},[568,2811,2291],{"class":600},[568,2813,597],{"class":585},[568,2815,1201],{"class":585},[568,2817,2298],{"class":682},[568,2819,686],{"class":585},[568,2821,2303],{"class":593},[568,2823,646],{"class":585},[568,2825,606],{"class":682},[568,2827,2828,2830,2832,2834],{"class":570,"line":729},[568,2829,783],{"class":585},[568,2831,1729],{"class":581},[568,2833,1732],{"class":593},[568,2835,676],{"class":585},[568,2837,2838,2840,2842,2844,2846,2848,2850],{"class":570,"line":746},[568,2839,2322],{"class":805},[568,2841,2325],{"class":593},[568,2843,2328],{"class":585},[568,2845,2241],{"class":589},[568,2847,594],{"class":682},[568,2849,2335],{"class":593},[568,2851,606],{"class":682},[568,2853,2854],{"class":570,"line":763},[568,2855,664],{"emptyLinePlaceholder":663},[568,2857,2858,2861,2863,2865,2867],{"class":570,"line":780},[568,2859,2860],{"class":593},"  toast",[568,2862,621],{"class":585},[568,2864,2427],{"class":589},[568,2866,594],{"class":682},[568,2868,676],{"class":585},[568,2870,2871,2874,2876,2878,2880,2882],{"class":570,"line":1212},[568,2872,2873],{"class":682},"    title",[568,2875,686],{"class":585},[568,2877,2325],{"class":593},[568,2879,621],{"class":585},[568,2881,490],{"class":593},[568,2883,696],{"class":585},[568,2885,2886,2889,2891,2893,2895,2897],{"class":570,"line":1814},[568,2887,2888],{"class":682},"    description",[568,2890,686],{"class":585},[568,2892,2325],{"class":593},[568,2894,621],{"class":585},[568,2896,494],{"class":593},[568,2898,696],{"class":585},[568,2900,2901,2904,2906,2908,2910,2912],{"class":570,"line":2409},[568,2902,2903],{"class":682},"    color",[568,2905,686],{"class":585},[568,2907,652],{"class":585},[568,2909,1832],{"class":600},[568,2911,597],{"class":585},[568,2913,696],{"class":585},[568,2915,2916,2919,2921,2923,2925],{"class":570,"line":2417},[568,2917,2918],{"class":682},"    actions",[568,2920,686],{"class":585},[568,2922,2325],{"class":593},[568,2924,621],{"class":585},[568,2926,2927],{"class":593},"link\n",[568,2929,2930,2933,2936,2938,2941,2943,2945,2948,2950,2952,2955,2957,2960,2963,2966,2968,2971,2973,2975,2977,2979,2981,2983],{"class":570,"line":2463},[568,2931,2932],{"class":585},"      ?",[568,2934,2935],{"class":682}," [",[568,2937,2432],{"class":585},[568,2939,2940],{"class":682}," label",[568,2942,686],{"class":585},[568,2944,652],{"class":585},[568,2946,2947],{"class":600},"Learn more",[568,2949,597],{"class":585},[568,2951,1201],{"class":585},[568,2953,2954],{"class":589}," onClick",[568,2956,686],{"class":585},[568,2958,2959],{"class":585}," ()",[568,2961,2962],{"class":805}," =>",[568,2964,2965],{"class":593}," window",[568,2967,621],{"class":585},[568,2969,2970],{"class":589},"open",[568,2972,594],{"class":682},[568,2974,1832],{"class":593},[568,2976,621],{"class":585},[568,2978,502],{"class":593},[568,2980,2357],{"class":682},[568,2982,783],{"class":585},[568,2984,2985],{"class":682},"]\n",[568,2987,2988,2991],{"class":570,"line":2468},[568,2989,2990],{"class":585},"      :",[568,2992,2993],{"class":585}," undefined,\n",[568,2995,2997,2999],{"class":570,"line":2996},17,[568,2998,1809],{"class":585},[568,3000,606],{"class":682},[568,3002,3004],{"class":570,"line":3003},18,[568,3005,931],{"class":585},[1276,3007,3009],{"id":3008},"error-display-component","Error Display Component",[445,3011,3012],{},"Create a reusable error display:",[558,3014,3019],{"className":3015,"code":3016,"filename":3017,"language":3018,"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,3020,3021,3047,3065,3069,3088,3098,3105,3109,3133,3142,3146,3155,3163,3177,3191,3203,3217,3222,3253,3273,3303,3313,3324],{"__ignoreMap":564},[568,3022,3023,3026,3029,3032,3035,3037,3039,3042,3044],{"class":570,"line":571},[568,3024,3025],{"class":585},"\u003C",[568,3027,3028],{"class":682},"script",[568,3030,3031],{"class":805}," setup",[568,3033,3034],{"class":805}," lang",[568,3036,2770],{"class":585},[568,3038,809],{"class":585},[568,3040,3041],{"class":600},"ts",[568,3043,809],{"class":585},[568,3045,3046],{"class":585},">\n",[568,3048,3049,3051,3053,3055,3057,3059,3061,3063],{"class":570,"line":578},[568,3050,637],{"class":581},[568,3052,640],{"class":585},[568,3054,2241],{"class":593},[568,3056,646],{"class":585},[568,3058,649],{"class":581},[568,3060,652],{"class":585},[568,3062,655],{"class":600},[568,3064,658],{"class":585},[568,3066,3067],{"class":570,"line":667},[568,3068,664],{"emptyLinePlaceholder":663},[568,3070,3071,3073,3075,3078,3080,3082,3085],{"class":570,"line":679},[568,3072,2764],{"class":805},[568,3074,640],{"class":585},[568,3076,3077],{"class":593}," error ",[568,3079,783],{"class":585},[568,3081,2328],{"class":585},[568,3083,3084],{"class":589}," defineProps",[568,3086,3087],{"class":585},"\u003C{\n",[568,3089,3090,3093,3095],{"class":570,"line":699},[568,3091,3092],{"class":682},"  error",[568,3094,686],{"class":585},[568,3096,3097],{"class":856}," unknown\n",[568,3099,3100,3103],{"class":570,"line":715},[568,3101,3102],{"class":585},"}>",[568,3104,2384],{"class":593},[568,3106,3107],{"class":570,"line":729},[568,3108,664],{"emptyLinePlaceholder":663},[568,3110,3111,3113,3116,3118,3121,3123,3126,3128,3130],{"class":570,"line":746},[568,3112,2764],{"class":805},[568,3114,3115],{"class":593}," parsed ",[568,3117,2770],{"class":585},[568,3119,3120],{"class":589}," computed",[568,3122,594],{"class":593},[568,3124,3125],{"class":585},"()",[568,3127,2962],{"class":805},[568,3129,2241],{"class":589},[568,3131,3132],{"class":593},"(error))\n",[568,3134,3135,3138,3140],{"class":570,"line":763},[568,3136,3137],{"class":585},"\u003C\u002F",[568,3139,3028],{"class":682},[568,3141,3046],{"class":585},[568,3143,3144],{"class":570,"line":780},[568,3145,664],{"emptyLinePlaceholder":663},[568,3147,3148,3150,3153],{"class":570,"line":1212},[568,3149,3025],{"class":585},[568,3151,3152],{"class":682},"template",[568,3154,3046],{"class":585},[568,3156,3157,3160],{"class":570,"line":1814},[568,3158,3159],{"class":585},"  \u003C",[568,3161,3162],{"class":682},"UAlert\n",[568,3164,3165,3168,3170,3172,3175],{"class":570,"line":2409},[568,3166,3167],{"class":805},"    :title",[568,3169,2770],{"class":585},[568,3171,809],{"class":585},[568,3173,3174],{"class":600},"parsed.message",[568,3176,921],{"class":585},[568,3178,3179,3182,3184,3186,3189],{"class":570,"line":2417},[568,3180,3181],{"class":805},"    :description",[568,3183,2770],{"class":585},[568,3185,809],{"class":585},[568,3187,3188],{"class":600},"parsed.why",[568,3190,921],{"class":585},[568,3192,3193,3195,3197,3199,3201],{"class":570,"line":2463},[568,3194,2903],{"class":805},[568,3196,2770],{"class":585},[568,3198,809],{"class":585},[568,3200,1832],{"class":600},[568,3202,921],{"class":585},[568,3204,3205,3208,3210,3212,3215],{"class":570,"line":2468},[568,3206,3207],{"class":805},"    icon",[568,3209,2770],{"class":585},[568,3211,809],{"class":585},[568,3213,3214],{"class":600},"i-lucide-alert-circle",[568,3216,921],{"class":585},[568,3218,3219],{"class":570,"line":2996},[568,3220,3221],{"class":585},"  >\n",[568,3223,3224,3227,3229,3232,3234,3236,3239,3241,3243,3245,3248,3251],{"class":570,"line":3003},[568,3225,3226],{"class":585},"    \u003C",[568,3228,3152],{"class":682},[568,3230,3231],{"class":581}," v-if",[568,3233,2770],{"class":585},[568,3235,809],{"class":585},[568,3237,3238],{"class":593},"parsed",[568,3240,621],{"class":585},[568,3242,498],{"class":593},[568,3244,809],{"class":585},[568,3246,3247],{"class":585}," #",[568,3249,3250],{"class":805},"description",[568,3252,3046],{"class":585},[568,3254,3256,3259,3261,3264,3267,3269,3271],{"class":570,"line":3255},19,[568,3257,3258],{"class":585},"      \u003C",[568,3260,445],{"class":682},[568,3262,3263],{"class":585},">",[568,3265,3266],{"class":593},"{{ parsed.why }}",[568,3268,3137],{"class":585},[568,3270,445],{"class":682},[568,3272,3046],{"class":585},[568,3274,3276,3278,3280,3283,3285,3287,3290,3292,3294,3297,3299,3301],{"class":570,"line":3275},20,[568,3277,3258],{"class":585},[568,3279,445],{"class":682},[568,3281,3282],{"class":805}," class",[568,3284,2770],{"class":585},[568,3286,809],{"class":585},[568,3288,3289],{"class":600},"mt-2 font-medium",[568,3291,809],{"class":585},[568,3293,3263],{"class":585},[568,3295,3296],{"class":593},"{{ parsed.fix }}",[568,3298,3137],{"class":585},[568,3300,445],{"class":682},[568,3302,3046],{"class":585},[568,3304,3306,3309,3311],{"class":570,"line":3305},21,[568,3307,3308],{"class":585},"    \u003C\u002F",[568,3310,3152],{"class":682},[568,3312,3046],{"class":585},[568,3314,3316,3319,3322],{"class":570,"line":3315},22,[568,3317,3318],{"class":585},"  \u003C\u002F",[568,3320,3321],{"class":682},"UAlert",[568,3323,3046],{"class":585},[568,3325,3327,3329,3331],{"class":570,"line":3326},23,[568,3328,3137],{"class":585},[568,3330,3152],{"class":682},[568,3332,3046],{"class":585},[547,3334,427],{"id":3335},"best-practices",[1276,3337,3339],{"id":3338},"use-appropriate-status-codes","Use Appropriate Status Codes",[626,3341,3342,3410,3493,3545],{},[558,3343,3346],{"className":560,"code":3344,"filename":3345,"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,3347,3348,3353,3363,3378,3389,3404],{"__ignoreMap":564},[568,3349,3350],{"class":570,"line":571},[568,3351,3352],{"class":574},"\u002F\u002F Client error - user can fix\n",[568,3354,3355,3357,3359,3361],{"class":570,"line":578},[568,3356,582],{"class":581},[568,3358,643],{"class":589},[568,3360,594],{"class":593},[568,3362,676],{"class":585},[568,3364,3365,3367,3369,3371,3374,3376],{"class":570,"line":667},[568,3366,702],{"class":682},[568,3368,686],{"class":585},[568,3370,652],{"class":585},[568,3372,3373],{"class":600},"Invalid email format",[568,3375,597],{"class":585},[568,3377,696],{"class":585},[568,3379,3380,3382,3384,3387],{"class":570,"line":679},[568,3381,718],{"class":682},[568,3383,686],{"class":585},[568,3385,3386],{"class":723}," 400",[568,3388,696],{"class":585},[568,3390,3391,3393,3395,3397,3400,3402],{"class":570,"line":699},[568,3392,749],{"class":682},[568,3394,686],{"class":585},[568,3396,652],{"class":585},[568,3398,3399],{"class":600},"Please enter a valid email address",[568,3401,597],{"class":585},[568,3403,696],{"class":585},[568,3405,3406,3408],{"class":570,"line":715},[568,3407,783],{"class":585},[568,3409,606],{"class":593},[558,3411,3414],{"className":560,"code":3412,"filename":3413,"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,3415,3416,3421,3431,3446,3457,3472,3487],{"__ignoreMap":564},[568,3417,3418],{"class":570,"line":571},[568,3419,3420],{"class":574},"\u002F\u002F Authentication required\n",[568,3422,3423,3425,3427,3429],{"class":570,"line":578},[568,3424,582],{"class":581},[568,3426,643],{"class":589},[568,3428,594],{"class":593},[568,3430,676],{"class":585},[568,3432,3433,3435,3437,3439,3442,3444],{"class":570,"line":667},[568,3434,702],{"class":682},[568,3436,686],{"class":585},[568,3438,652],{"class":585},[568,3440,3441],{"class":600},"Please log in to continue",[568,3443,597],{"class":585},[568,3445,696],{"class":585},[568,3447,3448,3450,3452,3455],{"class":570,"line":679},[568,3449,718],{"class":682},[568,3451,686],{"class":585},[568,3453,3454],{"class":723}," 401",[568,3456,696],{"class":585},[568,3458,3459,3461,3463,3465,3468,3470],{"class":570,"line":699},[568,3460,749],{"class":682},[568,3462,686],{"class":585},[568,3464,652],{"class":585},[568,3466,3467],{"class":600},"Sign in to your account",[568,3469,597],{"class":585},[568,3471,696],{"class":585},[568,3473,3474,3476,3478,3480,3483,3485],{"class":570,"line":715},[568,3475,766],{"class":682},[568,3477,686],{"class":585},[568,3479,652],{"class":585},[568,3481,3482],{"class":600},"\u002Flogin",[568,3484,597],{"class":585},[568,3486,696],{"class":585},[568,3488,3489,3491],{"class":570,"line":729},[568,3490,783],{"class":585},[568,3492,606],{"class":593},[558,3494,3497],{"className":560,"code":3495,"filename":3496,"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,3498,3499,3504,3514,3529,3539],{"__ignoreMap":564},[568,3500,3501],{"class":570,"line":571},[568,3502,3503],{"class":574},"\u002F\u002F Resource not found\n",[568,3505,3506,3508,3510,3512],{"class":570,"line":578},[568,3507,582],{"class":581},[568,3509,643],{"class":589},[568,3511,594],{"class":593},[568,3513,676],{"class":585},[568,3515,3516,3518,3520,3522,3525,3527],{"class":570,"line":667},[568,3517,702],{"class":682},[568,3519,686],{"class":585},[568,3521,652],{"class":585},[568,3523,3524],{"class":600},"Order not found",[568,3526,597],{"class":585},[568,3528,696],{"class":585},[568,3530,3531,3533,3535,3537],{"class":570,"line":679},[568,3532,718],{"class":682},[568,3534,686],{"class":585},[568,3536,1343],{"class":723},[568,3538,696],{"class":585},[568,3540,3541,3543],{"class":570,"line":699},[568,3542,783],{"class":585},[568,3544,606],{"class":593},[558,3546,3549],{"className":560,"code":3547,"filename":3548,"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,3550,3551,3556,3566,3581,3591,3606,3611],{"__ignoreMap":564},[568,3552,3553],{"class":570,"line":571},[568,3554,3555],{"class":574},"\u002F\u002F Server error - not user's fault\n",[568,3557,3558,3560,3562,3564],{"class":570,"line":578},[568,3559,582],{"class":581},[568,3561,643],{"class":589},[568,3563,594],{"class":593},[568,3565,676],{"class":585},[568,3567,3568,3570,3572,3574,3577,3579],{"class":570,"line":667},[568,3569,702],{"class":682},[568,3571,686],{"class":585},[568,3573,652],{"class":585},[568,3575,3576],{"class":600},"Something went wrong",[568,3578,597],{"class":585},[568,3580,696],{"class":585},[568,3582,3583,3585,3587,3589],{"class":570,"line":679},[568,3584,718],{"class":682},[568,3586,686],{"class":585},[568,3588,1771],{"class":723},[568,3590,696],{"class":585},[568,3592,3593,3595,3597,3599,3602,3604],{"class":570,"line":699},[568,3594,732],{"class":682},[568,3596,686],{"class":585},[568,3598,652],{"class":585},[568,3600,3601],{"class":600},"Database connection timeout",[568,3603,597],{"class":585},[568,3605,696],{"class":585},[568,3607,3608],{"class":570,"line":715},[568,3609,3610],{"class":574},"  \u002F\u002F No 'fix' - user can't fix server errors\n",[568,3612,3613,3615],{"class":570,"line":729},[568,3614,783],{"class":585},[568,3616,606],{"class":593},[1276,3618,3620],{"id":3619},"provide-actionable-fixes","Provide Actionable Fixes",[626,3622,3623,3680],{},[558,3624,3627],{"className":560,"code":3625,"filename":3626,"language":563,"meta":564,"style":564},"\u002F\u002F Unhelpful fix\nthrow createError({\n  message: 'Upload failed',\n  fix: 'Try again',\n})\n","Bad",[449,3628,3629,3634,3644,3659,3674],{"__ignoreMap":564},[568,3630,3631],{"class":570,"line":571},[568,3632,3633],{"class":574},"\u002F\u002F Unhelpful fix\n",[568,3635,3636,3638,3640,3642],{"class":570,"line":578},[568,3637,582],{"class":581},[568,3639,643],{"class":589},[568,3641,594],{"class":593},[568,3643,676],{"class":585},[568,3645,3646,3648,3650,3652,3655,3657],{"class":570,"line":667},[568,3647,702],{"class":682},[568,3649,686],{"class":585},[568,3651,652],{"class":585},[568,3653,3654],{"class":600},"Upload failed",[568,3656,597],{"class":585},[568,3658,696],{"class":585},[568,3660,3661,3663,3665,3667,3670,3672],{"class":570,"line":679},[568,3662,749],{"class":682},[568,3664,686],{"class":585},[568,3666,652],{"class":585},[568,3668,3669],{"class":600},"Try again",[568,3671,597],{"class":585},[568,3673,696],{"class":585},[568,3675,3676,3678],{"class":570,"line":699},[568,3677,783],{"class":585},[568,3679,606],{"class":593},[558,3681,3684],{"className":560,"code":3682,"filename":3683,"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,3685,3686,3691,3701,3715,3726,3741,3756,3771],{"__ignoreMap":564},[568,3687,3688],{"class":570,"line":571},[568,3689,3690],{"class":574},"\u002F\u002F Actionable fix\n",[568,3692,3693,3695,3697,3699],{"class":570,"line":578},[568,3694,582],{"class":581},[568,3696,643],{"class":589},[568,3698,594],{"class":593},[568,3700,676],{"class":585},[568,3702,3703,3705,3707,3709,3711,3713],{"class":570,"line":667},[568,3704,702],{"class":682},[568,3706,686],{"class":585},[568,3708,652],{"class":585},[568,3710,3654],{"class":600},[568,3712,597],{"class":585},[568,3714,696],{"class":585},[568,3716,3717,3719,3721,3724],{"class":570,"line":679},[568,3718,718],{"class":682},[568,3720,686],{"class":585},[568,3722,3723],{"class":723}," 413",[568,3725,696],{"class":585},[568,3727,3728,3730,3732,3734,3737,3739],{"class":570,"line":699},[568,3729,732],{"class":682},[568,3731,686],{"class":585},[568,3733,652],{"class":585},[568,3735,3736],{"class":600},"File exceeds maximum size (10MB)",[568,3738,597],{"class":585},[568,3740,696],{"class":585},[568,3742,3743,3745,3747,3749,3752,3754],{"class":570,"line":715},[568,3744,749],{"class":682},[568,3746,686],{"class":585},[568,3748,652],{"class":585},[568,3750,3751],{"class":600},"Reduce the file size or compress the image before uploading",[568,3753,597],{"class":585},[568,3755,696],{"class":585},[568,3757,3758,3760,3762,3764,3767,3769],{"class":570,"line":729},[568,3759,766],{"class":682},[568,3761,686],{"class":585},[568,3763,652],{"class":585},[568,3765,3766],{"class":600},"\u002Fdocs\u002Fupload-limits",[568,3768,597],{"class":585},[568,3770,696],{"class":585},[568,3772,3773,3775],{"class":570,"line":746},[568,3774,783],{"class":585},[568,3776,606],{"class":593},[547,3778,3780],{"id":3779},"error-catalogs","Error Catalogs",[445,3782,3783,3784,3787,3788,3791,3792,3795,3796,3798,3799,3802,3803,3805],{},"For anything beyond a handful of one-off errors, group them in a typed ",[1066,3785,3786],{},"catalog",". evlog ships two primitives for this — ",[449,3789,3790],{},"defineError"," (single factory) and ",[449,3793,3794],{},"defineErrorCatalog"," (bundle prefixed). The wire ",[449,3797,449],{}," is auto-derived as ",[449,3800,3801],{},"${prefix}.${KEY}"," and the ",[449,3804,1259],{}," instance is built with all defaults applied.",[1276,3807,3809],{"id":3808},"defineerrorcatalog",[449,3810,3794],{},[445,3812,3813,3814,3817,3818,3821],{},"Define a bundle of errors that share a prefix. Convention: ",[449,3815,3816],{},"UPPER_SNAKE_CASE"," keys, ",[449,3819,3820],{},"lower.dot.case"," prefix.",[626,3823,3824,4122],{},[558,3825,3828],{"className":560,"code":3826,"filename":3827,"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,3829,3830,3849,3853,3881,3890,3900,3915,3919,3928,3938,3952,3966,3981,3997,4001,4010,4020,4064,4097,4112,4116],{"__ignoreMap":564},[568,3831,3832,3834,3836,3839,3841,3843,3845,3847],{"class":570,"line":571},[568,3833,637],{"class":581},[568,3835,640],{"class":585},[568,3837,3838],{"class":593}," defineErrorCatalog",[568,3840,646],{"class":585},[568,3842,649],{"class":581},[568,3844,652],{"class":585},[568,3846,655],{"class":600},[568,3848,658],{"class":585},[568,3850,3851],{"class":570,"line":578},[568,3852,664],{"emptyLinePlaceholder":663},[568,3854,3855,3858,3861,3864,3866,3868,3870,3872,3875,3877,3879],{"class":570,"line":667},[568,3856,3857],{"class":581},"export",[568,3859,3860],{"class":805}," const",[568,3862,3863],{"class":593}," billingErrors ",[568,3865,2770],{"class":585},[568,3867,3838],{"class":589},[568,3869,594],{"class":593},[568,3871,597],{"class":585},[568,3873,3874],{"class":600},"billing",[568,3876,597],{"class":585},[568,3878,1201],{"class":585},[568,3880,848],{"class":585},[568,3882,3883,3886,3888],{"class":570,"line":679},[568,3884,3885],{"class":682},"  CART_EMPTY",[568,3887,686],{"class":585},[568,3889,848],{"class":585},[568,3891,3892,3894,3896,3898],{"class":570,"line":699},[568,3893,1766],{"class":682},[568,3895,686],{"class":585},[568,3897,3386],{"class":723},[568,3899,696],{"class":585},[568,3901,3902,3904,3906,3908,3911,3913],{"class":570,"line":715},[568,3903,1750],{"class":682},[568,3905,686],{"class":585},[568,3907,652],{"class":585},[568,3909,3910],{"class":600},"Cart is empty",[568,3912,597],{"class":585},[568,3914,696],{"class":585},[568,3916,3917],{"class":570,"line":729},[568,3918,1209],{"class":585},[568,3920,3921,3924,3926],{"class":570,"line":746},[568,3922,3923],{"class":682},"  PAYMENT_DECLINED",[568,3925,686],{"class":585},[568,3927,848],{"class":585},[568,3929,3930,3932,3934,3936],{"class":570,"line":763},[568,3931,1766],{"class":682},[568,3933,686],{"class":585},[568,3935,724],{"class":723},[568,3937,696],{"class":585},[568,3939,3940,3942,3944,3946,3948,3950],{"class":570,"line":780},[568,3941,1750],{"class":682},[568,3943,686],{"class":585},[568,3945,652],{"class":585},[568,3947,1912],{"class":600},[568,3949,597],{"class":585},[568,3951,696],{"class":585},[568,3953,3954,3956,3958,3960,3962,3964],{"class":570,"line":1212},[568,3955,1778],{"class":682},[568,3957,686],{"class":585},[568,3959,652],{"class":585},[568,3961,1937],{"class":600},[568,3963,597],{"class":585},[568,3965,696],{"class":585},[568,3967,3968,3971,3973,3975,3977,3979],{"class":570,"line":1814},[568,3969,3970],{"class":682},"    fix",[568,3972,686],{"class":585},[568,3974,652],{"class":585},[568,3976,1501],{"class":600},[568,3978,597],{"class":585},[568,3980,696],{"class":585},[568,3982,3983,3986,3988,3990,3993,3995],{"class":570,"line":2409},[568,3984,3985],{"class":682},"    link",[568,3987,686],{"class":585},[568,3989,652],{"class":585},[568,3991,3992],{"class":600},"https:\u002F\u002Fdocs.example.com\u002Ferrors\u002Fbilling.payment_declined",[568,3994,597],{"class":585},[568,3996,696],{"class":585},[568,3998,3999],{"class":570,"line":2417},[568,4000,1209],{"class":585},[568,4002,4003,4006,4008],{"class":570,"line":2463},[568,4004,4005],{"class":682},"  INSUFFICIENT_FUNDS",[568,4007,686],{"class":585},[568,4009,848],{"class":585},[568,4011,4012,4014,4016,4018],{"class":570,"line":2468},[568,4013,1766],{"class":682},[568,4015,686],{"class":585},[568,4017,724],{"class":723},[568,4019,696],{"class":585},[568,4021,4022,4024,4026,4029,4033,4035,4038,4041,4043,4045,4047,4050,4052,4054,4056,4058,4061],{"class":570,"line":2996},[568,4023,1750],{"class":589},[568,4025,686],{"class":585},[568,4027,4028],{"class":585}," ({",[568,4030,4032],{"class":4031},"sHdIc"," available",[568,4034,1201],{"class":585},[568,4036,4037],{"class":4031}," required",[568,4039,4040],{"class":585}," }:",[568,4042,640],{"class":585},[568,4044,4032],{"class":682},[568,4046,686],{"class":585},[568,4048,4049],{"class":856}," number",[568,4051,1201],{"class":585},[568,4053,4037],{"class":682},[568,4055,686],{"class":585},[568,4057,4049],{"class":856},[568,4059,4060],{"class":585}," })",[568,4062,4063],{"class":805}," =>\n",[568,4065,4066,4069,4072,4075,4078,4080,4083,4085,4088,4090,4092,4095],{"class":570,"line":3003},[568,4067,4068],{"class":585},"      `",[568,4070,4071],{"class":600},"Insufficient funds: $",[568,4073,4074],{"class":585},"${",[568,4076,4077],{"class":593},"available",[568,4079,783],{"class":585},[568,4081,4082],{"class":600}," available, $",[568,4084,4074],{"class":585},[568,4086,4087],{"class":593},"required",[568,4089,783],{"class":585},[568,4091,4037],{"class":600},[568,4093,4094],{"class":585},"`",[568,4096,696],{"class":585},[568,4098,4099,4101,4103,4105,4108,4110],{"class":570,"line":3255},[568,4100,3970],{"class":682},[568,4102,686],{"class":585},[568,4104,652],{"class":585},[568,4106,4107],{"class":600},"Add funds and retry",[568,4109,597],{"class":585},[568,4111,696],{"class":585},[568,4113,4114],{"class":570,"line":3275},[568,4115,1209],{"class":585},[568,4117,4118,4120],{"class":570,"line":3305},[568,4119,783],{"class":585},[568,4121,606],{"class":593},[558,4123,4125],{"className":560,"code":4124,"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,4126,4127,4147,4151,4177,4197,4201,4236,4240,4247,4269,4273,4287,4336,4360,4376,4392,4407,4418,4425,4430,4438,4442],{"__ignoreMap":564},[568,4128,4129,4131,4133,4136,4138,4140,4142,4145],{"class":570,"line":571},[568,4130,637],{"class":581},[568,4132,640],{"class":585},[568,4134,4135],{"class":593}," billingErrors",[568,4137,646],{"class":585},[568,4139,649],{"class":581},[568,4141,652],{"class":585},[568,4143,4144],{"class":600},"~\u002Ferrors\u002Fbilling",[568,4146,658],{"class":585},[568,4148,4149],{"class":570,"line":578},[568,4150,664],{"emptyLinePlaceholder":663},[568,4152,4153,4155,4158,4161,4163,4166,4168,4171,4173,4175],{"class":570,"line":667},[568,4154,3857],{"class":581},[568,4156,4157],{"class":581}," default",[568,4159,4160],{"class":589}," defineEventHandler",[568,4162,594],{"class":593},[568,4164,4165],{"class":805},"async",[568,4167,2191],{"class":585},[568,4169,4170],{"class":4031},"event",[568,4172,985],{"class":585},[568,4174,2962],{"class":805},[568,4176,848],{"class":585},[568,4178,4179,4181,4183,4185,4188,4191,4193,4195],{"class":570,"line":679},[568,4180,2322],{"class":805},[568,4182,2303],{"class":593},[568,4184,2328],{"class":585},[568,4186,4187],{"class":581}," await",[568,4189,4190],{"class":589}," getCart",[568,4192,594],{"class":682},[568,4194,4170],{"class":593},[568,4196,606],{"class":682},[568,4198,4199],{"class":570,"line":699},[568,4200,664],{"emptyLinePlaceholder":663},[568,4202,4203,4206,4208,4211,4213,4215,4218,4220,4223,4225,4227,4229,4231,4234],{"class":570,"line":715},[568,4204,4205],{"class":581},"  if",[568,4207,2191],{"class":682},[568,4209,4210],{"class":585},"!",[568,4212,1840],{"class":593},[568,4214,621],{"class":585},[568,4216,4217],{"class":593},"items",[568,4219,621],{"class":585},[568,4221,4222],{"class":593},"length",[568,4224,2357],{"class":682},[568,4226,582],{"class":581},[568,4228,4135],{"class":593},[568,4230,621],{"class":585},[568,4232,4233],{"class":589},"CART_EMPTY",[568,4235,2384],{"class":682},[568,4237,4238],{"class":570,"line":729},[568,4239,664],{"emptyLinePlaceholder":663},[568,4241,4242,4245],{"class":570,"line":746},[568,4243,4244],{"class":581},"  try",[568,4246,848],{"class":585},[568,4248,4249,4252,4254,4256,4258,4260,4262,4264,4267],{"class":570,"line":763},[568,4250,4251],{"class":581},"    await",[568,4253,1705],{"class":593},[568,4255,621],{"class":585},[568,4257,1720],{"class":589},[568,4259,594],{"class":682},[568,4261,1840],{"class":593},[568,4263,621],{"class":585},[568,4265,4266],{"class":593},"total",[568,4268,606],{"class":682},[568,4270,4271],{"class":570,"line":780},[568,4272,926],{"class":585},[568,4274,4275,4278,4280,4283,4285],{"class":570,"line":1212},[568,4276,4277],{"class":581},"  catch",[568,4279,2191],{"class":682},[568,4281,4282],{"class":593},"e",[568,4284,2357],{"class":682},[568,4286,676],{"class":585},[568,4288,4289,4292,4294,4296,4298,4300,4303,4305,4308,4310,4312,4314,4316,4318,4320,4322,4324,4327,4329,4332,4334],{"class":570,"line":1814},[568,4290,4291],{"class":581},"    if",[568,4293,2191],{"class":682},[568,4295,4282],{"class":593},[568,4297,621],{"class":585},[568,4299,449],{"class":593},[568,4301,4302],{"class":585}," ===",[568,4304,652],{"class":585},[568,4306,4307],{"class":600},"card_declined",[568,4309,597],{"class":585},[568,4311,2357],{"class":682},[568,4313,582],{"class":581},[568,4315,4135],{"class":593},[568,4317,621],{"class":585},[568,4319,691],{"class":589},[568,4321,594],{"class":682},[568,4323,2432],{"class":585},[568,4325,4326],{"class":682}," cause",[568,4328,686],{"class":585},[568,4330,4331],{"class":593}," e",[568,4333,646],{"class":585},[568,4335,606],{"class":682},[568,4337,4338,4340,4342,4344,4346,4348,4350,4352,4354,4356,4358],{"class":570,"line":2409},[568,4339,4291],{"class":581},[568,4341,2191],{"class":682},[568,4343,4282],{"class":593},[568,4345,621],{"class":585},[568,4347,449],{"class":593},[568,4349,4302],{"class":585},[568,4351,652],{"class":585},[568,4353,1180],{"class":600},[568,4355,597],{"class":585},[568,4357,2357],{"class":682},[568,4359,676],{"class":585},[568,4361,4362,4365,4367,4369,4372,4374],{"class":570,"line":2417},[568,4363,4364],{"class":581},"      throw",[568,4366,4135],{"class":593},[568,4368,621],{"class":585},[568,4370,4371],{"class":589},"INSUFFICIENT_FUNDS",[568,4373,594],{"class":682},[568,4375,676],{"class":585},[568,4377,4378,4381,4383,4385,4387,4390],{"class":570,"line":2463},[568,4379,4380],{"class":682},"        available",[568,4382,686],{"class":585},[568,4384,4331],{"class":593},[568,4386,621],{"class":585},[568,4388,4389],{"class":593},"balance",[568,4391,696],{"class":585},[568,4393,4394,4397,4399,4401,4403,4405],{"class":570,"line":2468},[568,4395,4396],{"class":682},"        required",[568,4398,686],{"class":585},[568,4400,2303],{"class":593},[568,4402,621],{"class":585},[568,4404,4266],{"class":593},[568,4406,696],{"class":585},[568,4408,4409,4412,4414,4416],{"class":570,"line":2996},[568,4410,4411],{"class":682},"        cause",[568,4413,686],{"class":585},[568,4415,4331],{"class":593},[568,4417,696],{"class":585},[568,4419,4420,4423],{"class":570,"line":3003},[568,4421,4422],{"class":585},"      }",[568,4424,606],{"class":682},[568,4426,4427],{"class":570,"line":3255},[568,4428,4429],{"class":585},"    }\n",[568,4431,4432,4435],{"class":570,"line":3275},[568,4433,4434],{"class":581},"    throw",[568,4436,4437],{"class":593}," e\n",[568,4439,4440],{"class":570,"line":3305},[568,4441,926],{"class":585},[568,4443,4444,4446],{"class":570,"line":3315},[568,4445,783],{"class":585},[568,4447,606],{"class":593},[445,4449,4450,4451,533,4454,4457,4458,4461],{},"Each entry becomes a typed factory. Catalog metadata is exposed on ",[449,4452,4453],{},"_codes",[449,4455,4456],{},"_prefix"," for introspection (non-enumerable so ",[449,4459,4460],{},"Object.keys(billingErrors)"," still returns just the entry names).",[558,4463,4465],{"className":560,"code":4464,"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,4466,4467,4484,4499,4508,4513,4518,4523,4528],{"__ignoreMap":564},[568,4468,4469,4472,4474,4476,4478,4481],{"class":570,"line":571},[568,4470,4471],{"class":593},"billingErrors",[568,4473,621],{"class":585},[568,4475,691],{"class":593},[568,4477,621],{"class":585},[568,4479,4480],{"class":593},"code   ",[568,4482,4483],{"class":574},"\u002F\u002F 'billing.PAYMENT_DECLINED'\n",[568,4485,4486,4488,4490,4492,4494,4497],{"class":570,"line":578},[568,4487,4471],{"class":593},[568,4489,621],{"class":585},[568,4491,691],{"class":593},[568,4493,621],{"class":585},[568,4495,4496],{"class":593},"status ",[568,4498,2662],{"class":574},[568,4500,4501,4503,4505],{"class":570,"line":667},[568,4502,4471],{"class":593},[568,4504,621],{"class":585},[568,4506,4507],{"class":593},"_codes\n",[568,4509,4510],{"class":570,"line":679},[568,4511,4512],{"class":574},"\u002F\u002F readonly [\n",[568,4514,4515],{"class":570,"line":699},[568,4516,4517],{"class":574},"\u002F\u002F   'billing.CART_EMPTY',\n",[568,4519,4520],{"class":570,"line":715},[568,4521,4522],{"class":574},"\u002F\u002F   'billing.PAYMENT_DECLINED',\n",[568,4524,4525],{"class":570,"line":729},[568,4526,4527],{"class":574},"\u002F\u002F   'billing.INSUFFICIENT_FUNDS',\n",[568,4529,4530],{"class":570,"line":746},[568,4531,4532],{"class":574},"\u002F\u002F ]\n",[1276,4534,4536],{"id":4535},"templated-messages-with-typed-params","Templated messages with typed params",[445,4538,4539,4540,4542,4543,4546],{},"Set ",[449,4541,490],{}," to a function and the params become ",[1066,4544,4545],{},"required and typed"," at the call site.",[558,4548,4550],{"className":560,"code":4549,"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,4551,4552,4577,4587,4612,4634,4649,4655,4659],{"__ignoreMap":564},[568,4553,4554,4556,4559,4561,4564,4566,4568,4571,4573,4575],{"class":570,"line":571},[568,4555,2764],{"class":805},[568,4557,4558],{"class":593}," InvoiceOverdue ",[568,4560,2770],{"class":585},[568,4562,4563],{"class":589}," defineError",[568,4565,594],{"class":593},[568,4567,597],{"class":585},[568,4569,4570],{"class":600},"billing.INVOICE_OVERDUE",[568,4572,597],{"class":585},[568,4574,1201],{"class":585},[568,4576,848],{"class":585},[568,4578,4579,4581,4583,4585],{"class":570,"line":578},[568,4580,718],{"class":682},[568,4582,686],{"class":585},[568,4584,724],{"class":723},[568,4586,696],{"class":585},[568,4588,4589,4591,4593,4595,4598,4600,4602,4604,4606,4608,4610],{"class":570,"line":667},[568,4590,702],{"class":589},[568,4592,686],{"class":585},[568,4594,4028],{"class":585},[568,4596,4597],{"class":4031}," daysOverdue",[568,4599,4040],{"class":585},[568,4601,640],{"class":585},[568,4603,4597],{"class":682},[568,4605,686],{"class":585},[568,4607,4049],{"class":856},[568,4609,4060],{"class":585},[568,4611,4063],{"class":805},[568,4613,4614,4617,4620,4622,4625,4627,4630,4632],{"class":570,"line":679},[568,4615,4616],{"class":585},"    `",[568,4618,4619],{"class":600},"Invoice overdue by ",[568,4621,4074],{"class":585},[568,4623,4624],{"class":593},"daysOverdue",[568,4626,783],{"class":585},[568,4628,4629],{"class":600}," day(s)",[568,4631,4094],{"class":585},[568,4633,696],{"class":585},[568,4635,4636,4638,4640,4642,4645,4647],{"class":570,"line":699},[568,4637,749],{"class":682},[568,4639,686],{"class":585},[568,4641,652],{"class":585},[568,4643,4644],{"class":600},"Pay outstanding invoice to resume service",[568,4646,597],{"class":585},[568,4648,696],{"class":585},[568,4650,4651,4653],{"class":570,"line":715},[568,4652,783],{"class":585},[568,4654,606],{"class":593},[568,4656,4657],{"class":570,"line":729},[568,4658,664],{"emptyLinePlaceholder":663},[568,4660,4661,4663,4666,4668,4670,4672,4674,4677,4679,4681],{"class":570,"line":746},[568,4662,582],{"class":581},[568,4664,4665],{"class":589}," InvoiceOverdue",[568,4667,594],{"class":593},[568,4669,2432],{"class":585},[568,4671,4597],{"class":682},[568,4673,686],{"class":585},[568,4675,4676],{"class":723}," 7",[568,4678,646],{"class":585},[568,4680,2357],{"class":593},[568,4682,4683],{"class":574},"\u002F\u002F params required and type-checked\n",[445,4685,4686,4687,481,4689,481,4691,481,4693,481,4695,481,4697,481,4699,4701,4702,4704],{},"You can still override any field at the call site (",[449,4688,490],{},[449,4690,509],{},[449,4692,494],{},[449,4694,498],{},[449,4696,502],{},[449,4698,1048],{},[449,4700,1036],{},"). Catalog defaults for ",[449,4703,1048],{}," are shallow-merged with call-site values (call-site wins on conflict).",[1276,4706,4708,4710],{"id":4707},"defineerror-standalone-factories",[449,4709,3790],{}," — standalone factories",[445,4712,4713,4714,4716],{},"For one-off errors that don't fit a catalog (or for very large repos that prefer one file per error), use ",[449,4715,3790],{}," directly. Same factory shape as a catalog entry, no prefix derivation.",[558,4718,4720],{"className":560,"code":4719,"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,4721,4722,4727,4745,4749,4775,4786,4801,4816,4831,4837,4841],{"__ignoreMap":564},[568,4723,4724],{"class":570,"line":571},[568,4725,4726],{"class":574},"\u002F\u002F errors\u002FFraudDetected.ts\n",[568,4728,4729,4731,4733,4735,4737,4739,4741,4743],{"class":570,"line":578},[568,4730,637],{"class":581},[568,4732,640],{"class":585},[568,4734,4563],{"class":593},[568,4736,646],{"class":585},[568,4738,649],{"class":581},[568,4740,652],{"class":585},[568,4742,655],{"class":600},[568,4744,658],{"class":585},[568,4746,4747],{"class":570,"line":667},[568,4748,664],{"emptyLinePlaceholder":663},[568,4750,4751,4753,4755,4758,4760,4762,4764,4766,4769,4771,4773],{"class":570,"line":679},[568,4752,3857],{"class":581},[568,4754,3860],{"class":805},[568,4756,4757],{"class":593}," FraudDetected ",[568,4759,2770],{"class":585},[568,4761,4563],{"class":589},[568,4763,594],{"class":593},[568,4765,597],{"class":585},[568,4767,4768],{"class":600},"billing.FRAUD_DETECTED",[568,4770,597],{"class":585},[568,4772,1201],{"class":585},[568,4774,848],{"class":585},[568,4776,4777,4779,4781,4784],{"class":570,"line":699},[568,4778,718],{"class":682},[568,4780,686],{"class":585},[568,4782,4783],{"class":723}," 403",[568,4785,696],{"class":585},[568,4787,4788,4790,4792,4794,4797,4799],{"class":570,"line":715},[568,4789,702],{"class":682},[568,4791,686],{"class":585},[568,4793,652],{"class":585},[568,4795,4796],{"class":600},"Transaction flagged for review",[568,4798,597],{"class":585},[568,4800,696],{"class":585},[568,4802,4803,4805,4807,4809,4812,4814],{"class":570,"line":729},[568,4804,732],{"class":682},[568,4806,686],{"class":585},[568,4808,652],{"class":585},[568,4810,4811],{"class":600},"ML fraud-score above threshold",[568,4813,597],{"class":585},[568,4815,696],{"class":585},[568,4817,4818,4820,4822,4824,4827,4829],{"class":570,"line":746},[568,4819,749],{"class":682},[568,4821,686],{"class":585},[568,4823,652],{"class":585},[568,4825,4826],{"class":600},"Contact support to verify your identity",[568,4828,597],{"class":585},[568,4830,696],{"class":585},[568,4832,4833,4835],{"class":570,"line":763},[568,4834,783],{"class":585},[568,4836,606],{"class":593},[568,4838,4839],{"class":570,"line":780},[568,4840,664],{"emptyLinePlaceholder":663},[568,4842,4843,4845,4848],{"class":570,"line":1212},[568,4844,582],{"class":581},[568,4846,4847],{"class":589}," FraudDetected",[568,4849,2384],{"class":593},[1276,4851,4853],{"id":4852},"type-safe-codes-everywhere-opt-in","Type-safe codes everywhere (opt-in)",[445,4855,4856,4857,4860,4861,481,4864,4867,4868,4870],{},"Augment the ",[449,4858,4859],{},"RegisteredErrorCatalogs"," interface to make every registered code surface as autocomplete on ",[449,4862,4863],{},"createError({ code })",[449,4865,4866],{},"parseError(err).code",", and any other typed ",[449,4869,449],{}," field across the codebase.",[626,4872,4873,4988],{},[558,4874,4877],{"className":560,"code":4875,"filename":4876,"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,4878,4879,4901,4924,4928,4944,4954,4967,4980,4984],{"__ignoreMap":564},[568,4880,4881,4883,4886,4888,4890,4892,4894,4896,4899],{"class":570,"line":571},[568,4882,637],{"class":581},[568,4884,4885],{"class":581}," type",[568,4887,640],{"class":585},[568,4889,4135],{"class":593},[568,4891,646],{"class":585},[568,4893,649],{"class":581},[568,4895,652],{"class":585},[568,4897,4898],{"class":600},".\u002Fbilling",[568,4900,658],{"class":585},[568,4902,4903,4905,4907,4909,4912,4914,4917,4919,4922],{"class":570,"line":578},[568,4904,637],{"class":581},[568,4906,4885],{"class":581},[568,4908,640],{"class":585},[568,4910,4911],{"class":593}," authErrors",[568,4913,646],{"class":585},[568,4915,4916],{"class":581},"    from",[568,4918,652],{"class":585},[568,4920,4921],{"class":600},".\u002Fauth",[568,4923,658],{"class":585},[568,4925,4926],{"class":570,"line":667},[568,4927,664],{"emptyLinePlaceholder":663},[568,4929,4930,4933,4936,4938,4940,4942],{"class":570,"line":679},[568,4931,4932],{"class":805},"declare",[568,4934,4935],{"class":805}," module",[568,4937,652],{"class":585},[568,4939,655],{"class":600},[568,4941,597],{"class":585},[568,4943,848],{"class":585},[568,4945,4946,4949,4952],{"class":570,"line":699},[568,4947,4948],{"class":805},"  interface",[568,4950,4951],{"class":856}," RegisteredErrorCatalogs",[568,4953,848],{"class":585},[568,4955,4956,4959,4961,4964],{"class":570,"line":715},[568,4957,4958],{"class":682},"    billing",[568,4960,686],{"class":585},[568,4962,4963],{"class":585}," typeof",[568,4965,4966],{"class":593}," billingErrors\n",[568,4968,4969,4972,4974,4977],{"class":570,"line":729},[568,4970,4971],{"class":682},"    auth",[568,4973,686],{"class":585},[568,4975,4976],{"class":585},"    typeof",[568,4978,4979],{"class":593}," authErrors\n",[568,4981,4982],{"class":570,"line":746},[568,4983,926],{"class":585},[568,4985,4986],{"class":570,"line":763},[568,4987,931],{"class":585},[558,4989,4992],{"className":560,"code":4990,"filename":4991,"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,4993,4994,4999,5009,5027,5041,5051,5057,5061,5066,5080,5109],{"__ignoreMap":564},[568,4995,4996],{"class":570,"line":571},[568,4997,4998],{"class":574},"\u002F\u002F createError autocompletes registered codes (and still accepts ad-hoc strings)\n",[568,5000,5001,5003,5005,5007],{"class":570,"line":578},[568,5002,582],{"class":581},[568,5004,643],{"class":589},[568,5006,594],{"class":593},[568,5008,676],{"class":585},[568,5010,5011,5013,5015,5017,5020,5022,5024],{"class":570,"line":667},[568,5012,683],{"class":682},[568,5014,686],{"class":585},[568,5016,652],{"class":585},[568,5018,5019],{"class":600},"billing.PAYMENT_DECLINED",[568,5021,597],{"class":585},[568,5023,1201],{"class":585},[568,5025,5026],{"class":574}," \u002F\u002F ← autocomplete, TS error if typo\n",[568,5028,5029,5031,5033,5035,5037,5039],{"class":570,"line":679},[568,5030,702],{"class":682},[568,5032,686],{"class":585},[568,5034,652],{"class":585},[568,5036,1912],{"class":600},[568,5038,597],{"class":585},[568,5040,696],{"class":585},[568,5042,5043,5045,5047,5049],{"class":570,"line":699},[568,5044,718],{"class":682},[568,5046,686],{"class":585},[568,5048,724],{"class":723},[568,5050,696],{"class":585},[568,5052,5053,5055],{"class":570,"line":715},[568,5054,783],{"class":585},[568,5056,606],{"class":593},[568,5058,5059],{"class":570,"line":729},[568,5060,664],{"emptyLinePlaceholder":663},[568,5062,5063],{"class":570,"line":746},[568,5064,5065],{"class":574},"\u002F\u002F parseError().code is typed as the union of all registered codes\n",[568,5067,5068,5070,5073,5075,5077],{"class":570,"line":763},[568,5069,2764],{"class":805},[568,5071,5072],{"class":593}," err ",[568,5074,2770],{"class":585},[568,5076,2241],{"class":589},[568,5078,5079],{"class":593},"(caught)\n",[568,5081,5082,5085,5088,5090,5093,5096,5098,5100,5102,5104,5107],{"class":570,"line":780},[568,5083,5084],{"class":581},"if",[568,5086,5087],{"class":593}," (err",[568,5089,621],{"class":585},[568,5091,5092],{"class":593},"code ",[568,5094,5095],{"class":585},"===",[568,5097,652],{"class":585},[568,5099,5019],{"class":600},[568,5101,597],{"class":585},[568,5103,2357],{"class":593},[568,5105,5106],{"class":589},"retry",[568,5108,2384],{"class":593},[568,5110,5111],{"class":570,"line":1212},[568,5112,5113],{"class":574},"\u002F\u002F                ↑ autocomplete, refactor-safe\n",[445,5115,5116],{},"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.",[5118,5119,5122,5125,5126,5129,5130,5133,5134,5137,5138,5141],"callout",{"color":5120,"icon":5121},"neutral","i-lucide-package",[1066,5123,5124],{},"Packaging tip."," A catalog is regular TypeScript. Publish ",[449,5127,5128],{},"@acme\u002Ferrors-billing"," exporting your ",[449,5131,5132],{},"defineErrorCatalog(...)"," plus the ",[449,5135,5136],{},"declare module 'evlog'"," augmentation in its ",[449,5139,5140],{},"index.d.ts",", and the typing flows transitively to every consumer that depends on it. Each shared package owns its prefix, no conflicts possible.",[5118,5143,5146,5149,5150,5153],{"color":5144,"icon":5145,"to":77},"primary","i-lucide-arrow-right",[1066,5147,5148],{},"Going further."," The dedicated ",[541,5151,5152],{"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.",[5118,5155,5156,5157,5160],{"color":5120,"icon":272},"See the ",[541,5158,5159],{"href":173},"Next.js guide"," for a working implementation.",[547,5162,5164],{"id":5163},"next-steps","Next Steps",[462,5166,5167,5172,5177,5182],{},[465,5168,5169,5171],{},[541,5170,46],{"href":47},": Accumulate context and emit comprehensive events",[465,5173,5174,5176],{},[541,5175,90],{"href":95},": Send errors and events to Axiom, Sentry, PostHog, and more",[465,5178,5179,5181],{},[541,5180,158],{"href":163},": Auto-managed request logging per framework",[465,5183,5184,5186],{},[541,5185,25],{"href":26},": See all evlog APIs in action",[5188,5189,5190],"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":5192},[5193,5194,5195,5197,5202,5205,5207,5210,5214,5221],{"id":549,"depth":578,"text":550},{"id":934,"depth":578,"text":935},{"id":1056,"depth":578,"text":5196},"Backend-only context (internal)",{"id":1273,"depth":578,"text":1274,"children":5198},[5199,5200,5201],{"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":5203},[5204],{"id":2114,"depth":667,"text":2115},{"id":2212,"depth":578,"text":5206},"Branching on code",{"id":2505,"depth":578,"text":2506,"children":5208},[5209],{"id":3008,"depth":667,"text":3009},{"id":3335,"depth":578,"text":427,"children":5211},[5212,5213],{"id":3338,"depth":667,"text":3339},{"id":3619,"depth":667,"text":3620},{"id":3779,"depth":578,"text":3780,"children":5215},[5216,5217,5218,5220],{"id":3808,"depth":667,"text":3794},{"id":4535,"depth":667,"text":4536},{"id":4707,"depth":667,"text":5219},"defineError — standalone factories",{"id":4852,"depth":667,"text":4853},{"id":5163,"depth":578,"text":5164},"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",[5225,5227],{"label":46,"icon":49,"to":47,"color":5120,"variant":5226},"subtle",{"label":427,"icon":318,"to":428,"color":5120,"variant":5226},{},{"icon":54},{"title":51,"description":5222},"mFQGZBC2QSA-1T7Ev5-yW0QoYA1hWTh-Y-PVypGdzQE",[5233,5235],{"title":46,"path":47,"stem":48,"description":5234,"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":5236,"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.",1781121499526]