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