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