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