[{"data":1,"prerenderedAt":2130},["ShallowReactive",2],{"navigation":3,"-blog-v2-beta":184},[4,91,133,161,168],{"title":5,"path":6,"stem":7,"children":8,"icon":90},"Guide","/guide","1.guide/0.index",[9,12,53,69],{"title":10,"path":6,"stem":7,"icon":11},"Getting Started","pixel:play",{"title":5,"icon":13,"path":14,"stem":15,"children":16,"page":52},"ph:book-open-duotone","/guide/basics","1.guide/1.basics",[17,22,27,32,37,42,47],{"title":18,"path":19,"stem":20,"icon":21},"Request Lifecycle","/guide/basics/lifecycle","1.guide/1.basics/1.lifecycle","icon-park-outline:handle-round",{"title":23,"path":24,"stem":25,"icon":26},"Routing","/guide/basics/routing","1.guide/1.basics/2.routing","solar:routing-bold",{"title":28,"path":29,"stem":30,"icon":31},"Middleware","/guide/basics/middleware","1.guide/1.basics/3.middleware","mdi:middleware-outline",{"title":33,"path":34,"stem":35,"icon":36},"Event Handlers","/guide/basics/handler","1.guide/1.basics/4.handler","mdi:function",{"title":38,"path":39,"stem":40,"icon":41},"Sending Response","/guide/basics/response","1.guide/1.basics/5.response","tabler:json",{"title":43,"path":44,"stem":45,"icon":46},"Error Handling","/guide/basics/error","1.guide/1.basics/6.error","tabler:error-404",{"title":48,"path":49,"stem":50,"icon":51},"Nested Apps","/guide/basics/nested-apps","1.guide/1.basics/7.nested-apps","material-symbols-light:layers-outline",false,{"title":54,"icon":55,"path":56,"stem":57,"children":58,"page":52},"API","material-symbols-light:api-rounded","/guide/api","1.guide/900.api",[59,64],{"title":60,"path":61,"stem":62,"icon":63},"H3","/guide/api/h3","1.guide/900.api/1.h3","material-symbols:bolt-rounded",{"title":65,"path":66,"stem":67,"icon":68},"H3Event","/guide/api/h3event","1.guide/900.api/2.h3event","material-symbols:data-object-rounded",{"title":70,"icon":71,"path":72,"stem":73,"children":74,"page":52},"Advanced","hugeicons:more-01","/guide/advanced","1.guide/901.advanced",[75,80,85],{"title":76,"path":77,"stem":78,"icon":79},"Plugins","/guide/advanced/plugins","1.guide/901.advanced/1.plugins","clarity:plugin-line",{"title":81,"path":82,"stem":83,"icon":84},"WebSockets","/guide/advanced/websocket","1.guide/901.advanced/2.websocket","hugeicons:live-streaming-02",{"title":86,"path":87,"stem":88,"icon":89},"Nightly Builds","/guide/advanced/nightly","1.guide/901.advanced/9.nightly","game-icons:barn-owl","i-ph:book-open-duotone",{"title":92,"path":93,"stem":94,"children":95,"icon":97},"Utils","/utils","2.utils/0.index",[96,98,103,108,113,118,123,128],{"title":92,"path":93,"stem":94,"icon":97},"ph:function-bold",{"title":99,"path":100,"stem":101,"icon":102},"Request","/utils/request","2.utils/1.request","material-symbols-light:input",{"title":104,"path":105,"stem":106,"icon":107},"Response","/utils/response","2.utils/2.response","material-symbols-light:output",{"title":109,"path":110,"stem":111,"icon":112},"Cookie","/utils/cookie","2.utils/3.cookie","material-symbols:cookie-outline",{"title":114,"path":115,"stem":116,"icon":117},"Security","/utils/security","2.utils/4.security","wpf:key-security",{"title":119,"path":120,"stem":121,"icon":122},"Proxy","/utils/proxy","2.utils/5.proxy","arcticons:super-proxy",{"title":124,"path":125,"stem":126,"icon":127},"More utils","/utils/more","2.utils/9.more","mingcute:plus-line",{"title":129,"path":130,"stem":131,"icon":132},"Community","/utils/community","2.utils/99.community","lets-icons:external",{"title":134,"path":135,"stem":136,"children":137,"icon":139},"Examples","/examples","4.examples/0.index",[138,140,145,149,153,157],{"title":134,"path":135,"stem":136,"icon":139},"ph:code",{"title":141,"path":142,"stem":143,"icon":144},"Cookies","/examples/handle-cookie","4.examples/handle-cookie","ph:arrow-right",{"title":146,"path":147,"stem":148,"icon":144},"Sessions","/examples/handle-session","4.examples/handle-session",{"title":150,"path":151,"stem":152,"icon":144},"Static Assets","/examples/serve-static-assets","4.examples/serve-static-assets",{"title":154,"path":155,"stem":156,"icon":144},"Stream Response","/examples/stream-response","4.examples/stream-response",{"title":158,"path":159,"stem":160,"icon":144},"Validate Data","/examples/validate-data","4.examples/validate-data",{"title":162,"path":163,"stem":164,"children":165,"icon":167},"Migration","/migration","5.migration/0.index",[166],{"title":162,"path":163,"stem":164,"icon":167},"icons8:up-round",{"title":169,"path":170,"stem":171,"children":172},"Blog","/blog","99.blog",[173,176,180],{"title":169,"path":170,"stem":174,"icon":175},"99.blog/index","i-lucide-file-text",{"title":177,"path":178,"stem":179,"icon":175},"H3 1.8 - Towards the Edge of the Web","/blog/v1.8","99.blog/1.v1.8",{"title":181,"path":182,"stem":183,"icon":175},"H3 v2 beta","/blog/v2-beta","99.blog/2.v2-beta",{"id":185,"title":181,"body":186,"description":2118,"extension":2119,"meta":2120,"navigation":2127,"path":182,"seo":2128,"stem":183,"__hash__":2129},"content/99.blog/2.v2-beta.md",{"type":187,"value":188,"toc":2107,"icon":175},"minimark",[189,204,224,227,254,273,278,319,329,338,474,484,488,491,544,621,625,628,740,753,770,774,797,806,1095,1104,1158,1163,1167,1180,1185,1934,1942,1946,1949,1957,1961,1986,1989,1996,2028,2032,2060,2064,2069,2084,2095,2103],[190,191,192],"read-more",{"to":6},[193,194,195,196,203],"p",{},"Visit the new ",[197,198,199],"a",{"href":6},[200,201,202],"strong",{},"H3 Guide"," to get started quickly.",[193,205,206,207,213,214,219,220,223],{},"H3 started in late 2020, during the rise of edge workers. With H3 + ",[197,208,212],{"href":209,"rel":210},"https://github.com/unjs/unenv",[211],"nofollow","unjs/unenv",", we could run ",[197,215,218],{"href":216,"rel":217},"https://nitro.build",[211],"Nitro"," deployments in worker environments with Node.js compatibility, best of both worlds! Since ",[197,221,222],{"href":178},"v1.8",", H3 has improved its support for web standards.",[193,225,226],{},"But still, H3 was primarily based on Node.js APIs with a compatibility layer for web standards. Logical choice at the time, given Node.js's popularity amongst JavaScript server runtimes.",[193,228,229,230,235,236,241,242,247,248,253],{},"Thanks to evolving web standards by initiatives like ",[197,231,234],{"href":232,"rel":233},"https://wintertc.org/",[211],"WinterTC"," and runtime support in ",[197,237,240],{"href":238,"rel":239},"https://deno.com/",[211],"Deno",", ",[197,243,246],{"href":244,"rel":245},"https://bun.sh/",[211],"Bun",", and the latest ",[197,249,252],{"href":250,"rel":251},"https://nodejs.org/en",[211],"Node.js",", ecosystem is ready to embrace web standards first class for server development. Benefits include:",[255,256,257,261,264,267,270],"ul",{},[258,259,260],"li",{},"Cross-runtime interoperability (Node.js, Deno, Bun, Workers, etc.)",[258,262,263],{},"Cross-framework compatibility (H3, Hono, Elysia, etc.)",[258,265,266],{},"Cross-environment compatibility (shared and familiar code between frontend and backend)",[258,268,269],{},"Leverage more of runtime native primitives like (Request, URL, Headers, etc.)",[258,271,272],{},"Easier API testing",[274,275,277],"h2",{"id":276},"srvx-universal-web-server-api","💥 srvx: Universal Web Server API",[193,279,280,281,285,286,289,290,292,293,295,296,299,300,305,306,312,313,318],{},"A major challenge was that Node.js lacks built-in support for web-standard HTTP servers. For ",[282,283,284],"code",{},"node:http"," compatibility, an adapter is needed to bridge Node.js ",[282,287,288],{},"IncomingMessage"," to web ",[282,291,99],{},", and to handle web ",[282,294,104],{}," via Node.js ",[282,297,298],{},"ServerResponse",". We have implemented a ",[197,301,304],{"href":302,"rel":303},"https://srvx.h3.dev/guide/node",[211],"compatibility layer"," that bridges interfaces and achieves ",[200,307,308,309,311],{},"up to 96.98% of native ",[282,310,284],{}," performance"," (see ",[197,314,317],{"href":315,"rel":316},"https://github.com/h3js/srvx/tree/main/test/bench-node",[211],"benchmarks",").",[193,320,321,322,241,325,328],{},"Runtimes such as ",[197,323,240],{"href":238,"rel":324},[211],[197,326,246],{"href":244,"rel":327},[211],", and Edge Workers pioneered the adoption of web standards for servers, but they did not agree on the same interface due to lack of enough specs. So how do you access the client IP address and additional context? How do you set the server port and TLS options? How do you handle WebSocket upgrades? Each runtime created its own API.",[193,330,331,332,337],{},"We have created ",[197,333,336],{"href":334,"rel":335},"https://srvx.h3.dev",[211],"💥 srvx",": A unified layer that works everywhere exactly the same. Compatible with Deno, Bun, Node.js, Service Workers, Edge Workers.",[339,340,341,345],"details",{},[342,343,344],"summary",{},"Example",[346,347,352],"pre",{"className":348,"code":349,"language":350,"meta":351,"style":351},"language-js shiki shiki-themes github-light github-dark github-dark","// Dynamic adapter will be used based export conditions of each runtime\nimport { serve } from \"srvx\";\n\nserve({\n  port: 3000,\n  // tls: { cert: \"server.crt\", key: \"server.key\" }\n  fetch(req) {\n    // Server Extensions: req.ip, req.waitUntil(), req.runtime?.{bun,deno,node,cloudflare,...}\n    return new Response(\"👋 Hello there!\");\n  },\n});\n","js","",[282,353,354,363,384,391,401,414,420,436,442,462,468],{"__ignoreMap":351},[355,356,359],"span",{"class":357,"line":358},"line",1,[355,360,362],{"class":361},"sCsY4","// Dynamic adapter will be used based export conditions of each runtime\n",[355,364,366,370,374,377,381],{"class":357,"line":365},2,[355,367,369],{"class":368},"so5gQ","import",[355,371,373],{"class":372},"slsVL"," { serve } ",[355,375,376],{"class":368},"from",[355,378,380],{"class":379},"sfrk1"," \"srvx\"",[355,382,383],{"class":372},";\n",[355,385,387],{"class":357,"line":386},3,[355,388,390],{"emptyLinePlaceholder":389},true,"\n",[355,392,394,398],{"class":357,"line":393},4,[355,395,397],{"class":396},"shcOC","serve",[355,399,400],{"class":372},"({\n",[355,402,404,407,411],{"class":357,"line":403},5,[355,405,406],{"class":372},"  port: ",[355,408,410],{"class":409},"suiK_","3000",[355,412,413],{"class":372},",\n",[355,415,417],{"class":357,"line":416},6,[355,418,419],{"class":361},"  // tls: { cert: \"server.crt\", key: \"server.key\" }\n",[355,421,423,426,429,433],{"class":357,"line":422},7,[355,424,425],{"class":396},"  fetch",[355,427,428],{"class":372},"(",[355,430,432],{"class":431},"sQHwn","req",[355,434,435],{"class":372},") {\n",[355,437,439],{"class":357,"line":438},8,[355,440,441],{"class":361},"    // Server Extensions: req.ip, req.waitUntil(), req.runtime?.{bun,deno,node,cloudflare,...}\n",[355,443,445,448,451,454,456,459],{"class":357,"line":444},9,[355,446,447],{"class":368},"    return",[355,449,450],{"class":368}," new",[355,452,453],{"class":396}," Response",[355,455,428],{"class":372},[355,457,458],{"class":379},"\"👋 Hello there!\"",[355,460,461],{"class":372},");\n",[355,463,465],{"class":357,"line":464},10,[355,466,467],{"class":372},"  },\n",[355,469,471],{"class":357,"line":470},11,[355,472,473],{"class":372},"});\n",[475,476,477],"tip",{},[193,478,479,480,483],{},"\nWith ",[197,481,336],{"href":334,"rel":482},[211]," unifying runtime differences, H3 can remain simpler, focusing exclusively on web standard APIs.",[274,485,487],{"id":486},"h3-tiny-server-composer","⚡ H3: Tiny Server Composer 🎶",[193,489,490],{},"We worked hard to minimize and simplify H3’s scope.",[255,492,493,501,515,524,530,536],{},[258,494,495,496,500],{},"🪶 Optimized for performances, ",[197,497,499],{"href":498},"#lighter-than-a-feather","lighter"," than a feather.",[258,502,503,504,241,507,510,511,514],{},"👌 Intuitive ",[197,505,506],{"href":34},"typed handlers",[197,508,509],{"href":39},"responses"," and ",[197,512,513],{"href":44},"errors",".",[258,516,517,518,510,521,514],{},"🧩 Reusable ",[197,519,520],{"href":29},"middleware",[197,522,523],{"href":77},"plugins",[258,525,526,527,514],{},"🌳 Fast ",[197,528,529],{"href":24},"routing",[258,531,532,533,514],{},"➕ Built-in ",[197,534,535],{"href":93},"utilities",[258,537,538,539,543],{},"❤️ Maximum ",[197,540,542],{"href":541},"/guide/api/h3#h3mount","compatibility"," based on web standards.",[346,545,547],{"className":348,"code":546,"language":350,"meta":351,"style":351},"import { H3, serve } from \"h3\";\n\nconst app = new H3().get(\"/\", () => \"⚡️ Tadaa!\");\n\nserve(app, { port: 3000 });\n",[282,548,549,563,567,605,609],{"__ignoreMap":351},[355,550,551,553,556,558,561],{"class":357,"line":358},[355,552,369],{"class":368},[355,554,555],{"class":372}," { H3, serve } ",[355,557,376],{"class":368},[355,559,560],{"class":379}," \"h3\"",[355,562,383],{"class":372},[355,564,565],{"class":357,"line":365},[355,566,390],{"emptyLinePlaceholder":389},[355,568,569,572,575,578,580,583,586,589,591,594,597,600,603],{"class":357,"line":386},[355,570,571],{"class":368},"const",[355,573,574],{"class":409}," app",[355,576,577],{"class":368}," =",[355,579,450],{"class":368},[355,581,582],{"class":396}," H3",[355,584,585],{"class":372},"().",[355,587,588],{"class":396},"get",[355,590,428],{"class":372},[355,592,593],{"class":379},"\"/\"",[355,595,596],{"class":372},", () ",[355,598,599],{"class":368},"=>",[355,601,602],{"class":379}," \"⚡️ Tadaa!\"",[355,604,461],{"class":372},[355,606,607],{"class":357,"line":393},[355,608,390],{"emptyLinePlaceholder":389},[355,610,611,613,616,618],{"class":357,"line":403},[355,612,397],{"class":396},[355,614,615],{"class":372},"(app, { port: ",[355,617,410],{"class":409},[355,619,620],{"class":372}," });\n",[274,622,624],{"id":623},"lighter-than-a-feather","🪶 Lighter Than a Feather",[193,626,627],{},"We approached benchmarking with a new method that focuses on measuring the overhead introduced by the framework itself, rather than the network layer. Our goal is to optimize all relevant measurements together, making the numbers as close as possible to a baseline where no framework is added or used. This method allowed H3 to achieve optimized latency improvements per request and a dramatically smaller core bundle size.",[629,630,631,647],"table",{},[632,633,634],"thead",{},[635,636,637,641,644],"tr",{},[638,639,640],"th",{},"Measurement",[638,642,643],{},"H3 v1",[638,645,646],{},"🚀 H3 v2",[648,649,650,696],"tbody",{},[635,651,652,656,666],{},[653,654,655],"td",{},"Request Handling",[653,657,658,659,662,663,665],{},"Node: 36 µs ",[660,661],"br",{}," Bun: 27 µs ",[660,664],{}," Deno: 7 ms",[653,667,668,669,672,673,676,677,679,680,672,683,676,686,688,689,672,692,695],{},"Node: ",[200,670,671],{},"7 µs"," (",[200,674,675],{},"5x faster",") ",[660,678],{}," Bun: ",[200,681,682],{},"3 µs",[200,684,685],{},"9x faster",[660,687],{}," Deno: ",[200,690,691],{},"1.2 µs",[200,693,694],{},"156x faster",")",[635,697,698,701,707],{},[653,699,700],{},"Bundle Size",[653,702,703,704,706],{},"min: 101 kB ",[660,705],{}," min+gzip: 39.6 kB",[653,708,709,710,672,713,676,716,718,719,672,722,676,725,727,728,731,732,672,735,739],{},"min: ",[200,711,712],{},"9,1 kB",[200,714,715],{},"91% smaller",[660,717],{}," min+gzip: ",[200,720,721],{},"3.6 kB",[200,723,724],{},"90% smaller",[660,726],{}," min: ",[200,729,730],{},"5.2 kB"," / min+gzip: ",[200,733,734],{},"2.1 kB",[197,736,738],{"href":737},"/guide/basics/handler#handler-fetch","fetchable"," handlers)",[475,741,742],{},[193,743,744,745,748,749,752],{},"\nH3 v2 performance is nearly identical to plain ",[282,746,747],{},"fetch"," handler with ",[282,750,751],{},"new URL(req.url).pathname"," for routing. In other words, you get the benefits of H3 with nearly zero performance cost!",[754,755,756],"note",{},[193,757,758,759,764,765,769],{},"\nBenchmarks apply to the H3 core using the Web Standard target and do not include adapters. They are primarily intended for internal optimization purposes. See the ",[197,760,763],{"href":761,"rel":762},"https://github.com/h3js/h3/tree/main/test/bench",[211],"benchmark"," for details and ",[197,766,768],{"href":315,"rel":767},[211],"srvx benchmarks"," for Node.js adapter performances.",[274,771,773],{"id":772},"typed-web-standards","✅ Typed Web Standards",[193,775,776,777,241,781,241,785,790,791,796],{},"H3 adopts web standard APIs such as ",[197,778,99],{"href":779,"rel":780},"https://developer.mozilla.org/en-US/docs/Web/API/Request",[211],[197,782,104],{"href":783,"rel":784},"https://developer.mozilla.org/en-US/docs/Web/API/Response",[211],[197,786,789],{"href":787,"rel":788},"https://developer.mozilla.org/en-US/docs/Web/API/URL",[211],"URL",", and ",[197,792,795],{"href":793,"rel":794},"https://developer.mozilla.org/en-US/docs/Web/API/Headers",[211],"Headers",", without introducing new conventions on top of the standards.",[193,798,799,800,805],{},"We have launched a new initiative to strongly type Web APIs: ",[197,801,804],{"href":802,"rel":803},"https://github.com/unjs/fetchdts",[211],"✅ fetchdts",". Integrated into the H3, now we combine the best of both worlds—standards and the convenience of types.",[346,807,809],{"className":348,"code":808,"language":350,"meta":351,"style":351},"import { defineHandler } from \"h3\";\n\nconst handler = defineHandler(async (event) => {\n  // URL Parsing\n  const { pathname, searchParams } = event.url;\n\n  // Access to request headers (try auto-completion in editor!)\n  const accept = event.req.headers.get(\"Accept\");\n\n  // Read body\n  const bodyStream = await event.req.body;\n  const bodyText = await event.req.text();\n  const bodyJSON = await event.req.json();\n  const bodyFormData = await event.req.formData();\n\n  // Access to runtime specific context\n  const { deno, bun, node } = event.req.runtime;\n\n  // Prepare response (h3 does this smartly)\n  event.res.headers.set(\"Content-Type\", \"application/json\");\n\n  return { hello: \"web\" };\n});\n",[282,810,811,824,828,857,862,887,891,896,917,921,926,941,962,981,1000,1005,1011,1038,1043,1049,1070,1075,1090],{"__ignoreMap":351},[355,812,813,815,818,820,822],{"class":357,"line":358},[355,814,369],{"class":368},[355,816,817],{"class":372}," { defineHandler } ",[355,819,376],{"class":368},[355,821,560],{"class":379},[355,823,383],{"class":372},[355,825,826],{"class":357,"line":365},[355,827,390],{"emptyLinePlaceholder":389},[355,829,830,832,835,837,840,842,845,847,850,852,854],{"class":357,"line":386},[355,831,571],{"class":368},[355,833,834],{"class":409}," handler",[355,836,577],{"class":368},[355,838,839],{"class":396}," defineHandler",[355,841,428],{"class":372},[355,843,844],{"class":368},"async",[355,846,672],{"class":372},[355,848,849],{"class":431},"event",[355,851,676],{"class":372},[355,853,599],{"class":368},[355,855,856],{"class":372}," {\n",[355,858,859],{"class":357,"line":393},[355,860,861],{"class":361},"  // URL Parsing\n",[355,863,864,867,870,873,875,878,881,884],{"class":357,"line":403},[355,865,866],{"class":368},"  const",[355,868,869],{"class":372}," { ",[355,871,872],{"class":409},"pathname",[355,874,241],{"class":372},[355,876,877],{"class":409},"searchParams",[355,879,880],{"class":372}," } ",[355,882,883],{"class":368},"=",[355,885,886],{"class":372}," event.url;\n",[355,888,889],{"class":357,"line":416},[355,890,390],{"emptyLinePlaceholder":389},[355,892,893],{"class":357,"line":422},[355,894,895],{"class":361},"  // Access to request headers (try auto-completion in editor!)\n",[355,897,898,900,903,905,908,910,912,915],{"class":357,"line":438},[355,899,866],{"class":368},[355,901,902],{"class":409}," accept",[355,904,577],{"class":368},[355,906,907],{"class":372}," event.req.headers.",[355,909,588],{"class":396},[355,911,428],{"class":372},[355,913,914],{"class":379},"\"Accept\"",[355,916,461],{"class":372},[355,918,919],{"class":357,"line":444},[355,920,390],{"emptyLinePlaceholder":389},[355,922,923],{"class":357,"line":464},[355,924,925],{"class":361},"  // Read body\n",[355,927,928,930,933,935,938],{"class":357,"line":470},[355,929,866],{"class":368},[355,931,932],{"class":409}," bodyStream",[355,934,577],{"class":368},[355,936,937],{"class":368}," await",[355,939,940],{"class":372}," event.req.body;\n",[355,942,944,946,949,951,953,956,959],{"class":357,"line":943},12,[355,945,866],{"class":368},[355,947,948],{"class":409}," bodyText",[355,950,577],{"class":368},[355,952,937],{"class":368},[355,954,955],{"class":372}," event.req.",[355,957,958],{"class":396},"text",[355,960,961],{"class":372},"();\n",[355,963,965,967,970,972,974,976,979],{"class":357,"line":964},13,[355,966,866],{"class":368},[355,968,969],{"class":409}," bodyJSON",[355,971,577],{"class":368},[355,973,937],{"class":368},[355,975,955],{"class":372},[355,977,978],{"class":396},"json",[355,980,961],{"class":372},[355,982,984,986,989,991,993,995,998],{"class":357,"line":983},14,[355,985,866],{"class":368},[355,987,988],{"class":409}," bodyFormData",[355,990,577],{"class":368},[355,992,937],{"class":368},[355,994,955],{"class":372},[355,996,997],{"class":396},"formData",[355,999,961],{"class":372},[355,1001,1003],{"class":357,"line":1002},15,[355,1004,390],{"emptyLinePlaceholder":389},[355,1006,1008],{"class":357,"line":1007},16,[355,1009,1010],{"class":361},"  // Access to runtime specific context\n",[355,1012,1014,1016,1018,1021,1023,1026,1028,1031,1033,1035],{"class":357,"line":1013},17,[355,1015,866],{"class":368},[355,1017,869],{"class":372},[355,1019,1020],{"class":409},"deno",[355,1022,241],{"class":372},[355,1024,1025],{"class":409},"bun",[355,1027,241],{"class":372},[355,1029,1030],{"class":409},"node",[355,1032,880],{"class":372},[355,1034,883],{"class":368},[355,1036,1037],{"class":372}," event.req.runtime;\n",[355,1039,1041],{"class":357,"line":1040},18,[355,1042,390],{"emptyLinePlaceholder":389},[355,1044,1046],{"class":357,"line":1045},19,[355,1047,1048],{"class":361},"  // Prepare response (h3 does this smartly)\n",[355,1050,1052,1055,1058,1060,1063,1065,1068],{"class":357,"line":1051},20,[355,1053,1054],{"class":372},"  event.res.headers.",[355,1056,1057],{"class":396},"set",[355,1059,428],{"class":372},[355,1061,1062],{"class":379},"\"Content-Type\"",[355,1064,241],{"class":372},[355,1066,1067],{"class":379},"\"application/json\"",[355,1069,461],{"class":372},[355,1071,1073],{"class":357,"line":1072},21,[355,1074,390],{"emptyLinePlaceholder":389},[355,1076,1078,1081,1084,1087],{"class":357,"line":1077},22,[355,1079,1080],{"class":368},"  return",[355,1082,1083],{"class":372}," { hello: ",[355,1085,1086],{"class":379},"\"web\"",[355,1088,1089],{"class":372}," };\n",[355,1091,1093],{"class":357,"line":1092},23,[355,1094,473],{"class":372},[193,1096,1097,1098,1103],{},"Now go ahead and call handler ",[197,1099,1100],{"href":737},[282,1101,1102],{},".fetch",":",[346,1105,1107],{"className":348,"code":1106,"language":350,"meta":351,"style":351},"const response = await handler.fetch(\"/\");\n\n// 🧙 Typed response: { hello: string; }\nconst json = await response.json();\n",[282,1108,1109,1131,1135,1140],{"__ignoreMap":351},[355,1110,1111,1113,1116,1118,1120,1123,1125,1127,1129],{"class":357,"line":358},[355,1112,571],{"class":368},[355,1114,1115],{"class":409}," response",[355,1117,577],{"class":368},[355,1119,937],{"class":368},[355,1121,1122],{"class":372}," handler.",[355,1124,747],{"class":396},[355,1126,428],{"class":372},[355,1128,593],{"class":379},[355,1130,461],{"class":372},[355,1132,1133],{"class":357,"line":365},[355,1134,390],{"emptyLinePlaceholder":389},[355,1136,1137],{"class":357,"line":386},[355,1138,1139],{"class":361},"// 🧙 Typed response: { hello: string; }\n",[355,1141,1142,1144,1147,1149,1151,1154,1156],{"class":357,"line":393},[355,1143,571],{"class":368},[355,1145,1146],{"class":409}," json",[355,1148,577],{"class":368},[355,1150,937],{"class":368},[355,1152,1153],{"class":372}," response.",[355,1155,978],{"class":396},[355,1157,961],{"class":372},[475,1159,1160],{},[193,1161,1162],{},"\nYou can directly use event handlers as a standalone, even smaller web handlers without h3 core!",[274,1164,1166],{"id":1165},"middleware-and-plugins","🧩 Middleware and Plugins",[193,1168,1169,1170,1173,1174,1179],{},"H3 now offers an ergonomic, composable way to chain middleware using ",[282,1171,1172],{},"next()"," function (inspired by ",[197,1175,1178],{"href":1176,"rel":1177},"https://hono.dev/docs/guides/middleware",[211],"Hono middleware"," 💛).",[193,1181,1182,1183,514],{},"Additionally, we have introduced a simple yet powerful pattern to extend H3 apps using reusable ",[197,1184,523],{"href":77},[1186,1187,1188,1318,1413,1523,1630,1753],"CodeGroup",{},[346,1189,1191],{"className":348,"code":1190,"filename":520,"language":350,"meta":351,"style":351},"import { H3 } from \"h3\";\n\nconst app = new H3().use(async (event, next) => {\n  // ... before response ...\n  const body = await next();\n  // ... after response ...\n  event.res.headers.append(\"x-middleware\", \"works\");\n  event.waitUntil(sendMetrics(event));\n  return body;\n});\n",[282,1192,1193,1206,1210,1246,1251,1267,1272,1291,1307,1314],{"__ignoreMap":351},[355,1194,1195,1197,1200,1202,1204],{"class":357,"line":358},[355,1196,369],{"class":368},[355,1198,1199],{"class":372}," { H3 } ",[355,1201,376],{"class":368},[355,1203,560],{"class":379},[355,1205,383],{"class":372},[355,1207,1208],{"class":357,"line":365},[355,1209,390],{"emptyLinePlaceholder":389},[355,1211,1212,1214,1216,1218,1220,1222,1224,1227,1229,1231,1233,1235,1237,1240,1242,1244],{"class":357,"line":386},[355,1213,571],{"class":368},[355,1215,574],{"class":409},[355,1217,577],{"class":368},[355,1219,450],{"class":368},[355,1221,582],{"class":396},[355,1223,585],{"class":372},[355,1225,1226],{"class":396},"use",[355,1228,428],{"class":372},[355,1230,844],{"class":368},[355,1232,672],{"class":372},[355,1234,849],{"class":431},[355,1236,241],{"class":372},[355,1238,1239],{"class":431},"next",[355,1241,676],{"class":372},[355,1243,599],{"class":368},[355,1245,856],{"class":372},[355,1247,1248],{"class":357,"line":393},[355,1249,1250],{"class":361},"  // ... before response ...\n",[355,1252,1253,1255,1258,1260,1262,1265],{"class":357,"line":403},[355,1254,866],{"class":368},[355,1256,1257],{"class":409}," body",[355,1259,577],{"class":368},[355,1261,937],{"class":368},[355,1263,1264],{"class":396}," next",[355,1266,961],{"class":372},[355,1268,1269],{"class":357,"line":416},[355,1270,1271],{"class":361},"  // ... after response ...\n",[355,1273,1274,1276,1279,1281,1284,1286,1289],{"class":357,"line":422},[355,1275,1054],{"class":372},[355,1277,1278],{"class":396},"append",[355,1280,428],{"class":372},[355,1282,1283],{"class":379},"\"x-middleware\"",[355,1285,241],{"class":372},[355,1287,1288],{"class":379},"\"works\"",[355,1290,461],{"class":372},[355,1292,1293,1296,1299,1301,1304],{"class":357,"line":438},[355,1294,1295],{"class":372},"  event.",[355,1297,1298],{"class":396},"waitUntil",[355,1300,428],{"class":372},[355,1302,1303],{"class":396},"sendMetrics",[355,1305,1306],{"class":372},"(event));\n",[355,1308,1309,1311],{"class":357,"line":444},[355,1310,1080],{"class":368},[355,1312,1313],{"class":372}," body;\n",[355,1315,1316],{"class":357,"line":464},[355,1317,473],{"class":372},[346,1319,1322],{"className":348,"code":1320,"filename":1321,"language":350,"meta":351,"style":351},"import { defineHandler, basicAuth } from \"h3\";\n\nexport default defineHandler({\n  middleware: [basicAuth({ password: \"test\" })],\n  handler: (event) => `Hello ${event.context.basicAuth?.username}!`,\n});\n","basic auth",[282,1323,1324,1337,1341,1353,1370,1409],{"__ignoreMap":351},[355,1325,1326,1328,1331,1333,1335],{"class":357,"line":358},[355,1327,369],{"class":368},[355,1329,1330],{"class":372}," { defineHandler, basicAuth } ",[355,1332,376],{"class":368},[355,1334,560],{"class":379},[355,1336,383],{"class":372},[355,1338,1339],{"class":357,"line":365},[355,1340,390],{"emptyLinePlaceholder":389},[355,1342,1343,1346,1349,1351],{"class":357,"line":386},[355,1344,1345],{"class":368},"export",[355,1347,1348],{"class":368}," default",[355,1350,839],{"class":396},[355,1352,400],{"class":372},[355,1354,1355,1358,1361,1364,1367],{"class":357,"line":393},[355,1356,1357],{"class":372},"  middleware: [",[355,1359,1360],{"class":396},"basicAuth",[355,1362,1363],{"class":372},"({ password: ",[355,1365,1366],{"class":379},"\"test\"",[355,1368,1369],{"class":372}," })],\n",[355,1371,1372,1375,1378,1380,1382,1384,1387,1389,1391,1394,1396,1398,1401,1404,1407],{"class":357,"line":403},[355,1373,1374],{"class":396},"  handler",[355,1376,1377],{"class":372},": (",[355,1379,849],{"class":431},[355,1381,676],{"class":372},[355,1383,599],{"class":368},[355,1385,1386],{"class":379}," `Hello ${",[355,1388,849],{"class":372},[355,1390,514],{"class":379},[355,1392,1393],{"class":372},"context",[355,1395,514],{"class":379},[355,1397,1360],{"class":372},[355,1399,1400],{"class":379},"?.",[355,1402,1403],{"class":372},"username",[355,1405,1406],{"class":379},"}!`",[355,1408,413],{"class":372},[355,1410,1411],{"class":357,"line":416},[355,1412,473],{"class":372},[346,1414,1417],{"className":348,"code":1415,"filename":1416,"language":350,"meta":351,"style":351},"import { H3, onRequest } from \"h3\";\n\nconst app = new H3().use(\n  onRequest((event) => {\n    console.log(`Request: [${event.req.method}] ${event.url.pathname}`);\n  }),\n);\n","onRequest",[282,1418,1419,1432,1436,1455,1471,1514,1519],{"__ignoreMap":351},[355,1420,1421,1423,1426,1428,1430],{"class":357,"line":358},[355,1422,369],{"class":368},[355,1424,1425],{"class":372}," { H3, onRequest } ",[355,1427,376],{"class":368},[355,1429,560],{"class":379},[355,1431,383],{"class":372},[355,1433,1434],{"class":357,"line":365},[355,1435,390],{"emptyLinePlaceholder":389},[355,1437,1438,1440,1442,1444,1446,1448,1450,1452],{"class":357,"line":386},[355,1439,571],{"class":368},[355,1441,574],{"class":409},[355,1443,577],{"class":368},[355,1445,450],{"class":368},[355,1447,582],{"class":396},[355,1449,585],{"class":372},[355,1451,1226],{"class":396},[355,1453,1454],{"class":372},"(\n",[355,1456,1457,1460,1463,1465,1467,1469],{"class":357,"line":393},[355,1458,1459],{"class":396},"  onRequest",[355,1461,1462],{"class":372},"((",[355,1464,849],{"class":431},[355,1466,676],{"class":372},[355,1468,599],{"class":368},[355,1470,856],{"class":372},[355,1472,1473,1476,1479,1481,1484,1486,1488,1490,1492,1495,1498,1500,1502,1505,1507,1509,1512],{"class":357,"line":403},[355,1474,1475],{"class":372},"    console.",[355,1477,1478],{"class":396},"log",[355,1480,428],{"class":372},[355,1482,1483],{"class":379},"`Request: [${",[355,1485,849],{"class":372},[355,1487,514],{"class":379},[355,1489,432],{"class":372},[355,1491,514],{"class":379},[355,1493,1494],{"class":372},"method",[355,1496,1497],{"class":379},"}] ${",[355,1499,849],{"class":372},[355,1501,514],{"class":379},[355,1503,1504],{"class":372},"url",[355,1506,514],{"class":379},[355,1508,872],{"class":372},[355,1510,1511],{"class":379},"}`",[355,1513,461],{"class":372},[355,1515,1516],{"class":357,"line":416},[355,1517,1518],{"class":372},"  }),\n",[355,1520,1521],{"class":357,"line":422},[355,1522,461],{"class":372},[346,1524,1527],{"className":348,"code":1525,"filename":1526,"language":350,"meta":351,"style":351},"import { H3, onResponse } from \"h3\";\n\nconst app = new H3().use(\n  onResponse((response, event) => {\n    console.log(`Response: [${event.req.method}] ${event.url.pathname}`, body);\n  }),\n);\n","onResponse",[282,1528,1529,1542,1546,1564,1584,1622,1626],{"__ignoreMap":351},[355,1530,1531,1533,1536,1538,1540],{"class":357,"line":358},[355,1532,369],{"class":368},[355,1534,1535],{"class":372}," { H3, onResponse } ",[355,1537,376],{"class":368},[355,1539,560],{"class":379},[355,1541,383],{"class":372},[355,1543,1544],{"class":357,"line":365},[355,1545,390],{"emptyLinePlaceholder":389},[355,1547,1548,1550,1552,1554,1556,1558,1560,1562],{"class":357,"line":386},[355,1549,571],{"class":368},[355,1551,574],{"class":409},[355,1553,577],{"class":368},[355,1555,450],{"class":368},[355,1557,582],{"class":396},[355,1559,585],{"class":372},[355,1561,1226],{"class":396},[355,1563,1454],{"class":372},[355,1565,1566,1569,1571,1574,1576,1578,1580,1582],{"class":357,"line":393},[355,1567,1568],{"class":396},"  onResponse",[355,1570,1462],{"class":372},[355,1572,1573],{"class":431},"response",[355,1575,241],{"class":372},[355,1577,849],{"class":431},[355,1579,676],{"class":372},[355,1581,599],{"class":368},[355,1583,856],{"class":372},[355,1585,1586,1588,1590,1592,1595,1597,1599,1601,1603,1605,1607,1609,1611,1613,1615,1617,1619],{"class":357,"line":403},[355,1587,1475],{"class":372},[355,1589,1478],{"class":396},[355,1591,428],{"class":372},[355,1593,1594],{"class":379},"`Response: [${",[355,1596,849],{"class":372},[355,1598,514],{"class":379},[355,1600,432],{"class":372},[355,1602,514],{"class":379},[355,1604,1494],{"class":372},[355,1606,1497],{"class":379},[355,1608,849],{"class":372},[355,1610,514],{"class":379},[355,1612,1504],{"class":372},[355,1614,514],{"class":379},[355,1616,872],{"class":372},[355,1618,1511],{"class":379},[355,1620,1621],{"class":372},", body);\n",[355,1623,1624],{"class":357,"line":416},[355,1625,1518],{"class":372},[355,1627,1628],{"class":357,"line":422},[355,1629,461],{"class":372},[346,1631,1634],{"className":348,"code":1632,"filename":1633,"language":350,"meta":351,"style":351},"import { H3, onError } from \"h3\";\n\nconst app = new H3().use(\n  onError((error, event) => {\n    console.error(\n      `[${event.req.method}] ${event.url.pathname} !! ${error.message}`,\n    );\n  }),\n);\n","onError",[282,1635,1636,1649,1653,1671,1691,1699,1740,1745,1749],{"__ignoreMap":351},[355,1637,1638,1640,1643,1645,1647],{"class":357,"line":358},[355,1639,369],{"class":368},[355,1641,1642],{"class":372}," { H3, onError } ",[355,1644,376],{"class":368},[355,1646,560],{"class":379},[355,1648,383],{"class":372},[355,1650,1651],{"class":357,"line":365},[355,1652,390],{"emptyLinePlaceholder":389},[355,1654,1655,1657,1659,1661,1663,1665,1667,1669],{"class":357,"line":386},[355,1656,571],{"class":368},[355,1658,574],{"class":409},[355,1660,577],{"class":368},[355,1662,450],{"class":368},[355,1664,582],{"class":396},[355,1666,585],{"class":372},[355,1668,1226],{"class":396},[355,1670,1454],{"class":372},[355,1672,1673,1676,1678,1681,1683,1685,1687,1689],{"class":357,"line":393},[355,1674,1675],{"class":396},"  onError",[355,1677,1462],{"class":372},[355,1679,1680],{"class":431},"error",[355,1682,241],{"class":372},[355,1684,849],{"class":431},[355,1686,676],{"class":372},[355,1688,599],{"class":368},[355,1690,856],{"class":372},[355,1692,1693,1695,1697],{"class":357,"line":403},[355,1694,1475],{"class":372},[355,1696,1680],{"class":396},[355,1698,1454],{"class":372},[355,1700,1701,1704,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726,1729,1731,1733,1736,1738],{"class":357,"line":416},[355,1702,1703],{"class":379},"      `[${",[355,1705,849],{"class":372},[355,1707,514],{"class":379},[355,1709,432],{"class":372},[355,1711,514],{"class":379},[355,1713,1494],{"class":372},[355,1715,1497],{"class":379},[355,1717,849],{"class":372},[355,1719,514],{"class":379},[355,1721,1504],{"class":372},[355,1723,514],{"class":379},[355,1725,872],{"class":372},[355,1727,1728],{"class":379},"} !! ${",[355,1730,1680],{"class":372},[355,1732,514],{"class":379},[355,1734,1735],{"class":372},"message",[355,1737,1511],{"class":379},[355,1739,413],{"class":372},[355,1741,1742],{"class":357,"line":422},[355,1743,1744],{"class":372},"    );\n",[355,1746,1747],{"class":357,"line":438},[355,1748,1518],{"class":372},[355,1750,1751],{"class":357,"line":444},[355,1752,461],{"class":372},[346,1754,1756],{"className":348,"code":1755,"filename":523,"language":350,"meta":351,"style":351},"import { H3, serve, definePlugin } from \"h3\";\n\nconst logger = definePlugin((h3, _options) => {\n  if (h3.config.debug) {\n    h3.use((req) => {\n      console.log(`[${req.method}] ${req.url}`);\n    });\n  }\n});\n\nconst app = new H3({ debug: true })\n  .register(logger())\n  .all(\"/**\", () => \"Hello!\");\n",[282,1757,1758,1771,1775,1803,1811,1828,1858,1863,1868,1872,1876,1897,1913],{"__ignoreMap":351},[355,1759,1760,1762,1765,1767,1769],{"class":357,"line":358},[355,1761,369],{"class":368},[355,1763,1764],{"class":372}," { H3, serve, definePlugin } ",[355,1766,376],{"class":368},[355,1768,560],{"class":379},[355,1770,383],{"class":372},[355,1772,1773],{"class":357,"line":365},[355,1774,390],{"emptyLinePlaceholder":389},[355,1776,1777,1779,1782,1784,1787,1789,1792,1794,1797,1799,1801],{"class":357,"line":386},[355,1778,571],{"class":368},[355,1780,1781],{"class":409}," logger",[355,1783,577],{"class":368},[355,1785,1786],{"class":396}," definePlugin",[355,1788,1462],{"class":372},[355,1790,1791],{"class":431},"h3",[355,1793,241],{"class":372},[355,1795,1796],{"class":431},"_options",[355,1798,676],{"class":372},[355,1800,599],{"class":368},[355,1802,856],{"class":372},[355,1804,1805,1808],{"class":357,"line":393},[355,1806,1807],{"class":368},"  if",[355,1809,1810],{"class":372}," (h3.config.debug) {\n",[355,1812,1813,1816,1818,1820,1822,1824,1826],{"class":357,"line":403},[355,1814,1815],{"class":372},"    h3.",[355,1817,1226],{"class":396},[355,1819,1462],{"class":372},[355,1821,432],{"class":431},[355,1823,676],{"class":372},[355,1825,599],{"class":368},[355,1827,856],{"class":372},[355,1829,1830,1833,1835,1837,1840,1842,1844,1846,1848,1850,1852,1854,1856],{"class":357,"line":416},[355,1831,1832],{"class":372},"      console.",[355,1834,1478],{"class":396},[355,1836,428],{"class":372},[355,1838,1839],{"class":379},"`[${",[355,1841,432],{"class":372},[355,1843,514],{"class":379},[355,1845,1494],{"class":372},[355,1847,1497],{"class":379},[355,1849,432],{"class":372},[355,1851,514],{"class":379},[355,1853,1504],{"class":372},[355,1855,1511],{"class":379},[355,1857,461],{"class":372},[355,1859,1860],{"class":357,"line":422},[355,1861,1862],{"class":372},"    });\n",[355,1864,1865],{"class":357,"line":438},[355,1866,1867],{"class":372},"  }\n",[355,1869,1870],{"class":357,"line":444},[355,1871,473],{"class":372},[355,1873,1874],{"class":357,"line":464},[355,1875,390],{"emptyLinePlaceholder":389},[355,1877,1878,1880,1882,1884,1886,1888,1891,1894],{"class":357,"line":470},[355,1879,571],{"class":368},[355,1881,574],{"class":409},[355,1883,577],{"class":368},[355,1885,450],{"class":368},[355,1887,582],{"class":396},[355,1889,1890],{"class":372},"({ debug: ",[355,1892,1893],{"class":409},"true",[355,1895,1896],{"class":372}," })\n",[355,1898,1899,1902,1905,1907,1910],{"class":357,"line":943},[355,1900,1901],{"class":372},"  .",[355,1903,1904],{"class":396},"register",[355,1906,428],{"class":372},[355,1908,1909],{"class":396},"logger",[355,1911,1912],{"class":372},"())\n",[355,1914,1915,1917,1920,1922,1925,1927,1929,1932],{"class":357,"line":964},[355,1916,1901],{"class":372},[355,1918,1919],{"class":396},"all",[355,1921,428],{"class":372},[355,1923,1924],{"class":379},"\"/**\"",[355,1926,596],{"class":372},[355,1928,599],{"class":368},[355,1930,1931],{"class":379}," \"Hello!\"",[355,1933,461],{"class":372},[754,1935,1936],{},[193,1937,1938,1939,1941],{},"\nAccepting ",[282,1940,1239],{}," callback is optional. Middleware can be written like v1 without returning a response.",[274,1943,1945],{"id":1944},"️-migration-from-version-1","⬆️ Migration from Version 1",[193,1947,1948],{},"We've tried to minimize breaking changes. Most of utilities preserved backward compatibility.",[190,1950,1951],{"to":163},[193,1952,1953,1954,514],{},"Check out ",[197,1955,1956],{"href":163},"Migration Guide",[274,1958,1960],{"id":1959},"unified-http-server-tools-for-everyone","🙌 Unified H(TTP) Server Tools for Everyone",[193,1962,1963,1964,1969,1970,1975,1976,1981,1982,1179],{},"H3 and related projects moved to a dedicated ",[197,1965,1968],{"href":1966,"rel":1967},"https://github.com/h3js",[211],"github org"," and new ",[197,1971,1974],{"href":1972,"rel":1973},"https://h3.dev",[211],"h3.dev"," domain (thanks to the donation from ",[197,1977,1980],{"href":1978,"rel":1979},"https://syntax.fm/",[211],"syntax.fm"," and other ",[197,1983,1985],{"href":1984},"/#sponsors","sponsors",[193,1987,1988],{},"Under the H3 umbrella, we maintain several key components for universal JavaScript servers.",[193,1990,1991,1992,1995],{},"All fully open and usable with ",[200,1993,1994],{},"or without"," H3, and with any JavaScript runtime.",[255,1997,1998,2006,2014,2020],{},[258,1999,2000,2005],{},[197,2001,2004],{"href":2002,"rel":2003},"https://github.com/h3js/h3",[211],"⚡️ h3",": Minimal HTTP Framework.",[258,2007,2008,2013],{},[197,2009,2012],{"href":2010,"rel":2011},"https://github.com/h3js/rou3",[211],"🌳 rou3",": Lightweight JavaScript Router.",[258,2015,2016,2019],{},[197,2017,336],{"href":334,"rel":2018},[211],": Universal Web-based Server API.",[258,2021,2022,2027],{},[197,2023,2026],{"href":2024,"rel":2025},"https://crossws.h3.dev",[211],"🔌 crossws",": Cross-platform WebSocket support.",[274,2029,2031],{"id":2030},"️-special-thanks","❤️ Special Thanks",[193,2033,2034,2035,2040,2041,2046,2047,510,2052,790,2057,2059],{},"This release would not have been possible without wonderful ",[197,2036,2039],{"href":2037,"rel":2038},"https://github.com/h3js/h3/graphs/contributors",[211],"contributors",", feedback from the ",[197,2042,2045],{"href":2043,"rel":2044},"https://discord.h3.dev",[211],"community",", inspirations from web-standard frameworks including ",[197,2048,2051],{"href":2049,"rel":2050},"https://hono.dev/",[211],"Hono",[197,2053,2056],{"href":2054,"rel":2055},"https://elysiajs.com/",[211],"Elysia",[197,2058,1985],{"href":1984}," who made it possible to work on open source.",[274,2061,2063],{"id":2062},"️-roadmap-to-v2-stable","🗺️ Roadmap to v2 (stable)",[193,2065,2066],{},[200,2067,2068],{},"Next steps:",[255,2070,2071,2074,2077],{},[258,2072,2073],{},"Gather feedback from community.",[258,2075,2076],{},"Finalize API updates based on feedbacks.",[258,2078,2079,2080,2083],{},"Ensure ecosystem compatibility and upgrade for ",[197,2081,218],{"href":216,"rel":2082},[211]," v3.",[2085,2086,2087],"callout",{"to":2043},[193,2088,2089,2090,2094],{},"Join our ",[197,2091,2093],{"href":2043,"rel":2092},[211],"Discord"," to share your experience and feedback!",[190,2096,2097],{"to":6},[193,2098,195,2099,203],{},[197,2100,2101],{"href":6},[200,2102,202],{},[2104,2105,2106],"style",{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .slsVL, html code.shiki .slsVL{--shiki-light:#24292E;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sfrk1, html code.shiki .sfrk1{--shiki-light:#032F62;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}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":351,"searchDepth":365,"depth":365,"links":2108},[2109,2110,2111,2112,2113,2114,2115,2116,2117],{"id":276,"depth":365,"text":277},{"id":486,"depth":365,"text":487},{"id":623,"depth":365,"text":624},{"id":772,"depth":365,"text":773},{"id":1165,"depth":365,"text":1166},{"id":1944,"depth":365,"text":1945},{"id":1959,"depth":365,"text":1960},{"id":2030,"depth":365,"text":2031},{"id":2062,"depth":365,"text":2063},"⚡ H3 v2 beta is here — fully rewritten on web standards, backward-compatible, and faster than ever!","md",{"date":2121,"category":2122,"authors":2123,"icon":175},"2025-06-10","release",[2124],{"name":2125,"github":2126},"Pooya Parsa","pi0",{"icon":175},{"title":181,"description":2118},"_Gc1GFOhnKksZAwOYig0rmBniGFvwtrf58WA-j5AdSQ",1768646385964]