[{"data":1,"prerenderedAt":2576},["ShallowReactive",2],{"navigation":3,"-docs-renderer":445,"-docs-renderer-surround":2571},[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":447,"body":448,"description":2566,"extension":2282,"meta":2567,"navigation":2568,"path":19,"seo":2569,"stem":20,"__hash__":2570},"content\u002F1.docs\u002F4.renderer.md","Nitro Renderer",{"type":449,"value":450,"toc":2545,"icon":21},"minimark",[451,455,459,467,586,657,668,672,679,685,688,954,965,968,990,994,1001,1195,1199,1208,1214,1275,1278,1282,1291,1296,1314,1357,1361,1368,1501,1505,1511,1593,1597,1604,1664,1668,1671,1758,1762,1819,1990,1994,1998,2001,2011,2179,2182,2232,2244,2248,2259,2278,2310,2326,2328,2332,2335,2339,2349,2356,2369,2512,2516,2522,2526,2530,2536,2541],[452,453,454],"p",{},"The renderer is a special handler in Nitro that catches all routes that don't match any specific API or route handler. It's commonly used for server-side rendering (SSR), serving single-page applications (SPAs), or creating custom HTML responses.",[456,457,33],"h2",{"id":458},"configuration",[452,460,461,462,466],{},"The renderer is configured using the ",[463,464,465],"code",{},"renderer"," option in your Nitro config:",[468,469,474],"pre",{"className":470,"code":471,"filename":472,"language":473,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    template: '.\u002Findex.html',  \u002F\u002F Path to HTML template file\n    handler: '.\u002Frenderer.ts',  \u002F\u002F Path to custom renderer handler\n    static: false,             \u002F\u002F Force dynamic template processing (auto-detected when unset)\n  }\n})\n","nitro.config.ts","ts",[463,475,476,499,506,522,528,544,558,574,580],{"__ignoreMap":5},[477,478,481,485,489,492,496],"span",{"class":479,"line":480},"line",1,[477,482,484],{"class":483},"so5gQ","import",[477,486,488],{"class":487},"slsVL"," { defineConfig } ",[477,490,491],{"class":483},"from",[477,493,495],{"class":494},"sfrk1"," \"nitro\"",[477,497,498],{"class":487},";\n",[477,500,502],{"class":479,"line":501},2,[477,503,505],{"emptyLinePlaceholder":504},true,"\n",[477,507,509,512,515,519],{"class":479,"line":508},3,[477,510,511],{"class":483},"export",[477,513,514],{"class":483}," default",[477,516,518],{"class":517},"shcOC"," defineConfig",[477,520,521],{"class":487},"({\n",[477,523,525],{"class":479,"line":524},4,[477,526,527],{"class":487},"  renderer: {\n",[477,529,531,534,537,540],{"class":479,"line":530},5,[477,532,533],{"class":487},"    template: ",[477,535,536],{"class":494},"'.\u002Findex.html'",[477,538,539],{"class":487},",  ",[477,541,543],{"class":542},"sCsY4","\u002F\u002F Path to HTML template file\n",[477,545,547,550,553,555],{"class":479,"line":546},6,[477,548,549],{"class":487},"    handler: ",[477,551,552],{"class":494},"'.\u002Frenderer.ts'",[477,554,539],{"class":487},[477,556,557],{"class":542},"\u002F\u002F Path to custom renderer handler\n",[477,559,561,564,568,571],{"class":479,"line":560},7,[477,562,563],{"class":487},"    static: ",[477,565,567],{"class":566},"suiK_","false",[477,569,570],{"class":487},",             ",[477,572,573],{"class":542},"\u002F\u002F Force dynamic template processing (auto-detected when unset)\n",[477,575,577],{"class":479,"line":576},8,[477,578,579],{"class":487},"  }\n",[477,581,583],{"class":479,"line":582},9,[477,584,585],{"class":487},"})\n",[587,588,589,605],"table",{},[590,591,592],"thead",{},[593,594,595,599,602],"tr",{},[596,597,598],"th",{},"Option",[596,600,601],{},"Type",[596,603,604],{},"Description",[606,607,608,624,638],"tbody",{},[593,609,610,616,621],{},[611,612,613],"td",{},[463,614,615],{},"template",[611,617,618],{},[463,619,620],{},"string",[611,622,623],{},"Path to an HTML file used as the renderer template.",[593,625,626,631,635],{},[611,627,628],{},[463,629,630],{},"handler",[611,632,633],{},[463,634,620],{},[611,636,637],{},"Path to a custom renderer handler module.",[593,639,640,645,650],{},[611,641,642],{},[463,643,644],{},"static",[611,646,647],{},[463,648,649],{},"boolean",[611,651,652,653,656],{},"When ",[463,654,655],{},"true",", skips rendu template processing and serves the HTML as-is. Auto-detected based on template syntax when not set.",[452,658,659,660,663,664,667],{},"Set ",[463,661,662],{},"renderer: false"," in the config to explicitly disable the renderer entirely (including auto-detection of ",[463,665,666],{},"index.html",").",[456,669,671],{"id":670},"html-template","HTML template",[673,674,676,677],"h3",{"id":675},"auto-detected-indexhtml","Auto-detected ",[463,678,666],{},[452,680,681,682,684],{},"By default, Nitro automatically looks for an ",[463,683,666],{}," file in your project root or one of the scanned directories.",[452,686,687],{},"If found, Nitro will use it as the renderer template and serve it for all unmatched routes.",[689,690,691,887],"code-group",{},[468,692,696],{"className":693,"code":694,"filename":666,"language":695,"meta":5,"style":5},"language-html shiki shiki-themes github-light github-dark github-dark","\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \u002F>\n    \u003Ctitle>My Vite + Nitro App\u003C\u002Ftitle>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Cdiv id=\"app\">\u003C\u002Fdiv>\n    \u003Cscript type=\"module\" src=\"\u002Fsrc\u002Fmain.ts\">\u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[463,697,698,713,731,741,760,784,798,807,816,838,868,877],{"__ignoreMap":5},[477,699,700,703,707,710],{"class":479,"line":480},[477,701,702],{"class":487},"\u003C!",[477,704,706],{"class":705},"sByVh","DOCTYPE",[477,708,709],{"class":517}," html",[477,711,712],{"class":487},">\n",[477,714,715,718,720,723,726,729],{"class":479,"line":501},[477,716,717],{"class":487},"\u003C",[477,719,695],{"class":705},[477,721,722],{"class":517}," lang",[477,724,725],{"class":487},"=",[477,727,728],{"class":494},"\"en\"",[477,730,712],{"class":487},[477,732,733,736,739],{"class":479,"line":508},[477,734,735],{"class":487},"  \u003C",[477,737,738],{"class":705},"head",[477,740,712],{"class":487},[477,742,743,746,749,752,754,757],{"class":479,"line":524},[477,744,745],{"class":487},"    \u003C",[477,747,748],{"class":705},"meta",[477,750,751],{"class":517}," charset",[477,753,725],{"class":487},[477,755,756],{"class":494},"\"UTF-8\"",[477,758,759],{"class":487}," \u002F>\n",[477,761,762,764,766,769,771,774,777,779,782],{"class":479,"line":530},[477,763,745],{"class":487},[477,765,748],{"class":705},[477,767,768],{"class":517}," name",[477,770,725],{"class":487},[477,772,773],{"class":494},"\"viewport\"",[477,775,776],{"class":517}," content",[477,778,725],{"class":487},[477,780,781],{"class":494},"\"width=device-width, initial-scale=1.0\"",[477,783,759],{"class":487},[477,785,786,788,791,794,796],{"class":479,"line":546},[477,787,745],{"class":487},[477,789,790],{"class":705},"title",[477,792,793],{"class":487},">My Vite + Nitro App\u003C\u002F",[477,795,790],{"class":705},[477,797,712],{"class":487},[477,799,800,803,805],{"class":479,"line":560},[477,801,802],{"class":487},"  \u003C\u002F",[477,804,738],{"class":705},[477,806,712],{"class":487},[477,808,809,811,814],{"class":479,"line":576},[477,810,735],{"class":487},[477,812,813],{"class":705},"body",[477,815,712],{"class":487},[477,817,818,820,823,826,828,831,834,836],{"class":479,"line":582},[477,819,745],{"class":487},[477,821,822],{"class":705},"div",[477,824,825],{"class":517}," id",[477,827,725],{"class":487},[477,829,830],{"class":494},"\"app\"",[477,832,833],{"class":487},">\u003C\u002F",[477,835,822],{"class":705},[477,837,712],{"class":487},[477,839,841,843,846,849,851,854,857,859,862,864,866],{"class":479,"line":840},10,[477,842,745],{"class":487},[477,844,845],{"class":705},"script",[477,847,848],{"class":517}," type",[477,850,725],{"class":487},[477,852,853],{"class":494},"\"module\"",[477,855,856],{"class":517}," src",[477,858,725],{"class":487},[477,860,861],{"class":494},"\"\u002Fsrc\u002Fmain.ts\"",[477,863,833],{"class":487},[477,865,845],{"class":705},[477,867,712],{"class":487},[477,869,871,873,875],{"class":479,"line":870},11,[477,872,802],{"class":487},[477,874,813],{"class":705},[477,876,712],{"class":487},[477,878,880,883,885],{"class":479,"line":879},12,[477,881,882],{"class":487},"\u003C\u002F",[477,884,695],{"class":705},[477,886,712],{"class":487},[468,888,891],{"className":470,"code":889,"filename":890,"language":473,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  return { hello: \"API\" };\n});\n","routes\u002Fapi\u002Fhello.ts",[463,892,893,906,910,935,949],{"__ignoreMap":5},[477,894,895,897,900,902,904],{"class":479,"line":480},[477,896,484],{"class":483},[477,898,899],{"class":487}," { defineHandler } ",[477,901,491],{"class":483},[477,903,495],{"class":494},[477,905,498],{"class":487},[477,907,908],{"class":479,"line":501},[477,909,505],{"emptyLinePlaceholder":504},[477,911,912,914,916,919,922,926,929,932],{"class":479,"line":508},[477,913,511],{"class":483},[477,915,514],{"class":483},[477,917,918],{"class":517}," defineHandler",[477,920,921],{"class":487},"((",[477,923,925],{"class":924},"sQHwn","event",[477,927,928],{"class":487},") ",[477,930,931],{"class":483},"=>",[477,933,934],{"class":487}," {\n",[477,936,937,940,943,946],{"class":479,"line":524},[477,938,939],{"class":483},"  return",[477,941,942],{"class":487}," { hello: ",[477,944,945],{"class":494},"\"API\"",[477,947,948],{"class":487}," };\n",[477,950,951],{"class":479,"line":530},[477,952,953],{"class":487},"});\n",[955,956,957],"tip",{},[452,958,652,959,961,962],{},[463,960,666],{}," is detected, Nitro will automatically log in the terminal: ",[463,963,964],{},"Using index.html as renderer template.",[452,966,967],{},"With this setup:",[969,970,971,978],"ul",{},[972,973,974,977],"li",{},[463,975,976],{},"\u002Fapi\u002Fhello"," → Handled by your API routes",[972,979,980,983,984,987,988],{},[463,981,982],{},"\u002Fabout",", ",[463,985,986],{},"\u002Fcontact",", etc. → Served with ",[463,989,666],{},[673,991,993],{"id":992},"custom-html-file","Custom HTML file",[452,995,996,997,1000],{},"You can specify a custom HTML template file using the ",[463,998,999],{},"renderer.template"," option in your Nitro configuration.",[689,1002,1003,1053],{},[468,1004,1006],{"className":470,"code":1005,"filename":472,"language":473,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    template: '.\u002Fapp.html'\n  }\n})\n",[463,1007,1008,1020,1024,1034,1038,1045,1049],{"__ignoreMap":5},[477,1009,1010,1012,1014,1016,1018],{"class":479,"line":480},[477,1011,484],{"class":483},[477,1013,488],{"class":487},[477,1015,491],{"class":483},[477,1017,495],{"class":494},[477,1019,498],{"class":487},[477,1021,1022],{"class":479,"line":501},[477,1023,505],{"emptyLinePlaceholder":504},[477,1025,1026,1028,1030,1032],{"class":479,"line":508},[477,1027,511],{"class":483},[477,1029,514],{"class":483},[477,1031,518],{"class":517},[477,1033,521],{"class":487},[477,1035,1036],{"class":479,"line":524},[477,1037,527],{"class":487},[477,1039,1040,1042],{"class":479,"line":530},[477,1041,533],{"class":487},[477,1043,1044],{"class":494},"'.\u002Fapp.html'\n",[477,1046,1047],{"class":479,"line":546},[477,1048,579],{"class":487},[477,1050,1051],{"class":479,"line":560},[477,1052,585],{"class":487},[468,1054,1057],{"className":693,"code":1055,"filename":1056,"language":695,"meta":5,"style":5},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>Custom Template\u003C\u002Ftitle>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Cdiv id=\"root\">Loading...\u003C\u002Fdiv>\n    \u003Cscript type=\"module\" src=\"\u002Fsrc\u002Fmain.js\">\u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n","app.html",[463,1058,1059,1069,1083,1091,1105,1118,1126,1134,1154,1179,1187],{"__ignoreMap":5},[477,1060,1061,1063,1065,1067],{"class":479,"line":480},[477,1062,702],{"class":487},[477,1064,706],{"class":705},[477,1066,709],{"class":517},[477,1068,712],{"class":487},[477,1070,1071,1073,1075,1077,1079,1081],{"class":479,"line":501},[477,1072,717],{"class":487},[477,1074,695],{"class":705},[477,1076,722],{"class":517},[477,1078,725],{"class":487},[477,1080,728],{"class":494},[477,1082,712],{"class":487},[477,1084,1085,1087,1089],{"class":479,"line":508},[477,1086,735],{"class":487},[477,1088,738],{"class":705},[477,1090,712],{"class":487},[477,1092,1093,1095,1097,1099,1101,1103],{"class":479,"line":524},[477,1094,745],{"class":487},[477,1096,748],{"class":705},[477,1098,751],{"class":517},[477,1100,725],{"class":487},[477,1102,756],{"class":494},[477,1104,759],{"class":487},[477,1106,1107,1109,1111,1114,1116],{"class":479,"line":530},[477,1108,745],{"class":487},[477,1110,790],{"class":705},[477,1112,1113],{"class":487},">Custom Template\u003C\u002F",[477,1115,790],{"class":705},[477,1117,712],{"class":487},[477,1119,1120,1122,1124],{"class":479,"line":546},[477,1121,802],{"class":487},[477,1123,738],{"class":705},[477,1125,712],{"class":487},[477,1127,1128,1130,1132],{"class":479,"line":560},[477,1129,735],{"class":487},[477,1131,813],{"class":705},[477,1133,712],{"class":487},[477,1135,1136,1138,1140,1142,1144,1147,1150,1152],{"class":479,"line":576},[477,1137,745],{"class":487},[477,1139,822],{"class":705},[477,1141,825],{"class":517},[477,1143,725],{"class":487},[477,1145,1146],{"class":494},"\"root\"",[477,1148,1149],{"class":487},">Loading...\u003C\u002F",[477,1151,822],{"class":705},[477,1153,712],{"class":487},[477,1155,1156,1158,1160,1162,1164,1166,1168,1170,1173,1175,1177],{"class":479,"line":582},[477,1157,745],{"class":487},[477,1159,845],{"class":705},[477,1161,848],{"class":517},[477,1163,725],{"class":487},[477,1165,853],{"class":494},[477,1167,856],{"class":517},[477,1169,725],{"class":487},[477,1171,1172],{"class":494},"\"\u002Fsrc\u002Fmain.js\"",[477,1174,833],{"class":487},[477,1176,845],{"class":705},[477,1178,712],{"class":487},[477,1180,1181,1183,1185],{"class":479,"line":840},[477,1182,802],{"class":487},[477,1184,813],{"class":705},[477,1186,712],{"class":487},[477,1188,1189,1191,1193],{"class":479,"line":870},[477,1190,882],{"class":487},[477,1192,695],{"class":705},[477,1194,712],{"class":487},[673,1196,1198],{"id":1197},"static-templates","Static templates",[452,1200,1201,1202,1207],{},"By default, Nitro auto-detects whether your HTML template contains ",[1203,1204,1206],"a",{"href":1205},"#hypertext-preprocessor-experimental","rendu"," syntax. If it does, the template is processed dynamically on each request. If it doesn't, it's served as static HTML.",[452,1209,1210,1211,1213],{},"You can override this behavior with the ",[463,1212,644],{}," option:",[468,1215,1217],{"className":470,"code":1216,"filename":472,"language":473,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    template: '.\u002Findex.html',\n    static: true \u002F\u002F Force static serving, skip template processing\n  }\n})\n",[463,1218,1219,1231,1235,1245,1249,1258,1267,1271],{"__ignoreMap":5},[477,1220,1221,1223,1225,1227,1229],{"class":479,"line":480},[477,1222,484],{"class":483},[477,1224,488],{"class":487},[477,1226,491],{"class":483},[477,1228,495],{"class":494},[477,1230,498],{"class":487},[477,1232,1233],{"class":479,"line":501},[477,1234,505],{"emptyLinePlaceholder":504},[477,1236,1237,1239,1241,1243],{"class":479,"line":508},[477,1238,511],{"class":483},[477,1240,514],{"class":483},[477,1242,518],{"class":517},[477,1244,521],{"class":487},[477,1246,1247],{"class":479,"line":524},[477,1248,527],{"class":487},[477,1250,1251,1253,1255],{"class":479,"line":530},[477,1252,533],{"class":487},[477,1254,536],{"class":494},[477,1256,1257],{"class":487},",\n",[477,1259,1260,1262,1264],{"class":479,"line":546},[477,1261,563],{"class":487},[477,1263,655],{"class":566},[477,1265,1266],{"class":542}," \u002F\u002F Force static serving, skip template processing\n",[477,1268,1269],{"class":479,"line":560},[477,1270,579],{"class":487},[477,1272,1273],{"class":479,"line":576},[477,1274,585],{"class":487},[452,1276,1277],{},"In production, static templates are inlined into the server bundle and served directly for optimal performance.",[673,1279,1281],{"id":1280},"hypertext-preprocessor-experimental","Hypertext Preprocessor (experimental)",[452,1283,1284,1285,1290],{},"For dynamic templates, Nitro uses the ",[1203,1286,1206],{"href":1287,"rel":1288},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Frendu",[1289],"nofollow"," Hypertext Preprocessor — a simple and powerful way to create dynamic HTML templates with JavaScript expressions.",[1292,1293,1295],"h4",{"id":1294},"output-expressions","Output expressions",[969,1297,1298,1304],{},[972,1299,1300,1303],{},[463,1301,1302],{},"{{ expression }}"," — HTML-escaped output",[972,1305,1306,1309,1310,1313],{},[463,1307,1308],{},"{{{ expression }}}"," or ",[463,1311,1312],{},"\u003C?= expression ?>"," — raw (unescaped) output",[468,1315,1317],{"className":693,"code":1316,"language":695,"meta":5,"style":5},"\u003Ch1>Hello {{ $URL.pathname }}\u003C\u002Fh1>\n\u003Cdiv>{{{ '\u003Cstrong>raw html\u003C\u002Fstrong>' }}}\u003C\u002Fdiv>\n",[463,1318,1319,1333],{"__ignoreMap":5},[477,1320,1321,1323,1326,1329,1331],{"class":479,"line":480},[477,1322,717],{"class":487},[477,1324,1325],{"class":705},"h1",[477,1327,1328],{"class":487},">Hello {{ $URL.pathname }}\u003C\u002F",[477,1330,1325],{"class":705},[477,1332,712],{"class":487},[477,1334,1335,1337,1339,1342,1345,1348,1350,1353,1355],{"class":479,"line":501},[477,1336,717],{"class":487},[477,1338,822],{"class":705},[477,1340,1341],{"class":487},">{{{ '\u003C",[477,1343,1344],{"class":705},"strong",[477,1346,1347],{"class":487},">raw html\u003C\u002F",[477,1349,1344],{"class":705},[477,1351,1352],{"class":487},">' }}}\u003C\u002F",[477,1354,822],{"class":705},[477,1356,712],{"class":487},[1292,1358,1360],{"id":1359},"control-flow","Control flow",[452,1362,1363,1364,1367],{},"Use ",[463,1365,1366],{},"\u003C? ... ?>"," for JavaScript control flow:",[468,1369,1371],{"className":693,"code":1370,"language":695,"meta":5,"style":5},"\u003C? if ($METHOD === 'POST') { ?>\n  \u003Cp>Form submitted!\u003C\u002Fp>\n\u003C? } else { ?>\n  \u003Cform method=\"POST\">\n    \u003Cbutton type=\"submit\">Submit\u003C\u002Fbutton>\n  \u003C\u002Fform>\n\u003C? } ?>\n\n\u003Cul>\n\u003C? for (const item of ['a', 'b', 'c']) { ?>\n  \u003Cli>{{ item }}\u003C\u002Fli>\n\u003C? } ?>\n\u003C\u002Ful>\n",[463,1372,1373,1381,1394,1401,1418,1439,1447,1454,1458,1466,1473,1486,1492],{"__ignoreMap":5},[477,1374,1375,1378],{"class":479,"line":480},[477,1376,717],{"class":1377},"sVAnh",[477,1379,1380],{"class":487},"? if ($METHOD === 'POST') { ?>\n",[477,1382,1383,1385,1387,1390,1392],{"class":479,"line":501},[477,1384,735],{"class":487},[477,1386,452],{"class":705},[477,1388,1389],{"class":487},">Form submitted!\u003C\u002F",[477,1391,452],{"class":705},[477,1393,712],{"class":487},[477,1395,1396,1398],{"class":479,"line":508},[477,1397,717],{"class":1377},[477,1399,1400],{"class":487},"? } else { ?>\n",[477,1402,1403,1405,1408,1411,1413,1416],{"class":479,"line":524},[477,1404,735],{"class":487},[477,1406,1407],{"class":705},"form",[477,1409,1410],{"class":517}," method",[477,1412,725],{"class":487},[477,1414,1415],{"class":494},"\"POST\"",[477,1417,712],{"class":487},[477,1419,1420,1422,1425,1427,1429,1432,1435,1437],{"class":479,"line":530},[477,1421,745],{"class":487},[477,1423,1424],{"class":705},"button",[477,1426,848],{"class":517},[477,1428,725],{"class":487},[477,1430,1431],{"class":494},"\"submit\"",[477,1433,1434],{"class":487},">Submit\u003C\u002F",[477,1436,1424],{"class":705},[477,1438,712],{"class":487},[477,1440,1441,1443,1445],{"class":479,"line":546},[477,1442,802],{"class":487},[477,1444,1407],{"class":705},[477,1446,712],{"class":487},[477,1448,1449,1451],{"class":479,"line":560},[477,1450,717],{"class":1377},[477,1452,1453],{"class":487},"? } ?>\n",[477,1455,1456],{"class":479,"line":576},[477,1457,505],{"emptyLinePlaceholder":504},[477,1459,1460,1462,1464],{"class":479,"line":582},[477,1461,717],{"class":487},[477,1463,969],{"class":705},[477,1465,712],{"class":487},[477,1467,1468,1470],{"class":479,"line":840},[477,1469,717],{"class":1377},[477,1471,1472],{"class":487},"? for (const item of ['a', 'b', 'c']) { ?>\n",[477,1474,1475,1477,1479,1482,1484],{"class":479,"line":870},[477,1476,735],{"class":487},[477,1478,972],{"class":705},[477,1480,1481],{"class":487},">{{ item }}\u003C\u002F",[477,1483,972],{"class":705},[477,1485,712],{"class":487},[477,1487,1488,1490],{"class":479,"line":879},[477,1489,717],{"class":1377},[477,1491,1453],{"class":487},[477,1493,1495,1497,1499],{"class":479,"line":1494},13,[477,1496,882],{"class":487},[477,1498,969],{"class":705},[477,1500,712],{"class":487},[1292,1502,1504],{"id":1503},"server-scripts","Server scripts",[452,1506,1363,1507,1510],{},[463,1508,1509],{},"\u003Cscript server>"," to execute JavaScript on the server:",[468,1512,1514],{"className":693,"code":1513,"language":695,"meta":5,"style":5},"\u003Cscript server>\n  const data = await fetch('https:\u002F\u002Fapi.example.com\u002Fdata').then(r => r.json());\n\u003C\u002Fscript>\n\u003Cpre>{{ JSON.stringify(data) }}\u003C\u002Fpre>\n",[463,1515,1516,1527,1572,1580],{"__ignoreMap":5},[477,1517,1518,1520,1522,1525],{"class":479,"line":480},[477,1519,717],{"class":487},[477,1521,845],{"class":705},[477,1523,1524],{"class":517}," server",[477,1526,712],{"class":487},[477,1528,1529,1532,1535,1538,1541,1544,1547,1550,1552,1555,1557,1560,1563,1566,1569],{"class":479,"line":501},[477,1530,1531],{"class":483},"  const",[477,1533,1534],{"class":566}," data",[477,1536,1537],{"class":483}," =",[477,1539,1540],{"class":483}," await",[477,1542,1543],{"class":517}," fetch",[477,1545,1546],{"class":487},"(",[477,1548,1549],{"class":494},"'https:\u002F\u002Fapi.example.com\u002Fdata'",[477,1551,667],{"class":487},[477,1553,1554],{"class":517},"then",[477,1556,1546],{"class":487},[477,1558,1559],{"class":924},"r",[477,1561,1562],{"class":483}," =>",[477,1564,1565],{"class":487}," r.",[477,1567,1568],{"class":517},"json",[477,1570,1571],{"class":487},"());\n",[477,1573,1574,1576,1578],{"class":479,"line":508},[477,1575,882],{"class":487},[477,1577,845],{"class":705},[477,1579,712],{"class":487},[477,1581,1582,1584,1586,1589,1591],{"class":479,"line":524},[477,1583,717],{"class":487},[477,1585,468],{"class":705},[477,1587,1588],{"class":487},">{{ JSON.stringify(data) }}\u003C\u002F",[477,1590,468],{"class":705},[477,1592,712],{"class":487},[1292,1594,1596],{"id":1595},"streaming-content","Streaming content",[452,1598,1599,1600,1603],{},"Use the ",[463,1601,1602],{},"echo()"," function for streaming content. It accepts strings, functions, Promises, Response objects, or ReadableStreams:",[468,1605,1607],{"className":693,"code":1606,"language":695,"meta":5,"style":5},"\u003Cscript server>\n  echo(\"Loading...\");\n  echo(async () => fetch(\"https:\u002F\u002Fapi.example.com\u002Fdata\"));\n\u003C\u002Fscript>\n",[463,1608,1609,1619,1632,1656],{"__ignoreMap":5},[477,1610,1611,1613,1615,1617],{"class":479,"line":480},[477,1612,717],{"class":487},[477,1614,845],{"class":705},[477,1616,1524],{"class":517},[477,1618,712],{"class":487},[477,1620,1621,1624,1626,1629],{"class":479,"line":501},[477,1622,1623],{"class":517},"  echo",[477,1625,1546],{"class":487},[477,1627,1628],{"class":494},"\"Loading...\"",[477,1630,1631],{"class":487},");\n",[477,1633,1634,1636,1638,1641,1644,1646,1648,1650,1653],{"class":479,"line":508},[477,1635,1623],{"class":517},[477,1637,1546],{"class":487},[477,1639,1640],{"class":483},"async",[477,1642,1643],{"class":487}," () ",[477,1645,931],{"class":483},[477,1647,1543],{"class":517},[477,1649,1546],{"class":487},[477,1651,1652],{"class":494},"\"https:\u002F\u002Fapi.example.com\u002Fdata\"",[477,1654,1655],{"class":487},"));\n",[477,1657,1658,1660,1662],{"class":479,"line":524},[477,1659,882],{"class":487},[477,1661,845],{"class":705},[477,1663,712],{"class":487},[1292,1665,1667],{"id":1666},"global-variables","Global variables",[452,1669,1670],{},"Access request context within templates:",[587,1672,1673,1682],{},[590,1674,1675],{},[593,1676,1677,1680],{},[596,1678,1679],{},"Variable",[596,1681,604],{},[606,1683,1684,1698,1715,1728,1738,1748],{},[593,1685,1686,1691],{},[611,1687,1688],{},[463,1689,1690],{},"$REQUEST",[611,1692,1693,1694,1697],{},"The incoming ",[463,1695,1696],{},"Request"," object",[593,1699,1700,1705],{},[611,1701,1702],{},[463,1703,1704],{},"$METHOD",[611,1706,1707,1708,983,1711,1714],{},"HTTP method (",[463,1709,1710],{},"GET",[463,1712,1713],{},"POST",", etc.)",[593,1716,1717,1722],{},[611,1718,1719],{},[463,1720,1721],{},"$URL",[611,1723,1724,1725,1697],{},"Request ",[463,1726,1727],{},"URL",[593,1729,1730,1735],{},[611,1731,1732],{},[463,1733,1734],{},"$HEADERS",[611,1736,1737],{},"Request headers",[593,1739,1740,1745],{},[611,1741,1742],{},[463,1743,1744],{},"$RESPONSE",[611,1746,1747],{},"Response configuration object",[593,1749,1750,1755],{},[611,1751,1752],{},[463,1753,1754],{},"$COOKIES",[611,1756,1757],{},"Read-only object containing request cookies",[1292,1759,1761],{"id":1760},"built-in-functions","Built-in functions",[587,1763,1764,1773],{},[590,1765,1766],{},[593,1767,1768,1771],{},[596,1769,1770],{},"Function",[596,1772,604],{},[606,1774,1775,1789,1799,1809],{},[593,1776,1777,1782],{},[611,1778,1779],{},[463,1780,1781],{},"htmlspecialchars(str)",[611,1783,1784,1785,1788],{},"Escape HTML characters (automatically applied in ",[463,1786,1787],{},"{{ }}"," syntax)",[593,1790,1791,1796],{},[611,1792,1793],{},[463,1794,1795],{},"setCookie(name, value, options?)",[611,1797,1798],{},"Set a cookie in the response",[593,1800,1801,1806],{},[611,1802,1803],{},[463,1804,1805],{},"redirect(url)",[611,1807,1808],{},"Redirect the user to another URL",[593,1810,1811,1816],{},[611,1812,1813],{},[463,1814,1815],{},"echo(content)",[611,1817,1818],{},"Stream content to the response",[468,1820,1822],{"className":693,"code":1821,"filename":666,"language":695,"meta":5,"style":5},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>Dynamic template\u003C\u002Ftitle>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Ch1>Hello {{ $REQUEST.url }}\u003C\u002Fh1>\n    \u003Cp>Welcome, \u003C?= $COOKIES[\"user\"] || \"Guest\" ?>!\u003C\u002Fp>\n    \u003Cscript server>\n      setCookie(\"visited\", \"true\", { maxAge: 3600 });\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[463,1823,1824,1834,1848,1856,1870,1883,1891,1899,1912,1930,1940,1964,1973,1981],{"__ignoreMap":5},[477,1825,1826,1828,1830,1832],{"class":479,"line":480},[477,1827,702],{"class":487},[477,1829,706],{"class":705},[477,1831,709],{"class":517},[477,1833,712],{"class":487},[477,1835,1836,1838,1840,1842,1844,1846],{"class":479,"line":501},[477,1837,717],{"class":487},[477,1839,695],{"class":705},[477,1841,722],{"class":517},[477,1843,725],{"class":487},[477,1845,728],{"class":494},[477,1847,712],{"class":487},[477,1849,1850,1852,1854],{"class":479,"line":508},[477,1851,735],{"class":487},[477,1853,738],{"class":705},[477,1855,712],{"class":487},[477,1857,1858,1860,1862,1864,1866,1868],{"class":479,"line":524},[477,1859,745],{"class":487},[477,1861,748],{"class":705},[477,1863,751],{"class":517},[477,1865,725],{"class":487},[477,1867,756],{"class":494},[477,1869,759],{"class":487},[477,1871,1872,1874,1876,1879,1881],{"class":479,"line":530},[477,1873,745],{"class":487},[477,1875,790],{"class":705},[477,1877,1878],{"class":487},">Dynamic template\u003C\u002F",[477,1880,790],{"class":705},[477,1882,712],{"class":487},[477,1884,1885,1887,1889],{"class":479,"line":546},[477,1886,802],{"class":487},[477,1888,738],{"class":705},[477,1890,712],{"class":487},[477,1892,1893,1895,1897],{"class":479,"line":560},[477,1894,735],{"class":487},[477,1896,813],{"class":705},[477,1898,712],{"class":487},[477,1900,1901,1903,1905,1908,1910],{"class":479,"line":576},[477,1902,745],{"class":487},[477,1904,1325],{"class":705},[477,1906,1907],{"class":487},">Hello {{ $REQUEST.url }}\u003C\u002F",[477,1909,1325],{"class":705},[477,1911,712],{"class":487},[477,1913,1914,1916,1918,1921,1923,1926,1928],{"class":479,"line":582},[477,1915,745],{"class":487},[477,1917,452],{"class":705},[477,1919,1920],{"class":487},">Welcome, ",[477,1922,717],{"class":1377},[477,1924,1925],{"class":487},"?= $COOKIES[\"user\"] || \"Guest\" ?>!\u003C\u002F",[477,1927,452],{"class":705},[477,1929,712],{"class":487},[477,1931,1932,1934,1936,1938],{"class":479,"line":840},[477,1933,745],{"class":487},[477,1935,845],{"class":705},[477,1937,1524],{"class":517},[477,1939,712],{"class":487},[477,1941,1942,1945,1947,1950,1952,1955,1958,1961],{"class":479,"line":870},[477,1943,1944],{"class":517},"      setCookie",[477,1946,1546],{"class":487},[477,1948,1949],{"class":494},"\"visited\"",[477,1951,983],{"class":487},[477,1953,1954],{"class":494},"\"true\"",[477,1956,1957],{"class":487},", { maxAge: ",[477,1959,1960],{"class":566},"3600",[477,1962,1963],{"class":487}," });\n",[477,1965,1966,1969,1971],{"class":479,"line":879},[477,1967,1968],{"class":487},"    \u003C\u002F",[477,1970,845],{"class":705},[477,1972,712],{"class":487},[477,1974,1975,1977,1979],{"class":479,"line":1494},[477,1976,802],{"class":487},[477,1978,813],{"class":705},[477,1980,712],{"class":487},[477,1982,1984,1986,1988],{"class":479,"line":1983},14,[477,1985,882],{"class":487},[477,1987,695],{"class":705},[477,1989,712],{"class":487},[1991,1992],"read-more",{"title":1993,"to":1287},"Rendu Documentation",[456,1995,1997],{"id":1996},"custom-renderer-handler","Custom renderer handler",[452,1999,2000],{},"For more complex scenarios, you can create a custom renderer handler that programmatically generates responses.",[452,2002,2003,2004,2006,2007,2010],{},"The handler is a default export function that receives an H3 event object. You can access the incoming ",[463,2005,1696],{}," via ",[463,2008,2009],{},"event.req",":",[468,2012,2015],{"className":470,"code":2013,"filename":2014,"language":473,"meta":5,"style":5},"export default function renderer({ req }: { req: Request }) {\n  const url = new URL(req.url);\n  return new Response(\n    \u002F* html *\u002F `\u003C!DOCTYPE html>\n    \u003Chtml>\n    \u003Chead>\n      \u003Ctitle>Custom Renderer\u003C\u002Ftitle>\n    \u003C\u002Fhead>\n    \u003Cbody>\n      \u003Ch1>Hello from custom renderer!\u003C\u002Fh1>\n      \u003Cp>Current path: ${url.pathname}\u003C\u002Fp>\n    \u003C\u002Fbody>\n    \u003C\u002Fhtml>`,\n    { headers: { \"content-type\": \"text\u002Fhtml; charset=utf-8\" } }\n  );\n}\n","renderer.ts",[463,2016,2017,2053,2071,2083,2091,2096,2101,2106,2111,2116,2121,2138,2143,2150,2167,2173],{"__ignoreMap":5},[477,2018,2019,2021,2023,2026,2029,2032,2035,2038,2040,2043,2045,2047,2050],{"class":479,"line":480},[477,2020,511],{"class":483},[477,2022,514],{"class":483},[477,2024,2025],{"class":483}," function",[477,2027,2028],{"class":517}," renderer",[477,2030,2031],{"class":487},"({ ",[477,2033,2034],{"class":924},"req",[477,2036,2037],{"class":487}," }",[477,2039,2010],{"class":483},[477,2041,2042],{"class":487}," { ",[477,2044,2034],{"class":924},[477,2046,2010],{"class":483},[477,2048,2049],{"class":517}," Request",[477,2051,2052],{"class":487}," }) {\n",[477,2054,2055,2057,2060,2062,2065,2068],{"class":479,"line":501},[477,2056,1531],{"class":483},[477,2058,2059],{"class":566}," url",[477,2061,1537],{"class":483},[477,2063,2064],{"class":483}," new",[477,2066,2067],{"class":517}," URL",[477,2069,2070],{"class":487},"(req.url);\n",[477,2072,2073,2075,2077,2080],{"class":479,"line":508},[477,2074,939],{"class":483},[477,2076,2064],{"class":483},[477,2078,2079],{"class":517}," Response",[477,2081,2082],{"class":487},"(\n",[477,2084,2085,2088],{"class":479,"line":524},[477,2086,2087],{"class":542},"    \u002F* html *\u002F",[477,2089,2090],{"class":494}," `\u003C!DOCTYPE html>\n",[477,2092,2093],{"class":479,"line":530},[477,2094,2095],{"class":494},"    \u003Chtml>\n",[477,2097,2098],{"class":479,"line":546},[477,2099,2100],{"class":494},"    \u003Chead>\n",[477,2102,2103],{"class":479,"line":560},[477,2104,2105],{"class":494},"      \u003Ctitle>Custom Renderer\u003C\u002Ftitle>\n",[477,2107,2108],{"class":479,"line":576},[477,2109,2110],{"class":494},"    \u003C\u002Fhead>\n",[477,2112,2113],{"class":479,"line":582},[477,2114,2115],{"class":494},"    \u003Cbody>\n",[477,2117,2118],{"class":479,"line":840},[477,2119,2120],{"class":494},"      \u003Ch1>Hello from custom renderer!\u003C\u002Fh1>\n",[477,2122,2123,2126,2129,2132,2135],{"class":479,"line":870},[477,2124,2125],{"class":494},"      \u003Cp>Current path: ${",[477,2127,2128],{"class":487},"url",[477,2130,2131],{"class":494},".",[477,2133,2134],{"class":487},"pathname",[477,2136,2137],{"class":494},"}\u003C\u002Fp>\n",[477,2139,2140],{"class":479,"line":879},[477,2141,2142],{"class":494},"    \u003C\u002Fbody>\n",[477,2144,2145,2148],{"class":479,"line":1494},[477,2146,2147],{"class":494},"    \u003C\u002Fhtml>`",[477,2149,1257],{"class":487},[477,2151,2152,2155,2158,2161,2164],{"class":479,"line":1983},[477,2153,2154],{"class":487},"    { headers: { ",[477,2156,2157],{"class":494},"\"content-type\"",[477,2159,2160],{"class":487},": ",[477,2162,2163],{"class":494},"\"text\u002Fhtml; charset=utf-8\"",[477,2165,2166],{"class":487}," } }\n",[477,2168,2170],{"class":479,"line":2169},15,[477,2171,2172],{"class":487},"  );\n",[477,2174,2176],{"class":479,"line":2175},16,[477,2177,2178],{"class":487},"}\n",[452,2180,2181],{},"Then, specify the renderer entry in the Nitro config:",[468,2183,2185],{"className":470,"code":2184,"filename":472,"language":473,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    handler: '.\u002Frenderer.ts'\n  }\n})\n",[463,2186,2187,2199,2203,2213,2217,2224,2228],{"__ignoreMap":5},[477,2188,2189,2191,2193,2195,2197],{"class":479,"line":480},[477,2190,484],{"class":483},[477,2192,488],{"class":487},[477,2194,491],{"class":483},[477,2196,495],{"class":494},[477,2198,498],{"class":487},[477,2200,2201],{"class":479,"line":501},[477,2202,505],{"emptyLinePlaceholder":504},[477,2204,2205,2207,2209,2211],{"class":479,"line":508},[477,2206,511],{"class":483},[477,2208,514],{"class":483},[477,2210,518],{"class":517},[477,2212,521],{"class":487},[477,2214,2215],{"class":479,"line":524},[477,2216,527],{"class":487},[477,2218,2219,2221],{"class":479,"line":530},[477,2220,549],{"class":487},[477,2222,2223],{"class":494},"'.\u002Frenderer.ts'\n",[477,2225,2226],{"class":479,"line":546},[477,2227,579],{"class":487},[477,2229,2230],{"class":479,"line":560},[477,2231,585],{"class":487},[2233,2234,2235],"note",{},[452,2236,652,2237,2240,2241,2243],{},[463,2238,2239],{},"renderer.handler"," is set, it takes full control of rendering. The ",[463,2242,999],{}," option is ignored.",[456,2245,2247],{"id":2246},"renderer-priority","Renderer priority",[452,2249,2250,2251,2254,2255,2258],{},"The renderer always acts as a catch-all route (",[463,2252,2253],{},"\u002F**",") and has the ",[1344,2256,2257],{},"lowest priority",". This means:",[2260,2261,2263,2270,2275],"steps",{"level":2262},"4",[1292,2264,2265,2266,2269],{},"Specific API routes are matched first (e.g., ",[463,2267,2268],{},"\u002Fapi\u002Fusers",")",[1292,2271,2272,2273,2269],{},"Specific server routes are matched next (e.g., ",[463,2274,982],{},[1292,2276,2277],{},"The renderer catches everything else",[468,2279,2283],{"className":2280,"code":2281,"language":2282,"meta":5,"style":5},"language-md shiki shiki-themes github-light github-dark github-dark","api\u002F\n  users.ts        → \u002Fapi\u002Fusers (matched first)\nroutes\u002F\n  about.ts        → \u002Fabout (matched second)\nrenderer.ts         → \u002F** (catches all other routes)\n","md",[463,2284,2285,2290,2295,2300,2305],{"__ignoreMap":5},[477,2286,2287],{"class":479,"line":480},[477,2288,2289],{"class":487},"api\u002F\n",[477,2291,2292],{"class":479,"line":501},[477,2293,2294],{"class":487},"  users.ts        → \u002Fapi\u002Fusers (matched first)\n",[477,2296,2297],{"class":479,"line":508},[477,2298,2299],{"class":487},"routes\u002F\n",[477,2301,2302],{"class":479,"line":524},[477,2303,2304],{"class":487},"  about.ts        → \u002Fabout (matched second)\n",[477,2306,2307],{"class":479,"line":530},[477,2308,2309],{"class":487},"renderer.ts         → \u002F** (catches all other routes)\n",[2233,2311,2312],{},[452,2313,2314,2315,2318,2319,2321,2322,2325],{},"If you define your own catch-all route (",[463,2316,2317],{},"[...].ts","), it is chained with the other ",[463,2320,2253],{}," handlers rather than replaced: catch-all handlers run in registration order (file-based catch-all, then ",[1203,2323,2324],{"href":79},"server entry",", then renderer), and the first one to return a response wins. The renderer only handles requests your catch-all leaves unanswered.",[1991,2327],{"title":43,"to":44},[456,2329,2331],{"id":2330},"vite-integration","Vite integration",[452,2333,2334],{},"When using Nitro with Vite, the renderer integrates with Vite's build pipeline and dev server.",[673,2336,2338],{"id":2337},"development-mode","Development mode",[452,2340,2341,2342,2344,2345,2348],{},"In development, the renderer template is read from disk on each request, so changes to ",[463,2343,666],{}," are reflected immediately without restarting the server. Vite's ",[463,2346,2347],{},"transformIndexHtml"," hook is applied to inject HMR client scripts and other dev-time transforms.",[673,2350,2352,2353],{"id":2351},"ssr-with-ssr-outlet","SSR with ",[463,2354,2355],{},"\u003C!--ssr-outlet-->",[452,2357,2358,2359,2362,2363,2365,2366,2368],{},"When using Vite environments with an ",[463,2360,2361],{},"ssr"," service, you can add an ",[463,2364,2355],{}," comment to your ",[463,2367,666],{},". Nitro will replace it with the output from your SSR entry during rendering:",[468,2370,2372],{"className":693,"code":2371,"filename":666,"language":695,"meta":5,"style":5},"\u003C!DOCTYPE html>\n\u003Chtml lang=\"en\">\n  \u003Chead>\n    \u003Cmeta charset=\"UTF-8\" \u002F>\n    \u003Ctitle>SSR App\u003C\u002Ftitle>\n  \u003C\u002Fhead>\n  \u003Cbody>\n    \u003Cdiv id=\"app\">\u003C!--ssr-outlet-->\u003C\u002Fdiv>\n    \u003Cscript type=\"module\" src=\"\u002Fsrc\u002Fmain.ts\">\u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n",[463,2373,2374,2384,2398,2406,2420,2433,2441,2449,2472,2496,2504],{"__ignoreMap":5},[477,2375,2376,2378,2380,2382],{"class":479,"line":480},[477,2377,702],{"class":487},[477,2379,706],{"class":705},[477,2381,709],{"class":517},[477,2383,712],{"class":487},[477,2385,2386,2388,2390,2392,2394,2396],{"class":479,"line":501},[477,2387,717],{"class":487},[477,2389,695],{"class":705},[477,2391,722],{"class":517},[477,2393,725],{"class":487},[477,2395,728],{"class":494},[477,2397,712],{"class":487},[477,2399,2400,2402,2404],{"class":479,"line":508},[477,2401,735],{"class":487},[477,2403,738],{"class":705},[477,2405,712],{"class":487},[477,2407,2408,2410,2412,2414,2416,2418],{"class":479,"line":524},[477,2409,745],{"class":487},[477,2411,748],{"class":705},[477,2413,751],{"class":517},[477,2415,725],{"class":487},[477,2417,756],{"class":494},[477,2419,759],{"class":487},[477,2421,2422,2424,2426,2429,2431],{"class":479,"line":530},[477,2423,745],{"class":487},[477,2425,790],{"class":705},[477,2427,2428],{"class":487},">SSR App\u003C\u002F",[477,2430,790],{"class":705},[477,2432,712],{"class":487},[477,2434,2435,2437,2439],{"class":479,"line":546},[477,2436,802],{"class":487},[477,2438,738],{"class":705},[477,2440,712],{"class":487},[477,2442,2443,2445,2447],{"class":479,"line":560},[477,2444,735],{"class":487},[477,2446,813],{"class":705},[477,2448,712],{"class":487},[477,2450,2451,2453,2455,2457,2459,2461,2464,2466,2468,2470],{"class":479,"line":576},[477,2452,745],{"class":487},[477,2454,822],{"class":705},[477,2456,825],{"class":517},[477,2458,725],{"class":487},[477,2460,830],{"class":494},[477,2462,2463],{"class":487},">",[477,2465,2355],{"class":542},[477,2467,882],{"class":487},[477,2469,822],{"class":705},[477,2471,712],{"class":487},[477,2473,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494],{"class":479,"line":582},[477,2475,745],{"class":487},[477,2477,845],{"class":705},[477,2479,848],{"class":517},[477,2481,725],{"class":487},[477,2483,853],{"class":494},[477,2485,856],{"class":517},[477,2487,725],{"class":487},[477,2489,861],{"class":494},[477,2491,833],{"class":487},[477,2493,845],{"class":705},[477,2495,712],{"class":487},[477,2497,2498,2500,2502],{"class":479,"line":840},[477,2499,802],{"class":487},[477,2501,813],{"class":705},[477,2503,712],{"class":487},[477,2505,2506,2508,2510],{"class":479,"line":870},[477,2507,882],{"class":487},[477,2509,695],{"class":705},[477,2511,712],{"class":487},[673,2513,2515],{"id":2514},"production-build","Production build",[452,2517,2518,2519,2521],{},"During production builds, Vite processes the ",[463,2520,666],{}," through its build pipeline (resolving scripts, CSS, and other assets), then Nitro inlines the transformed HTML into the server bundle.",[456,2523,2525],{"id":2524},"use-cases","Use cases",[673,2527,2529],{"id":2528},"single-page-application-spa","Single-page application (SPA)",[452,2531,2532,2533,2535],{},"Serve your SPA's ",[463,2534,666],{}," for all routes to enable client-side routing:",[955,2537,2538],{},[452,2539,2540],{},"\nThis is the default behavior of Nitro when used with Vite.",[2542,2543,2544],"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 .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}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}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 .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}html pre.shiki code .sByVh, html code.shiki .sByVh{--shiki-light:#22863A;--shiki-default:#85E89D;--shiki-dark:#85E89D}html pre.shiki code .sVAnh, html code.shiki .sVAnh{--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":5,"searchDepth":501,"depth":501,"links":2546},[2547,2548,2555,2556,2557,2563],{"id":458,"depth":501,"text":33},{"id":670,"depth":501,"text":671,"children":2549},[2550,2552,2553,2554],{"id":675,"depth":508,"text":2551},"Auto-detected index.html",{"id":992,"depth":508,"text":993},{"id":1197,"depth":508,"text":1198},{"id":1280,"depth":508,"text":1281},{"id":1996,"depth":501,"text":1997},{"id":2246,"depth":501,"text":2247},{"id":2330,"depth":501,"text":2331,"children":2558},[2559,2560,2562],{"id":2337,"depth":508,"text":2338},{"id":2351,"depth":508,"text":2561},"SSR with \u003C!--ssr-outlet-->",{"id":2514,"depth":508,"text":2515},{"id":2524,"depth":501,"text":2525,"children":2564},[2565],{"id":2528,"depth":508,"text":2529},"Use a renderer to handle all unmatched routes with custom HTML or a templating system.",{"icon":21},{"title":18,"icon":21},{"title":447,"description":2566},"bozEe4GrLiEGKJBBA8M5Q1AQ97KD-Q6eB0jOlddCLjc",[2572,2574],{"title":13,"path":14,"stem":15,"description":2573,"icon":16,"children":-1},"Start with a fresh Nitro project or adopt it in your current Vite project.",{"title":23,"path":24,"stem":25,"description":2575,"icon":26,"children":-1},"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.",1784019064245]