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