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