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