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