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