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