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