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