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