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