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