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