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