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