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