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