[{"data":1,"prerenderedAt":4577},["ShallowReactive",2],{"navigation":3,"-docs-routing":402,"-docs-routing-surround":4573},[4,93,226,232,387,399],{"title":5,"path":6,"stem":7,"children":8,"icon":92},"","\u002Fdocs","1.docs\u002F1.index",[9,12,17,22,27,32,37,42,47,52,57,62,67,72,77,82,87],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-compass",{"title":13,"path":14,"stem":15,"icon":16},"Quick Start","\u002Fdocs\u002Fquick-start","1.docs\u002F2.quick-start","i-lucide-zap",{"title":18,"path":19,"stem":20,"icon":21},"Renderer","\u002Fdocs\u002Frenderer","1.docs\u002F4.renderer","ri:layout-masonry-line",{"title":23,"path":24,"stem":25,"icon":26},"Routing","\u002Fdocs\u002Frouting","1.docs\u002F5.routing","ri:direction-line",{"title":28,"path":29,"stem":30,"icon":31},"Assets","\u002Fdocs\u002Fassets","1.docs\u002F50.assets","ri:image-2-line",{"title":33,"path":34,"stem":35,"icon":36},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F50.configuration","ri:settings-3-line",{"title":38,"path":39,"stem":40,"icon":41},"Database","\u002Fdocs\u002Fdatabase","1.docs\u002F50.database","ri:database-2-line",{"title":43,"path":44,"stem":45,"icon":46},"Lifecycle","\u002Fdocs\u002Flifecycle","1.docs\u002F50.lifecycle","i-lucide-layers",{"title":48,"path":49,"stem":50,"icon":51},"OpenAPI","\u002Fdocs\u002Fopenapi","1.docs\u002F50.openapi","ri:contract-line",{"title":53,"path":54,"stem":55,"icon":56},"Plugins","\u002Fdocs\u002Fplugins","1.docs\u002F50.plugins","ri:plug-line",{"title":58,"path":59,"stem":60,"icon":61},"Tasks","\u002Fdocs\u002Ftasks","1.docs\u002F50.tasks","codicon:run-all",{"title":63,"path":64,"stem":65,"icon":66},"WebSocket","\u002Fdocs\u002Fwebsocket","1.docs\u002F50.websocket","ri:broadcast-fill",{"title":68,"path":69,"stem":70,"icon":71},"Server Entry","\u002Fdocs\u002Fserver-entry","1.docs\u002F6.server-entry","ri:server-line",{"title":73,"path":74,"stem":75,"icon":76},"Cache","\u002Fdocs\u002Fcache","1.docs\u002F7.cache","ri:speed-line",{"title":78,"path":79,"stem":80,"icon":81},"KV Storage","\u002Fdocs\u002Fstorage","1.docs\u002F8.storage","carbon:datastore",{"title":83,"path":84,"stem":85,"icon":86},"Migration Guide","\u002Fdocs\u002Fmigration","1.docs\u002F99.migration","ri:arrow-right-up-line",{"title":88,"path":89,"stem":90,"icon":91},"Nightly Channel","\u002Fdocs\u002Fnightly","1.docs\u002F99.nightly","ri:moon-fill","i-lucide-book-open",{"title":94,"path":95,"stem":96,"children":97,"icon":99},"Deploy","\u002Fdeploy","2.deploy\u002F0.index",[98,100,121],{"title":94,"path":95,"stem":96,"icon":99},"ri:upload-cloud-2-line",{"title":101,"path":102,"stem":103,"children":104,"page":120},"Runtimes","\u002Fdeploy\u002Fruntimes","2.deploy\u002F10.runtimes",[105,110,115],{"title":106,"path":107,"stem":108,"icon":109},"Node.js","\u002Fdeploy\u002Fruntimes\u002Fnode","2.deploy\u002F10.runtimes\u002F1.node","akar-icons:node-fill",{"title":111,"path":112,"stem":113,"icon":114},"Bun","\u002Fdeploy\u002Fruntimes\u002Fbun","2.deploy\u002F10.runtimes\u002Fbun","simple-icons:bun",{"title":116,"path":117,"stem":118,"icon":119},"Deno","\u002Fdeploy\u002Fruntimes\u002Fdeno","2.deploy\u002F10.runtimes\u002Fdeno","simple-icons:deno",false,{"title":122,"path":123,"stem":124,"children":125,"page":120},"Providers","\u002Fdeploy\u002Fproviders","2.deploy\u002F20.providers",[126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222],{"title":127,"path":128,"stem":129},"Alwaysdata","\u002Fdeploy\u002Fproviders\u002Falwaysdata","2.deploy\u002F20.providers\u002Falwaysdata",{"title":131,"path":132,"stem":133},"AWS Lambda","\u002Fdeploy\u002Fproviders\u002Faws","2.deploy\u002F20.providers\u002Faws",{"title":135,"path":136,"stem":137},"AWS Amplify","\u002Fdeploy\u002Fproviders\u002Faws-amplify","2.deploy\u002F20.providers\u002Faws-amplify",{"title":139,"path":140,"stem":141},"Azure","\u002Fdeploy\u002Fproviders\u002Fazure","2.deploy\u002F20.providers\u002Fazure",{"title":143,"path":144,"stem":145},"Cleavr","\u002Fdeploy\u002Fproviders\u002Fcleavr","2.deploy\u002F20.providers\u002Fcleavr",{"title":147,"path":148,"stem":149},"Cloudflare","\u002Fdeploy\u002Fproviders\u002Fcloudflare","2.deploy\u002F20.providers\u002Fcloudflare",{"title":151,"path":152,"stem":153},"Deno Deploy","\u002Fdeploy\u002Fproviders\u002Fdeno-deploy","2.deploy\u002F20.providers\u002Fdeno-deploy",{"title":155,"path":156,"stem":157},"DigitalOcean","\u002Fdeploy\u002Fproviders\u002Fdigitalocean","2.deploy\u002F20.providers\u002Fdigitalocean",{"title":159,"path":160,"stem":161},"EdgeOne Pages","\u002Fdeploy\u002Fproviders\u002Fedgeone","2.deploy\u002F20.providers\u002Fedgeone",{"title":163,"path":164,"stem":165},"Firebase","\u002Fdeploy\u002Fproviders\u002Ffirebase","2.deploy\u002F20.providers\u002Ffirebase",{"title":167,"path":168,"stem":169},"Flightcontrol","\u002Fdeploy\u002Fproviders\u002Fflightcontrol","2.deploy\u002F20.providers\u002Fflightcontrol",{"title":171,"path":172,"stem":173},"Genezio","\u002Fdeploy\u002Fproviders\u002Fgenezio","2.deploy\u002F20.providers\u002Fgenezio",{"title":175,"path":176,"stem":177},"GitHub Pages","\u002Fdeploy\u002Fproviders\u002Fgithub-pages","2.deploy\u002F20.providers\u002Fgithub-pages",{"title":179,"path":180,"stem":181},"GitLab Pages","\u002Fdeploy\u002Fproviders\u002Fgitlab-pages","2.deploy\u002F20.providers\u002Fgitlab-pages",{"title":183,"path":184,"stem":185},"Heroku","\u002Fdeploy\u002Fproviders\u002Fheroku","2.deploy\u002F20.providers\u002Fheroku",{"title":187,"path":188,"stem":189},"IIS","\u002Fdeploy\u002Fproviders\u002Fiis","2.deploy\u002F20.providers\u002Fiis",{"title":191,"path":192,"stem":193},"Koyeb","\u002Fdeploy\u002Fproviders\u002Fkoyeb","2.deploy\u002F20.providers\u002Fkoyeb",{"title":195,"path":196,"stem":197},"Netlify","\u002Fdeploy\u002Fproviders\u002Fnetlify","2.deploy\u002F20.providers\u002Fnetlify",{"title":199,"path":200,"stem":201},"Platform.sh","\u002Fdeploy\u002Fproviders\u002Fplatform-sh","2.deploy\u002F20.providers\u002Fplatform-sh",{"title":203,"path":204,"stem":205},"Render.com","\u002Fdeploy\u002Fproviders\u002Frender","2.deploy\u002F20.providers\u002Frender",{"title":207,"path":208,"stem":209},"StormKit","\u002Fdeploy\u002Fproviders\u002Fstormkit","2.deploy\u002F20.providers\u002Fstormkit",{"title":211,"path":212,"stem":213},"Vercel","\u002Fdeploy\u002Fproviders\u002Fvercel","2.deploy\u002F20.providers\u002Fvercel",{"title":215,"path":216,"stem":217},"Zeabur","\u002Fdeploy\u002Fproviders\u002Fzeabur","2.deploy\u002F20.providers\u002Fzeabur",{"title":219,"path":220,"stem":221},"Zephyr Cloud","\u002Fdeploy\u002Fproviders\u002Fzephyr","2.deploy\u002F20.providers\u002Fzephyr",{"title":223,"path":224,"stem":225},"Zerops","\u002Fdeploy\u002Fproviders\u002Fzerops","2.deploy\u002F20.providers\u002Fzerops",{"title":227,"path":228,"stem":229,"children":230,"icon":36},"Config","\u002Fconfig","3.config\u002F0.index",[231],{"title":227,"path":228,"stem":229,"icon":36},{"title":233,"path":234,"stem":235,"children":236,"icon":238},"Examples","\u002Fexamples","4.examples\u002F0.index",[237,239,244,249,254,259,263,268,273,278,283,288,293,297,302,306,310,315,320,325,330,335,340,345,350,355,359,364,369,373,378,383],{"title":233,"path":234,"stem":235,"icon":238},"i-lucide-folder-code",{"title":240,"path":241,"stem":242,"icon":243},"API Routes","\u002Fexamples\u002Fapi-routes","4.examples\u002Fapi-routes","i-lucide-route",{"title":245,"path":246,"stem":247,"icon":248},"Auto Imports","\u002Fexamples\u002Fauto-imports","4.examples\u002Fauto-imports","i-lucide-import",{"title":250,"path":251,"stem":252,"icon":253},"Cached Handler","\u002Fexamples\u002Fcached-handler","4.examples\u002Fcached-handler","i-lucide-clock",{"title":255,"path":256,"stem":257,"icon":258},"Custom Error Handler","\u002Fexamples\u002Fcustom-error-handler","4.examples\u002Fcustom-error-handler","i-lucide-alert-circle",{"title":38,"path":260,"stem":261,"icon":262},"\u002Fexamples\u002Fdatabase","4.examples\u002Fdatabase","i-lucide-database",{"title":264,"path":265,"stem":266,"icon":267},"Elysia","\u002Fexamples\u002Felysia","4.examples\u002Felysia","i-skill-icons-elysia-dark",{"title":269,"path":270,"stem":271,"icon":272},"Express","\u002Fexamples\u002Fexpress","4.examples\u002Fexpress","i-simple-icons-express",{"title":274,"path":275,"stem":276,"icon":277},"Fastify","\u002Fexamples\u002Ffastify","4.examples\u002Ffastify","i-simple-icons-fastify",{"title":279,"path":280,"stem":281,"icon":282},"Hello World","\u002Fexamples\u002Fhello-world","4.examples\u002Fhello-world","i-lucide-sparkles",{"title":284,"path":285,"stem":286,"icon":287},"Hono","\u002Fexamples\u002Fhono","4.examples\u002Fhono","i-logos-hono",{"title":289,"path":290,"stem":291,"icon":292},"Import Alias","\u002Fexamples\u002Fimport-alias","4.examples\u002Fimport-alias","i-lucide-at-sign",{"title":294,"path":295,"stem":296,"icon":46},"Middleware","\u002Fexamples\u002Fmiddleware","4.examples\u002Fmiddleware",{"title":298,"path":299,"stem":300,"icon":301},"Mono JSX","\u002Fexamples\u002Fmono-jsx","4.examples\u002Fmono-jsx","i-lucide-brackets",{"title":303,"path":304,"stem":305,"icon":301},"Nano JSX","\u002Fexamples\u002Fnano-jsx","4.examples\u002Fnano-jsx",{"title":53,"path":307,"stem":308,"icon":309},"\u002Fexamples\u002Fplugins","4.examples\u002Fplugins","i-lucide-plug",{"title":311,"path":312,"stem":313,"icon":314},"Custom Renderer","\u002Fexamples\u002Frenderer","4.examples\u002Frenderer","i-lucide-code",{"title":316,"path":317,"stem":318,"icon":319},"Runtime Config","\u002Fexamples\u002Fruntime-config","4.examples\u002Fruntime-config","i-lucide-settings",{"title":321,"path":322,"stem":323,"icon":324},"Server Fetch","\u002Fexamples\u002Fserver-fetch","4.examples\u002Fserver-fetch","i-lucide-arrow-right-left",{"title":326,"path":327,"stem":328,"icon":329},"Shiki","\u002Fexamples\u002Fshiki","4.examples\u002Fshiki","i-lucide-highlighter",{"title":331,"path":332,"stem":333,"icon":334},"Virtual Routes","\u002Fexamples\u002Fvirtual-routes","4.examples\u002Fvirtual-routes","i-lucide-box",{"title":336,"path":337,"stem":338,"icon":339},"Vite Nitro Plugin","\u002Fexamples\u002Fvite-nitro-plugin","4.examples\u002Fvite-nitro-plugin","i-logos-vitejs",{"title":341,"path":342,"stem":343,"icon":344},"Vite RSC","\u002Fexamples\u002Fvite-rsc","4.examples\u002Fvite-rsc","i-logos-react",{"title":346,"path":347,"stem":348,"icon":349},"Vite SSR HTML","\u002Fexamples\u002Fvite-ssr-html","4.examples\u002Fvite-ssr-html","i-logos-html-5",{"title":351,"path":352,"stem":353,"icon":354},"SSR with Preact","\u002Fexamples\u002Fvite-ssr-preact","4.examples\u002Fvite-ssr-preact","i-logos-preact",{"title":356,"path":357,"stem":358,"icon":344},"SSR with React","\u002Fexamples\u002Fvite-ssr-react","4.examples\u002Fvite-ssr-react",{"title":360,"path":361,"stem":362,"icon":363},"SSR with SolidJS","\u002Fexamples\u002Fvite-ssr-solid","4.examples\u002Fvite-ssr-solid","i-logos-solidjs-icon",{"title":365,"path":366,"stem":367,"icon":368},"SSR with TanStack Router","\u002Fexamples\u002Fvite-ssr-tsr-react","4.examples\u002Fvite-ssr-tsr-react","i-simple-icons-tanstack",{"title":370,"path":371,"stem":372,"icon":368},"SSR with TanStack Start","\u002Fexamples\u002Fvite-ssr-tss-react","4.examples\u002Fvite-ssr-tss-react",{"title":374,"path":375,"stem":376,"icon":377},"SSR with Vue Router","\u002Fexamples\u002Fvite-ssr-vue-router","4.examples\u002Fvite-ssr-vue-router","i-logos-vue",{"title":379,"path":380,"stem":381,"icon":382},"Vite + tRPC","\u002Fexamples\u002Fvite-trpc","4.examples\u002Fvite-trpc","i-simple-icons-trpc",{"title":63,"path":384,"stem":385,"icon":386},"\u002Fexamples\u002Fwebsocket","4.examples\u002Fwebsocket","i-lucide-radio",{"title":388,"path":389,"stem":390,"children":391},"Blog","\u002Fblog","9.blog",[392,395],{"title":388,"path":389,"stem":393,"icon":394},"9.blog\u002Findex","i-lucide-file-text",{"title":396,"path":397,"stem":398,"icon":394},"Nitro v3 Beta is here!","\u002Fblog\u002Fv3-beta","9.blog\u002F1.v3-beta",{"title":5,"path":400,"stem":401},"\u002F","index",{"id":403,"title":23,"body":404,"description":4568,"extension":2121,"meta":4569,"navigation":4570,"path":24,"seo":4571,"stem":25,"__hash__":4572},"content\u002F1.docs\u002F5.routing.md",{"type":405,"value":406,"toc":4528,"icon":26},"minimark",[407,412,429,585,589,606,614,622,625,674,679,690,693,735,741,746,755,758,812,816,820,843,926,933,943,947,959,1045,1049,1059,1132,1137,1146,1150,1161,1191,1387,1391,1394,1400,1461,1465,1484,1487,1511,1524,1528,1535,1617,1621,1627,1633,1639,1764,1767,1883,1889,1894,1975,1978,2101,2103,2106,2111,2117,2153,2157,2160,2224,2235,2243,2247,2254,2260,2377,2384,2388,2391,2415,2418,2442,2475,2479,2482,2485,2488,2573,2577,2591,2665,2675,2679,2687,2698,2707,2711,2721,2731,2735,2738,2747,2789,2803,2814,2821,3028,3032,3035,3042,3140,3143,3146,3222,3225,3244,3249,3324,3327,3334,3433,3436,3439,3575,3579,3582,3691,3695,3707,3847,3864,3867,3870,3936,3940,3943,4058,4062,4219,4223,4230,4309,4313,4316,4524],[408,409,411],"h2",{"id":410},"request-handler","Request handler",[413,414,415,416,420,421,428],"p",{},"Nitro request handler is a function accepting an ",[417,418,419],"code",{},"event"," object, which is a ",[422,423,427],"a",{"href":424,"rel":425},"https:\u002F\u002Fh3.dev\u002Fguide\u002Fapi\u002Fh3event#h3event-properties",[426],"nofollow","H3Event"," object.",[430,431,432,522],"code-group",{},[433,434,439],"pre",{"className":435,"code":436,"filename":437,"language":438,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import type { H3Event } from \"nitro\";\n\nexport default (event: H3Event) => {\n  return \"world\";\n}\n","Single function","ts",[417,440,441,467,474,505,516],{"__ignoreMap":5},[442,443,446,450,453,457,460,464],"span",{"class":444,"line":445},"line",1,[442,447,449],{"class":448},"so5gQ","import",[442,451,452],{"class":448}," type",[442,454,456],{"class":455},"slsVL"," { H3Event } ",[442,458,459],{"class":448},"from",[442,461,463],{"class":462},"sfrk1"," \"nitro\"",[442,465,466],{"class":455},";\n",[442,468,470],{"class":444,"line":469},2,[442,471,473],{"emptyLinePlaceholder":472},true,"\n",[442,475,477,480,483,486,489,492,496,499,502],{"class":444,"line":476},3,[442,478,479],{"class":448},"export",[442,481,482],{"class":448}," default",[442,484,485],{"class":455}," (",[442,487,419],{"class":488},"sQHwn",[442,490,491],{"class":448},":",[442,493,495],{"class":494},"shcOC"," H3Event",[442,497,498],{"class":455},") ",[442,500,501],{"class":448},"=>",[442,503,504],{"class":455}," {\n",[442,506,508,511,514],{"class":444,"line":507},4,[442,509,510],{"class":448},"  return",[442,512,513],{"class":462}," \"world\"",[442,515,466],{"class":455},[442,517,519],{"class":444,"line":518},5,[442,520,521],{"class":455},"}\n",[433,523,526],{"className":435,"code":524,"filename":525,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\n\u002F\u002F For better type inference\nexport default defineHandler((event) => {\n  return \"world\";\n});\n","defineHandler",[417,527,528,541,545,551,571,579],{"__ignoreMap":5},[442,529,530,532,535,537,539],{"class":444,"line":445},[442,531,449],{"class":448},[442,533,534],{"class":455}," { defineHandler } ",[442,536,459],{"class":448},[442,538,463],{"class":462},[442,540,466],{"class":455},[442,542,543],{"class":444,"line":469},[442,544,473],{"emptyLinePlaceholder":472},[442,546,547],{"class":444,"line":476},[442,548,550],{"class":549},"sCsY4","\u002F\u002F For better type inference\n",[442,552,553,555,557,560,563,565,567,569],{"class":444,"line":507},[442,554,479],{"class":448},[442,556,482],{"class":448},[442,558,559],{"class":494}," defineHandler",[442,561,562],{"class":455},"((",[442,564,419],{"class":488},[442,566,498],{"class":455},[442,568,501],{"class":448},[442,570,504],{"class":455},[442,572,573,575,577],{"class":444,"line":518},[442,574,510],{"class":448},[442,576,513],{"class":462},[442,578,466],{"class":455},[442,580,582],{"class":444,"line":581},6,[442,583,584],{"class":455},"});\n",[408,586,588],{"id":587},"filesystem-routing","Filesystem routing",[413,590,591,592,597,598,601,602,605],{},"Nitro supports file-based routing for your API routes (files are automatically mapped to ",[422,593,596],{"href":594,"rel":595},"https:\u002F\u002Fh3.dev\u002Fguide\u002Fbasics\u002Frouting",[426],"h3 routes","). Defining a route is as simple as creating a file inside the ",[417,599,600],{},"api\u002F"," or ",[417,603,604],{},"routes\u002F"," directory.",[413,607,608,609,613],{},"You can only define one handler per files and you can ",[422,610,612],{"href":611},"#specific-request-method","append the HTTP method"," to the filename to define a specific request method.",[433,615,620],{"className":616,"code":618,"language":619},[617],"language-text","routes\u002F\n  api\u002F\n    test.ts      \u003C-- \u002Fapi\u002Ftest\n  hello.get.ts   \u003C-- \u002Fhello (GET only)\n  hello.post.ts  \u003C-- \u002Fhello (POST only)\nvite.config.ts\n","text",[417,621,618],{"__ignoreMap":5},[413,623,624],{},"You can nest routes by creating subdirectories.",[433,626,630],{"className":627,"code":628,"language":629,"meta":5,"style":5},"language-txt shiki shiki-themes github-light github-dark github-dark","routes\u002F\n  api\u002F\n    [org]\u002F\n      [repo]\u002F\n        index.ts   \u003C-- \u002Fapi\u002F:org\u002F:repo\n        issues.ts  \u003C-- \u002Fapi\u002F:org\u002F:repo\u002Fissues\n      index.ts     \u003C-- \u002Fapi\u002F:org\npackage.json\n","txt",[417,631,632,637,642,647,652,657,662,668],{"__ignoreMap":5},[442,633,634],{"class":444,"line":445},[442,635,636],{},"routes\u002F\n",[442,638,639],{"class":444,"line":469},[442,640,641],{},"  api\u002F\n",[442,643,644],{"class":444,"line":476},[442,645,646],{},"    [org]\u002F\n",[442,648,649],{"class":444,"line":507},[442,650,651],{},"      [repo]\u002F\n",[442,653,654],{"class":444,"line":518},[442,655,656],{},"        index.ts   \u003C-- \u002Fapi\u002F:org\u002F:repo\n",[442,658,659],{"class":444,"line":581},[442,660,661],{},"        issues.ts  \u003C-- \u002Fapi\u002F:org\u002F:repo\u002Fissues\n",[442,663,665],{"class":444,"line":664},7,[442,666,667],{},"      index.ts     \u003C-- \u002Fapi\u002F:org\n",[442,669,671],{"class":444,"line":670},8,[442,672,673],{},"package.json\n",[675,676,678],"h4",{"id":677},"route-groups","Route Groups",[413,680,681,682,685,686,689],{},"In some cases, you may want to group a set of routes together in a way which doesn't affect file-based routing. For this purpose, you can put files in a folder which is wrapped in parentheses ",[417,683,684],{},"("," and ",[417,687,688],{},")",".",[413,691,692],{},"For example:",[433,694,696],{"className":627,"code":695,"language":629,"meta":5,"style":5},"routes\u002F\n  api\u002F\n    (admin)\u002F\n      users.ts   \u003C-- \u002Fapi\u002Fusers\n      reports.ts \u003C-- \u002Fapi\u002Freports\n    (public)\u002F\n      index.ts   \u003C-- \u002Fapi\npackage.json\n",[417,697,698,702,706,711,716,721,726,731],{"__ignoreMap":5},[442,699,700],{"class":444,"line":445},[442,701,636],{},[442,703,704],{"class":444,"line":469},[442,705,641],{},[442,707,708],{"class":444,"line":476},[442,709,710],{},"    (admin)\u002F\n",[442,712,713],{"class":444,"line":507},[442,714,715],{},"      users.ts   \u003C-- \u002Fapi\u002Fusers\n",[442,717,718],{"class":444,"line":518},[442,719,720],{},"      reports.ts \u003C-- \u002Fapi\u002Freports\n",[442,722,723],{"class":444,"line":581},[442,724,725],{},"    (public)\u002F\n",[442,727,728],{"class":444,"line":664},[442,729,730],{},"      index.ts   \u003C-- \u002Fapi\n",[442,732,733],{"class":444,"line":670},[442,734,673],{},[736,737,738],"note",{},[413,739,740],{}," The route groups are not part of the route definition and are only used for organization purposes.",[742,743,745],"h3",{"id":744},"static-routes","Static routes",[413,747,748,749,601,751,754],{},"First, create a file in ",[417,750,604],{},[417,752,753],{},"routes\u002Fapi\u002F"," directory. The filename will be the route path.",[413,756,757],{},"Then, export a fetch-compatible function:",[433,759,762],{"className":435,"code":760,"filename":761,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler(() => {\n  return { hello: \"API\" };\n});\n","routes\u002Fapi\u002Ftest.ts",[417,763,764,776,780,795,808],{"__ignoreMap":5},[442,765,766,768,770,772,774],{"class":444,"line":445},[442,767,449],{"class":448},[442,769,534],{"class":455},[442,771,459],{"class":448},[442,773,463],{"class":462},[442,775,466],{"class":455},[442,777,778],{"class":444,"line":469},[442,779,473],{"emptyLinePlaceholder":472},[442,781,782,784,786,788,791,793],{"class":444,"line":476},[442,783,479],{"class":448},[442,785,482],{"class":448},[442,787,559],{"class":494},[442,789,790],{"class":455},"(() ",[442,792,501],{"class":448},[442,794,504],{"class":455},[442,796,797,799,802,805],{"class":444,"line":507},[442,798,510],{"class":448},[442,800,801],{"class":455}," { hello: ",[442,803,804],{"class":462},"\"API\"",[442,806,807],{"class":455}," };\n",[442,809,810],{"class":444,"line":518},[442,811,584],{"class":455},[742,813,815],{"id":814},"dynamic-routes","Dynamic routes",[675,817,819],{"id":818},"single-param","Single param",[413,821,822,823,826,827,830,831,834,835,842],{},"To define a route with params, use the ",[417,824,825],{},"[\u003Cparam>]"," syntax where ",[417,828,829],{},"\u003Cparam>"," is the name of the param. The param will be available in the ",[417,832,833],{},"event.context.params"," object or using the ",[422,836,839],{"href":837,"rel":838},"https:\u002F\u002Fh3.dev\u002Futils\u002Frequest#getrouterparamevent-name-opts-decode",[426],[417,840,841],{},"getRouterParam"," utility.",[433,844,847],{"className":435,"code":845,"filename":846,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  const { name } = event.context.params;\n\n  return `Hello ${name}!`;\n});\n","routes\u002Fhello\u002F[name].ts",[417,848,849,861,865,883,904,908,922],{"__ignoreMap":5},[442,850,851,853,855,857,859],{"class":444,"line":445},[442,852,449],{"class":448},[442,854,534],{"class":455},[442,856,459],{"class":448},[442,858,463],{"class":462},[442,860,466],{"class":455},[442,862,863],{"class":444,"line":469},[442,864,473],{"emptyLinePlaceholder":472},[442,866,867,869,871,873,875,877,879,881],{"class":444,"line":476},[442,868,479],{"class":448},[442,870,482],{"class":448},[442,872,559],{"class":494},[442,874,562],{"class":455},[442,876,419],{"class":488},[442,878,498],{"class":455},[442,880,501],{"class":448},[442,882,504],{"class":455},[442,884,885,888,891,895,898,901],{"class":444,"line":507},[442,886,887],{"class":448},"  const",[442,889,890],{"class":455}," { ",[442,892,894],{"class":893},"suiK_","name",[442,896,897],{"class":455}," } ",[442,899,900],{"class":448},"=",[442,902,903],{"class":455}," event.context.params;\n",[442,905,906],{"class":444,"line":518},[442,907,473],{"emptyLinePlaceholder":472},[442,909,910,912,915,917,920],{"class":444,"line":581},[442,911,510],{"class":448},[442,913,914],{"class":462}," `Hello ${",[442,916,894],{"class":455},[442,918,919],{"class":462},"}!`",[442,921,466],{"class":455},[442,923,924],{"class":444,"line":664},[442,925,584],{"class":455},[413,927,928,929,932],{},"Call the route with the param ",[417,930,931],{},"\u002Fhello\u002Fnitro",", you will get:",[433,934,937],{"className":627,"code":935,"filename":936,"language":629,"meta":5,"style":5},"Hello nitro!\n","Response",[417,938,939],{"__ignoreMap":5},[442,940,941],{"class":444,"line":445},[442,942,935],{},[675,944,946],{"id":945},"multiple-params","Multiple params",[413,948,949,950,953,954,958],{},"You can define multiple params in a route using ",[417,951,952],{},"[\u003Cparam1>]\u002F[\u003Cparam2>]"," syntax where each param is a folder. You ",[955,956,957],"strong",{},"cannot"," define multiple params in a single filename of folder.",[433,960,963],{"className":435,"code":961,"filename":962,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  const { name, age } = event.context.params;\n\n  return `Hello ${name}! You are ${age} years old.`;\n});\n","routes\u002Fhello\u002F[name]\u002F[age].ts",[417,964,965,977,981,999,1019,1023,1041],{"__ignoreMap":5},[442,966,967,969,971,973,975],{"class":444,"line":445},[442,968,449],{"class":448},[442,970,534],{"class":455},[442,972,459],{"class":448},[442,974,463],{"class":462},[442,976,466],{"class":455},[442,978,979],{"class":444,"line":469},[442,980,473],{"emptyLinePlaceholder":472},[442,982,983,985,987,989,991,993,995,997],{"class":444,"line":476},[442,984,479],{"class":448},[442,986,482],{"class":448},[442,988,559],{"class":494},[442,990,562],{"class":455},[442,992,419],{"class":488},[442,994,498],{"class":455},[442,996,501],{"class":448},[442,998,504],{"class":455},[442,1000,1001,1003,1005,1007,1010,1013,1015,1017],{"class":444,"line":507},[442,1002,887],{"class":448},[442,1004,890],{"class":455},[442,1006,894],{"class":893},[442,1008,1009],{"class":455},", ",[442,1011,1012],{"class":893},"age",[442,1014,897],{"class":455},[442,1016,900],{"class":448},[442,1018,903],{"class":455},[442,1020,1021],{"class":444,"line":518},[442,1022,473],{"emptyLinePlaceholder":472},[442,1024,1025,1027,1029,1031,1034,1036,1039],{"class":444,"line":581},[442,1026,510],{"class":448},[442,1028,914],{"class":462},[442,1030,894],{"class":455},[442,1032,1033],{"class":462},"}! You are ${",[442,1035,1012],{"class":455},[442,1037,1038],{"class":462},"} years old.`",[442,1040,466],{"class":455},[442,1042,1043],{"class":444,"line":664},[442,1044,584],{"class":455},[675,1046,1048],{"id":1047},"catch-all-params","Catch-all params",[413,1050,1051,1052,1055,1056,1058],{},"You can capture all the remaining parts of a URL using ",[417,1053,1054],{},"[...\u003Cparam>]"," syntax. This will include the ",[417,1057,400],{}," in the param.",[433,1060,1062],{"className":435,"code":845,"filename":1061,"language":438,"meta":5,"style":5},"routes\u002Fhello\u002F[...name].ts",[417,1063,1064,1076,1080,1098,1112,1116,1128],{"__ignoreMap":5},[442,1065,1066,1068,1070,1072,1074],{"class":444,"line":445},[442,1067,449],{"class":448},[442,1069,534],{"class":455},[442,1071,459],{"class":448},[442,1073,463],{"class":462},[442,1075,466],{"class":455},[442,1077,1078],{"class":444,"line":469},[442,1079,473],{"emptyLinePlaceholder":472},[442,1081,1082,1084,1086,1088,1090,1092,1094,1096],{"class":444,"line":476},[442,1083,479],{"class":448},[442,1085,482],{"class":448},[442,1087,559],{"class":494},[442,1089,562],{"class":455},[442,1091,419],{"class":488},[442,1093,498],{"class":455},[442,1095,501],{"class":448},[442,1097,504],{"class":455},[442,1099,1100,1102,1104,1106,1108,1110],{"class":444,"line":507},[442,1101,887],{"class":448},[442,1103,890],{"class":455},[442,1105,894],{"class":893},[442,1107,897],{"class":455},[442,1109,900],{"class":448},[442,1111,903],{"class":455},[442,1113,1114],{"class":444,"line":518},[442,1115,473],{"emptyLinePlaceholder":472},[442,1117,1118,1120,1122,1124,1126],{"class":444,"line":581},[442,1119,510],{"class":448},[442,1121,914],{"class":462},[442,1123,894],{"class":455},[442,1125,919],{"class":462},[442,1127,466],{"class":455},[442,1129,1130],{"class":444,"line":664},[442,1131,584],{"class":455},[413,1133,928,1134,932],{},[417,1135,1136],{},"\u002Fhello\u002Fnitro\u002Fis\u002Fhot",[433,1138,1140],{"className":627,"code":1139,"filename":936,"language":629,"meta":5,"style":5},"Hello nitro\u002Fis\u002Fhot!\n",[417,1141,1142],{"__ignoreMap":5},[442,1143,1144],{"class":444,"line":445},[442,1145,1139],{},[742,1147,1149],{"id":1148},"specific-request-method","Specific request method",[413,1151,1152,1153,1156,1157,1160],{},"You can append the HTTP method to the filename to force the route to be matched only for a specific HTTP request method, for example ",[417,1154,1155],{},"hello.get.ts"," will only match for ",[417,1158,1159],{},"GET"," requests. You can use any HTTP method you want.",[413,1162,1163,1164,1009,1167,1009,1170,1009,1173,1009,1176,1009,1179,1009,1182,1009,1185,1009,1188,689],{},"Supported methods: ",[417,1165,1166],{},"get",[417,1168,1169],{},"post",[417,1171,1172],{},"put",[417,1174,1175],{},"delete",[417,1177,1178],{},"patch",[417,1180,1181],{},"head",[417,1183,1184],{},"options",[417,1186,1187],{},"connect",[417,1189,1190],{},"trace",[430,1192,1193,1287],{},[433,1194,1198],{"className":1195,"code":1196,"filename":1159,"language":1197,"meta":5,"style":5},"language-js shiki shiki-themes github-light github-dark github-dark","\u002F\u002F routes\u002Fusers\u002F[id].get.ts\nimport { defineHandler } from \"nitro\";\n\nexport default defineHandler(async (event) => {\n  const { id } = event.context.params;\n\n  \u002F\u002F Do something with id\n\n  return `User profile!`;\n});\n","js",[417,1199,1200,1205,1217,1221,1244,1259,1263,1268,1272,1282],{"__ignoreMap":5},[442,1201,1202],{"class":444,"line":445},[442,1203,1204],{"class":549},"\u002F\u002F routes\u002Fusers\u002F[id].get.ts\n",[442,1206,1207,1209,1211,1213,1215],{"class":444,"line":469},[442,1208,449],{"class":448},[442,1210,534],{"class":455},[442,1212,459],{"class":448},[442,1214,463],{"class":462},[442,1216,466],{"class":455},[442,1218,1219],{"class":444,"line":476},[442,1220,473],{"emptyLinePlaceholder":472},[442,1222,1223,1225,1227,1229,1231,1234,1236,1238,1240,1242],{"class":444,"line":507},[442,1224,479],{"class":448},[442,1226,482],{"class":448},[442,1228,559],{"class":494},[442,1230,684],{"class":455},[442,1232,1233],{"class":448},"async",[442,1235,485],{"class":455},[442,1237,419],{"class":488},[442,1239,498],{"class":455},[442,1241,501],{"class":448},[442,1243,504],{"class":455},[442,1245,1246,1248,1250,1253,1255,1257],{"class":444,"line":518},[442,1247,887],{"class":448},[442,1249,890],{"class":455},[442,1251,1252],{"class":893},"id",[442,1254,897],{"class":455},[442,1256,900],{"class":448},[442,1258,903],{"class":455},[442,1260,1261],{"class":444,"line":581},[442,1262,473],{"emptyLinePlaceholder":472},[442,1264,1265],{"class":444,"line":664},[442,1266,1267],{"class":549},"  \u002F\u002F Do something with id\n",[442,1269,1270],{"class":444,"line":670},[442,1271,473],{"emptyLinePlaceholder":472},[442,1273,1275,1277,1280],{"class":444,"line":1274},9,[442,1276,510],{"class":448},[442,1278,1279],{"class":462}," `User profile!`",[442,1281,466],{"class":455},[442,1283,1285],{"class":444,"line":1284},10,[442,1286,584],{"class":455},[433,1288,1291],{"className":1195,"code":1289,"filename":1290,"language":1197,"meta":5,"style":5},"\u002F\u002F routes\u002Fusers.post.ts\nimport { defineHandler } from \"nitro\";\n\nexport default defineHandler(async (event) => {\n  const body = await event.req.json();\n\n  \u002F\u002F Do something with body like saving it to a database\n\n  return { updated: true };\n});\n","POST",[417,1292,1293,1298,1310,1314,1336,1358,1362,1367,1371,1383],{"__ignoreMap":5},[442,1294,1295],{"class":444,"line":445},[442,1296,1297],{"class":549},"\u002F\u002F routes\u002Fusers.post.ts\n",[442,1299,1300,1302,1304,1306,1308],{"class":444,"line":469},[442,1301,449],{"class":448},[442,1303,534],{"class":455},[442,1305,459],{"class":448},[442,1307,463],{"class":462},[442,1309,466],{"class":455},[442,1311,1312],{"class":444,"line":476},[442,1313,473],{"emptyLinePlaceholder":472},[442,1315,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334],{"class":444,"line":507},[442,1317,479],{"class":448},[442,1319,482],{"class":448},[442,1321,559],{"class":494},[442,1323,684],{"class":455},[442,1325,1233],{"class":448},[442,1327,485],{"class":455},[442,1329,419],{"class":488},[442,1331,498],{"class":455},[442,1333,501],{"class":448},[442,1335,504],{"class":455},[442,1337,1338,1340,1343,1346,1349,1352,1355],{"class":444,"line":518},[442,1339,887],{"class":448},[442,1341,1342],{"class":893}," body",[442,1344,1345],{"class":448}," =",[442,1347,1348],{"class":448}," await",[442,1350,1351],{"class":455}," event.req.",[442,1353,1354],{"class":494},"json",[442,1356,1357],{"class":455},"();\n",[442,1359,1360],{"class":444,"line":581},[442,1361,473],{"emptyLinePlaceholder":472},[442,1363,1364],{"class":444,"line":664},[442,1365,1366],{"class":549},"  \u002F\u002F Do something with body like saving it to a database\n",[442,1368,1369],{"class":444,"line":670},[442,1370,473],{"emptyLinePlaceholder":472},[442,1372,1373,1375,1378,1381],{"class":444,"line":1274},[442,1374,510],{"class":448},[442,1376,1377],{"class":455}," { updated: ",[442,1379,1380],{"class":893},"true",[442,1382,807],{"class":455},[442,1384,1385],{"class":444,"line":1284},[442,1386,584],{"class":455},[742,1388,1390],{"id":1389},"catch-all-route","Catch-all route",[413,1392,1393],{},"You can create a special route that will match all routes that are not matched by any other route. This is useful for creating a default route.",[413,1395,1396,1397,689],{},"To create a catch-all route, create a file named ",[417,1398,1399],{},"[...].ts",[433,1401,1404],{"className":435,"code":1402,"filename":1403,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  return `Hello ${event.url}!`;\n});\n","routes\u002F[...].ts",[417,1405,1406,1418,1422,1440,1457],{"__ignoreMap":5},[442,1407,1408,1410,1412,1414,1416],{"class":444,"line":445},[442,1409,449],{"class":448},[442,1411,534],{"class":455},[442,1413,459],{"class":448},[442,1415,463],{"class":462},[442,1417,466],{"class":455},[442,1419,1420],{"class":444,"line":469},[442,1421,473],{"emptyLinePlaceholder":472},[442,1423,1424,1426,1428,1430,1432,1434,1436,1438],{"class":444,"line":476},[442,1425,479],{"class":448},[442,1427,482],{"class":448},[442,1429,559],{"class":494},[442,1431,562],{"class":455},[442,1433,419],{"class":488},[442,1435,498],{"class":455},[442,1437,501],{"class":448},[442,1439,504],{"class":455},[442,1441,1442,1444,1446,1448,1450,1453,1455],{"class":444,"line":507},[442,1443,510],{"class":448},[442,1445,914],{"class":462},[442,1447,419],{"class":455},[442,1449,689],{"class":462},[442,1451,1452],{"class":455},"url",[442,1454,919],{"class":462},[442,1456,466],{"class":455},[442,1458,1459],{"class":444,"line":518},[442,1460,584],{"class":455},[742,1462,1464],{"id":1463},"environment-specific-handlers","Environment specific handlers",[413,1466,1467,1468,1009,1471,601,1474,1477,1478,601,1481,689],{},"You can specify for a route that will only be included in specific builds by adding a ",[417,1469,1470],{},".dev",[417,1472,1473],{},".prod",[417,1475,1476],{},".prerender"," suffix to the file name, for example: ",[417,1479,1480],{},"routes\u002Ftest.get.dev.ts",[417,1482,1483],{},"routes\u002Ftest.get.prod.ts",[413,1485,1486],{},"The suffix is placed after the method suffix (if any):",[433,1488,1490],{"className":627,"code":1489,"language":629,"meta":5,"style":5},"routes\u002F\n  env\u002F\n    index.dev.ts       \u003C-- \u002Fenv (dev only)\n    index.get.prod.ts  \u003C-- \u002Fenv (GET, prod only)\n",[417,1491,1492,1496,1501,1506],{"__ignoreMap":5},[442,1493,1494],{"class":444,"line":445},[442,1495,636],{},[442,1497,1498],{"class":444,"line":469},[442,1499,1500],{},"  env\u002F\n",[442,1502,1503],{"class":444,"line":476},[442,1504,1505],{},"    index.dev.ts       \u003C-- \u002Fenv (dev only)\n",[442,1507,1508],{"class":444,"line":507},[442,1509,1510],{},"    index.get.prod.ts  \u003C-- \u002Fenv (GET, prod only)\n",[1512,1513,1514],"tip",{},[413,1515,1516,1517,1523],{},"\nYou can specify multiple environments or specify a preset name as environment using programmatic registration of routes via ",[422,1518,1520],{"href":1519},"#routes-config",[417,1521,1522],{},"routes"," config.",[742,1525,1527],{"id":1526},"ignoring-files","Ignoring files",[413,1529,1530,1531,1534],{},"You can use the ",[417,1532,1533],{},"ignore"," config option to exclude files from route scanning. It accepts an array of glob patterns relative to the server directory.",[433,1536,1539],{"className":435,"code":1537,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  ignore: [\n    \"routes\u002Fapi\u002F**\u002F_*\",   \u002F\u002F Ignore files starting with _ in api\u002F\n    \"middleware\u002F_*.ts\",    \u002F\u002F Ignore middleware starting with _\n    \"routes\u002F_*.ts\",       \u002F\u002F Ignore root routes starting with _\n  ],\n});\n","nitro.config.ts",[417,1540,1541,1554,1558,1570,1575,1586,1597,1608,1613],{"__ignoreMap":5},[442,1542,1543,1545,1548,1550,1552],{"class":444,"line":445},[442,1544,449],{"class":448},[442,1546,1547],{"class":455}," { defineConfig } ",[442,1549,459],{"class":448},[442,1551,463],{"class":462},[442,1553,466],{"class":455},[442,1555,1556],{"class":444,"line":469},[442,1557,473],{"emptyLinePlaceholder":472},[442,1559,1560,1562,1564,1567],{"class":444,"line":476},[442,1561,479],{"class":448},[442,1563,482],{"class":448},[442,1565,1566],{"class":494}," defineConfig",[442,1568,1569],{"class":455},"({\n",[442,1571,1572],{"class":444,"line":507},[442,1573,1574],{"class":455},"  ignore: [\n",[442,1576,1577,1580,1583],{"class":444,"line":518},[442,1578,1579],{"class":462},"    \"routes\u002Fapi\u002F**\u002F_*\"",[442,1581,1582],{"class":455},",   ",[442,1584,1585],{"class":549},"\u002F\u002F Ignore files starting with _ in api\u002F\n",[442,1587,1588,1591,1594],{"class":444,"line":581},[442,1589,1590],{"class":462},"    \"middleware\u002F_*.ts\"",[442,1592,1593],{"class":455},",    ",[442,1595,1596],{"class":549},"\u002F\u002F Ignore middleware starting with _\n",[442,1598,1599,1602,1605],{"class":444,"line":664},[442,1600,1601],{"class":462},"    \"routes\u002F_*.ts\"",[442,1603,1604],{"class":455},",       ",[442,1606,1607],{"class":549},"\u002F\u002F Ignore root routes starting with _\n",[442,1609,1610],{"class":444,"line":670},[442,1611,1612],{"class":455},"  ],\n",[442,1614,1615],{"class":444,"line":1274},[442,1616,584],{"class":455},[408,1618,1620],{"id":1619},"programmatic-route-handlers","Programmatic route handlers",[413,1622,1623,1624,1626],{},"In addition to filesystem routing, you can register route handlers programmatically using the ",[417,1625,1522],{}," config option.",[742,1628,1630,1632],{"id":1629},"routes-config",[417,1631,1522],{}," config",[413,1634,1635,1636,1638],{},"The ",[417,1637,1522],{}," option allows you to map route patterns to handlers:",[433,1640,1642],{"className":435,"code":1641,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routes: {\n    \"\u002Fapi\u002Fhello\": \".\u002Fserver\u002Froutes\u002Fapi\u002Fhello.ts\",\n    \"\u002Fapi\u002Fcustom\": {\n      handler: \".\u002Fserver\u002Froutes\u002Fapi\u002Fhello.ts\",\n      method: \"POST\",\n      lazy: true,\n    },\n    \"\u002Fvirtual\": {\n      handler: \"#virtual-route\",\n    },\n  },\n});\n",[417,1643,1644,1656,1660,1670,1675,1689,1697,1706,1716,1725,1730,1738,1748,1753,1759],{"__ignoreMap":5},[442,1645,1646,1648,1650,1652,1654],{"class":444,"line":445},[442,1647,449],{"class":448},[442,1649,1547],{"class":455},[442,1651,459],{"class":448},[442,1653,463],{"class":462},[442,1655,466],{"class":455},[442,1657,1658],{"class":444,"line":469},[442,1659,473],{"emptyLinePlaceholder":472},[442,1661,1662,1664,1666,1668],{"class":444,"line":476},[442,1663,479],{"class":448},[442,1665,482],{"class":448},[442,1667,1566],{"class":494},[442,1669,1569],{"class":455},[442,1671,1672],{"class":444,"line":507},[442,1673,1674],{"class":455},"  routes: {\n",[442,1676,1677,1680,1683,1686],{"class":444,"line":518},[442,1678,1679],{"class":462},"    \"\u002Fapi\u002Fhello\"",[442,1681,1682],{"class":455},": ",[442,1684,1685],{"class":462},"\".\u002Fserver\u002Froutes\u002Fapi\u002Fhello.ts\"",[442,1687,1688],{"class":455},",\n",[442,1690,1691,1694],{"class":444,"line":581},[442,1692,1693],{"class":462},"    \"\u002Fapi\u002Fcustom\"",[442,1695,1696],{"class":455},": {\n",[442,1698,1699,1702,1704],{"class":444,"line":664},[442,1700,1701],{"class":455},"      handler: ",[442,1703,1685],{"class":462},[442,1705,1688],{"class":455},[442,1707,1708,1711,1714],{"class":444,"line":670},[442,1709,1710],{"class":455},"      method: ",[442,1712,1713],{"class":462},"\"POST\"",[442,1715,1688],{"class":455},[442,1717,1718,1721,1723],{"class":444,"line":1274},[442,1719,1720],{"class":455},"      lazy: ",[442,1722,1380],{"class":893},[442,1724,1688],{"class":455},[442,1726,1727],{"class":444,"line":1284},[442,1728,1729],{"class":455},"    },\n",[442,1731,1733,1736],{"class":444,"line":1732},11,[442,1734,1735],{"class":462},"    \"\u002Fvirtual\"",[442,1737,1696],{"class":455},[442,1739,1741,1743,1746],{"class":444,"line":1740},12,[442,1742,1701],{"class":455},[442,1744,1745],{"class":462},"\"#virtual-route\"",[442,1747,1688],{"class":455},[442,1749,1751],{"class":444,"line":1750},13,[442,1752,1729],{"class":455},[442,1754,1756],{"class":444,"line":1755},14,[442,1757,1758],{"class":455},"  },\n",[442,1760,1762],{"class":444,"line":1761},15,[442,1763,584],{"class":455},[413,1765,1766],{},"Each route entry can be a simple string (handler path) or an object with the following options:",[1768,1769,1770,1786],"table",{},[1771,1772,1773],"thead",{},[1774,1775,1776,1780,1783],"tr",{},[1777,1778,1779],"th",{},"Option",[1777,1781,1782],{},"Type",[1777,1784,1785],{},"Description",[1787,1788,1789,1805,1824,1839,1858],"tbody",{},[1774,1790,1791,1797,1802],{},[1792,1793,1794],"td",{},[417,1795,1796],{},"handler",[1792,1798,1799],{},[417,1800,1801],{},"string",[1792,1803,1804],{},"Path to event handler file or virtual module ID",[1774,1806,1807,1812,1816],{},[1792,1808,1809],{},[417,1810,1811],{},"method",[1792,1813,1814],{},[417,1815,1801],{},[1792,1817,1818,1819,1009,1821,1823],{},"HTTP method to match (",[417,1820,1166],{},[417,1822,1169],{},", etc.)",[1774,1825,1826,1831,1836],{},[1792,1827,1828],{},[417,1829,1830],{},"lazy",[1792,1832,1833],{},[417,1834,1835],{},"boolean",[1792,1837,1838],{},"Use lazy loading to import handler",[1774,1840,1841,1846,1851],{},[1792,1842,1843],{},[417,1844,1845],{},"format",[1792,1847,1848],{},[417,1849,1850],{},"\"web\" | \"node\"",[1792,1852,1853,1854,1857],{},"Handler type. ",[417,1855,1856],{},"\"node\""," handlers are converted to web-compatible",[1774,1859,1860,1865,1870],{},[1792,1861,1862],{},[417,1863,1864],{},"env",[1792,1866,1867],{},[417,1868,1869],{},"string | string[]",[1792,1871,1872,1873,1009,1876,1009,1879,1882],{},"Environments to include this handler (",[417,1874,1875],{},"\"dev\"",[417,1877,1878],{},"\"prod\"",[417,1880,1881],{},"\"prerender\"",", or a preset name)",[742,1884,1886,1632],{"id":1885},"handlers-config",[417,1887,1888],{},"handlers",[413,1890,1635,1891,1893],{},[417,1892,1888],{}," array is useful for registering middleware with control over route matching:",[433,1895,1897],{"className":435,"code":1896,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  handlers: [\n    {\n      route: \"\u002Fapi\u002F**\",\n      handler: \".\u002Fserver\u002Fmiddleware\u002Fapi-auth.ts\",\n      middleware: true,\n    },\n  ],\n});\n",[417,1898,1899,1911,1915,1925,1930,1935,1945,1954,1963,1967,1971],{"__ignoreMap":5},[442,1900,1901,1903,1905,1907,1909],{"class":444,"line":445},[442,1902,449],{"class":448},[442,1904,1547],{"class":455},[442,1906,459],{"class":448},[442,1908,463],{"class":462},[442,1910,466],{"class":455},[442,1912,1913],{"class":444,"line":469},[442,1914,473],{"emptyLinePlaceholder":472},[442,1916,1917,1919,1921,1923],{"class":444,"line":476},[442,1918,479],{"class":448},[442,1920,482],{"class":448},[442,1922,1566],{"class":494},[442,1924,1569],{"class":455},[442,1926,1927],{"class":444,"line":507},[442,1928,1929],{"class":455},"  handlers: [\n",[442,1931,1932],{"class":444,"line":518},[442,1933,1934],{"class":455},"    {\n",[442,1936,1937,1940,1943],{"class":444,"line":581},[442,1938,1939],{"class":455},"      route: ",[442,1941,1942],{"class":462},"\"\u002Fapi\u002F**\"",[442,1944,1688],{"class":455},[442,1946,1947,1949,1952],{"class":444,"line":664},[442,1948,1701],{"class":455},[442,1950,1951],{"class":462},"\".\u002Fserver\u002Fmiddleware\u002Fapi-auth.ts\"",[442,1953,1688],{"class":455},[442,1955,1956,1959,1961],{"class":444,"line":670},[442,1957,1958],{"class":455},"      middleware: ",[442,1960,1380],{"class":893},[442,1962,1688],{"class":455},[442,1964,1965],{"class":444,"line":1274},[442,1966,1729],{"class":455},[442,1968,1969],{"class":444,"line":1284},[442,1970,1612],{"class":455},[442,1972,1973],{"class":444,"line":1732},[442,1974,584],{"class":455},[413,1976,1977],{},"Each handler entry supports the following options:",[1768,1979,1980,1990],{},[1771,1981,1982],{},[1774,1983,1984,1986,1988],{},[1777,1985,1779],{},[1777,1987,1782],{},[1777,1989,1785],{},[1787,1991,1992,2015,2027,2043,2057,2069,2083],{},[1774,1993,1994,1999,2003],{},[1792,1995,1996],{},[417,1997,1998],{},"route",[1792,2000,2001],{},[417,2002,1801],{},[1792,2004,2005,2006,1009,2009,1009,2012,688],{},"HTTP pathname pattern (e.g., ",[417,2007,2008],{},"\u002Ftest",[417,2010,2011],{},"\u002Fapi\u002F:id",[417,2013,2014],{},"\u002Fblog\u002F**",[1774,2016,2017,2021,2025],{},[1792,2018,2019],{},[417,2020,1796],{},[1792,2022,2023],{},[417,2024,1801],{},[1792,2026,1804],{},[1774,2028,2029,2033,2037],{},[1792,2030,2031],{},[417,2032,1811],{},[1792,2034,2035],{},[417,2036,1801],{},[1792,2038,1818,2039,1009,2041,1823],{},[417,2040,1166],{},[417,2042,1169],{},[1774,2044,2045,2050,2054],{},[1792,2046,2047],{},[417,2048,2049],{},"middleware",[1792,2051,2052],{},[417,2053,1835],{},[1792,2055,2056],{},"Run handler as middleware before route handlers",[1774,2058,2059,2063,2067],{},[1792,2060,2061],{},[417,2062,1830],{},[1792,2064,2065],{},[417,2066,1835],{},[1792,2068,1838],{},[1774,2070,2071,2075,2079],{},[1792,2072,2073],{},[417,2074,1845],{},[1792,2076,2077],{},[417,2078,1850],{},[1792,2080,1853,2081,1857],{},[417,2082,1856],{},[1774,2084,2085,2089,2093],{},[1792,2086,2087],{},[417,2088,1864],{},[1792,2090,2091],{},[417,2092,1869],{},[1792,2094,1872,2095,1009,2097,1009,2099,1882],{},[417,2096,1875],{},[417,2098,1878],{},[417,2100,1881],{},[408,2102,294],{"id":2049},[413,2104,2105],{},"Nitro route middleware can hook into the request lifecycle.",[1512,2107,2108],{},[413,2109,2110],{},"A middleware can modify the request before it is processed, not after.",[413,2112,2113,2114,605],{},"Middleware are auto-registered within the ",[417,2115,2116],{},"middleware\u002F",[433,2118,2122],{"className":2119,"code":2120,"language":2121,"meta":5,"style":5},"language-md shiki shiki-themes github-light github-dark github-dark","middleware\u002F\n  auth.ts\n  logger.ts\n  ...\nroutes\u002F\n  hello.ts\n","md",[417,2123,2124,2129,2134,2139,2144,2148],{"__ignoreMap":5},[442,2125,2126],{"class":444,"line":445},[442,2127,2128],{"class":455},"middleware\u002F\n",[442,2130,2131],{"class":444,"line":469},[442,2132,2133],{"class":455},"  auth.ts\n",[442,2135,2136],{"class":444,"line":476},[442,2137,2138],{"class":455},"  logger.ts\n",[442,2140,2141],{"class":444,"line":507},[442,2142,2143],{"class":455},"  ...\n",[442,2145,2146],{"class":444,"line":518},[442,2147,636],{"class":455},[442,2149,2150],{"class":444,"line":581},[442,2151,2152],{"class":455},"  hello.ts\n",[742,2154,2156],{"id":2155},"simple-middleware","Simple middleware",[413,2158,2159],{},"Middleware are defined exactly like route handlers with the only exception that they should not return anything.\nReturning from middleware behaves like returning from a request - the value will be returned as a response and further code will not be ran.",[433,2161,2164],{"className":435,"code":2162,"filename":2163,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  \u002F\u002F Extends or modify the event\n  event.context.user = { name: \"Nitro\" };\n});\n","middleware\u002Fauth.ts",[417,2165,2166,2178,2182,2200,2205,2220],{"__ignoreMap":5},[442,2167,2168,2170,2172,2174,2176],{"class":444,"line":445},[442,2169,449],{"class":448},[442,2171,534],{"class":455},[442,2173,459],{"class":448},[442,2175,463],{"class":462},[442,2177,466],{"class":455},[442,2179,2180],{"class":444,"line":469},[442,2181,473],{"emptyLinePlaceholder":472},[442,2183,2184,2186,2188,2190,2192,2194,2196,2198],{"class":444,"line":476},[442,2185,479],{"class":448},[442,2187,482],{"class":448},[442,2189,559],{"class":494},[442,2191,562],{"class":455},[442,2193,419],{"class":488},[442,2195,498],{"class":455},[442,2197,501],{"class":448},[442,2199,504],{"class":455},[442,2201,2202],{"class":444,"line":507},[442,2203,2204],{"class":549},"  \u002F\u002F Extends or modify the event\n",[442,2206,2207,2210,2212,2215,2218],{"class":444,"line":518},[442,2208,2209],{"class":455},"  event.context.user ",[442,2211,900],{"class":448},[442,2213,2214],{"class":455}," { name: ",[442,2216,2217],{"class":462},"\"Nitro\"",[442,2219,807],{"class":455},[442,2221,2222],{"class":444,"line":581},[442,2223,584],{"class":455},[413,2225,2226,2227,2229,2230,689],{},"Middleware in ",[417,2228,2116],{}," directory are automatically registered for all routes. If you want to register a middleware for a specific route, see ",[422,2231,2234],{"href":2232,"rel":2233},"https:\u002F\u002Fh3.dev\u002Fguide\u002Fbasics\u002Fhandler#object-syntax",[426],"Object Syntax Event Handler",[736,2236,2237],{},[413,2238,2239,2240],{},"Returning anything from a middleware will close the request and should be avoided! Any returned value from middleware will be the response and further code will not be executed however ",[955,2241,2242],{},"this is not recommended to do!",[742,2244,2246],{"id":2245},"route-meta","Route Meta",[413,2248,2249,2250,2253],{},"You can define route handler meta at build-time using ",[417,2251,2252],{},"defineRouteMeta"," macro in the event handler files.",[2255,2256,2257],"important",{},[413,2258,2259],{},"\nThis feature is currently experimental.",[433,2261,2263],{"className":435,"code":2262,"filename":761,"language":438,"meta":5,"style":5},"import { defineRouteMeta } from \"nitro\";\nimport { defineHandler } from \"nitro\";\n\ndefineRouteMeta({\n  openAPI: {\n    tags: [\"test\"],\n    description: \"Test route description\",\n    parameters: [{ in: \"query\", name: \"test\", required: true }],\n  },\n});\n\nexport default defineHandler(() => \"OK\");\n",[417,2264,2265,2278,2290,2294,2300,2305,2316,2326,2347,2351,2355,2359],{"__ignoreMap":5},[442,2266,2267,2269,2272,2274,2276],{"class":444,"line":445},[442,2268,449],{"class":448},[442,2270,2271],{"class":455}," { defineRouteMeta } ",[442,2273,459],{"class":448},[442,2275,463],{"class":462},[442,2277,466],{"class":455},[442,2279,2280,2282,2284,2286,2288],{"class":444,"line":469},[442,2281,449],{"class":448},[442,2283,534],{"class":455},[442,2285,459],{"class":448},[442,2287,463],{"class":462},[442,2289,466],{"class":455},[442,2291,2292],{"class":444,"line":476},[442,2293,473],{"emptyLinePlaceholder":472},[442,2295,2296,2298],{"class":444,"line":507},[442,2297,2252],{"class":494},[442,2299,1569],{"class":455},[442,2301,2302],{"class":444,"line":518},[442,2303,2304],{"class":455},"  openAPI: {\n",[442,2306,2307,2310,2313],{"class":444,"line":581},[442,2308,2309],{"class":455},"    tags: [",[442,2311,2312],{"class":462},"\"test\"",[442,2314,2315],{"class":455},"],\n",[442,2317,2318,2321,2324],{"class":444,"line":664},[442,2319,2320],{"class":455},"    description: ",[442,2322,2323],{"class":462},"\"Test route description\"",[442,2325,1688],{"class":455},[442,2327,2328,2331,2334,2337,2339,2342,2344],{"class":444,"line":670},[442,2329,2330],{"class":455},"    parameters: [{ in: ",[442,2332,2333],{"class":462},"\"query\"",[442,2335,2336],{"class":455},", name: ",[442,2338,2312],{"class":462},[442,2340,2341],{"class":455},", required: ",[442,2343,1380],{"class":893},[442,2345,2346],{"class":455}," }],\n",[442,2348,2349],{"class":444,"line":1274},[442,2350,1758],{"class":455},[442,2352,2353],{"class":444,"line":1284},[442,2354,584],{"class":455},[442,2356,2357],{"class":444,"line":1732},[442,2358,473],{"emptyLinePlaceholder":472},[442,2360,2361,2363,2365,2367,2369,2371,2374],{"class":444,"line":1740},[442,2362,479],{"class":448},[442,2364,482],{"class":448},[442,2366,559],{"class":494},[442,2368,790],{"class":455},[442,2370,501],{"class":448},[442,2372,2373],{"class":462}," \"OK\"",[442,2375,2376],{"class":455},");\n",[2378,2379,2381],"read-more",{"to":2380},"https:\u002F\u002Fswagger.io\u002Fspecification\u002Fv3\u002F",[413,2382,2383],{},"This feature is currently usable to specify OpenAPI meta. See swagger specification for available OpenAPI options.",[742,2385,2387],{"id":2386},"execution-order","Execution order",[413,2389,2390],{},"Middleware are executed in directory listing order.",[433,2392,2394],{"className":2119,"code":2393,"language":2121,"meta":5,"style":5},"middleware\u002F\n  auth.ts \u003C-- First\n  logger.ts \u003C-- Second\n  ... \u003C-- Third\n",[417,2395,2396,2400,2405,2410],{"__ignoreMap":5},[442,2397,2398],{"class":444,"line":445},[442,2399,2128],{"class":455},[442,2401,2402],{"class":444,"line":469},[442,2403,2404],{"class":455},"  auth.ts \u003C-- First\n",[442,2406,2407],{"class":444,"line":476},[442,2408,2409],{"class":455},"  logger.ts \u003C-- Second\n",[442,2411,2412],{"class":444,"line":507},[442,2413,2414],{"class":455},"  ... \u003C-- Third\n",[413,2416,2417],{},"Prefix middleware with a number to control their execution order.",[433,2419,2421],{"className":2119,"code":2420,"language":2121,"meta":5,"style":5},"middleware\u002F\n  1.logger.ts \u003C-- First\n  2.auth.ts \u003C-- Second\n  3.... \u003C-- Third\n",[417,2422,2423,2427,2432,2437],{"__ignoreMap":5},[442,2424,2425],{"class":444,"line":445},[442,2426,2128],{"class":455},[442,2428,2429],{"class":444,"line":469},[442,2430,2431],{"class":455},"  1.logger.ts \u003C-- First\n",[442,2433,2434],{"class":444,"line":476},[442,2435,2436],{"class":455},"  2.auth.ts \u003C-- Second\n",[442,2438,2439],{"class":444,"line":507},[442,2440,2441],{"class":455},"  3.... \u003C-- Third\n",[736,2443,2444],{},[413,2445,2446,2447,1009,2450,685,2453,2456,2457,2459,2460,2462,2463,2466,2467,2470,2471,2474],{},"Remember that file names are sorted as strings, thus for example if you have 3 files ",[417,2448,2449],{},"1.filename.ts",[417,2451,2452],{},"2.filename.ts",[417,2454,2455],{},"10.filename.ts",", the ",[417,2458,2455],{}," will come after the ",[417,2461,2449],{},". To avoid this, prefix ",[417,2464,2465],{},"1-9"," with a ",[417,2468,2469],{},"0"," like ",[417,2472,2473],{},"01",", if you have more than 10 middleware in the same directory.",[742,2476,2478],{"id":2477},"request-filtering","Request filtering",[413,2480,2481],{},"Middleware are executed on every request.",[413,2483,2484],{},"Apply custom logic to scope them to specific conditions.",[413,2486,2487],{},"For example, you can use the URL to apply a middleware to a specific route:",[433,2489,2491],{"className":435,"code":2490,"filename":2163,"language":438,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  \u002F\u002F Will only execute for \u002Fauth route\n  if (event.url.pathname.startsWith('\u002Fauth')) {\n    event.context.user = { name: \"Nitro\" };\n  }\n});\n",[417,2492,2493,2505,2509,2527,2532,2551,2564,2569],{"__ignoreMap":5},[442,2494,2495,2497,2499,2501,2503],{"class":444,"line":445},[442,2496,449],{"class":448},[442,2498,534],{"class":455},[442,2500,459],{"class":448},[442,2502,463],{"class":462},[442,2504,466],{"class":455},[442,2506,2507],{"class":444,"line":469},[442,2508,473],{"emptyLinePlaceholder":472},[442,2510,2511,2513,2515,2517,2519,2521,2523,2525],{"class":444,"line":476},[442,2512,479],{"class":448},[442,2514,482],{"class":448},[442,2516,559],{"class":494},[442,2518,562],{"class":455},[442,2520,419],{"class":488},[442,2522,498],{"class":455},[442,2524,501],{"class":448},[442,2526,504],{"class":455},[442,2528,2529],{"class":444,"line":507},[442,2530,2531],{"class":549},"  \u002F\u002F Will only execute for \u002Fauth route\n",[442,2533,2534,2537,2540,2543,2545,2548],{"class":444,"line":518},[442,2535,2536],{"class":448},"  if",[442,2538,2539],{"class":455}," (event.url.pathname.",[442,2541,2542],{"class":494},"startsWith",[442,2544,684],{"class":455},[442,2546,2547],{"class":462},"'\u002Fauth'",[442,2549,2550],{"class":455},")) {\n",[442,2552,2553,2556,2558,2560,2562],{"class":444,"line":581},[442,2554,2555],{"class":455},"    event.context.user ",[442,2557,900],{"class":448},[442,2559,2214],{"class":455},[442,2561,2217],{"class":462},[442,2563,807],{"class":455},[442,2565,2566],{"class":444,"line":664},[442,2567,2568],{"class":455},"  }\n",[442,2570,2571],{"class":444,"line":670},[442,2572,584],{"class":455},[742,2574,2576],{"id":2575},"route-scoped-middleware","Route-scoped middleware",[413,2578,2579,2580,2585,2586,2588,2589,491],{},"You can register middleware for specific route patterns using the ",[422,2581,2583],{"href":2582},"#handlers-config",[417,2584,1888],{}," config with the ",[417,2587,2049],{}," option and a specific ",[417,2590,1998],{},[433,2592,2593],{"className":435,"code":1896,"filename":1538,"language":438,"meta":5,"style":5},[417,2594,2595,2607,2611,2621,2625,2629,2637,2645,2653,2657,2661],{"__ignoreMap":5},[442,2596,2597,2599,2601,2603,2605],{"class":444,"line":445},[442,2598,449],{"class":448},[442,2600,1547],{"class":455},[442,2602,459],{"class":448},[442,2604,463],{"class":462},[442,2606,466],{"class":455},[442,2608,2609],{"class":444,"line":469},[442,2610,473],{"emptyLinePlaceholder":472},[442,2612,2613,2615,2617,2619],{"class":444,"line":476},[442,2614,479],{"class":448},[442,2616,482],{"class":448},[442,2618,1566],{"class":494},[442,2620,1569],{"class":455},[442,2622,2623],{"class":444,"line":507},[442,2624,1929],{"class":455},[442,2626,2627],{"class":444,"line":518},[442,2628,1934],{"class":455},[442,2630,2631,2633,2635],{"class":444,"line":581},[442,2632,1939],{"class":455},[442,2634,1942],{"class":462},[442,2636,1688],{"class":455},[442,2638,2639,2641,2643],{"class":444,"line":664},[442,2640,1701],{"class":455},[442,2642,1951],{"class":462},[442,2644,1688],{"class":455},[442,2646,2647,2649,2651],{"class":444,"line":670},[442,2648,1958],{"class":455},[442,2650,1380],{"class":893},[442,2652,1688],{"class":455},[442,2654,2655],{"class":444,"line":1274},[442,2656,1729],{"class":455},[442,2658,2659],{"class":444,"line":1284},[442,2660,1612],{"class":455},[442,2662,2663],{"class":444,"line":1732},[442,2664,584],{"class":455},[413,2666,2667,2668,2670,2671,2674],{},"Unlike global middleware (registered in the ",[417,2669,2116],{}," directory which match ",[417,2672,2673],{},"\u002F**","), route-scoped middleware only run for requests matching the specified pattern.",[408,2676,2678],{"id":2677},"error-handling","Error handling",[413,2680,1530,2681,2686],{},[422,2682,2685],{"href":2683,"rel":2684},"https:\u002F\u002Fh3.dev\u002Fguide\u002Fbasics\u002Ferror",[426],"utilities available in H3"," to handle errors in both routes and middlewares.",[413,2688,2689,2690,2693,2694,2697],{},"The way errors are sent back to the client depends on the environment. In development, requests with an ",[417,2691,2692],{},"Accept"," header of ",[417,2695,2696],{},"text\u002Fhtml"," (such as browsers) will receive a HTML error page. In production, errors are always sent in JSON.",[413,2699,2700,2701,601,2703,2706],{},"This behaviour can be overridden by some request properties (e.g.: ",[417,2702,2692],{},[417,2704,2705],{},"User-Agent"," headers).",[408,2708,2710],{"id":2709},"code-splitting","Code splitting",[413,2712,2713,2714,2717,2718,689],{},"Nitro creates a separate chunk for each route handler. Chunks load on-demand when first requested, so ",[417,2715,2716],{},"\u002Fapi\u002Fusers"," doesn't load code for ",[417,2719,2720],{},"\u002Fapi\u002Fposts",[413,2722,2723,2724,2730],{},"See ",[422,2725,2727],{"href":2726},"\u002Fconfig#inlinedynamicimports",[417,2728,2729],{},"inlineDynamicImports"," to bundle everything into a single file.",[408,2732,2734],{"id":2733},"route-rules","Route rules",[413,2736,2737],{},"Nitro allows you to add logic at the top-level for each route of your configuration. It can be used for redirecting, proxying, caching, authentication, and adding headers to routes.",[413,2739,2740,2741,2746],{},"It is a map from route pattern (following ",[422,2742,2745],{"href":2743,"rel":2744},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Frou3",[426],"rou3",") to route options.",[413,2748,2749,2750,2753,2754,2753,2757,2753,2760,2753,2763,2753,2766,2769,2770,2777,2778,1009,2781,2784,2785,2788],{},"Route rule matching, normalization, and the ",[417,2751,2752],{},"headers"," \u002F ",[417,2755,2756],{},"redirect",[417,2758,2759],{},"proxy",[417,2761,2762],{},"cache",[417,2764,2765],{},"basicAuth",[417,2767,2768],{},"cors"," handlers are provided by the ",[422,2771,2774],{"href":2772,"rel":2773},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Fh3-rules",[426],[417,2775,2776],{},"h3-rules"," package (extracted from Nitro); Nitro adds the ",[417,2779,2780],{},"isr",[417,2782,2783],{},"prerender",", and ",[417,2786,2787],{},"static"," rules on top.",[413,2790,2791,2792,2794,2795,2798,2799,2802],{},"When ",[417,2793,2762],{}," option is set, handlers matching pattern will be automatically wrapped with ",[417,2796,2797],{},"defineCachedHandler",". See the ",[422,2800,2801],{"href":74},"cache guide"," to learn more about this function.",[736,2804,2805],{},[413,2806,2807,2810,2811],{},[417,2808,2809],{},"swr: true|number"," is shortcut for ",[417,2812,2813],{},"cache: { swr: true, maxAge: number }",[413,2815,2816,2817,2820],{},"You can set route rules in the ",[417,2818,2819],{},"nitro.routeRules"," options.",[433,2822,2824],{"className":435,"code":2823,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fblog\u002F**': { swr: true },\n    '\u002Fblog2\u002F**': { swr: 600 },\n    '\u002Fblog3\u002F**': { static: true },\n    '\u002Fblog4\u002F**': { cache: { \u002F* cache options*\u002F } },\n    '\u002Fassets\u002F**': { headers: { 'cache-control': 's-maxage=0' } },\n    '\u002Fapi\u002Fv1\u002F**': { cors: true, headers: { 'access-control-allow-methods': 'GET' } },\n    '\u002Fold-page': { redirect: '\u002Fnew-page' },\n    '\u002Fold-page\u002F**': { redirect: '\u002Fnew-page\u002F**' },\n    '\u002Fproxy\u002Fexample': { proxy: 'https:\u002F\u002Fexample.com' },\n    '\u002Fproxy\u002F**': { proxy: '\u002Fapi\u002F**' },\n    '\u002Fadmin\u002F**': { basicAuth: { username: 'admin', password: 'supersecret' } },\n  }\n});\n",[417,2825,2826,2838,2842,2852,2857,2870,2882,2894,2908,2926,2949,2962,2974,2987,2999,3018,3023],{"__ignoreMap":5},[442,2827,2828,2830,2832,2834,2836],{"class":444,"line":445},[442,2829,449],{"class":448},[442,2831,1547],{"class":455},[442,2833,459],{"class":448},[442,2835,463],{"class":462},[442,2837,466],{"class":455},[442,2839,2840],{"class":444,"line":469},[442,2841,473],{"emptyLinePlaceholder":472},[442,2843,2844,2846,2848,2850],{"class":444,"line":476},[442,2845,479],{"class":448},[442,2847,482],{"class":448},[442,2849,1566],{"class":494},[442,2851,1569],{"class":455},[442,2853,2854],{"class":444,"line":507},[442,2855,2856],{"class":455},"  routeRules: {\n",[442,2858,2859,2862,2865,2867],{"class":444,"line":518},[442,2860,2861],{"class":462},"    '\u002Fblog\u002F**'",[442,2863,2864],{"class":455},": { swr: ",[442,2866,1380],{"class":893},[442,2868,2869],{"class":455}," },\n",[442,2871,2872,2875,2877,2880],{"class":444,"line":581},[442,2873,2874],{"class":462},"    '\u002Fblog2\u002F**'",[442,2876,2864],{"class":455},[442,2878,2879],{"class":893},"600",[442,2881,2869],{"class":455},[442,2883,2884,2887,2890,2892],{"class":444,"line":664},[442,2885,2886],{"class":462},"    '\u002Fblog3\u002F**'",[442,2888,2889],{"class":455},": { static: ",[442,2891,1380],{"class":893},[442,2893,2869],{"class":455},[442,2895,2896,2899,2902,2905],{"class":444,"line":670},[442,2897,2898],{"class":462},"    '\u002Fblog4\u002F**'",[442,2900,2901],{"class":455},": { cache: { ",[442,2903,2904],{"class":549},"\u002F* cache options*\u002F",[442,2906,2907],{"class":455}," } },\n",[442,2909,2910,2913,2916,2919,2921,2924],{"class":444,"line":1274},[442,2911,2912],{"class":462},"    '\u002Fassets\u002F**'",[442,2914,2915],{"class":455},": { headers: { ",[442,2917,2918],{"class":462},"'cache-control'",[442,2920,1682],{"class":455},[442,2922,2923],{"class":462},"'s-maxage=0'",[442,2925,2907],{"class":455},[442,2927,2928,2931,2934,2936,2939,2942,2944,2947],{"class":444,"line":1284},[442,2929,2930],{"class":462},"    '\u002Fapi\u002Fv1\u002F**'",[442,2932,2933],{"class":455},": { cors: ",[442,2935,1380],{"class":893},[442,2937,2938],{"class":455},", headers: { ",[442,2940,2941],{"class":462},"'access-control-allow-methods'",[442,2943,1682],{"class":455},[442,2945,2946],{"class":462},"'GET'",[442,2948,2907],{"class":455},[442,2950,2951,2954,2957,2960],{"class":444,"line":1732},[442,2952,2953],{"class":462},"    '\u002Fold-page'",[442,2955,2956],{"class":455},": { redirect: ",[442,2958,2959],{"class":462},"'\u002Fnew-page'",[442,2961,2869],{"class":455},[442,2963,2964,2967,2969,2972],{"class":444,"line":1740},[442,2965,2966],{"class":462},"    '\u002Fold-page\u002F**'",[442,2968,2956],{"class":455},[442,2970,2971],{"class":462},"'\u002Fnew-page\u002F**'",[442,2973,2869],{"class":455},[442,2975,2976,2979,2982,2985],{"class":444,"line":1750},[442,2977,2978],{"class":462},"    '\u002Fproxy\u002Fexample'",[442,2980,2981],{"class":455},": { proxy: ",[442,2983,2984],{"class":462},"'https:\u002F\u002Fexample.com'",[442,2986,2869],{"class":455},[442,2988,2989,2992,2994,2997],{"class":444,"line":1755},[442,2990,2991],{"class":462},"    '\u002Fproxy\u002F**'",[442,2993,2981],{"class":455},[442,2995,2996],{"class":462},"'\u002Fapi\u002F**'",[442,2998,2869],{"class":455},[442,3000,3001,3004,3007,3010,3013,3016],{"class":444,"line":1761},[442,3002,3003],{"class":462},"    '\u002Fadmin\u002F**'",[442,3005,3006],{"class":455},": { basicAuth: { username: ",[442,3008,3009],{"class":462},"'admin'",[442,3011,3012],{"class":455},", password: ",[442,3014,3015],{"class":462},"'supersecret'",[442,3017,2907],{"class":455},[442,3019,3021],{"class":444,"line":3020},16,[442,3022,2568],{"class":455},[442,3024,3026],{"class":444,"line":3025},17,[442,3027,584],{"class":455},[742,3029,3031],{"id":3030},"rule-merging-and-overrides","Rule merging and overrides",[413,3033,3034],{},"Route rules are matched from least specific to most specific. When multiple rules match a request, their options are merged, with more specific rules taking precedence.",[413,3036,3037,3038,3041],{},"You can use ",[417,3039,3040],{},"false"," to disable a rule that was set by a more general pattern:",[433,3043,3045],{"className":435,"code":3044,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fapi\u002Fcached\u002F**': { swr: true },\n    '\u002Fapi\u002Fcached\u002Fno-cache': { cache: false, swr: false },\n    '\u002Fadmin\u002F**': { basicAuth: { username: 'admin', password: 'secret' } },\n    '\u002Fadmin\u002Fpublic\u002F**': { basicAuth: false },\n  }\n});\n",[417,3046,3047,3059,3063,3073,3077,3088,3105,3120,3132,3136],{"__ignoreMap":5},[442,3048,3049,3051,3053,3055,3057],{"class":444,"line":445},[442,3050,449],{"class":448},[442,3052,1547],{"class":455},[442,3054,459],{"class":448},[442,3056,463],{"class":462},[442,3058,466],{"class":455},[442,3060,3061],{"class":444,"line":469},[442,3062,473],{"emptyLinePlaceholder":472},[442,3064,3065,3067,3069,3071],{"class":444,"line":476},[442,3066,479],{"class":448},[442,3068,482],{"class":448},[442,3070,1566],{"class":494},[442,3072,1569],{"class":455},[442,3074,3075],{"class":444,"line":507},[442,3076,2856],{"class":455},[442,3078,3079,3082,3084,3086],{"class":444,"line":518},[442,3080,3081],{"class":462},"    '\u002Fapi\u002Fcached\u002F**'",[442,3083,2864],{"class":455},[442,3085,1380],{"class":893},[442,3087,2869],{"class":455},[442,3089,3090,3093,3096,3098,3101,3103],{"class":444,"line":581},[442,3091,3092],{"class":462},"    '\u002Fapi\u002Fcached\u002Fno-cache'",[442,3094,3095],{"class":455},": { cache: ",[442,3097,3040],{"class":893},[442,3099,3100],{"class":455},", swr: ",[442,3102,3040],{"class":893},[442,3104,2869],{"class":455},[442,3106,3107,3109,3111,3113,3115,3118],{"class":444,"line":664},[442,3108,3003],{"class":462},[442,3110,3006],{"class":455},[442,3112,3009],{"class":462},[442,3114,3012],{"class":455},[442,3116,3117],{"class":462},"'secret'",[442,3119,2907],{"class":455},[442,3121,3122,3125,3128,3130],{"class":444,"line":670},[442,3123,3124],{"class":462},"    '\u002Fadmin\u002Fpublic\u002F**'",[442,3126,3127],{"class":455},": { basicAuth: ",[442,3129,3040],{"class":893},[442,3131,2869],{"class":455},[442,3133,3134],{"class":444,"line":1274},[442,3135,2568],{"class":455},[442,3137,3138],{"class":444,"line":1284},[442,3139,584],{"class":455},[742,3141,3142],{"id":2752},"Headers",[413,3144,3145],{},"Set custom response headers for matching routes:",[433,3147,3149],{"className":435,"code":3148,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fapi\u002F**': { headers: { 'cache-control': 's-maxage=60' } },\n    '**': { headers: { 'x-powered-by': 'Nitro' } },\n  }\n});\n",[417,3150,3151,3163,3167,3177,3181,3197,3214,3218],{"__ignoreMap":5},[442,3152,3153,3155,3157,3159,3161],{"class":444,"line":445},[442,3154,449],{"class":448},[442,3156,1547],{"class":455},[442,3158,459],{"class":448},[442,3160,463],{"class":462},[442,3162,466],{"class":455},[442,3164,3165],{"class":444,"line":469},[442,3166,473],{"emptyLinePlaceholder":472},[442,3168,3169,3171,3173,3175],{"class":444,"line":476},[442,3170,479],{"class":448},[442,3172,482],{"class":448},[442,3174,1566],{"class":494},[442,3176,1569],{"class":455},[442,3178,3179],{"class":444,"line":507},[442,3180,2856],{"class":455},[442,3182,3183,3186,3188,3190,3192,3195],{"class":444,"line":518},[442,3184,3185],{"class":462},"    '\u002Fapi\u002F**'",[442,3187,2915],{"class":455},[442,3189,2918],{"class":462},[442,3191,1682],{"class":455},[442,3193,3194],{"class":462},"'s-maxage=60'",[442,3196,2907],{"class":455},[442,3198,3199,3202,3204,3207,3209,3212],{"class":444,"line":581},[442,3200,3201],{"class":462},"    '**'",[442,3203,2915],{"class":455},[442,3205,3206],{"class":462},"'x-powered-by'",[442,3208,1682],{"class":455},[442,3210,3211],{"class":462},"'Nitro'",[442,3213,2907],{"class":455},[442,3215,3216],{"class":444,"line":664},[442,3217,2568],{"class":455},[442,3219,3220],{"class":444,"line":670},[442,3221,584],{"class":455},[742,3223,3224],{"id":2768},"CORS",[413,3226,3227,3228,3231,3232,1009,3235,1009,3238,2784,3241,689],{},"Enable CORS headers with the ",[417,3229,3230],{},"cors: true"," shortcut. This sets ",[417,3233,3234],{},"access-control-allow-origin: *",[417,3236,3237],{},"access-control-allow-methods: *",[417,3239,3240],{},"access-control-allow-headers: *",[417,3242,3243],{},"access-control-max-age: 0",[413,3245,3246,3247,491],{},"You can override individual CORS headers using ",[417,3248,2752],{},[433,3250,3252],{"className":435,"code":3251,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fapi\u002Fv1\u002F**': {\n      cors: true,\n      headers: { 'access-control-allow-methods': 'GET' },\n    },\n  }\n});\n",[417,3253,3254,3266,3270,3280,3284,3290,3299,3312,3316,3320],{"__ignoreMap":5},[442,3255,3256,3258,3260,3262,3264],{"class":444,"line":445},[442,3257,449],{"class":448},[442,3259,1547],{"class":455},[442,3261,459],{"class":448},[442,3263,463],{"class":462},[442,3265,466],{"class":455},[442,3267,3268],{"class":444,"line":469},[442,3269,473],{"emptyLinePlaceholder":472},[442,3271,3272,3274,3276,3278],{"class":444,"line":476},[442,3273,479],{"class":448},[442,3275,482],{"class":448},[442,3277,1566],{"class":494},[442,3279,1569],{"class":455},[442,3281,3282],{"class":444,"line":507},[442,3283,2856],{"class":455},[442,3285,3286,3288],{"class":444,"line":518},[442,3287,2930],{"class":462},[442,3289,1696],{"class":455},[442,3291,3292,3295,3297],{"class":444,"line":581},[442,3293,3294],{"class":455},"      cors: ",[442,3296,1380],{"class":893},[442,3298,1688],{"class":455},[442,3300,3301,3304,3306,3308,3310],{"class":444,"line":664},[442,3302,3303],{"class":455},"      headers: { ",[442,3305,2941],{"class":462},[442,3307,1682],{"class":455},[442,3309,2946],{"class":462},[442,3311,2869],{"class":455},[442,3313,3314],{"class":444,"line":670},[442,3315,1729],{"class":455},[442,3317,3318],{"class":444,"line":1274},[442,3319,2568],{"class":455},[442,3321,3322],{"class":444,"line":1284},[442,3323,584],{"class":455},[742,3325,3326],{"id":2756},"Redirect",[413,3328,3329,3330,3333],{},"Redirect matching routes to another URL. Use a string for a simple redirect (defaults to ",[417,3331,3332],{},"307"," status), or an object for more control:",[433,3335,3337],{"className":435,"code":3336,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    \u002F\u002F Simple redirect (307 status)\n    '\u002Fold-page': { redirect: '\u002Fnew-page' },\n    \u002F\u002F Redirect with custom status\n    '\u002Flegacy': { redirect: { to: 'https:\u002F\u002Fexample.com\u002F', status: 308 } },\n    \u002F\u002F Wildcard redirect — preserves the path after the pattern\n    '\u002Fold-blog\u002F**': { redirect: 'https:\u002F\u002Fblog.example.com\u002F**' },\n  }\n});\n",[417,3338,3339,3351,3355,3365,3369,3374,3384,3389,3408,3413,3425,3429],{"__ignoreMap":5},[442,3340,3341,3343,3345,3347,3349],{"class":444,"line":445},[442,3342,449],{"class":448},[442,3344,1547],{"class":455},[442,3346,459],{"class":448},[442,3348,463],{"class":462},[442,3350,466],{"class":455},[442,3352,3353],{"class":444,"line":469},[442,3354,473],{"emptyLinePlaceholder":472},[442,3356,3357,3359,3361,3363],{"class":444,"line":476},[442,3358,479],{"class":448},[442,3360,482],{"class":448},[442,3362,1566],{"class":494},[442,3364,1569],{"class":455},[442,3366,3367],{"class":444,"line":507},[442,3368,2856],{"class":455},[442,3370,3371],{"class":444,"line":518},[442,3372,3373],{"class":549},"    \u002F\u002F Simple redirect (307 status)\n",[442,3375,3376,3378,3380,3382],{"class":444,"line":581},[442,3377,2953],{"class":462},[442,3379,2956],{"class":455},[442,3381,2959],{"class":462},[442,3383,2869],{"class":455},[442,3385,3386],{"class":444,"line":664},[442,3387,3388],{"class":549},"    \u002F\u002F Redirect with custom status\n",[442,3390,3391,3394,3397,3400,3403,3406],{"class":444,"line":670},[442,3392,3393],{"class":462},"    '\u002Flegacy'",[442,3395,3396],{"class":455},": { redirect: { to: ",[442,3398,3399],{"class":462},"'https:\u002F\u002Fexample.com\u002F'",[442,3401,3402],{"class":455},", status: ",[442,3404,3405],{"class":893},"308",[442,3407,2907],{"class":455},[442,3409,3410],{"class":444,"line":1274},[442,3411,3412],{"class":549},"    \u002F\u002F Wildcard redirect — preserves the path after the pattern\n",[442,3414,3415,3418,3420,3423],{"class":444,"line":1284},[442,3416,3417],{"class":462},"    '\u002Fold-blog\u002F**'",[442,3419,2956],{"class":455},[442,3421,3422],{"class":462},"'https:\u002F\u002Fblog.example.com\u002F**'",[442,3424,2869],{"class":455},[442,3426,3427],{"class":444,"line":1732},[442,3428,2568],{"class":455},[442,3430,3431],{"class":444,"line":1740},[442,3432,584],{"class":455},[742,3434,3435],{"id":2759},"Proxy",[413,3437,3438],{},"Proxy requests to another URL. Supports both internal and external targets:",[433,3440,3442],{"className":435,"code":3441,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    \u002F\u002F Proxy to exact URL\n    '\u002Fapi\u002Fproxy\u002Fexample': { proxy: 'https:\u002F\u002Fexample.com' },\n    \u002F\u002F Proxy to internal route\n    '\u002Fapi\u002Fproxy\u002F**': { proxy: '\u002Fapi\u002Fecho' },\n    \u002F\u002F Wildcard proxy — preserves the path after the pattern\n    '\u002Fcdn\u002F**': { proxy: 'https:\u002F\u002Fcdn.jsdelivr.net\u002F**' },\n    \u002F\u002F Proxy with options\n    '\u002Fexternal\u002F**': {\n      proxy: {\n        to: 'https:\u002F\u002Fapi.example.com\u002F**',\n        \u002F\u002F Additional H3 proxy options...\n      },\n    },\n  }\n});\n",[417,3443,3444,3456,3460,3470,3474,3479,3490,3495,3507,3512,3524,3529,3536,3541,3551,3556,3561,3565,3570],{"__ignoreMap":5},[442,3445,3446,3448,3450,3452,3454],{"class":444,"line":445},[442,3447,449],{"class":448},[442,3449,1547],{"class":455},[442,3451,459],{"class":448},[442,3453,463],{"class":462},[442,3455,466],{"class":455},[442,3457,3458],{"class":444,"line":469},[442,3459,473],{"emptyLinePlaceholder":472},[442,3461,3462,3464,3466,3468],{"class":444,"line":476},[442,3463,479],{"class":448},[442,3465,482],{"class":448},[442,3467,1566],{"class":494},[442,3469,1569],{"class":455},[442,3471,3472],{"class":444,"line":507},[442,3473,2856],{"class":455},[442,3475,3476],{"class":444,"line":518},[442,3477,3478],{"class":549},"    \u002F\u002F Proxy to exact URL\n",[442,3480,3481,3484,3486,3488],{"class":444,"line":581},[442,3482,3483],{"class":462},"    '\u002Fapi\u002Fproxy\u002Fexample'",[442,3485,2981],{"class":455},[442,3487,2984],{"class":462},[442,3489,2869],{"class":455},[442,3491,3492],{"class":444,"line":664},[442,3493,3494],{"class":549},"    \u002F\u002F Proxy to internal route\n",[442,3496,3497,3500,3502,3505],{"class":444,"line":670},[442,3498,3499],{"class":462},"    '\u002Fapi\u002Fproxy\u002F**'",[442,3501,2981],{"class":455},[442,3503,3504],{"class":462},"'\u002Fapi\u002Fecho'",[442,3506,2869],{"class":455},[442,3508,3509],{"class":444,"line":1274},[442,3510,3511],{"class":549},"    \u002F\u002F Wildcard proxy — preserves the path after the pattern\n",[442,3513,3514,3517,3519,3522],{"class":444,"line":1284},[442,3515,3516],{"class":462},"    '\u002Fcdn\u002F**'",[442,3518,2981],{"class":455},[442,3520,3521],{"class":462},"'https:\u002F\u002Fcdn.jsdelivr.net\u002F**'",[442,3523,2869],{"class":455},[442,3525,3526],{"class":444,"line":1732},[442,3527,3528],{"class":549},"    \u002F\u002F Proxy with options\n",[442,3530,3531,3534],{"class":444,"line":1740},[442,3532,3533],{"class":462},"    '\u002Fexternal\u002F**'",[442,3535,1696],{"class":455},[442,3537,3538],{"class":444,"line":1750},[442,3539,3540],{"class":455},"      proxy: {\n",[442,3542,3543,3546,3549],{"class":444,"line":1755},[442,3544,3545],{"class":455},"        to: ",[442,3547,3548],{"class":462},"'https:\u002F\u002Fapi.example.com\u002F**'",[442,3550,1688],{"class":455},[442,3552,3553],{"class":444,"line":1761},[442,3554,3555],{"class":549},"        \u002F\u002F Additional H3 proxy options...\n",[442,3557,3558],{"class":444,"line":3020},[442,3559,3560],{"class":455},"      },\n",[442,3562,3563],{"class":444,"line":3025},[442,3564,1729],{"class":455},[442,3566,3568],{"class":444,"line":3567},18,[442,3569,2568],{"class":455},[442,3571,3573],{"class":444,"line":3572},19,[442,3574,584],{"class":455},[742,3576,3578],{"id":3577},"basic-auth","Basic auth",[413,3580,3581],{},"Protect routes with HTTP Basic Authentication:",[433,3583,3585],{"className":435,"code":3584,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fadmin\u002F**': {\n      basicAuth: {\n        username: 'admin',\n        password: 'supersecret',\n        realm: 'Admin Area',  \u002F\u002F Optional, shown in the browser prompt\n      },\n    },\n    \u002F\u002F Disable basic auth for a sub-path\n    '\u002Fadmin\u002Fpublic\u002F**': { basicAuth: false },\n  }\n});\n",[417,3586,3587,3599,3603,3613,3617,3623,3628,3637,3646,3660,3664,3668,3673,3683,3687],{"__ignoreMap":5},[442,3588,3589,3591,3593,3595,3597],{"class":444,"line":445},[442,3590,449],{"class":448},[442,3592,1547],{"class":455},[442,3594,459],{"class":448},[442,3596,463],{"class":462},[442,3598,466],{"class":455},[442,3600,3601],{"class":444,"line":469},[442,3602,473],{"emptyLinePlaceholder":472},[442,3604,3605,3607,3609,3611],{"class":444,"line":476},[442,3606,479],{"class":448},[442,3608,482],{"class":448},[442,3610,1566],{"class":494},[442,3612,1569],{"class":455},[442,3614,3615],{"class":444,"line":507},[442,3616,2856],{"class":455},[442,3618,3619,3621],{"class":444,"line":518},[442,3620,3003],{"class":462},[442,3622,1696],{"class":455},[442,3624,3625],{"class":444,"line":581},[442,3626,3627],{"class":455},"      basicAuth: {\n",[442,3629,3630,3633,3635],{"class":444,"line":664},[442,3631,3632],{"class":455},"        username: ",[442,3634,3009],{"class":462},[442,3636,1688],{"class":455},[442,3638,3639,3642,3644],{"class":444,"line":670},[442,3640,3641],{"class":455},"        password: ",[442,3643,3015],{"class":462},[442,3645,1688],{"class":455},[442,3647,3648,3651,3654,3657],{"class":444,"line":1274},[442,3649,3650],{"class":455},"        realm: ",[442,3652,3653],{"class":462},"'Admin Area'",[442,3655,3656],{"class":455},",  ",[442,3658,3659],{"class":549},"\u002F\u002F Optional, shown in the browser prompt\n",[442,3661,3662],{"class":444,"line":1284},[442,3663,3560],{"class":455},[442,3665,3666],{"class":444,"line":1732},[442,3667,1729],{"class":455},[442,3669,3670],{"class":444,"line":1740},[442,3671,3672],{"class":549},"    \u002F\u002F Disable basic auth for a sub-path\n",[442,3674,3675,3677,3679,3681],{"class":444,"line":1750},[442,3676,3124],{"class":462},[442,3678,3127],{"class":455},[442,3680,3040],{"class":893},[442,3682,2869],{"class":455},[442,3684,3685],{"class":444,"line":1755},[442,3686,2568],{"class":455},[442,3688,3689],{"class":444,"line":1761},[442,3690,584],{"class":455},[742,3692,3694],{"id":3693},"caching-swr-static","Caching (SWR \u002F Static)",[413,3696,3697,3698,1009,3700,3703,3704,3706],{},"Control caching behavior with ",[417,3699,2762],{},[417,3701,3702],{},"swr",", or ",[417,3705,2787],{}," options:",[433,3708,3710],{"className":435,"code":3709,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    \u002F\u002F Enable stale-while-revalidate caching\n    '\u002Fblog\u002F**': { swr: true },\n    \u002F\u002F SWR with maxAge in seconds\n    '\u002Fblog\u002Fposts\u002F**': { swr: 600 },\n    \u002F\u002F Full cache options\n    '\u002Fapi\u002Fdata\u002F**': {\n      cache: {\n        maxAge: 60,\n        swr: true,\n        \u002F\u002F ...other cache options\n      },\n    },\n    \u002F\u002F Disable caching\n    '\u002Fapi\u002Frealtime\u002F**': { cache: false },\n  }\n});\n",[417,3711,3712,3724,3728,3738,3742,3747,3757,3762,3773,3778,3785,3790,3800,3809,3814,3818,3822,3827,3838,3842],{"__ignoreMap":5},[442,3713,3714,3716,3718,3720,3722],{"class":444,"line":445},[442,3715,449],{"class":448},[442,3717,1547],{"class":455},[442,3719,459],{"class":448},[442,3721,463],{"class":462},[442,3723,466],{"class":455},[442,3725,3726],{"class":444,"line":469},[442,3727,473],{"emptyLinePlaceholder":472},[442,3729,3730,3732,3734,3736],{"class":444,"line":476},[442,3731,479],{"class":448},[442,3733,482],{"class":448},[442,3735,1566],{"class":494},[442,3737,1569],{"class":455},[442,3739,3740],{"class":444,"line":507},[442,3741,2856],{"class":455},[442,3743,3744],{"class":444,"line":518},[442,3745,3746],{"class":549},"    \u002F\u002F Enable stale-while-revalidate caching\n",[442,3748,3749,3751,3753,3755],{"class":444,"line":581},[442,3750,2861],{"class":462},[442,3752,2864],{"class":455},[442,3754,1380],{"class":893},[442,3756,2869],{"class":455},[442,3758,3759],{"class":444,"line":664},[442,3760,3761],{"class":549},"    \u002F\u002F SWR with maxAge in seconds\n",[442,3763,3764,3767,3769,3771],{"class":444,"line":670},[442,3765,3766],{"class":462},"    '\u002Fblog\u002Fposts\u002F**'",[442,3768,2864],{"class":455},[442,3770,2879],{"class":893},[442,3772,2869],{"class":455},[442,3774,3775],{"class":444,"line":1274},[442,3776,3777],{"class":549},"    \u002F\u002F Full cache options\n",[442,3779,3780,3783],{"class":444,"line":1284},[442,3781,3782],{"class":462},"    '\u002Fapi\u002Fdata\u002F**'",[442,3784,1696],{"class":455},[442,3786,3787],{"class":444,"line":1732},[442,3788,3789],{"class":455},"      cache: {\n",[442,3791,3792,3795,3798],{"class":444,"line":1740},[442,3793,3794],{"class":455},"        maxAge: ",[442,3796,3797],{"class":893},"60",[442,3799,1688],{"class":455},[442,3801,3802,3805,3807],{"class":444,"line":1750},[442,3803,3804],{"class":455},"        swr: ",[442,3806,1380],{"class":893},[442,3808,1688],{"class":455},[442,3810,3811],{"class":444,"line":1755},[442,3812,3813],{"class":549},"        \u002F\u002F ...other cache options\n",[442,3815,3816],{"class":444,"line":1761},[442,3817,3560],{"class":455},[442,3819,3820],{"class":444,"line":3020},[442,3821,1729],{"class":455},[442,3823,3824],{"class":444,"line":3025},[442,3825,3826],{"class":549},"    \u002F\u002F Disable caching\n",[442,3828,3829,3832,3834,3836],{"class":444,"line":3567},[442,3830,3831],{"class":462},"    '\u002Fapi\u002Frealtime\u002F**'",[442,3833,3095],{"class":455},[442,3835,3040],{"class":893},[442,3837,2869],{"class":455},[442,3839,3840],{"class":444,"line":3572},[442,3841,2568],{"class":455},[442,3843,3845],{"class":444,"line":3844},20,[442,3846,584],{"class":455},[1512,3848,3849],{},[413,3850,3851,3854,3855,685,3858,3854,3861,689],{},[417,3852,3853],{},"swr: true"," is a shortcut for ",[417,3856,3857],{},"cache: { swr: true }",[417,3859,3860],{},"swr: \u003Cnumber>",[417,3862,3863],{},"cache: { swr: true, maxAge: \u003Cnumber> }",[742,3865,3866],{"id":2783},"Prerender",[413,3868,3869],{},"Mark routes for prerendering at build time:",[433,3871,3873],{"className":435,"code":3872,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fabout': { prerender: true },\n    '\u002Fdynamic\u002F**': { prerender: false },\n  }\n});\n",[417,3874,3875,3887,3891,3901,3905,3917,3928,3932],{"__ignoreMap":5},[442,3876,3877,3879,3881,3883,3885],{"class":444,"line":445},[442,3878,449],{"class":448},[442,3880,1547],{"class":455},[442,3882,459],{"class":448},[442,3884,463],{"class":462},[442,3886,466],{"class":455},[442,3888,3889],{"class":444,"line":469},[442,3890,473],{"emptyLinePlaceholder":472},[442,3892,3893,3895,3897,3899],{"class":444,"line":476},[442,3894,479],{"class":448},[442,3896,482],{"class":448},[442,3898,1566],{"class":494},[442,3900,1569],{"class":455},[442,3902,3903],{"class":444,"line":507},[442,3904,2856],{"class":455},[442,3906,3907,3910,3913,3915],{"class":444,"line":518},[442,3908,3909],{"class":462},"    '\u002Fabout'",[442,3911,3912],{"class":455},": { prerender: ",[442,3914,1380],{"class":893},[442,3916,2869],{"class":455},[442,3918,3919,3922,3924,3926],{"class":444,"line":581},[442,3920,3921],{"class":462},"    '\u002Fdynamic\u002F**'",[442,3923,3912],{"class":455},[442,3925,3040],{"class":893},[442,3927,2869],{"class":455},[442,3929,3930],{"class":444,"line":664},[442,3931,2568],{"class":455},[442,3933,3934],{"class":444,"line":670},[442,3935,584],{"class":455},[742,3937,3939],{"id":3938},"isr-vercel","ISR (Vercel)",[413,3941,3942],{},"Configure Incremental Static Regeneration for Vercel deployments:",[433,3944,3946],{"className":435,"code":3945,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    '\u002Fisr\u002F**': { isr: true },\n    '\u002Fisr-ttl\u002F**': { isr: 60 },\n    '\u002Fisr-custom\u002F**': {\n      isr: {\n        expiration: 60,\n        allowQuery: ['q'],\n        group: 1,\n      },\n    },\n  }\n});\n",[417,3947,3948,3960,3964,3974,3978,3990,4001,4008,4013,4022,4032,4042,4046,4050,4054],{"__ignoreMap":5},[442,3949,3950,3952,3954,3956,3958],{"class":444,"line":445},[442,3951,449],{"class":448},[442,3953,1547],{"class":455},[442,3955,459],{"class":448},[442,3957,463],{"class":462},[442,3959,466],{"class":455},[442,3961,3962],{"class":444,"line":469},[442,3963,473],{"emptyLinePlaceholder":472},[442,3965,3966,3968,3970,3972],{"class":444,"line":476},[442,3967,479],{"class":448},[442,3969,482],{"class":448},[442,3971,1566],{"class":494},[442,3973,1569],{"class":455},[442,3975,3976],{"class":444,"line":507},[442,3977,2856],{"class":455},[442,3979,3980,3983,3986,3988],{"class":444,"line":518},[442,3981,3982],{"class":462},"    '\u002Fisr\u002F**'",[442,3984,3985],{"class":455},": { isr: ",[442,3987,1380],{"class":893},[442,3989,2869],{"class":455},[442,3991,3992,3995,3997,3999],{"class":444,"line":581},[442,3993,3994],{"class":462},"    '\u002Fisr-ttl\u002F**'",[442,3996,3985],{"class":455},[442,3998,3797],{"class":893},[442,4000,2869],{"class":455},[442,4002,4003,4006],{"class":444,"line":664},[442,4004,4005],{"class":462},"    '\u002Fisr-custom\u002F**'",[442,4007,1696],{"class":455},[442,4009,4010],{"class":444,"line":670},[442,4011,4012],{"class":455},"      isr: {\n",[442,4014,4015,4018,4020],{"class":444,"line":1274},[442,4016,4017],{"class":455},"        expiration: ",[442,4019,3797],{"class":893},[442,4021,1688],{"class":455},[442,4023,4024,4027,4030],{"class":444,"line":1284},[442,4025,4026],{"class":455},"        allowQuery: [",[442,4028,4029],{"class":462},"'q'",[442,4031,2315],{"class":455},[442,4033,4034,4037,4040],{"class":444,"line":1732},[442,4035,4036],{"class":455},"        group: ",[442,4038,4039],{"class":893},"1",[442,4041,1688],{"class":455},[442,4043,4044],{"class":444,"line":1740},[442,4045,3560],{"class":455},[442,4047,4048],{"class":444,"line":1750},[442,4049,1729],{"class":455},[442,4051,4052],{"class":444,"line":1755},[442,4053,2568],{"class":455},[442,4055,4056],{"class":444,"line":1761},[442,4057,584],{"class":455},[742,4059,4061],{"id":4060},"route-rules-reference","Route rules reference",[1768,4063,4064,4074],{},[1771,4065,4066],{},[1774,4067,4068,4070,4072],{},[1777,4069,1779],{},[1777,4071,1782],{},[1777,4073,1785],{},[1787,4075,4076,4090,4106,4120,4133,4149,4165,4178,4192,4205],{},[1774,4077,4078,4082,4087],{},[1792,4079,4080],{},[417,4081,2752],{},[1792,4083,4084],{},[417,4085,4086],{},"Record\u003Cstring, string>",[1792,4088,4089],{},"Custom response headers",[1774,4091,4092,4096,4101],{},[1792,4093,4094],{},[417,4095,2756],{},[1792,4097,4098],{},[417,4099,4100],{},"string | { to: string, status?: number }",[1792,4102,4103,4104,688],{},"Redirect to another URL (default status: ",[417,4105,3332],{},[1774,4107,4108,4112,4117],{},[1792,4109,4110],{},[417,4111,2759],{},[1792,4113,4114],{},[417,4115,4116],{},"string | { to: string, ...proxyOptions }",[1792,4118,4119],{},"Proxy requests to another URL",[1774,4121,4122,4126,4130],{},[1792,4123,4124],{},[417,4125,2768],{},[1792,4127,4128],{},[417,4129,1835],{},[1792,4131,4132],{},"Enable permissive CORS headers",[1774,4134,4135,4139,4144],{},[1792,4136,4137],{},[417,4138,2762],{},[1792,4140,4141],{},[417,4142,4143],{},"object | false",[1792,4145,4146,4147,688],{},"Cache options (see ",[422,4148,2801],{"href":74},[1774,4150,4151,4155,4160],{},[1792,4152,4153],{},[417,4154,3702],{},[1792,4156,4157],{},[417,4158,4159],{},"boolean | number",[1792,4161,4162,4163],{},"Shortcut for ",[417,4164,2813],{},[1774,4166,4167,4171,4175],{},[1792,4168,4169],{},[417,4170,2787],{},[1792,4172,4173],{},[417,4174,4159],{},[1792,4176,4177],{},"Shortcut for static caching",[1774,4179,4180,4184,4189],{},[1792,4181,4182],{},[417,4183,2765],{},[1792,4185,4186],{},[417,4187,4188],{},"{ username, password, realm? } | false",[1792,4190,4191],{},"HTTP Basic Authentication",[1774,4193,4194,4198,4202],{},[1792,4195,4196],{},[417,4197,2783],{},[1792,4199,4200],{},[417,4201,1835],{},[1792,4203,4204],{},"Enable\u002Fdisable prerendering",[1774,4206,4207,4211,4216],{},[1792,4208,4209],{},[417,4210,2780],{},[1792,4212,4213],{},[417,4214,4215],{},"boolean | number | object",[1792,4217,4218],{},"Incremental Static Regeneration (Vercel)",[742,4220,4222],{"id":4221},"runtime-route-rules","Runtime route rules",[413,4224,4225,4226,4229],{},"Route rules can be provided through ",[417,4227,4228],{},"runtimeConfig",", allowing overrides via environment variables without rebuilding:",[433,4231,4233],{"className":435,"code":4232,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  runtimeConfig: {\n    nitro: {\n      routeRules: {\n        '\u002Fapi\u002F**': { headers: { 'x-env': 'production' } },\n      },\n    },\n  },\n});\n",[417,4234,4235,4247,4251,4261,4266,4271,4276,4293,4297,4301,4305],{"__ignoreMap":5},[442,4236,4237,4239,4241,4243,4245],{"class":444,"line":445},[442,4238,449],{"class":448},[442,4240,1547],{"class":455},[442,4242,459],{"class":448},[442,4244,463],{"class":462},[442,4246,466],{"class":455},[442,4248,4249],{"class":444,"line":469},[442,4250,473],{"emptyLinePlaceholder":472},[442,4252,4253,4255,4257,4259],{"class":444,"line":476},[442,4254,479],{"class":448},[442,4256,482],{"class":448},[442,4258,1566],{"class":494},[442,4260,1569],{"class":455},[442,4262,4263],{"class":444,"line":507},[442,4264,4265],{"class":455},"  runtimeConfig: {\n",[442,4267,4268],{"class":444,"line":518},[442,4269,4270],{"class":455},"    nitro: {\n",[442,4272,4273],{"class":444,"line":581},[442,4274,4275],{"class":455},"      routeRules: {\n",[442,4277,4278,4281,4283,4286,4288,4291],{"class":444,"line":664},[442,4279,4280],{"class":462},"        '\u002Fapi\u002F**'",[442,4282,2915],{"class":455},[442,4284,4285],{"class":462},"'x-env'",[442,4287,1682],{"class":455},[442,4289,4290],{"class":462},"'production'",[442,4292,2907],{"class":455},[442,4294,4295],{"class":444,"line":670},[442,4296,3560],{"class":455},[442,4298,4299],{"class":444,"line":1274},[442,4300,1729],{"class":455},[442,4302,4303],{"class":444,"line":1284},[442,4304,1758],{"class":455},[442,4306,4307],{"class":444,"line":1732},[442,4308,584],{"class":455},[408,4310,4312],{"id":4311},"config-reference","Config reference",[413,4314,4315],{},"These config options control routing behavior:",[1768,4317,4318,4331],{},[1771,4319,4320],{},[1774,4321,4322,4324,4326,4329],{},[1777,4323,1779],{},[1777,4325,1782],{},[1777,4327,4328],{},"Default",[1777,4330,1785],{},[1787,4332,4333,4352,4374,4393,4412,4431,4451,4470,4488,4507],{},[1774,4334,4335,4340,4344,4349],{},[1792,4336,4337],{},[417,4338,4339],{},"baseURL",[1792,4341,4342],{},[417,4343,1801],{},[1792,4345,4346],{},[417,4347,4348],{},"\"\u002F\"",[1792,4350,4351],{},"Base URL for all routes",[1774,4353,4354,4359,4363,4368],{},[1792,4355,4356],{},[417,4357,4358],{},"apiBaseURL",[1792,4360,4361],{},[417,4362,1801],{},[1792,4364,4365],{},[417,4366,4367],{},"\"\u002Fapi\"",[1792,4369,4370,4371,4373],{},"Base URL for routes in the ",[417,4372,600],{}," directory",[1774,4375,4376,4381,4385,4390],{},[1792,4377,4378],{},[417,4379,4380],{},"apiDir",[1792,4382,4383],{},[417,4384,1801],{},[1792,4386,4387],{},[417,4388,4389],{},"\"api\"",[1792,4391,4392],{},"Directory name for API routes",[1774,4394,4395,4400,4404,4409],{},[1792,4396,4397],{},[417,4398,4399],{},"routesDir",[1792,4401,4402],{},[417,4403,1801],{},[1792,4405,4406],{},[417,4407,4408],{},"\"routes\"",[1792,4410,4411],{},"Directory name for file-based routes",[1774,4413,4414,4419,4424,4428],{},[1792,4415,4416],{},[417,4417,4418],{},"serverDir",[1792,4420,4421],{},[417,4422,4423],{},"string | false",[1792,4425,4426],{},[417,4427,3040],{},[1792,4429,4430],{},"Server directory for scanning routes, middleware, plugins, etc.",[1774,4432,4433,4438,4443,4448],{},[1792,4434,4435],{},[417,4436,4437],{},"scanDirs",[1792,4439,4440],{},[417,4441,4442],{},"string[]",[1792,4444,4445],{},[417,4446,4447],{},"[]",[1792,4449,4450],{},"Additional directories to scan for routes",[1774,4452,4453,4457,4462,4467],{},[1792,4454,4455],{},[417,4456,1522],{},[1792,4458,4459],{},[417,4460,4461],{},"Record\u003Cstring, string | handler>",[1792,4463,4464],{},[417,4465,4466],{},"{}",[1792,4468,4469],{},"Route-to-handler mapping",[1774,4471,4472,4476,4481,4485],{},[1792,4473,4474],{},[417,4475,1888],{},[1792,4477,4478],{},[417,4479,4480],{},"NitroEventHandler[]",[1792,4482,4483],{},[417,4484,4447],{},[1792,4486,4487],{},"Programmatic handler registration (mainly for middleware)",[1774,4489,4490,4495,4500,4504],{},[1792,4491,4492],{},[417,4493,4494],{},"routeRules",[1792,4496,4497],{},[417,4498,4499],{},"Record\u003Cstring, NitroRouteConfig>",[1792,4501,4502],{},[417,4503,4466],{},[1792,4505,4506],{},"Route rules for matching patterns",[1774,4508,4509,4513,4517,4521],{},[1792,4510,4511],{},[417,4512,1533],{},[1792,4514,4515],{},[417,4516,4442],{},[1792,4518,4519],{},[417,4520,4447],{},[1792,4522,4523],{},"Glob patterns to ignore during file scanning",[4525,4526,4527],"style",{},"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 .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":5,"searchDepth":469,"depth":469,"links":4529},[4530,4531,4539,4545,4552,4553,4554,4567],{"id":410,"depth":469,"text":411},{"id":587,"depth":469,"text":588,"children":4532},[4533,4534,4535,4536,4537,4538],{"id":744,"depth":476,"text":745},{"id":814,"depth":476,"text":815},{"id":1148,"depth":476,"text":1149},{"id":1389,"depth":476,"text":1390},{"id":1463,"depth":476,"text":1464},{"id":1526,"depth":476,"text":1527},{"id":1619,"depth":469,"text":1620,"children":4540},[4541,4543],{"id":1629,"depth":476,"text":4542},"routes config",{"id":1885,"depth":476,"text":4544},"handlers config",{"id":2049,"depth":469,"text":294,"children":4546},[4547,4548,4549,4550,4551],{"id":2155,"depth":476,"text":2156},{"id":2245,"depth":476,"text":2246},{"id":2386,"depth":476,"text":2387},{"id":2477,"depth":476,"text":2478},{"id":2575,"depth":476,"text":2576},{"id":2677,"depth":469,"text":2678},{"id":2709,"depth":469,"text":2710},{"id":2733,"depth":469,"text":2734,"children":4555},[4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566],{"id":3030,"depth":476,"text":3031},{"id":2752,"depth":476,"text":3142},{"id":2768,"depth":476,"text":3224},{"id":2756,"depth":476,"text":3326},{"id":2759,"depth":476,"text":3435},{"id":3577,"depth":476,"text":3578},{"id":3693,"depth":476,"text":3694},{"id":2783,"depth":476,"text":3866},{"id":3938,"depth":476,"text":3939},{"id":4060,"depth":476,"text":4061},{"id":4221,"depth":476,"text":4222},{"id":4311,"depth":469,"text":4312},"Nitro supports filesystem routing to automatically map files to routes. By combining code-splitting with compiled routes, it removes the need for a runtime router, leaving only minimal compiled logic.",{"icon":26},{"icon":26},{"title":23,"description":4568},"cpTLTDFEty9wnRJq0gs51r01BbLrfp6CBlBmeBLL-jE",[4574,4576],{"title":18,"path":19,"stem":20,"description":4575,"icon":21,"children":-1},"Use a renderer to handle all unmatched routes with custom HTML or a templating system.",{"title":28,"path":29,"stem":30,"description":5,"icon":31,"children":-1},1783556385557]