[{"data":1,"prerenderedAt":1589},["ShallowReactive",2],{"navigation":3,"-docs-typescript":445,"-docs-typescript-surround":1584},[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":98,"body":447,"description":1578,"extension":1579,"meta":1580,"navigation":1581,"path":99,"seo":1582,"stem":100,"__hash__":1583},"content\u002F1.docs\u002F63.typescript.md",{"type":448,"value":449,"toc":1566,"icon":101},"minimark",[450,463,466,606,625,647,655,658,687,712,761,765,776,790,862,873,915,928,933,954,958,976,1141,1148,1261,1277,1299,1302,1315,1322,1371,1402,1413,1417,1426,1545,1562],[451,452,453,454,458,459,462],"p",{},"Nitro is written in TypeScript and bundles your server code — ",[455,456,457],"code",{},".ts"," files work out of the box in development and production, with no separate compile step. The TypeScript compiler is only needed for type checking (for example ",[455,460,461],{},"tsc --noEmit"," in CI).",[451,464,465],{},"All public utilities ship with types:",[467,468,469,537],"CodeGroup",{},[470,471,476],"pre",{"className":472,"code":473,"filename":474,"language":475,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  \u002F\u002F Fully typed config with completions\n});\n","nitro.config.ts","ts",[455,477,478,501,508,524,531],{"__ignoreMap":5},[479,480,483,487,491,494,498],"span",{"class":481,"line":482},"line",1,[479,484,486],{"class":485},"so5gQ","import",[479,488,490],{"class":489},"slsVL"," { defineConfig } ",[479,492,493],{"class":485},"from",[479,495,497],{"class":496},"sfrk1"," \"nitro\"",[479,499,500],{"class":489},";\n",[479,502,504],{"class":481,"line":503},2,[479,505,507],{"emptyLinePlaceholder":506},true,"\n",[479,509,511,514,517,521],{"class":481,"line":510},3,[479,512,513],{"class":485},"export",[479,515,516],{"class":485}," default",[479,518,520],{"class":519},"shcOC"," defineConfig",[479,522,523],{"class":489},"({\n",[479,525,527],{"class":481,"line":526},4,[479,528,530],{"class":529},"sCsY4","  \u002F\u002F Fully typed config with completions\n",[479,532,534],{"class":481,"line":533},5,[479,535,536],{"class":489},"});\n",[470,538,541],{"className":472,"code":539,"filename":540,"language":475,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\n\nexport default defineHandler((event) => {\n  return { hello: \"world\" }; \u002F\u002F Typed event and inferred return type\n});\n","server\u002Froutes\u002Fhello.ts",[455,542,543,556,560,585,602],{"__ignoreMap":5},[479,544,545,547,550,552,554],{"class":481,"line":482},[479,546,486],{"class":485},[479,548,549],{"class":489}," { defineHandler } ",[479,551,493],{"class":485},[479,553,497],{"class":496},[479,555,500],{"class":489},[479,557,558],{"class":481,"line":503},[479,559,507],{"emptyLinePlaceholder":506},[479,561,562,564,566,569,572,576,579,582],{"class":481,"line":510},[479,563,513],{"class":485},[479,565,516],{"class":485},[479,567,568],{"class":519}," defineHandler",[479,570,571],{"class":489},"((",[479,573,575],{"class":574},"sQHwn","event",[479,577,578],{"class":489},") ",[479,580,581],{"class":485},"=>",[479,583,584],{"class":489}," {\n",[479,586,587,590,593,596,599],{"class":481,"line":526},[479,588,589],{"class":485},"  return",[479,591,592],{"class":489}," { hello: ",[479,594,595],{"class":496},"\"world\"",[479,597,598],{"class":489}," }; ",[479,600,601],{"class":529},"\u002F\u002F Typed event and inferred return type\n",[479,603,604],{"class":481,"line":533},[479,605,536],{"class":489},[451,607,608,609,612,613,616,617,620,621,624],{},"Types (such as ",[455,610,611],{},"NitroConfig",", ",[455,614,615],{},"NitroModule",", or ",[455,618,619],{},"NitroRuntimeConfig",") are exported from ",[455,622,623],{},"nitro\u002Ftypes",":",[470,626,628],{"className":472,"code":627,"language":475,"meta":5,"style":5},"import type { NitroModule } from \"nitro\u002Ftypes\";\n",[455,629,630],{"__ignoreMap":5},[479,631,632,634,637,640,642,645],{"class":481,"line":482},[479,633,486],{"class":485},[479,635,636],{"class":485}," type",[479,638,639],{"class":489}," { NitroModule } ",[479,641,493],{"class":485},[479,643,644],{"class":496}," \"nitro\u002Ftypes\"",[479,646,500],{"class":489},[648,649,651,654],"h2",{"id":650},"tsconfigjson-setup",[455,652,653],{},"tsconfig.json"," setup",[451,656,657],{},"Nitro provides a shareable TypeScript configuration you can extend from:",[470,659,663],{"className":660,"code":661,"filename":653,"language":662,"meta":5,"style":5},"language-json shiki shiki-themes github-light github-dark github-dark","{\n  \"extends\": \"nitro\u002Ftsconfig\"\n}\n","json",[455,664,665,670,682],{"__ignoreMap":5},[479,666,667],{"class":481,"line":482},[479,668,669],{"class":489},"{\n",[479,671,672,676,679],{"class":481,"line":503},[479,673,675],{"class":674},"suiK_","  \"extends\"",[479,677,678],{"class":489},": ",[479,680,681],{"class":496},"\"nitro\u002Ftsconfig\"\n",[479,683,684],{"class":481,"line":510},[479,685,686],{"class":489},"}\n",[451,688,689,690,693,694,612,697,700,701,704,705,707,708,711],{},"It enables modern, strict defaults matching how Nitro bundles your code: ",[455,691,692],{},"strict"," type checking, bundler module resolution, ",[455,695,696],{},"noEmit",[455,698,699],{},"verbatimModuleSyntax",", and ",[455,702,703],{},"allowImportingTsExtensions"," (so you can use explicit ",[455,706,457],{}," extensions in imports). You can override any option by adding your own ",[455,709,710],{},"compilerOptions"," on top:",[470,713,715],{"className":660,"code":714,"filename":653,"language":662,"meta":5,"style":5},"{\n  \"extends\": \"nitro\u002Ftsconfig\",\n  \"compilerOptions\": {\n    \"jsx\": \"react-jsx\"\n  }\n}\n",[455,716,717,721,733,741,751,756],{"__ignoreMap":5},[479,718,719],{"class":481,"line":482},[479,720,669],{"class":489},[479,722,723,725,727,730],{"class":481,"line":503},[479,724,675],{"class":674},[479,726,678],{"class":489},[479,728,729],{"class":496},"\"nitro\u002Ftsconfig\"",[479,731,732],{"class":489},",\n",[479,734,735,738],{"class":481,"line":510},[479,736,737],{"class":674},"  \"compilerOptions\"",[479,739,740],{"class":489},": {\n",[479,742,743,746,748],{"class":481,"line":526},[479,744,745],{"class":674},"    \"jsx\"",[479,747,678],{"class":489},[479,749,750],{"class":496},"\"react-jsx\"\n",[479,752,753],{"class":481,"line":533},[479,754,755],{"class":489},"  }\n",[479,757,759],{"class":481,"line":758},6,[479,760,686],{"class":489},[648,762,764],{"id":763},"generated-types","Generated types",[451,766,767,768,775],{},"Nitro generates project-specific type declarations based on your routes and configuration. They are written automatically when the dev server starts and on every build, or on demand with ",[769,770,772],"a",{"href":771},"\u002Fdocs\u002Fcli#nitro-prepare",[455,773,774],{},"nitro prepare",".",[451,777,778,779,782,783,789],{},"The files are written to the generated types directory — ",[455,780,781],{},"node_modules\u002F.nitro\u002Ftypes"," by default (configurable via ",[769,784,786],{"href":785},"#typescript-config-options",[455,787,788],{},"typescript.generatedTypesDir","):",[791,792,793,806],"table",{},[794,795,796],"thead",{},[797,798,799,803],"tr",{},[800,801,802],"th",{},"File",[800,804,805],{},"Contents",[807,808,809,820,830,847],"tbody",{},[797,810,811,817],{},[812,813,814],"td",{},[455,815,816],{},"nitro.d.ts",[812,818,819],{},"Entry file referencing the declarations below.",[797,821,822,827],{},[812,823,824],{},[455,825,826],{},"nitro-routes.d.ts",[812,828,829],{},"Return types of your route handlers, per route and method.",[797,831,832,837],{},[812,833,834],{},[455,835,836],{},"nitro-config.d.ts",[812,838,839,840,846],{},"Runtime config types (when ",[769,841,843],{"href":842},"#runtime-config-types",[455,844,845],{},"generateRuntimeConfigTypes"," is enabled).",[797,848,849,854],{},[812,850,851],{},[455,852,853],{},"nitro-imports.d.ts",[812,855,856,857,861],{},"Declarations for ",[769,858,860],{"href":859},"#auto-imports","auto-imports"," (when enabled).",[451,863,864,865,868,869,872],{},"To make them available to your editor and type checker, add the entry file to your tsconfig ",[455,866,867],{},"include"," (the explicit path is required since ",[455,870,871],{},"node_modules"," is excluded by default):",[470,874,876],{"className":660,"code":875,"filename":653,"language":662,"meta":5,"style":5},"{\n  \"extends\": \"nitro\u002Ftsconfig\",\n  \"include\": [\"node_modules\u002F.nitro\u002Ftypes\u002Fnitro.d.ts\", \"**\u002F*\"]\n}\n",[455,877,878,882,892,911],{"__ignoreMap":5},[479,879,880],{"class":481,"line":482},[479,881,669],{"class":489},[479,883,884,886,888,890],{"class":481,"line":503},[479,885,675],{"class":674},[479,887,678],{"class":489},[479,889,729],{"class":496},[479,891,732],{"class":489},[479,893,894,897,900,903,905,908],{"class":481,"line":510},[479,895,896],{"class":674},"  \"include\"",[479,898,899],{"class":489},": [",[479,901,902],{"class":496},"\"node_modules\u002F.nitro\u002Ftypes\u002Fnitro.d.ts\"",[479,904,612],{"class":489},[479,906,907],{"class":496},"\"**\u002F*\"",[479,909,910],{"class":489},"]\n",[479,912,913],{"class":481,"line":526},[479,914,686],{"class":489},[916,917,918],"tip",{},[451,919,920,921,923,924,927],{},"Running ",[455,922,774],{}," in a ",[455,925,926],{},"postinstall"," script keeps generated types up to date for your editor after each install.",[929,930,932],"h3",{"id":931},"route-types","Route types",[451,934,935,936,939,940,942,943,946,947,950,951,953],{},"For each scanned route handler, Nitro records the (JSON-serialized) return type in the ",[455,937,938],{},"InternalApi"," interface of ",[455,941,623],{},", keyed by route path and HTTP method. Frameworks and libraries can build on this augmentation — together with helper types such as ",[455,944,945],{},"NitroFetchRequest"," and ",[455,948,949],{},"TypedInternalResponse"," from ",[455,952,623],{}," — to provide end-to-end typed clients for your API.",[929,955,957],{"id":956},"runtime-config-types","Runtime config types",[451,959,960,961,964,965,968,969,971,972,975],{},"By default, ",[455,962,963],{},"useRuntimeConfig()"," returns a loosely typed object. Enable ",[455,966,967],{},"typescript.generateRuntimeConfigTypes"," to generate a ",[455,970,619],{}," interface from the ",[455,973,974],{},"runtimeConfig"," values in your config:",[467,977,978,1059],{},[470,979,981],{"className":472,"code":980,"filename":474,"language":475,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  runtimeConfig: {\n    apiToken: \"dev-token\", \u002F\u002F Overridable with the NITRO_API_TOKEN environment variable\n  },\n  typescript: {\n    generateRuntimeConfigTypes: true,\n  },\n});\n",[455,982,983,995,999,1009,1014,1027,1032,1038,1049,1054],{"__ignoreMap":5},[479,984,985,987,989,991,993],{"class":481,"line":482},[479,986,486],{"class":485},[479,988,490],{"class":489},[479,990,493],{"class":485},[479,992,497],{"class":496},[479,994,500],{"class":489},[479,996,997],{"class":481,"line":503},[479,998,507],{"emptyLinePlaceholder":506},[479,1000,1001,1003,1005,1007],{"class":481,"line":510},[479,1002,513],{"class":485},[479,1004,516],{"class":485},[479,1006,520],{"class":519},[479,1008,523],{"class":489},[479,1010,1011],{"class":481,"line":526},[479,1012,1013],{"class":489},"  runtimeConfig: {\n",[479,1015,1016,1019,1022,1024],{"class":481,"line":533},[479,1017,1018],{"class":489},"    apiToken: ",[479,1020,1021],{"class":496},"\"dev-token\"",[479,1023,612],{"class":489},[479,1025,1026],{"class":529},"\u002F\u002F Overridable with the NITRO_API_TOKEN environment variable\n",[479,1028,1029],{"class":481,"line":758},[479,1030,1031],{"class":489},"  },\n",[479,1033,1035],{"class":481,"line":1034},7,[479,1036,1037],{"class":489},"  typescript: {\n",[479,1039,1041,1044,1047],{"class":481,"line":1040},8,[479,1042,1043],{"class":489},"    generateRuntimeConfigTypes: ",[479,1045,1046],{"class":674},"true",[479,1048,732],{"class":489},[479,1050,1052],{"class":481,"line":1051},9,[479,1053,1031],{"class":489},[479,1055,1057],{"class":481,"line":1056},10,[479,1058,536],{"class":489},[470,1060,1063],{"className":472,"code":1061,"filename":1062,"language":475,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\nimport { useRuntimeConfig } from \"nitro\u002Fruntime-config\";\n\nexport default defineHandler(() => {\n  const config = useRuntimeConfig();\n  return { token: config.apiToken }; \u002F\u002F Typed as string\n});\n","server\u002Froutes\u002Ftoken.ts",[455,1064,1065,1077,1091,1095,1110,1127,1137],{"__ignoreMap":5},[479,1066,1067,1069,1071,1073,1075],{"class":481,"line":482},[479,1068,486],{"class":485},[479,1070,549],{"class":489},[479,1072,493],{"class":485},[479,1074,497],{"class":496},[479,1076,500],{"class":489},[479,1078,1079,1081,1084,1086,1089],{"class":481,"line":503},[479,1080,486],{"class":485},[479,1082,1083],{"class":489}," { useRuntimeConfig } ",[479,1085,493],{"class":485},[479,1087,1088],{"class":496}," \"nitro\u002Fruntime-config\"",[479,1090,500],{"class":489},[479,1092,1093],{"class":481,"line":510},[479,1094,507],{"emptyLinePlaceholder":506},[479,1096,1097,1099,1101,1103,1106,1108],{"class":481,"line":526},[479,1098,513],{"class":485},[479,1100,516],{"class":485},[479,1102,568],{"class":519},[479,1104,1105],{"class":489},"(() ",[479,1107,581],{"class":485},[479,1109,584],{"class":489},[479,1111,1112,1115,1118,1121,1124],{"class":481,"line":533},[479,1113,1114],{"class":485},"  const",[479,1116,1117],{"class":674}," config",[479,1119,1120],{"class":485}," =",[479,1122,1123],{"class":519}," useRuntimeConfig",[479,1125,1126],{"class":489},"();\n",[479,1128,1129,1131,1134],{"class":481,"line":758},[479,1130,589],{"class":485},[479,1132,1133],{"class":489}," { token: config.apiToken }; ",[479,1135,1136],{"class":529},"\u002F\u002F Typed as string\n",[479,1138,1139],{"class":481,"line":1034},[479,1140,536],{"class":489},[648,1142,1144,1147],{"id":1143},"typescript-config-options",[455,1145,1146],{},"typescript"," config options",[791,1149,1150,1163],{},[794,1151,1152],{},[797,1153,1154,1157,1160],{},[800,1155,1156],{},"Option",[800,1158,1159],{},"Default",[800,1161,1162],{},"Description",[807,1164,1165,1178,1195,1212,1229,1244],{},[797,1166,1167,1171,1175],{},[812,1168,1169],{},[455,1170,692],{},[812,1172,1173],{},[455,1174,1046],{},[812,1176,1177],{},"Enable strict type checking in the generated tsconfig.",[797,1179,1180,1184,1189],{},[812,1181,1182],{},[455,1183,845],{},[812,1185,1186],{},[455,1187,1188],{},"false",[812,1190,1191,1192,775],{},"Generate types for ",[769,1193,1194],{"href":842},"runtime config",[797,1196,1197,1202,1206],{},[812,1198,1199],{},[455,1200,1201],{},"generateTsConfig",[812,1203,1204],{},[455,1205,1188],{},[812,1207,1208,1209,1211],{},"Write a full ",[455,1210,653],{}," into the generated types directory.",[797,1213,1214,1219,1224],{},[812,1215,1216],{},[455,1217,1218],{},"tsConfig",[812,1220,1221],{},[455,1222,1223],{},"undefined",[812,1225,1226,1227,775],{},"Overrides merged into the generated tsconfig. Defaults to your project's root ",[455,1228,653],{},[797,1230,1231,1236,1241],{},[812,1232,1233],{},[455,1234,1235],{},"generatedTypesDir",[812,1237,1238],{},[455,1239,1240],{},"\"node_modules\u002F.nitro\u002Ftypes\"",[812,1242,1243],{},"Directory where generated types are written.",[797,1245,1246,1251,1256],{},[812,1247,1248],{},[455,1249,1250],{},"tsconfigPath",[812,1252,1253],{},[455,1254,1255],{},"\"tsconfig.json\"",[812,1257,1258,1259,775],{},"Path of the generated tsconfig, relative to ",[455,1260,1235],{},[451,1262,1263,1264,1267,1268,1270,1271,1273,1274,624],{},"With ",[455,1265,1266],{},"generateTsConfig: true",", Nitro writes a complete ",[455,1269,653],{}," to the generated types directory — already wired to the generated declarations, your project files, and any ",[455,1272,1218],{}," overrides. You can extend it instead of ",[455,1275,1276],{},"nitro\u002Ftsconfig",[470,1278,1280],{"className":660,"code":1279,"filename":653,"language":662,"meta":5,"style":5},"{\n  \"extends\": \".\u002Fnode_modules\u002F.nitro\u002Ftypes\u002Ftsconfig.json\"\n}\n",[455,1281,1282,1286,1295],{"__ignoreMap":5},[479,1283,1284],{"class":481,"line":482},[479,1285,669],{"class":489},[479,1287,1288,1290,1292],{"class":481,"line":503},[479,1289,675],{"class":674},[479,1291,678],{"class":489},[479,1293,1294],{"class":496},"\".\u002Fnode_modules\u002F.nitro\u002Ftypes\u002Ftsconfig.json\"\n",[479,1296,1297],{"class":481,"line":510},[479,1298,686],{"class":489},[648,1300,1301],{"id":860},"Auto-imports",[451,1303,1304,1305,1309,1310,1314],{},"Auto-imports are ",[1306,1307,1308],"strong",{},"disabled by default"," in Nitro v3 — explicit imports are recommended for better ecosystem compatibility and clarity. See the ",[769,1311,1313],{"href":1312},"\u002Fdocs\u002Fmigration#auto-imports-are-disabled-by-default","migration guide"," for the list of utilities and where to import them from.",[451,1316,1317,1318,1321],{},"If you prefer auto-imports, opt in by setting the ",[455,1319,1320],{},"imports"," option (an object enables them):",[470,1323,1325],{"className":472,"code":1324,"filename":474,"language":475,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  serverDir: true,\n  imports: {},\n});\n",[455,1326,1327,1339,1343,1353,1362,1367],{"__ignoreMap":5},[479,1328,1329,1331,1333,1335,1337],{"class":481,"line":482},[479,1330,486],{"class":485},[479,1332,490],{"class":489},[479,1334,493],{"class":485},[479,1336,497],{"class":496},[479,1338,500],{"class":489},[479,1340,1341],{"class":481,"line":503},[479,1342,507],{"emptyLinePlaceholder":506},[479,1344,1345,1347,1349,1351],{"class":481,"line":510},[479,1346,513],{"class":485},[479,1348,516],{"class":485},[479,1350,520],{"class":519},[479,1352,523],{"class":489},[479,1354,1355,1358,1360],{"class":481,"line":526},[479,1356,1357],{"class":489},"  serverDir: ",[479,1359,1046],{"class":674},[479,1361,732],{"class":489},[479,1363,1364],{"class":481,"line":533},[479,1365,1366],{"class":489},"  imports: {},\n",[479,1368,1369],{"class":481,"line":758},[479,1370,536],{"class":489},[451,1372,1373,1374,1377,1378,1381,1382,1384,1385,1391,1392,612,1395,612,1398,1401],{},"When enabled, exports from the ",[455,1375,1376],{},"utils\u002F"," directory of scanned directories (for example ",[455,1379,1380],{},"server\u002Futils\u002F",") are automatically available in your server code without imports. The ",[455,1383,1320],{}," object accepts ",[769,1386,1390],{"href":1387,"rel":1388},"https:\u002F\u002Fgithub.com\u002Funjs\u002Funimport",[1389],"nofollow","unimport"," options (",[455,1393,1394],{},"dirs",[455,1396,1397],{},"presets",[455,1399,1400],{},"exclude",", ...) for further customization.",[451,1403,1404,1405,1407,1408,1412],{},"Type declarations for auto-imported utilities are written to ",[455,1406,853],{}," in the generated types directory — make sure it is referenced from your tsconfig as shown in ",[769,1409,1411],{"href":1410},"#generated-types","generated types"," so your editor recognizes the globals.",[648,1414,1416],{"id":1415},"extending-types-from-modules","Extending types from modules",[451,1418,1419,1421,1422,1425],{},[769,1420,73],{"href":74}," can hook into type generation with the ",[455,1423,1424],{},"types:extend"," build-time hook, which receives the collected types before the declaration files are written:",[470,1427,1429],{"className":472,"code":1428,"filename":474,"language":475,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  modules: [\n    (nitro) => {\n      nitro.hooks.hook(\"types:extend\", (types) => {\n        types.routes[\"\u002Fapi\u002Fexternal\"] = { default: [\"{ data: string }\"] };\n      });\n    },\n  ],\n});\n",[455,1430,1431,1443,1447,1457,1462,1476,1502,1525,1530,1535,1540],{"__ignoreMap":5},[479,1432,1433,1435,1437,1439,1441],{"class":481,"line":482},[479,1434,486],{"class":485},[479,1436,490],{"class":489},[479,1438,493],{"class":485},[479,1440,497],{"class":496},[479,1442,500],{"class":489},[479,1444,1445],{"class":481,"line":503},[479,1446,507],{"emptyLinePlaceholder":506},[479,1448,1449,1451,1453,1455],{"class":481,"line":510},[479,1450,513],{"class":485},[479,1452,516],{"class":485},[479,1454,520],{"class":519},[479,1456,523],{"class":489},[479,1458,1459],{"class":481,"line":526},[479,1460,1461],{"class":489},"  modules: [\n",[479,1463,1464,1467,1470,1472,1474],{"class":481,"line":533},[479,1465,1466],{"class":489},"    (",[479,1468,1469],{"class":574},"nitro",[479,1471,578],{"class":489},[479,1473,581],{"class":485},[479,1475,584],{"class":489},[479,1477,1478,1481,1484,1487,1490,1493,1496,1498,1500],{"class":481,"line":758},[479,1479,1480],{"class":489},"      nitro.hooks.",[479,1482,1483],{"class":519},"hook",[479,1485,1486],{"class":489},"(",[479,1488,1489],{"class":496},"\"types:extend\"",[479,1491,1492],{"class":489},", (",[479,1494,1495],{"class":574},"types",[479,1497,578],{"class":489},[479,1499,581],{"class":485},[479,1501,584],{"class":489},[479,1503,1504,1507,1510,1513,1516,1519,1522],{"class":481,"line":1034},[479,1505,1506],{"class":489},"        types.routes[",[479,1508,1509],{"class":496},"\"\u002Fapi\u002Fexternal\"",[479,1511,1512],{"class":489},"] ",[479,1514,1515],{"class":485},"=",[479,1517,1518],{"class":489}," { default: [",[479,1520,1521],{"class":496},"\"{ data: string }\"",[479,1523,1524],{"class":489},"] };\n",[479,1526,1527],{"class":481,"line":1040},[479,1528,1529],{"class":489},"      });\n",[479,1531,1532],{"class":481,"line":1051},[479,1533,1534],{"class":489},"    },\n",[479,1536,1537],{"class":481,"line":1056},[479,1538,1539],{"class":489},"  ],\n",[479,1541,1543],{"class":481,"line":1542},11,[479,1544,536],{"class":489},[451,1546,1547,1548,1550,1551,1554,1555,1557,1558,1561],{},"The ",[455,1549,1495],{}," object contains the per-route type expressions (",[455,1552,1553],{},"types.routes",") and, when ",[455,1556,1201],{}," is enabled, the generated tsconfig (",[455,1559,1560],{},"types.tsConfig",").",[1563,1564,1565],"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 .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 .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":5,"searchDepth":503,"depth":503,"links":1567},[1568,1570,1574,1576,1577],{"id":650,"depth":503,"text":1569},"tsconfig.json setup",{"id":763,"depth":503,"text":764,"children":1571},[1572,1573],{"id":931,"depth":510,"text":932},{"id":956,"depth":510,"text":957},{"id":1143,"depth":503,"text":1575},"typescript config options",{"id":860,"depth":503,"text":1301},{"id":1415,"depth":503,"text":1416},"Nitro is TypeScript-first: write your config, handlers, and server code in TypeScript with zero setup.","md",{"icon":101},{"title":98,"icon":101},{"title":98,"description":1578},"LeAkpVCjAGIiRer5gwQFOJyclL9rtBtHULIP0oHjG_M",[1585,1587],{"title":93,"path":94,"stem":95,"description":1586,"icon":96,"children":-1},"A reference of everything you can import from nitro and its subpaths in your server code.",{"title":103,"path":104,"stem":105,"description":1588,"icon":106,"children":-1},"Nitro provides a caching system built on top of the storage layer, powered by ocache.",1784019071999]