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