[{"data":1,"prerenderedAt":2225},["ShallowReactive",2],{"navigation":3,"-deploy-providers-vercel":407,"-deploy-providers-vercel-surround":2220},[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":211,"body":409,"description":2214,"extension":2215,"meta":2216,"navigation":2217,"path":212,"seo":2218,"stem":213,"__hash__":2219},"content\u002F2.deploy\u002F20.providers\u002Fvercel.md",{"type":410,"value":411,"toc":2188},"minimark",[412,424,429,441,446,449,482,490,495,503,507,514,522,526,529,545,614,624,666,670,690,698,860,877,881,894,949,953,960,983,987,993,1032,1044,1048,1052,1069,1166,1170,1174,1188,1192,1195,1206,1319,1323,1334,1464,1468,1474,1602,1606,1612,1735,1739,1761,1768,1772,1787,1791,1801,1812,1823,1873,1878,1891,1917,1921,1924,1927,2019,2023,2026,2033,2111,2184],[413,414,415,419,420],"p",{},[416,417,418],"strong",{},"Preset:"," ",[421,422,423],"code",{},"vercel",[425,426],"read-more",{"title":427,"to":428},"Vercel Framework Support","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fframeworks",[430,431,432],"note",{},[413,433,434,435,440],{},"Integration with this provider is possible with ",[436,437,439],"a",{"href":438},"\u002Fdeploy\u002F#zero-config-providers","zero configuration",".",[442,443,445],"h2",{"id":444},"getting-started","Getting started",[413,447,448],{},"Deploying to Vercel comes with the following features:",[450,451,452,461,468,475],"ul",{},[453,454,455],"li",{},[436,456,460],{"href":457,"rel":458},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fdeployments\u002Fenvironments",[459],"nofollow","Preview deployments",[453,462,463],{},[436,464,467],{"href":465,"rel":466},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Ffluid-compute",[459],"Fluid compute",[453,469,470],{},[436,471,474],{"href":472,"rel":473},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fobservability",[459],"Observability",[453,476,477],{},[436,478,481],{"href":479,"rel":480},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fvercel-firewall",[459],"Vercel Firewall",[413,483,484,485,440],{},"And much more. Learn more in ",[436,486,489],{"href":487,"rel":488},"https:\u002F\u002Fvercel.com\u002Fdocs",[459],"the Vercel documentation",[491,492,494],"h3",{"id":493},"deploy-with-git","Deploy with Git",[413,496,497,498,440],{},"Vercel supports Nitro with zero-configuration. ",[436,499,502],{"href":500,"rel":501},"https:\u002F\u002Fvercel.com\u002Fnew\u002Fclone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fvercel%2Ftree%2Fmain%2Fexamples%2Fnitro",[459],"Deploy Nitro to Vercel now",[442,504,506],{"id":505},"api-routes","API routes",[413,508,509,510,513],{},"Nitro ",[421,511,512],{},"\u002Fapi"," directory isn't compatible with Vercel. Instead, you should use:",[450,515,516],{},[453,517,518,521],{},[421,519,520],{},"routes\u002Fapi\u002F"," for standalone usage",[442,523,525],{"id":524},"bun-runtime","Bun runtime",[425,527],{"title":211,"to":528},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Ffunctions\u002Fruntimes\u002Fbun",[413,530,531,532,536,537,540,541,544],{},"You can use ",[436,533,111],{"href":534,"rel":535},"https:\u002F\u002Fbun.com",[459]," instead of Node.js by specifying the runtime using the ",[421,538,539],{},"vercel.functions"," key inside ",[421,542,543],{},"nitro.config",":",[546,547,552],"pre",{"className":548,"code":549,"filename":550,"language":551,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","export default defineConfig({\n  vercel: {\n    functions: {\n      runtime: \"bun1.x\"\n    }\n  }\n})\n","nitro.config.ts","ts",[421,553,554,574,580,586,596,602,608],{"__ignoreMap":5},[555,556,559,563,566,570],"span",{"class":557,"line":558},"line",1,[555,560,562],{"class":561},"so5gQ","export",[555,564,565],{"class":561}," default",[555,567,569],{"class":568},"shcOC"," defineConfig",[555,571,573],{"class":572},"slsVL","({\n",[555,575,577],{"class":557,"line":576},2,[555,578,579],{"class":572},"  vercel: {\n",[555,581,583],{"class":557,"line":582},3,[555,584,585],{"class":572},"    functions: {\n",[555,587,589,592],{"class":557,"line":588},4,[555,590,591],{"class":572},"      runtime: ",[555,593,595],{"class":594},"sfrk1","\"bun1.x\"\n",[555,597,599],{"class":557,"line":598},5,[555,600,601],{"class":572},"    }\n",[555,603,605],{"class":557,"line":604},6,[555,606,607],{"class":572},"  }\n",[555,609,611],{"class":557,"line":610},7,[555,612,613],{"class":572},"})\n",[413,615,616,617,620,621,544],{},"Alternatively, Nitro also detects Bun automatically if you specify a ",[421,618,619],{},"bunVersion"," property in your ",[421,622,623],{},"vercel.json",[546,625,629],{"className":626,"code":627,"filename":623,"language":628,"meta":5,"style":5},"language-json shiki shiki-themes github-light github-dark github-dark","{\n  \"$schema\": \"https:\u002F\u002Fopenapi.vercel.sh\u002Fvercel.json\",\n  \"bunVersion\": \"1.x\"\n}\n","json",[421,630,631,636,651,661],{"__ignoreMap":5},[555,632,633],{"class":557,"line":558},[555,634,635],{"class":572},"{\n",[555,637,638,642,645,648],{"class":557,"line":576},[555,639,641],{"class":640},"suiK_","  \"$schema\"",[555,643,644],{"class":572},": ",[555,646,647],{"class":594},"\"https:\u002F\u002Fopenapi.vercel.sh\u002Fvercel.json\"",[555,649,650],{"class":572},",\n",[555,652,653,656,658],{"class":557,"line":582},[555,654,655],{"class":640},"  \"bunVersion\"",[555,657,644],{"class":572},[555,659,660],{"class":594},"\"1.x\"\n",[555,662,663],{"class":557,"line":588},[555,664,665],{"class":572},"}\n",[442,667,669],{"id":668},"per-route-function-configuration","Per-route function configuration",[413,671,672,673,676,677,682,683,685,686,689],{},"Use ",[421,674,675],{},"vercel.functionRules"," to override ",[436,678,681],{"href":679,"rel":680},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fbuild-output-api\u002Fprimitives#serverless-function-configuration",[459],"serverless function settings"," for specific routes. Each key is a route pattern and its value is a partial function configuration object that gets merged with the base ",[421,684,539],{}," config. Note: array properties (e.g., ",[421,687,688],{},"regions",") from route config will replace the base config arrays rather than merging them.",[413,691,692,693,440],{},"This is useful when certain routes need different resource limits, regions, or features like ",[436,694,697],{"href":695,"rel":696},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fqueues",[459],"Vercel Queues triggers",[546,699,701],{"className":548,"code":700,"filename":550,"language":551,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  vercel: {\n    functionRules: {\n      \"\u002Fapi\u002Fheavy-computation\": {\n        maxDuration: 800,\n        memory: 4096,\n      },\n      \"\u002Fapi\u002Fregional\": {\n        regions: [\"lhr1\", \"cdg1\"],\n      },\n      \"\u002Fapi\u002Fqueues\u002Fprocess-order\": {\n        experimentalTriggers: [{ type: \"queue\u002Fv2beta\", topic: \"orders\" }],\n      },\n    },\n  },\n});\n",[421,702,703,720,726,736,740,745,753,763,774,780,788,806,811,819,837,842,848,854],{"__ignoreMap":5},[555,704,705,708,711,714,717],{"class":557,"line":558},[555,706,707],{"class":561},"import",[555,709,710],{"class":572}," { defineConfig } ",[555,712,713],{"class":561},"from",[555,715,716],{"class":594}," \"nitro\"",[555,718,719],{"class":572},";\n",[555,721,722],{"class":557,"line":576},[555,723,725],{"emptyLinePlaceholder":724},true,"\n",[555,727,728,730,732,734],{"class":557,"line":582},[555,729,562],{"class":561},[555,731,565],{"class":561},[555,733,569],{"class":568},[555,735,573],{"class":572},[555,737,738],{"class":557,"line":588},[555,739,579],{"class":572},[555,741,742],{"class":557,"line":598},[555,743,744],{"class":572},"    functionRules: {\n",[555,746,747,750],{"class":557,"line":604},[555,748,749],{"class":594},"      \"\u002Fapi\u002Fheavy-computation\"",[555,751,752],{"class":572},": {\n",[555,754,755,758,761],{"class":557,"line":610},[555,756,757],{"class":572},"        maxDuration: ",[555,759,760],{"class":640},"800",[555,762,650],{"class":572},[555,764,766,769,772],{"class":557,"line":765},8,[555,767,768],{"class":572},"        memory: ",[555,770,771],{"class":640},"4096",[555,773,650],{"class":572},[555,775,777],{"class":557,"line":776},9,[555,778,779],{"class":572},"      },\n",[555,781,783,786],{"class":557,"line":782},10,[555,784,785],{"class":594},"      \"\u002Fapi\u002Fregional\"",[555,787,752],{"class":572},[555,789,791,794,797,800,803],{"class":557,"line":790},11,[555,792,793],{"class":572},"        regions: [",[555,795,796],{"class":594},"\"lhr1\"",[555,798,799],{"class":572},", ",[555,801,802],{"class":594},"\"cdg1\"",[555,804,805],{"class":572},"],\n",[555,807,809],{"class":557,"line":808},12,[555,810,779],{"class":572},[555,812,814,817],{"class":557,"line":813},13,[555,815,816],{"class":594},"      \"\u002Fapi\u002Fqueues\u002Fprocess-order\"",[555,818,752],{"class":572},[555,820,822,825,828,831,834],{"class":557,"line":821},14,[555,823,824],{"class":572},"        experimentalTriggers: [{ type: ",[555,826,827],{"class":594},"\"queue\u002Fv2beta\"",[555,829,830],{"class":572},", topic: ",[555,832,833],{"class":594},"\"orders\"",[555,835,836],{"class":572}," }],\n",[555,838,840],{"class":557,"line":839},15,[555,841,779],{"class":572},[555,843,845],{"class":557,"line":844},16,[555,846,847],{"class":572},"    },\n",[555,849,851],{"class":557,"line":850},17,[555,852,853],{"class":572},"  },\n",[555,855,857],{"class":557,"line":856},18,[555,858,859],{"class":572},"});\n",[413,861,862,863,868,869,872,873,876],{},"Route patterns support wildcards via ",[436,864,867],{"href":865,"rel":866},"https:\u002F\u002Fgithub.com\u002Fh3js\u002Frou3",[459],"rou3"," matching (e.g., ",[421,870,871],{},"\u002Fapi\u002Fslow\u002F**"," matches all routes under ",[421,874,875],{},"\u002Fapi\u002Fslow\u002F",").",[442,878,880],{"id":879},"proxy-route-rules","Proxy route rules",[413,882,883,884,887,888,893],{},"Nitro automatically optimizes ",[421,885,886],{},"proxy"," route rules on Vercel by generating ",[436,889,892],{"href":890,"rel":891},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Frewrites",[459],"CDN-level rewrites"," at build time. This means matching requests are proxied at the edge without invoking a serverless function, reducing latency and cost.",[546,895,897],{"className":548,"code":896,"filename":550,"language":551,"meta":5,"style":5},"export default defineConfig({\n  routeRules: {\n    \u002F\u002F Proxied at CDN level — no function invocation\n    \"\u002Fapi\u002F**\": {\n      proxy: \"https:\u002F\u002Fapi.example.com\u002F**\",\n    },\n  },\n});\n",[421,898,899,909,914,920,927,937,941,945],{"__ignoreMap":5},[555,900,901,903,905,907],{"class":557,"line":558},[555,902,562],{"class":561},[555,904,565],{"class":561},[555,906,569],{"class":568},[555,908,573],{"class":572},[555,910,911],{"class":557,"line":576},[555,912,913],{"class":572},"  routeRules: {\n",[555,915,916],{"class":557,"line":582},[555,917,919],{"class":918},"sCsY4","    \u002F\u002F Proxied at CDN level — no function invocation\n",[555,921,922,925],{"class":557,"line":588},[555,923,924],{"class":594},"    \"\u002Fapi\u002F**\"",[555,926,752],{"class":572},[555,928,929,932,935],{"class":557,"line":598},[555,930,931],{"class":572},"      proxy: ",[555,933,934],{"class":594},"\"https:\u002F\u002Fapi.example.com\u002F**\"",[555,936,650],{"class":572},[555,938,939],{"class":557,"line":604},[555,940,847],{"class":572},[555,942,943],{"class":557,"line":610},[555,944,853],{"class":572},[555,946,947],{"class":557,"line":765},[555,948,859],{"class":572},[491,950,952],{"id":951},"when-cdn-rewrites-apply","When CDN rewrites apply",[413,954,955,956,959],{},"A proxy rule is offloaded to a Vercel CDN rewrite when ",[416,957,958],{},"all"," of the following are true:",[450,961,962,976],{},[453,963,964,965,968,969,972,973,876],{},"The target is an ",[416,966,967],{},"external URL"," (starts with ",[421,970,971],{},"http:\u002F\u002F"," or ",[421,974,975],{},"https:\u002F\u002F",[453,977,978,979,982],{},"No advanced ",[421,980,981],{},"ProxyOptions"," are set on the rule.",[491,984,986],{"id":985},"fallback-to-runtime-proxy","Fallback to runtime proxy",[413,988,989,990,992],{},"When the proxy rule uses any of the following ",[421,991,981],{},", Nitro keeps it as a runtime proxy handled by the serverless function:",[450,994,995,1001,1011,1017,1026],{},[453,996,997,1000],{},[421,998,999],{},"headers"," — custom headers on the outgoing request to the upstream",[453,1002,1003,1006,1007,1010],{},[421,1004,1005],{},"forwardHeaders"," \u002F ",[421,1008,1009],{},"filterHeaders"," — header filtering",[453,1012,1013,1016],{},[421,1014,1015],{},"fetchOptions"," — custom fetch options",[453,1018,1019,1006,1022,1025],{},[421,1020,1021],{},"cookieDomainRewrite",[421,1023,1024],{},"cookiePathRewrite"," — cookie manipulation",[453,1027,1028,1031],{},[421,1029,1030],{},"onResponse"," — response callback",[430,1033,1034],{},[413,1035,1036,1037,1039,1040,1043],{},"Response headers defined on the route rule via the ",[421,1038,999],{}," option are still applied to CDN-level rewrites. Only request-level ",[421,1041,1042],{},"ProxyOptions.headers"," (sent to the upstream) require a runtime proxy.",[442,1045,1047],{"id":1046},"scheduled-tasks-cron-jobs","Scheduled tasks (Cron Jobs)",[425,1049],{"title":1050,"to":1051},"Vercel Cron Jobs","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcron-jobs",[413,1053,1054,1055,1061,1062,1065,1066,1068],{},"Nitro automatically converts your ",[436,1056,1058],{"href":1057},"\u002Fdocs\u002Ftasks#scheduled-tasks",[421,1059,1060],{},"scheduledTasks"," configuration into ",[436,1063,1050],{"href":1051,"rel":1064},[459]," at build time. Define your schedules in your Nitro config and deploy - no manual ",[421,1067,623],{}," cron configuration required.",[546,1070,1072],{"className":548,"code":1071,"filename":550,"language":551,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  experimental: {\n    tasks: true\n  },\n  scheduledTasks: {\n    \u002F\u002F Run `cms:update` every hour\n    '0 * * * *': ['cms:update'],\n    \u002F\u002F Run `db:cleanup` every day at midnight\n    '0 0 * * *': ['db:cleanup']\n  }\n})\n",[421,1073,1074,1086,1090,1100,1105,1113,1117,1122,1127,1140,1145,1158,1162],{"__ignoreMap":5},[555,1075,1076,1078,1080,1082,1084],{"class":557,"line":558},[555,1077,707],{"class":561},[555,1079,710],{"class":572},[555,1081,713],{"class":561},[555,1083,716],{"class":594},[555,1085,719],{"class":572},[555,1087,1088],{"class":557,"line":576},[555,1089,725],{"emptyLinePlaceholder":724},[555,1091,1092,1094,1096,1098],{"class":557,"line":582},[555,1093,562],{"class":561},[555,1095,565],{"class":561},[555,1097,569],{"class":568},[555,1099,573],{"class":572},[555,1101,1102],{"class":557,"line":588},[555,1103,1104],{"class":572},"  experimental: {\n",[555,1106,1107,1110],{"class":557,"line":598},[555,1108,1109],{"class":572},"    tasks: ",[555,1111,1112],{"class":640},"true\n",[555,1114,1115],{"class":557,"line":604},[555,1116,853],{"class":572},[555,1118,1119],{"class":557,"line":610},[555,1120,1121],{"class":572},"  scheduledTasks: {\n",[555,1123,1124],{"class":557,"line":765},[555,1125,1126],{"class":918},"    \u002F\u002F Run `cms:update` every hour\n",[555,1128,1129,1132,1135,1138],{"class":557,"line":776},[555,1130,1131],{"class":594},"    '0 * * * *'",[555,1133,1134],{"class":572},": [",[555,1136,1137],{"class":594},"'cms:update'",[555,1139,805],{"class":572},[555,1141,1142],{"class":557,"line":782},[555,1143,1144],{"class":918},"    \u002F\u002F Run `db:cleanup` every day at midnight\n",[555,1146,1147,1150,1152,1155],{"class":557,"line":790},[555,1148,1149],{"class":594},"    '0 0 * * *'",[555,1151,1134],{"class":572},[555,1153,1154],{"class":594},"'db:cleanup'",[555,1156,1157],{"class":572},"]\n",[555,1159,1160],{"class":557,"line":808},[555,1161,607],{"class":572},[555,1163,1164],{"class":557,"line":813},[555,1165,613],{"class":572},[491,1167,1169],{"id":1168},"secure-cron-job-endpoints","Secure cron job endpoints",[425,1171],{"title":1172,"to":1173},"Securing cron jobs","https:\u002F\u002Fvercel.com\u002Fdocs\u002Fcron-jobs\u002Fmanage-cron-jobs#securing-cron-jobs",[413,1175,1176,1177,1180,1181,1183,1184,1187],{},"To prevent unauthorized access to the cron handler, set a ",[421,1178,1179],{},"CRON_SECRET"," environment variable in your Vercel project settings. When ",[421,1182,1179],{}," is set, Nitro validates the ",[421,1185,1186],{},"Authorization"," header on every cron invocation.",[442,1189,1191],{"id":1190},"queues","Queues",[425,1193],{"title":1194,"to":695},"Vercel Queues",[413,1196,1197,1198,1201,1202,1205],{},"Nitro integrates with ",[436,1199,1194],{"href":695,"rel":1200},[459]," to process messages asynchronously. Define your queue topics in the Nitro config and handle incoming messages with the ",[421,1203,1204],{},"vercel:queue"," runtime hook.",[546,1207,1209],{"className":548,"code":1208,"filename":550,"language":551,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  \u002F\u002F Standalone Nitro scans `serverDir` for routes and plugins\n  serverDir: \".\u002Fserver\",\n  vercel: {\n    queues: {\n      triggers: [\n        \u002F\u002F Only `topic` is required\n        { topic: \"notifications\" },\n        { topic: \"orders\", retryAfterSeconds: 60, initialDelaySeconds: 5 },\n      ],\n    },\n  },\n});\n",[421,1210,1211,1223,1227,1237,1242,1252,1256,1261,1266,1271,1282,1302,1307,1311,1315],{"__ignoreMap":5},[555,1212,1213,1215,1217,1219,1221],{"class":557,"line":558},[555,1214,707],{"class":561},[555,1216,710],{"class":572},[555,1218,713],{"class":561},[555,1220,716],{"class":594},[555,1222,719],{"class":572},[555,1224,1225],{"class":557,"line":576},[555,1226,725],{"emptyLinePlaceholder":724},[555,1228,1229,1231,1233,1235],{"class":557,"line":582},[555,1230,562],{"class":561},[555,1232,565],{"class":561},[555,1234,569],{"class":568},[555,1236,573],{"class":572},[555,1238,1239],{"class":557,"line":588},[555,1240,1241],{"class":918},"  \u002F\u002F Standalone Nitro scans `serverDir` for routes and plugins\n",[555,1243,1244,1247,1250],{"class":557,"line":598},[555,1245,1246],{"class":572},"  serverDir: ",[555,1248,1249],{"class":594},"\".\u002Fserver\"",[555,1251,650],{"class":572},[555,1253,1254],{"class":557,"line":604},[555,1255,579],{"class":572},[555,1257,1258],{"class":557,"line":610},[555,1259,1260],{"class":572},"    queues: {\n",[555,1262,1263],{"class":557,"line":765},[555,1264,1265],{"class":572},"      triggers: [\n",[555,1267,1268],{"class":557,"line":776},[555,1269,1270],{"class":918},"        \u002F\u002F Only `topic` is required\n",[555,1272,1273,1276,1279],{"class":557,"line":782},[555,1274,1275],{"class":572},"        { topic: ",[555,1277,1278],{"class":594},"\"notifications\"",[555,1280,1281],{"class":572}," },\n",[555,1283,1284,1286,1288,1291,1294,1297,1300],{"class":557,"line":790},[555,1285,1275],{"class":572},[555,1287,833],{"class":594},[555,1289,1290],{"class":572},", retryAfterSeconds: ",[555,1292,1293],{"class":640},"60",[555,1295,1296],{"class":572},", initialDelaySeconds: ",[555,1298,1299],{"class":640},"5",[555,1301,1281],{"class":572},[555,1303,1304],{"class":557,"line":808},[555,1305,1306],{"class":572},"      ],\n",[555,1308,1309],{"class":557,"line":813},[555,1310,847],{"class":572},[555,1312,1313],{"class":557,"line":821},[555,1314,853],{"class":572},[555,1316,1317],{"class":557,"line":839},[555,1318,859],{"class":572},[491,1320,1322],{"id":1321},"handling-messages","Handling messages",[413,1324,1325,1326,1328,1329,1333],{},"Use the ",[421,1327,1204],{}," hook in a ",[436,1330,1332],{"href":1331},"\u002Fguide\u002Fplugins","Nitro plugin"," to process incoming queue messages:",[546,1335,1338],{"className":548,"code":1336,"filename":1337,"language":551,"meta":5,"style":5},"import { definePlugin } from \"nitro\";\n\nexport default definePlugin((nitroApp) => {\n  nitroApp.hooks.hook(\"vercel:queue\", ({ message, metadata, send }) => {\n    console.log(`[${metadata.topicName}] Message ${metadata.messageId}:`, message);\n  });\n});\n","server\u002Fplugins\u002Fqueues.ts",[421,1339,1340,1353,1357,1382,1419,1455,1460],{"__ignoreMap":5},[555,1341,1342,1344,1347,1349,1351],{"class":557,"line":558},[555,1343,707],{"class":561},[555,1345,1346],{"class":572}," { definePlugin } ",[555,1348,713],{"class":561},[555,1350,716],{"class":594},[555,1352,719],{"class":572},[555,1354,1355],{"class":557,"line":576},[555,1356,725],{"emptyLinePlaceholder":724},[555,1358,1359,1361,1363,1366,1369,1373,1376,1379],{"class":557,"line":582},[555,1360,562],{"class":561},[555,1362,565],{"class":561},[555,1364,1365],{"class":568}," definePlugin",[555,1367,1368],{"class":572},"((",[555,1370,1372],{"class":1371},"sQHwn","nitroApp",[555,1374,1375],{"class":572},") ",[555,1377,1378],{"class":561},"=>",[555,1380,1381],{"class":572}," {\n",[555,1383,1384,1387,1390,1393,1396,1399,1402,1404,1407,1409,1412,1415,1417],{"class":557,"line":588},[555,1385,1386],{"class":572},"  nitroApp.hooks.",[555,1388,1389],{"class":568},"hook",[555,1391,1392],{"class":572},"(",[555,1394,1395],{"class":594},"\"vercel:queue\"",[555,1397,1398],{"class":572},", ({ ",[555,1400,1401],{"class":1371},"message",[555,1403,799],{"class":572},[555,1405,1406],{"class":1371},"metadata",[555,1408,799],{"class":572},[555,1410,1411],{"class":1371},"send",[555,1413,1414],{"class":572}," }) ",[555,1416,1378],{"class":561},[555,1418,1381],{"class":572},[555,1420,1421,1424,1427,1429,1432,1434,1436,1439,1442,1444,1446,1449,1452],{"class":557,"line":598},[555,1422,1423],{"class":572},"    console.",[555,1425,1426],{"class":568},"log",[555,1428,1392],{"class":572},[555,1430,1431],{"class":594},"`[${",[555,1433,1406],{"class":572},[555,1435,440],{"class":594},[555,1437,1438],{"class":572},"topicName",[555,1440,1441],{"class":594},"}] Message ${",[555,1443,1406],{"class":572},[555,1445,440],{"class":594},[555,1447,1448],{"class":572},"messageId",[555,1450,1451],{"class":594},"}:`",[555,1453,1454],{"class":572},", message);\n",[555,1456,1457],{"class":557,"line":604},[555,1458,1459],{"class":572},"  });\n",[555,1461,1462],{"class":557,"line":610},[555,1463,859],{"class":572},[491,1465,1467],{"id":1466},"running-tasks-from-queue-messages","Running tasks from queue messages",[413,1469,1470,1471,544],{},"You can use queue messages to trigger ",[436,1472,1473],{"href":59},"Nitro tasks",[546,1475,1477],{"className":548,"code":1476,"filename":1337,"language":551,"meta":5,"style":5},"import { definePlugin } from \"nitro\";\nimport { runTask } from \"nitro\u002Ftask\";\n\nexport default definePlugin((nitroApp) => {\n  nitroApp.hooks.hook(\"vercel:queue\", async ({ message, metadata }) => {\n    if (metadata.topicName === \"orders\") {\n      await runTask(\"orders:fulfill\", { payload: message });\n    }\n  });\n});\n",[421,1478,1479,1491,1505,1509,1527,1557,1574,1590,1594,1598],{"__ignoreMap":5},[555,1480,1481,1483,1485,1487,1489],{"class":557,"line":558},[555,1482,707],{"class":561},[555,1484,1346],{"class":572},[555,1486,713],{"class":561},[555,1488,716],{"class":594},[555,1490,719],{"class":572},[555,1492,1493,1495,1498,1500,1503],{"class":557,"line":576},[555,1494,707],{"class":561},[555,1496,1497],{"class":572}," { runTask } ",[555,1499,713],{"class":561},[555,1501,1502],{"class":594}," \"nitro\u002Ftask\"",[555,1504,719],{"class":572},[555,1506,1507],{"class":557,"line":582},[555,1508,725],{"emptyLinePlaceholder":724},[555,1510,1511,1513,1515,1517,1519,1521,1523,1525],{"class":557,"line":588},[555,1512,562],{"class":561},[555,1514,565],{"class":561},[555,1516,1365],{"class":568},[555,1518,1368],{"class":572},[555,1520,1372],{"class":1371},[555,1522,1375],{"class":572},[555,1524,1378],{"class":561},[555,1526,1381],{"class":572},[555,1528,1529,1531,1533,1535,1537,1539,1542,1545,1547,1549,1551,1553,1555],{"class":557,"line":598},[555,1530,1386],{"class":572},[555,1532,1389],{"class":568},[555,1534,1392],{"class":572},[555,1536,1395],{"class":594},[555,1538,799],{"class":572},[555,1540,1541],{"class":561},"async",[555,1543,1544],{"class":572}," ({ ",[555,1546,1401],{"class":1371},[555,1548,799],{"class":572},[555,1550,1406],{"class":1371},[555,1552,1414],{"class":572},[555,1554,1378],{"class":561},[555,1556,1381],{"class":572},[555,1558,1559,1562,1565,1568,1571],{"class":557,"line":604},[555,1560,1561],{"class":561},"    if",[555,1563,1564],{"class":572}," (metadata.topicName ",[555,1566,1567],{"class":561},"===",[555,1569,1570],{"class":594}," \"orders\"",[555,1572,1573],{"class":572},") {\n",[555,1575,1576,1579,1582,1584,1587],{"class":557,"line":610},[555,1577,1578],{"class":561},"      await",[555,1580,1581],{"class":568}," runTask",[555,1583,1392],{"class":572},[555,1585,1586],{"class":594},"\"orders:fulfill\"",[555,1588,1589],{"class":572},", { payload: message });\n",[555,1591,1592],{"class":557,"line":765},[555,1593,601],{"class":572},[555,1595,1596],{"class":557,"line":776},[555,1597,1459],{"class":572},[555,1599,1600],{"class":557,"line":782},[555,1601,859],{"class":572},[491,1603,1605],{"id":1604},"sending-messages","Sending messages",[413,1607,1325,1608,1611],{},[421,1609,1610],{},"@vercel\u002Fqueue"," package directly to send messages to a topic:",[546,1613,1616],{"className":548,"code":1614,"filename":1615,"language":551,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\nimport { send } from \"@vercel\u002Fqueue\";\n\nexport default defineHandler(async (event) => {\n  const order = await event.req.json();\n  const { messageId } = await send(\"orders\", order);\n  return { messageId };\n});\n","server\u002Froutes\u002Fapi\u002Forders.post.ts",[421,1617,1618,1631,1645,1649,1674,1696,1723,1731],{"__ignoreMap":5},[555,1619,1620,1622,1625,1627,1629],{"class":557,"line":558},[555,1621,707],{"class":561},[555,1623,1624],{"class":572}," { defineHandler } ",[555,1626,713],{"class":561},[555,1628,716],{"class":594},[555,1630,719],{"class":572},[555,1632,1633,1635,1638,1640,1643],{"class":557,"line":576},[555,1634,707],{"class":561},[555,1636,1637],{"class":572}," { send } ",[555,1639,713],{"class":561},[555,1641,1642],{"class":594}," \"@vercel\u002Fqueue\"",[555,1644,719],{"class":572},[555,1646,1647],{"class":557,"line":582},[555,1648,725],{"emptyLinePlaceholder":724},[555,1650,1651,1653,1655,1658,1660,1662,1665,1668,1670,1672],{"class":557,"line":588},[555,1652,562],{"class":561},[555,1654,565],{"class":561},[555,1656,1657],{"class":568}," defineHandler",[555,1659,1392],{"class":572},[555,1661,1541],{"class":561},[555,1663,1664],{"class":572}," (",[555,1666,1667],{"class":1371},"event",[555,1669,1375],{"class":572},[555,1671,1378],{"class":561},[555,1673,1381],{"class":572},[555,1675,1676,1679,1682,1685,1688,1691,1693],{"class":557,"line":598},[555,1677,1678],{"class":561},"  const",[555,1680,1681],{"class":640}," order",[555,1683,1684],{"class":561}," =",[555,1686,1687],{"class":561}," await",[555,1689,1690],{"class":572}," event.req.",[555,1692,628],{"class":568},[555,1694,1695],{"class":572},"();\n",[555,1697,1698,1700,1703,1705,1708,1711,1713,1716,1718,1720],{"class":557,"line":604},[555,1699,1678],{"class":561},[555,1701,1702],{"class":572}," { ",[555,1704,1448],{"class":640},[555,1706,1707],{"class":572}," } ",[555,1709,1710],{"class":561},"=",[555,1712,1687],{"class":561},[555,1714,1715],{"class":568}," send",[555,1717,1392],{"class":572},[555,1719,833],{"class":594},[555,1721,1722],{"class":572},", order);\n",[555,1724,1725,1728],{"class":557,"line":610},[555,1726,1727],{"class":561},"  return",[555,1729,1730],{"class":572}," { messageId };\n",[555,1732,1733],{"class":557,"line":765},[555,1734,859],{"class":572},[491,1736,1738],{"id":1737},"local-development","Local development",[413,1740,1741,1742,1745,1746,1749,1750,1752,1753,1756,1757,1760],{},"Queues work in ",[421,1743,1744],{},"nitro dev"," — ",[421,1747,1748],{},"send()"," delivers messages straight to your ",[421,1751,1204],{}," hook, so you can iterate without deploying. Pull your Vercel environment first with ",[421,1754,1755],{},"vercel link"," and ",[421,1758,1759],{},"vercel env pull"," so the SDK can authenticate.",[413,1762,1763,1764,1767],{},"If your hook throws, the message is retried locally. Retries honour ",[421,1765,1766],{},"retryAfterSeconds"," from each trigger when set.",[442,1769,1771],{"id":1770},"custom-build-output-configuration","Custom build output configuration",[413,1773,1774,1775,1780,1781,540,1784,1786],{},"You can provide additional ",[436,1776,1779],{"href":1777,"rel":1778},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fbuild-output-api\u002Fv3",[459],"build output configuration"," using ",[421,1782,1783],{},"vercel.config",[421,1785,543],{},". It will be merged with built-in auto-generated config.",[442,1788,1790],{"id":1789},"immutable-static-files","Immutable static files",[1792,1793,1794],"important",{},[413,1795,1796,1797,1800],{},"This feature is currently only available in the ",[436,1798,1799],{"href":89},"nightly release channel"," of Nitro v3.",[413,1802,1803,1804,1807,1808,1811],{},"Client build assets (such as JS and CSS chunks) can be emitted as ",[416,1805,1806],{},"immutable static files",". These are served from the reserved ",[421,1809,1810],{},"\u002F_vercel\u002Fimmutable\u002F"," path so they are shared across deployments and keep resolving even after a newer deployment no longer references them, improving cross-deployment caching.",[413,1813,1814,1815,1818,1819,1822],{},"You can enable this feature with the ",[421,1816,1817],{},"vercel.immutableStaticFiles"," option or by setting the ",[421,1820,1821],{},"VERCEL_IMMUTABLE_STATIC_FILES_ENABLED"," environment variable.",[546,1824,1826],{"className":548,"code":1825,"filename":550,"language":551,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  vercel: {\n    immutableStaticFiles: true\n  }\n})\n",[421,1827,1828,1840,1844,1854,1858,1865,1869],{"__ignoreMap":5},[555,1829,1830,1832,1834,1836,1838],{"class":557,"line":558},[555,1831,707],{"class":561},[555,1833,710],{"class":572},[555,1835,713],{"class":561},[555,1837,716],{"class":594},[555,1839,719],{"class":572},[555,1841,1842],{"class":557,"line":576},[555,1843,725],{"emptyLinePlaceholder":724},[555,1845,1846,1848,1850,1852],{"class":557,"line":582},[555,1847,562],{"class":561},[555,1849,565],{"class":561},[555,1851,569],{"class":568},[555,1853,573],{"class":572},[555,1855,1856],{"class":557,"line":588},[555,1857,579],{"class":572},[555,1859,1860,1863],{"class":557,"line":598},[555,1861,1862],{"class":572},"    immutableStaticFiles: ",[555,1864,1112],{"class":640},[555,1866,1867],{"class":557,"line":604},[555,1868,607],{"class":572},[555,1870,1871],{"class":557,"line":610},[555,1872,613],{"class":572},[413,1874,1875,1876,440],{},"When enabled, Nitro emits content-addressed build assets under ",[421,1877,1810],{},[430,1879,1880],{},[413,1881,1882,1883,1890],{},"The ",[436,1884,1887],{"href":1885,"rel":1886},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fenvironment-variables\u002Fsystem-environment-variables",[459],[421,1888,1889],{},"VERCEL_HASH_SALT"," system environment variable is factored into the content hashes, providing a way to rotate the generated file names.",[430,1892,1893,1910],{},[413,1894,1895,1896,1899,1900,1903,1904,1907,1908,440],{},"This works out of the box with the ",[416,1897,1898],{},"Nitro + Vite"," integration: Nitro's Vercel preset sets ",[421,1901,1902],{},"buildAssetsDir"," config and the Vite plugin automatically applies it as the ",[421,1905,1906],{},"assetsDir"," for the client and server-rendered builds, so all generated asset URLs point under ",[421,1909,1810],{},[413,1911,1912,1913,1916],{},"Client build setups and frameworks must apply ",[421,1914,1915],{},"nitro.options.buildAssetsDir"," themselves — use it as the client bundler's asset output directory (base) so generated asset URLs are emitted under that path. Without this, assets are still emitted at their default location and the immutable manifest will not match.",[442,1918,1920],{"id":1919},"on-demand-incremental-static-regeneration-isr","On-Demand incremental static regeneration (ISR)",[413,1922,1923],{},"On-demand revalidation allows you to purge the cache for an ISR route whenever you want, foregoing the time interval required with background revalidation.",[413,1925,1926],{},"To revalidate a page on demand:",[1928,1929,1931,1949,2012],"steps",{"level":1930},"4",[1932,1933,1934,1935],"h4",{},"Create an Environment Variable which will store a revalidation secret",[450,1936,1937],{},[453,1938,1939,1940,972,1943,1948],{},"You can use the command ",[421,1941,1942],{},"openssl rand -base64 32",[436,1944,1947],{"href":1945,"rel":1946},"https:\u002F\u002Fgenerate-secret.vercel.app\u002F32",[459],"Generate a Secret"," to generate a random value.",[1932,1950,1951,1952],{},"Update your configuration:",[546,1953,1955],{"className":548,"code":1954,"filename":550,"language":551,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  vercel: {\n    config: {\n      bypassToken: process.env.VERCEL_BYPASS_TOKEN\n    }\n  }\n})\n",[421,1956,1957,1969,1973,1983,1987,1992,2000,2004,2008],{"__ignoreMap":5},[555,1958,1959,1961,1963,1965,1967],{"class":557,"line":558},[555,1960,707],{"class":561},[555,1962,710],{"class":572},[555,1964,713],{"class":561},[555,1966,716],{"class":594},[555,1968,719],{"class":572},[555,1970,1971],{"class":557,"line":576},[555,1972,725],{"emptyLinePlaceholder":724},[555,1974,1975,1977,1979,1981],{"class":557,"line":582},[555,1976,562],{"class":561},[555,1978,565],{"class":561},[555,1980,569],{"class":568},[555,1982,573],{"class":572},[555,1984,1985],{"class":557,"line":588},[555,1986,579],{"class":572},[555,1988,1989],{"class":557,"line":598},[555,1990,1991],{"class":572},"    config: {\n",[555,1993,1994,1997],{"class":557,"line":604},[555,1995,1996],{"class":572},"      bypassToken: process.env.",[555,1998,1999],{"class":640},"VERCEL_BYPASS_TOKEN\n",[555,2001,2002],{"class":557,"line":610},[555,2003,601],{"class":572},[555,2005,2006],{"class":557,"line":765},[555,2007,607],{"class":572},[555,2009,2010],{"class":557,"line":776},[555,2011,613],{"class":572},[1932,2013,2014,2015,2018],{},"To trigger \"On-Demand Incremental Static Regeneration (ISR)\" and revalidate a path to a Prerender Function, make a GET or HEAD request to that path with a header of x-prerender-revalidate: ",[421,2016,2017],{},"bypassToken",". When that Prerender Function endpoint is accessed with this header set, the cache will be revalidated. The next request to that function should return a fresh response.",[491,2020,2022],{"id":2021},"fine-grained-isr-config-via-route-rules","Fine-grained ISR config via route rules",[413,2024,2025],{},"By default, query params affect cache keys but are not passed to the route handler unless specified.",[413,2027,2028,2029,2032],{},"You can pass an options object to ",[421,2030,2031],{},"isr"," route rule to configure caching behavior.",[450,2034,2035,2049,2055,2084,2101],{},[453,2036,2037,2040,2041,2044,2045,2048],{},[421,2038,2039],{},"expiration",": Expiration time (in seconds) before the cached asset will be re-generated by invoking the Serverless Function. Setting the value to ",[421,2042,2043],{},"false"," (or ",[421,2046,2047],{},"isr: true"," route rule) means it will never expire.",[453,2050,2051,2054],{},[421,2052,2053],{},"group",": Group number of the asset. Prerender assets with the same group number will all be re-validated at the same time.",[453,2056,2057,2060,2061],{},[421,2058,2059],{},"allowQuery",": List of query string parameter names that will be cached independently.\n",[450,2062,2063,2066,2073],{},[453,2064,2065],{},"If an empty array, query values are not considered for caching.",[453,2067,2068,2069,2072],{},"If ",[421,2070,2071],{},"undefined"," each unique query value is cached independently.",[453,2074,2075,2076,2079,2080,2083],{},"For wildcard ",[421,2077,2078],{},"\u002F**"," route rules, ",[421,2081,2082],{},"url"," is always added",[453,2085,2086,2089,2090,2093,2094,2097,2098,2100],{},[421,2087,2088],{},"passQuery",": When ",[421,2091,2092],{},"true",", the query string will be present on the ",[421,2095,2096],{},"request"," argument passed to the invoked function. The ",[421,2099,2059],{}," filter still applies.",[453,2102,2103,2089,2106,2108,2109],{},[421,2104,2105],{},"exposeErrBody",[421,2107,2092],{},", expose the response body regardless of status code including error status codes. (default ",[421,2110,2043],{},[546,2112,2114],{"className":548,"code":2113,"language":551,"meta":5,"style":5},"export default defineConfig({\n  routeRules: {\n    \"\u002Fproducts\u002F**\": {\n      isr: {\n        allowQuery: [\"q\"],\n        passQuery: true,\n        exposeErrBody: true\n      },\n    },\n  },\n});\n",[421,2115,2116,2126,2130,2137,2142,2152,2161,2168,2172,2176,2180],{"__ignoreMap":5},[555,2117,2118,2120,2122,2124],{"class":557,"line":558},[555,2119,562],{"class":561},[555,2121,565],{"class":561},[555,2123,569],{"class":568},[555,2125,573],{"class":572},[555,2127,2128],{"class":557,"line":576},[555,2129,913],{"class":572},[555,2131,2132,2135],{"class":557,"line":582},[555,2133,2134],{"class":594},"    \"\u002Fproducts\u002F**\"",[555,2136,752],{"class":572},[555,2138,2139],{"class":557,"line":588},[555,2140,2141],{"class":572},"      isr: {\n",[555,2143,2144,2147,2150],{"class":557,"line":598},[555,2145,2146],{"class":572},"        allowQuery: [",[555,2148,2149],{"class":594},"\"q\"",[555,2151,805],{"class":572},[555,2153,2154,2157,2159],{"class":557,"line":604},[555,2155,2156],{"class":572},"        passQuery: ",[555,2158,2092],{"class":640},[555,2160,650],{"class":572},[555,2162,2163,2166],{"class":557,"line":610},[555,2164,2165],{"class":572},"        exposeErrBody: ",[555,2167,1112],{"class":640},[555,2169,2170],{"class":557,"line":765},[555,2171,779],{"class":572},[555,2173,2174],{"class":557,"line":776},[555,2175,847],{"class":572},[555,2177,2178],{"class":557,"line":782},[555,2179,853],{"class":572},[555,2181,2182],{"class":557,"line":790},[555,2183,859],{"class":572},[2185,2186,2187],"style",{},"html pre.shiki code .so5gQ, html code.shiki .so5gQ{--shiki-light:#D73A49;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}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 .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 .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}",{"title":5,"searchDepth":576,"depth":576,"links":2189},[2190,2193,2194,2195,2196,2200,2203,2209,2210,2211],{"id":444,"depth":576,"text":445,"children":2191},[2192],{"id":493,"depth":582,"text":494},{"id":505,"depth":576,"text":506},{"id":524,"depth":576,"text":525},{"id":668,"depth":576,"text":669},{"id":879,"depth":576,"text":880,"children":2197},[2198,2199],{"id":951,"depth":582,"text":952},{"id":985,"depth":582,"text":986},{"id":1046,"depth":576,"text":1047,"children":2201},[2202],{"id":1168,"depth":582,"text":1169},{"id":1190,"depth":576,"text":1191,"children":2204},[2205,2206,2207,2208],{"id":1321,"depth":582,"text":1322},{"id":1466,"depth":582,"text":1467},{"id":1604,"depth":582,"text":1605},{"id":1737,"depth":582,"text":1738},{"id":1770,"depth":576,"text":1771},{"id":1789,"depth":576,"text":1790},{"id":1919,"depth":576,"text":1920,"children":2212},[2213],{"id":2021,"depth":582,"text":2022},"Deploy Nitro apps to Vercel.","md",{},{},{"title":211,"description":2214},"Vqr4vdT4C5S2TApidXymV3Ejea1QQ2htLXT2da1SAfE",[2221,2223],{"title":207,"path":208,"stem":209,"description":2222,"children":-1},"Deploy Nitro apps to StormKit.",{"title":215,"path":216,"stem":217,"description":2224,"children":-1},"Deploy Nitro apps to Zeabur.",1784166024047]