[{"data":1,"prerenderedAt":2154},["ShallowReactive",2],{"navigation":3,"-docs-storage":377,"-docs-storage-surround":2150},[4,83,212,218,374],{"title":5,"path":6,"stem":7,"children":8,"icon":82},"","/docs","1.docs/1.index",[9,12,17,22,27,32,37,42,47,52,57,62,67,72,77],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-lucide-compass",{"title":13,"path":14,"stem":15,"icon":16},"Quick Start","/docs/quick-start","1.docs/2.quick-start","i-lucide-zap",{"title":18,"path":19,"stem":20,"icon":21},"Renderer","/docs/renderer","1.docs/4.renderer","ri:layout-masonry-line",{"title":23,"path":24,"stem":25,"icon":26},"Routing","/docs/routing","1.docs/5.routing","ri:direction-line",{"title":28,"path":29,"stem":30,"icon":31},"Assets","/docs/assets","1.docs/50.assets","ri:image-2-line",{"title":33,"path":34,"stem":35,"icon":36},"Configuration","/docs/configuration","1.docs/50.configuration","ri:settings-3-line",{"title":38,"path":39,"stem":40,"icon":41},"Database","/docs/database","1.docs/50.database","ri:database-2-line",{"title":43,"path":44,"stem":45,"icon":46},"Lifecycle","/docs/lifecycle","1.docs/50.lifecycle","i-lucide-layers",{"title":48,"path":49,"stem":50,"icon":51},"Plugins","/docs/plugins","1.docs/50.plugins","ri:plug-line",{"title":53,"path":54,"stem":55,"icon":56},"Tasks","/docs/tasks","1.docs/50.tasks","codicon:run-all",{"title":58,"path":59,"stem":60,"icon":61},"Server Entry","/docs/server-entry","1.docs/6.server-entry","ri:server-line",{"title":63,"path":64,"stem":65,"icon":66},"Cache","/docs/cache","1.docs/7.cache","ri:speed-line",{"title":68,"path":69,"stem":70,"icon":71},"KV Storage","/docs/storage","1.docs/8.storage","carbon:datastore",{"title":73,"path":74,"stem":75,"icon":76},"Migration Guide","/docs/migration","1.docs/99.migration","ri:arrow-right-up-line",{"title":78,"path":79,"stem":80,"icon":81},"Nightly Channel","/docs/nightly","1.docs/99.nightly","ri:moon-fill","i-lucide-book-open",{"title":84,"path":85,"stem":86,"children":87,"icon":89},"Deploy","/deploy","2.deploy/0.index",[88,90,111],{"title":84,"path":85,"stem":86,"icon":89},"ri:upload-cloud-2-line",{"title":91,"path":92,"stem":93,"children":94,"page":110},"Runtimes","/deploy/runtimes","2.deploy/10.runtimes",[95,100,105],{"title":96,"path":97,"stem":98,"icon":99},"Node.js","/deploy/runtimes/node","2.deploy/10.runtimes/1.node","akar-icons:node-fill",{"title":101,"path":102,"stem":103,"icon":104},"Bun","/deploy/runtimes/bun","2.deploy/10.runtimes/bun","simple-icons:bun",{"title":106,"path":107,"stem":108,"icon":109},"Deno","/deploy/runtimes/deno","2.deploy/10.runtimes/deno","simple-icons:deno",false,{"title":112,"path":113,"stem":114,"children":115,"page":110},"Providers","/deploy/providers","2.deploy/20.providers",[116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208],{"title":117,"path":118,"stem":119},"Alwaysdata","/deploy/providers/alwaysdata","2.deploy/20.providers/alwaysdata",{"title":121,"path":122,"stem":123},"AWS Lambda","/deploy/providers/aws","2.deploy/20.providers/aws",{"title":125,"path":126,"stem":127},"AWS Amplify","/deploy/providers/aws-amplify","2.deploy/20.providers/aws-amplify",{"title":129,"path":130,"stem":131},"Azure","/deploy/providers/azure","2.deploy/20.providers/azure",{"title":133,"path":134,"stem":135},"Cleavr","/deploy/providers/cleavr","2.deploy/20.providers/cleavr",{"title":137,"path":138,"stem":139},"Cloudflare","/deploy/providers/cloudflare","2.deploy/20.providers/cloudflare",{"title":141,"path":142,"stem":143},"Deno Deploy","/deploy/providers/deno-deploy","2.deploy/20.providers/deno-deploy",{"title":145,"path":146,"stem":147},"DigitalOcean","/deploy/providers/digitalocean","2.deploy/20.providers/digitalocean",{"title":149,"path":150,"stem":151},"Firebase","/deploy/providers/firebase","2.deploy/20.providers/firebase",{"title":153,"path":154,"stem":155},"Flightcontrol","/deploy/providers/flightcontrol","2.deploy/20.providers/flightcontrol",{"title":157,"path":158,"stem":159},"Genezio","/deploy/providers/genezio","2.deploy/20.providers/genezio",{"title":161,"path":162,"stem":163},"GitHub Pages","/deploy/providers/github-pages","2.deploy/20.providers/github-pages",{"title":165,"path":166,"stem":167},"GitLab Pages","/deploy/providers/gitlab-pages","2.deploy/20.providers/gitlab-pages",{"title":169,"path":170,"stem":171},"Heroku","/deploy/providers/heroku","2.deploy/20.providers/heroku",{"title":173,"path":174,"stem":175},"IIS","/deploy/providers/iis","2.deploy/20.providers/iis",{"title":177,"path":178,"stem":179},"Koyeb","/deploy/providers/koyeb","2.deploy/20.providers/koyeb",{"title":181,"path":182,"stem":183},"Netlify","/deploy/providers/netlify","2.deploy/20.providers/netlify",{"title":185,"path":186,"stem":187},"Platform.sh","/deploy/providers/platform-sh","2.deploy/20.providers/platform-sh",{"title":189,"path":190,"stem":191},"Render.com","/deploy/providers/render","2.deploy/20.providers/render",{"title":193,"path":194,"stem":195},"StormKit","/deploy/providers/stormkit","2.deploy/20.providers/stormkit",{"title":197,"path":198,"stem":199},"Vercel","/deploy/providers/vercel","2.deploy/20.providers/vercel",{"title":201,"path":202,"stem":203},"Zeabur","/deploy/providers/zeabur","2.deploy/20.providers/zeabur",{"title":205,"path":206,"stem":207},"Zephyr Cloud","/deploy/providers/zephyr","2.deploy/20.providers/zephyr",{"title":209,"path":210,"stem":211},"Zerops","/deploy/providers/zerops","2.deploy/20.providers/zerops",{"title":213,"path":214,"stem":215,"children":216,"icon":36},"Config","/config","3.config/0.index",[217],{"title":213,"path":214,"stem":215,"icon":36},{"title":219,"path":220,"stem":221,"children":222,"icon":224},"Examples","/examples","4.examples/0.index",[223,225,230,235,240,245,249,254,259,264,269,274,279,283,288,292,296,301,306,311,316,321,326,331,336,341,345,350,355,359,364,369],{"title":219,"path":220,"stem":221,"icon":224},"i-lucide-folder-code",{"title":226,"path":227,"stem":228,"icon":229},"API Routes","/examples/api-routes","4.examples/api-routes","i-lucide-route",{"title":231,"path":232,"stem":233,"icon":234},"Auto Imports","/examples/auto-imports","4.examples/auto-imports","i-lucide-import",{"title":236,"path":237,"stem":238,"icon":239},"Cached Handler","/examples/cached-handler","4.examples/cached-handler","i-lucide-clock",{"title":241,"path":242,"stem":243,"icon":244},"Custom Error Handler","/examples/custom-error-handler","4.examples/custom-error-handler","i-lucide-alert-circle",{"title":38,"path":246,"stem":247,"icon":248},"/examples/database","4.examples/database","i-lucide-database",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","/examples/elysia","4.examples/elysia","i-skill-icons-elysia-dark",{"title":255,"path":256,"stem":257,"icon":258},"Express","/examples/express","4.examples/express","i-simple-icons-express",{"title":260,"path":261,"stem":262,"icon":263},"Fastify","/examples/fastify","4.examples/fastify","i-simple-icons-fastify",{"title":265,"path":266,"stem":267,"icon":268},"Hello World","/examples/hello-world","4.examples/hello-world","i-lucide-sparkles",{"title":270,"path":271,"stem":272,"icon":273},"Hono","/examples/hono","4.examples/hono","i-logos-hono",{"title":275,"path":276,"stem":277,"icon":278},"Import Alias","/examples/import-alias","4.examples/import-alias","i-lucide-at-sign",{"title":280,"path":281,"stem":282,"icon":46},"Middleware","/examples/middleware","4.examples/middleware",{"title":284,"path":285,"stem":286,"icon":287},"Mono JSX","/examples/mono-jsx","4.examples/mono-jsx","i-lucide-brackets",{"title":289,"path":290,"stem":291,"icon":287},"Nano JSX","/examples/nano-jsx","4.examples/nano-jsx",{"title":48,"path":293,"stem":294,"icon":295},"/examples/plugins","4.examples/plugins","i-lucide-plug",{"title":297,"path":298,"stem":299,"icon":300},"Custom Renderer","/examples/renderer","4.examples/renderer","i-lucide-code",{"title":302,"path":303,"stem":304,"icon":305},"Runtime Config","/examples/runtime-config","4.examples/runtime-config","i-lucide-settings",{"title":307,"path":308,"stem":309,"icon":310},"Server Fetch","/examples/server-fetch","4.examples/server-fetch","i-lucide-arrow-right-left",{"title":312,"path":313,"stem":314,"icon":315},"Shiki","/examples/shiki","4.examples/shiki","i-lucide-highlighter",{"title":317,"path":318,"stem":319,"icon":320},"Virtual Routes","/examples/virtual-routes","4.examples/virtual-routes","i-lucide-box",{"title":322,"path":323,"stem":324,"icon":325},"Vite Nitro Plugin","/examples/vite-nitro-plugin","4.examples/vite-nitro-plugin","i-logos-vitejs",{"title":327,"path":328,"stem":329,"icon":330},"Vite RSC","/examples/vite-rsc","4.examples/vite-rsc","i-logos-react",{"title":332,"path":333,"stem":334,"icon":335},"Vite SSR HTML","/examples/vite-ssr-html","4.examples/vite-ssr-html","i-logos-html-5",{"title":337,"path":338,"stem":339,"icon":340},"SSR with Preact","/examples/vite-ssr-preact","4.examples/vite-ssr-preact","i-logos-preact",{"title":342,"path":343,"stem":344,"icon":330},"SSR with React","/examples/vite-ssr-react","4.examples/vite-ssr-react",{"title":346,"path":347,"stem":348,"icon":349},"SSR with SolidJS","/examples/vite-ssr-solid","4.examples/vite-ssr-solid","i-logos-solidjs-icon",{"title":351,"path":352,"stem":353,"icon":354},"SSR with TanStack Router","/examples/vite-ssr-tsr-react","4.examples/vite-ssr-tsr-react","i-simple-icons-tanstack",{"title":356,"path":357,"stem":358,"icon":354},"SSR with TanStack Start","/examples/vite-ssr-tss-react","4.examples/vite-ssr-tss-react",{"title":360,"path":361,"stem":362,"icon":363},"SSR with Vue Router","/examples/vite-ssr-vue-router","4.examples/vite-ssr-vue-router","i-logos-vue",{"title":365,"path":366,"stem":367,"icon":368},"Vite + tRPC","/examples/vite-trpc","4.examples/vite-trpc","i-simple-icons-trpc",{"title":370,"path":371,"stem":372,"icon":373},"WebSocket","/examples/websocket","4.examples/websocket","i-lucide-radio",{"title":5,"path":375,"stem":376},"/","index",{"id":378,"title":68,"body":379,"description":2144,"extension":2145,"meta":2146,"navigation":2147,"path":69,"seo":2148,"stem":70,"__hash__":2149},"content/1.docs/8.storage.md",{"type":380,"value":381,"toc":2127,"icon":71},"minimark",[382,394,399,407,659,662,667,673,896,917,1102,1105,1112,1115,1194,1201,1212,1216,1223,1226,1331,1340,1344,1347,1353,1363,1417,1421,1424,1472,1485,1488,1499,1507,1652,1656,1663,1737,1743,1821,1825,1828,1924,1930,1934,1940,2112,2123],[383,384,385,386,393],"p",{},"Nitro has built-in integration with ",[387,388,392],"a",{"href":389,"rel":390},"https://unstorage.unjs.io",[391],"nofollow","unstorage"," to provide a runtime agnostic persistent layer.",[395,396,398],"h2",{"id":397},"usage","Usage",[383,400,401,402,406],{},"To use the storage layer, you can use the ",[403,404,405],"code",{},"useStorage()"," utility to access the storage instance.",[408,409,413],"pre",{"className":410,"code":411,"language":412,"meta":5,"style":5},"language-ts shiki shiki-themes github-light github-dark github-dark","import { useStorage } from \"nitro/storage\";\n\n// Default storage (in-memory)\nawait useStorage().setItem(\"test:foo\", { hello: \"world\" });\nconst value = await useStorage().getItem(\"test:foo\");\n\n// You can specify a base prefix with useStorage(base)\nconst testStorage = useStorage(\"test\");\nawait testStorage.setItem(\"foo\", { hello: \"world\" });\nawait testStorage.getItem(\"foo\"); // { hello: \"world\" }\n\n// 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",[403,414,415,438,445,452,483,513,518,524,543,564,583,588,594,630],{"__ignoreMap":5},[416,417,420,424,428,431,435],"span",{"class":418,"line":419},"line",1,[416,421,423],{"class":422},"so5gQ","import",[416,425,427],{"class":426},"slsVL"," { useStorage } ",[416,429,430],{"class":422},"from",[416,432,434],{"class":433},"sfrk1"," \"nitro/storage\"",[416,436,437],{"class":426},";\n",[416,439,441],{"class":418,"line":440},2,[416,442,444],{"emptyLinePlaceholder":443},true,"\n",[416,446,448],{"class":418,"line":447},3,[416,449,451],{"class":450},"sCsY4","// Default storage (in-memory)\n",[416,453,455,458,462,465,468,471,474,477,480],{"class":418,"line":454},4,[416,456,457],{"class":422},"await",[416,459,461],{"class":460},"shcOC"," useStorage",[416,463,464],{"class":426},"().",[416,466,467],{"class":460},"setItem",[416,469,470],{"class":426},"(",[416,472,473],{"class":433},"\"test:foo\"",[416,475,476],{"class":426},", { hello: ",[416,478,479],{"class":433},"\"world\"",[416,481,482],{"class":426}," });\n",[416,484,486,489,493,496,499,501,503,506,508,510],{"class":418,"line":485},5,[416,487,488],{"class":422},"const",[416,490,492],{"class":491},"suiK_"," value",[416,494,495],{"class":422}," =",[416,497,498],{"class":422}," await",[416,500,461],{"class":460},[416,502,464],{"class":426},[416,504,505],{"class":460},"getItem",[416,507,470],{"class":426},[416,509,473],{"class":433},[416,511,512],{"class":426},");\n",[416,514,516],{"class":418,"line":515},6,[416,517,444],{"emptyLinePlaceholder":443},[416,519,521],{"class":418,"line":520},7,[416,522,523],{"class":450},"// You can specify a base prefix with useStorage(base)\n",[416,525,527,529,532,534,536,538,541],{"class":418,"line":526},8,[416,528,488],{"class":422},[416,530,531],{"class":491}," testStorage",[416,533,495],{"class":422},[416,535,461],{"class":460},[416,537,470],{"class":426},[416,539,540],{"class":433},"\"test\"",[416,542,512],{"class":426},[416,544,546,548,551,553,555,558,560,562],{"class":418,"line":545},9,[416,547,457],{"class":422},[416,549,550],{"class":426}," testStorage.",[416,552,467],{"class":460},[416,554,470],{"class":426},[416,556,557],{"class":433},"\"foo\"",[416,559,476],{"class":426},[416,561,479],{"class":433},[416,563,482],{"class":426},[416,565,567,569,571,573,575,577,580],{"class":418,"line":566},10,[416,568,457],{"class":422},[416,570,550],{"class":426},[416,572,505],{"class":460},[416,574,470],{"class":426},[416,576,557],{"class":433},[416,578,579],{"class":426},"); ",[416,581,582],{"class":450},"// { hello: \"world\" }\n",[416,584,586],{"class":418,"line":585},11,[416,587,444],{"emptyLinePlaceholder":443},[416,589,591],{"class":418,"line":590},12,[416,592,593],{"class":450},"// You can use generics to type the return value\n",[416,595,597,599,601,604,608,611,614,617,619,622,624,626,628],{"class":418,"line":596},13,[416,598,457],{"class":422},[416,600,461],{"class":460},[416,602,603],{"class":426},"\u003C{ ",[416,605,607],{"class":606},"sQHwn","hello",[416,609,610],{"class":422},":",[416,612,613],{"class":491}," string",[416,615,616],{"class":426}," }>(",[416,618,540],{"class":433},[416,620,621],{"class":426},").",[416,623,505],{"class":460},[416,625,470],{"class":426},[416,627,557],{"class":433},[416,629,512],{"class":426},[416,631,633,635,637,639,641,643,645,647,649,651,653,655,657],{"class":418,"line":632},14,[416,634,457],{"class":422},[416,636,461],{"class":460},[416,638,470],{"class":426},[416,640,540],{"class":433},[416,642,621],{"class":426},[416,644,505],{"class":460},[416,646,603],{"class":426},[416,648,607],{"class":606},[416,650,610],{"class":422},[416,652,613],{"class":491},[416,654,616],{"class":426},[416,656,557],{"class":433},[416,658,512],{"class":426},[660,661],"read-more",{"to":389},[663,664,666],"h3",{"id":665},"available-methods","Available methods",[383,668,669,670,672],{},"The storage instance returned by ",[403,671,405],{}," provides the following methods:",[674,675,676,689],"table",{},[677,678,679],"thead",{},[680,681,682,686],"tr",{},[683,684,685],"th",{},"Method",[683,687,688],{},"Description",[690,691,692,707,721,731,741,754,764,774,784,794,804,824,834,844,854,864,886],"tbody",{},[680,693,694,700],{},[695,696,697],"td",{},[403,698,699],{},"getItem(key)",[695,701,702,703,706],{},"Get the value of a key. Returns ",[403,704,705],{},"null"," if the key does not exist.",[680,708,709,714],{},[695,710,711],{},[403,712,713],{},"getItems(items)",[695,715,716,717,720],{},"Get multiple items at once. Accepts an array of keys or ",[403,718,719],{},"{ key, options }"," objects.",[680,722,723,728],{},[695,724,725],{},[403,726,727],{},"getItemRaw(key)",[695,729,730],{},"Get the raw value of a key without parsing. Useful for binary data.",[680,732,733,738],{},[695,734,735],{},[403,736,737],{},"setItem(key, value)",[695,739,740],{},"Set the value of a key.",[680,742,743,748],{},[695,744,745],{},[403,746,747],{},"setItems(items)",[695,749,750,751,720],{},"Set multiple items at once. Accepts an array of ",[403,752,753],{},"{ key, value }",[680,755,756,761],{},[695,757,758],{},[403,759,760],{},"setItemRaw(key, value)",[695,762,763],{},"Set the raw value of a key without serialization.",[680,765,766,771],{},[695,767,768],{},[403,769,770],{},"hasItem(key)",[695,772,773],{},"Check if a key exists. Returns a boolean.",[680,775,776,781],{},[695,777,778],{},[403,779,780],{},"removeItem(key)",[695,782,783],{},"Remove a key from storage.",[680,785,786,791],{},[695,787,788],{},[403,789,790],{},"getKeys(base?)",[695,792,793],{},"Get all keys, optionally filtered by a base prefix.",[680,795,796,801],{},[695,797,798],{},[403,799,800],{},"clear(base?)",[695,802,803],{},"Clear all keys, optionally filtered by a base prefix.",[680,805,806,811],{},[695,807,808],{},[403,809,810],{},"getMeta(key)",[695,812,813,814,817,818,817,821,621],{},"Get metadata for a key (e.g., ",[403,815,816],{},"mtime",", ",[403,819,820],{},"atime",[403,822,823],{},"ttl",[680,825,826,831],{},[695,827,828],{},[403,829,830],{},"setMeta(key, meta)",[695,832,833],{},"Set metadata for a key.",[680,835,836,841],{},[695,837,838],{},[403,839,840],{},"removeMeta(key)",[695,842,843],{},"Remove metadata for a key.",[680,845,846,851],{},[695,847,848],{},[403,849,850],{},"mount(base, driver)",[695,852,853],{},"Dynamically mount a storage driver at a base path.",[680,855,856,861],{},[695,857,858],{},[403,859,860],{},"unmount(base)",[695,862,863],{},"Unmount a storage driver from a base path.",[680,865,866,871],{},[695,867,868],{},[403,869,870],{},"watch(callback)",[695,872,873,874,877,878,881,882,885],{},"Watch for changes. Callback receives ",[403,875,876],{},"(event, key)"," where event is ",[403,879,880],{},"\"update\""," or ",[403,883,884],{},"\"remove\"",".",[680,887,888,893],{},[695,889,890],{},[403,891,892],{},"unwatch()",[695,894,895],{},"Stop watching for changes.",[383,897,898,899,817,902,817,905,817,908,817,911,817,914,885],{},"Shorthand aliases are also available: ",[403,900,901],{},"get",[403,903,904],{},"set",[403,906,907],{},"has",[403,909,910],{},"del",[403,912,913],{},"remove",[403,915,916],{},"keys",[408,918,920],{"className":410,"code":919,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\n\n// Get all keys under a prefix\nconst keys = await useStorage(\"test\").getKeys();\n\n// Check if a key exists\nconst exists = await useStorage().hasItem(\"test:foo\");\n\n// Remove a key\nawait useStorage().removeItem(\"test:foo\");\n\n// Get raw binary data\nconst raw = await useStorage().getItemRaw(\"assets/server:image.png\");\n\n// Get metadata (type, etag, mtime, etc.)\nconst meta = await useStorage(\"assets/server\").getMeta(\"file.txt\");\n",[403,921,922,934,938,943,968,972,977,1001,1005,1010,1027,1031,1036,1061,1065,1071],{"__ignoreMap":5},[416,923,924,926,928,930,932],{"class":418,"line":419},[416,925,423],{"class":422},[416,927,427],{"class":426},[416,929,430],{"class":422},[416,931,434],{"class":433},[416,933,437],{"class":426},[416,935,936],{"class":418,"line":440},[416,937,444],{"emptyLinePlaceholder":443},[416,939,940],{"class":418,"line":447},[416,941,942],{"class":450},"// Get all keys under a prefix\n",[416,944,945,947,950,952,954,956,958,960,962,965],{"class":418,"line":454},[416,946,488],{"class":422},[416,948,949],{"class":491}," keys",[416,951,495],{"class":422},[416,953,498],{"class":422},[416,955,461],{"class":460},[416,957,470],{"class":426},[416,959,540],{"class":433},[416,961,621],{"class":426},[416,963,964],{"class":460},"getKeys",[416,966,967],{"class":426},"();\n",[416,969,970],{"class":418,"line":485},[416,971,444],{"emptyLinePlaceholder":443},[416,973,974],{"class":418,"line":515},[416,975,976],{"class":450},"// Check if a key exists\n",[416,978,979,981,984,986,988,990,992,995,997,999],{"class":418,"line":520},[416,980,488],{"class":422},[416,982,983],{"class":491}," exists",[416,985,495],{"class":422},[416,987,498],{"class":422},[416,989,461],{"class":460},[416,991,464],{"class":426},[416,993,994],{"class":460},"hasItem",[416,996,470],{"class":426},[416,998,473],{"class":433},[416,1000,512],{"class":426},[416,1002,1003],{"class":418,"line":526},[416,1004,444],{"emptyLinePlaceholder":443},[416,1006,1007],{"class":418,"line":545},[416,1008,1009],{"class":450},"// Remove a key\n",[416,1011,1012,1014,1016,1018,1021,1023,1025],{"class":418,"line":566},[416,1013,457],{"class":422},[416,1015,461],{"class":460},[416,1017,464],{"class":426},[416,1019,1020],{"class":460},"removeItem",[416,1022,470],{"class":426},[416,1024,473],{"class":433},[416,1026,512],{"class":426},[416,1028,1029],{"class":418,"line":585},[416,1030,444],{"emptyLinePlaceholder":443},[416,1032,1033],{"class":418,"line":590},[416,1034,1035],{"class":450},"// Get raw binary data\n",[416,1037,1038,1040,1043,1045,1047,1049,1051,1054,1056,1059],{"class":418,"line":596},[416,1039,488],{"class":422},[416,1041,1042],{"class":491}," raw",[416,1044,495],{"class":422},[416,1046,498],{"class":422},[416,1048,461],{"class":460},[416,1050,464],{"class":426},[416,1052,1053],{"class":460},"getItemRaw",[416,1055,470],{"class":426},[416,1057,1058],{"class":433},"\"assets/server:image.png\"",[416,1060,512],{"class":426},[416,1062,1063],{"class":418,"line":632},[416,1064,444],{"emptyLinePlaceholder":443},[416,1066,1068],{"class":418,"line":1067},15,[416,1069,1070],{"class":450},"// Get metadata (type, etag, mtime, etc.)\n",[416,1072,1074,1076,1079,1081,1083,1085,1087,1090,1092,1095,1097,1100],{"class":418,"line":1073},16,[416,1075,488],{"class":422},[416,1077,1078],{"class":491}," meta",[416,1080,495],{"class":422},[416,1082,498],{"class":422},[416,1084,461],{"class":460},[416,1086,470],{"class":426},[416,1088,1089],{"class":433},"\"assets/server\"",[416,1091,621],{"class":426},[416,1093,1094],{"class":460},"getMeta",[416,1096,470],{"class":426},[416,1098,1099],{"class":433},"\"file.txt\"",[416,1101,512],{"class":426},[395,1103,33],{"id":1104},"configuration",[383,1106,1107,1108,1111],{},"You can mount one or multiple custom storage drivers using the ",[403,1109,1110],{},"storage"," option.",[383,1113,1114],{},"The key is the mount point name, and the value is the driver name and configuration.",[408,1116,1119],{"className":410,"code":1117,"filename":1118,"language":412,"meta":5,"style":5},"import { defineNitroConfig } from \"nitro/config\";\n\nexport default defineNitroConfig({\n  storage: {\n    redis: {\n      driver: \"redis\",\n      /* redis connector options */\n    }\n  }\n})\n","nitro.config.ts",[403,1120,1121,1135,1139,1153,1158,1163,1174,1179,1184,1189],{"__ignoreMap":5},[416,1122,1123,1125,1128,1130,1133],{"class":418,"line":419},[416,1124,423],{"class":422},[416,1126,1127],{"class":426}," { defineNitroConfig } ",[416,1129,430],{"class":422},[416,1131,1132],{"class":433}," \"nitro/config\"",[416,1134,437],{"class":426},[416,1136,1137],{"class":418,"line":440},[416,1138,444],{"emptyLinePlaceholder":443},[416,1140,1141,1144,1147,1150],{"class":418,"line":447},[416,1142,1143],{"class":422},"export",[416,1145,1146],{"class":422}," default",[416,1148,1149],{"class":460}," defineNitroConfig",[416,1151,1152],{"class":426},"({\n",[416,1154,1155],{"class":418,"line":454},[416,1156,1157],{"class":426},"  storage: {\n",[416,1159,1160],{"class":418,"line":485},[416,1161,1162],{"class":426},"    redis: {\n",[416,1164,1165,1168,1171],{"class":418,"line":515},[416,1166,1167],{"class":426},"      driver: ",[416,1169,1170],{"class":433},"\"redis\"",[416,1172,1173],{"class":426},",\n",[416,1175,1176],{"class":418,"line":520},[416,1177,1178],{"class":450},"      /* redis connector options */\n",[416,1180,1181],{"class":418,"line":526},[416,1182,1183],{"class":426},"    }\n",[416,1185,1186],{"class":418,"line":545},[416,1187,1188],{"class":426},"  }\n",[416,1190,1191],{"class":418,"line":566},[416,1192,1193],{"class":426},"})\n",[383,1195,1196,1197,1200],{},"Then, you can use the redis storage using the ",[403,1198,1199],{},"useStorage(\"redis\")"," function.",[660,1202,1204],{"to":1203},"https://unstorage.unjs.io/",[383,1205,1206,1207,1211],{},"You can find the driver list on ",[387,1208,1210],{"href":1203,"rel":1209},[391],"unstorage documentation"," with their configuration.",[663,1213,1215],{"id":1214},"development-storage","Development storage",[383,1217,1218,1219,1222],{},"You can use the ",[403,1220,1221],{},"devStorage"," option to override storage configuration during development and prerendering.",[383,1224,1225],{},"This is useful when your production driver is not available in development (e.g., a managed Redis instance).",[408,1227,1229],{"className":410,"code":1228,"filename":1118,"language":412,"meta":5,"style":5},"import { defineNitroConfig } from \"nitro/config\";\n\nexport default defineNitroConfig({\n  storage: {\n    db: {\n      driver: \"redis\",\n      host: \"prod.example.com\",\n    }\n  },\n  devStorage: {\n    db: {\n      driver: \"fs\",\n      base: \"./.data/db\"\n    }\n  }\n})\n",[403,1230,1231,1243,1247,1257,1261,1266,1274,1284,1288,1293,1298,1302,1311,1319,1323,1327],{"__ignoreMap":5},[416,1232,1233,1235,1237,1239,1241],{"class":418,"line":419},[416,1234,423],{"class":422},[416,1236,1127],{"class":426},[416,1238,430],{"class":422},[416,1240,1132],{"class":433},[416,1242,437],{"class":426},[416,1244,1245],{"class":418,"line":440},[416,1246,444],{"emptyLinePlaceholder":443},[416,1248,1249,1251,1253,1255],{"class":418,"line":447},[416,1250,1143],{"class":422},[416,1252,1146],{"class":422},[416,1254,1149],{"class":460},[416,1256,1152],{"class":426},[416,1258,1259],{"class":418,"line":454},[416,1260,1157],{"class":426},[416,1262,1263],{"class":418,"line":485},[416,1264,1265],{"class":426},"    db: {\n",[416,1267,1268,1270,1272],{"class":418,"line":515},[416,1269,1167],{"class":426},[416,1271,1170],{"class":433},[416,1273,1173],{"class":426},[416,1275,1276,1279,1282],{"class":418,"line":520},[416,1277,1278],{"class":426},"      host: ",[416,1280,1281],{"class":433},"\"prod.example.com\"",[416,1283,1173],{"class":426},[416,1285,1286],{"class":418,"line":526},[416,1287,1183],{"class":426},[416,1289,1290],{"class":418,"line":545},[416,1291,1292],{"class":426},"  },\n",[416,1294,1295],{"class":418,"line":566},[416,1296,1297],{"class":426},"  devStorage: {\n",[416,1299,1300],{"class":418,"line":585},[416,1301,1265],{"class":426},[416,1303,1304,1306,1309],{"class":418,"line":590},[416,1305,1167],{"class":426},[416,1307,1308],{"class":433},"\"fs\"",[416,1310,1173],{"class":426},[416,1312,1313,1316],{"class":418,"line":596},[416,1314,1315],{"class":426},"      base: ",[416,1317,1318],{"class":433},"\"./.data/db\"\n",[416,1320,1321],{"class":418,"line":632},[416,1322,1183],{"class":426},[416,1324,1325],{"class":418,"line":1067},[416,1326,1188],{"class":426},[416,1328,1329],{"class":418,"line":1073},[416,1330,1193],{"class":426},[383,1332,1333,1334,1336,1337,1339],{},"When running in development mode, ",[403,1335,1221],{}," mounts are merged on top of ",[403,1338,1110],{}," mounts, allowing you to use a local filesystem driver or an in-memory driver while developing.",[395,1341,1343],{"id":1342},"built-in-mount-points","Built-in mount points",[383,1345,1346],{},"Nitro automatically mounts the following storage paths:",[663,1348,1350],{"id":1349},"assets",[403,1351,1352],{},"/assets",[383,1354,1355,1356,1358,1359,621],{},"Server assets are mounted at the ",[403,1357,1352],{}," base path. This mount point provides read-only access to bundled server assets (see ",[387,1360,1362],{"href":1361},"#server-assets","Server assets",[408,1364,1366],{"className":410,"code":1365,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\n\n// Access server assets via the /assets mount\nconst content = await useStorage(\"assets/server\").getItem(\"my-file.txt\");\n",[403,1367,1368,1380,1384,1389],{"__ignoreMap":5},[416,1369,1370,1372,1374,1376,1378],{"class":418,"line":419},[416,1371,423],{"class":422},[416,1373,427],{"class":426},[416,1375,430],{"class":422},[416,1377,434],{"class":433},[416,1379,437],{"class":426},[416,1381,1382],{"class":418,"line":440},[416,1383,444],{"emptyLinePlaceholder":443},[416,1385,1386],{"class":418,"line":447},[416,1387,1388],{"class":450},"// Access server assets via the /assets mount\n",[416,1390,1391,1393,1396,1398,1400,1402,1404,1406,1408,1410,1412,1415],{"class":418,"line":454},[416,1392,488],{"class":422},[416,1394,1395],{"class":491}," content",[416,1397,495],{"class":422},[416,1399,498],{"class":422},[416,1401,461],{"class":460},[416,1403,470],{"class":426},[416,1405,1089],{"class":433},[416,1407,621],{"class":426},[416,1409,505],{"class":460},[416,1411,470],{"class":426},[416,1413,1414],{"class":433},"\"my-file.txt\"",[416,1416,512],{"class":426},[663,1418,1420],{"id":1419},"default-in-memory","Default (in-memory)",[383,1422,1423],{},"The root storage (without a base path) uses an in-memory driver by default. Data stored here is not persisted across restarts.",[408,1425,1427],{"className":410,"code":1426,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\n\n// In-memory by default, not persisted\nawait useStorage().setItem(\"counter\", 1);\n",[403,1428,1429,1441,1445,1450],{"__ignoreMap":5},[416,1430,1431,1433,1435,1437,1439],{"class":418,"line":419},[416,1432,423],{"class":422},[416,1434,427],{"class":426},[416,1436,430],{"class":422},[416,1438,434],{"class":433},[416,1440,437],{"class":426},[416,1442,1443],{"class":418,"line":440},[416,1444,444],{"emptyLinePlaceholder":443},[416,1446,1447],{"class":418,"line":447},[416,1448,1449],{"class":450},"// In-memory by default, not persisted\n",[416,1451,1452,1454,1456,1458,1460,1462,1465,1467,1470],{"class":418,"line":454},[416,1453,457],{"class":422},[416,1455,461],{"class":460},[416,1457,464],{"class":426},[416,1459,467],{"class":460},[416,1461,470],{"class":426},[416,1463,1464],{"class":433},"\"counter\"",[416,1466,817],{"class":426},[416,1468,1469],{"class":491},"1",[416,1471,512],{"class":426},[383,1473,1474,1475,817,1478,1481,1482,1484],{},"To persist data, mount a driver with a persistent backend (e.g., ",[403,1476,1477],{},"fs",[403,1479,1480],{},"redis",", etc.) using the ",[403,1483,1110],{}," configuration option.",[395,1486,1362],{"id":1487},"server-assets",[383,1489,1490,1491,1494,1495,1498],{},"Nitro allows you to bundle files from an ",[403,1492,1493],{},"assets/"," directory at the root of your project. These files are accessible at runtime via the ",[403,1496,1497],{},"assets/server"," storage mount.",[408,1500,1505],{"className":1501,"code":1503,"language":1504},[1502],"language-text","my-project/\n  assets/\n    data.json\n    templates/\n      welcome.html\n  server/\n    routes/\n      index.ts\n","text",[403,1506,1503],{"__ignoreMap":5},[408,1508,1511],{"className":410,"code":1509,"filename":1510,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\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/welcome.html\");\n\n  return { keys, data, template };\n});\n","server/routes/index.ts",[403,1512,1513,1525,1529,1552,1570,1574,1591,1613,1635,1639,1647],{"__ignoreMap":5},[416,1514,1515,1517,1519,1521,1523],{"class":418,"line":419},[416,1516,423],{"class":422},[416,1518,427],{"class":426},[416,1520,430],{"class":422},[416,1522,434],{"class":433},[416,1524,437],{"class":426},[416,1526,1527],{"class":418,"line":440},[416,1528,444],{"emptyLinePlaceholder":443},[416,1530,1531,1533,1535,1538,1540,1543,1546,1549],{"class":418,"line":447},[416,1532,1143],{"class":422},[416,1534,1146],{"class":422},[416,1536,1537],{"class":460}," defineHandler",[416,1539,470],{"class":426},[416,1541,1542],{"class":422},"async",[416,1544,1545],{"class":426}," () ",[416,1547,1548],{"class":422},"=>",[416,1550,1551],{"class":426}," {\n",[416,1553,1554,1557,1560,1562,1564,1566,1568],{"class":418,"line":454},[416,1555,1556],{"class":422},"  const",[416,1558,1559],{"class":491}," serverAssets",[416,1561,495],{"class":422},[416,1563,461],{"class":460},[416,1565,470],{"class":426},[416,1567,1089],{"class":433},[416,1569,512],{"class":426},[416,1571,1572],{"class":418,"line":485},[416,1573,444],{"emptyLinePlaceholder":443},[416,1575,1576,1578,1580,1582,1584,1587,1589],{"class":418,"line":515},[416,1577,1556],{"class":422},[416,1579,949],{"class":491},[416,1581,495],{"class":422},[416,1583,498],{"class":422},[416,1585,1586],{"class":426}," serverAssets.",[416,1588,964],{"class":460},[416,1590,967],{"class":426},[416,1592,1593,1595,1598,1600,1602,1604,1606,1608,1611],{"class":418,"line":520},[416,1594,1556],{"class":422},[416,1596,1597],{"class":491}," data",[416,1599,495],{"class":422},[416,1601,498],{"class":422},[416,1603,1586],{"class":426},[416,1605,505],{"class":460},[416,1607,470],{"class":426},[416,1609,1610],{"class":433},"\"data.json\"",[416,1612,512],{"class":426},[416,1614,1615,1617,1620,1622,1624,1626,1628,1630,1633],{"class":418,"line":526},[416,1616,1556],{"class":422},[416,1618,1619],{"class":491}," template",[416,1621,495],{"class":422},[416,1623,498],{"class":422},[416,1625,1586],{"class":426},[416,1627,505],{"class":460},[416,1629,470],{"class":426},[416,1631,1632],{"class":433},"\"templates/welcome.html\"",[416,1634,512],{"class":426},[416,1636,1637],{"class":418,"line":545},[416,1638,444],{"emptyLinePlaceholder":443},[416,1640,1641,1644],{"class":418,"line":566},[416,1642,1643],{"class":422},"  return",[416,1645,1646],{"class":426}," { keys, data, template };\n",[416,1648,1649],{"class":418,"line":585},[416,1650,1651],{"class":426},"});\n",[663,1653,1655],{"id":1654},"custom-asset-directories","Custom asset directories",[383,1657,1658,1659,1662],{},"You can register additional asset directories using the ",[403,1660,1661],{},"serverAssets"," config option:",[408,1664,1666],{"className":410,"code":1665,"filename":1118,"language":412,"meta":5,"style":5},"import { defineNitroConfig } from \"nitro/config\";\n\nexport default defineNitroConfig({\n  serverAssets: [\n    {\n      baseName: \"templates\",\n      dir: \"./templates\",\n    }\n  ]\n})\n",[403,1667,1668,1680,1684,1694,1699,1704,1714,1724,1728,1733],{"__ignoreMap":5},[416,1669,1670,1672,1674,1676,1678],{"class":418,"line":419},[416,1671,423],{"class":422},[416,1673,1127],{"class":426},[416,1675,430],{"class":422},[416,1677,1132],{"class":433},[416,1679,437],{"class":426},[416,1681,1682],{"class":418,"line":440},[416,1683,444],{"emptyLinePlaceholder":443},[416,1685,1686,1688,1690,1692],{"class":418,"line":447},[416,1687,1143],{"class":422},[416,1689,1146],{"class":422},[416,1691,1149],{"class":460},[416,1693,1152],{"class":426},[416,1695,1696],{"class":418,"line":454},[416,1697,1698],{"class":426},"  serverAssets: [\n",[416,1700,1701],{"class":418,"line":485},[416,1702,1703],{"class":426},"    {\n",[416,1705,1706,1709,1712],{"class":418,"line":515},[416,1707,1708],{"class":426},"      baseName: ",[416,1710,1711],{"class":433},"\"templates\"",[416,1713,1173],{"class":426},[416,1715,1716,1719,1722],{"class":418,"line":520},[416,1717,1718],{"class":426},"      dir: ",[416,1720,1721],{"class":433},"\"./templates\"",[416,1723,1173],{"class":426},[416,1725,1726],{"class":418,"line":526},[416,1727,1183],{"class":426},[416,1729,1730],{"class":418,"line":545},[416,1731,1732],{"class":426},"  ]\n",[416,1734,1735],{"class":418,"line":566},[416,1736,1193],{"class":426},[383,1738,1739,1740,610],{},"Custom asset directories are accessible under ",[403,1741,1742],{},"assets/\u003CbaseName>",[408,1744,1746],{"className":410,"code":1745,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\n\nconst templates = useStorage(\"assets/templates\");\nconst keys = await templates.getKeys();\nconst html = await templates.getItem(\"email.html\");\n",[403,1747,1748,1760,1764,1782,1799],{"__ignoreMap":5},[416,1749,1750,1752,1754,1756,1758],{"class":418,"line":419},[416,1751,423],{"class":422},[416,1753,427],{"class":426},[416,1755,430],{"class":422},[416,1757,434],{"class":433},[416,1759,437],{"class":426},[416,1761,1762],{"class":418,"line":440},[416,1763,444],{"emptyLinePlaceholder":443},[416,1765,1766,1768,1771,1773,1775,1777,1780],{"class":418,"line":447},[416,1767,488],{"class":422},[416,1769,1770],{"class":491}," templates",[416,1772,495],{"class":422},[416,1774,461],{"class":460},[416,1776,470],{"class":426},[416,1778,1779],{"class":433},"\"assets/templates\"",[416,1781,512],{"class":426},[416,1783,1784,1786,1788,1790,1792,1795,1797],{"class":418,"line":454},[416,1785,488],{"class":422},[416,1787,949],{"class":491},[416,1789,495],{"class":422},[416,1791,498],{"class":422},[416,1793,1794],{"class":426}," templates.",[416,1796,964],{"class":460},[416,1798,967],{"class":426},[416,1800,1801,1803,1806,1808,1810,1812,1814,1816,1819],{"class":418,"line":485},[416,1802,488],{"class":422},[416,1804,1805],{"class":491}," html",[416,1807,495],{"class":422},[416,1809,498],{"class":422},[416,1811,1794],{"class":426},[416,1813,505],{"class":460},[416,1815,470],{"class":426},[416,1817,1818],{"class":433},"\"email.html\"",[416,1820,512],{"class":426},[663,1822,1824],{"id":1823},"asset-metadata","Asset metadata",[383,1826,1827],{},"Server assets include metadata such as content type, ETag, and modification time:",[408,1829,1831],{"className":410,"code":1830,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\n\nconst serverAssets = useStorage(\"assets/server\");\n\nconst meta = await serverAssets.getMeta(\"image.png\");\n// { type: \"image/png\", etag: \"\\\"...\\\"\", mtime: \"2024-01-01T00:00:00.000Z\" }\n\n// Useful for setting response headers\nconst raw = await serverAssets.getItemRaw(\"image.png\");\n",[403,1832,1833,1845,1849,1865,1869,1890,1895,1899,1904],{"__ignoreMap":5},[416,1834,1835,1837,1839,1841,1843],{"class":418,"line":419},[416,1836,423],{"class":422},[416,1838,427],{"class":426},[416,1840,430],{"class":422},[416,1842,434],{"class":433},[416,1844,437],{"class":426},[416,1846,1847],{"class":418,"line":440},[416,1848,444],{"emptyLinePlaceholder":443},[416,1850,1851,1853,1855,1857,1859,1861,1863],{"class":418,"line":447},[416,1852,488],{"class":422},[416,1854,1559],{"class":491},[416,1856,495],{"class":422},[416,1858,461],{"class":460},[416,1860,470],{"class":426},[416,1862,1089],{"class":433},[416,1864,512],{"class":426},[416,1866,1867],{"class":418,"line":454},[416,1868,444],{"emptyLinePlaceholder":443},[416,1870,1871,1873,1875,1877,1879,1881,1883,1885,1888],{"class":418,"line":485},[416,1872,488],{"class":422},[416,1874,1078],{"class":491},[416,1876,495],{"class":422},[416,1878,498],{"class":422},[416,1880,1586],{"class":426},[416,1882,1094],{"class":460},[416,1884,470],{"class":426},[416,1886,1887],{"class":433},"\"image.png\"",[416,1889,512],{"class":426},[416,1891,1892],{"class":418,"line":515},[416,1893,1894],{"class":450},"// { type: \"image/png\", etag: \"\\\"...\\\"\", mtime: \"2024-01-01T00:00:00.000Z\" }\n",[416,1896,1897],{"class":418,"line":520},[416,1898,444],{"emptyLinePlaceholder":443},[416,1900,1901],{"class":418,"line":526},[416,1902,1903],{"class":450},"// Useful for setting response headers\n",[416,1905,1906,1908,1910,1912,1914,1916,1918,1920,1922],{"class":418,"line":545},[416,1907,488],{"class":422},[416,1909,1042],{"class":491},[416,1911,495],{"class":422},[416,1913,498],{"class":422},[416,1915,1586],{"class":426},[416,1917,1053],{"class":460},[416,1919,470],{"class":426},[416,1921,1887],{"class":433},[416,1923,512],{"class":426},[1925,1926,1927],"note",{},[383,1928,1929],{},"In development, server assets are read directly from the filesystem. In production, they are bundled and inlined into the build output.",[395,1931,1933],{"id":1932},"runtime-configuration","Runtime configuration",[383,1935,1936,1937,885],{},"In scenarios where the mount point configuration is not known until runtime, Nitro can dynamically add mount points during startup using ",[387,1938,1939],{"href":49},"plugins",[408,1941,1944],{"className":410,"code":1942,"filename":1943,"language":412,"meta":5,"style":5},"import { useStorage } from \"nitro/storage\";\nimport { definePlugin } from \"nitro\";\nimport redisDriver from \"unstorage/drivers/redis\";\n\nexport default definePlugin(() => {\n  const storage = useStorage()\n\n  // 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    /* other redis connector options */\n  })\n\n  // Mount driver\n  storage.mount(\"redis\", driver)\n})\n","plugins/storage.ts",[403,1945,1946,1958,1972,1986,1990,2006,2020,2024,2029,2043,2052,2062,2072,2077,2082,2086,2091,2107],{"__ignoreMap":5},[416,1947,1948,1950,1952,1954,1956],{"class":418,"line":419},[416,1949,423],{"class":422},[416,1951,427],{"class":426},[416,1953,430],{"class":422},[416,1955,434],{"class":433},[416,1957,437],{"class":426},[416,1959,1960,1962,1965,1967,1970],{"class":418,"line":440},[416,1961,423],{"class":422},[416,1963,1964],{"class":426}," { definePlugin } ",[416,1966,430],{"class":422},[416,1968,1969],{"class":433}," \"nitro\"",[416,1971,437],{"class":426},[416,1973,1974,1976,1979,1981,1984],{"class":418,"line":447},[416,1975,423],{"class":422},[416,1977,1978],{"class":426}," redisDriver ",[416,1980,430],{"class":422},[416,1982,1983],{"class":433}," \"unstorage/drivers/redis\"",[416,1985,437],{"class":426},[416,1987,1988],{"class":418,"line":454},[416,1989,444],{"emptyLinePlaceholder":443},[416,1991,1992,1994,1996,1999,2002,2004],{"class":418,"line":485},[416,1993,1143],{"class":422},[416,1995,1146],{"class":422},[416,1997,1998],{"class":460}," definePlugin",[416,2000,2001],{"class":426},"(() ",[416,2003,1548],{"class":422},[416,2005,1551],{"class":426},[416,2007,2008,2010,2013,2015,2017],{"class":418,"line":515},[416,2009,1556],{"class":422},[416,2011,2012],{"class":491}," storage",[416,2014,495],{"class":422},[416,2016,461],{"class":460},[416,2018,2019],{"class":426},"()\n",[416,2021,2022],{"class":418,"line":520},[416,2023,444],{"emptyLinePlaceholder":443},[416,2025,2026],{"class":418,"line":526},[416,2027,2028],{"class":450},"  // Dynamically pass in credentials from runtime configuration, or other sources\n",[416,2030,2031,2033,2036,2038,2041],{"class":418,"line":545},[416,2032,1556],{"class":422},[416,2034,2035],{"class":491}," driver",[416,2037,495],{"class":422},[416,2039,2040],{"class":460}," redisDriver",[416,2042,1152],{"class":426},[416,2044,2045,2048,2050],{"class":418,"line":566},[416,2046,2047],{"class":426},"    base: ",[416,2049,1170],{"class":433},[416,2051,1173],{"class":426},[416,2053,2054,2057,2060],{"class":418,"line":585},[416,2055,2056],{"class":426},"    host: process.env.",[416,2058,2059],{"class":491},"REDIS_HOST",[416,2061,1173],{"class":426},[416,2063,2064,2067,2070],{"class":418,"line":590},[416,2065,2066],{"class":426},"    port: process.env.",[416,2068,2069],{"class":491},"REDIS_PORT",[416,2071,1173],{"class":426},[416,2073,2074],{"class":418,"line":596},[416,2075,2076],{"class":450},"    /* other redis connector options */\n",[416,2078,2079],{"class":418,"line":632},[416,2080,2081],{"class":426},"  })\n",[416,2083,2084],{"class":418,"line":1067},[416,2085,444],{"emptyLinePlaceholder":443},[416,2087,2088],{"class":418,"line":1073},[416,2089,2090],{"class":450},"  // Mount driver\n",[416,2092,2094,2097,2100,2102,2104],{"class":418,"line":2093},17,[416,2095,2096],{"class":426},"  storage.",[416,2098,2099],{"class":460},"mount",[416,2101,470],{"class":426},[416,2103,1170],{"class":433},[416,2105,2106],{"class":426},", driver)\n",[416,2108,2110],{"class":418,"line":2109},18,[416,2111,1193],{"class":426},[2113,2114,2115],"warning",{},[383,2116,2117,2118,885],{},"This is a temporary workaround, with a better solution coming in the future! Keep a lookout on the GitHub issue ",[387,2119,2122],{"href":2120,"rel":2121},"https://github.com/nitrojs/nitro/issues/1161#issuecomment-1511444675",[391],"here",[2124,2125,2126],"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":440,"depth":440,"links":2128},[2129,2132,2135,2139,2143],{"id":397,"depth":440,"text":398,"children":2130},[2131],{"id":665,"depth":447,"text":666},{"id":1104,"depth":440,"text":33,"children":2133},[2134],{"id":1214,"depth":447,"text":1215},{"id":1342,"depth":440,"text":1343,"children":2136},[2137,2138],{"id":1349,"depth":447,"text":1352},{"id":1419,"depth":447,"text":1420},{"id":1487,"depth":440,"text":1362,"children":2140},[2141,2142],{"id":1654,"depth":447,"text":1655},{"id":1823,"depth":447,"text":1824},{"id":1932,"depth":440,"text":1933},"Nitro provides a built-in storage layer that can abstract filesystem or database or any other data source.","md",{"icon":71},{"icon":71},{"title":68,"description":2144},"Dhm3OI8nVMLGzfnsFCyjolDeAcVeYgYKlHgwSq8HIw0",[2151,2153],{"title":63,"path":64,"stem":65,"description":2152,"icon":66,"children":-1},"Nitro provides a caching system built on top of the storage layer, powered by ocache.",{"title":73,"path":74,"stem":75,"description":5,"icon":76,"children":-1},1773242036464]