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