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