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