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