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