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