[{"data":1,"prerenderedAt":2375},["ShallowReactive",2],{"navigation_docs":3,"-examples-tanstack-start":181,"-examples-tanstack-start-surround":2370},[4,30,55,105,122,136],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45,50],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"icon":54},"Typed Fields","/core-concepts/typed-fields","2.core-concepts/4.typed-fields","i-simple-icons-typescript",{"title":56,"path":57,"stem":58,"children":59,"page":29},"Adapters","/adapters","3.adapters",[60,65,70,75,80,85,90,95,100],{"title":61,"path":62,"stem":63,"icon":64},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":66,"path":67,"stem":68,"icon":69},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":71,"path":72,"stem":73,"icon":74},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":76,"path":77,"stem":78,"icon":79},"PostHog","/adapters/posthog","3.adapters/4.posthog","i-simple-icons-posthog",{"title":81,"path":82,"stem":83,"icon":84},"Sentry","/adapters/sentry","3.adapters/5.sentry","i-simple-icons-sentry",{"title":86,"path":87,"stem":88,"icon":89},"Better Stack","/adapters/better-stack","3.adapters/6.better-stack","i-simple-icons-betterstack",{"title":91,"path":92,"stem":93,"icon":94},"Custom Adapters","/adapters/custom","3.adapters/7.custom","i-lucide-code",{"title":96,"path":97,"stem":98,"icon":99},"Pipeline","/adapters/pipeline","3.adapters/8.pipeline","i-lucide-workflow",{"title":101,"path":102,"stem":103,"icon":104},"Browser","/adapters/browser","3.adapters/9.browser","i-lucide-globe",{"title":106,"path":107,"stem":108,"children":109,"page":29},"Enrichers","/enrichers","4.enrichers",[110,113,118],{"title":61,"path":111,"stem":112,"icon":28},"/enrichers/overview","4.enrichers/1.overview",{"title":114,"path":115,"stem":116,"icon":117},"Built-in","/enrichers/built-in","4.enrichers/2.built-in","i-lucide-puzzle",{"title":119,"path":120,"stem":121,"icon":94},"Custom","/enrichers/custom","4.enrichers/3.custom",{"title":123,"path":124,"stem":125,"children":126,"page":29},"NuxtHub","/nuxthub","5.nuxthub",[127,131],{"title":61,"path":128,"stem":129,"icon":130},"/nuxthub/overview","5.nuxthub/1.overview","i-lucide-database",{"title":132,"path":133,"stem":134,"icon":135},"Retention","/nuxthub/retention","5.nuxthub/2.retention","i-lucide-clock",{"title":137,"path":138,"stem":139,"children":140,"page":29},"Examples","/examples","6.examples",[141,146,151,156,161,166,171,176],{"title":142,"path":143,"stem":144,"icon":145},"Next.js","/examples/nextjs","6.examples/1.nextjs","i-simple-icons-nextdotjs",{"title":147,"path":148,"stem":149,"icon":150},"TanStack Start","/examples/tanstack-start","6.examples/2.tanstack-start","i-custom-tanstack",{"title":152,"path":153,"stem":154,"icon":155},"Hono","/examples/hono","6.examples/3.hono","i-simple-icons-hono",{"title":157,"path":158,"stem":159,"icon":160},"Express","/examples/express","6.examples/4.express","i-simple-icons-express",{"title":162,"path":163,"stem":164,"icon":165},"Elysia","/examples/elysia","6.examples/5.elysia","i-custom-elysia",{"title":167,"path":168,"stem":169,"icon":170},"Fastify","/examples/fastify","6.examples/6.fastify","i-simple-icons-fastify",{"title":172,"path":173,"stem":174,"icon":175},"NestJS","/examples/nestjs","6.examples/7.nestjs","i-simple-icons-nestjs",{"title":177,"path":178,"stem":179,"icon":180},"SvelteKit","/examples/sveltekit","6.examples/7.sveltekit","i-simple-icons-svelte",{"id":182,"title":147,"body":183,"description":2360,"extension":2361,"links":2362,"meta":2366,"navigation":2367,"path":148,"seo":2368,"stem":149,"__hash__":2369},"docs/6.examples/2.tanstack-start.md",{"type":184,"value":185,"toc":2346},"minimark",[186,195,200,207,212,237,244,258,444,455,459,482,622,625,628,642,1006,1009,1080,1091,1095,1109,1641,1644,1720,1724,1730,1967,1971,1978,2101,2276,2280,2322,2332,2342],[187,188,189,190,194],"p",{},"Practical patterns for using evlog with TanStack Start. TanStack Start uses Nitro v3 as its server layer, so evlog integrates via the ",[191,192,193],"code",{},"evlog/nitro/v3"," module.",[196,197,199],"h2",{"id":198},"setup","Setup",[187,201,202,203,206],{},"Starting from a TanStack Start project created with ",[191,204,205],{},"npm create @tanstack/start@latest",":",[208,209,211],"h3",{"id":210},"_1-install-evlog","1. Install evlog",[213,214,219],"pre",{"className":215,"code":216,"language":217,"meta":218,"style":218},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install evlog\n","bash","",[191,220,221],{"__ignoreMap":218},[222,223,226,230,234],"span",{"class":224,"line":225},"line",1,[222,227,229],{"class":228},"sBMFI","npm",[222,231,233],{"class":232},"sfazB"," install",[222,235,236],{"class":232}," evlog\n",[208,238,240,241],{"id":239},"_2-add-nitroconfigts","2. Add ",[191,242,243],{},"nitro.config.ts",[187,245,246,247,249,250,253,254,257],{},"Create a ",[191,248,243],{}," at the project root to register the evlog module. Your ",[191,251,252],{},"vite.config.ts"," already has the ",[191,255,256],{},"nitro()"," plugin from the CLI — no changes needed there.",[213,259,263],{"className":260,"code":261,"filename":243,"language":262,"meta":218,"style":218},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineConfig } from 'nitro'\nimport evlog from 'evlog/nitro/v3'\n\nexport default defineConfig({\n  experimental: {\n    asyncContext: true,\n  },\n  modules: [\n    evlog({\n      env: { service: 'my-app' },\n    }),\n  ],\n})\n","typescript",[191,264,265,294,311,318,336,348,363,369,380,390,416,427,435],{"__ignoreMap":218},[222,266,267,271,275,279,282,285,288,291],{"class":224,"line":225},[222,268,270],{"class":269},"s7zQu","import",[222,272,274],{"class":273},"sMK4o"," {",[222,276,278],{"class":277},"sTEyZ"," defineConfig",[222,280,281],{"class":273}," }",[222,283,284],{"class":269}," from",[222,286,287],{"class":273}," '",[222,289,290],{"class":232},"nitro",[222,292,293],{"class":273},"'\n",[222,295,297,299,302,305,307,309],{"class":224,"line":296},2,[222,298,270],{"class":269},[222,300,301],{"class":277}," evlog ",[222,303,304],{"class":269},"from",[222,306,287],{"class":273},[222,308,193],{"class":232},[222,310,293],{"class":273},[222,312,314],{"class":224,"line":313},3,[222,315,317],{"emptyLinePlaceholder":316},true,"\n",[222,319,321,324,327,330,333],{"class":224,"line":320},4,[222,322,323],{"class":269},"export",[222,325,326],{"class":269}," default",[222,328,278],{"class":329},"s2Zo4",[222,331,332],{"class":277},"(",[222,334,335],{"class":273},"{\n",[222,337,339,343,345],{"class":224,"line":338},5,[222,340,342],{"class":341},"swJcz","  experimental",[222,344,206],{"class":273},[222,346,347],{"class":273}," {\n",[222,349,351,354,356,360],{"class":224,"line":350},6,[222,352,353],{"class":341},"    asyncContext",[222,355,206],{"class":273},[222,357,359],{"class":358},"sfNiH"," true",[222,361,362],{"class":273},",\n",[222,364,366],{"class":224,"line":365},7,[222,367,368],{"class":273},"  },\n",[222,370,372,375,377],{"class":224,"line":371},8,[222,373,374],{"class":341},"  modules",[222,376,206],{"class":273},[222,378,379],{"class":277}," [\n",[222,381,383,386,388],{"class":224,"line":382},9,[222,384,385],{"class":329},"    evlog",[222,387,332],{"class":277},[222,389,335],{"class":273},[222,391,393,396,398,400,403,405,407,410,413],{"class":224,"line":392},10,[222,394,395],{"class":341},"      env",[222,397,206],{"class":273},[222,399,274],{"class":273},[222,401,402],{"class":341}," service",[222,404,206],{"class":273},[222,406,287],{"class":273},[222,408,409],{"class":232},"my-app",[222,411,412],{"class":273},"'",[222,414,415],{"class":273}," },\n",[222,417,419,422,425],{"class":224,"line":418},11,[222,420,421],{"class":273},"    }",[222,423,424],{"class":277},")",[222,426,362],{"class":273},[222,428,430,433],{"class":224,"line":429},12,[222,431,432],{"class":277},"  ]",[222,434,362],{"class":273},[222,436,438,441],{"class":224,"line":437},13,[222,439,440],{"class":273},"}",[222,442,443],{"class":277},")\n",[187,445,446,447,450,451,454],{},"Enabling ",[191,448,449],{},"asyncContext"," lets you access the request-scoped logger from anywhere in the call stack via ",[191,452,453],{},"useRequest()",".",[208,456,458],{"id":457},"_3-error-handling-middleware","3. Error handling middleware",[187,460,461,462,465,466,469,470,473,474,477,478,481],{},"TanStack Start has its own error handling layer that runs before Nitro's. To ensure ",[191,463,464],{},"throw createError()"," returns a proper JSON response with ",[191,467,468],{},"why",", ",[191,471,472],{},"fix",", and ",[191,475,476],{},"link",", add the ",[191,479,480],{},"evlogErrorHandler"," middleware to your root route:",[213,483,486],{"className":260,"code":484,"filename":485,"language":262,"meta":218,"style":218},"import { createRootRoute } from '@tanstack/react-router'\nimport { createMiddleware } from '@tanstack/react-start'\nimport { evlogErrorHandler } from 'evlog/nitro/v3'\n\nexport const Route = createRootRoute({\n  server: {\n    middleware: [createMiddleware().server(evlogErrorHandler)],\n  },\n  // ... head, shellComponent, etc.\n})\n","src/routes/__root.tsx",[191,487,488,508,528,547,551,571,580,606,610,616],{"__ignoreMap":218},[222,489,490,492,494,497,499,501,503,506],{"class":224,"line":225},[222,491,270],{"class":269},[222,493,274],{"class":273},[222,495,496],{"class":277}," createRootRoute",[222,498,281],{"class":273},[222,500,284],{"class":269},[222,502,287],{"class":273},[222,504,505],{"class":232},"@tanstack/react-router",[222,507,293],{"class":273},[222,509,510,512,514,517,519,521,523,526],{"class":224,"line":296},[222,511,270],{"class":269},[222,513,274],{"class":273},[222,515,516],{"class":277}," createMiddleware",[222,518,281],{"class":273},[222,520,284],{"class":269},[222,522,287],{"class":273},[222,524,525],{"class":232},"@tanstack/react-start",[222,527,293],{"class":273},[222,529,530,532,534,537,539,541,543,545],{"class":224,"line":313},[222,531,270],{"class":269},[222,533,274],{"class":273},[222,535,536],{"class":277}," evlogErrorHandler",[222,538,281],{"class":273},[222,540,284],{"class":269},[222,542,287],{"class":273},[222,544,193],{"class":232},[222,546,293],{"class":273},[222,548,549],{"class":224,"line":320},[222,550,317],{"emptyLinePlaceholder":316},[222,552,553,555,559,562,565,567,569],{"class":224,"line":338},[222,554,323],{"class":269},[222,556,558],{"class":557},"spNyl"," const",[222,560,561],{"class":277}," Route ",[222,563,564],{"class":273},"=",[222,566,496],{"class":329},[222,568,332],{"class":277},[222,570,335],{"class":273},[222,572,573,576,578],{"class":224,"line":350},[222,574,575],{"class":341},"  server",[222,577,206],{"class":273},[222,579,347],{"class":273},[222,581,582,585,587,590,593,596,598,601,604],{"class":224,"line":365},[222,583,584],{"class":341},"    middleware",[222,586,206],{"class":273},[222,588,589],{"class":277}," [",[222,591,592],{"class":329},"createMiddleware",[222,594,595],{"class":277},"()",[222,597,454],{"class":273},[222,599,600],{"class":329},"server",[222,602,603],{"class":277},"(evlogErrorHandler)]",[222,605,362],{"class":273},[222,607,608],{"class":224,"line":371},[222,609,368],{"class":273},[222,611,612],{"class":224,"line":382},[222,613,615],{"class":614},"sHwdD","  // ... head, shellComponent, etc.\n",[222,617,618,620],{"class":224,"line":392},[222,619,440],{"class":273},[222,621,443],{"class":277},[187,623,624],{},"That's it. evlog automatically captures every request as a wide event with method, path, status, and duration.",[196,626,36],{"id":627},"wide-events",[187,629,630,631,634,635,637,638,641],{},"With ",[191,632,633],{},"experimental.asyncContext: true",", use ",[191,636,453],{}," from ",[191,639,640],{},"nitro/context"," to access the request-scoped logger and build up context progressively:",[213,643,646],{"className":260,"code":644,"filename":645,"language":262,"meta":218,"style":218},"import { createFileRoute } from '@tanstack/react-router'\nimport { useRequest } from 'nitro/context'\nimport type { RequestLogger } from 'evlog'\n\nexport const Route = createFileRoute('/api/hello')({\n  server: {\n    handlers: {\n      GET: async () => {\n        const req = useRequest()\n        const log = req.context.log as RequestLogger\n\n        log.set({ user: { id: 'user_123', plan: 'pro' } })\n        log.set({ action: 'fetch_profile' })\n        log.set({ cache: { hit: true, ttl: 3600 } })\n\n        return Response.json({ ok: true })\n      },\n    },\n  },\n})\n","src/routes/api/hello.ts",[191,647,648,667,686,709,713,739,747,756,774,790,817,821,876,904,948,953,982,988,994,999],{"__ignoreMap":218},[222,649,650,652,654,657,659,661,663,665],{"class":224,"line":225},[222,651,270],{"class":269},[222,653,274],{"class":273},[222,655,656],{"class":277}," createFileRoute",[222,658,281],{"class":273},[222,660,284],{"class":269},[222,662,287],{"class":273},[222,664,505],{"class":232},[222,666,293],{"class":273},[222,668,669,671,673,676,678,680,682,684],{"class":224,"line":296},[222,670,270],{"class":269},[222,672,274],{"class":273},[222,674,675],{"class":277}," useRequest",[222,677,281],{"class":273},[222,679,284],{"class":269},[222,681,287],{"class":273},[222,683,640],{"class":232},[222,685,293],{"class":273},[222,687,688,690,693,695,698,700,702,704,707],{"class":224,"line":313},[222,689,270],{"class":269},[222,691,692],{"class":269}," type",[222,694,274],{"class":273},[222,696,697],{"class":277}," RequestLogger",[222,699,281],{"class":273},[222,701,284],{"class":269},[222,703,287],{"class":273},[222,705,706],{"class":232},"evlog",[222,708,293],{"class":273},[222,710,711],{"class":224,"line":320},[222,712,317],{"emptyLinePlaceholder":316},[222,714,715,717,719,721,723,725,727,729,732,734,737],{"class":224,"line":338},[222,716,323],{"class":269},[222,718,558],{"class":557},[222,720,561],{"class":277},[222,722,564],{"class":273},[222,724,656],{"class":329},[222,726,332],{"class":277},[222,728,412],{"class":273},[222,730,731],{"class":232},"/api/hello",[222,733,412],{"class":273},[222,735,736],{"class":277},")(",[222,738,335],{"class":273},[222,740,741,743,745],{"class":224,"line":350},[222,742,575],{"class":341},[222,744,206],{"class":273},[222,746,347],{"class":273},[222,748,749,752,754],{"class":224,"line":365},[222,750,751],{"class":341},"    handlers",[222,753,206],{"class":273},[222,755,347],{"class":273},[222,757,758,761,763,766,769,772],{"class":224,"line":371},[222,759,760],{"class":329},"      GET",[222,762,206],{"class":273},[222,764,765],{"class":557}," async",[222,767,768],{"class":273}," ()",[222,770,771],{"class":557}," =>",[222,773,347],{"class":273},[222,775,776,779,782,785,787],{"class":224,"line":382},[222,777,778],{"class":557},"        const",[222,780,781],{"class":277}," req",[222,783,784],{"class":273}," =",[222,786,675],{"class":329},[222,788,789],{"class":341},"()\n",[222,791,792,794,797,799,801,803,806,808,811,814],{"class":224,"line":392},[222,793,778],{"class":557},[222,795,796],{"class":277}," log",[222,798,784],{"class":273},[222,800,781],{"class":277},[222,802,454],{"class":273},[222,804,805],{"class":277},"context",[222,807,454],{"class":273},[222,809,810],{"class":277},"log",[222,812,813],{"class":269}," as",[222,815,816],{"class":228}," RequestLogger\n",[222,818,819],{"class":224,"line":418},[222,820,317],{"emptyLinePlaceholder":316},[222,822,823,826,828,831,833,836,839,841,843,846,848,850,853,855,858,861,863,865,868,870,872,874],{"class":224,"line":429},[222,824,825],{"class":277},"        log",[222,827,454],{"class":273},[222,829,830],{"class":329},"set",[222,832,332],{"class":341},[222,834,835],{"class":273},"{",[222,837,838],{"class":341}," user",[222,840,206],{"class":273},[222,842,274],{"class":273},[222,844,845],{"class":341}," id",[222,847,206],{"class":273},[222,849,287],{"class":273},[222,851,852],{"class":232},"user_123",[222,854,412],{"class":273},[222,856,857],{"class":273},",",[222,859,860],{"class":341}," plan",[222,862,206],{"class":273},[222,864,287],{"class":273},[222,866,867],{"class":232},"pro",[222,869,412],{"class":273},[222,871,281],{"class":273},[222,873,281],{"class":273},[222,875,443],{"class":341},[222,877,878,880,882,884,886,888,891,893,895,898,900,902],{"class":224,"line":437},[222,879,825],{"class":277},[222,881,454],{"class":273},[222,883,830],{"class":329},[222,885,332],{"class":341},[222,887,835],{"class":273},[222,889,890],{"class":341}," action",[222,892,206],{"class":273},[222,894,287],{"class":273},[222,896,897],{"class":232},"fetch_profile",[222,899,412],{"class":273},[222,901,281],{"class":273},[222,903,443],{"class":341},[222,905,907,909,911,913,915,917,920,922,924,927,929,931,933,936,938,942,944,946],{"class":224,"line":906},14,[222,908,825],{"class":277},[222,910,454],{"class":273},[222,912,830],{"class":329},[222,914,332],{"class":341},[222,916,835],{"class":273},[222,918,919],{"class":341}," cache",[222,921,206],{"class":273},[222,923,274],{"class":273},[222,925,926],{"class":341}," hit",[222,928,206],{"class":273},[222,930,359],{"class":358},[222,932,857],{"class":273},[222,934,935],{"class":341}," ttl",[222,937,206],{"class":273},[222,939,941],{"class":940},"sbssI"," 3600",[222,943,281],{"class":273},[222,945,281],{"class":273},[222,947,443],{"class":341},[222,949,951],{"class":224,"line":950},15,[222,952,317],{"emptyLinePlaceholder":316},[222,954,956,959,962,964,967,969,971,974,976,978,980],{"class":224,"line":955},16,[222,957,958],{"class":269},"        return",[222,960,961],{"class":277}," Response",[222,963,454],{"class":273},[222,965,966],{"class":329},"json",[222,968,332],{"class":341},[222,970,835],{"class":273},[222,972,973],{"class":341}," ok",[222,975,206],{"class":273},[222,977,359],{"class":358},[222,979,281],{"class":273},[222,981,443],{"class":341},[222,983,985],{"class":224,"line":984},17,[222,986,987],{"class":273},"      },\n",[222,989,991],{"class":224,"line":990},18,[222,992,993],{"class":273},"    },\n",[222,995,997],{"class":224,"line":996},19,[222,998,368],{"class":273},[222,1000,1002,1004],{"class":224,"line":1001},20,[222,1003,440],{"class":273},[222,1005,443],{"class":277},[187,1007,1008],{},"All fields are merged into a single wide event emitted when the request completes:",[213,1010,1013],{"className":215,"code":1011,"filename":1012,"language":217,"meta":218,"style":218},"14:58:15 INFO [my-app] GET /api/hello 200 in 52ms\n  ├─ cache: hit=true ttl=3600\n  ├─ action: fetch_profile\n  ├─ user: id=user_123 plan=pro\n  └─ requestId: 4a8ff3a8-...\n","Terminal output",[191,1014,1015,1026,1046,1056,1069],{"__ignoreMap":218},[222,1016,1017,1020,1023],{"class":224,"line":225},[222,1018,1019],{"class":228},"14:58:15",[222,1021,1022],{"class":232}," INFO",[222,1024,1025],{"class":277}," [my-app] GET /api/hello 200 in 52ms\n",[222,1027,1028,1031,1034,1037,1040,1043],{"class":224,"line":296},[222,1029,1030],{"class":228},"  ├─",[222,1032,1033],{"class":232}," cache:",[222,1035,1036],{"class":232}," hit=",[222,1038,1039],{"class":273},"true",[222,1041,1042],{"class":232}," ttl=",[222,1044,1045],{"class":940},"3600\n",[222,1047,1048,1050,1053],{"class":224,"line":313},[222,1049,1030],{"class":228},[222,1051,1052],{"class":232}," action:",[222,1054,1055],{"class":232}," fetch_profile\n",[222,1057,1058,1060,1063,1066],{"class":224,"line":320},[222,1059,1030],{"class":228},[222,1061,1062],{"class":232}," user:",[222,1064,1065],{"class":232}," id=user_123",[222,1067,1068],{"class":232}," plan=pro\n",[222,1070,1071,1074,1077],{"class":224,"line":338},[222,1072,1073],{"class":228},"  └─",[222,1075,1076],{"class":232}," requestId:",[222,1078,1079],{"class":232}," 4a8ff3a8-...\n",[1081,1082,1084,1086,1087,1090],"callout",{"color":1083,"icon":13},"info",[191,1085,453],{}," is an experimental Nitro v3 feature powered by ",[191,1088,1089],{},"AsyncLocalStorage",". It works on Node.js and Bun runtimes.",[196,1092,1094],{"id":1093},"error-handling","Error Handling",[187,1096,1097,1098,1101,1102,469,1104,473,1106,1108],{},"Use ",[191,1099,1100],{},"createError"," for structured errors with ",[191,1103,468],{},[191,1105,472],{},[191,1107,476],{}," fields:",[213,1110,1113],{"className":260,"code":1111,"filename":1112,"language":262,"meta":218,"style":218},"import { createFileRoute } from '@tanstack/react-router'\nimport { useRequest } from 'nitro/context'\nimport { createError } from 'evlog'\nimport type { RequestLogger } from 'evlog'\n\nexport const Route = createFileRoute('/api/checkout')({\n  server: {\n    handlers: {\n      POST: async ({ request }) => {\n        const req = useRequest()\n        const log = req.context.log as RequestLogger\n        const body = await request.json()\n\n        log.set({ user: { id: body.userId, plan: body.plan } })\n        log.set({ cart: { items: body.items, total: body.total } })\n\n        const result = await chargeCard(body)\n\n        if (!result.success) {\n          throw createError({\n            message: 'Payment failed',\n            status: 402,\n            why: 'Card declined by issuer',\n            fix: 'Try a different payment method',\n            link: 'https://docs.example.com/payments/declined',\n          })\n        }\n\n        return Response.json({ success: true, orderId: result.orderId })\n      },\n    },\n  },\n})\n","src/routes/api/checkout.ts",[191,1114,1115,1133,1151,1170,1190,1194,1219,1227,1235,1258,1270,1292,1312,1316,1364,1415,1419,1440,1444,1468,1479,1496,1509,1526,1543,1560,1568,1574,1579,1619,1624,1629,1634],{"__ignoreMap":218},[222,1116,1117,1119,1121,1123,1125,1127,1129,1131],{"class":224,"line":225},[222,1118,270],{"class":269},[222,1120,274],{"class":273},[222,1122,656],{"class":277},[222,1124,281],{"class":273},[222,1126,284],{"class":269},[222,1128,287],{"class":273},[222,1130,505],{"class":232},[222,1132,293],{"class":273},[222,1134,1135,1137,1139,1141,1143,1145,1147,1149],{"class":224,"line":296},[222,1136,270],{"class":269},[222,1138,274],{"class":273},[222,1140,675],{"class":277},[222,1142,281],{"class":273},[222,1144,284],{"class":269},[222,1146,287],{"class":273},[222,1148,640],{"class":232},[222,1150,293],{"class":273},[222,1152,1153,1155,1157,1160,1162,1164,1166,1168],{"class":224,"line":313},[222,1154,270],{"class":269},[222,1156,274],{"class":273},[222,1158,1159],{"class":277}," createError",[222,1161,281],{"class":273},[222,1163,284],{"class":269},[222,1165,287],{"class":273},[222,1167,706],{"class":232},[222,1169,293],{"class":273},[222,1171,1172,1174,1176,1178,1180,1182,1184,1186,1188],{"class":224,"line":320},[222,1173,270],{"class":269},[222,1175,692],{"class":269},[222,1177,274],{"class":273},[222,1179,697],{"class":277},[222,1181,281],{"class":273},[222,1183,284],{"class":269},[222,1185,287],{"class":273},[222,1187,706],{"class":232},[222,1189,293],{"class":273},[222,1191,1192],{"class":224,"line":338},[222,1193,317],{"emptyLinePlaceholder":316},[222,1195,1196,1198,1200,1202,1204,1206,1208,1210,1213,1215,1217],{"class":224,"line":350},[222,1197,323],{"class":269},[222,1199,558],{"class":557},[222,1201,561],{"class":277},[222,1203,564],{"class":273},[222,1205,656],{"class":329},[222,1207,332],{"class":277},[222,1209,412],{"class":273},[222,1211,1212],{"class":232},"/api/checkout",[222,1214,412],{"class":273},[222,1216,736],{"class":277},[222,1218,335],{"class":273},[222,1220,1221,1223,1225],{"class":224,"line":365},[222,1222,575],{"class":341},[222,1224,206],{"class":273},[222,1226,347],{"class":273},[222,1228,1229,1231,1233],{"class":224,"line":371},[222,1230,751],{"class":341},[222,1232,206],{"class":273},[222,1234,347],{"class":273},[222,1236,1237,1240,1242,1244,1247,1251,1254,1256],{"class":224,"line":382},[222,1238,1239],{"class":329},"      POST",[222,1241,206],{"class":273},[222,1243,765],{"class":557},[222,1245,1246],{"class":273}," ({",[222,1248,1250],{"class":1249},"sHdIc"," request",[222,1252,1253],{"class":273}," })",[222,1255,771],{"class":557},[222,1257,347],{"class":273},[222,1259,1260,1262,1264,1266,1268],{"class":224,"line":392},[222,1261,778],{"class":557},[222,1263,781],{"class":277},[222,1265,784],{"class":273},[222,1267,675],{"class":329},[222,1269,789],{"class":341},[222,1271,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290],{"class":224,"line":418},[222,1273,778],{"class":557},[222,1275,796],{"class":277},[222,1277,784],{"class":273},[222,1279,781],{"class":277},[222,1281,454],{"class":273},[222,1283,805],{"class":277},[222,1285,454],{"class":273},[222,1287,810],{"class":277},[222,1289,813],{"class":269},[222,1291,816],{"class":228},[222,1293,1294,1296,1299,1301,1304,1306,1308,1310],{"class":224,"line":429},[222,1295,778],{"class":557},[222,1297,1298],{"class":277}," body",[222,1300,784],{"class":273},[222,1302,1303],{"class":269}," await",[222,1305,1250],{"class":277},[222,1307,454],{"class":273},[222,1309,966],{"class":329},[222,1311,789],{"class":341},[222,1313,1314],{"class":224,"line":437},[222,1315,317],{"emptyLinePlaceholder":316},[222,1317,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1345,1347,1349,1351,1353,1355,1358,1360,1362],{"class":224,"line":906},[222,1319,825],{"class":277},[222,1321,454],{"class":273},[222,1323,830],{"class":329},[222,1325,332],{"class":341},[222,1327,835],{"class":273},[222,1329,838],{"class":341},[222,1331,206],{"class":273},[222,1333,274],{"class":273},[222,1335,845],{"class":341},[222,1337,206],{"class":273},[222,1339,1298],{"class":277},[222,1341,454],{"class":273},[222,1343,1344],{"class":277},"userId",[222,1346,857],{"class":273},[222,1348,860],{"class":341},[222,1350,206],{"class":273},[222,1352,1298],{"class":277},[222,1354,454],{"class":273},[222,1356,1357],{"class":277},"plan",[222,1359,281],{"class":273},[222,1361,281],{"class":273},[222,1363,443],{"class":341},[222,1365,1366,1368,1370,1372,1374,1376,1379,1381,1383,1386,1388,1390,1392,1395,1397,1400,1402,1404,1406,1409,1411,1413],{"class":224,"line":950},[222,1367,825],{"class":277},[222,1369,454],{"class":273},[222,1371,830],{"class":329},[222,1373,332],{"class":341},[222,1375,835],{"class":273},[222,1377,1378],{"class":341}," cart",[222,1380,206],{"class":273},[222,1382,274],{"class":273},[222,1384,1385],{"class":341}," items",[222,1387,206],{"class":273},[222,1389,1298],{"class":277},[222,1391,454],{"class":273},[222,1393,1394],{"class":277},"items",[222,1396,857],{"class":273},[222,1398,1399],{"class":341}," total",[222,1401,206],{"class":273},[222,1403,1298],{"class":277},[222,1405,454],{"class":273},[222,1407,1408],{"class":277},"total",[222,1410,281],{"class":273},[222,1412,281],{"class":273},[222,1414,443],{"class":341},[222,1416,1417],{"class":224,"line":955},[222,1418,317],{"emptyLinePlaceholder":316},[222,1420,1421,1423,1426,1428,1430,1433,1435,1438],{"class":224,"line":984},[222,1422,778],{"class":557},[222,1424,1425],{"class":277}," result",[222,1427,784],{"class":273},[222,1429,1303],{"class":269},[222,1431,1432],{"class":329}," chargeCard",[222,1434,332],{"class":341},[222,1436,1437],{"class":277},"body",[222,1439,443],{"class":341},[222,1441,1442],{"class":224,"line":990},[222,1443,317],{"emptyLinePlaceholder":316},[222,1445,1446,1449,1452,1455,1458,1460,1463,1466],{"class":224,"line":996},[222,1447,1448],{"class":269},"        if",[222,1450,1451],{"class":341}," (",[222,1453,1454],{"class":273},"!",[222,1456,1457],{"class":277},"result",[222,1459,454],{"class":273},[222,1461,1462],{"class":277},"success",[222,1464,1465],{"class":341},") ",[222,1467,335],{"class":273},[222,1469,1470,1473,1475,1477],{"class":224,"line":1001},[222,1471,1472],{"class":269},"          throw",[222,1474,1159],{"class":329},[222,1476,332],{"class":341},[222,1478,335],{"class":273},[222,1480,1482,1485,1487,1489,1492,1494],{"class":224,"line":1481},21,[222,1483,1484],{"class":341},"            message",[222,1486,206],{"class":273},[222,1488,287],{"class":273},[222,1490,1491],{"class":232},"Payment failed",[222,1493,412],{"class":273},[222,1495,362],{"class":273},[222,1497,1499,1502,1504,1507],{"class":224,"line":1498},22,[222,1500,1501],{"class":341},"            status",[222,1503,206],{"class":273},[222,1505,1506],{"class":940}," 402",[222,1508,362],{"class":273},[222,1510,1512,1515,1517,1519,1522,1524],{"class":224,"line":1511},23,[222,1513,1514],{"class":341},"            why",[222,1516,206],{"class":273},[222,1518,287],{"class":273},[222,1520,1521],{"class":232},"Card declined by issuer",[222,1523,412],{"class":273},[222,1525,362],{"class":273},[222,1527,1529,1532,1534,1536,1539,1541],{"class":224,"line":1528},24,[222,1530,1531],{"class":341},"            fix",[222,1533,206],{"class":273},[222,1535,287],{"class":273},[222,1537,1538],{"class":232},"Try a different payment method",[222,1540,412],{"class":273},[222,1542,362],{"class":273},[222,1544,1546,1549,1551,1553,1556,1558],{"class":224,"line":1545},25,[222,1547,1548],{"class":341},"            link",[222,1550,206],{"class":273},[222,1552,287],{"class":273},[222,1554,1555],{"class":232},"https://docs.example.com/payments/declined",[222,1557,412],{"class":273},[222,1559,362],{"class":273},[222,1561,1563,1566],{"class":224,"line":1562},26,[222,1564,1565],{"class":273},"          }",[222,1567,443],{"class":341},[222,1569,1571],{"class":224,"line":1570},27,[222,1572,1573],{"class":273},"        }\n",[222,1575,1577],{"class":224,"line":1576},28,[222,1578,317],{"emptyLinePlaceholder":316},[222,1580,1582,1584,1586,1588,1590,1592,1594,1597,1599,1601,1603,1606,1608,1610,1612,1615,1617],{"class":224,"line":1581},29,[222,1583,958],{"class":269},[222,1585,961],{"class":277},[222,1587,454],{"class":273},[222,1589,966],{"class":329},[222,1591,332],{"class":341},[222,1593,835],{"class":273},[222,1595,1596],{"class":341}," success",[222,1598,206],{"class":273},[222,1600,359],{"class":358},[222,1602,857],{"class":273},[222,1604,1605],{"class":341}," orderId",[222,1607,206],{"class":273},[222,1609,1425],{"class":277},[222,1611,454],{"class":273},[222,1613,1614],{"class":277},"orderId",[222,1616,281],{"class":273},[222,1618,443],{"class":341},[222,1620,1622],{"class":224,"line":1621},30,[222,1623,987],{"class":273},[222,1625,1627],{"class":224,"line":1626},31,[222,1628,993],{"class":273},[222,1630,1632],{"class":224,"line":1631},32,[222,1633,368],{"class":273},[222,1635,1637,1639],{"class":224,"line":1636},33,[222,1638,440],{"class":273},[222,1640,443],{"class":277},[187,1642,1643],{},"The error is captured and logged with both the custom context and structured error fields:",[213,1645,1647],{"className":215,"code":1646,"filename":1012,"language":217,"meta":218,"style":218},"14:58:20 ERROR [my-app] POST /api/checkout 402 in 104ms\n  ├─ error: name=EvlogError message=Payment failed status=402\n  ├─ cart: items=3 total=9999\n  ├─ user: id=user_123 plan=pro\n  └─ requestId: 880a50ac-...\n",[191,1648,1649,1660,1682,1701,1711],{"__ignoreMap":218},[222,1650,1651,1654,1657],{"class":224,"line":225},[222,1652,1653],{"class":228},"14:58:20",[222,1655,1656],{"class":232}," ERROR",[222,1658,1659],{"class":277}," [my-app] POST /api/checkout 402 in 104ms\n",[222,1661,1662,1664,1667,1670,1673,1676,1679],{"class":224,"line":296},[222,1663,1030],{"class":228},[222,1665,1666],{"class":232}," error:",[222,1668,1669],{"class":232}," name=EvlogError",[222,1671,1672],{"class":232}," message=Payment",[222,1674,1675],{"class":232}," failed",[222,1677,1678],{"class":232}," status=",[222,1680,1681],{"class":940},"402\n",[222,1683,1684,1686,1689,1692,1695,1698],{"class":224,"line":313},[222,1685,1030],{"class":228},[222,1687,1688],{"class":232}," cart:",[222,1690,1691],{"class":232}," items=",[222,1693,1694],{"class":940},"3",[222,1696,1697],{"class":232}," total=",[222,1699,1700],{"class":940},"9999\n",[222,1702,1703,1705,1707,1709],{"class":224,"line":320},[222,1704,1030],{"class":228},[222,1706,1062],{"class":232},[222,1708,1065],{"class":232},[222,1710,1068],{"class":232},[222,1712,1713,1715,1717],{"class":224,"line":338},[222,1714,1073],{"class":228},[222,1716,1076],{"class":232},[222,1718,1719],{"class":232}," 880a50ac-...\n",[208,1721,1723],{"id":1722},"parsing-errors-on-the-client","Parsing Errors on the Client",[187,1725,1097,1726,1729],{},[191,1727,1728],{},"parseError"," to extract the structured fields from any error response:",[213,1731,1735],{"className":1732,"code":1733,"language":1734,"meta":218,"style":218},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { parseError } from 'evlog'\n\ntry {\n  const res = await fetch('/api/checkout', {\n    method: 'POST',\n    body: JSON.stringify({ userId: 'user_123' }),\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}\n","tsx",[191,1736,1737,1756,1760,1767,1794,1810,1846,1853,1909,1921,1962],{"__ignoreMap":218},[222,1738,1739,1741,1743,1746,1748,1750,1752,1754],{"class":224,"line":225},[222,1740,270],{"class":269},[222,1742,274],{"class":273},[222,1744,1745],{"class":277}," parseError",[222,1747,281],{"class":273},[222,1749,284],{"class":269},[222,1751,287],{"class":273},[222,1753,706],{"class":232},[222,1755,293],{"class":273},[222,1757,1758],{"class":224,"line":296},[222,1759,317],{"emptyLinePlaceholder":316},[222,1761,1762,1765],{"class":224,"line":313},[222,1763,1764],{"class":269},"try",[222,1766,347],{"class":273},[222,1768,1769,1772,1775,1777,1779,1782,1784,1786,1788,1790,1792],{"class":224,"line":320},[222,1770,1771],{"class":557},"  const",[222,1773,1774],{"class":277}," res",[222,1776,784],{"class":273},[222,1778,1303],{"class":269},[222,1780,1781],{"class":329}," fetch",[222,1783,332],{"class":341},[222,1785,412],{"class":273},[222,1787,1212],{"class":232},[222,1789,412],{"class":273},[222,1791,857],{"class":273},[222,1793,347],{"class":273},[222,1795,1796,1799,1801,1803,1806,1808],{"class":224,"line":338},[222,1797,1798],{"class":341},"    method",[222,1800,206],{"class":273},[222,1802,287],{"class":273},[222,1804,1805],{"class":232},"POST",[222,1807,412],{"class":273},[222,1809,362],{"class":273},[222,1811,1812,1815,1817,1820,1822,1825,1827,1829,1832,1834,1836,1838,1840,1842,1844],{"class":224,"line":350},[222,1813,1814],{"class":341},"    body",[222,1816,206],{"class":273},[222,1818,1819],{"class":277}," JSON",[222,1821,454],{"class":273},[222,1823,1824],{"class":329},"stringify",[222,1826,332],{"class":341},[222,1828,835],{"class":273},[222,1830,1831],{"class":341}," userId",[222,1833,206],{"class":273},[222,1835,287],{"class":273},[222,1837,852],{"class":232},[222,1839,412],{"class":273},[222,1841,281],{"class":273},[222,1843,424],{"class":341},[222,1845,362],{"class":273},[222,1847,1848,1851],{"class":224,"line":365},[222,1849,1850],{"class":273},"  }",[222,1852,443],{"class":341},[222,1854,1855,1858,1860,1862,1865,1867,1870,1872,1875,1877,1880,1882,1884,1886,1888,1890,1892,1894,1897,1899,1901,1903,1906],{"class":224,"line":371},[222,1856,1857],{"class":269},"  if",[222,1859,1451],{"class":341},[222,1861,1454],{"class":273},[222,1863,1864],{"class":277},"res",[222,1866,454],{"class":273},[222,1868,1869],{"class":277},"ok",[222,1871,1465],{"class":341},[222,1873,1874],{"class":269},"throw",[222,1876,274],{"class":273},[222,1878,1879],{"class":341}," data",[222,1881,206],{"class":273},[222,1883,1303],{"class":269},[222,1885,1774],{"class":277},[222,1887,454],{"class":273},[222,1889,966],{"class":329},[222,1891,595],{"class":341},[222,1893,857],{"class":273},[222,1895,1896],{"class":341}," status",[222,1898,206],{"class":273},[222,1900,1774],{"class":277},[222,1902,454],{"class":273},[222,1904,1905],{"class":277},"status",[222,1907,1908],{"class":273}," }\n",[222,1910,1911,1913,1916,1919],{"class":224,"line":382},[222,1912,440],{"class":273},[222,1914,1915],{"class":269}," catch",[222,1917,1918],{"class":277}," (error) ",[222,1920,335],{"class":273},[222,1922,1923,1925,1927,1930,1932,1934,1936,1939,1941,1944,1946,1949,1951,1953,1955,1957,1960],{"class":224,"line":392},[222,1924,1771],{"class":557},[222,1926,274],{"class":273},[222,1928,1929],{"class":277}," message",[222,1931,857],{"class":273},[222,1933,1896],{"class":277},[222,1935,857],{"class":273},[222,1937,1938],{"class":277}," why",[222,1940,857],{"class":273},[222,1942,1943],{"class":277}," fix",[222,1945,857],{"class":273},[222,1947,1948],{"class":277}," link",[222,1950,281],{"class":273},[222,1952,784],{"class":273},[222,1954,1745],{"class":329},[222,1956,332],{"class":341},[222,1958,1959],{"class":277},"error",[222,1961,443],{"class":341},[222,1963,1964],{"class":224,"line":418},[222,1965,1966],{"class":273},"}\n",[196,1968,1970],{"id":1969},"drain-enrichers","Drain & Enrichers",[187,1972,1973,1974,1977],{},"Since TanStack Start uses Nitro v3, configure drains and enrichers via Nitro plugins. Create a ",[191,1975,1976],{},"server/plugins/"," directory and register hooks:",[213,1979,1982],{"className":260,"code":1980,"filename":1981,"language":262,"meta":218,"style":218},"import { definePlugin } from 'nitro'\nimport { createAxiomDrain } from 'evlog/axiom'\n\nexport default definePlugin((nitroApp) => {\n  const axiom = createAxiomDrain()\n\n  nitroApp.hooks.hook('evlog:drain', axiom)\n})\n","server/plugins/evlog-drain.ts",[191,1983,1984,2003,2023,2027,2048,2061,2065,2095],{"__ignoreMap":218},[222,1985,1986,1988,1990,1993,1995,1997,1999,2001],{"class":224,"line":225},[222,1987,270],{"class":269},[222,1989,274],{"class":273},[222,1991,1992],{"class":277}," definePlugin",[222,1994,281],{"class":273},[222,1996,284],{"class":269},[222,1998,287],{"class":273},[222,2000,290],{"class":232},[222,2002,293],{"class":273},[222,2004,2005,2007,2009,2012,2014,2016,2018,2021],{"class":224,"line":296},[222,2006,270],{"class":269},[222,2008,274],{"class":273},[222,2010,2011],{"class":277}," createAxiomDrain",[222,2013,281],{"class":273},[222,2015,284],{"class":269},[222,2017,287],{"class":273},[222,2019,2020],{"class":232},"evlog/axiom",[222,2022,293],{"class":273},[222,2024,2025],{"class":224,"line":313},[222,2026,317],{"emptyLinePlaceholder":316},[222,2028,2029,2031,2033,2035,2037,2039,2042,2044,2046],{"class":224,"line":320},[222,2030,323],{"class":269},[222,2032,326],{"class":269},[222,2034,1992],{"class":329},[222,2036,332],{"class":277},[222,2038,332],{"class":273},[222,2040,2041],{"class":1249},"nitroApp",[222,2043,424],{"class":273},[222,2045,771],{"class":557},[222,2047,347],{"class":273},[222,2049,2050,2052,2055,2057,2059],{"class":224,"line":338},[222,2051,1771],{"class":557},[222,2053,2054],{"class":277}," axiom",[222,2056,784],{"class":273},[222,2058,2011],{"class":329},[222,2060,789],{"class":341},[222,2062,2063],{"class":224,"line":350},[222,2064,317],{"emptyLinePlaceholder":316},[222,2066,2067,2070,2072,2075,2077,2080,2082,2084,2087,2089,2091,2093],{"class":224,"line":365},[222,2068,2069],{"class":277},"  nitroApp",[222,2071,454],{"class":273},[222,2073,2074],{"class":277},"hooks",[222,2076,454],{"class":273},[222,2078,2079],{"class":329},"hook",[222,2081,332],{"class":341},[222,2083,412],{"class":273},[222,2085,2086],{"class":232},"evlog:drain",[222,2088,412],{"class":273},[222,2090,857],{"class":273},[222,2092,2054],{"class":277},[222,2094,443],{"class":341},[222,2096,2097,2099],{"class":224,"line":371},[222,2098,440],{"class":273},[222,2100,443],{"class":277},[213,2102,2105],{"className":260,"code":2103,"filename":2104,"language":262,"meta":218,"style":218},"import { definePlugin } from 'nitro'\nimport { createUserAgentEnricher, createRequestSizeEnricher } from 'evlog/enrichers'\n\nexport default definePlugin((nitroApp) => {\n  const enrichers = [createUserAgentEnricher(), createRequestSizeEnricher()]\n\n  nitroApp.hooks.hook('evlog:enrich', (ctx) => {\n    for (const enricher of enrichers) enricher(ctx)\n  })\n})\n","server/plugins/evlog-enrich.ts",[191,2106,2107,2125,2150,2154,2174,2197,2201,2235,2264,2270],{"__ignoreMap":218},[222,2108,2109,2111,2113,2115,2117,2119,2121,2123],{"class":224,"line":225},[222,2110,270],{"class":269},[222,2112,274],{"class":273},[222,2114,1992],{"class":277},[222,2116,281],{"class":273},[222,2118,284],{"class":269},[222,2120,287],{"class":273},[222,2122,290],{"class":232},[222,2124,293],{"class":273},[222,2126,2127,2129,2131,2134,2136,2139,2141,2143,2145,2148],{"class":224,"line":296},[222,2128,270],{"class":269},[222,2130,274],{"class":273},[222,2132,2133],{"class":277}," createUserAgentEnricher",[222,2135,857],{"class":273},[222,2137,2138],{"class":277}," createRequestSizeEnricher",[222,2140,281],{"class":273},[222,2142,284],{"class":269},[222,2144,287],{"class":273},[222,2146,2147],{"class":232},"evlog/enrichers",[222,2149,293],{"class":273},[222,2151,2152],{"class":224,"line":313},[222,2153,317],{"emptyLinePlaceholder":316},[222,2155,2156,2158,2160,2162,2164,2166,2168,2170,2172],{"class":224,"line":320},[222,2157,323],{"class":269},[222,2159,326],{"class":269},[222,2161,1992],{"class":329},[222,2163,332],{"class":277},[222,2165,332],{"class":273},[222,2167,2041],{"class":1249},[222,2169,424],{"class":273},[222,2171,771],{"class":557},[222,2173,347],{"class":273},[222,2175,2176,2178,2181,2183,2185,2188,2190,2192,2194],{"class":224,"line":338},[222,2177,1771],{"class":557},[222,2179,2180],{"class":277}," enrichers",[222,2182,784],{"class":273},[222,2184,589],{"class":341},[222,2186,2187],{"class":329},"createUserAgentEnricher",[222,2189,595],{"class":341},[222,2191,857],{"class":273},[222,2193,2138],{"class":329},[222,2195,2196],{"class":341},"()]\n",[222,2198,2199],{"class":224,"line":350},[222,2200,317],{"emptyLinePlaceholder":316},[222,2202,2203,2205,2207,2209,2211,2213,2215,2217,2220,2222,2224,2226,2229,2231,2233],{"class":224,"line":365},[222,2204,2069],{"class":277},[222,2206,454],{"class":273},[222,2208,2074],{"class":277},[222,2210,454],{"class":273},[222,2212,2079],{"class":329},[222,2214,332],{"class":341},[222,2216,412],{"class":273},[222,2218,2219],{"class":232},"evlog:enrich",[222,2221,412],{"class":273},[222,2223,857],{"class":273},[222,2225,1451],{"class":273},[222,2227,2228],{"class":1249},"ctx",[222,2230,424],{"class":273},[222,2232,771],{"class":557},[222,2234,347],{"class":273},[222,2236,2237,2240,2242,2245,2248,2251,2253,2255,2258,2260,2262],{"class":224,"line":371},[222,2238,2239],{"class":269},"    for",[222,2241,1451],{"class":341},[222,2243,2244],{"class":557},"const",[222,2246,2247],{"class":277}," enricher",[222,2249,2250],{"class":273}," of",[222,2252,2180],{"class":277},[222,2254,1465],{"class":341},[222,2256,2257],{"class":329},"enricher",[222,2259,332],{"class":341},[222,2261,2228],{"class":277},[222,2263,443],{"class":341},[222,2265,2266,2268],{"class":224,"line":382},[222,2267,1850],{"class":273},[222,2269,443],{"class":341},[222,2271,2272,2274],{"class":224,"line":392},[222,2273,440],{"class":273},[222,2275,443],{"class":277},[196,2277,2279],{"id":2278},"run-locally","Run Locally",[213,2281,2283],{"className":215,"code":2282,"language":217,"meta":218,"style":218},"git clone https://github.com/HugoRCD/evlog.git\ncd evlog/examples/tanstack-start\nbun install\nbun run dev\n",[191,2284,2285,2296,2304,2312],{"__ignoreMap":218},[222,2286,2287,2290,2293],{"class":224,"line":225},[222,2288,2289],{"class":228},"git",[222,2291,2292],{"class":232}," clone",[222,2294,2295],{"class":232}," https://github.com/HugoRCD/evlog.git\n",[222,2297,2298,2301],{"class":224,"line":296},[222,2299,2300],{"class":329},"cd",[222,2302,2303],{"class":232}," evlog/examples/tanstack-start\n",[222,2305,2306,2309],{"class":224,"line":313},[222,2307,2308],{"class":228},"bun",[222,2310,2311],{"class":232}," install\n",[222,2313,2314,2316,2319],{"class":224,"line":320},[222,2315,2308],{"class":228},[222,2317,2318],{"class":232}," run",[222,2320,2321],{"class":232}," dev\n",[187,2323,2324,2325,2331],{},"Open ",[2326,2327,2328],"a",{"href":2328,"rel":2329},"http://localhost:3000",[2330],"nofollow"," and navigate to the evlog Demo page to test the API endpoints.",[2333,2334,2335],"card-group",{},[2336,2337,2341],"card",{"icon":2338,"title":2339,"to":2340},"i-simple-icons-github","Source Code","https://github.com/HugoRCD/evlog/tree/main/examples/tanstack-start","Browse the complete TanStack Start example source on GitHub.",[2343,2344,2345],"style",{},"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 .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 .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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":218,"searchDepth":296,"depth":296,"links":2347},[2348,2354,2355,2358,2359],{"id":198,"depth":296,"text":199,"children":2349},[2350,2351,2353],{"id":210,"depth":313,"text":211},{"id":239,"depth":313,"text":2352},"2. Add nitro.config.ts",{"id":457,"depth":313,"text":458},{"id":627,"depth":296,"text":36},{"id":1093,"depth":296,"text":1094,"children":2356},[2357],{"id":1722,"depth":313,"text":1723},{"id":1969,"depth":296,"text":1970},{"id":2278,"depth":296,"text":2279},"Using evlog with TanStack Start — automatic wide events, structured errors, and logging in API routes and server functions.","md",[2363],{"label":2339,"icon":2338,"to":2340,"color":2364,"variant":2365},"neutral","subtle",{},{"title":147,"icon":150},{"title":147,"description":2360},"Wmkaj98S01W0OTuSkYFqX5Y-7ScNiqPDydsEI4IfStY",[2371,2373],{"title":142,"path":143,"stem":144,"description":2372,"icon":145,"children":-1},"Practical patterns for evlog with Next.js — enrichers, drain pipeline, tail sampling, route-based services, error handling, and client-side logging.",{"title":152,"path":153,"stem":154,"description":2374,"icon":155,"children":-1},"Using evlog with Hono — automatic wide events, structured errors, drain adapters, enrichers, and tail sampling in Hono applications.",1772899532467]