[{"data":1,"prerenderedAt":2268},["ShallowReactive",2],{"navigation":3,"-docs-storage":445,"-docs-storage-surround":2263},[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":108,"body":447,"description":2257,"extension":2258,"meta":2259,"navigation":2260,"path":109,"seo":2261,"stem":110,"__hash__":2262},"content\u002F1.docs\u002F8.storage.md",{"type":448,"value":449,"toc":2240,"icon":111},"minimark",[450,462,467,475,727,730,735,741,964,985,1170,1173,1180,1183,1262,1269,1280,1284,1291,1294,1399,1408,1432,1436,1439,1445,1455,1509,1513,1516,1564,1575,1593,1596,1607,1615,1773,1777,1784,1858,1864,1942,1946,1949,2045,2050,2055,2059,2065,2236],[451,452,453,454,461],"p",{},"Nitro has built-in integration with ",[455,456,460],"a",{"href":457,"rel":458},"https:\u002F\u002Funstorage.unjs.io",[459],"nofollow","unstorage"," to provide a runtime-agnostic persistence layer: your code always calls the same key-value API, and the backing driver (memory, filesystem, Redis, ...) is swapped through configuration.",[463,464,466],"h2",{"id":465},"usage","Usage",[451,468,469,470,474],{},"To use the storage layer, you can use the ",[471,472,473],"code",{},"useStorage()"," utility to access the storage instance.",[476,477,481],"pre",{"className":478,"code":479,"language":480,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import { useStorage } from \"nitro\u002Fstorage\";\n\n\u002F\u002F Default storage (in-memory)\nawait useStorage().setItem(\"test:foo\", { hello: \"world\" });\nconst value = await useStorage().getItem(\"test:foo\");\n\n\u002F\u002F You can specify a base prefix with useStorage(base)\nconst testStorage = useStorage(\"test\");\nawait testStorage.setItem(\"foo\", { hello: \"world\" });\nawait testStorage.getItem(\"foo\"); \u002F\u002F { hello: \"world\" }\n\n\u002F\u002F You can use generics to type the return value\nawait useStorage\u003C{ hello: string }>(\"test\").getItem(\"foo\");\nawait useStorage(\"test\").getItem\u003C{ hello: string }>(\"foo\");\n","ts",[471,482,483,506,513,520,551,581,586,592,611,632,651,656,662,698],{"__ignoreMap":5},[484,485,488,492,496,499,503],"span",{"class":486,"line":487},"line",1,[484,489,491],{"class":490},"so5gQ","import",[484,493,495],{"class":494},"slsVL"," { useStorage } ",[484,497,498],{"class":490},"from",[484,500,502],{"class":501},"sfrk1"," \"nitro\u002Fstorage\"",[484,504,505],{"class":494},";\n",[484,507,509],{"class":486,"line":508},2,[484,510,512],{"emptyLinePlaceholder":511},true,"\n",[484,514,516],{"class":486,"line":515},3,[484,517,519],{"class":518},"sCsY4","\u002F\u002F Default storage (in-memory)\n",[484,521,523,526,530,533,536,539,542,545,548],{"class":486,"line":522},4,[484,524,525],{"class":490},"await",[484,527,529],{"class":528},"shcOC"," useStorage",[484,531,532],{"class":494},"().",[484,534,535],{"class":528},"setItem",[484,537,538],{"class":494},"(",[484,540,541],{"class":501},"\"test:foo\"",[484,543,544],{"class":494},", { hello: ",[484,546,547],{"class":501},"\"world\"",[484,549,550],{"class":494}," });\n",[484,552,554,557,561,564,567,569,571,574,576,578],{"class":486,"line":553},5,[484,555,556],{"class":490},"const",[484,558,560],{"class":559},"suiK_"," value",[484,562,563],{"class":490}," =",[484,565,566],{"class":490}," await",[484,568,529],{"class":528},[484,570,532],{"class":494},[484,572,573],{"class":528},"getItem",[484,575,538],{"class":494},[484,577,541],{"class":501},[484,579,580],{"class":494},");\n",[484,582,584],{"class":486,"line":583},6,[484,585,512],{"emptyLinePlaceholder":511},[484,587,589],{"class":486,"line":588},7,[484,590,591],{"class":518},"\u002F\u002F You can specify a base prefix with useStorage(base)\n",[484,593,595,597,600,602,604,606,609],{"class":486,"line":594},8,[484,596,556],{"class":490},[484,598,599],{"class":559}," testStorage",[484,601,563],{"class":490},[484,603,529],{"class":528},[484,605,538],{"class":494},[484,607,608],{"class":501},"\"test\"",[484,610,580],{"class":494},[484,612,614,616,619,621,623,626,628,630],{"class":486,"line":613},9,[484,615,525],{"class":490},[484,617,618],{"class":494}," testStorage.",[484,620,535],{"class":528},[484,622,538],{"class":494},[484,624,625],{"class":501},"\"foo\"",[484,627,544],{"class":494},[484,629,547],{"class":501},[484,631,550],{"class":494},[484,633,635,637,639,641,643,645,648],{"class":486,"line":634},10,[484,636,525],{"class":490},[484,638,618],{"class":494},[484,640,573],{"class":528},[484,642,538],{"class":494},[484,644,625],{"class":501},[484,646,647],{"class":494},"); ",[484,649,650],{"class":518},"\u002F\u002F { hello: \"world\" }\n",[484,652,654],{"class":486,"line":653},11,[484,655,512],{"emptyLinePlaceholder":511},[484,657,659],{"class":486,"line":658},12,[484,660,661],{"class":518},"\u002F\u002F You can use generics to type the return value\n",[484,663,665,667,669,672,676,679,682,685,687,690,692,694,696],{"class":486,"line":664},13,[484,666,525],{"class":490},[484,668,529],{"class":528},[484,670,671],{"class":494},"\u003C{ ",[484,673,675],{"class":674},"sQHwn","hello",[484,677,678],{"class":490},":",[484,680,681],{"class":559}," string",[484,683,684],{"class":494}," }>(",[484,686,608],{"class":501},[484,688,689],{"class":494},").",[484,691,573],{"class":528},[484,693,538],{"class":494},[484,695,625],{"class":501},[484,697,580],{"class":494},[484,699,701,703,705,707,709,711,713,715,717,719,721,723,725],{"class":486,"line":700},14,[484,702,525],{"class":490},[484,704,529],{"class":528},[484,706,538],{"class":494},[484,708,608],{"class":501},[484,710,689],{"class":494},[484,712,573],{"class":528},[484,714,671],{"class":494},[484,716,675],{"class":674},[484,718,678],{"class":490},[484,720,681],{"class":559},[484,722,684],{"class":494},[484,724,625],{"class":501},[484,726,580],{"class":494},[728,729],"read-more",{"to":457},[731,732,734],"h3",{"id":733},"available-methods","Available methods",[451,736,737,738,740],{},"The storage instance returned by ",[471,739,473],{}," provides the following methods:",[742,743,744,757],"table",{},[745,746,747],"thead",{},[748,749,750,754],"tr",{},[751,752,753],"th",{},"Method",[751,755,756],{},"Description",[758,759,760,775,789,799,809,822,832,842,852,862,872,892,902,912,922,932,954],"tbody",{},[748,761,762,768],{},[763,764,765],"td",{},[471,766,767],{},"getItem(key)",[763,769,770,771,774],{},"Get the value of a key. Returns ",[471,772,773],{},"null"," if the key does not exist.",[748,776,777,782],{},[763,778,779],{},[471,780,781],{},"getItems(items)",[763,783,784,785,788],{},"Get multiple items at once. Accepts an array of keys or ",[471,786,787],{},"{ key, options }"," objects.",[748,790,791,796],{},[763,792,793],{},[471,794,795],{},"getItemRaw(key)",[763,797,798],{},"Get the raw value of a key without parsing. Useful for binary data.",[748,800,801,806],{},[763,802,803],{},[471,804,805],{},"setItem(key, value)",[763,807,808],{},"Set the value of a key.",[748,810,811,816],{},[763,812,813],{},[471,814,815],{},"setItems(items)",[763,817,818,819,788],{},"Set multiple items at once. Accepts an array of ",[471,820,821],{},"{ key, value }",[748,823,824,829],{},[763,825,826],{},[471,827,828],{},"setItemRaw(key, value)",[763,830,831],{},"Set the raw value of a key without serialization.",[748,833,834,839],{},[763,835,836],{},[471,837,838],{},"hasItem(key)",[763,840,841],{},"Check if a key exists. Returns a boolean.",[748,843,844,849],{},[763,845,846],{},[471,847,848],{},"removeItem(key)",[763,850,851],{},"Remove a key from storage.",[748,853,854,859],{},[763,855,856],{},[471,857,858],{},"getKeys(base?)",[763,860,861],{},"Get all keys, optionally filtered by a base prefix.",[748,863,864,869],{},[763,865,866],{},[471,867,868],{},"clear(base?)",[763,870,871],{},"Clear all keys, optionally filtered by a base prefix.",[748,873,874,879],{},[763,875,876],{},[471,877,878],{},"getMeta(key)",[763,880,881,882,885,886,885,889,689],{},"Get metadata for a key (e.g., ",[471,883,884],{},"mtime",", ",[471,887,888],{},"atime",[471,890,891],{},"ttl",[748,893,894,899],{},[763,895,896],{},[471,897,898],{},"setMeta(key, meta)",[763,900,901],{},"Set metadata for a key.",[748,903,904,909],{},[763,905,906],{},[471,907,908],{},"removeMeta(key)",[763,910,911],{},"Remove metadata for a key.",[748,913,914,919],{},[763,915,916],{},[471,917,918],{},"mount(base, driver)",[763,920,921],{},"Dynamically mount a storage driver at a base path.",[748,923,924,929],{},[763,925,926],{},[471,927,928],{},"unmount(base)",[763,930,931],{},"Unmount a storage driver from a base path.",[748,933,934,939],{},[763,935,936],{},[471,937,938],{},"watch(callback)",[763,940,941,942,945,946,949,950,953],{},"Watch for changes. Callback receives ",[471,943,944],{},"(event, key)"," where event is ",[471,947,948],{},"\"update\""," or ",[471,951,952],{},"\"remove\"",".",[748,955,956,961],{},[763,957,958],{},[471,959,960],{},"unwatch()",[763,962,963],{},"Stop watching for changes.",[451,965,966,967,885,970,885,973,885,976,885,979,885,982,953],{},"Shorthand aliases are also available: ",[471,968,969],{},"get",[471,971,972],{},"set",[471,974,975],{},"has",[471,977,978],{},"del",[471,980,981],{},"remove",[471,983,984],{},"keys",[476,986,988],{"className":478,"code":987,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\n\n\u002F\u002F Get all keys under a prefix\nconst keys = await useStorage(\"test\").getKeys();\n\n\u002F\u002F Check if a key exists\nconst exists = await useStorage().hasItem(\"test:foo\");\n\n\u002F\u002F Remove a key\nawait useStorage().removeItem(\"test:foo\");\n\n\u002F\u002F Get raw binary data\nconst raw = await useStorage().getItemRaw(\"assets:server:image.png\");\n\n\u002F\u002F Get metadata (type, etag, mtime, etc.)\nconst meta = await useStorage(\"assets:server\").getMeta(\"file.txt\");\n",[471,989,990,1002,1006,1011,1036,1040,1045,1069,1073,1078,1095,1099,1104,1129,1133,1139],{"__ignoreMap":5},[484,991,992,994,996,998,1000],{"class":486,"line":487},[484,993,491],{"class":490},[484,995,495],{"class":494},[484,997,498],{"class":490},[484,999,502],{"class":501},[484,1001,505],{"class":494},[484,1003,1004],{"class":486,"line":508},[484,1005,512],{"emptyLinePlaceholder":511},[484,1007,1008],{"class":486,"line":515},[484,1009,1010],{"class":518},"\u002F\u002F Get all keys under a prefix\n",[484,1012,1013,1015,1018,1020,1022,1024,1026,1028,1030,1033],{"class":486,"line":522},[484,1014,556],{"class":490},[484,1016,1017],{"class":559}," keys",[484,1019,563],{"class":490},[484,1021,566],{"class":490},[484,1023,529],{"class":528},[484,1025,538],{"class":494},[484,1027,608],{"class":501},[484,1029,689],{"class":494},[484,1031,1032],{"class":528},"getKeys",[484,1034,1035],{"class":494},"();\n",[484,1037,1038],{"class":486,"line":553},[484,1039,512],{"emptyLinePlaceholder":511},[484,1041,1042],{"class":486,"line":583},[484,1043,1044],{"class":518},"\u002F\u002F Check if a key exists\n",[484,1046,1047,1049,1052,1054,1056,1058,1060,1063,1065,1067],{"class":486,"line":588},[484,1048,556],{"class":490},[484,1050,1051],{"class":559}," exists",[484,1053,563],{"class":490},[484,1055,566],{"class":490},[484,1057,529],{"class":528},[484,1059,532],{"class":494},[484,1061,1062],{"class":528},"hasItem",[484,1064,538],{"class":494},[484,1066,541],{"class":501},[484,1068,580],{"class":494},[484,1070,1071],{"class":486,"line":594},[484,1072,512],{"emptyLinePlaceholder":511},[484,1074,1075],{"class":486,"line":613},[484,1076,1077],{"class":518},"\u002F\u002F Remove a key\n",[484,1079,1080,1082,1084,1086,1089,1091,1093],{"class":486,"line":634},[484,1081,525],{"class":490},[484,1083,529],{"class":528},[484,1085,532],{"class":494},[484,1087,1088],{"class":528},"removeItem",[484,1090,538],{"class":494},[484,1092,541],{"class":501},[484,1094,580],{"class":494},[484,1096,1097],{"class":486,"line":653},[484,1098,512],{"emptyLinePlaceholder":511},[484,1100,1101],{"class":486,"line":658},[484,1102,1103],{"class":518},"\u002F\u002F Get raw binary data\n",[484,1105,1106,1108,1111,1113,1115,1117,1119,1122,1124,1127],{"class":486,"line":664},[484,1107,556],{"class":490},[484,1109,1110],{"class":559}," raw",[484,1112,563],{"class":490},[484,1114,566],{"class":490},[484,1116,529],{"class":528},[484,1118,532],{"class":494},[484,1120,1121],{"class":528},"getItemRaw",[484,1123,538],{"class":494},[484,1125,1126],{"class":501},"\"assets:server:image.png\"",[484,1128,580],{"class":494},[484,1130,1131],{"class":486,"line":700},[484,1132,512],{"emptyLinePlaceholder":511},[484,1134,1136],{"class":486,"line":1135},15,[484,1137,1138],{"class":518},"\u002F\u002F Get metadata (type, etag, mtime, etc.)\n",[484,1140,1142,1144,1147,1149,1151,1153,1155,1158,1160,1163,1165,1168],{"class":486,"line":1141},16,[484,1143,556],{"class":490},[484,1145,1146],{"class":559}," meta",[484,1148,563],{"class":490},[484,1150,566],{"class":490},[484,1152,529],{"class":528},[484,1154,538],{"class":494},[484,1156,1157],{"class":501},"\"assets:server\"",[484,1159,689],{"class":494},[484,1161,1162],{"class":528},"getMeta",[484,1164,538],{"class":494},[484,1166,1167],{"class":501},"\"file.txt\"",[484,1169,580],{"class":494},[463,1171,33],{"id":1172},"configuration",[451,1174,1175,1176,1179],{},"You can mount one or multiple custom storage drivers using the ",[471,1177,1178],{},"storage"," option.",[451,1181,1182],{},"The key is the mount point name, and the value is the driver name and configuration.",[476,1184,1187],{"className":478,"code":1185,"filename":1186,"language":480,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  storage: {\n    redis: {\n      driver: \"redis\",\n      \u002F* redis connector options *\u002F\n    }\n  }\n})\n","nitro.config.ts",[471,1188,1189,1203,1207,1221,1226,1231,1242,1247,1252,1257],{"__ignoreMap":5},[484,1190,1191,1193,1196,1198,1201],{"class":486,"line":487},[484,1192,491],{"class":490},[484,1194,1195],{"class":494}," { defineConfig } ",[484,1197,498],{"class":490},[484,1199,1200],{"class":501}," \"nitro\"",[484,1202,505],{"class":494},[484,1204,1205],{"class":486,"line":508},[484,1206,512],{"emptyLinePlaceholder":511},[484,1208,1209,1212,1215,1218],{"class":486,"line":515},[484,1210,1211],{"class":490},"export",[484,1213,1214],{"class":490}," default",[484,1216,1217],{"class":528}," defineConfig",[484,1219,1220],{"class":494},"({\n",[484,1222,1223],{"class":486,"line":522},[484,1224,1225],{"class":494},"  storage: {\n",[484,1227,1228],{"class":486,"line":553},[484,1229,1230],{"class":494},"    redis: {\n",[484,1232,1233,1236,1239],{"class":486,"line":583},[484,1234,1235],{"class":494},"      driver: ",[484,1237,1238],{"class":501},"\"redis\"",[484,1240,1241],{"class":494},",\n",[484,1243,1244],{"class":486,"line":588},[484,1245,1246],{"class":518},"      \u002F* redis connector options *\u002F\n",[484,1248,1249],{"class":486,"line":594},[484,1250,1251],{"class":494},"    }\n",[484,1253,1254],{"class":486,"line":613},[484,1255,1256],{"class":494},"  }\n",[484,1258,1259],{"class":486,"line":634},[484,1260,1261],{"class":494},"})\n",[451,1263,1264,1265,1268],{},"Then, you can use the redis storage using the ",[471,1266,1267],{},"useStorage(\"redis\")"," function.",[728,1270,1272],{"to":1271},"https:\u002F\u002Funstorage.unjs.io\u002F",[451,1273,1274,1275,1279],{},"You can find the driver list on ",[455,1276,1278],{"href":1271,"rel":1277},[459],"unstorage documentation"," with their configuration.",[731,1281,1283],{"id":1282},"development-storage","Development storage",[451,1285,1286,1287,1290],{},"You can use the ",[471,1288,1289],{},"devStorage"," option to override storage configuration during development and prerendering.",[451,1292,1293],{},"This is useful when your production driver is not available in development (e.g., a managed Redis instance).",[476,1295,1297],{"className":478,"code":1296,"filename":1186,"language":480,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  storage: {\n    db: {\n      driver: \"redis\",\n      host: \"prod.example.com\",\n    }\n  },\n  devStorage: {\n    db: {\n      driver: \"fs\",\n      base: \".\u002F.data\u002Fdb\"\n    }\n  }\n})\n",[471,1298,1299,1311,1315,1325,1329,1334,1342,1352,1356,1361,1366,1370,1379,1387,1391,1395],{"__ignoreMap":5},[484,1300,1301,1303,1305,1307,1309],{"class":486,"line":487},[484,1302,491],{"class":490},[484,1304,1195],{"class":494},[484,1306,498],{"class":490},[484,1308,1200],{"class":501},[484,1310,505],{"class":494},[484,1312,1313],{"class":486,"line":508},[484,1314,512],{"emptyLinePlaceholder":511},[484,1316,1317,1319,1321,1323],{"class":486,"line":515},[484,1318,1211],{"class":490},[484,1320,1214],{"class":490},[484,1322,1217],{"class":528},[484,1324,1220],{"class":494},[484,1326,1327],{"class":486,"line":522},[484,1328,1225],{"class":494},[484,1330,1331],{"class":486,"line":553},[484,1332,1333],{"class":494},"    db: {\n",[484,1335,1336,1338,1340],{"class":486,"line":583},[484,1337,1235],{"class":494},[484,1339,1238],{"class":501},[484,1341,1241],{"class":494},[484,1343,1344,1347,1350],{"class":486,"line":588},[484,1345,1346],{"class":494},"      host: ",[484,1348,1349],{"class":501},"\"prod.example.com\"",[484,1351,1241],{"class":494},[484,1353,1354],{"class":486,"line":594},[484,1355,1251],{"class":494},[484,1357,1358],{"class":486,"line":613},[484,1359,1360],{"class":494},"  },\n",[484,1362,1363],{"class":486,"line":634},[484,1364,1365],{"class":494},"  devStorage: {\n",[484,1367,1368],{"class":486,"line":653},[484,1369,1333],{"class":494},[484,1371,1372,1374,1377],{"class":486,"line":658},[484,1373,1235],{"class":494},[484,1375,1376],{"class":501},"\"fs\"",[484,1378,1241],{"class":494},[484,1380,1381,1384],{"class":486,"line":664},[484,1382,1383],{"class":494},"      base: ",[484,1385,1386],{"class":501},"\".\u002F.data\u002Fdb\"\n",[484,1388,1389],{"class":486,"line":700},[484,1390,1251],{"class":494},[484,1392,1393],{"class":486,"line":1135},[484,1394,1256],{"class":494},[484,1396,1397],{"class":486,"line":1141},[484,1398,1261],{"class":494},[451,1400,1401,1402,1404,1405,1407],{},"When running in development mode, ",[471,1403,1289],{}," mounts are merged on top of ",[471,1406,1178],{}," mounts, allowing you to use a local filesystem driver or an in-memory driver while developing.",[1409,1410,1411],"tip",{},[451,1412,1413,1414,1417,1418,1420,1421,1424,1425,1427,1428,1431],{},"A common setup is a hosted driver (e.g. ",[471,1415,1416],{},"redis",") in ",[471,1419,1178],{}," for production and an ",[471,1422,1423],{},"fs"," driver in ",[471,1426,1289],{},", so development data is easy to inspect locally in ",[471,1429,1430],{},".data\u002F"," and does not require external services.",[463,1433,1435],{"id":1434},"built-in-mount-points","Built-in mount points",[451,1437,1438],{},"Nitro automatically mounts the following storage paths:",[731,1440,1442],{"id":1441},"assets",[471,1443,1444],{},"\u002Fassets",[451,1446,1447,1448,1450,1451,689],{},"Server assets are mounted at the ",[471,1449,1444],{}," base path. This mount point provides read-only access to bundled server assets (see ",[455,1452,1454],{"href":1453},"#server-assets","Server assets",[476,1456,1458],{"className":478,"code":1457,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\n\n\u002F\u002F Access server assets via the \u002Fassets mount\nconst content = await useStorage(\"assets:server\").getItem(\"my-file.txt\");\n",[471,1459,1460,1472,1476,1481],{"__ignoreMap":5},[484,1461,1462,1464,1466,1468,1470],{"class":486,"line":487},[484,1463,491],{"class":490},[484,1465,495],{"class":494},[484,1467,498],{"class":490},[484,1469,502],{"class":501},[484,1471,505],{"class":494},[484,1473,1474],{"class":486,"line":508},[484,1475,512],{"emptyLinePlaceholder":511},[484,1477,1478],{"class":486,"line":515},[484,1479,1480],{"class":518},"\u002F\u002F Access server assets via the \u002Fassets mount\n",[484,1482,1483,1485,1488,1490,1492,1494,1496,1498,1500,1502,1504,1507],{"class":486,"line":522},[484,1484,556],{"class":490},[484,1486,1487],{"class":559}," content",[484,1489,563],{"class":490},[484,1491,566],{"class":490},[484,1493,529],{"class":528},[484,1495,538],{"class":494},[484,1497,1157],{"class":501},[484,1499,689],{"class":494},[484,1501,573],{"class":528},[484,1503,538],{"class":494},[484,1505,1506],{"class":501},"\"my-file.txt\"",[484,1508,580],{"class":494},[731,1510,1512],{"id":1511},"default-in-memory","Default (in-memory)",[451,1514,1515],{},"The root storage (without a base path) uses an in-memory driver by default. Data stored here is not persisted across restarts.",[476,1517,1519],{"className":478,"code":1518,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\n\n\u002F\u002F In-memory by default, not persisted\nawait useStorage().setItem(\"counter\", 1);\n",[471,1520,1521,1533,1537,1542],{"__ignoreMap":5},[484,1522,1523,1525,1527,1529,1531],{"class":486,"line":487},[484,1524,491],{"class":490},[484,1526,495],{"class":494},[484,1528,498],{"class":490},[484,1530,502],{"class":501},[484,1532,505],{"class":494},[484,1534,1535],{"class":486,"line":508},[484,1536,512],{"emptyLinePlaceholder":511},[484,1538,1539],{"class":486,"line":515},[484,1540,1541],{"class":518},"\u002F\u002F In-memory by default, not persisted\n",[484,1543,1544,1546,1548,1550,1552,1554,1557,1559,1562],{"class":486,"line":522},[484,1545,525],{"class":490},[484,1547,529],{"class":528},[484,1549,532],{"class":494},[484,1551,535],{"class":528},[484,1553,538],{"class":494},[484,1555,1556],{"class":501},"\"counter\"",[484,1558,885],{"class":494},[484,1560,1561],{"class":559},"1",[484,1563,580],{"class":494},[451,1565,1566,1567,885,1569,1571,1572,1574],{},"To persist data, mount a driver with a persistent backend (e.g., ",[471,1568,1423],{},[471,1570,1416],{},", etc.) using the ",[471,1573,1178],{}," configuration option.",[1576,1577,1578],"note",{},[451,1579,1580,1581,1584,1585,1588,1589,1592],{},"The ",[455,1582,1583],{"href":104},"cache layer"," also stores its entries in this root storage (under the ",[471,1586,1587],{},"cache:"," prefix) unless you configure a dedicated ",[471,1590,1591],{},"cache"," mount point — so cached data is not persisted across restarts by default either.",[463,1594,1454],{"id":1595},"server-assets",[451,1597,1598,1599,1602,1603,1606],{},"Nitro allows you to bundle files from an ",[471,1600,1601],{},"assets\u002F"," directory at the root of your project. These files are accessible at runtime via the ",[471,1604,1605],{},"assets:server"," storage mount.",[476,1608,1613],{"className":1609,"code":1611,"language":1612},[1610],"language-text","my-project\u002F\n  assets\u002F\n    data.json\n    templates\u002F\n      welcome.html\n  server\u002F\n    routes\u002F\n      index.ts\n","text",[471,1614,1611],{"__ignoreMap":5},[476,1616,1619],{"className":478,"code":1617,"filename":1618,"language":480,"meta":5,"style":5},"import { defineHandler } from \"nitro\";\nimport { useStorage } from \"nitro\u002Fstorage\";\n\nexport default defineHandler(async () => {\n  const serverAssets = useStorage(\"assets:server\");\n\n  const keys = await serverAssets.getKeys();\n  const data = await serverAssets.getItem(\"data.json\");\n  const template = await serverAssets.getItem(\"templates\u002Fwelcome.html\");\n\n  return { keys, data, template };\n});\n","server\u002Froutes\u002Findex.ts",[471,1620,1621,1634,1646,1650,1673,1691,1695,1712,1734,1756,1760,1768],{"__ignoreMap":5},[484,1622,1623,1625,1628,1630,1632],{"class":486,"line":487},[484,1624,491],{"class":490},[484,1626,1627],{"class":494}," { defineHandler } ",[484,1629,498],{"class":490},[484,1631,1200],{"class":501},[484,1633,505],{"class":494},[484,1635,1636,1638,1640,1642,1644],{"class":486,"line":508},[484,1637,491],{"class":490},[484,1639,495],{"class":494},[484,1641,498],{"class":490},[484,1643,502],{"class":501},[484,1645,505],{"class":494},[484,1647,1648],{"class":486,"line":515},[484,1649,512],{"emptyLinePlaceholder":511},[484,1651,1652,1654,1656,1659,1661,1664,1667,1670],{"class":486,"line":522},[484,1653,1211],{"class":490},[484,1655,1214],{"class":490},[484,1657,1658],{"class":528}," defineHandler",[484,1660,538],{"class":494},[484,1662,1663],{"class":490},"async",[484,1665,1666],{"class":494}," () ",[484,1668,1669],{"class":490},"=>",[484,1671,1672],{"class":494}," {\n",[484,1674,1675,1678,1681,1683,1685,1687,1689],{"class":486,"line":553},[484,1676,1677],{"class":490},"  const",[484,1679,1680],{"class":559}," serverAssets",[484,1682,563],{"class":490},[484,1684,529],{"class":528},[484,1686,538],{"class":494},[484,1688,1157],{"class":501},[484,1690,580],{"class":494},[484,1692,1693],{"class":486,"line":583},[484,1694,512],{"emptyLinePlaceholder":511},[484,1696,1697,1699,1701,1703,1705,1708,1710],{"class":486,"line":588},[484,1698,1677],{"class":490},[484,1700,1017],{"class":559},[484,1702,563],{"class":490},[484,1704,566],{"class":490},[484,1706,1707],{"class":494}," serverAssets.",[484,1709,1032],{"class":528},[484,1711,1035],{"class":494},[484,1713,1714,1716,1719,1721,1723,1725,1727,1729,1732],{"class":486,"line":594},[484,1715,1677],{"class":490},[484,1717,1718],{"class":559}," data",[484,1720,563],{"class":490},[484,1722,566],{"class":490},[484,1724,1707],{"class":494},[484,1726,573],{"class":528},[484,1728,538],{"class":494},[484,1730,1731],{"class":501},"\"data.json\"",[484,1733,580],{"class":494},[484,1735,1736,1738,1741,1743,1745,1747,1749,1751,1754],{"class":486,"line":613},[484,1737,1677],{"class":490},[484,1739,1740],{"class":559}," template",[484,1742,563],{"class":490},[484,1744,566],{"class":490},[484,1746,1707],{"class":494},[484,1748,573],{"class":528},[484,1750,538],{"class":494},[484,1752,1753],{"class":501},"\"templates\u002Fwelcome.html\"",[484,1755,580],{"class":494},[484,1757,1758],{"class":486,"line":634},[484,1759,512],{"emptyLinePlaceholder":511},[484,1761,1762,1765],{"class":486,"line":653},[484,1763,1764],{"class":490},"  return",[484,1766,1767],{"class":494}," { keys, data, template };\n",[484,1769,1770],{"class":486,"line":658},[484,1771,1772],{"class":494},"});\n",[731,1774,1776],{"id":1775},"custom-asset-directories","Custom asset directories",[451,1778,1779,1780,1783],{},"You can register additional asset directories using the ",[471,1781,1782],{},"serverAssets"," config option:",[476,1785,1787],{"className":478,"code":1786,"filename":1186,"language":480,"meta":5,"style":5},"import { defineConfig } from \"nitro\";\n\nexport default defineConfig({\n  serverAssets: [\n    {\n      baseName: \"templates\",\n      dir: \".\u002Ftemplates\",\n    }\n  ]\n})\n",[471,1788,1789,1801,1805,1815,1820,1825,1835,1845,1849,1854],{"__ignoreMap":5},[484,1790,1791,1793,1795,1797,1799],{"class":486,"line":487},[484,1792,491],{"class":490},[484,1794,1195],{"class":494},[484,1796,498],{"class":490},[484,1798,1200],{"class":501},[484,1800,505],{"class":494},[484,1802,1803],{"class":486,"line":508},[484,1804,512],{"emptyLinePlaceholder":511},[484,1806,1807,1809,1811,1813],{"class":486,"line":515},[484,1808,1211],{"class":490},[484,1810,1214],{"class":490},[484,1812,1217],{"class":528},[484,1814,1220],{"class":494},[484,1816,1817],{"class":486,"line":522},[484,1818,1819],{"class":494},"  serverAssets: [\n",[484,1821,1822],{"class":486,"line":553},[484,1823,1824],{"class":494},"    {\n",[484,1826,1827,1830,1833],{"class":486,"line":583},[484,1828,1829],{"class":494},"      baseName: ",[484,1831,1832],{"class":501},"\"templates\"",[484,1834,1241],{"class":494},[484,1836,1837,1840,1843],{"class":486,"line":588},[484,1838,1839],{"class":494},"      dir: ",[484,1841,1842],{"class":501},"\".\u002Ftemplates\"",[484,1844,1241],{"class":494},[484,1846,1847],{"class":486,"line":594},[484,1848,1251],{"class":494},[484,1850,1851],{"class":486,"line":613},[484,1852,1853],{"class":494},"  ]\n",[484,1855,1856],{"class":486,"line":634},[484,1857,1261],{"class":494},[451,1859,1860,1861,678],{},"Custom asset directories are accessible under ",[471,1862,1863],{},"assets:\u003CbaseName>",[476,1865,1867],{"className":478,"code":1866,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\n\nconst templates = useStorage(\"assets:templates\");\nconst keys = await templates.getKeys();\nconst html = await templates.getItem(\"email.html\");\n",[471,1868,1869,1881,1885,1903,1920],{"__ignoreMap":5},[484,1870,1871,1873,1875,1877,1879],{"class":486,"line":487},[484,1872,491],{"class":490},[484,1874,495],{"class":494},[484,1876,498],{"class":490},[484,1878,502],{"class":501},[484,1880,505],{"class":494},[484,1882,1883],{"class":486,"line":508},[484,1884,512],{"emptyLinePlaceholder":511},[484,1886,1887,1889,1892,1894,1896,1898,1901],{"class":486,"line":515},[484,1888,556],{"class":490},[484,1890,1891],{"class":559}," templates",[484,1893,563],{"class":490},[484,1895,529],{"class":528},[484,1897,538],{"class":494},[484,1899,1900],{"class":501},"\"assets:templates\"",[484,1902,580],{"class":494},[484,1904,1905,1907,1909,1911,1913,1916,1918],{"class":486,"line":522},[484,1906,556],{"class":490},[484,1908,1017],{"class":559},[484,1910,563],{"class":490},[484,1912,566],{"class":490},[484,1914,1915],{"class":494}," templates.",[484,1917,1032],{"class":528},[484,1919,1035],{"class":494},[484,1921,1922,1924,1927,1929,1931,1933,1935,1937,1940],{"class":486,"line":553},[484,1923,556],{"class":490},[484,1925,1926],{"class":559}," html",[484,1928,563],{"class":490},[484,1930,566],{"class":490},[484,1932,1915],{"class":494},[484,1934,573],{"class":528},[484,1936,538],{"class":494},[484,1938,1939],{"class":501},"\"email.html\"",[484,1941,580],{"class":494},[731,1943,1945],{"id":1944},"asset-metadata","Asset metadata",[451,1947,1948],{},"Server assets include metadata such as content type, ETag, and modification time:",[476,1950,1952],{"className":478,"code":1951,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\n\nconst serverAssets = useStorage(\"assets:server\");\n\nconst meta = await serverAssets.getMeta(\"image.png\");\n\u002F\u002F { type: \"image\u002Fpng\", etag: \"\\\"...\\\"\", mtime: \"2024-01-01T00:00:00.000Z\" }\n\n\u002F\u002F Useful for setting response headers\nconst raw = await serverAssets.getItemRaw(\"image.png\");\n",[471,1953,1954,1966,1970,1986,1990,2011,2016,2020,2025],{"__ignoreMap":5},[484,1955,1956,1958,1960,1962,1964],{"class":486,"line":487},[484,1957,491],{"class":490},[484,1959,495],{"class":494},[484,1961,498],{"class":490},[484,1963,502],{"class":501},[484,1965,505],{"class":494},[484,1967,1968],{"class":486,"line":508},[484,1969,512],{"emptyLinePlaceholder":511},[484,1971,1972,1974,1976,1978,1980,1982,1984],{"class":486,"line":515},[484,1973,556],{"class":490},[484,1975,1680],{"class":559},[484,1977,563],{"class":490},[484,1979,529],{"class":528},[484,1981,538],{"class":494},[484,1983,1157],{"class":501},[484,1985,580],{"class":494},[484,1987,1988],{"class":486,"line":522},[484,1989,512],{"emptyLinePlaceholder":511},[484,1991,1992,1994,1996,1998,2000,2002,2004,2006,2009],{"class":486,"line":553},[484,1993,556],{"class":490},[484,1995,1146],{"class":559},[484,1997,563],{"class":490},[484,1999,566],{"class":490},[484,2001,1707],{"class":494},[484,2003,1162],{"class":528},[484,2005,538],{"class":494},[484,2007,2008],{"class":501},"\"image.png\"",[484,2010,580],{"class":494},[484,2012,2013],{"class":486,"line":583},[484,2014,2015],{"class":518},"\u002F\u002F { type: \"image\u002Fpng\", etag: \"\\\"...\\\"\", mtime: \"2024-01-01T00:00:00.000Z\" }\n",[484,2017,2018],{"class":486,"line":588},[484,2019,512],{"emptyLinePlaceholder":511},[484,2021,2022],{"class":486,"line":594},[484,2023,2024],{"class":518},"\u002F\u002F Useful for setting response headers\n",[484,2026,2027,2029,2031,2033,2035,2037,2039,2041,2043],{"class":486,"line":613},[484,2028,556],{"class":490},[484,2030,1110],{"class":559},[484,2032,563],{"class":490},[484,2034,566],{"class":490},[484,2036,1707],{"class":494},[484,2038,1121],{"class":528},[484,2040,538],{"class":494},[484,2042,2008],{"class":501},[484,2044,580],{"class":494},[1576,2046,2047],{},[451,2048,2049],{},"In development, server assets are read directly from the filesystem. In production, they are bundled and inlined into the build output.",[728,2051,2052],{"to":29},[451,2053,2054],{},"Read more about public and server assets.",[463,2056,2058],{"id":2057},"runtime-configuration","Runtime configuration",[451,2060,2061,2062,953],{},"In scenarios where the mount point configuration is not known until runtime, Nitro can dynamically add mount points during startup using ",[455,2063,2064],{"href":54},"plugins",[476,2066,2069],{"className":478,"code":2067,"filename":2068,"language":480,"meta":5,"style":5},"import { useStorage } from \"nitro\u002Fstorage\";\nimport { definePlugin } from \"nitro\";\nimport redisDriver from \"unstorage\u002Fdrivers\u002Fredis\";\n\nexport default definePlugin(() => {\n  const storage = useStorage()\n\n  \u002F\u002F Dynamically pass in credentials from runtime configuration, or other sources\n  const driver = redisDriver({\n    base: \"redis\",\n    host: process.env.REDIS_HOST,\n    port: process.env.REDIS_PORT,\n    \u002F* other redis connector options *\u002F\n  })\n\n  \u002F\u002F Mount driver\n  storage.mount(\"redis\", driver)\n})\n","plugins\u002Fstorage.ts",[471,2070,2071,2083,2096,2110,2114,2130,2144,2148,2153,2167,2176,2186,2196,2201,2206,2210,2215,2231],{"__ignoreMap":5},[484,2072,2073,2075,2077,2079,2081],{"class":486,"line":487},[484,2074,491],{"class":490},[484,2076,495],{"class":494},[484,2078,498],{"class":490},[484,2080,502],{"class":501},[484,2082,505],{"class":494},[484,2084,2085,2087,2090,2092,2094],{"class":486,"line":508},[484,2086,491],{"class":490},[484,2088,2089],{"class":494}," { definePlugin } ",[484,2091,498],{"class":490},[484,2093,1200],{"class":501},[484,2095,505],{"class":494},[484,2097,2098,2100,2103,2105,2108],{"class":486,"line":515},[484,2099,491],{"class":490},[484,2101,2102],{"class":494}," redisDriver ",[484,2104,498],{"class":490},[484,2106,2107],{"class":501}," \"unstorage\u002Fdrivers\u002Fredis\"",[484,2109,505],{"class":494},[484,2111,2112],{"class":486,"line":522},[484,2113,512],{"emptyLinePlaceholder":511},[484,2115,2116,2118,2120,2123,2126,2128],{"class":486,"line":553},[484,2117,1211],{"class":490},[484,2119,1214],{"class":490},[484,2121,2122],{"class":528}," definePlugin",[484,2124,2125],{"class":494},"(() ",[484,2127,1669],{"class":490},[484,2129,1672],{"class":494},[484,2131,2132,2134,2137,2139,2141],{"class":486,"line":583},[484,2133,1677],{"class":490},[484,2135,2136],{"class":559}," storage",[484,2138,563],{"class":490},[484,2140,529],{"class":528},[484,2142,2143],{"class":494},"()\n",[484,2145,2146],{"class":486,"line":588},[484,2147,512],{"emptyLinePlaceholder":511},[484,2149,2150],{"class":486,"line":594},[484,2151,2152],{"class":518},"  \u002F\u002F Dynamically pass in credentials from runtime configuration, or other sources\n",[484,2154,2155,2157,2160,2162,2165],{"class":486,"line":613},[484,2156,1677],{"class":490},[484,2158,2159],{"class":559}," driver",[484,2161,563],{"class":490},[484,2163,2164],{"class":528}," redisDriver",[484,2166,1220],{"class":494},[484,2168,2169,2172,2174],{"class":486,"line":634},[484,2170,2171],{"class":494},"    base: ",[484,2173,1238],{"class":501},[484,2175,1241],{"class":494},[484,2177,2178,2181,2184],{"class":486,"line":653},[484,2179,2180],{"class":494},"    host: process.env.",[484,2182,2183],{"class":559},"REDIS_HOST",[484,2185,1241],{"class":494},[484,2187,2188,2191,2194],{"class":486,"line":658},[484,2189,2190],{"class":494},"    port: process.env.",[484,2192,2193],{"class":559},"REDIS_PORT",[484,2195,1241],{"class":494},[484,2197,2198],{"class":486,"line":664},[484,2199,2200],{"class":518},"    \u002F* other redis connector options *\u002F\n",[484,2202,2203],{"class":486,"line":700},[484,2204,2205],{"class":494},"  })\n",[484,2207,2208],{"class":486,"line":1135},[484,2209,512],{"emptyLinePlaceholder":511},[484,2211,2212],{"class":486,"line":1141},[484,2213,2214],{"class":518},"  \u002F\u002F Mount driver\n",[484,2216,2218,2221,2224,2226,2228],{"class":486,"line":2217},17,[484,2219,2220],{"class":494},"  storage.",[484,2222,2223],{"class":528},"mount",[484,2225,538],{"class":494},[484,2227,1238],{"class":501},[484,2229,2230],{"class":494},", driver)\n",[484,2232,2234],{"class":486,"line":2233},18,[484,2235,1261],{"class":494},[2237,2238,2239],"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 .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .shcOC, html code.shiki .shcOC{--shiki-light:#6F42C1;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .suiK_, html code.shiki .suiK_{--shiki-light:#005CC5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sQHwn, html code.shiki .sQHwn{--shiki-light:#E36209;--shiki-default:#FFAB70;--shiki-dark:#FFAB70}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);}",{"title":5,"searchDepth":508,"depth":508,"links":2241},[2242,2245,2248,2252,2256],{"id":465,"depth":508,"text":466,"children":2243},[2244],{"id":733,"depth":515,"text":734},{"id":1172,"depth":508,"text":33,"children":2246},[2247],{"id":1282,"depth":515,"text":1283},{"id":1434,"depth":508,"text":1435,"children":2249},[2250,2251],{"id":1441,"depth":515,"text":1444},{"id":1511,"depth":515,"text":1512},{"id":1595,"depth":508,"text":1454,"children":2253},[2254,2255],{"id":1775,"depth":515,"text":1776},{"id":1944,"depth":515,"text":1945},{"id":2057,"depth":508,"text":2058},"Nitro provides a built-in storage layer that can abstract the filesystem, a database, or any other data source.","md",{"icon":111},{"icon":111},{"title":108,"description":2257},"o812PtUuA9gHASJJzilbxQp-eWZ6Bv_PXaIIpkSAVLs",[2264,2266],{"title":103,"path":104,"stem":105,"description":2265,"icon":106,"children":-1},"Nitro provides a caching system built on top of the storage layer, powered by ocache.",{"title":113,"path":114,"stem":115,"description":2267,"icon":116,"children":-1},"Nitro v3 introduces intentional backward-incompatible changes. This guide helps you migrate from Nitro v2.",1784019064232]