[{"data":1,"prerenderedAt":1773},["ShallowReactive",2],{"navigation_docs":3,"-core-concepts-typed-fields":166,"-core-concepts-typed-fields-surround":1768},[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],{"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",{"id":167,"title":51,"body":168,"description":1757,"extension":1758,"links":1759,"meta":1764,"navigation":1765,"path":52,"seo":1766,"stem":53,"__hash__":1767},"docs/2.core-concepts/4.typed-fields.md",{"type":169,"value":170,"toc":1746},"minimark",[171,192,197,203,666,669,673,688,752,761,765,771,840,843,847,862,995,998,1002,1012,1310,1314,1319,1322,1500,1606,1610,1613,1742],[172,173,174,175,179,180,183,184,187,188,191],"p",{},"By default, ",[176,177,178],"code",{},"useLogger"," accepts any fields — great for getting started. But as your codebase grows, inconsistencies creep in: one route logs ",[176,181,182],{},"user",", another logs ",[176,185,186],{},"account",", a third logs ",[176,189,190],{},"userId",". Typed fields solve this with opt-in compile-time safety.",[193,194,196],"h2",{"id":195},"basic-usage","Basic Usage",[172,198,199,200,202],{},"Define an interface for your fields and pass it as a generic to ",[176,201,178],{},":",[204,205,211],"pre",{"className":206,"code":207,"filename":208,"language":209,"meta":210,"style":210},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { useLogger } from 'evlog'\n\ninterface CheckoutFields {\n  user: { id: string; plan: string }\n  cart: { items: number; total: number }\n  action: string\n}\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger\u003CCheckoutFields>(event)\n\n  log.set({ user: { id: '123', plan: 'pro' } })  // OK\n  log.set({ cart: { items: 3, total: 9999 } })    // OK\n  log.set({ action: 'checkout' })                  // OK\n\n  log.set({ account: '...' })                      // TS error\n  log.set({ usr: { id: '123' } })                  // TS error\n\n  return { success: true }\n})\n","server/api/checkout.post.ts","typescript","",[176,212,213,246,253,267,299,328,339,345,350,384,414,419,480,526,558,563,596,634,639,658],{"__ignoreMap":210},[214,215,218,222,226,230,233,236,239,243],"span",{"class":216,"line":217},"line",1,[214,219,221],{"class":220},"s7zQu","import",[214,223,225],{"class":224},"sMK4o"," {",[214,227,229],{"class":228},"sTEyZ"," useLogger",[214,231,232],{"class":224}," }",[214,234,235],{"class":220}," from",[214,237,238],{"class":224}," '",[214,240,242],{"class":241},"sfazB","evlog",[214,244,245],{"class":224},"'\n",[214,247,249],{"class":216,"line":248},2,[214,250,252],{"emptyLinePlaceholder":251},true,"\n",[214,254,256,260,264],{"class":216,"line":255},3,[214,257,259],{"class":258},"spNyl","interface",[214,261,263],{"class":262},"sBMFI"," CheckoutFields",[214,265,266],{"class":224}," {\n",[214,268,270,274,276,278,281,283,286,289,292,294,296],{"class":216,"line":269},4,[214,271,273],{"class":272},"swJcz","  user",[214,275,202],{"class":224},[214,277,225],{"class":224},[214,279,280],{"class":272}," id",[214,282,202],{"class":224},[214,284,285],{"class":262}," string",[214,287,288],{"class":224},";",[214,290,291],{"class":272}," plan",[214,293,202],{"class":224},[214,295,285],{"class":262},[214,297,298],{"class":224}," }\n",[214,300,302,305,307,309,312,314,317,319,322,324,326],{"class":216,"line":301},5,[214,303,304],{"class":272},"  cart",[214,306,202],{"class":224},[214,308,225],{"class":224},[214,310,311],{"class":272}," items",[214,313,202],{"class":224},[214,315,316],{"class":262}," number",[214,318,288],{"class":224},[214,320,321],{"class":272}," total",[214,323,202],{"class":224},[214,325,316],{"class":262},[214,327,298],{"class":224},[214,329,331,334,336],{"class":216,"line":330},6,[214,332,333],{"class":272},"  action",[214,335,202],{"class":224},[214,337,338],{"class":262}," string\n",[214,340,342],{"class":216,"line":341},7,[214,343,344],{"class":224},"}\n",[214,346,348],{"class":216,"line":347},8,[214,349,252],{"emptyLinePlaceholder":251},[214,351,353,356,359,363,366,369,372,376,379,382],{"class":216,"line":352},9,[214,354,355],{"class":220},"export",[214,357,358],{"class":220}," default",[214,360,362],{"class":361},"s2Zo4"," defineEventHandler",[214,364,365],{"class":228},"(",[214,367,368],{"class":258},"async",[214,370,371],{"class":224}," (",[214,373,375],{"class":374},"sHdIc","event",[214,377,378],{"class":224},")",[214,380,381],{"class":258}," =>",[214,383,266],{"class":224},[214,385,387,390,393,396,398,401,404,407,409,411],{"class":216,"line":386},10,[214,388,389],{"class":258},"  const",[214,391,392],{"class":228}," log",[214,394,395],{"class":224}," =",[214,397,229],{"class":361},[214,399,400],{"class":224},"\u003C",[214,402,403],{"class":262},"CheckoutFields",[214,405,406],{"class":224},">",[214,408,365],{"class":272},[214,410,375],{"class":228},[214,412,413],{"class":272},")\n",[214,415,417],{"class":216,"line":416},11,[214,418,252],{"emptyLinePlaceholder":251},[214,420,422,425,428,431,433,436,439,441,443,445,447,449,452,455,458,460,462,464,467,469,471,473,476],{"class":216,"line":421},12,[214,423,424],{"class":228},"  log",[214,426,427],{"class":224},".",[214,429,430],{"class":361},"set",[214,432,365],{"class":272},[214,434,435],{"class":224},"{",[214,437,438],{"class":272}," user",[214,440,202],{"class":224},[214,442,225],{"class":224},[214,444,280],{"class":272},[214,446,202],{"class":224},[214,448,238],{"class":224},[214,450,451],{"class":241},"123",[214,453,454],{"class":224},"'",[214,456,457],{"class":224},",",[214,459,291],{"class":272},[214,461,202],{"class":224},[214,463,238],{"class":224},[214,465,466],{"class":241},"pro",[214,468,454],{"class":224},[214,470,232],{"class":224},[214,472,232],{"class":224},[214,474,475],{"class":272},")  ",[214,477,479],{"class":478},"sHwdD","// OK\n",[214,481,483,485,487,489,491,493,496,498,500,502,504,508,510,512,514,517,519,521,524],{"class":216,"line":482},13,[214,484,424],{"class":228},[214,486,427],{"class":224},[214,488,430],{"class":361},[214,490,365],{"class":272},[214,492,435],{"class":224},[214,494,495],{"class":272}," cart",[214,497,202],{"class":224},[214,499,225],{"class":224},[214,501,311],{"class":272},[214,503,202],{"class":224},[214,505,507],{"class":506},"sbssI"," 3",[214,509,457],{"class":224},[214,511,321],{"class":272},[214,513,202],{"class":224},[214,515,516],{"class":506}," 9999",[214,518,232],{"class":224},[214,520,232],{"class":224},[214,522,523],{"class":272},")    ",[214,525,479],{"class":478},[214,527,529,531,533,535,537,539,542,544,546,549,551,553,556],{"class":216,"line":528},14,[214,530,424],{"class":228},[214,532,427],{"class":224},[214,534,430],{"class":361},[214,536,365],{"class":272},[214,538,435],{"class":224},[214,540,541],{"class":272}," action",[214,543,202],{"class":224},[214,545,238],{"class":224},[214,547,548],{"class":241},"checkout",[214,550,454],{"class":224},[214,552,232],{"class":224},[214,554,555],{"class":272},")                  ",[214,557,479],{"class":478},[214,559,561],{"class":216,"line":560},15,[214,562,252],{"emptyLinePlaceholder":251},[214,564,566,568,570,572,574,576,579,581,583,586,588,590,593],{"class":216,"line":565},16,[214,567,424],{"class":228},[214,569,427],{"class":224},[214,571,430],{"class":361},[214,573,365],{"class":272},[214,575,435],{"class":224},[214,577,578],{"class":272}," account",[214,580,202],{"class":224},[214,582,238],{"class":224},[214,584,585],{"class":241},"...",[214,587,454],{"class":224},[214,589,232],{"class":224},[214,591,592],{"class":272},")                      ",[214,594,595],{"class":478},"// TS error\n",[214,597,599,601,603,605,607,609,612,614,616,618,620,622,624,626,628,630,632],{"class":216,"line":598},17,[214,600,424],{"class":228},[214,602,427],{"class":224},[214,604,430],{"class":361},[214,606,365],{"class":272},[214,608,435],{"class":224},[214,610,611],{"class":272}," usr",[214,613,202],{"class":224},[214,615,225],{"class":224},[214,617,280],{"class":272},[214,619,202],{"class":224},[214,621,238],{"class":224},[214,623,451],{"class":241},[214,625,454],{"class":224},[214,627,232],{"class":224},[214,629,232],{"class":224},[214,631,555],{"class":272},[214,633,595],{"class":478},[214,635,637],{"class":216,"line":636},18,[214,638,252],{"emptyLinePlaceholder":251},[214,640,642,645,647,650,652,656],{"class":216,"line":641},19,[214,643,644],{"class":220},"  return",[214,646,225],{"class":224},[214,648,649],{"class":272}," success",[214,651,202],{"class":224},[214,653,655],{"class":654},"sfNiH"," true",[214,657,298],{"class":224},[214,659,661,664],{"class":216,"line":660},20,[214,662,663],{"class":224},"}",[214,665,413],{"class":228},[172,667,668],{},"TypeScript catches typos and unknown fields at compile time, before they reach production.",[193,670,672],{"id":671},"internal-fields","Internal Fields",[172,674,675,676,679,680,683,684,687],{},"evlog sets some fields internally (",[176,677,678],{},"status",", ",[176,681,682],{},"service","). These are always accepted regardless of your type, through the ",[176,685,686],{},"InternalFields"," type:",[204,689,691],{"className":206,"code":690,"language":209,"meta":210,"style":210},"log.set({ status: 200 })    // OK — internal field\nlog.set({ service: 'api' }) // OK — internal field\n",[176,692,693,721],{"__ignoreMap":210},[214,694,695,698,700,702,704,706,709,711,714,716,718],{"class":216,"line":217},[214,696,697],{"class":228},"log",[214,699,427],{"class":224},[214,701,430],{"class":361},[214,703,365],{"class":228},[214,705,435],{"class":224},[214,707,708],{"class":272}," status",[214,710,202],{"class":224},[214,712,713],{"class":506}," 200",[214,715,232],{"class":224},[214,717,523],{"class":228},[214,719,720],{"class":478},"// OK — internal field\n",[214,722,723,725,727,729,731,733,736,738,740,743,745,747,750],{"class":216,"line":248},[214,724,697],{"class":228},[214,726,427],{"class":224},[214,728,430],{"class":361},[214,730,365],{"class":228},[214,732,435],{"class":224},[214,734,735],{"class":272}," service",[214,737,202],{"class":224},[214,739,238],{"class":224},[214,741,742],{"class":241},"api",[214,744,454],{"class":224},[214,746,232],{"class":224},[214,748,749],{"class":228},") ",[214,751,720],{"class":478},[172,753,754,755,757,758,760],{},"You don't need to include ",[176,756,678],{}," or ",[176,759,682],{}," in your interface.",[193,762,764],{"id":763},"untyped-usage","Untyped Usage",[172,766,767,768,770],{},"Without a generic, ",[176,769,178],{}," accepts any fields — nothing changes from the default behavior:",[204,772,774],{"className":206,"code":773,"language":209,"meta":210,"style":210},"const log = useLogger(event)\nlog.set({ anything: true, nested: { deep: 'value' } }) // OK\n",[176,775,776,792],{"__ignoreMap":210},[214,777,778,781,784,787,789],{"class":216,"line":217},[214,779,780],{"class":258},"const",[214,782,783],{"class":228}," log ",[214,785,786],{"class":224},"=",[214,788,229],{"class":361},[214,790,791],{"class":228},"(event)\n",[214,793,794,796,798,800,802,804,807,809,811,813,816,818,820,823,825,827,830,832,834,836,838],{"class":216,"line":248},[214,795,697],{"class":228},[214,797,427],{"class":224},[214,799,430],{"class":361},[214,801,365],{"class":228},[214,803,435],{"class":224},[214,805,806],{"class":272}," anything",[214,808,202],{"class":224},[214,810,655],{"class":654},[214,812,457],{"class":224},[214,814,815],{"class":272}," nested",[214,817,202],{"class":224},[214,819,225],{"class":224},[214,821,822],{"class":272}," deep",[214,824,202],{"class":224},[214,826,238],{"class":224},[214,828,829],{"class":241},"value",[214,831,454],{"class":224},[214,833,232],{"class":224},[214,835,232],{"class":224},[214,837,749],{"class":228},[214,839,479],{"class":478},[172,841,842],{},"Typed fields are fully opt-in.",[193,844,846],{"id":845},"nuxt-auto-import","Nuxt Auto-Import",[848,849,852,853,856,857,861],"callout",{"color":850,"icon":851},"warning","i-lucide-triangle-alert","When using typed fields with ",[176,854,855],{},"useLogger\u003CT>",", you ",[858,859,860],"strong",{},"must"," use an explicit import. The Nuxt auto-import does not support excess property checking for generics due to a TypeScript limitation.",[204,863,865],{"className":206,"code":864,"language":209,"meta":210,"style":210},"// Works — explicit import preserves type checking\nimport { useLogger } from 'evlog'\nconst log = useLogger\u003CMyFields>(event)\nlog.set({ typo: 'oops' }) // TS error\n\n// Does NOT work — auto-import loses excess property checking\nconst log = useLogger\u003CMyFields>(event)\nlog.set({ typo: 'oops' }) // No error (silently accepted)\n",[176,866,867,872,890,909,939,943,948,966],{"__ignoreMap":210},[214,868,869],{"class":216,"line":217},[214,870,871],{"class":478},"// Works — explicit import preserves type checking\n",[214,873,874,876,878,880,882,884,886,888],{"class":216,"line":248},[214,875,221],{"class":220},[214,877,225],{"class":224},[214,879,229],{"class":228},[214,881,232],{"class":224},[214,883,235],{"class":220},[214,885,238],{"class":224},[214,887,242],{"class":241},[214,889,245],{"class":224},[214,891,892,894,896,898,900,902,905,907],{"class":216,"line":255},[214,893,780],{"class":258},[214,895,783],{"class":228},[214,897,786],{"class":224},[214,899,229],{"class":361},[214,901,400],{"class":224},[214,903,904],{"class":262},"MyFields",[214,906,406],{"class":224},[214,908,791],{"class":228},[214,910,911,913,915,917,919,921,924,926,928,931,933,935,937],{"class":216,"line":269},[214,912,697],{"class":228},[214,914,427],{"class":224},[214,916,430],{"class":361},[214,918,365],{"class":228},[214,920,435],{"class":224},[214,922,923],{"class":272}," typo",[214,925,202],{"class":224},[214,927,238],{"class":224},[214,929,930],{"class":241},"oops",[214,932,454],{"class":224},[214,934,232],{"class":224},[214,936,749],{"class":228},[214,938,595],{"class":478},[214,940,941],{"class":216,"line":301},[214,942,252],{"emptyLinePlaceholder":251},[214,944,945],{"class":216,"line":330},[214,946,947],{"class":478},"// Does NOT work — auto-import loses excess property checking\n",[214,949,950,952,954,956,958,960,962,964],{"class":216,"line":341},[214,951,780],{"class":258},[214,953,783],{"class":228},[214,955,786],{"class":224},[214,957,229],{"class":361},[214,959,400],{"class":224},[214,961,904],{"class":262},[214,963,406],{"class":224},[214,965,791],{"class":228},[214,967,968,970,972,974,976,978,980,982,984,986,988,990,992],{"class":216,"line":347},[214,969,697],{"class":228},[214,971,427],{"class":224},[214,973,430],{"class":361},[214,975,365],{"class":228},[214,977,435],{"class":224},[214,979,923],{"class":272},[214,981,202],{"class":224},[214,983,238],{"class":224},[214,985,930],{"class":241},[214,987,454],{"class":224},[214,989,232],{"class":224},[214,991,749],{"class":228},[214,993,994],{"class":478},"// No error (silently accepted)\n",[172,996,997],{},"The auto-import works perfectly for untyped usage. Only add the explicit import when you need typed fields.",[193,999,1001],{"id":1000},"outside-nuxt","Outside Nuxt",[172,1003,1004,1005,1008,1009,202],{},"The same generic works with ",[176,1006,1007],{},"createRequestLogger"," and ",[176,1010,1011],{},"createWorkersLogger",[1013,1014,1015,1208],"code-group",{},[204,1016,1019],{"className":206,"code":1017,"filename":1018,"language":209,"meta":210,"style":210},"import { createRequestLogger } from 'evlog'\n\ninterface MyFields {\n  action: string\n  userId: string\n}\n\nconst log = createRequestLogger\u003CMyFields>({\n  method: 'POST',\n  path: '/checkout',\n})\n\nlog.set({ action: 'checkout', userId: '123' }) // OK\nlog.set({ unknown: true })                      // TS error\n","Standalone",[176,1020,1021,1040,1044,1053,1061,1070,1074,1078,1099,1116,1132,1138,1142,1183],{"__ignoreMap":210},[214,1022,1023,1025,1027,1030,1032,1034,1036,1038],{"class":216,"line":217},[214,1024,221],{"class":220},[214,1026,225],{"class":224},[214,1028,1029],{"class":228}," createRequestLogger",[214,1031,232],{"class":224},[214,1033,235],{"class":220},[214,1035,238],{"class":224},[214,1037,242],{"class":241},[214,1039,245],{"class":224},[214,1041,1042],{"class":216,"line":248},[214,1043,252],{"emptyLinePlaceholder":251},[214,1045,1046,1048,1051],{"class":216,"line":255},[214,1047,259],{"class":258},[214,1049,1050],{"class":262}," MyFields",[214,1052,266],{"class":224},[214,1054,1055,1057,1059],{"class":216,"line":269},[214,1056,333],{"class":272},[214,1058,202],{"class":224},[214,1060,338],{"class":262},[214,1062,1063,1066,1068],{"class":216,"line":301},[214,1064,1065],{"class":272},"  userId",[214,1067,202],{"class":224},[214,1069,338],{"class":262},[214,1071,1072],{"class":216,"line":330},[214,1073,344],{"class":224},[214,1075,1076],{"class":216,"line":341},[214,1077,252],{"emptyLinePlaceholder":251},[214,1079,1080,1082,1084,1086,1088,1090,1092,1094,1096],{"class":216,"line":347},[214,1081,780],{"class":258},[214,1083,783],{"class":228},[214,1085,786],{"class":224},[214,1087,1029],{"class":361},[214,1089,400],{"class":224},[214,1091,904],{"class":262},[214,1093,406],{"class":224},[214,1095,365],{"class":228},[214,1097,1098],{"class":224},"{\n",[214,1100,1101,1104,1106,1108,1111,1113],{"class":216,"line":352},[214,1102,1103],{"class":272},"  method",[214,1105,202],{"class":224},[214,1107,238],{"class":224},[214,1109,1110],{"class":241},"POST",[214,1112,454],{"class":224},[214,1114,1115],{"class":224},",\n",[214,1117,1118,1121,1123,1125,1128,1130],{"class":216,"line":386},[214,1119,1120],{"class":272},"  path",[214,1122,202],{"class":224},[214,1124,238],{"class":224},[214,1126,1127],{"class":241},"/checkout",[214,1129,454],{"class":224},[214,1131,1115],{"class":224},[214,1133,1134,1136],{"class":216,"line":416},[214,1135,663],{"class":224},[214,1137,413],{"class":228},[214,1139,1140],{"class":216,"line":421},[214,1141,252],{"emptyLinePlaceholder":251},[214,1143,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166,1169,1171,1173,1175,1177,1179,1181],{"class":216,"line":482},[214,1145,697],{"class":228},[214,1147,427],{"class":224},[214,1149,430],{"class":361},[214,1151,365],{"class":228},[214,1153,435],{"class":224},[214,1155,541],{"class":272},[214,1157,202],{"class":224},[214,1159,238],{"class":224},[214,1161,548],{"class":241},[214,1163,454],{"class":224},[214,1165,457],{"class":224},[214,1167,1168],{"class":272}," userId",[214,1170,202],{"class":224},[214,1172,238],{"class":224},[214,1174,451],{"class":241},[214,1176,454],{"class":224},[214,1178,232],{"class":224},[214,1180,749],{"class":228},[214,1182,479],{"class":478},[214,1184,1185,1187,1189,1191,1193,1195,1198,1200,1202,1204,1206],{"class":216,"line":528},[214,1186,697],{"class":228},[214,1188,427],{"class":224},[214,1190,430],{"class":361},[214,1192,365],{"class":228},[214,1194,435],{"class":224},[214,1196,1197],{"class":272}," unknown",[214,1199,202],{"class":224},[214,1201,655],{"class":654},[214,1203,232],{"class":224},[214,1205,592],{"class":228},[214,1207,595],{"class":478},[204,1209,1212],{"className":206,"code":1210,"filename":1211,"language":209,"meta":210,"style":210},"import { createWorkersLogger } from 'evlog/workers'\n\ninterface MyFields {\n  action: string\n}\n\nconst log = createWorkersLogger\u003CMyFields>(request)\nlog.set({ action: 'process' }) // OK\n","Cloudflare Workers",[176,1213,1214,1234,1238,1246,1254,1258,1262,1281],{"__ignoreMap":210},[214,1215,1216,1218,1220,1223,1225,1227,1229,1232],{"class":216,"line":217},[214,1217,221],{"class":220},[214,1219,225],{"class":224},[214,1221,1222],{"class":228}," createWorkersLogger",[214,1224,232],{"class":224},[214,1226,235],{"class":220},[214,1228,238],{"class":224},[214,1230,1231],{"class":241},"evlog/workers",[214,1233,245],{"class":224},[214,1235,1236],{"class":216,"line":248},[214,1237,252],{"emptyLinePlaceholder":251},[214,1239,1240,1242,1244],{"class":216,"line":255},[214,1241,259],{"class":258},[214,1243,1050],{"class":262},[214,1245,266],{"class":224},[214,1247,1248,1250,1252],{"class":216,"line":269},[214,1249,333],{"class":272},[214,1251,202],{"class":224},[214,1253,338],{"class":262},[214,1255,1256],{"class":216,"line":301},[214,1257,344],{"class":224},[214,1259,1260],{"class":216,"line":330},[214,1261,252],{"emptyLinePlaceholder":251},[214,1263,1264,1266,1268,1270,1272,1274,1276,1278],{"class":216,"line":341},[214,1265,780],{"class":258},[214,1267,783],{"class":228},[214,1269,786],{"class":224},[214,1271,1222],{"class":361},[214,1273,400],{"class":224},[214,1275,904],{"class":262},[214,1277,406],{"class":224},[214,1279,1280],{"class":228},"(request)\n",[214,1282,1283,1285,1287,1289,1291,1293,1295,1297,1299,1302,1304,1306,1308],{"class":216,"line":347},[214,1284,697],{"class":228},[214,1286,427],{"class":224},[214,1288,430],{"class":361},[214,1290,365],{"class":228},[214,1292,435],{"class":224},[214,1294,541],{"class":272},[214,1296,202],{"class":224},[214,1298,238],{"class":224},[214,1300,1301],{"class":241},"process",[214,1303,454],{"class":224},[214,1305,232],{"class":224},[214,1307,749],{"class":228},[214,1309,479],{"class":478},[193,1311,1313],{"id":1312},"design-tips","Design Tips",[1315,1316,1318],"h3",{"id":1317},"one-interface-per-domain","One Interface Per Domain",[172,1320,1321],{},"Define field interfaces per domain area, not per route:",[204,1323,1326],{"className":206,"code":1324,"filename":1325,"language":209,"meta":210,"style":210},"export interface AuthFields {\n  user: { id: string; email: string; role: string }\n  action: string\n  mfaUsed: boolean\n}\n\nexport interface PaymentFields {\n  user: { id: string; plan: string }\n  order: { id: string; total: number; currency: string }\n  payment: { method: string; last4: string }\n}\n","server/types/log-fields.ts",[176,1327,1328,1340,1374,1382,1392,1396,1400,1411,1435,1469,1496],{"__ignoreMap":210},[214,1329,1330,1332,1335,1338],{"class":216,"line":217},[214,1331,355],{"class":220},[214,1333,1334],{"class":258}," interface",[214,1336,1337],{"class":262}," AuthFields",[214,1339,266],{"class":224},[214,1341,1342,1344,1346,1348,1350,1352,1354,1356,1359,1361,1363,1365,1368,1370,1372],{"class":216,"line":248},[214,1343,273],{"class":272},[214,1345,202],{"class":224},[214,1347,225],{"class":224},[214,1349,280],{"class":272},[214,1351,202],{"class":224},[214,1353,285],{"class":262},[214,1355,288],{"class":224},[214,1357,1358],{"class":272}," email",[214,1360,202],{"class":224},[214,1362,285],{"class":262},[214,1364,288],{"class":224},[214,1366,1367],{"class":272}," role",[214,1369,202],{"class":224},[214,1371,285],{"class":262},[214,1373,298],{"class":224},[214,1375,1376,1378,1380],{"class":216,"line":255},[214,1377,333],{"class":272},[214,1379,202],{"class":224},[214,1381,338],{"class":262},[214,1383,1384,1387,1389],{"class":216,"line":269},[214,1385,1386],{"class":272},"  mfaUsed",[214,1388,202],{"class":224},[214,1390,1391],{"class":262}," boolean\n",[214,1393,1394],{"class":216,"line":301},[214,1395,344],{"class":224},[214,1397,1398],{"class":216,"line":330},[214,1399,252],{"emptyLinePlaceholder":251},[214,1401,1402,1404,1406,1409],{"class":216,"line":341},[214,1403,355],{"class":220},[214,1405,1334],{"class":258},[214,1407,1408],{"class":262}," PaymentFields",[214,1410,266],{"class":224},[214,1412,1413,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433],{"class":216,"line":347},[214,1414,273],{"class":272},[214,1416,202],{"class":224},[214,1418,225],{"class":224},[214,1420,280],{"class":272},[214,1422,202],{"class":224},[214,1424,285],{"class":262},[214,1426,288],{"class":224},[214,1428,291],{"class":272},[214,1430,202],{"class":224},[214,1432,285],{"class":262},[214,1434,298],{"class":224},[214,1436,1437,1440,1442,1444,1446,1448,1450,1452,1454,1456,1458,1460,1463,1465,1467],{"class":216,"line":352},[214,1438,1439],{"class":272},"  order",[214,1441,202],{"class":224},[214,1443,225],{"class":224},[214,1445,280],{"class":272},[214,1447,202],{"class":224},[214,1449,285],{"class":262},[214,1451,288],{"class":224},[214,1453,321],{"class":272},[214,1455,202],{"class":224},[214,1457,316],{"class":262},[214,1459,288],{"class":224},[214,1461,1462],{"class":272}," currency",[214,1464,202],{"class":224},[214,1466,285],{"class":262},[214,1468,298],{"class":224},[214,1470,1471,1474,1476,1478,1481,1483,1485,1487,1490,1492,1494],{"class":216,"line":386},[214,1472,1473],{"class":272},"  payment",[214,1475,202],{"class":224},[214,1477,225],{"class":224},[214,1479,1480],{"class":272}," method",[214,1482,202],{"class":224},[214,1484,285],{"class":262},[214,1486,288],{"class":224},[214,1488,1489],{"class":272}," last4",[214,1491,202],{"class":224},[214,1493,285],{"class":262},[214,1495,298],{"class":224},[214,1497,1498],{"class":216,"line":416},[214,1499,344],{"class":224},[204,1501,1504],{"className":206,"code":1502,"filename":1503,"language":209,"meta":210,"style":210},"import { useLogger } from 'evlog'\nimport type { AuthFields } from '~/server/types/log-fields'\n\nexport default defineEventHandler(async (event) => {\n  const log = useLogger\u003CAuthFields>(event)\n  // ...\n})\n","server/api/auth/login.post.ts",[176,1505,1506,1524,1546,1550,1572,1595,1600],{"__ignoreMap":210},[214,1507,1508,1510,1512,1514,1516,1518,1520,1522],{"class":216,"line":217},[214,1509,221],{"class":220},[214,1511,225],{"class":224},[214,1513,229],{"class":228},[214,1515,232],{"class":224},[214,1517,235],{"class":220},[214,1519,238],{"class":224},[214,1521,242],{"class":241},[214,1523,245],{"class":224},[214,1525,1526,1528,1531,1533,1535,1537,1539,1541,1544],{"class":216,"line":248},[214,1527,221],{"class":220},[214,1529,1530],{"class":220}," type",[214,1532,225],{"class":224},[214,1534,1337],{"class":228},[214,1536,232],{"class":224},[214,1538,235],{"class":220},[214,1540,238],{"class":224},[214,1542,1543],{"class":241},"~/server/types/log-fields",[214,1545,245],{"class":224},[214,1547,1548],{"class":216,"line":255},[214,1549,252],{"emptyLinePlaceholder":251},[214,1551,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570],{"class":216,"line":269},[214,1553,355],{"class":220},[214,1555,358],{"class":220},[214,1557,362],{"class":361},[214,1559,365],{"class":228},[214,1561,368],{"class":258},[214,1563,371],{"class":224},[214,1565,375],{"class":374},[214,1567,378],{"class":224},[214,1569,381],{"class":258},[214,1571,266],{"class":224},[214,1573,1574,1576,1578,1580,1582,1584,1587,1589,1591,1593],{"class":216,"line":301},[214,1575,389],{"class":258},[214,1577,392],{"class":228},[214,1579,395],{"class":224},[214,1581,229],{"class":361},[214,1583,400],{"class":224},[214,1585,1586],{"class":262},"AuthFields",[214,1588,406],{"class":224},[214,1590,365],{"class":272},[214,1592,375],{"class":228},[214,1594,413],{"class":272},[214,1596,1597],{"class":216,"line":330},[214,1598,1599],{"class":478},"  // ...\n",[214,1601,1602,1604],{"class":216,"line":341},[214,1603,663],{"class":224},[214,1605,413],{"class":228},[1315,1607,1609],{"id":1608},"keep-interfaces-focused","Keep Interfaces Focused",[172,1611,1612],{},"Include only the fields your routes actually set. The interface doesn't need to mirror your entire data model:",[204,1614,1616],{"className":206,"code":1615,"language":209,"meta":210,"style":210},"// Too broad — most routes won't set all these\ninterface EverythingFields {\n  user: FullUserProfile\n  order: CompleteOrder\n  payment: PaymentDetails\n  shipping: ShippingInfo\n}\n\n// Focused — only what this route sets\ninterface CheckoutFields {\n  user: { id: string; plan: string }\n  cart: { items: number; total: number }\n}\n",[176,1617,1618,1623,1632,1641,1650,1659,1669,1673,1677,1682,1690,1714,1738],{"__ignoreMap":210},[214,1619,1620],{"class":216,"line":217},[214,1621,1622],{"class":478},"// Too broad — most routes won't set all these\n",[214,1624,1625,1627,1630],{"class":216,"line":248},[214,1626,259],{"class":258},[214,1628,1629],{"class":262}," EverythingFields",[214,1631,266],{"class":224},[214,1633,1634,1636,1638],{"class":216,"line":255},[214,1635,273],{"class":272},[214,1637,202],{"class":224},[214,1639,1640],{"class":262}," FullUserProfile\n",[214,1642,1643,1645,1647],{"class":216,"line":269},[214,1644,1439],{"class":272},[214,1646,202],{"class":224},[214,1648,1649],{"class":262}," CompleteOrder\n",[214,1651,1652,1654,1656],{"class":216,"line":301},[214,1653,1473],{"class":272},[214,1655,202],{"class":224},[214,1657,1658],{"class":262}," PaymentDetails\n",[214,1660,1661,1664,1666],{"class":216,"line":330},[214,1662,1663],{"class":272},"  shipping",[214,1665,202],{"class":224},[214,1667,1668],{"class":262}," ShippingInfo\n",[214,1670,1671],{"class":216,"line":341},[214,1672,344],{"class":224},[214,1674,1675],{"class":216,"line":347},[214,1676,252],{"emptyLinePlaceholder":251},[214,1678,1679],{"class":216,"line":352},[214,1680,1681],{"class":478},"// Focused — only what this route sets\n",[214,1683,1684,1686,1688],{"class":216,"line":386},[214,1685,259],{"class":258},[214,1687,263],{"class":262},[214,1689,266],{"class":224},[214,1691,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712],{"class":216,"line":416},[214,1693,273],{"class":272},[214,1695,202],{"class":224},[214,1697,225],{"class":224},[214,1699,280],{"class":272},[214,1701,202],{"class":224},[214,1703,285],{"class":262},[214,1705,288],{"class":224},[214,1707,291],{"class":272},[214,1709,202],{"class":224},[214,1711,285],{"class":262},[214,1713,298],{"class":224},[214,1715,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736],{"class":216,"line":421},[214,1717,304],{"class":272},[214,1719,202],{"class":224},[214,1721,225],{"class":224},[214,1723,311],{"class":272},[214,1725,202],{"class":224},[214,1727,316],{"class":262},[214,1729,288],{"class":224},[214,1731,321],{"class":272},[214,1733,202],{"class":224},[214,1735,316],{"class":262},[214,1737,298],{"class":224},[214,1739,1740],{"class":216,"line":482},[214,1741,344],{"class":224},[1743,1744,1745],"style",{},"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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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);}",{"title":210,"searchDepth":248,"depth":248,"links":1747},[1748,1749,1750,1751,1752,1753],{"id":195,"depth":248,"text":196},{"id":671,"depth":248,"text":672},{"id":763,"depth":248,"text":764},{"id":845,"depth":248,"text":846},{"id":1000,"depth":248,"text":1001},{"id":1312,"depth":248,"text":1313,"children":1754},[1755,1756],{"id":1317,"depth":255,"text":1318},{"id":1608,"depth":255,"text":1609},"Add compile-time type safety to your wide events with TypeScript module augmentation. Prevent typos and ensure consistent field names across your codebase.","md",[1760,1763],{"label":36,"icon":39,"to":37,"color":1761,"variant":1762},"neutral","subtle",{"label":46,"icon":49,"to":47,"color":1761,"variant":1762},{},{"icon":54},{"title":51,"description":1757},"6lqRwhQHa3RPlsdt3Da1OrBoewizoYv68wl5bCaZbmE",[1769,1771],{"title":46,"path":47,"stem":48,"description":1770,"icon":49,"children":-1},"Security guidelines, data sanitization, and production tips for evlog. Learn what not to log and how to protect sensitive data.",{"title":61,"path":62,"stem":63,"description":1772,"icon":64,"children":-1},"Send your logs to external services with evlog adapters. Built-in support for popular observability platforms and custom destinations.",1772879911114]