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