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