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