[{"data":1,"prerenderedAt":2532},["ShallowReactive",2],{"navigation":3,"-docs-renderer":407,"-docs-renderer-surround":2527},[4,93,226,232,392,404],{"title":5,"path":6,"stem":7,"children":8,"icon":92},"","\u002Fdocs","1.docs\u002F1.index",[9,12,17,22,27,32,37,42,47,52,57,62,67,72,77,82,87],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-compass",{"title":13,"path":14,"stem":15,"icon":16},"Quick Start","\u002Fdocs\u002Fquick-start","1.docs\u002F2.quick-start","i-lucide-zap",{"title":18,"path":19,"stem":20,"icon":21},"Renderer","\u002Fdocs\u002Frenderer","1.docs\u002F4.renderer","ri:layout-masonry-line",{"title":23,"path":24,"stem":25,"icon":26},"Routing","\u002Fdocs\u002Frouting","1.docs\u002F5.routing","ri:direction-line",{"title":28,"path":29,"stem":30,"icon":31},"Assets","\u002Fdocs\u002Fassets","1.docs\u002F50.assets","ri:image-2-line",{"title":33,"path":34,"stem":35,"icon":36},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F50.configuration","ri:settings-3-line",{"title":38,"path":39,"stem":40,"icon":41},"Database","\u002Fdocs\u002Fdatabase","1.docs\u002F50.database","ri:database-2-line",{"title":43,"path":44,"stem":45,"icon":46},"Lifecycle","\u002Fdocs\u002Flifecycle","1.docs\u002F50.lifecycle","i-lucide-layers",{"title":48,"path":49,"stem":50,"icon":51},"OpenAPI","\u002Fdocs\u002Fopenapi","1.docs\u002F50.openapi","ri:contract-line",{"title":53,"path":54,"stem":55,"icon":56},"Plugins","\u002Fdocs\u002Fplugins","1.docs\u002F50.plugins","ri:plug-line",{"title":58,"path":59,"stem":60,"icon":61},"Tasks","\u002Fdocs\u002Ftasks","1.docs\u002F50.tasks","codicon:run-all",{"title":63,"path":64,"stem":65,"icon":66},"WebSocket","\u002Fdocs\u002Fwebsocket","1.docs\u002F50.websocket","ri:broadcast-fill",{"title":68,"path":69,"stem":70,"icon":71},"Server Entry","\u002Fdocs\u002Fserver-entry","1.docs\u002F6.server-entry","ri:server-line",{"title":73,"path":74,"stem":75,"icon":76},"Cache","\u002Fdocs\u002Fcache","1.docs\u002F7.cache","ri:speed-line",{"title":78,"path":79,"stem":80,"icon":81},"KV Storage","\u002Fdocs\u002Fstorage","1.docs\u002F8.storage","carbon:datastore",{"title":83,"path":84,"stem":85,"icon":86},"Migration Guide","\u002Fdocs\u002Fmigration","1.docs\u002F99.migration","ri:arrow-right-up-line",{"title":88,"path":89,"stem":90,"icon":91},"Nightly Channel","\u002Fdocs\u002Fnightly","1.docs\u002F99.nightly","ri:moon-fill","i-lucide-book-open",{"title":94,"path":95,"stem":96,"children":97,"icon":99},"Deploy","\u002Fdeploy","2.deploy\u002F0.index",[98,100,121],{"title":94,"path":95,"stem":96,"icon":99},"ri:upload-cloud-2-line",{"title":101,"path":102,"stem":103,"children":104,"page":120},"Runtimes","\u002Fdeploy\u002Fruntimes","2.deploy\u002F10.runtimes",[105,110,115],{"title":106,"path":107,"stem":108,"icon":109},"Node.js","\u002Fdeploy\u002Fruntimes\u002Fnode","2.deploy\u002F10.runtimes\u002F1.node","akar-icons:node-fill",{"title":111,"path":112,"stem":113,"icon":114},"Bun","\u002Fdeploy\u002Fruntimes\u002Fbun","2.deploy\u002F10.runtimes\u002Fbun","simple-icons:bun",{"title":116,"path":117,"stem":118,"icon":119},"Deno","\u002Fdeploy\u002Fruntimes\u002Fdeno","2.deploy\u002F10.runtimes\u002Fdeno","simple-icons:deno",false,{"title":122,"path":123,"stem":124,"children":125,"page":120},"Providers","\u002Fdeploy\u002Fproviders","2.deploy\u002F20.providers",[126,130,134,138,142,146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,214,218,222],{"title":127,"path":128,"stem":129},"Alwaysdata","\u002Fdeploy\u002Fproviders\u002Falwaysdata","2.deploy\u002F20.providers\u002Falwaysdata",{"title":131,"path":132,"stem":133},"AWS Lambda","\u002Fdeploy\u002Fproviders\u002Faws","2.deploy\u002F20.providers\u002Faws",{"title":135,"path":136,"stem":137},"AWS Amplify","\u002Fdeploy\u002Fproviders\u002Faws-amplify","2.deploy\u002F20.providers\u002Faws-amplify",{"title":139,"path":140,"stem":141},"Azure","\u002Fdeploy\u002Fproviders\u002Fazure","2.deploy\u002F20.providers\u002Fazure",{"title":143,"path":144,"stem":145},"Cleavr","\u002Fdeploy\u002Fproviders\u002Fcleavr","2.deploy\u002F20.providers\u002Fcleavr",{"title":147,"path":148,"stem":149},"Cloudflare","\u002Fdeploy\u002Fproviders\u002Fcloudflare","2.deploy\u002F20.providers\u002Fcloudflare",{"title":151,"path":152,"stem":153},"Deno Deploy","\u002Fdeploy\u002Fproviders\u002Fdeno-deploy","2.deploy\u002F20.providers\u002Fdeno-deploy",{"title":155,"path":156,"stem":157},"DigitalOcean","\u002Fdeploy\u002Fproviders\u002Fdigitalocean","2.deploy\u002F20.providers\u002Fdigitalocean",{"title":159,"path":160,"stem":161},"EdgeOne Pages","\u002Fdeploy\u002Fproviders\u002Fedgeone","2.deploy\u002F20.providers\u002Fedgeone",{"title":163,"path":164,"stem":165},"Firebase","\u002Fdeploy\u002Fproviders\u002Ffirebase","2.deploy\u002F20.providers\u002Ffirebase",{"title":167,"path":168,"stem":169},"Flightcontrol","\u002Fdeploy\u002Fproviders\u002Fflightcontrol","2.deploy\u002F20.providers\u002Fflightcontrol",{"title":171,"path":172,"stem":173},"Genezio","\u002Fdeploy\u002Fproviders\u002Fgenezio","2.deploy\u002F20.providers\u002Fgenezio",{"title":175,"path":176,"stem":177},"GitHub Pages","\u002Fdeploy\u002Fproviders\u002Fgithub-pages","2.deploy\u002F20.providers\u002Fgithub-pages",{"title":179,"path":180,"stem":181},"GitLab Pages","\u002Fdeploy\u002Fproviders\u002Fgitlab-pages","2.deploy\u002F20.providers\u002Fgitlab-pages",{"title":183,"path":184,"stem":185},"Heroku","\u002Fdeploy\u002Fproviders\u002Fheroku","2.deploy\u002F20.providers\u002Fheroku",{"title":187,"path":188,"stem":189},"IIS","\u002Fdeploy\u002Fproviders\u002Fiis","2.deploy\u002F20.providers\u002Fiis",{"title":191,"path":192,"stem":193},"Koyeb","\u002Fdeploy\u002Fproviders\u002Fkoyeb","2.deploy\u002F20.providers\u002Fkoyeb",{"title":195,"path":196,"stem":197},"Netlify","\u002Fdeploy\u002Fproviders\u002Fnetlify","2.deploy\u002F20.providers\u002Fnetlify",{"title":199,"path":200,"stem":201},"Platform.sh","\u002Fdeploy\u002Fproviders\u002Fplatform-sh","2.deploy\u002F20.providers\u002Fplatform-sh",{"title":203,"path":204,"stem":205},"Render.com","\u002Fdeploy\u002Fproviders\u002Frender","2.deploy\u002F20.providers\u002Frender",{"title":207,"path":208,"stem":209},"StormKit","\u002Fdeploy\u002Fproviders\u002Fstormkit","2.deploy\u002F20.providers\u002Fstormkit",{"title":211,"path":212,"stem":213},"Vercel","\u002Fdeploy\u002Fproviders\u002Fvercel","2.deploy\u002F20.providers\u002Fvercel",{"title":215,"path":216,"stem":217},"Zeabur","\u002Fdeploy\u002Fproviders\u002Fzeabur","2.deploy\u002F20.providers\u002Fzeabur",{"title":219,"path":220,"stem":221},"Zephyr Cloud","\u002Fdeploy\u002Fproviders\u002Fzephyr","2.deploy\u002F20.providers\u002Fzephyr",{"title":223,"path":224,"stem":225},"Zerops","\u002Fdeploy\u002Fproviders\u002Fzerops","2.deploy\u002F20.providers\u002Fzerops",{"title":227,"path":228,"stem":229,"children":230,"icon":36},"Config","\u002Fconfig","3.config\u002F0.index",[231],{"title":227,"path":228,"stem":229,"icon":36},{"title":233,"path":234,"stem":235,"children":236,"icon":238},"Examples","\u002Fexamples","4.examples\u002F0.index",[237,239,244,249,254,259,263,268,273,278,283,288,293,297,302,306,310,315,320,325,330,335,340,345,350,355,360,364,369,374,378,383,388],{"title":233,"path":234,"stem":235,"icon":238},"i-lucide-folder-code",{"title":240,"path":241,"stem":242,"icon":243},"API Routes","\u002Fexamples\u002Fapi-routes","4.examples\u002Fapi-routes","i-lucide-route",{"title":245,"path":246,"stem":247,"icon":248},"Auto Imports","\u002Fexamples\u002Fauto-imports","4.examples\u002Fauto-imports","i-lucide-import",{"title":250,"path":251,"stem":252,"icon":253},"Cached Handler","\u002Fexamples\u002Fcached-handler","4.examples\u002Fcached-handler","i-lucide-clock",{"title":255,"path":256,"stem":257,"icon":258},"Custom Error Handler","\u002Fexamples\u002Fcustom-error-handler","4.examples\u002Fcustom-error-handler","i-lucide-alert-circle",{"title":38,"path":260,"stem":261,"icon":262},"\u002Fexamples\u002Fdatabase","4.examples\u002Fdatabase","i-lucide-database",{"title":264,"path":265,"stem":266,"icon":267},"Elysia","\u002Fexamples\u002Felysia","4.examples\u002Felysia","i-skill-icons-elysia-dark",{"title":269,"path":270,"stem":271,"icon":272},"Express","\u002Fexamples\u002Fexpress","4.examples\u002Fexpress","i-simple-icons-express",{"title":274,"path":275,"stem":276,"icon":277},"Fastify","\u002Fexamples\u002Ffastify","4.examples\u002Ffastify","i-simple-icons-fastify",{"title":279,"path":280,"stem":281,"icon":282},"Hello World","\u002Fexamples\u002Fhello-world","4.examples\u002Fhello-world","i-lucide-sparkles",{"title":284,"path":285,"stem":286,"icon":287},"Hono","\u002Fexamples\u002Fhono","4.examples\u002Fhono","i-logos-hono",{"title":289,"path":290,"stem":291,"icon":292},"Import Alias","\u002Fexamples\u002Fimport-alias","4.examples\u002Fimport-alias","i-lucide-at-sign",{"title":294,"path":295,"stem":296,"icon":46},"Middleware","\u002Fexamples\u002Fmiddleware","4.examples\u002Fmiddleware",{"title":298,"path":299,"stem":300,"icon":301},"Mono JSX","\u002Fexamples\u002Fmono-jsx","4.examples\u002Fmono-jsx","i-lucide-brackets",{"title":303,"path":304,"stem":305,"icon":301},"Nano JSX","\u002Fexamples\u002Fnano-jsx","4.examples\u002Fnano-jsx",{"title":53,"path":307,"stem":308,"icon":309},"\u002Fexamples\u002Fplugins","4.examples\u002Fplugins","i-lucide-plug",{"title":311,"path":312,"stem":313,"icon":314},"Custom Renderer","\u002Fexamples\u002Frenderer","4.examples\u002Frenderer","i-lucide-code",{"title":316,"path":317,"stem":318,"icon":319},"Runtime Config","\u002Fexamples\u002Fruntime-config","4.examples\u002Fruntime-config","i-lucide-settings",{"title":321,"path":322,"stem":323,"icon":324},"Server Fetch","\u002Fexamples\u002Fserver-fetch","4.examples\u002Fserver-fetch","i-lucide-arrow-right-left",{"title":326,"path":327,"stem":328,"icon":329},"Shiki","\u002Fexamples\u002Fshiki","4.examples\u002Fshiki","i-lucide-highlighter",{"title":331,"path":332,"stem":333,"icon":334},"Takumi","\u002Fexamples\u002Ftakumi","4.examples\u002Ftakumi","i-lucide-image",{"title":336,"path":337,"stem":338,"icon":339},"Virtual Routes","\u002Fexamples\u002Fvirtual-routes","4.examples\u002Fvirtual-routes","i-lucide-box",{"title":341,"path":342,"stem":343,"icon":344},"Vite Nitro Plugin","\u002Fexamples\u002Fvite-nitro-plugin","4.examples\u002Fvite-nitro-plugin","i-logos-vitejs",{"title":346,"path":347,"stem":348,"icon":349},"Vite RSC","\u002Fexamples\u002Fvite-rsc","4.examples\u002Fvite-rsc","i-logos-react",{"title":351,"path":352,"stem":353,"icon":354},"Vite SSR HTML","\u002Fexamples\u002Fvite-ssr-html","4.examples\u002Fvite-ssr-html","i-logos-html-5",{"title":356,"path":357,"stem":358,"icon":359},"SSR with Preact","\u002Fexamples\u002Fvite-ssr-preact","4.examples\u002Fvite-ssr-preact","i-logos-preact",{"title":361,"path":362,"stem":363,"icon":349},"SSR with React","\u002Fexamples\u002Fvite-ssr-react","4.examples\u002Fvite-ssr-react",{"title":365,"path":366,"stem":367,"icon":368},"SSR with SolidJS","\u002Fexamples\u002Fvite-ssr-solid","4.examples\u002Fvite-ssr-solid","i-logos-solidjs-icon",{"title":370,"path":371,"stem":372,"icon":373},"SSR with TanStack Router","\u002Fexamples\u002Fvite-ssr-tsr-react","4.examples\u002Fvite-ssr-tsr-react","i-simple-icons-tanstack",{"title":375,"path":376,"stem":377,"icon":373},"SSR with TanStack Start","\u002Fexamples\u002Fvite-ssr-tss-react","4.examples\u002Fvite-ssr-tss-react",{"title":379,"path":380,"stem":381,"icon":382},"SSR with Vue Router","\u002Fexamples\u002Fvite-ssr-vue-router","4.examples\u002Fvite-ssr-vue-router","i-logos-vue",{"title":384,"path":385,"stem":386,"icon":387},"Vite + tRPC","\u002Fexamples\u002Fvite-trpc","4.examples\u002Fvite-trpc","i-simple-icons-trpc",{"title":63,"path":389,"stem":390,"icon":391},"\u002Fexamples\u002Fwebsocket","4.examples\u002Fwebsocket","i-lucide-radio",{"title":393,"path":394,"stem":395,"children":396},"Blog","\u002Fblog","9.blog",[397,400],{"title":393,"path":394,"stem":398,"icon":399},"9.blog\u002Findex","i-lucide-file-text",{"title":401,"path":402,"stem":403,"icon":399},"Nitro v3 Beta is here!","\u002Fblog\u002Fv3-beta","9.blog\u002F1.v3-beta",{"title":5,"path":405,"stem":406},"\u002F","index",{"id":408,"title":409,"body":410,"description":2522,"extension":2244,"meta":2523,"navigation":2524,"path":19,"seo":2525,"stem":20,"__hash__":2526},"content\u002F1.docs\u002F4.renderer.md","Nitro Renderer",{"type":411,"value":412,"toc":2501,"icon":21},"minimark",[413,417,421,429,548,619,630,634,641,647,650,916,927,930,952,956,963,1157,1161,1170,1176,1237,1240,1244,1253,1258,1276,1319,1323,1330,1463,1467,1473,1555,1559,1566,1626,1630,1633,1720,1724,1781,1952,1956,1960,1963,1973,2141,2144,2194,2206,2210,2221,2240,2272,2282,2284,2288,2291,2295,2305,2312,2325,2468,2472,2478,2482,2486,2492,2497],[414,415,416],"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.",[418,419,33],"h2",{"id":420},"configuration",[414,422,423,424,428],{},"The renderer is configured using the ",[425,426,427],"code",{},"renderer"," option in your Nitro config:",[430,431,436],"pre",{"className":432,"code":433,"filename":434,"language":435,"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 Treat template as static HTML (no rendu processing)\n  }\n})\n","nitro.config.ts","ts",[425,437,438,461,468,484,490,506,520,536,542],{"__ignoreMap":5},[439,440,443,447,451,454,458],"span",{"class":441,"line":442},"line",1,[439,444,446],{"class":445},"so5gQ","import",[439,448,450],{"class":449},"slsVL"," { defineConfig } ",[439,452,453],{"class":445},"from",[439,455,457],{"class":456},"sfrk1"," \"nitro\"",[439,459,460],{"class":449},";\n",[439,462,464],{"class":441,"line":463},2,[439,465,467],{"emptyLinePlaceholder":466},true,"\n",[439,469,471,474,477,481],{"class":441,"line":470},3,[439,472,473],{"class":445},"export",[439,475,476],{"class":445}," default",[439,478,480],{"class":479},"shcOC"," defineConfig",[439,482,483],{"class":449},"({\n",[439,485,487],{"class":441,"line":486},4,[439,488,489],{"class":449},"  renderer: {\n",[439,491,493,496,499,502],{"class":441,"line":492},5,[439,494,495],{"class":449},"    template: ",[439,497,498],{"class":456},"'.\u002Findex.html'",[439,500,501],{"class":449},",  ",[439,503,505],{"class":504},"sCsY4","\u002F\u002F Path to HTML template file\n",[439,507,509,512,515,517],{"class":441,"line":508},6,[439,510,511],{"class":449},"    handler: ",[439,513,514],{"class":456},"'.\u002Frenderer.ts'",[439,516,501],{"class":449},[439,518,519],{"class":504},"\u002F\u002F Path to custom renderer handler\n",[439,521,523,526,530,533],{"class":441,"line":522},7,[439,524,525],{"class":449},"    static: ",[439,527,529],{"class":528},"suiK_","false",[439,531,532],{"class":449},",             ",[439,534,535],{"class":504},"\u002F\u002F Treat template as static HTML (no rendu processing)\n",[439,537,539],{"class":441,"line":538},8,[439,540,541],{"class":449},"  }\n",[439,543,545],{"class":441,"line":544},9,[439,546,547],{"class":449},"})\n",[549,550,551,567],"table",{},[552,553,554],"thead",{},[555,556,557,561,564],"tr",{},[558,559,560],"th",{},"Option",[558,562,563],{},"Type",[558,565,566],{},"Description",[568,569,570,586,600],"tbody",{},[555,571,572,578,583],{},[573,574,575],"td",{},[425,576,577],{},"template",[573,579,580],{},[425,581,582],{},"string",[573,584,585],{},"Path to an HTML file used as the renderer template.",[555,587,588,593,597],{},[573,589,590],{},[425,591,592],{},"handler",[573,594,595],{},[425,596,582],{},[573,598,599],{},"Path to a custom renderer handler module.",[555,601,602,607,612],{},[573,603,604],{},[425,605,606],{},"static",[573,608,609],{},[425,610,611],{},"boolean",[573,613,614,615,618],{},"When ",[425,616,617],{},"true",", skips rendu template processing and serves the HTML as-is. Auto-detected based on template syntax when not set.",[414,620,621,622,625,626,629],{},"Set ",[425,623,624],{},"renderer: false"," in the config to explicitly disable the renderer entirely (including auto-detection of ",[425,627,628],{},"index.html",").",[418,631,633],{"id":632},"html-template","HTML template",[635,636,638,639],"h3",{"id":637},"auto-detected-indexhtml","Auto-detected ",[425,640,628],{},[414,642,643,644,646],{},"By default, Nitro automatically looks for an ",[425,645,628],{}," file in your project src dir.",[414,648,649],{},"If found, Nitro will use it as the renderer template and serve it for all unmatched routes.",[651,652,653,849],"code-group",{},[430,654,658],{"className":655,"code":656,"filename":628,"language":657,"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",[425,659,660,675,693,703,722,746,760,769,778,800,830,839],{"__ignoreMap":5},[439,661,662,665,669,672],{"class":441,"line":442},[439,663,664],{"class":449},"\u003C!",[439,666,668],{"class":667},"sByVh","DOCTYPE",[439,670,671],{"class":479}," html",[439,673,674],{"class":449},">\n",[439,676,677,680,682,685,688,691],{"class":441,"line":463},[439,678,679],{"class":449},"\u003C",[439,681,657],{"class":667},[439,683,684],{"class":479}," lang",[439,686,687],{"class":449},"=",[439,689,690],{"class":456},"\"en\"",[439,692,674],{"class":449},[439,694,695,698,701],{"class":441,"line":470},[439,696,697],{"class":449},"  \u003C",[439,699,700],{"class":667},"head",[439,702,674],{"class":449},[439,704,705,708,711,714,716,719],{"class":441,"line":486},[439,706,707],{"class":449},"    \u003C",[439,709,710],{"class":667},"meta",[439,712,713],{"class":479}," charset",[439,715,687],{"class":449},[439,717,718],{"class":456},"\"UTF-8\"",[439,720,721],{"class":449}," \u002F>\n",[439,723,724,726,728,731,733,736,739,741,744],{"class":441,"line":492},[439,725,707],{"class":449},[439,727,710],{"class":667},[439,729,730],{"class":479}," name",[439,732,687],{"class":449},[439,734,735],{"class":456},"\"viewport\"",[439,737,738],{"class":479}," content",[439,740,687],{"class":449},[439,742,743],{"class":456},"\"width=device-width, initial-scale=1.0\"",[439,745,721],{"class":449},[439,747,748,750,753,756,758],{"class":441,"line":508},[439,749,707],{"class":449},[439,751,752],{"class":667},"title",[439,754,755],{"class":449},">My Vite + Nitro App\u003C\u002F",[439,757,752],{"class":667},[439,759,674],{"class":449},[439,761,762,765,767],{"class":441,"line":522},[439,763,764],{"class":449},"  \u003C\u002F",[439,766,700],{"class":667},[439,768,674],{"class":449},[439,770,771,773,776],{"class":441,"line":538},[439,772,697],{"class":449},[439,774,775],{"class":667},"body",[439,777,674],{"class":449},[439,779,780,782,785,788,790,793,796,798],{"class":441,"line":544},[439,781,707],{"class":449},[439,783,784],{"class":667},"div",[439,786,787],{"class":479}," id",[439,789,687],{"class":449},[439,791,792],{"class":456},"\"app\"",[439,794,795],{"class":449},">\u003C\u002F",[439,797,784],{"class":667},[439,799,674],{"class":449},[439,801,803,805,808,811,813,816,819,821,824,826,828],{"class":441,"line":802},10,[439,804,707],{"class":449},[439,806,807],{"class":667},"script",[439,809,810],{"class":479}," type",[439,812,687],{"class":449},[439,814,815],{"class":456},"\"module\"",[439,817,818],{"class":479}," src",[439,820,687],{"class":449},[439,822,823],{"class":456},"\"\u002Fsrc\u002Fmain.ts\"",[439,825,795],{"class":449},[439,827,807],{"class":667},[439,829,674],{"class":449},[439,831,833,835,837],{"class":441,"line":832},11,[439,834,764],{"class":449},[439,836,775],{"class":667},[439,838,674],{"class":449},[439,840,842,845,847],{"class":441,"line":841},12,[439,843,844],{"class":449},"\u003C\u002F",[439,846,657],{"class":667},[439,848,674],{"class":449},[430,850,853],{"className":432,"code":851,"filename":852,"language":435,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  return { hello: \"API\" };\n});\n","routes\u002Fapi\u002Fhello.ts",[425,854,855,868,872,897,911],{"__ignoreMap":5},[439,856,857,859,862,864,866],{"class":441,"line":442},[439,858,446],{"class":445},[439,860,861],{"class":449}," { defineHandler } ",[439,863,453],{"class":445},[439,865,457],{"class":456},[439,867,460],{"class":449},[439,869,870],{"class":441,"line":463},[439,871,467],{"emptyLinePlaceholder":466},[439,873,874,876,878,881,884,888,891,894],{"class":441,"line":470},[439,875,473],{"class":445},[439,877,476],{"class":445},[439,879,880],{"class":479}," defineHandler",[439,882,883],{"class":449},"((",[439,885,887],{"class":886},"sQHwn","event",[439,889,890],{"class":449},") ",[439,892,893],{"class":445},"=>",[439,895,896],{"class":449}," {\n",[439,898,899,902,905,908],{"class":441,"line":486},[439,900,901],{"class":445},"  return",[439,903,904],{"class":449}," { hello: ",[439,906,907],{"class":456},"\"API\"",[439,909,910],{"class":449}," };\n",[439,912,913],{"class":441,"line":492},[439,914,915],{"class":449},"});\n",[917,918,919],"tip",{},[414,920,614,921,923,924],{},[425,922,628],{}," is detected, Nitro will automatically log in the terminal: ",[425,925,926],{},"Using index.html as renderer template.",[414,928,929],{},"With this setup:",[931,932,933,940],"ul",{},[934,935,936,939],"li",{},[425,937,938],{},"\u002Fapi\u002Fhello"," → Handled by your API routes",[934,941,942,945,946,949,950],{},[425,943,944],{},"\u002Fabout",", ",[425,947,948],{},"\u002Fcontact",", etc. → Served with ",[425,951,628],{},[635,953,955],{"id":954},"custom-html-file","Custom HTML file",[414,957,958,959,962],{},"You can specify a custom HTML template file using the ",[425,960,961],{},"renderer.template"," option in your Nitro configuration.",[651,964,965,1015],{},[430,966,968],{"className":432,"code":967,"filename":434,"language":435,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    template: '.\u002Fapp.html'\n  }\n})\n",[425,969,970,982,986,996,1000,1007,1011],{"__ignoreMap":5},[439,971,972,974,976,978,980],{"class":441,"line":442},[439,973,446],{"class":445},[439,975,450],{"class":449},[439,977,453],{"class":445},[439,979,457],{"class":456},[439,981,460],{"class":449},[439,983,984],{"class":441,"line":463},[439,985,467],{"emptyLinePlaceholder":466},[439,987,988,990,992,994],{"class":441,"line":470},[439,989,473],{"class":445},[439,991,476],{"class":445},[439,993,480],{"class":479},[439,995,483],{"class":449},[439,997,998],{"class":441,"line":486},[439,999,489],{"class":449},[439,1001,1002,1004],{"class":441,"line":492},[439,1003,495],{"class":449},[439,1005,1006],{"class":456},"'.\u002Fapp.html'\n",[439,1008,1009],{"class":441,"line":508},[439,1010,541],{"class":449},[439,1012,1013],{"class":441,"line":522},[439,1014,547],{"class":449},[430,1016,1019],{"className":655,"code":1017,"filename":1018,"language":657,"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",[425,1020,1021,1031,1045,1053,1067,1080,1088,1096,1116,1141,1149],{"__ignoreMap":5},[439,1022,1023,1025,1027,1029],{"class":441,"line":442},[439,1024,664],{"class":449},[439,1026,668],{"class":667},[439,1028,671],{"class":479},[439,1030,674],{"class":449},[439,1032,1033,1035,1037,1039,1041,1043],{"class":441,"line":463},[439,1034,679],{"class":449},[439,1036,657],{"class":667},[439,1038,684],{"class":479},[439,1040,687],{"class":449},[439,1042,690],{"class":456},[439,1044,674],{"class":449},[439,1046,1047,1049,1051],{"class":441,"line":470},[439,1048,697],{"class":449},[439,1050,700],{"class":667},[439,1052,674],{"class":449},[439,1054,1055,1057,1059,1061,1063,1065],{"class":441,"line":486},[439,1056,707],{"class":449},[439,1058,710],{"class":667},[439,1060,713],{"class":479},[439,1062,687],{"class":449},[439,1064,718],{"class":456},[439,1066,721],{"class":449},[439,1068,1069,1071,1073,1076,1078],{"class":441,"line":492},[439,1070,707],{"class":449},[439,1072,752],{"class":667},[439,1074,1075],{"class":449},">Custom Template\u003C\u002F",[439,1077,752],{"class":667},[439,1079,674],{"class":449},[439,1081,1082,1084,1086],{"class":441,"line":508},[439,1083,764],{"class":449},[439,1085,700],{"class":667},[439,1087,674],{"class":449},[439,1089,1090,1092,1094],{"class":441,"line":522},[439,1091,697],{"class":449},[439,1093,775],{"class":667},[439,1095,674],{"class":449},[439,1097,1098,1100,1102,1104,1106,1109,1112,1114],{"class":441,"line":538},[439,1099,707],{"class":449},[439,1101,784],{"class":667},[439,1103,787],{"class":479},[439,1105,687],{"class":449},[439,1107,1108],{"class":456},"\"root\"",[439,1110,1111],{"class":449},">Loading...\u003C\u002F",[439,1113,784],{"class":667},[439,1115,674],{"class":449},[439,1117,1118,1120,1122,1124,1126,1128,1130,1132,1135,1137,1139],{"class":441,"line":544},[439,1119,707],{"class":449},[439,1121,807],{"class":667},[439,1123,810],{"class":479},[439,1125,687],{"class":449},[439,1127,815],{"class":456},[439,1129,818],{"class":479},[439,1131,687],{"class":449},[439,1133,1134],{"class":456},"\"\u002Fsrc\u002Fmain.js\"",[439,1136,795],{"class":449},[439,1138,807],{"class":667},[439,1140,674],{"class":449},[439,1142,1143,1145,1147],{"class":441,"line":802},[439,1144,764],{"class":449},[439,1146,775],{"class":667},[439,1148,674],{"class":449},[439,1150,1151,1153,1155],{"class":441,"line":832},[439,1152,844],{"class":449},[439,1154,657],{"class":667},[439,1156,674],{"class":449},[635,1158,1160],{"id":1159},"static-templates","Static templates",[414,1162,1163,1164,1169],{},"By default, Nitro auto-detects whether your HTML template contains ",[1165,1166,1168],"a",{"href":1167},"#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.",[414,1171,1172,1173,1175],{},"You can override this behavior with the ",[425,1174,606],{}," option:",[430,1177,1179],{"className":432,"code":1178,"filename":434,"language":435,"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",[425,1180,1181,1193,1197,1207,1211,1220,1229,1233],{"__ignoreMap":5},[439,1182,1183,1185,1187,1189,1191],{"class":441,"line":442},[439,1184,446],{"class":445},[439,1186,450],{"class":449},[439,1188,453],{"class":445},[439,1190,457],{"class":456},[439,1192,460],{"class":449},[439,1194,1195],{"class":441,"line":463},[439,1196,467],{"emptyLinePlaceholder":466},[439,1198,1199,1201,1203,1205],{"class":441,"line":470},[439,1200,473],{"class":445},[439,1202,476],{"class":445},[439,1204,480],{"class":479},[439,1206,483],{"class":449},[439,1208,1209],{"class":441,"line":486},[439,1210,489],{"class":449},[439,1212,1213,1215,1217],{"class":441,"line":492},[439,1214,495],{"class":449},[439,1216,498],{"class":456},[439,1218,1219],{"class":449},",\n",[439,1221,1222,1224,1226],{"class":441,"line":508},[439,1223,525],{"class":449},[439,1225,617],{"class":528},[439,1227,1228],{"class":504}," \u002F\u002F Force static serving, skip template processing\n",[439,1230,1231],{"class":441,"line":522},[439,1232,541],{"class":449},[439,1234,1235],{"class":441,"line":538},[439,1236,547],{"class":449},[414,1238,1239],{},"In production, static templates are inlined into the server bundle and served directly for optimal performance.",[635,1241,1243],{"id":1242},"hypertext-preprocessor-experimental","Hypertext Preprocessor (experimental)",[414,1245,1246,1247,1252],{},"Nitro uses ",[1165,1248,1168],{"href":1249,"rel":1250},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Frendu",[1251],"nofollow"," Hypertext Preprocessor, which provides a simple and powerful way to create dynamic HTML templates with JavaScript expressions.",[1254,1255,1257],"h4",{"id":1256},"output-expressions","Output expressions",[931,1259,1260,1266],{},[934,1261,1262,1265],{},[425,1263,1264],{},"{{ expression }}"," — HTML-escaped output",[934,1267,1268,1271,1272,1275],{},[425,1269,1270],{},"{{{ expression }}}"," or ",[425,1273,1274],{},"\u003C?= expression ?>"," — raw (unescaped) output",[430,1277,1279],{"className":655,"code":1278,"language":657,"meta":5,"style":5},"\u003Ch1>Hello {{ $URL.pathname }}\u003C\u002Fh1>\n\u003Cdiv>{{{ '\u003Cstrong>raw html\u003C\u002Fstrong>' }}}\u003C\u002Fdiv>\n",[425,1280,1281,1295],{"__ignoreMap":5},[439,1282,1283,1285,1288,1291,1293],{"class":441,"line":442},[439,1284,679],{"class":449},[439,1286,1287],{"class":667},"h1",[439,1289,1290],{"class":449},">Hello {{ $URL.pathname }}\u003C\u002F",[439,1292,1287],{"class":667},[439,1294,674],{"class":449},[439,1296,1297,1299,1301,1304,1307,1310,1312,1315,1317],{"class":441,"line":463},[439,1298,679],{"class":449},[439,1300,784],{"class":667},[439,1302,1303],{"class":449},">{{{ '\u003C",[439,1305,1306],{"class":667},"strong",[439,1308,1309],{"class":449},">raw html\u003C\u002F",[439,1311,1306],{"class":667},[439,1313,1314],{"class":449},">' }}}\u003C\u002F",[439,1316,784],{"class":667},[439,1318,674],{"class":449},[1254,1320,1322],{"id":1321},"control-flow","Control flow",[414,1324,1325,1326,1329],{},"Use ",[425,1327,1328],{},"\u003C? ... ?>"," for JavaScript control flow:",[430,1331,1333],{"className":655,"code":1332,"language":657,"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",[425,1334,1335,1343,1356,1363,1380,1401,1409,1416,1420,1428,1435,1448,1454],{"__ignoreMap":5},[439,1336,1337,1340],{"class":441,"line":442},[439,1338,679],{"class":1339},"sVAnh",[439,1341,1342],{"class":449},"? if ($METHOD === 'POST') { ?>\n",[439,1344,1345,1347,1349,1352,1354],{"class":441,"line":463},[439,1346,697],{"class":449},[439,1348,414],{"class":667},[439,1350,1351],{"class":449},">Form submitted!\u003C\u002F",[439,1353,414],{"class":667},[439,1355,674],{"class":449},[439,1357,1358,1360],{"class":441,"line":470},[439,1359,679],{"class":1339},[439,1361,1362],{"class":449},"? } else { ?>\n",[439,1364,1365,1367,1370,1373,1375,1378],{"class":441,"line":486},[439,1366,697],{"class":449},[439,1368,1369],{"class":667},"form",[439,1371,1372],{"class":479}," method",[439,1374,687],{"class":449},[439,1376,1377],{"class":456},"\"POST\"",[439,1379,674],{"class":449},[439,1381,1382,1384,1387,1389,1391,1394,1397,1399],{"class":441,"line":492},[439,1383,707],{"class":449},[439,1385,1386],{"class":667},"button",[439,1388,810],{"class":479},[439,1390,687],{"class":449},[439,1392,1393],{"class":456},"\"submit\"",[439,1395,1396],{"class":449},">Submit\u003C\u002F",[439,1398,1386],{"class":667},[439,1400,674],{"class":449},[439,1402,1403,1405,1407],{"class":441,"line":508},[439,1404,764],{"class":449},[439,1406,1369],{"class":667},[439,1408,674],{"class":449},[439,1410,1411,1413],{"class":441,"line":522},[439,1412,679],{"class":1339},[439,1414,1415],{"class":449},"? } ?>\n",[439,1417,1418],{"class":441,"line":538},[439,1419,467],{"emptyLinePlaceholder":466},[439,1421,1422,1424,1426],{"class":441,"line":544},[439,1423,679],{"class":449},[439,1425,931],{"class":667},[439,1427,674],{"class":449},[439,1429,1430,1432],{"class":441,"line":802},[439,1431,679],{"class":1339},[439,1433,1434],{"class":449},"? for (const item of ['a', 'b', 'c']) { ?>\n",[439,1436,1437,1439,1441,1444,1446],{"class":441,"line":832},[439,1438,697],{"class":449},[439,1440,934],{"class":667},[439,1442,1443],{"class":449},">{{ item }}\u003C\u002F",[439,1445,934],{"class":667},[439,1447,674],{"class":449},[439,1449,1450,1452],{"class":441,"line":841},[439,1451,679],{"class":1339},[439,1453,1415],{"class":449},[439,1455,1457,1459,1461],{"class":441,"line":1456},13,[439,1458,844],{"class":449},[439,1460,931],{"class":667},[439,1462,674],{"class":449},[1254,1464,1466],{"id":1465},"server-scripts","Server scripts",[414,1468,1325,1469,1472],{},[425,1470,1471],{},"\u003Cscript server>"," to execute JavaScript on the server:",[430,1474,1476],{"className":655,"code":1475,"language":657,"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",[425,1477,1478,1489,1534,1542],{"__ignoreMap":5},[439,1479,1480,1482,1484,1487],{"class":441,"line":442},[439,1481,679],{"class":449},[439,1483,807],{"class":667},[439,1485,1486],{"class":479}," server",[439,1488,674],{"class":449},[439,1490,1491,1494,1497,1500,1503,1506,1509,1512,1514,1517,1519,1522,1525,1528,1531],{"class":441,"line":463},[439,1492,1493],{"class":445},"  const",[439,1495,1496],{"class":528}," data",[439,1498,1499],{"class":445}," =",[439,1501,1502],{"class":445}," await",[439,1504,1505],{"class":479}," fetch",[439,1507,1508],{"class":449},"(",[439,1510,1511],{"class":456},"'https:\u002F\u002Fapi.example.com\u002Fdata'",[439,1513,629],{"class":449},[439,1515,1516],{"class":479},"then",[439,1518,1508],{"class":449},[439,1520,1521],{"class":886},"r",[439,1523,1524],{"class":445}," =>",[439,1526,1527],{"class":449}," r.",[439,1529,1530],{"class":479},"json",[439,1532,1533],{"class":449},"());\n",[439,1535,1536,1538,1540],{"class":441,"line":470},[439,1537,844],{"class":449},[439,1539,807],{"class":667},[439,1541,674],{"class":449},[439,1543,1544,1546,1548,1551,1553],{"class":441,"line":486},[439,1545,679],{"class":449},[439,1547,430],{"class":667},[439,1549,1550],{"class":449},">{{ JSON.stringify(data) }}\u003C\u002F",[439,1552,430],{"class":667},[439,1554,674],{"class":449},[1254,1556,1558],{"id":1557},"streaming-content","Streaming content",[414,1560,1561,1562,1565],{},"Use the ",[425,1563,1564],{},"echo()"," function for streaming content. It accepts strings, functions, Promises, Response objects, or ReadableStreams:",[430,1567,1569],{"className":655,"code":1568,"language":657,"meta":5,"style":5},"\u003Cscript server>\n  echo(\"Loading...\");\n  echo(async () => fetch(\"https:\u002F\u002Fapi.example.com\u002Fdata\"));\n\u003C\u002Fscript>\n",[425,1570,1571,1581,1594,1618],{"__ignoreMap":5},[439,1572,1573,1575,1577,1579],{"class":441,"line":442},[439,1574,679],{"class":449},[439,1576,807],{"class":667},[439,1578,1486],{"class":479},[439,1580,674],{"class":449},[439,1582,1583,1586,1588,1591],{"class":441,"line":463},[439,1584,1585],{"class":479},"  echo",[439,1587,1508],{"class":449},[439,1589,1590],{"class":456},"\"Loading...\"",[439,1592,1593],{"class":449},");\n",[439,1595,1596,1598,1600,1603,1606,1608,1610,1612,1615],{"class":441,"line":470},[439,1597,1585],{"class":479},[439,1599,1508],{"class":449},[439,1601,1602],{"class":445},"async",[439,1604,1605],{"class":449}," () ",[439,1607,893],{"class":445},[439,1609,1505],{"class":479},[439,1611,1508],{"class":449},[439,1613,1614],{"class":456},"\"https:\u002F\u002Fapi.example.com\u002Fdata\"",[439,1616,1617],{"class":449},"));\n",[439,1619,1620,1622,1624],{"class":441,"line":486},[439,1621,844],{"class":449},[439,1623,807],{"class":667},[439,1625,674],{"class":449},[1254,1627,1629],{"id":1628},"global-variables","Global variables",[414,1631,1632],{},"Access request context within templates:",[549,1634,1635,1644],{},[552,1636,1637],{},[555,1638,1639,1642],{},[558,1640,1641],{},"Variable",[558,1643,566],{},[568,1645,1646,1660,1677,1690,1700,1710],{},[555,1647,1648,1653],{},[573,1649,1650],{},[425,1651,1652],{},"$REQUEST",[573,1654,1655,1656,1659],{},"The incoming ",[425,1657,1658],{},"Request"," object",[555,1661,1662,1667],{},[573,1663,1664],{},[425,1665,1666],{},"$METHOD",[573,1668,1669,1670,945,1673,1676],{},"HTTP method (",[425,1671,1672],{},"GET",[425,1674,1675],{},"POST",", etc.)",[555,1678,1679,1684],{},[573,1680,1681],{},[425,1682,1683],{},"$URL",[573,1685,1686,1687,1659],{},"Request ",[425,1688,1689],{},"URL",[555,1691,1692,1697],{},[573,1693,1694],{},[425,1695,1696],{},"$HEADERS",[573,1698,1699],{},"Request headers",[555,1701,1702,1707],{},[573,1703,1704],{},[425,1705,1706],{},"$RESPONSE",[573,1708,1709],{},"Response configuration object",[555,1711,1712,1717],{},[573,1713,1714],{},[425,1715,1716],{},"$COOKIES",[573,1718,1719],{},"Read-only object containing request cookies",[1254,1721,1723],{"id":1722},"built-in-functions","Built-in functions",[549,1725,1726,1735],{},[552,1727,1728],{},[555,1729,1730,1733],{},[558,1731,1732],{},"Function",[558,1734,566],{},[568,1736,1737,1751,1761,1771],{},[555,1738,1739,1744],{},[573,1740,1741],{},[425,1742,1743],{},"htmlspecialchars(str)",[573,1745,1746,1747,1750],{},"Escape HTML characters (automatically applied in ",[425,1748,1749],{},"{{ }}"," syntax)",[555,1752,1753,1758],{},[573,1754,1755],{},[425,1756,1757],{},"setCookie(name, value, options?)",[573,1759,1760],{},"Set a cookie in the response",[555,1762,1763,1768],{},[573,1764,1765],{},[425,1766,1767],{},"redirect(url)",[573,1769,1770],{},"Redirect the user to another URL",[555,1772,1773,1778],{},[573,1774,1775],{},[425,1776,1777],{},"echo(content)",[573,1779,1780],{},"Stream content to the response",[430,1782,1784],{"className":655,"code":1783,"filename":628,"language":657,"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",[425,1785,1786,1796,1810,1818,1832,1845,1853,1861,1874,1892,1902,1926,1935,1943],{"__ignoreMap":5},[439,1787,1788,1790,1792,1794],{"class":441,"line":442},[439,1789,664],{"class":449},[439,1791,668],{"class":667},[439,1793,671],{"class":479},[439,1795,674],{"class":449},[439,1797,1798,1800,1802,1804,1806,1808],{"class":441,"line":463},[439,1799,679],{"class":449},[439,1801,657],{"class":667},[439,1803,684],{"class":479},[439,1805,687],{"class":449},[439,1807,690],{"class":456},[439,1809,674],{"class":449},[439,1811,1812,1814,1816],{"class":441,"line":470},[439,1813,697],{"class":449},[439,1815,700],{"class":667},[439,1817,674],{"class":449},[439,1819,1820,1822,1824,1826,1828,1830],{"class":441,"line":486},[439,1821,707],{"class":449},[439,1823,710],{"class":667},[439,1825,713],{"class":479},[439,1827,687],{"class":449},[439,1829,718],{"class":456},[439,1831,721],{"class":449},[439,1833,1834,1836,1838,1841,1843],{"class":441,"line":492},[439,1835,707],{"class":449},[439,1837,752],{"class":667},[439,1839,1840],{"class":449},">Dynamic template\u003C\u002F",[439,1842,752],{"class":667},[439,1844,674],{"class":449},[439,1846,1847,1849,1851],{"class":441,"line":508},[439,1848,764],{"class":449},[439,1850,700],{"class":667},[439,1852,674],{"class":449},[439,1854,1855,1857,1859],{"class":441,"line":522},[439,1856,697],{"class":449},[439,1858,775],{"class":667},[439,1860,674],{"class":449},[439,1862,1863,1865,1867,1870,1872],{"class":441,"line":538},[439,1864,707],{"class":449},[439,1866,1287],{"class":667},[439,1868,1869],{"class":449},">Hello {{ $REQUEST.url }}\u003C\u002F",[439,1871,1287],{"class":667},[439,1873,674],{"class":449},[439,1875,1876,1878,1880,1883,1885,1888,1890],{"class":441,"line":544},[439,1877,707],{"class":449},[439,1879,414],{"class":667},[439,1881,1882],{"class":449},">Welcome, ",[439,1884,679],{"class":1339},[439,1886,1887],{"class":449},"?= $COOKIES[\"user\"] || \"Guest\" ?>!\u003C\u002F",[439,1889,414],{"class":667},[439,1891,674],{"class":449},[439,1893,1894,1896,1898,1900],{"class":441,"line":802},[439,1895,707],{"class":449},[439,1897,807],{"class":667},[439,1899,1486],{"class":479},[439,1901,674],{"class":449},[439,1903,1904,1907,1909,1912,1914,1917,1920,1923],{"class":441,"line":832},[439,1905,1906],{"class":479},"      setCookie",[439,1908,1508],{"class":449},[439,1910,1911],{"class":456},"\"visited\"",[439,1913,945],{"class":449},[439,1915,1916],{"class":456},"\"true\"",[439,1918,1919],{"class":449},", { maxAge: ",[439,1921,1922],{"class":528},"3600",[439,1924,1925],{"class":449}," });\n",[439,1927,1928,1931,1933],{"class":441,"line":841},[439,1929,1930],{"class":449},"    \u003C\u002F",[439,1932,807],{"class":667},[439,1934,674],{"class":449},[439,1936,1937,1939,1941],{"class":441,"line":1456},[439,1938,764],{"class":449},[439,1940,775],{"class":667},[439,1942,674],{"class":449},[439,1944,1946,1948,1950],{"class":441,"line":1945},14,[439,1947,844],{"class":449},[439,1949,657],{"class":667},[439,1951,674],{"class":449},[1953,1954],"read-more",{"title":1955,"to":1249},"Rendu Documentation",[418,1957,1959],{"id":1958},"custom-renderer-handler","Custom renderer handler",[414,1961,1962],{},"For more complex scenarios, you can create a custom renderer handler that programmatically generates responses.",[414,1964,1965,1966,1968,1969,1972],{},"The handler is a default export function that receives an H3 event object. You can access the incoming ",[425,1967,1658],{}," via ",[425,1970,1971],{},"event.req",":",[430,1974,1977],{"className":432,"code":1975,"filename":1976,"language":435,"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",[425,1978,1979,2015,2033,2045,2053,2058,2063,2068,2073,2078,2083,2100,2105,2112,2129,2135],{"__ignoreMap":5},[439,1980,1981,1983,1985,1988,1991,1994,1997,2000,2002,2005,2007,2009,2012],{"class":441,"line":442},[439,1982,473],{"class":445},[439,1984,476],{"class":445},[439,1986,1987],{"class":445}," function",[439,1989,1990],{"class":479}," renderer",[439,1992,1993],{"class":449},"({ ",[439,1995,1996],{"class":886},"req",[439,1998,1999],{"class":449}," }",[439,2001,1972],{"class":445},[439,2003,2004],{"class":449}," { ",[439,2006,1996],{"class":886},[439,2008,1972],{"class":445},[439,2010,2011],{"class":479}," Request",[439,2013,2014],{"class":449}," }) {\n",[439,2016,2017,2019,2022,2024,2027,2030],{"class":441,"line":463},[439,2018,1493],{"class":445},[439,2020,2021],{"class":528}," url",[439,2023,1499],{"class":445},[439,2025,2026],{"class":445}," new",[439,2028,2029],{"class":479}," URL",[439,2031,2032],{"class":449},"(req.url);\n",[439,2034,2035,2037,2039,2042],{"class":441,"line":470},[439,2036,901],{"class":445},[439,2038,2026],{"class":445},[439,2040,2041],{"class":479}," Response",[439,2043,2044],{"class":449},"(\n",[439,2046,2047,2050],{"class":441,"line":486},[439,2048,2049],{"class":504},"    \u002F* html *\u002F",[439,2051,2052],{"class":456}," `\u003C!DOCTYPE html>\n",[439,2054,2055],{"class":441,"line":492},[439,2056,2057],{"class":456},"    \u003Chtml>\n",[439,2059,2060],{"class":441,"line":508},[439,2061,2062],{"class":456},"    \u003Chead>\n",[439,2064,2065],{"class":441,"line":522},[439,2066,2067],{"class":456},"      \u003Ctitle>Custom Renderer\u003C\u002Ftitle>\n",[439,2069,2070],{"class":441,"line":538},[439,2071,2072],{"class":456},"    \u003C\u002Fhead>\n",[439,2074,2075],{"class":441,"line":544},[439,2076,2077],{"class":456},"    \u003Cbody>\n",[439,2079,2080],{"class":441,"line":802},[439,2081,2082],{"class":456},"      \u003Ch1>Hello from custom renderer!\u003C\u002Fh1>\n",[439,2084,2085,2088,2091,2094,2097],{"class":441,"line":832},[439,2086,2087],{"class":456},"      \u003Cp>Current path: ${",[439,2089,2090],{"class":449},"url",[439,2092,2093],{"class":456},".",[439,2095,2096],{"class":449},"pathname",[439,2098,2099],{"class":456},"}\u003C\u002Fp>\n",[439,2101,2102],{"class":441,"line":841},[439,2103,2104],{"class":456},"    \u003C\u002Fbody>\n",[439,2106,2107,2110],{"class":441,"line":1456},[439,2108,2109],{"class":456},"    \u003C\u002Fhtml>`",[439,2111,1219],{"class":449},[439,2113,2114,2117,2120,2123,2126],{"class":441,"line":1945},[439,2115,2116],{"class":449},"    { headers: { ",[439,2118,2119],{"class":456},"\"content-type\"",[439,2121,2122],{"class":449},": ",[439,2124,2125],{"class":456},"\"text\u002Fhtml; charset=utf-8\"",[439,2127,2128],{"class":449}," } }\n",[439,2130,2132],{"class":441,"line":2131},15,[439,2133,2134],{"class":449},"  );\n",[439,2136,2138],{"class":441,"line":2137},16,[439,2139,2140],{"class":449},"}\n",[414,2142,2143],{},"Then, specify the renderer entry in the Nitro config:",[430,2145,2147],{"className":432,"code":2146,"filename":434,"language":435,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  renderer: {\n    handler: '.\u002Frenderer.ts'\n  }\n})\n",[425,2148,2149,2161,2165,2175,2179,2186,2190],{"__ignoreMap":5},[439,2150,2151,2153,2155,2157,2159],{"class":441,"line":442},[439,2152,446],{"class":445},[439,2154,450],{"class":449},[439,2156,453],{"class":445},[439,2158,457],{"class":456},[439,2160,460],{"class":449},[439,2162,2163],{"class":441,"line":463},[439,2164,467],{"emptyLinePlaceholder":466},[439,2166,2167,2169,2171,2173],{"class":441,"line":470},[439,2168,473],{"class":445},[439,2170,476],{"class":445},[439,2172,480],{"class":479},[439,2174,483],{"class":449},[439,2176,2177],{"class":441,"line":486},[439,2178,489],{"class":449},[439,2180,2181,2183],{"class":441,"line":492},[439,2182,511],{"class":449},[439,2184,2185],{"class":456},"'.\u002Frenderer.ts'\n",[439,2187,2188],{"class":441,"line":508},[439,2189,541],{"class":449},[439,2191,2192],{"class":441,"line":522},[439,2193,547],{"class":449},[2195,2196,2197],"note",{},[414,2198,614,2199,2202,2203,2205],{},[425,2200,2201],{},"renderer.handler"," is set, it takes full control of rendering. The ",[425,2204,961],{}," option is ignored.",[418,2207,2209],{"id":2208},"renderer-priority","Renderer priority",[414,2211,2212,2213,2216,2217,2220],{},"The renderer always acts as a catch-all route (",[425,2214,2215],{},"\u002F**",") and has the ",[1306,2218,2219],{},"lowest priority",". This means:",[2222,2223,2225,2232,2237],"steps",{"level":2224},"4",[1254,2226,2227,2228,2231],{},"Specific API routes are matched first (e.g., ",[425,2229,2230],{},"\u002Fapi\u002Fusers",")",[1254,2233,2234,2235,2231],{},"Specific server routes are matched next (e.g., ",[425,2236,944],{},[1254,2238,2239],{},"The renderer catches everything else",[430,2241,2245],{"className":2242,"code":2243,"language":2244,"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",[425,2246,2247,2252,2257,2262,2267],{"__ignoreMap":5},[439,2248,2249],{"class":441,"line":442},[439,2250,2251],{"class":449},"api\u002F\n",[439,2253,2254],{"class":441,"line":463},[439,2255,2256],{"class":449},"  users.ts        → \u002Fapi\u002Fusers (matched first)\n",[439,2258,2259],{"class":441,"line":470},[439,2260,2261],{"class":449},"routes\u002F\n",[439,2263,2264],{"class":441,"line":486},[439,2265,2266],{"class":449},"  about.ts        → \u002Fabout (matched second)\n",[439,2268,2269],{"class":441,"line":492},[439,2270,2271],{"class":449},"renderer.ts         → \u002F** (catches all other routes)\n",[2273,2274,2275],"warning",{},[414,2276,2277,2278,2281],{},"If you define a catch-all route (",[425,2279,2280],{},"[...].ts",") in your routes, Nitro will warn you that the renderer will override it. Use more specific routes or different HTTP methods to avoid conflicts.",[1953,2283],{"title":43,"to":44},[418,2285,2287],{"id":2286},"vite-integration","Vite integration",[414,2289,2290],{},"When using Nitro with Vite, the renderer integrates with Vite's build pipeline and dev server.",[635,2292,2294],{"id":2293},"development-mode","Development mode",[414,2296,2297,2298,2300,2301,2304],{},"In development, the renderer template is read from disk on each request, so changes to ",[425,2299,628],{}," are reflected immediately without restarting the server. Vite's ",[425,2302,2303],{},"transformIndexHtml"," hook is applied to inject HMR client scripts and other dev-time transforms.",[635,2306,2308,2309],{"id":2307},"ssr-with-ssr-outlet","SSR with ",[425,2310,2311],{},"\u003C!--ssr-outlet-->",[414,2313,2314,2315,2318,2319,2321,2322,2324],{},"When using Vite environments with an ",[425,2316,2317],{},"ssr"," service, you can add an ",[425,2320,2311],{}," comment to your ",[425,2323,628],{},". Nitro will replace it with the output from your SSR entry during rendering:",[430,2326,2328],{"className":655,"code":2327,"filename":628,"language":657,"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",[425,2329,2330,2340,2354,2362,2376,2389,2397,2405,2428,2452,2460],{"__ignoreMap":5},[439,2331,2332,2334,2336,2338],{"class":441,"line":442},[439,2333,664],{"class":449},[439,2335,668],{"class":667},[439,2337,671],{"class":479},[439,2339,674],{"class":449},[439,2341,2342,2344,2346,2348,2350,2352],{"class":441,"line":463},[439,2343,679],{"class":449},[439,2345,657],{"class":667},[439,2347,684],{"class":479},[439,2349,687],{"class":449},[439,2351,690],{"class":456},[439,2353,674],{"class":449},[439,2355,2356,2358,2360],{"class":441,"line":470},[439,2357,697],{"class":449},[439,2359,700],{"class":667},[439,2361,674],{"class":449},[439,2363,2364,2366,2368,2370,2372,2374],{"class":441,"line":486},[439,2365,707],{"class":449},[439,2367,710],{"class":667},[439,2369,713],{"class":479},[439,2371,687],{"class":449},[439,2373,718],{"class":456},[439,2375,721],{"class":449},[439,2377,2378,2380,2382,2385,2387],{"class":441,"line":492},[439,2379,707],{"class":449},[439,2381,752],{"class":667},[439,2383,2384],{"class":449},">SSR App\u003C\u002F",[439,2386,752],{"class":667},[439,2388,674],{"class":449},[439,2390,2391,2393,2395],{"class":441,"line":508},[439,2392,764],{"class":449},[439,2394,700],{"class":667},[439,2396,674],{"class":449},[439,2398,2399,2401,2403],{"class":441,"line":522},[439,2400,697],{"class":449},[439,2402,775],{"class":667},[439,2404,674],{"class":449},[439,2406,2407,2409,2411,2413,2415,2417,2420,2422,2424,2426],{"class":441,"line":538},[439,2408,707],{"class":449},[439,2410,784],{"class":667},[439,2412,787],{"class":479},[439,2414,687],{"class":449},[439,2416,792],{"class":456},[439,2418,2419],{"class":449},">",[439,2421,2311],{"class":504},[439,2423,844],{"class":449},[439,2425,784],{"class":667},[439,2427,674],{"class":449},[439,2429,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450],{"class":441,"line":544},[439,2431,707],{"class":449},[439,2433,807],{"class":667},[439,2435,810],{"class":479},[439,2437,687],{"class":449},[439,2439,815],{"class":456},[439,2441,818],{"class":479},[439,2443,687],{"class":449},[439,2445,823],{"class":456},[439,2447,795],{"class":449},[439,2449,807],{"class":667},[439,2451,674],{"class":449},[439,2453,2454,2456,2458],{"class":441,"line":802},[439,2455,764],{"class":449},[439,2457,775],{"class":667},[439,2459,674],{"class":449},[439,2461,2462,2464,2466],{"class":441,"line":832},[439,2463,844],{"class":449},[439,2465,657],{"class":667},[439,2467,674],{"class":449},[635,2469,2471],{"id":2470},"production-build","Production build",[414,2473,2474,2475,2477],{},"During production builds, Vite processes the ",[425,2476,628],{}," through its build pipeline (resolving scripts, CSS, and other assets), then Nitro inlines the transformed HTML into the server bundle.",[418,2479,2481],{"id":2480},"use-cases","Use Cases",[635,2483,2485],{"id":2484},"single-page-application-spa","Single-Page Application (SPA)",[414,2487,2488,2489,2491],{},"Serve your SPA's ",[425,2490,628],{}," for all routes to enable client-side routing:",[917,2493,2494],{},[414,2495,2496],{},"\nThis is the default behavior of Nitro when used with Vite.",[2498,2499,2500],"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":463,"depth":463,"links":2502},[2503,2504,2511,2512,2513,2519],{"id":420,"depth":463,"text":33},{"id":632,"depth":463,"text":633,"children":2505},[2506,2508,2509,2510],{"id":637,"depth":470,"text":2507},"Auto-detected index.html",{"id":954,"depth":470,"text":955},{"id":1159,"depth":470,"text":1160},{"id":1242,"depth":470,"text":1243},{"id":1958,"depth":463,"text":1959},{"id":2208,"depth":463,"text":2209},{"id":2286,"depth":463,"text":2287,"children":2514},[2515,2516,2518],{"id":2293,"depth":470,"text":2294},{"id":2307,"depth":470,"text":2517},"SSR with \u003C!--ssr-outlet-->",{"id":2470,"depth":470,"text":2471},{"id":2480,"depth":463,"text":2481,"children":2520},[2521],{"id":2484,"depth":470,"text":2485},"Use a renderer to handle all unmatched routes with custom HTML or a templating system.",{"icon":21},{"title":18,"icon":21},{"title":409,"description":2522},"lEhxwCNwYzCgx3lb-gAnoXEITGpEr_CK7lNH1ud0OIk",[2528,2530],{"title":13,"path":14,"stem":15,"description":2529,"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":2531,"icon":26,"children":-1},"Nitro supports filesystem routing to automatically map files to routes. By combining code-splitting with compiled routes, it removes the need for a runtime router, leaving only minimal compiled logic.",1784129707591]