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