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