[{"data":1,"prerenderedAt":883},["ShallowReactive",2],{"navigation":3,"-deploy-custom-presets":234,"-deploy-custom-presets-surround":878},[4,81,228],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Getting Started","/guide","1.guide/0.index",[9,11,16,21,26,31,36,41,46,51,56,61,66,71,76],{"title":5,"path":6,"stem":7,"icon":10},"ph:book-open-duotone",{"title":12,"path":13,"stem":14,"icon":15},"Migration Guide","/guide/migration","1.guide/00.migration","ri:arrow-right-up-line",{"title":17,"path":18,"stem":19,"icon":20},"Server Utils","/guide/utils","1.guide/1.utils","ri:tools-line",{"title":22,"path":23,"stem":24,"icon":25},"Tasks","/guide/tasks","1.guide/10.tasks","codicon:run-all",{"title":27,"path":28,"stem":29,"icon":30},"Server Routes","/guide/routing","1.guide/2.routing","ri:direction-line",{"title":32,"path":33,"stem":34,"icon":35},"WebSocket","/guide/websocket","1.guide/3.websocket","cib:socket-io",{"title":37,"path":38,"stem":39,"icon":40},"KV Storage","/guide/storage","1.guide/4.storage","carbon:datastore",{"title":42,"path":43,"stem":44,"icon":45},"SQL Database","/guide/database","1.guide/5.database","ri:database-2-line",{"title":47,"path":48,"stem":49,"icon":50},"Cache","/guide/cache","1.guide/6.cache","ri:speed-line",{"title":52,"path":53,"stem":54,"icon":55},"Fetch","/guide/fetch","1.guide/7.fetch","ri:global-line",{"title":57,"path":58,"stem":59,"icon":60},"Assets","/guide/assets","1.guide/8.assets","ri:image-2-line",{"title":62,"path":63,"stem":64,"icon":65},"Plugins","/guide/plugins","1.guide/9.plugins","ri:plug-line",{"title":67,"path":68,"stem":69,"icon":70},"Configuration","/guide/configuration","1.guide/97.configuration","ri:settings-3-line",{"title":72,"path":73,"stem":74,"icon":75},"TypeScript","/guide/typescript","1.guide/98.typescript","tabler:brand-typescript",{"title":77,"path":78,"stem":79,"icon":80},"Nightly Channel","/guide/nightly","1.guide/99.nightly","ri:moon-fill",{"title":82,"path":83,"stem":84,"children":85,"icon":87},"Overview","/deploy","2.deploy/0.index",[86,88,92,122,127],{"title":82,"path":83,"stem":84,"icon":87},"ri:upload-cloud-2-line",{"title":89,"path":90,"stem":91,"icon":55},"Edge Workers","/deploy/workers","2.deploy/1.workers",{"title":93,"path":94,"stem":95,"children":96,"page":121},"Runtimes","/deploy/runtimes","2.deploy/10.runtimes",[97,102,106,111,116],{"title":98,"path":99,"stem":100,"icon":101},"Node.js","/deploy/runtimes/node","2.deploy/10.runtimes/1.node","akar-icons:node-fill",{"title":103,"path":104,"stem":105,"icon":25},"Dir","/deploy/runtimes/_dir","2.deploy/10.runtimes/_dir",{"title":107,"path":108,"stem":109,"icon":110},"WinterJS","/deploy/runtimes/_winterjs","2.deploy/10.runtimes/_winterjs","game-icons:cold-heart",{"title":112,"path":113,"stem":114,"icon":115},"Bun","/deploy/runtimes/bun","2.deploy/10.runtimes/bun","simple-icons:bun",{"title":117,"path":118,"stem":119,"icon":120},"Deno","/deploy/runtimes/deno","2.deploy/10.runtimes/deno","simple-icons:deno",false,{"title":123,"path":124,"stem":125,"icon":126},"Custom Preset","/deploy/custom-presets","2.deploy/2.custom-presets","ri:file-code-line",{"title":128,"path":129,"stem":130,"children":131,"page":121},"Providers","/deploy/providers","2.deploy/20.providers",[132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224],{"title":103,"path":133,"stem":134,"icon":135},"/deploy/providers/_dir","2.deploy/20.providers/_dir","tdesign:cloud",{"title":137,"path":138,"stem":139},"Alwaysdata","/deploy/providers/alwaysdata","2.deploy/20.providers/alwaysdata",{"title":141,"path":142,"stem":143},"AWS Lambda","/deploy/providers/aws","2.deploy/20.providers/aws",{"title":145,"path":146,"stem":147},"AWS Amplify","/deploy/providers/aws-amplify","2.deploy/20.providers/aws-amplify",{"title":149,"path":150,"stem":151},"Azure","/deploy/providers/azure","2.deploy/20.providers/azure",{"title":153,"path":154,"stem":155},"Cleavr","/deploy/providers/cleavr","2.deploy/20.providers/cleavr",{"title":157,"path":158,"stem":159},"Cloudflare","/deploy/providers/cloudflare","2.deploy/20.providers/cloudflare",{"title":161,"path":162,"stem":163},"Deno Deploy","/deploy/providers/deno-deploy","2.deploy/20.providers/deno-deploy",{"title":165,"path":166,"stem":167},"DigitalOcean","/deploy/providers/digitalocean","2.deploy/20.providers/digitalocean",{"title":169,"path":170,"stem":171},"Firebase","/deploy/providers/firebase","2.deploy/20.providers/firebase",{"title":173,"path":174,"stem":175},"Flightcontrol","/deploy/providers/flightcontrol","2.deploy/20.providers/flightcontrol",{"title":177,"path":178,"stem":179},"Genezio","/deploy/providers/genezio","2.deploy/20.providers/genezio",{"title":181,"path":182,"stem":183},"GitHub Pages","/deploy/providers/github-pages","2.deploy/20.providers/github-pages",{"title":185,"path":186,"stem":187},"GitLab Pages","/deploy/providers/gitlab-pages","2.deploy/20.providers/gitlab-pages",{"title":189,"path":190,"stem":191},"Heroku","/deploy/providers/heroku","2.deploy/20.providers/heroku",{"title":193,"path":194,"stem":195},"IIS","/deploy/providers/iis","2.deploy/20.providers/iis",{"title":197,"path":198,"stem":199},"Koyeb","/deploy/providers/koyeb","2.deploy/20.providers/koyeb",{"title":201,"path":202,"stem":203},"Netlify","/deploy/providers/netlify","2.deploy/20.providers/netlify",{"title":205,"path":206,"stem":207},"Platform.sh","/deploy/providers/platform-sh","2.deploy/20.providers/platform-sh",{"title":209,"path":210,"stem":211},"Render.com","/deploy/providers/render","2.deploy/20.providers/render",{"title":213,"path":214,"stem":215},"StormKit","/deploy/providers/stormkit","2.deploy/20.providers/stormkit",{"title":217,"path":218,"stem":219},"Vercel","/deploy/providers/vercel","2.deploy/20.providers/vercel",{"title":221,"path":222,"stem":223},"Zeabur","/deploy/providers/zeabur","2.deploy/20.providers/zeabur",{"title":225,"path":226,"stem":227},"Zerops","/deploy/providers/zerops","2.deploy/20.providers/zerops",{"title":229,"path":230,"stem":231,"children":232,"icon":70},"Config","/config","3.config/0.index",[233],{"title":229,"path":230,"stem":231,"icon":70},{"id":235,"title":123,"body":236,"description":872,"extension":873,"meta":874,"navigation":875,"path":124,"seo":876,"stem":125,"__hash__":877},"content/2.deploy/2.custom-presets.md",{"type":237,"value":238,"toc":869,"icon":126},"minimark",[239,243,249,254,268,275,437,440,780,783,856,865],[240,241,242],"p",{},"Custom presets are local files that have a preset entry that defines builder configuration and a runtime entry point.",[244,245,246],"warning",{},[240,247,248],{},"Custom local preset support is an experimental feature.",[250,251,253],"h2",{"id":252},"example","Example",[255,256,257],"note",{},[240,258,259,260,267],{},"Check ",[261,262,266],"a",{"href":263,"rel":264},"https://github.com/nitrojs/nitro-preset-starter",[265],"nofollow","nitrojs/nitro-preset-starter"," for a ready-to-use template.",[240,269,270,271],{},"First, we have to define our preset entry point in a local directory ",[272,273,274],"code",{},"preset/nitro.config.ts",[276,277,283],"pre",{"className":278,"code":279,"filename":280,"language":281,"meta":282,"style":282},"language-ts shiki shiki-themes github-light github-dark github-dark","import type { NitroPreset } from \"nitro\";\nimport { fileURLToPath } from \"node:url\"\n\nexport default \u003CNitroPreset>{\n  // extends: \"node-server\", // You can extend existing presets\n  entry: fileURLToPath(new URL(\"./entry.ts\", import.meta.url)),\n  hooks: {\n    compiled() {\n      // ...\n    },\n  },\n};\n","./preset/nitro.config.ts","ts","",[272,284,285,311,324,331,350,360,398,404,413,419,425,431],{"__ignoreMap":282},[286,287,290,294,297,301,304,308],"span",{"class":288,"line":289},"line",1,[286,291,293],{"class":292},"so5gQ","import",[286,295,296],{"class":292}," type",[286,298,300],{"class":299},"slsVL"," { NitroPreset } ",[286,302,303],{"class":292},"from",[286,305,307],{"class":306},"sfrk1"," \"nitro\"",[286,309,310],{"class":299},";\n",[286,312,314,316,319,321],{"class":288,"line":313},2,[286,315,293],{"class":292},[286,317,318],{"class":299}," { fileURLToPath } ",[286,320,303],{"class":292},[286,322,323],{"class":306}," \"node:url\"\n",[286,325,327],{"class":288,"line":326},3,[286,328,330],{"emptyLinePlaceholder":329},true,"\n",[286,332,334,337,340,343,347],{"class":288,"line":333},4,[286,335,336],{"class":292},"export",[286,338,339],{"class":292}," default",[286,341,342],{"class":299}," \u003C",[286,344,346],{"class":345},"shcOC","NitroPreset",[286,348,349],{"class":299},">{\n",[286,351,353,357],{"class":288,"line":352},5,[286,354,356],{"class":355},"sCsY4","  // extends: \"node-server\",",[286,358,359],{"class":355}," // You can extend existing presets\n",[286,361,363,366,369,372,375,378,380,383,386,388,391,395],{"class":288,"line":362},6,[286,364,365],{"class":299},"  entry: ",[286,367,368],{"class":345},"fileURLToPath",[286,370,371],{"class":299},"(",[286,373,374],{"class":292},"new",[286,376,377],{"class":345}," URL",[286,379,371],{"class":299},[286,381,382],{"class":306},"\"./entry.ts\"",[286,384,385],{"class":299},", ",[286,387,293],{"class":292},[286,389,390],{"class":299},".",[286,392,394],{"class":393},"suiK_","meta",[286,396,397],{"class":299},".url)),\n",[286,399,401],{"class":288,"line":400},7,[286,402,403],{"class":299},"  hooks: {\n",[286,405,407,410],{"class":288,"line":406},8,[286,408,409],{"class":345},"    compiled",[286,411,412],{"class":299},"() {\n",[286,414,416],{"class":288,"line":415},9,[286,417,418],{"class":355},"      // ...\n",[286,420,422],{"class":288,"line":421},10,[286,423,424],{"class":299},"    },\n",[286,426,428],{"class":288,"line":427},11,[286,429,430],{"class":299},"  },\n",[286,432,434],{"class":288,"line":433},12,[286,435,436],{"class":299},"};\n",[240,438,439],{},"The entry point will be used by your server or provider, and you can fully customize its behavior.",[441,442,443,604],"code-group",{},[276,444,447],{"className":278,"code":445,"filename":446,"language":281,"meta":282,"style":282},"import \"#internal/nitro/virtual/polyfill\";\n\nconst nitroApp = useNitroApp();\n\nexport default {\n  fetch(request: Request) {\n    const url = new URL(request.url);\n    return nitroApp.localFetch(url.pathname + url.search, {\n      context: {},\n      host: url.hostname,\n      protocol: url.protocol,\n      method: request.method,\n      headers: request.headers,\n      body: undefined,\n    });\n  },\n};\n","preset/entry.ts (Workers)",[272,448,449,458,462,479,483,492,512,530,550,555,560,565,570,576,588,594,599],{"__ignoreMap":282},[286,450,451,453,456],{"class":288,"line":289},[286,452,293],{"class":292},[286,454,455],{"class":306}," \"#internal/nitro/virtual/polyfill\"",[286,457,310],{"class":299},[286,459,460],{"class":288,"line":313},[286,461,330],{"emptyLinePlaceholder":329},[286,463,464,467,470,473,476],{"class":288,"line":326},[286,465,466],{"class":292},"const",[286,468,469],{"class":393}," nitroApp",[286,471,472],{"class":292}," =",[286,474,475],{"class":345}," useNitroApp",[286,477,478],{"class":299},"();\n",[286,480,481],{"class":288,"line":333},[286,482,330],{"emptyLinePlaceholder":329},[286,484,485,487,489],{"class":288,"line":352},[286,486,336],{"class":292},[286,488,339],{"class":292},[286,490,491],{"class":299}," {\n",[286,493,494,497,499,503,506,509],{"class":288,"line":362},[286,495,496],{"class":345},"  fetch",[286,498,371],{"class":299},[286,500,502],{"class":501},"sQHwn","request",[286,504,505],{"class":292},":",[286,507,508],{"class":345}," Request",[286,510,511],{"class":299},") {\n",[286,513,514,517,520,522,525,527],{"class":288,"line":400},[286,515,516],{"class":292},"    const",[286,518,519],{"class":393}," url",[286,521,472],{"class":292},[286,523,524],{"class":292}," new",[286,526,377],{"class":345},[286,528,529],{"class":299},"(request.url);\n",[286,531,532,535,538,541,544,547],{"class":288,"line":406},[286,533,534],{"class":292},"    return",[286,536,537],{"class":299}," nitroApp.",[286,539,540],{"class":345},"localFetch",[286,542,543],{"class":299},"(url.pathname ",[286,545,546],{"class":292},"+",[286,548,549],{"class":299}," url.search, {\n",[286,551,552],{"class":288,"line":415},[286,553,554],{"class":299},"      context: {},\n",[286,556,557],{"class":288,"line":421},[286,558,559],{"class":299},"      host: url.hostname,\n",[286,561,562],{"class":288,"line":427},[286,563,564],{"class":299},"      protocol: url.protocol,\n",[286,566,567],{"class":288,"line":433},[286,568,569],{"class":299},"      method: request.method,\n",[286,571,573],{"class":288,"line":572},13,[286,574,575],{"class":299},"      headers: request.headers,\n",[286,577,579,582,585],{"class":288,"line":578},14,[286,580,581],{"class":299},"      body: ",[286,583,584],{"class":393},"undefined",[286,586,587],{"class":299},",\n",[286,589,591],{"class":288,"line":590},15,[286,592,593],{"class":299},"    });\n",[286,595,597],{"class":288,"line":596},16,[286,598,430],{"class":299},[286,600,602],{"class":288,"line":601},17,[286,603,436],{"class":299},[276,605,608],{"className":278,"code":606,"filename":607,"language":281,"meta":282,"style":282},"import \"#internal/nitro/virtual/polyfill\";\nimport { Server } from \"node:http\";\nimport { toNodeListener } from \"h3\";\n\nconst nitroApp = useNitroApp();\nconst server = new Server(toNodeListener(nitroApp.h3App));\n\n// @ts-ignore\nserver.listen(3000, (err) => {\n  if (err) {\n    console.error(err);\n    process.exit(1);\n  }\n  console.log(`Listening on http://localhost:3000 (custom preset)`);\n});\n","preset/entry.ts (Node.js)",[272,609,610,618,632,646,650,662,684,688,693,720,728,739,755,760,775],{"__ignoreMap":282},[286,611,612,614,616],{"class":288,"line":289},[286,613,293],{"class":292},[286,615,455],{"class":306},[286,617,310],{"class":299},[286,619,620,622,625,627,630],{"class":288,"line":313},[286,621,293],{"class":292},[286,623,624],{"class":299}," { Server } ",[286,626,303],{"class":292},[286,628,629],{"class":306}," \"node:http\"",[286,631,310],{"class":299},[286,633,634,636,639,641,644],{"class":288,"line":326},[286,635,293],{"class":292},[286,637,638],{"class":299}," { toNodeListener } ",[286,640,303],{"class":292},[286,642,643],{"class":306}," \"h3\"",[286,645,310],{"class":299},[286,647,648],{"class":288,"line":333},[286,649,330],{"emptyLinePlaceholder":329},[286,651,652,654,656,658,660],{"class":288,"line":352},[286,653,466],{"class":292},[286,655,469],{"class":393},[286,657,472],{"class":292},[286,659,475],{"class":345},[286,661,478],{"class":299},[286,663,664,666,669,671,673,676,678,681],{"class":288,"line":362},[286,665,466],{"class":292},[286,667,668],{"class":393}," server",[286,670,472],{"class":292},[286,672,524],{"class":292},[286,674,675],{"class":345}," Server",[286,677,371],{"class":299},[286,679,680],{"class":345},"toNodeListener",[286,682,683],{"class":299},"(nitroApp.h3App));\n",[286,685,686],{"class":288,"line":400},[286,687,330],{"emptyLinePlaceholder":329},[286,689,690],{"class":288,"line":406},[286,691,692],{"class":355},"// @ts-ignore\n",[286,694,695,698,701,703,706,709,712,715,718],{"class":288,"line":415},[286,696,697],{"class":299},"server.",[286,699,700],{"class":345},"listen",[286,702,371],{"class":299},[286,704,705],{"class":393},"3000",[286,707,708],{"class":299},", (",[286,710,711],{"class":501},"err",[286,713,714],{"class":299},") ",[286,716,717],{"class":292},"=>",[286,719,491],{"class":299},[286,721,722,725],{"class":288,"line":421},[286,723,724],{"class":292},"  if",[286,726,727],{"class":299}," (err) {\n",[286,729,730,733,736],{"class":288,"line":427},[286,731,732],{"class":299},"    console.",[286,734,735],{"class":345},"error",[286,737,738],{"class":299},"(err);\n",[286,740,741,744,747,749,752],{"class":288,"line":433},[286,742,743],{"class":299},"    process.",[286,745,746],{"class":345},"exit",[286,748,371],{"class":299},[286,750,751],{"class":393},"1",[286,753,754],{"class":299},");\n",[286,756,757],{"class":288,"line":572},[286,758,759],{"class":299},"  }\n",[286,761,762,765,768,770,773],{"class":288,"line":578},[286,763,764],{"class":299},"  console.",[286,766,767],{"class":345},"log",[286,769,371],{"class":299},[286,771,772],{"class":306},"`Listening on http://localhost:3000 (custom preset)`",[286,774,754],{"class":299},[286,776,777],{"class":288,"line":590},[286,778,779],{"class":299},"});\n",[240,781,782],{},"Then in your nitro config file, you can use your custom preset.",[441,784,785,817],{},[276,786,789],{"className":278,"code":787,"filename":788,"language":281,"meta":282,"style":282},"export default defineNitroConfig({\n  preset: \"./preset\",\n});\n","nitro.config.ts",[272,790,791,803,813],{"__ignoreMap":282},[286,792,793,795,797,800],{"class":288,"line":289},[286,794,336],{"class":292},[286,796,339],{"class":292},[286,798,799],{"class":345}," defineNitroConfig",[286,801,802],{"class":299},"({\n",[286,804,805,808,811],{"class":288,"line":313},[286,806,807],{"class":299},"  preset: ",[286,809,810],{"class":306},"\"./preset\"",[286,812,587],{"class":299},[286,814,815],{"class":288,"line":326},[286,816,779],{"class":299},[276,818,821],{"className":278,"code":819,"filename":820,"language":281,"meta":282,"style":282},"export default defineNuxtConfig({\n  nitro: {\n    preset: \"./preset\",\n  }\n});\n","nuxt.config.ts",[272,822,823,834,839,848,852],{"__ignoreMap":282},[286,824,825,827,829,832],{"class":288,"line":289},[286,826,336],{"class":292},[286,828,339],{"class":292},[286,830,831],{"class":345}," defineNuxtConfig",[286,833,802],{"class":299},[286,835,836],{"class":288,"line":313},[286,837,838],{"class":299},"  nitro: {\n",[286,840,841,844,846],{"class":288,"line":326},[286,842,843],{"class":299},"    preset: ",[286,845,810],{"class":306},[286,847,587],{"class":299},[286,849,850],{"class":288,"line":333},[286,851,759],{"class":299},[286,853,854],{"class":288,"line":352},[286,855,779],{"class":299},[240,857,858,859,864],{},"Refer to the Nitro ",[261,860,863],{"href":861,"rel":862},"https://github.com/nitrojs/nitro/tree/main/src",[265],"source code"," directly to have a better understanding of presets and entry points.",[866,867,868],"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}",{"title":282,"searchDepth":313,"depth":313,"links":870},[871],{"id":252,"depth":313,"text":253},"If you want to use a provider that Nitro doesn't support, or want to modify an existing one, you can create a local custom preset in your project.","md",{"icon":126,"aside":121},{"icon":126},{"title":123,"description":872},"Horh6nfoNfWri9wew7DPP7_j18ORGhbH3K_vw13HTQI",[879,881],{"title":117,"path":118,"stem":119,"description":880,"icon":120,"children":-1},"Run Nitro apps with Deno runtime.",{"title":103,"path":133,"stem":134,"description":882,"icon":135,"children":-1},null,1778145698721]