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