[{"data":1,"prerenderedAt":4636},["ShallowReactive",2],{"navigation":3,"-docs-routing":402,"-docs-routing-surround":4632},[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":4627,"extension":2121,"meta":4628,"navigation":4629,"path":24,"seo":4630,"stem":25,"__hash__":4631},"content\u002F1.docs\u002F5.routing.md",{"type":405,"value":406,"toc":4587,"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,3258,3267,3285,3374,3377,3384,3483,3486,3489,3625,3629,3632,3741,3745,3757,3897,3914,3917,3920,3986,3990,3993,4108,4112,4278,4282,4289,4368,4372,4375,4583],[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,3230,3231,3234,3235,3238,3239,685,3242,3245,3246,3249,3250,3253,3254,3257],{},"Handle CORS at runtime with the ",[417,3229,2768],{}," rule. ",[417,3232,3233],{},"cors: true"," applies permissive defaults (origin, methods, and allowed headers ",[417,3236,3237],{},"*","): a simple request gets ",[417,3240,3241],{},"access-control-allow-origin: *",[417,3243,3244],{},"access-control-expose-headers: *",", and an ",[417,3247,3248],{},"OPTIONS"," preflight is answered directly (",[417,3251,3252],{},"204",") with the matching ",[417,3255,3256],{},"access-control-allow-*"," headers.",[736,3259,3260],{},[413,3261,3262,3263,3266],{},"\nCORS is applied by the running server (h3's ",[417,3264,3265],{},"handleCors","), not baked into static\u002FCDN config. On platforms that can serve prerendered\u002Fstatic assets straight from the edge (e.g. Netlify, Vercel), CORS headers are only added when the request reaches the server handler.",[413,3268,3269,3270,1009,3273,3276,3277,3280,3281,3284],{},"Pass an object for finer control — an origin allowlist, ",[417,3271,3272],{},"credentials",[417,3274,3275],{},"maxAge",", etc. (h3 ",[417,3278,3279],{},"CorsOptions","). Combining ",[417,3282,3283],{},"credentials: true"," with a wildcard origin is invalid and throws at build time:",[433,3286,3288],{"className":435,"code":3287,"filename":1538,"language":438,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  routeRules: {\n    \u002F\u002F Permissive defaults\n    '\u002Fapi\u002Fpublic\u002F**': { cors: true },\n    \u002F\u002F Restrict to specific origins with credentials\n    '\u002Fapi\u002Fv1\u002F**': {\n      cors: { origin: ['https:\u002F\u002Fapp.example.com'], credentials: true },\n    },\n  }\n});\n",[417,3289,3290,3302,3306,3316,3320,3325,3336,3341,3347,3362,3366,3370],{"__ignoreMap":5},[442,3291,3292,3294,3296,3298,3300],{"class":444,"line":445},[442,3293,449],{"class":448},[442,3295,1547],{"class":455},[442,3297,459],{"class":448},[442,3299,463],{"class":462},[442,3301,466],{"class":455},[442,3303,3304],{"class":444,"line":469},[442,3305,473],{"emptyLinePlaceholder":472},[442,3307,3308,3310,3312,3314],{"class":444,"line":476},[442,3309,479],{"class":448},[442,3311,482],{"class":448},[442,3313,1566],{"class":494},[442,3315,1569],{"class":455},[442,3317,3318],{"class":444,"line":507},[442,3319,2856],{"class":455},[442,3321,3322],{"class":444,"line":518},[442,3323,3324],{"class":549},"    \u002F\u002F Permissive defaults\n",[442,3326,3327,3330,3332,3334],{"class":444,"line":581},[442,3328,3329],{"class":462},"    '\u002Fapi\u002Fpublic\u002F**'",[442,3331,2933],{"class":455},[442,3333,1380],{"class":893},[442,3335,2869],{"class":455},[442,3337,3338],{"class":444,"line":664},[442,3339,3340],{"class":549},"    \u002F\u002F Restrict to specific origins with credentials\n",[442,3342,3343,3345],{"class":444,"line":670},[442,3344,2930],{"class":462},[442,3346,1696],{"class":455},[442,3348,3349,3352,3355,3358,3360],{"class":444,"line":1274},[442,3350,3351],{"class":455},"      cors: { origin: [",[442,3353,3354],{"class":462},"'https:\u002F\u002Fapp.example.com'",[442,3356,3357],{"class":455},"], credentials: ",[442,3359,1380],{"class":893},[442,3361,2869],{"class":455},[442,3363,3364],{"class":444,"line":1284},[442,3365,1729],{"class":455},[442,3367,3368],{"class":444,"line":1732},[442,3369,2568],{"class":455},[442,3371,3372],{"class":444,"line":1740},[442,3373,584],{"class":455},[742,3375,3376],{"id":2756},"Redirect",[413,3378,3379,3380,3383],{},"Redirect matching routes to another URL. Use a string for a simple redirect (defaults to ",[417,3381,3382],{},"307"," status), or an object for more control:",[433,3385,3387],{"className":435,"code":3386,"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,3388,3389,3401,3405,3415,3419,3424,3434,3439,3458,3463,3475,3479],{"__ignoreMap":5},[442,3390,3391,3393,3395,3397,3399],{"class":444,"line":445},[442,3392,449],{"class":448},[442,3394,1547],{"class":455},[442,3396,459],{"class":448},[442,3398,463],{"class":462},[442,3400,466],{"class":455},[442,3402,3403],{"class":444,"line":469},[442,3404,473],{"emptyLinePlaceholder":472},[442,3406,3407,3409,3411,3413],{"class":444,"line":476},[442,3408,479],{"class":448},[442,3410,482],{"class":448},[442,3412,1566],{"class":494},[442,3414,1569],{"class":455},[442,3416,3417],{"class":444,"line":507},[442,3418,2856],{"class":455},[442,3420,3421],{"class":444,"line":518},[442,3422,3423],{"class":549},"    \u002F\u002F Simple redirect (307 status)\n",[442,3425,3426,3428,3430,3432],{"class":444,"line":581},[442,3427,2953],{"class":462},[442,3429,2956],{"class":455},[442,3431,2959],{"class":462},[442,3433,2869],{"class":455},[442,3435,3436],{"class":444,"line":664},[442,3437,3438],{"class":549},"    \u002F\u002F Redirect with custom status\n",[442,3440,3441,3444,3447,3450,3453,3456],{"class":444,"line":670},[442,3442,3443],{"class":462},"    '\u002Flegacy'",[442,3445,3446],{"class":455},": { redirect: { to: ",[442,3448,3449],{"class":462},"'https:\u002F\u002Fexample.com\u002F'",[442,3451,3452],{"class":455},", status: ",[442,3454,3455],{"class":893},"308",[442,3457,2907],{"class":455},[442,3459,3460],{"class":444,"line":1274},[442,3461,3462],{"class":549},"    \u002F\u002F Wildcard redirect — preserves the path after the pattern\n",[442,3464,3465,3468,3470,3473],{"class":444,"line":1284},[442,3466,3467],{"class":462},"    '\u002Fold-blog\u002F**'",[442,3469,2956],{"class":455},[442,3471,3472],{"class":462},"'https:\u002F\u002Fblog.example.com\u002F**'",[442,3474,2869],{"class":455},[442,3476,3477],{"class":444,"line":1732},[442,3478,2568],{"class":455},[442,3480,3481],{"class":444,"line":1740},[442,3482,584],{"class":455},[742,3484,3485],{"id":2759},"Proxy",[413,3487,3488],{},"Proxy requests to another URL. Supports both internal and external targets:",[433,3490,3492],{"className":435,"code":3491,"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,3493,3494,3506,3510,3520,3524,3529,3540,3545,3557,3562,3574,3579,3586,3591,3601,3606,3611,3615,3620],{"__ignoreMap":5},[442,3495,3496,3498,3500,3502,3504],{"class":444,"line":445},[442,3497,449],{"class":448},[442,3499,1547],{"class":455},[442,3501,459],{"class":448},[442,3503,463],{"class":462},[442,3505,466],{"class":455},[442,3507,3508],{"class":444,"line":469},[442,3509,473],{"emptyLinePlaceholder":472},[442,3511,3512,3514,3516,3518],{"class":444,"line":476},[442,3513,479],{"class":448},[442,3515,482],{"class":448},[442,3517,1566],{"class":494},[442,3519,1569],{"class":455},[442,3521,3522],{"class":444,"line":507},[442,3523,2856],{"class":455},[442,3525,3526],{"class":444,"line":518},[442,3527,3528],{"class":549},"    \u002F\u002F Proxy to exact URL\n",[442,3530,3531,3534,3536,3538],{"class":444,"line":581},[442,3532,3533],{"class":462},"    '\u002Fapi\u002Fproxy\u002Fexample'",[442,3535,2981],{"class":455},[442,3537,2984],{"class":462},[442,3539,2869],{"class":455},[442,3541,3542],{"class":444,"line":664},[442,3543,3544],{"class":549},"    \u002F\u002F Proxy to internal route\n",[442,3546,3547,3550,3552,3555],{"class":444,"line":670},[442,3548,3549],{"class":462},"    '\u002Fapi\u002Fproxy\u002F**'",[442,3551,2981],{"class":455},[442,3553,3554],{"class":462},"'\u002Fapi\u002Fecho'",[442,3556,2869],{"class":455},[442,3558,3559],{"class":444,"line":1274},[442,3560,3561],{"class":549},"    \u002F\u002F Wildcard proxy — preserves the path after the pattern\n",[442,3563,3564,3567,3569,3572],{"class":444,"line":1284},[442,3565,3566],{"class":462},"    '\u002Fcdn\u002F**'",[442,3568,2981],{"class":455},[442,3570,3571],{"class":462},"'https:\u002F\u002Fcdn.jsdelivr.net\u002F**'",[442,3573,2869],{"class":455},[442,3575,3576],{"class":444,"line":1732},[442,3577,3578],{"class":549},"    \u002F\u002F Proxy with options\n",[442,3580,3581,3584],{"class":444,"line":1740},[442,3582,3583],{"class":462},"    '\u002Fexternal\u002F**'",[442,3585,1696],{"class":455},[442,3587,3588],{"class":444,"line":1750},[442,3589,3590],{"class":455},"      proxy: {\n",[442,3592,3593,3596,3599],{"class":444,"line":1755},[442,3594,3595],{"class":455},"        to: ",[442,3597,3598],{"class":462},"'https:\u002F\u002Fapi.example.com\u002F**'",[442,3600,1688],{"class":455},[442,3602,3603],{"class":444,"line":1761},[442,3604,3605],{"class":549},"        \u002F\u002F Additional H3 proxy options...\n",[442,3607,3608],{"class":444,"line":3020},[442,3609,3610],{"class":455},"      },\n",[442,3612,3613],{"class":444,"line":3025},[442,3614,1729],{"class":455},[442,3616,3618],{"class":444,"line":3617},18,[442,3619,2568],{"class":455},[442,3621,3623],{"class":444,"line":3622},19,[442,3624,584],{"class":455},[742,3626,3628],{"id":3627},"basic-auth","Basic auth",[413,3630,3631],{},"Protect routes with HTTP Basic Authentication:",[433,3633,3635],{"className":435,"code":3634,"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,3636,3637,3649,3653,3663,3667,3673,3678,3687,3696,3710,3714,3718,3723,3733,3737],{"__ignoreMap":5},[442,3638,3639,3641,3643,3645,3647],{"class":444,"line":445},[442,3640,449],{"class":448},[442,3642,1547],{"class":455},[442,3644,459],{"class":448},[442,3646,463],{"class":462},[442,3648,466],{"class":455},[442,3650,3651],{"class":444,"line":469},[442,3652,473],{"emptyLinePlaceholder":472},[442,3654,3655,3657,3659,3661],{"class":444,"line":476},[442,3656,479],{"class":448},[442,3658,482],{"class":448},[442,3660,1566],{"class":494},[442,3662,1569],{"class":455},[442,3664,3665],{"class":444,"line":507},[442,3666,2856],{"class":455},[442,3668,3669,3671],{"class":444,"line":518},[442,3670,3003],{"class":462},[442,3672,1696],{"class":455},[442,3674,3675],{"class":444,"line":581},[442,3676,3677],{"class":455},"      basicAuth: {\n",[442,3679,3680,3683,3685],{"class":444,"line":664},[442,3681,3682],{"class":455},"        username: ",[442,3684,3009],{"class":462},[442,3686,1688],{"class":455},[442,3688,3689,3692,3694],{"class":444,"line":670},[442,3690,3691],{"class":455},"        password: ",[442,3693,3015],{"class":462},[442,3695,1688],{"class":455},[442,3697,3698,3701,3704,3707],{"class":444,"line":1274},[442,3699,3700],{"class":455},"        realm: ",[442,3702,3703],{"class":462},"'Admin Area'",[442,3705,3706],{"class":455},",  ",[442,3708,3709],{"class":549},"\u002F\u002F Optional, shown in the browser prompt\n",[442,3711,3712],{"class":444,"line":1284},[442,3713,3610],{"class":455},[442,3715,3716],{"class":444,"line":1732},[442,3717,1729],{"class":455},[442,3719,3720],{"class":444,"line":1740},[442,3721,3722],{"class":549},"    \u002F\u002F Disable basic auth for a sub-path\n",[442,3724,3725,3727,3729,3731],{"class":444,"line":1750},[442,3726,3124],{"class":462},[442,3728,3127],{"class":455},[442,3730,3040],{"class":893},[442,3732,2869],{"class":455},[442,3734,3735],{"class":444,"line":1755},[442,3736,2568],{"class":455},[442,3738,3739],{"class":444,"line":1761},[442,3740,584],{"class":455},[742,3742,3744],{"id":3743},"caching-swr-static","Caching (SWR \u002F Static)",[413,3746,3747,3748,1009,3750,3753,3754,3756],{},"Control caching behavior with ",[417,3749,2762],{},[417,3751,3752],{},"swr",", or ",[417,3755,2787],{}," options:",[433,3758,3760],{"className":435,"code":3759,"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,3761,3762,3774,3778,3788,3792,3797,3807,3812,3823,3828,3835,3840,3850,3859,3864,3868,3872,3877,3888,3892],{"__ignoreMap":5},[442,3763,3764,3766,3768,3770,3772],{"class":444,"line":445},[442,3765,449],{"class":448},[442,3767,1547],{"class":455},[442,3769,459],{"class":448},[442,3771,463],{"class":462},[442,3773,466],{"class":455},[442,3775,3776],{"class":444,"line":469},[442,3777,473],{"emptyLinePlaceholder":472},[442,3779,3780,3782,3784,3786],{"class":444,"line":476},[442,3781,479],{"class":448},[442,3783,482],{"class":448},[442,3785,1566],{"class":494},[442,3787,1569],{"class":455},[442,3789,3790],{"class":444,"line":507},[442,3791,2856],{"class":455},[442,3793,3794],{"class":444,"line":518},[442,3795,3796],{"class":549},"    \u002F\u002F Enable stale-while-revalidate caching\n",[442,3798,3799,3801,3803,3805],{"class":444,"line":581},[442,3800,2861],{"class":462},[442,3802,2864],{"class":455},[442,3804,1380],{"class":893},[442,3806,2869],{"class":455},[442,3808,3809],{"class":444,"line":664},[442,3810,3811],{"class":549},"    \u002F\u002F SWR with maxAge in seconds\n",[442,3813,3814,3817,3819,3821],{"class":444,"line":670},[442,3815,3816],{"class":462},"    '\u002Fblog\u002Fposts\u002F**'",[442,3818,2864],{"class":455},[442,3820,2879],{"class":893},[442,3822,2869],{"class":455},[442,3824,3825],{"class":444,"line":1274},[442,3826,3827],{"class":549},"    \u002F\u002F Full cache options\n",[442,3829,3830,3833],{"class":444,"line":1284},[442,3831,3832],{"class":462},"    '\u002Fapi\u002Fdata\u002F**'",[442,3834,1696],{"class":455},[442,3836,3837],{"class":444,"line":1732},[442,3838,3839],{"class":455},"      cache: {\n",[442,3841,3842,3845,3848],{"class":444,"line":1740},[442,3843,3844],{"class":455},"        maxAge: ",[442,3846,3847],{"class":893},"60",[442,3849,1688],{"class":455},[442,3851,3852,3855,3857],{"class":444,"line":1750},[442,3853,3854],{"class":455},"        swr: ",[442,3856,1380],{"class":893},[442,3858,1688],{"class":455},[442,3860,3861],{"class":444,"line":1755},[442,3862,3863],{"class":549},"        \u002F\u002F ...other cache options\n",[442,3865,3866],{"class":444,"line":1761},[442,3867,3610],{"class":455},[442,3869,3870],{"class":444,"line":3020},[442,3871,1729],{"class":455},[442,3873,3874],{"class":444,"line":3025},[442,3875,3876],{"class":549},"    \u002F\u002F Disable caching\n",[442,3878,3879,3882,3884,3886],{"class":444,"line":3617},[442,3880,3881],{"class":462},"    '\u002Fapi\u002Frealtime\u002F**'",[442,3883,3095],{"class":455},[442,3885,3040],{"class":893},[442,3887,2869],{"class":455},[442,3889,3890],{"class":444,"line":3622},[442,3891,2568],{"class":455},[442,3893,3895],{"class":444,"line":3894},20,[442,3896,584],{"class":455},[1512,3898,3899],{},[413,3900,3901,3904,3905,685,3908,3904,3911,689],{},[417,3902,3903],{},"swr: true"," is a shortcut for ",[417,3906,3907],{},"cache: { swr: true }",[417,3909,3910],{},"swr: \u003Cnumber>",[417,3912,3913],{},"cache: { swr: true, maxAge: \u003Cnumber> }",[742,3915,3916],{"id":2783},"Prerender",[413,3918,3919],{},"Mark routes for prerendering at build time:",[433,3921,3923],{"className":435,"code":3922,"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,3924,3925,3937,3941,3951,3955,3967,3978,3982],{"__ignoreMap":5},[442,3926,3927,3929,3931,3933,3935],{"class":444,"line":445},[442,3928,449],{"class":448},[442,3930,1547],{"class":455},[442,3932,459],{"class":448},[442,3934,463],{"class":462},[442,3936,466],{"class":455},[442,3938,3939],{"class":444,"line":469},[442,3940,473],{"emptyLinePlaceholder":472},[442,3942,3943,3945,3947,3949],{"class":444,"line":476},[442,3944,479],{"class":448},[442,3946,482],{"class":448},[442,3948,1566],{"class":494},[442,3950,1569],{"class":455},[442,3952,3953],{"class":444,"line":507},[442,3954,2856],{"class":455},[442,3956,3957,3960,3963,3965],{"class":444,"line":518},[442,3958,3959],{"class":462},"    '\u002Fabout'",[442,3961,3962],{"class":455},": { prerender: ",[442,3964,1380],{"class":893},[442,3966,2869],{"class":455},[442,3968,3969,3972,3974,3976],{"class":444,"line":581},[442,3970,3971],{"class":462},"    '\u002Fdynamic\u002F**'",[442,3973,3962],{"class":455},[442,3975,3040],{"class":893},[442,3977,2869],{"class":455},[442,3979,3980],{"class":444,"line":664},[442,3981,2568],{"class":455},[442,3983,3984],{"class":444,"line":670},[442,3985,584],{"class":455},[742,3987,3989],{"id":3988},"isr-vercel","ISR (Vercel)",[413,3991,3992],{},"Configure Incremental Static Regeneration for Vercel deployments:",[433,3994,3996],{"className":435,"code":3995,"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,3997,3998,4010,4014,4024,4028,4040,4051,4058,4063,4072,4082,4092,4096,4100,4104],{"__ignoreMap":5},[442,3999,4000,4002,4004,4006,4008],{"class":444,"line":445},[442,4001,449],{"class":448},[442,4003,1547],{"class":455},[442,4005,459],{"class":448},[442,4007,463],{"class":462},[442,4009,466],{"class":455},[442,4011,4012],{"class":444,"line":469},[442,4013,473],{"emptyLinePlaceholder":472},[442,4015,4016,4018,4020,4022],{"class":444,"line":476},[442,4017,479],{"class":448},[442,4019,482],{"class":448},[442,4021,1566],{"class":494},[442,4023,1569],{"class":455},[442,4025,4026],{"class":444,"line":507},[442,4027,2856],{"class":455},[442,4029,4030,4033,4036,4038],{"class":444,"line":518},[442,4031,4032],{"class":462},"    '\u002Fisr\u002F**'",[442,4034,4035],{"class":455},": { isr: ",[442,4037,1380],{"class":893},[442,4039,2869],{"class":455},[442,4041,4042,4045,4047,4049],{"class":444,"line":581},[442,4043,4044],{"class":462},"    '\u002Fisr-ttl\u002F**'",[442,4046,4035],{"class":455},[442,4048,3847],{"class":893},[442,4050,2869],{"class":455},[442,4052,4053,4056],{"class":444,"line":664},[442,4054,4055],{"class":462},"    '\u002Fisr-custom\u002F**'",[442,4057,1696],{"class":455},[442,4059,4060],{"class":444,"line":670},[442,4061,4062],{"class":455},"      isr: {\n",[442,4064,4065,4068,4070],{"class":444,"line":1274},[442,4066,4067],{"class":455},"        expiration: ",[442,4069,3847],{"class":893},[442,4071,1688],{"class":455},[442,4073,4074,4077,4080],{"class":444,"line":1284},[442,4075,4076],{"class":455},"        allowQuery: [",[442,4078,4079],{"class":462},"'q'",[442,4081,2315],{"class":455},[442,4083,4084,4087,4090],{"class":444,"line":1732},[442,4085,4086],{"class":455},"        group: ",[442,4088,4089],{"class":893},"1",[442,4091,1688],{"class":455},[442,4093,4094],{"class":444,"line":1740},[442,4095,3610],{"class":455},[442,4097,4098],{"class":444,"line":1750},[442,4099,1729],{"class":455},[442,4101,4102],{"class":444,"line":1755},[442,4103,2568],{"class":455},[442,4105,4106],{"class":444,"line":1761},[442,4107,584],{"class":455},[742,4109,4111],{"id":4110},"route-rules-reference","Route rules reference",[1768,4113,4114,4124],{},[1771,4115,4116],{},[1774,4117,4118,4120,4122],{},[1777,4119,1779],{},[1777,4121,1782],{},[1777,4123,1785],{},[1787,4125,4126,4140,4156,4170,4189,4205,4224,4237,4251,4264],{},[1774,4127,4128,4132,4137],{},[1792,4129,4130],{},[417,4131,2752],{},[1792,4133,4134],{},[417,4135,4136],{},"Record\u003Cstring, string>",[1792,4138,4139],{},"Custom response headers",[1774,4141,4142,4146,4151],{},[1792,4143,4144],{},[417,4145,2756],{},[1792,4147,4148],{},[417,4149,4150],{},"string | { to: string, status?: number }",[1792,4152,4153,4154,688],{},"Redirect to another URL (default status: ",[417,4155,3382],{},[1774,4157,4158,4162,4167],{},[1792,4159,4160],{},[417,4161,2759],{},[1792,4163,4164],{},[417,4165,4166],{},"string | { to: string, ...proxyOptions }",[1792,4168,4169],{},"Proxy requests to another URL",[1774,4171,4172,4176,4181],{},[1792,4173,4174],{},[417,4175,2768],{},[1792,4177,4178],{},[417,4179,4180],{},"boolean | CorsOptions",[1792,4182,4183,4184,485,4186,4188],{},"Handle CORS via h3's ",[417,4185,3265],{},[417,4187,1380],{}," = permissive)",[1774,4190,4191,4195,4200],{},[1792,4192,4193],{},[417,4194,2762],{},[1792,4196,4197],{},[417,4198,4199],{},"object | false",[1792,4201,4202,4203,688],{},"Cache options (see ",[422,4204,2801],{"href":74},[1774,4206,4207,4211,4216],{},[1792,4208,4209],{},[417,4210,3752],{},[1792,4212,4213],{},[417,4214,4215],{},"boolean | number",[1792,4217,4218,4219,485,4221,4223],{},"Shortcut for ",[417,4220,2813],{},[417,4222,3040],{}," resets an inherited cache rule)",[1774,4225,4226,4230,4234],{},[1792,4227,4228],{},[417,4229,2787],{},[1792,4231,4232],{},[417,4233,4215],{},[1792,4235,4236],{},"Shortcut for static caching",[1774,4238,4239,4243,4248],{},[1792,4240,4241],{},[417,4242,2765],{},[1792,4244,4245],{},[417,4246,4247],{},"{ username, password, realm? } | false",[1792,4249,4250],{},"HTTP Basic Authentication",[1774,4252,4253,4257,4261],{},[1792,4254,4255],{},[417,4256,2783],{},[1792,4258,4259],{},[417,4260,1835],{},[1792,4262,4263],{},"Enable\u002Fdisable prerendering",[1774,4265,4266,4270,4275],{},[1792,4267,4268],{},[417,4269,2780],{},[1792,4271,4272],{},[417,4273,4274],{},"boolean | number | object",[1792,4276,4277],{},"Incremental Static Regeneration (Vercel)",[742,4279,4281],{"id":4280},"runtime-route-rules","Runtime route rules",[413,4283,4284,4285,4288],{},"Route rules can be provided through ",[417,4286,4287],{},"runtimeConfig",", allowing overrides via environment variables without rebuilding:",[433,4290,4292],{"className":435,"code":4291,"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,4293,4294,4306,4310,4320,4325,4330,4335,4352,4356,4360,4364],{"__ignoreMap":5},[442,4295,4296,4298,4300,4302,4304],{"class":444,"line":445},[442,4297,449],{"class":448},[442,4299,1547],{"class":455},[442,4301,459],{"class":448},[442,4303,463],{"class":462},[442,4305,466],{"class":455},[442,4307,4308],{"class":444,"line":469},[442,4309,473],{"emptyLinePlaceholder":472},[442,4311,4312,4314,4316,4318],{"class":444,"line":476},[442,4313,479],{"class":448},[442,4315,482],{"class":448},[442,4317,1566],{"class":494},[442,4319,1569],{"class":455},[442,4321,4322],{"class":444,"line":507},[442,4323,4324],{"class":455},"  runtimeConfig: {\n",[442,4326,4327],{"class":444,"line":518},[442,4328,4329],{"class":455},"    nitro: {\n",[442,4331,4332],{"class":444,"line":581},[442,4333,4334],{"class":455},"      routeRules: {\n",[442,4336,4337,4340,4342,4345,4347,4350],{"class":444,"line":664},[442,4338,4339],{"class":462},"        '\u002Fapi\u002F**'",[442,4341,2915],{"class":455},[442,4343,4344],{"class":462},"'x-env'",[442,4346,1682],{"class":455},[442,4348,4349],{"class":462},"'production'",[442,4351,2907],{"class":455},[442,4353,4354],{"class":444,"line":670},[442,4355,3610],{"class":455},[442,4357,4358],{"class":444,"line":1274},[442,4359,1729],{"class":455},[442,4361,4362],{"class":444,"line":1284},[442,4363,1758],{"class":455},[442,4365,4366],{"class":444,"line":1732},[442,4367,584],{"class":455},[408,4369,4371],{"id":4370},"config-reference","Config reference",[413,4373,4374],{},"These config options control routing behavior:",[1768,4376,4377,4390],{},[1771,4378,4379],{},[1774,4380,4381,4383,4385,4388],{},[1777,4382,1779],{},[1777,4384,1782],{},[1777,4386,4387],{},"Default",[1777,4389,1785],{},[1787,4391,4392,4411,4433,4452,4471,4490,4510,4529,4547,4566],{},[1774,4393,4394,4399,4403,4408],{},[1792,4395,4396],{},[417,4397,4398],{},"baseURL",[1792,4400,4401],{},[417,4402,1801],{},[1792,4404,4405],{},[417,4406,4407],{},"\"\u002F\"",[1792,4409,4410],{},"Base URL for all routes",[1774,4412,4413,4418,4422,4427],{},[1792,4414,4415],{},[417,4416,4417],{},"apiBaseURL",[1792,4419,4420],{},[417,4421,1801],{},[1792,4423,4424],{},[417,4425,4426],{},"\"\u002Fapi\"",[1792,4428,4429,4430,4432],{},"Base URL for routes in the ",[417,4431,600],{}," directory",[1774,4434,4435,4440,4444,4449],{},[1792,4436,4437],{},[417,4438,4439],{},"apiDir",[1792,4441,4442],{},[417,4443,1801],{},[1792,4445,4446],{},[417,4447,4448],{},"\"api\"",[1792,4450,4451],{},"Directory name for API routes",[1774,4453,4454,4459,4463,4468],{},[1792,4455,4456],{},[417,4457,4458],{},"routesDir",[1792,4460,4461],{},[417,4462,1801],{},[1792,4464,4465],{},[417,4466,4467],{},"\"routes\"",[1792,4469,4470],{},"Directory name for file-based routes",[1774,4472,4473,4478,4483,4487],{},[1792,4474,4475],{},[417,4476,4477],{},"serverDir",[1792,4479,4480],{},[417,4481,4482],{},"string | false",[1792,4484,4485],{},[417,4486,3040],{},[1792,4488,4489],{},"Server directory for scanning routes, middleware, plugins, etc.",[1774,4491,4492,4497,4502,4507],{},[1792,4493,4494],{},[417,4495,4496],{},"scanDirs",[1792,4498,4499],{},[417,4500,4501],{},"string[]",[1792,4503,4504],{},[417,4505,4506],{},"[]",[1792,4508,4509],{},"Additional directories to scan for routes",[1774,4511,4512,4516,4521,4526],{},[1792,4513,4514],{},[417,4515,1522],{},[1792,4517,4518],{},[417,4519,4520],{},"Record\u003Cstring, string | handler>",[1792,4522,4523],{},[417,4524,4525],{},"{}",[1792,4527,4528],{},"Route-to-handler mapping",[1774,4530,4531,4535,4540,4544],{},[1792,4532,4533],{},[417,4534,1888],{},[1792,4536,4537],{},[417,4538,4539],{},"NitroEventHandler[]",[1792,4541,4542],{},[417,4543,4506],{},[1792,4545,4546],{},"Programmatic handler registration (mainly for middleware)",[1774,4548,4549,4554,4559,4563],{},[1792,4550,4551],{},[417,4552,4553],{},"routeRules",[1792,4555,4556],{},[417,4557,4558],{},"Record\u003Cstring, NitroRouteConfig>",[1792,4560,4561],{},[417,4562,4525],{},[1792,4564,4565],{},"Route rules for matching patterns",[1774,4567,4568,4572,4576,4580],{},[1792,4569,4570],{},[417,4571,1533],{},[1792,4573,4574],{},[417,4575,4501],{},[1792,4577,4578],{},[417,4579,4506],{},[1792,4581,4582],{},"Glob patterns to ignore during file scanning",[4584,4585,4586],"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":4588},[4589,4590,4598,4604,4611,4612,4613,4626],{"id":410,"depth":469,"text":411},{"id":587,"depth":469,"text":588,"children":4591},[4592,4593,4594,4595,4596,4597],{"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":4599},[4600,4602],{"id":1629,"depth":476,"text":4601},"routes config",{"id":1885,"depth":476,"text":4603},"handlers config",{"id":2049,"depth":469,"text":294,"children":4605},[4606,4607,4608,4609,4610],{"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":4614},[4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625],{"id":3030,"depth":476,"text":3031},{"id":2752,"depth":476,"text":3142},{"id":2768,"depth":476,"text":3224},{"id":2756,"depth":476,"text":3376},{"id":2759,"depth":476,"text":3485},{"id":3627,"depth":476,"text":3628},{"id":3743,"depth":476,"text":3744},{"id":2783,"depth":476,"text":3916},{"id":3988,"depth":476,"text":3989},{"id":4110,"depth":476,"text":4111},{"id":4280,"depth":476,"text":4281},{"id":4370,"depth":469,"text":4371},"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":4627},"RtS0hcWTCIif_jDnFvGjJRmvLj7-O9oR-tfe2ERvelo",[4633,4635],{"title":18,"path":19,"stem":20,"description":4634,"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},1783800037654]