{"_id":"@54145a/storage2","_rev":"11-c8c6ded2e95c9afe7192535895c4917c","name":"@54145a/storage2","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@54145a/storage2","version":"0.1.0","keywords":["localstorage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.1.0","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"686bdb7e34e395bf9f305996e5a4dd6363a07af0","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.1.0.tgz","fileCount":5,"integrity":"sha512-0IA0SbbykGt72EO29/GPfAjhXvX/FqNgBUAOc03mo+ih3ZVDC+LxH5PN1QU9dBcTzUqUUumooiRrjre9ghpcgQ==","signatures":[{"sig":"MEQCIA1zecy4kuiGxlUytDVcUYmZQx24EY1erd4egslgaeD2AiAdpIOhkMXfAMZAsOtcaqc6iIkIvLB1UsLcYvxgJt3QeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41029},"_from":"file:54145a-storage2-0.1.0.tgz","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"C:\\Users\\Austi\\AppData\\Local\\Temp\\864c6527e1c1f2c379a35e40422c1be9\\54145a-storage2-0.1.0.tgz","_integrity":"sha512-0IA0SbbykGt72EO29/GPfAjhXvX/FqNgBUAOc03mo+ih3ZVDC+LxH5PN1QU9dBcTzUqUUumooiRrjre9ghpcgQ==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.6.2","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.1.0_1769266796666_0.3127662156983322","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@54145a/storage2","version":"0.1.1","keywords":["localstorage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.1.1","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"349676e477e5015c01fb86f9f7b422ff1664d903","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.1.1.tgz","fileCount":5,"integrity":"sha512-1+PH4EgmRCmYL4rKKyyiZTx9Q4Rkm1/GJfl33M5ekWv0ErnBNPUNz/Fh9H2gTdcWL/pghhSe8j6NpgXYzy55PQ==","signatures":[{"sig":"MEUCIHMdBDDCWLWME6zJr8ymY3qKkWDDrUSR3AK+f9NZd78mAiEAoZUqq6E6KdavnKQn+9ft4L6MhZew64oHnjj/4xI2Kic=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40876},"_from":"file:54145a-storage2-0.1.1.tgz","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"C:\\Users\\Austi\\AppData\\Local\\Temp\\78a6902cd3904c877360896c69e9f9fb\\54145a-storage2-0.1.1.tgz","_integrity":"sha512-1+PH4EgmRCmYL4rKKyyiZTx9Q4Rkm1/GJfl33M5ekWv0ErnBNPUNz/Fh9H2gTdcWL/pghhSe8j6NpgXYzy55PQ==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.6.2","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.1.1_1769267008536_0.836533872998847","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@54145a/storage2","version":"0.1.2","keywords":["localstorage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.1.2","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"9648de1c02f4516f4d801182cce33b01dda083f1","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.1.2.tgz","fileCount":6,"integrity":"sha512-42xTDL8PvwFBR/DY/iLlZy9Yfp4kGN0J/QoueaAHQ/MBtdQxtS5ximMQqkA2MF8nyoGmRAGd33Ec/UF8rmNStQ==","signatures":[{"sig":"MEUCIQCZC9lIzJeQd2GF3hvF+5OUPZFXqrfSS2C4ngMU2m/uiAIgcaJpomeo/9tzkZF4wzzY6YgfnGVbV3aKVR+fz1t0xsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41754},"type":"module","_from":"file:54145a-storage2-0.1.2.tgz","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"C:\\Users\\Austi\\AppData\\Local\\Temp\\4d12fbcb98c01ae04cbf1757eb7a7093\\54145a-storage2-0.1.2.tgz","_integrity":"sha512-42xTDL8PvwFBR/DY/iLlZy9Yfp4kGN0J/QoueaAHQ/MBtdQxtS5ximMQqkA2MF8nyoGmRAGd33Ec/UF8rmNStQ==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.6.2","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.1.2_1769330659469_0.8697524870979094","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@54145a/storage2","version":"0.2.0","keywords":["localstorage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.2.0","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"c0356f825974d75fa3003e7d1d6eeda0ca795a48","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.2.0.tgz","fileCount":6,"integrity":"sha512-jU0dEKJHN32K9Vyp+BuYJKdEtIP2PQtBvZJv0JUxVMbOBpL2niQdYcnIJfNA6qyRlsXnNICLYKo/XhrSxIqAjw==","signatures":[{"sig":"MEYCIQD5E1HFUJ+fKTR9MHfvk5QjVtiPrZst7hiqbXaKKPoMGAIhAINycjhrt1hJ+zSUTyWenz//h6jD6J5KG6rq+jAaKnRH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":57388},"type":"module","_from":"file:54145a-storage2-0.2.0.tgz","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"C:\\Users\\Austi\\AppData\\Local\\Temp\\8a6b604b1b0e8736e2b41d7a1ac6b043\\54145a-storage2-0.2.0.tgz","_integrity":"sha512-jU0dEKJHN32K9Vyp+BuYJKdEtIP2PQtBvZJv0JUxVMbOBpL2niQdYcnIJfNA6qyRlsXnNICLYKo/XhrSxIqAjw==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.6.2","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.2.0_1769344660194_0.6919516379522457","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@54145a/storage2","version":"0.3.0","keywords":["localstorage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.3.0","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"ee9dc0024f008e8c0202b82ba451f40bea741f8e","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.3.0.tgz","fileCount":6,"integrity":"sha512-VN7xe0BT8i4+Fniesgtw40ZW21F8tC/xpe3QMHkNh0Nu9q0exyfKlWIqcSW4RpX/GprgISQdmPkl2vVzocfVtQ==","signatures":[{"sig":"MEUCIDHhc1aitpTt1a6N+lsRge4DCNSiBvrn3bouyb9HUrnvAiEA7rAeokDLXEV9QCIPCpQUXc+ZOTOcqJ3CcqQ2PpQbaGE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":40743},"type":"module","_from":"file:54145a-storage2-0.3.0.tgz","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"C:\\Users\\Austi\\AppData\\Local\\Temp\\3809e8021ff9ee44c5732410af73d874\\54145a-storage2-0.3.0.tgz","_integrity":"sha512-VN7xe0BT8i4+Fniesgtw40ZW21F8tC/xpe3QMHkNh0Nu9q0exyfKlWIqcSW4RpX/GprgISQdmPkl2vVzocfVtQ==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.6.2","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.2.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.3.0_1770889688260_0.2161580246430077","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@54145a/storage2","version":"0.4.0","keywords":[],"author":"54145a","license":"AGPL-3.0-only","_id":"@54145a/storage2@0.4.0","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"dist":{"shasum":"86f2846caabe572742bfb26647ef9215014a7cda","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.4.0.tgz","fileCount":6,"integrity":"sha512-K7zKZIHT7tvasukY5sdtyAZAEBZg5Aif5bGbdqAZlg4uCzS9v2rmLbK+itrrKexWYqpuKaFnBYQ6y12ojl7xIA==","signatures":[{"sig":"MEYCIQDvswahizvuD2gpijzhY+aTxZ/1DX8x7nLG86xQi7JNegIhAIBwobr4ATUEJsXbZqZynpjp9E0+Zd8YV0MsccW0qZkg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66378},"main":"storage.js","type":"module","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"repository":{"url":"https://github.com/54145a/145Storage2.git","type":"git"},"description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"unstorage":"^1.17.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.4.0_1781880082597_0.11041264861283073","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@54145a/storage2","version":"0.4.1","keywords":[],"author":"54145a","license":"AGPL-3.0-only","_id":"@54145a/storage2@0.4.1","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"dist":{"shasum":"a27c9c067b2a1fd3de31c99f6138c89803a47ed3","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.4.1.tgz","fileCount":6,"integrity":"sha512-mInSFH0R3DnJwnWPH+vWrSD89pyYBHwafh4uzCBU8WXS4XrH+ErPhrjgVrWfN5DaTlz+OT0avoJHoTC0000xsA==","signatures":[{"sig":"MEUCIQD5SF7vEbAqaLzA+l9c2DqN/uaCFY+w3KoswwQs7zI5OAIgb9WqnI1txlQBogjK07SYxu0bfwMp921aIMt4s9TO2Zs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66047},"main":"storage.js","type":"module","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"repository":{"url":"https://github.com/54145a/145Storage2.git","type":"git"},"description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"unstorage":"^1.17.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.4.1_1781914344959_0.4610084115960582","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@54145a/storage2","version":"0.4.2","keywords":[],"author":"54145a","license":"AGPL-3.0-only","_id":"@54145a/storage2@0.4.2","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"dist":{"shasum":"aa6058ed567a1094dd2e3dd8c5244f5defd3f3d8","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.4.2.tgz","fileCount":6,"integrity":"sha512-ECTFqxWXfbyCdPMBc3LJBNcWMTp4zU9ozRRo6axyIhkXVbxX1PlkA870qNzHqiqDfJLXrJE0KSnMTXF0u6mp6Q==","signatures":[{"sig":"MEYCIQDmw3v/ccERZ4Xdn0EC7a5bEj60wurc9W6OSX6xGZ67bgIhAIVu+EaC4IDoysBnWmpUgRXVWh+9FGbB5yH13UqK5oWy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":66358},"main":"storage.js","type":"module","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.js"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"repository":{"url":"https://github.com/54145a/145Storage2.git","type":"git"},"description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"unstorage":"^1.17.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage2_0.4.2_1781915185407_0.6782638772452392","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@54145a/storage2","version":"0.5.0","keywords":[],"author":"54145a","license":"AGPL-3.0-only","_id":"@54145a/storage2@0.5.0","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"dist":{"shasum":"c4824104b7b9920c3680cc9ed4689c88e18af03a","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.5.0.tgz","fileCount":9,"integrity":"sha512-xWO9FgCsQ4BsMWXgUJDKbYsTUGjTbb38Xu/n1NJoFnpCmbuK0EXDKliIdva7sCv5HLoMk2AVbPbayF2azIRzyw==","signatures":[{"sig":"MEUCIF1CvxIzueREIMeOHE/oK39DByifrvg/xcMRO6uCfg5eAiEAtfX1jEUNvxfmHPPXUswbyRxK0cqeuMTD0Ywupso8MMA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83072},"main":"storage.js","type":"module","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.ts","build":"tsgo && node buildDocs.ts","prepublish":"tsgo"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"repository":{"url":"https://github.com/54145a/145Storage2.git","type":"git"},"description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"unstorage":"^1.17.5"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.0.0","@typescript/native-preview":"7.0.0-dev.20260619.1"},"_npmOperationalInternal":{"tmp":"tmp/storage2_0.5.0_1782381837880_0.5037069501404716","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@54145a/storage2","version":"0.5.1","keywords":["145Storage","145 Storage","storage","localStorage","sessionStorage","Web Storage"],"author":{"name":"54145a"},"license":"AGPL-3.0-only","_id":"@54145a/storage2@0.5.1","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"homepage":"https://github.com/54145a/145Storage2#readme","bugs":{"url":"https://github.com/54145a/145Storage2/issues"},"dist":{"shasum":"c270e30a3897c6c53a8ff3bd803e9b024a366889","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.5.1.tgz","fileCount":9,"integrity":"sha512-suGImdSFMJomz0CFCiU25on4JXQsyxm+3uHzKc08NgsdNSPKXztPTFW5zlcctAdLx/E4g5meU7+9mNAD0qomPA==","signatures":[{"sig":"MEUCIQCpIMRbyKexSH7f6f2ppHptdFBTZvEsHRzibtKYud2ryAIgOmQGINQENUKcx25xTj2t6lI4nSWbmo2bJP+v7c9LImc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86485},"main":"storage.js","type":"module","_from":"file:54145a-storage2-0.5.1.tgz","types":"./storage.d.ts","scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.ts","build":"tsgo && node buildDocs.ts","prepublish":"tsgo"},"_npmUser":{"name":"54145a","email":"im145a@outlook.com"},"_resolved":"/tmp/41458b7d4f5b55eb7c693dd189aff1df/54145a-storage2-0.5.1.tgz","_integrity":"sha512-suGImdSFMJomz0CFCiU25on4JXQsyxm+3uHzKc08NgsdNSPKXztPTFW5zlcctAdLx/E4g5meU7+9mNAD0qomPA==","repository":{"url":"git+https://github.com/54145a/145Storage2.git","type":"git"},"_npmVersion":"11.12.1","description":"My localStorage is a Javascript object.","directories":{},"_nodeVersion":"25.9.0","dependencies":{"unstorage":"^1.17.5"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^26.0.0","@typescript/native-preview":"7.0.0-dev.20260619.1"},"_npmOperationalInternal":{"tmp":"tmp/storage2_0.5.1_1782627078146_0.008700193976350024","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@54145a/storage2","version":"0.6.0","description":"My localStorage is a Javascript object.","type":"module","main":"storage.js","repository":{"type":"git","url":"https://github.com/54145a/145Storage2.git"},"keywords":["145Storage","145 Storage","storage","localStorage","sessionStorage","Web Storage","unstorage"],"author":"54145a","license":"AGPL-3.0-only","publishConfig":{"access":"public"},"dependencies":{},"devDependencies":{"@types/node":"^26.2.0","typescript":"^7.0.2","unstorage":"^1.17.5"},"scripts":{"test":"node --experimental-webstorage --localstorage-file=test.db test.ts","build":"tsc && tsc -p scripts/tsconfig.json && tsc -p tsconfig.build.json && node scripts/buildDocs.ts","bench":"node --experimental-webstorage --localstorage-file=/tmp/bench.db scripts/bench.js","site":"pnpm dlx --package typescript@6.0.3 --package typedoc@0.28.20 typedoc --options typedoc.json","prepublish":"tsc -p tsconfig.build.json"},"_nodeVersion":"26.7.0","_id":"@54145a/storage2@0.6.0","dist":{"integrity":"sha512-+8KAs+XgYBGCxd6QkQb0xUEnrjvdF43/mdy/78AmRK4a6hrKjJnnDy2HHIviEbHTjbenCa0mtSpS/isBcxiW+g==","shasum":"b33a3ccb33f07e479366f89d9fc0bd0153177467","tarball":"https://registry.npmjs.org/@54145a/storage2/-/storage2-0.6.0.tgz","fileCount":16,"unpackedSize":122824,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@54145a%2fstorage2@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICPcnJguLf1IiVqYgHwbEKLhrcSzhcAryo/6/Iw3gWExAiEAws3G/lhecrGRJJtI2ZYXk9aKjrHQdfVBkaPaDRQfMFM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e5ee752b-66c3-487e-81b7-88e196757647"}},"directories":{},"maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/storage2_0.6.0_1787062275551_0.9393133861376122"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-24T14:59:56.570Z","modified":"2026-08-18T14:11:16.126Z","0.1.0":"2026-01-24T14:59:56.814Z","0.1.1":"2026-01-24T15:03:28.684Z","0.1.2":"2026-01-25T08:44:19.622Z","0.2.0":"2026-01-25T12:37:40.336Z","0.3.0":"2026-02-12T09:48:08.395Z","0.4.0":"2026-06-19T14:41:22.734Z","0.4.1":"2026-06-20T00:12:25.114Z","0.4.2":"2026-06-20T00:26:25.543Z","0.5.0":"2026-06-25T10:03:58.016Z","0.5.1":"2026-06-28T06:11:18.295Z","0.6.0":"2026-08-18T14:11:15.690Z"},"author":"54145a","license":"AGPL-3.0-only","keywords":["145Storage","145 Storage","storage","localStorage","sessionStorage","Web Storage","unstorage"],"repository":{"type":"git","url":"https://github.com/54145a/145Storage2.git"},"description":"My localStorage is a Javascript object.","maintainers":[{"name":"54145a","email":"im145a@outlook.com"}],"readme":"# 📦 145 Storage 2: My KV is a **plain Object**\n\n[![npm version](https://img.shields.io/npm/v/@54145a/storage2.svg)](https://www.npmjs.com/package/@54145a/storage2)[![license](https://img.shields.io/npm/l/@54145a/storage2.svg)](./LICENSE)[![GitHub stars](https://img.shields.io/github/stars/54145a/145Storage2.svg)](https://github.com/54145a/145Storage2)\n> A lightweight, smart JavaScript storage library that makes state persistence as easy as modifying a plain object.\n\n## Why 145 Storage 2\n\nTired of writing this? 🤮\n\n```javascript\nconst data = JSON.parse(localStorage.getItem(\"settings\"));\ndata.count += 1;\nlocalStorage.setItem(\"settings\", JSON.stringify(data));\n```\n\nBut what if, WHAT IF, you can *just* do **this↓**\n\n```javascript\nsettings.count += 1;\n```\n\n### Core Features\n\n- 🪄 **Deep Reactive Proxy**: Modify any nested property, and it saves automatically.\n- 🏗️ **Innovative Flat Storage**: Breaks down nested JSON objects into flat Key-Value pairs. No need to serialize the entire object just to update a deep property!\n- ⚡ **Smart Debouncing**: Automatically merges frequent writes (like array operations) for extreme performance.\n- 🔒 **Type Safety**: Blocks un-storable values (like `undefined` or `function`) to keep your storage safe.\n- 🌐 **Framework Agnostic**: Works in any vanilla JS or framework environment.\n\n## 🚀 Try it now\n\n```typescript\nimport assert from \"node:assert/strict\";\nimport { WebStorageItemStorage, FlatWebStorage, FlatUnstorage } from \"./storage.js\";\nimport { createStorage } from \"unstorage\";\nimport memory from \"unstorage/drivers/memory\";\n\n\n// #region Test Harness\nasync function test(name: string, fn: () => void | Promise<void>) {\n  console.log(`  ▶ ${name}`);\n  await fn();\n  console.log(`  ✅ ${name}`);\n}\n\nfunction clearLocalStorage() {\n  localStorage.clear();\n}\n// #endregion\n\n// #region WebStorageItemStorage Tests\nconsole.info(\"\\n========================================\");\nconsole.info(\"WebStorageItemStorage\");\nconsole.info(\"========================================\");\n\nawait test(\"should auto-persist data on property set\", async () => {\n  clearLocalStorage();\n  const storage = new WebStorageItemStorage(\"test_settings\", localStorage);\n  storage.data.count = 42;\n  // Allow debounce flush\n  await new Promise((r) => setTimeout(r, 150));\n  const raw = JSON.parse(localStorage.getItem(\"test_settings\") || \"{}\");\n  assert.equal(raw.count, 42);\n});\n\nawait test(\"should load existing data from localStorage\", async () => {\n  clearLocalStorage();\n  localStorage.setItem(\"test_existing\", JSON.stringify({ name: \"alice\", level: 5 }));\n  const storage = new WebStorageItemStorage(\"test_existing\", localStorage);\n  assert.equal(storage.data.name, \"alice\");\n  assert.equal(storage.data.level, 5);\n});\n\nawait test(\"should initialize with empty object when key missing\", async () => {\n  clearLocalStorage();\n  const storage = new WebStorageItemStorage(\"test_missing\", localStorage);\n  assert.deepEqual(storage.data, {});\n});\n\nawait test(\"should persist nested object modifications\", async () => {\n  clearLocalStorage();\n  const storage = new WebStorageItemStorage(\"test_nested\", localStorage);\n  storage.data.user = { name: \"bob\", prefs: { theme: \"dark\" } };\n  await new Promise((r) => setTimeout(r, 150));\n  const raw = JSON.parse(localStorage.getItem(\"test_nested\") || \"{}\");\n  assert.equal(raw.user.prefs.theme, \"dark\");\n});\n\nawait test(\"should handle delete property\", async () => {\n  clearLocalStorage();\n  const storage = new WebStorageItemStorage(\"test_delete\", localStorage);\n  storage.data.a = 1;\n  storage.data.b = 2;\n  await new Promise((r) => setTimeout(r, 150));\n  delete storage.data.a;\n  await new Promise((r) => setTimeout(r, 150));\n  const raw = JSON.parse(localStorage.getItem(\"test_delete\") || \"{}\");\n  assert.equal(raw.a, undefined);\n  assert.equal(raw.b, 2);\n});\n// #endregion\n\n// #region FlatWebStorage Tests\n\nconsole.info(\"\\n========================================\");\nconsole.info(\"FlatWebStorage\");\nconsole.info(\"========================================\");\n\nawait test(\"init should complete without error\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_init\", instance: localStorage });\n  await flat.init();\n  assert.equal(flat.isReady, true);\n});\n\nawait test(\"should store and retrieve a simple value\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_simple\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.count = 10;\n  await new Promise((r) => setTimeout(r, 150));\n  const val = await flat.get`count`;\n  assert.equal(val, 10);\n});\n\nawait test(\"should handle array push with debouncing\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_arr\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.items ??= [];\n  flat.data.items.push(\"a\");\n  flat.data.items.push(\"b\");\n  flat.data.items.push(\"c\");\n  await new Promise((r) => setTimeout(r, 150));\n  const items = await flat.get`items`;\n  assert.deepEqual(items, [\"a\", \"b\", \"c\"]);\n});\n\nawait test(\"template string get should return correct value\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_tpl\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.username = \"charlie\";\n  await new Promise((r) => setTimeout(r, 150));\n  const result = await flat.get`username`;\n  assert.equal(result, \"charlie\");\n});\n\nawait test(\"sync read via proxy after cache clear should work\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_sync\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.val = 99;\n  await new Promise((r) => setTimeout(r, 150));\n  flat.cache.clear();\n  flat.arrayDebouncers.clear();\n  const syncVal = flat.data.val;\n  assert.equal(syncVal, 99);\n});\n\nawait test(\"load() should return synchronously for cached keys\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_loadsync\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.x = 7;\n  await new Promise((r) => setTimeout(r, 150));\n  // Already loaded, so load(\"x\") should be synchronous\n  const result = flat.load(\"x\");\n  assert.equal(result instanceof Promise, false, \"load('x') should be synchronous when cached\");\n  assert.equal(result, 7);\n});\n\nawait test(\"delete should remove a key\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_del\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.toRemove = \"bye\";\n  await new Promise((r) => setTimeout(r, 150));\n  await flat.delete(\"toRemove\");\n  const val = await flat.get`toRemove`;\n  assert.equal(val, undefined);\n});\n\nawait test(\"getSubKeys should list child keys\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_subkeys\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.alpha = 1;\n  flat.data.beta = 2;\n  flat.data.gamma = 3;\n  await new Promise((r) => setTimeout(r, 150));\n  const keys = flat.getSubKeys(\"\");\n  assert.ok(keys.includes(\"alpha\"), `Expected 'alpha' in subkeys, got: [${keys}]`);\n  assert.ok(keys.includes(\"beta\"), `Expected 'beta' in subkeys, got: [${keys}]`);\n  assert.ok(keys.includes(\"gamma\"), `Expected 'gamma' in subkeys, got: [${keys}]`);\n});\n\nawait test(\"getSubKeys on empty FLAT_LINK should return [] not string indices\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_emptylink\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.config = {};\n  await new Promise((r) => setTimeout(r, 150));\n  const keys = flat.getSubKeys(\"config\");\n  assert.deepEqual(keys, [], `Expected empty subkeys for empty FLAT_LINK, got: [${keys}]`);\n});\n\nawait test(\"nested object deep set should auto-persist leaf\", async () => {\n  clearLocalStorage();\n  const flat = new FlatWebStorage({ namespace: \"t_deep\", instance: localStorage });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.config = { display: { brightness: 80 } };\n  await new Promise((r) => setTimeout(r, 150));\n  flat.data.config.display.brightness = 100;\n  await new Promise((r) => setTimeout(r, 150));\n  const brightness = await flat.get`config.display.brightness`;\n  assert.equal(brightness, 100);\n});\n\nawait test(\"multiple namespaces should be isolated\", async () => {\n  clearLocalStorage();\n  const flatA = new FlatWebStorage({ namespace: \"iso_a\", instance: localStorage });\n  const flatB = new FlatWebStorage({ namespace: \"iso_b\", instance: localStorage });\n  await flatA.init();\n  await flatB.init();\n  await flatA.load(\"\");\n  await flatB.load(\"\");\n  flatA.data.key = \"fromA\";\n  flatB.data.key = \"fromB\";\n  await new Promise((r) => setTimeout(r, 150));\n  assert.equal(await flatA.get`key`, \"fromA\");\n  assert.equal(await flatB.get`key`, \"fromB\");\n});\n// #endregion\n\n// #region FlatUnstorage Tests\n\nfunction makeUnstorage() {\n  return createStorage({ driver: memory() });\n}\n\nconsole.info(\"\\n========================================\");\nconsole.info(\"FlatUnstorage\");\nconsole.info(\"========================================\");\n\nawait test(\"unstorage: store and retrieve a simple value\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.count = 10;\n  await new Promise((r) => setTimeout(r, 150));\n  assert.equal(await flat.get`count`, 10);\n});\n\nawait test(\"unstorage: can construct from a storage instance\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.x = 42;\n  await new Promise((r) => setTimeout(r, 150));\n  assert.equal(await flat.get`x`, 42);\n});\n\nawait test(\"unstorage: persists across instances\", async () => {\n  const storage = makeUnstorage();\n  const flatA = new FlatUnstorage({ storage });\n  await flatA.init();\n  await flatA.load(\"\");\n  flatA.data.user = { name: \"alice\", prefs: { theme: \"dark\" } };\n  await new Promise((r) => setTimeout(r, 150));\n\n  const flatB = new FlatUnstorage({ storage });\n  await flatB.init();\n  await flatB.load(\"\");\n  assert.equal(await flatB.get`user.prefs.theme`, \"dark\");\n});\n\nawait test(\"unstorage: namespaces are isolated\", async () => {\n  const storage = makeUnstorage();\n  const flatA = new FlatUnstorage({ storage, namespace: \"ns_a\" });\n  const flatB = new FlatUnstorage({ storage, namespace: \"ns_b\" });\n  await flatA.init();\n  await flatB.init();\n  await flatA.load(\"\");\n  await flatB.load(\"\");\n  flatA.data.key = \"fromA\";\n  flatB.data.key = \"fromB\";\n  await new Promise((r) => setTimeout(r, 150));\n  assert.equal(await flatA.get`key`, \"fromA\");\n  assert.equal(await flatB.get`key`, \"fromB\");\n});\n\nawait test(\"unstorage: load() returns a Promise for async adapters\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.val = 99;\n  await new Promise((r) => setTimeout(r, 150));\n  flat.cache.clear();\n  flat.arrayDebouncers.clear();\n  const result = flat.load(\"val\");\n  assert.equal(result instanceof Promise, true, \"load() should be async for unstorage\");\n  assert.equal(await result, 99);\n});\n\nawait test(\"unstorage: sync read after cache clear throws\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.val = 99;\n  await new Promise((r) => setTimeout(r, 150));\n  flat.cache.clear();\n  flat.arrayDebouncers.clear();\n  assert.throws(() => { flat.data.val; }, /not loaded/);\n});\n\nawait test(\"unstorage: delete should remove a key\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.toRemove = \"bye\";\n  await new Promise((r) => setTimeout(r, 150));\n  await flat.delete(\"toRemove\");\n  assert.equal(await flat.get`toRemove`, undefined);\n});\n\nawait test(\"unstorage: array push with debouncing\", async () => {\n  const flat = new FlatUnstorage({ storage: makeUnstorage() });\n  await flat.init();\n  await flat.load(\"\");\n  flat.data.items ??= [];\n  flat.data.items.push(\"a\");\n  flat.data.items.push(\"b\");\n  await new Promise((r) => setTimeout(r, 150));\n  assert.deepEqual(await flat.get`items`, [\"a\", \"b\"]);\n});\n\nawait test(\"unstorage: requires storage or driver\", () => {\n  // @ts-ignore - testing that missing storage throws\n  assert.throws(() => new FlatUnstorage({}), /storage/i);\n});\n// #endregion\n\n// #region Done\nconsole.info(\"\\n🎉 All tests passed!\");\n// #endregion\n```\n\n---\n\n## 🌍 Unstorage: Any KV Backend as a JSON Object\n\n`FlatUnstorage` adapts an [unstorage](https://unstorage.unjs.io/) instance into a `FlatJSONStorage`. This lets you treat **any** key-value backend — memory, filesystem, Redis, HTTP, Vercel KV, etc. — as a plain nested JSON object:\n\n```typescript\nimport { FlatUnstorage } from \"./storage.js\";\nimport { createStorage } from \"unstorage\";\nimport fsDriver from \"unstorage/drivers/fs-lite\";\n// or memory: import memoryDriver from \"unstorage/drivers/memory\";\n\nconst storage = createStorage({ driver: fsDriver({ base: \"./data\" }) });\nconst flat = new FlatUnstorage({ storage });\n\nawait flat.init();\nawait flat.load(\"\");          // unstorage is async: always await load() or use flat.get`...`\n\nflat.data.user = { name: \"alice\", prefs: { theme: \"dark\" } };\nflat.data.count = (flat.data.count ?? 0) + 1;\n```\n\n### ⚠️ Async & serialization caveats\n\n- **Always async**: unstorage's `getItem`/`setItem` are Promise-based, so direct synchronous reads after a cache miss throw (`Key not loaded ... requires 'await load()'`). Call `await flat.load(\"\")` up front, or use the template-tag getter `await flat.get\\`key\\``.\n- **String round-trip**: unstorage's default serializer stores primitives via `String()` and parses with `destr`. String literals like `\"{}\"`, `\"[]\"`, `\"0\"`, `\"true\"`, `\"null\"` come back as their non-string types — avoid storing those exact strings through `FlatUnstorage`.\n- **Key normalization**: unstorage rewrites `/`, `\\`, `?` and strips leading/trailing `:` in keys. Property names containing those characters will be remapped (and `a/b` collides with `a:b`).\n\n---\n\n## 🧠 Under the Hood: Deep Proxy & Flat Schema\n\nHow does the magic work?\n\n1. **Deep Proxy**: We intercept all `get`, `set`, and `delete` operations on the object, tracking the exact path (e.g., `[\"user\", \"profile\", \"name\"]`).\n2. **Schema-Driven Flat Structure**: In `FlatJSONStorage`, we maintain a schema to flatten nested JSON objects in the storage layer. When you modify `data.a.b.c`, only the `a.b.c` key is updated in the adapter. Say goodbye to the performance nightmare of saving the whole object!\n\n---\n\n## 🗺 Roadmap\n\nThis project is under active development, but the current version is stable and usable.\n\n- [x] Whole JSON Storage (`WebStorageItemStorage`)\n- [x] localStorage / sessionStorage adaptation\n- [x] Flat Storage Engine (`FlatJSONStorage` / `FlatWebStorage`)\n- [x] Any unstorage KV backend (`FlatUnstorage`)\n- [x] Smart debouncing for array operations\n- [x] Schema-based deep property traversal and loading\n- [x] Synchronous read flat storage\n- [x] Docs\n\nThis is the initial roadmap. See Github issues for more incoming.\n\n*(XML storage was planned but dropped. We are focusing on making JSON storage perfect!)*\n\n## 🤝 Contributing\n\nIssues, PRs, and suggestions are super welcome! Let's make state persistence elegant, together!\n\n## 🛠 Development\n\nRepo layout:\n\n- `storage.js` is the **source of truth**: hand-written JS with `//@ts-check` + JSDoc types. There is no `.ts` source; `tsconfig.json` type-checks the project (`storage.js` + `test.ts`) via `checkJs`, `scripts/tsconfig.json` type-checks the tooling scripts, and `tsconfig.build.json` emits `storage.d.ts` from `storage.js` only.\n- `storage.d.ts` is **generated** by `tsc` (`emitDeclarationOnly`) and committed — rebuild, don't hand-edit.\n- `README.md` is **generated** by `scripts/buildDocs.ts` from `README_template.md` + `test.ts` + `storage.d.ts` — edit `README_template.md`, never `README.md`.\n- `test.ts` is the only test file (plain `node:assert` + console runner, no test framework).\n- `typedoc.json` builds the showcase site with **TypeDoc** (API docs from the `storage.js` JSDoc, this README as front page) — `buildDocs.ts` runs it via `pnpm site`, so `pnpm build` outputs `docs/dist` in one flow.\n\n## 📚 Reference\n\n```typescript\n/**\n * @author 145a\n * @license AGPL-3.0\n */\nexport type DeepProxyHandler = {\n    has?: (target: Object, key: string) => boolean;\n    get?: (target: Object, key: string, receiver: Object) => any;\n    set?: (target: Object, key: string, value: any, receiver: Object | undefined) => boolean;\n    deleteProperty?: (target: Object, key: string) => boolean;\n    ownKeys?: (target: Object, key: string) => string[];\n    getOwnPropertyDescriptor?: (target: Object, key: string, prop: string | symbol) => PropertyDescriptor | undefined;\n};\n/**\n * @typedef {object} DeepProxyHandler\n * @property {(target: Object, key: string) => boolean} [has]\n * @property {(target: Object, key: string, receiver: Object) => any} [get]\n * @property {(target: Object, key: string, value: any, receiver: Object|undefined) => boolean} [set]\n * @property {(target: Object, key: string) => boolean} [deleteProperty]\n * @property {(target: Object, key: string) => string[]} [ownKeys]\n * @property {(target: Object, key: string, prop: string | symbol) => PropertyDescriptor | undefined} [getOwnPropertyDescriptor]\n */\n/**\n * @see createDeepProxy\n */\ndeclare class DeepProxyWrapExempt {\n    value: any;\n    /**\n     * @param {*} value\n     */\n    constructor(value: any);\n}\n/**\n * Creates a deep Proxy that reports every property access as a dot-separated key\n * (e.g. `\"user.profile.name\"`) to `handler`, nesting a proxy for each object.\n * Symbol properties are prohibited (except the 15 ECMAScript built-in Symbols\n * like `Symbol.iterator`, `Symbol.toPrimitive`, etc.). User-defined Symbols\n * trigger a `console.assert` notice and are silently ignored — they never\n * reach `handler`. This is by design: JSON storage cannot serialize Symbols.\n * @param {object} target\n * @param {DeepProxyHandler} handler\n * @param {string} [currentKey=\"\"]\n * @returns {*}\n */\ndeclare function createDeepProxy(target: object, handler: DeepProxyHandler, currentKey?: string): any;\ndeclare class StorageInterface {\n    scheduledUpdate: boolean | undefined;\n    /**\n     * @param {*} observed\n     * @returns {*}\n     */\n    static getRaw(observed: any): any;\n    constructor();\n    /** @returns {Promise<void>|void} */\n    init(): Promise<void> | void;\n    isReady: boolean;\n    assertReady(): void;\n    /** @type {any} */\n    _data: any;\n    get data(): any;\n    /** @type {ReturnType<typeof setTimeout>|undefined} */\n    updateTimerID: ReturnType<typeof setTimeout> | undefined;\n    update(): Promise<void>;\n}\n/**\n * A storage wrapper that buffers writes: mutations are flushed to `updator` at most\n * once per `updateDelayMs` (default 100ms) after the last change. Reads always come\n * from the in-memory cache (immediately visible); the raw backing store lags by up\n * to `updateDelayMs`. Wait that long before asserting on the raw storage.\n */\ndeclare class DebounceStorage extends StorageInterface {\n    updator: (value: any) => Promise<void> | void;\n    updateDelayMs: number;\n    /**\n     * @param {Exclude<any, undefined>} initialValue\n     * @param {(value: any)=>Promise<void>|void} updator\n     * @param {number} updateDelayMs\n     * @param {boolean} structuredCloneExempt Use raw initialValue as cache. DO NOT MODIFY THE OBJECT EVER IF YOU ENABLE THIS.\n     */\n    constructor(initialValue: Exclude<any, undefined>, updator: (value: any) => Promise<void> | void, updateDelayMs?: number, structuredCloneExempt?: boolean);\n    /** @returns {Promise<void>|void} */\n    init(): Promise<void> | void;\n    /** @protected */\n    protected _cache: {};\n    get cache(): {};\n    scheduledUpdate: boolean;\n    abort(): void;\n    update(): Promise<void>;\n    requestUpdate(): void;\n}\ndeclare class JSONDebounceStorage extends DebounceStorage {\n    /**\n     * @param {object} initialValue\n     * @param {(value: Object)=>Promise<void>|void} updator\n     * @param {{updateDelayMs?: number, structuredCloneExempt?: boolean,\tonSet?: (value: Object, key: string)=>void}} options\n     */\n    constructor(initialValue: object, updator: (value: Object) => Promise<void> | void, { updateDelayMs, structuredCloneExempt, onSet }?: {\n        updateDelayMs?: number;\n        structuredCloneExempt?: boolean;\n        onSet?: (value: Object, key: string) => void;\n    });\n    /** @type {ReturnType<typeof createDeepProxy>} */\n    _data: ReturnType<typeof createDeepProxy>;\n}\nexport type FlatStorageAdapter = {\n    get: (key: string) => Promise<any> | any;\n    set: (key: string, value: any) => Promise<void> | void;\n    delete: (key: string) => Promise<void> | void;\n};\nexport type FlatSchemaValueType = \"0\" | \"{}\" | \"[]\";\ndeclare class FlatJSONStorage extends StorageInterface {\n    /** @type {FlatStorageAdapter} */\n    adapter: FlatStorageAdapter;\n    /** @type {{ [k: string]: any }} */\n    schema: {\n        [k: string]: any;\n    };\n    /** @type {Map<string, any>} */\n    cache: Map<string, any>;\n    /** @type {Map<string, string[]>} */\n    _splitCache: Map<string, string[]>;\n    /** @type {Map<string, Function>} */\n    _accessorCache: Map<string, Function>;\n    /** @type {Map<string, JSONDebounceStorage>} */\n    arrayDebouncers: Map<string, JSONDebounceStorage>;\n    /** @type {WeakMap<JSONDebounceStorage, DeepProxyWrapExempt>} */\n    _arrayWrappers: WeakMap<JSONDebounceStorage, DeepProxyWrapExempt>;\n    /**\n     * @type {DeepProxyHandler & { set: NonNullable<DeepProxyHandler[\"set\"]>}}\n     * @readonly\n     */\n    _handler: DeepProxyHandler & {\n        set: NonNullable<DeepProxyHandler[\"set\"]>;\n    };\n    schemaStorage: JSONDebounceStorage | undefined;\n    /**\n     * @param {FlatStorageAdapter} adapter\n     * @param {object} [options]\n     * @param {string} [options.namespace]\n     */\n    constructor(adapter: FlatStorageAdapter, options?: {\n        namespace?: string;\n    });\n    /** @override */\n    init(): Promise<void>;\n    /**\n     * @param {string} key\n     */\n    _clearCache(key: string): Promise<void>;\n    /**\n     * @param {string} [key=\"\"]\n     * @returns {string[]}\n     */\n    getSubKeys(key?: string): string[];\n    /**\n     * @param {string} key\n     */\n    _deleteSchemaNode(key: string): void;\n    /** @param {string} key */\n    _getSchemaNode(key: string): any;\n    /**\n     * @param {string} key\n     * @returns {DeepProxyWrapExempt}\n     */\n    _getArrayWrapper(key: string): DeepProxyWrapExempt;\n    /**\n     * @param {string} key\n     * @param {any[]} [initialArr]\n     * @returns {JSONDebounceStorage}\n     */\n    _getArrayDebouncer(key: string, initialArr?: any[]): JSONDebounceStorage;\n    /**\n     * @param {string} key\n     */\n    _abortArrayDebouncer(key: string): void;\n    /**\n     * Loads a key (or subtree) from the adapter into the cache, returning the value.\n     * Synchronous when the key is already cached (or the adapter is synchronous);\n     * returns a Promise otherwise. On an async adapter, reading `flat.data.<key>`\n     * after a cache miss throws `Key not loaded ... 'await load()'` — await this first.\n     * @param {string} [key=\"\"]\n     */\n    load(key?: string): any;\n    /**\n     * Template-tag getter: `flat.get\\`count\\`` or `flat.get\\`config.display.brightness\\``.\n     * Always async — awaits `load()` and returns the value (array keys unwrap to the raw array).\n     * @param {readonly string[]} strings\n     * @param {readonly any[]} keys\n     */\n    get(strings: readonly string[], ...keys: readonly any[]): Promise<any>;\n    /**\n     * @param {string} key\n     */\n    delete(key?: string): Promise<void>;\n}\ndeclare class WebStorageItemStorage extends JSONDebounceStorage {\n    /**\n     * @param {string} itemName\n     * @param {Storage} instance\n     * @param {number=} updateDelayMs\n     */\n    constructor(itemName: string, instance: Storage, updateDelayMs?: number | undefined);\n}\ndeclare class FlatWebStorage extends FlatJSONStorage {\n    /**\n     * @param {object} options\n     * @param {string} [options.namespace]\n     * @param {Storage} options.instance\n     */\n    constructor(options: {\n        namespace?: string;\n        instance: Storage;\n    });\n}\ndeclare class FlatUnstorage extends FlatJSONStorage {\n    /**\n     * @param {object} [options]\n     * @param {ReturnType<typeof import(\"unstorage\").createStorage>} [options.storage] An unstorage instance.\n     * @param {string} [options.namespace]\n     */\n    constructor(options?: {\n        storage?: ReturnType<typeof import(\"unstorage\").createStorage>;\n        namespace?: string;\n    });\n}\nexport { WebStorageItemStorage, StorageInterface, FlatJSONStorage, FlatWebStorage, FlatUnstorage };\n```\n","readmeFilename":""}