{"_id":"@asaidimu/utils-persistence","_rev":"42-49664162fd56afb21dee4a2d391b9f96","name":"@asaidimu/utils-persistence","dist-tags":{"latest":"7.0.2"},"versions":{"1.0.0":{"name":"@asaidimu/utils-persistence","version":"1.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@1.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"aefd9124e4752e524d4efcb3b490c4eae1859b97","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-1.0.0.tgz","fileCount":7,"integrity":"sha512-g5KCVNbE/F/76jPgrZjTRnEy30i0UiVNYp3e50QsfDbxOAPCRcVd7MNDpY2JSFEPQvgIKDAk+UrTG/E8vn74/A==","signatures":[{"sig":"MEUCIE8IFYwVs5vC8Ak1XJ0T4CigfEPP7gP1uyIPorDmgXf5AiEAopi/zZSDAt3L2Lp5M63NZyXEMU+A4eWJVQTMOkSTLXE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224811},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7b6916ad2f3bd61a5c19087aac785d7bf7f05107","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"../../dist/persistence"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_1.0.0_1749238031566_0.9091701147488753","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@asaidimu/utils-persistence","version":"2.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"a5b7c0bfd84976ca8452d3b6b7bbda56cb532a00","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.0.0.tgz","fileCount":2,"integrity":"sha512-Wl5N8Vtpwp24mER3iq1+vXzS+SQjqoieV/rKQsClSNqCGDno3iDJ5OJ3rUdxEeBg+t9bG5Av4DTLOURHAfJaTw==","signatures":[{"sig":"MEYCIQCZbbvJzFkfzoeTA5gVZVpRu/mCuH4hSJi72G0tnM1VOQIhAKaBXfyJ9EFQdWkSX8Ovu34f9GaVjckhsIs4zkeDr0iE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55870},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"134b13902b1ecca784830f253227c0744d20bd18","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"."}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.0.0_1749243184331_0.7201312990369746","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@asaidimu/utils-persistence","version":"2.0.1","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"ed86d6a8efbba2016d9c120bc3e8f18367664262","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.0.1.tgz","fileCount":7,"integrity":"sha512-gYNfBgtIxj1vVbh7s+WBNVayzXomnAdqC1dJTA44z/wf9QFbCMTKy1PvLee1Lgyc8OhXJQE+2lpVdVcLNcfGOQ==","signatures":[{"sig":"MEQCIF+lJHFKTiIJmGiOJjmDBNu8iXUkBuFBVdbXOzABJEC1AiB1kP+JVWjNMlB/9adoXhveMh2Svfx5jNDIspPNGeEmmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":225388},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"e0ecf498266ac5c407380c959b223b86f387f274","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.0.1_1749281361731_0.8002401392464251","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@asaidimu/utils-persistence","version":"2.0.2","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.0.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"c342e49fcc53bd60450947ec31a34cbb07469d2b","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.0.2.tgz","fileCount":7,"integrity":"sha512-WHAw+1VHnVOuadWsVsdE5ol66rPJKdICCyFzVbMwFqQ0X262OJZGC+aqVrJAutSdnEKvsVjOFl9vc71/3IRgLQ==","signatures":[{"sig":"MEYCIQDY3Tuu5fmauKoJRU2Ar7rJ3Yx31f1i85d/S33VptcgfAIhAIOa2Jr2dA9Lcc2OTullAuOdfIDoEFsPjtSkxUp8pvyK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118268},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"94096fb2a49b3150b3ac874e0311bbe77257aafa","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.0.2_1749297583782_0.8665241200926124","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@asaidimu/utils-persistence","version":"2.0.3","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.0.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"3031ebd52d0e0029f8b5942c05e9b55cd5121f58","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.0.3.tgz","fileCount":7,"integrity":"sha512-6HBq+COSITSaCtPuH8HhNpasHqVyadWhnS+SMA9PUbJn9KgkW1uyXEt5nF7zmgYwPWiXMJZ9eA49oD4vvN5bzg==","signatures":[{"sig":"MEYCIQC23sBkVlqcZAcpJjrq1Wn6iUkOeYYV5i/YskdkMm3F+QIhALVXX+NfMQMJRFV8OxScedgTG4Xn59aiWn6U1CSnYf5t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118153},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7064b72c065d29cb48dc5256ca39c9d4f0189449","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.0.3_1749297993536_0.21389913156128726","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@asaidimu/utils-persistence","version":"2.0.4","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.0.4","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"0fbf24b5cc8a945c791baf458a8ecc33dd7c7957","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.0.4.tgz","fileCount":7,"integrity":"sha512-fVExjVn+ZjFbjnYD4PgQK81j1YOk0o0uDtjCUUFhaq8O1pqmDRzeWmYQ//ELeBYtGA/JEPWgNGwOgXWqE3bIDA==","signatures":[{"sig":"MEUCIBrgfl1XnoWYzJxDCna3WmuaIerwtOaB/ig4cnz/NkScAiEAw63ITMH0pI5q18lZK1miz2eWU8N7r9LqDmz0nzBxJjI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":94418},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"4ed0782fa896ebc95cda2c6480aac7e44db8ad5e","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.1","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.0.4_1749298761106_0.9590766565414532","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@asaidimu/utils-persistence","version":"2.1.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.1.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"c6680c10dda49e2eac862070904edf8d095184f1","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.1.0.tgz","fileCount":7,"integrity":"sha512-zdK7vioJ2pmUFy7EB7eggrfzfjxUSEHKuC/xWVfwPq3PmOswGg2G9gqg1NrJssENczzqf5gSA8htJ/ZObHPzLA==","signatures":[{"sig":"MEUCIE5w5njUkcwCwYTUUExbZ/JO3WCHx5+8U3w9uS9Y6pfYAiEA/gnyBsFve0BmZ02m7lblmtFve+vSST5x3Lbp9FiTPrg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106780},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"6b04c6e313ef1aa5348cb9905938e7cadd08dc3a","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.1.0_1757663465941_0.12202233590431733","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@asaidimu/utils-persistence","version":"2.2.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.2.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"5cfdbed68e8a486158472191fa5de2936005ae33","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.2.0.tgz","fileCount":7,"integrity":"sha512-Mf/R1ajSHwtDIBgldPTKtv0jtadCMvWJ0RbjX7nR7ws9j4gjOcLDqzTmKXl6FcWpO0B/GjWILqnwhdFFDUaRkQ==","signatures":[{"sig":"MEYCIQCPA9Z0+Nzmq6PeEpwLEwi7k0GnM/0JJFShcVi2rN20OwIhAMgfVfGsvQ6fSCJGbqROW4AIZerENpym26/ciDu1OR5z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106710},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"8c125836c5c73c3f5ce54a6aad2fd630970f7189","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.2.0_1758284656712_0.9962010919561366","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@asaidimu/utils-persistence","version":"2.2.1","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.2.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"9a629df96ea19c36e3b34419873a8c76c9344c68","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.2.1.tgz","fileCount":7,"integrity":"sha512-oU3EHNmLMucWaGlkTyn3f2NN4jh6aJ1vyOSaXdL3kJEfdkEGAex7lqvmzB4k7/tcCMTaEmfpgvVqcgiSSw9kcA==","signatures":[{"sig":"MEQCIHv8ovhYyC9EJOUHrm8a8G5lh/xh/YdWiHda+fjzUfDGAiAj8THz+Dm9dqOI30oXSL7cKQ3bL8Lfdn6l2yjB3dVQpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":82925},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"898a422cea7ee66689283f62cb8509e39e416df4","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.2.1_1758622913761_0.6105016169557644","host":"s3://npm-registry-packages-npm-production"}},"2.2.2":{"name":"@asaidimu/utils-persistence","version":"2.2.2","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@2.2.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"3b091a9635b8f2f209e92b5b61390ecc3c77945c","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-2.2.2.tgz","fileCount":7,"integrity":"sha512-iZUPSGd2SJN4rl5ue8hdEjTpJKE6ywIPnkA/I0wKmY4zUyfZQMtAdisixF3JMZnePiogH/H7q5Q/9Cua1bwy6Q==","signatures":[{"sig":"MEYCIQCqmHSSheqJRjUJj9WKhGi2WcvJKQQOq2x+ozcHM7ivhQIhAMYQBZsV4gqy5vpdckrCcIHx8smqCjkIg5hGv6qezy/R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":117313},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"377c47ae9e56b9f568febdb056374d386eb926e2","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.5","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_2.2.2_1758626891480_0.7659685228447923","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@asaidimu/utils-persistence","version":"3.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@3.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"47d3944e728182ac1ba34b79fa22462601e87f59","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-3.0.0.tgz","fileCount":7,"integrity":"sha512-ntx9zFoAxToird45plQTYD5fIt1V8LeOR2coDk9OaU9rYZ/jWsC6846KwVLEsvzk1ywSiKehkU4vmrmyPKuTXw==","signatures":[{"sig":"MEQCIHg5BHU6GQZGxsN4GyM7ihqhFGMp6N1GqCHA7t2bD9+DAiBWZzgkkiBKjK5CwTCp9u5EuOK1DIb4dZqZphOSiKd38w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118265},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"e7ecd62c4d91356005d866b9cdc0e0aad22ba7d2","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.19.6","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_3.0.0_1767043066411_0.8106060468663157","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@asaidimu/utils-persistence","version":"4.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@4.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"b4d6dd0391d664c3bdaee2c3ac58c1475adde0d4","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-4.0.0.tgz","fileCount":7,"integrity":"sha512-sgfsQfTToE4c0uKDQKXJeoBLP0vDrY2yUk8SyzP5+/KIbvJ/k90YXkd/kTZqcL+J3Mrx8hlzALESphnpYxWy0A==","signatures":[{"sig":"MEUCIQDoNtqzjXOVctjRlxnsFJ+RkQjOM3VeWfBmx2p7aVcjxAIgZw6v3B6L3O9dA/FsuMt21hQB9c0Aj4cyQM9zLOjBwKY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118373},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"9edea9e043582c6bfdb2228930ace4e76130b135","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.0","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/events":"^1.1.1","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_4.0.0_1773069061137_0.7898550404335947","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@asaidimu/utils-persistence","version":"5.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@5.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"fb2ca2a80e3ea483a25d35fb0e14d4f920cb7174","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-5.0.0.tgz","fileCount":7,"integrity":"sha512-4uYXfnn8Ml2N09Rhn2oSAybqvdrimOLbSqfoB53h9Rm6ZzIxcCD0WIO6uI8stceQx9W96iEIhz//+j7+tbwSGw==","signatures":[{"sig":"MEUCIAnWtr4ir5YwY31VuXAylFtGoPgJJ063QZ5pAqJumCFTAiEA6/jWF0a9i0VJRllZ15pqmpOJC/sJrUXJD8enACzCJYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296987},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"74300be47974cab8cd38e00ffc50e3fb7ca8fbc4","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_5.0.0_1776765623846_0.6095519307306425","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"name":"@asaidimu/utils-persistence","version":"5.0.1","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@5.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"27f181ea9c1e9826c3a8f8ba5fded1c155af817a","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-5.0.1.tgz","fileCount":7,"integrity":"sha512-bV4uJB12v3TB2HZFfnZDzal/DTaSbsGEndz9V/BdQyf0rMKTwCHGRtKp7vPgXUKq8zQIJp/gMrlggAWEVUDVdg==","signatures":[{"sig":"MEYCIQDiuJGhVLvtIs3tFWhj3WA4rA4tXOWNnABLbB9dFnWOyAIhAIZo4u8W6ylvtIfhRhqI+VhmviBv6OnYOxy2bRs8PTjQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294198},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"89155026757d040d2b63899ecfa841eec3881534","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_5.0.1_1776875340565_0.1542509080610588","host":"s3://npm-registry-packages-npm-production"}},"5.0.2":{"name":"@asaidimu/utils-persistence","version":"5.0.2","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@5.0.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"162c5364b5a320742851c0d8626a1a82edcb5426","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-5.0.2.tgz","fileCount":7,"integrity":"sha512-7y1gP9fHPoAsTUr2axI2E7+o+t2GfD50g1RQroSv11UDRohZaNHANJk9IFxz60Xwx1fb9BdXINZ6iFaU3+GVhg==","signatures":[{"sig":"MEYCIQCWmX3Q8qefxZ8GrxWYI/AluN50DAtW2hM1PMN1zS6/TgIhAMuSagEcS84TDJCHyAnGP4wOoFf7wNSHsUsivzqTqVGW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296844},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"fe75f45d032e98fac44f5df77b86652bba6c51ad","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_5.0.2_1776929503642_0.4609058433227209","host":"s3://npm-registry-packages-npm-production"}},"6.0.0":{"name":"@asaidimu/utils-persistence","version":"6.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"871ab68647d9ad0626e29c0fb394e3a75b0f8168","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.0.0.tgz","fileCount":7,"integrity":"sha512-LPLZYdOeZzdwxN1wYe8wY9/+3yaj+XcuulSVcEa5MMxRtHw0J/7s7uAlhnnmtjk6YtTzfxTO0wdhMn3pika/8w==","signatures":[{"sig":"MEUCIQC3ILfJvNfrtJmGaMWJ4DkGYGz5sM9XvKOTSO8JK5yFJgIgNXKZ+4wjVOlXmwG5/2i2ggLC2Yl7udiX9cAO8AdGUDU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298905},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"ceb7ac7ff5c55bc9fd6f8c0e5360dcc9c53d32e3","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.0.0_1777907950946_0.5180082544083229","host":"s3://npm-registry-packages-npm-production"}},"6.1.0":{"name":"@asaidimu/utils-persistence","version":"6.1.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"561c80005f174c0bb83c5be7f75ec853bb171cc7","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.0.tgz","fileCount":7,"integrity":"sha512-dts11UjndU35rMg5zdrvyMIhOMSjaKijtO4jbnrEHhNXfuceML3iJeipO8RmoDWKOrDLxpPdq/LUuKfNQf3hTw==","signatures":[{"sig":"MEUCIQD+VcoUaUps14wS/86Frfwt6UKmO0+vYct3IoOQbVDjEQIgQSby9vlc9P9PXecD8BoNn8ygsvwZGJNW0kN+9M0PzxI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":299086},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"082a10000ad3f88c187a56c46adc26d53105b8c2","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.0_1778141779264_0.3099159194814982","host":"s3://npm-registry-packages-npm-production"}},"6.1.1":{"name":"@asaidimu/utils-persistence","version":"6.1.1","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"d6f12eca2b699eca1e5c15180b6805faee343450","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.1.tgz","fileCount":7,"integrity":"sha512-f8HgWrfCIx6Jt/RfsdBOozEHxzSAjCjvE7jFNFrSj8RN1QgS36hva+cC03kwq632FT3UotpBduc6LhKppwCcvw==","signatures":[{"sig":"MEQCIEk+zq0ARJ/5JucjcVTdOGYC4gj+4opXlO3chrpYGPgjAiA7PygE6Mzbd3XwVbFOlw8e7I99zCJVxHYY1THx3lwuTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115117},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"0666cecddd1d30d04ba9765f56a23d1173e681a0","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.1.0","@asaidimu/utils-database":"^3.1.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.1_1778147470922_0.13617335856797652","host":"s3://npm-registry-packages-npm-production"}},"6.1.2":{"name":"@asaidimu/utils-persistence","version":"6.1.2","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"d39095e0863ecf6ee9db85522ebd7fa17a988c9b","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.2.tgz","fileCount":7,"integrity":"sha512-HHqXiktKBsbX21yx6tbZrSTXsWSWwNpr1tvvKA4AR1B/e5bwT+NEpgOmM+5CKMNUx94c+4G4jMgU2gVQeULX3w==","signatures":[{"sig":"MEUCIC2NwBcypRfTv+dbr53WupltucRIDbYfhHjasbeeYgq/AiEAwctl1j2YzWjhomL6UzAVSAc3JJz9xCO6FcIvMjCYtTE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125521},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"84a5d2195f2d662baf5018b4331457dbbf764e7e","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.1"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.2_1778232095479_0.08390692740661954","host":"s3://npm-registry-packages-npm-production"}},"6.1.3":{"name":"@asaidimu/utils-persistence","version":"6.1.3","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"1994aaff571ecff2c3c89d2df734700781fe8082","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.3.tgz","fileCount":7,"integrity":"sha512-NemZLZiKU9GtDzYJ+zX2OTNr+5eRYqAkYyxFqlWZNqA0GkyYHgRczDoBThQZ1fyEoj8XXTZ+X1lmj39k4iWx4w==","signatures":[{"sig":"MEQCIGUCRo2l0fCQB4Cw5hwlh+xwcnhawHEv/wGkrUDulakoAiBK+fgiIRQRWpfvSw6Gxa5d6FlDjGbND3zwr1LzVcwWPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125519},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"9160ec5ee9c10234f126cf2388baa93df6b3203e","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"1.1.0","@asaidimu/utils-database":"3.1.2"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.3_1778240318371_0.9460905785600653","host":"s3://npm-registry-packages-npm-production"}},"6.1.4":{"name":"@asaidimu/utils-persistence","version":"6.1.4","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.4","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"8c7706bee2f0481de1bd61581593fdf797995b65","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.4.tgz","fileCount":7,"integrity":"sha512-R3jyeGDQsMbhmKktd1fwisoPelZSG7E+tnB+BloNm6O8lIicPtU1yK3h3X91bdEVzKarzC+c9D2k1s5pQ3gasw==","signatures":[{"sig":"MEYCIQCzTIUQNXpYB5zxw/HPId+pRalju1hjZf4SsnFrxs2ZRQIhANN2AVZPcTdGoJRuCceqhzsPmqjVOnyxlrNHzmxW3HVJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125519},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"b8bd4860b27612a5f66fdf6c0a338876e349db42","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"1.1.0","@asaidimu/utils-database":"3.1.3"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.4_1778307359180_0.2547417673040393","host":"s3://npm-registry-packages-npm-production"}},"6.1.5":{"name":"@asaidimu/utils-persistence","version":"6.1.5","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.5","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"c7797d921387908f789185221d7133d96c972e4f","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.5.tgz","fileCount":7,"integrity":"sha512-lj9ITtgGyeDtb16OqwuHJ5DFnzhMecXgzImneE1zEaDzzn++KVKfbGTcMuzEn+Qj2Lhx+vkb8ExfiWWoGMVE7w==","signatures":[{"sig":"MEUCIQDPYOJV4jHKRFtvsatCNdNbyp8LOs3ewouXJjP6WDK6bgIgX9fcbhRjZkiFu8dkQpp7BijOW6pgOrMEm00ge3D6w1I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135597},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7d3ba49470d8542fa1bcefc44fe2facae20c3c55","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"1.1.0","@asaidimu/utils-database":"3.1.4"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.5_1778308049420_0.7765064121575846","host":"s3://npm-registry-packages-npm-production"}},"6.1.6":{"name":"@asaidimu/utils-persistence","version":"6.1.6","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.6","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"e891ac6b960304a465e420c238eeae564aa83d53","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.6.tgz","fileCount":7,"integrity":"sha512-J8Rkn1UYDfPUV7lxxjIKrayEU9ukcd/rCU81yeeB5DzKs/FMFowb89dY/FBdV2DKJpZKMNSuBFBXq2PJHriQww==","signatures":[{"sig":"MEQCIAFt+lNYuzsPYtep2A7GkWeoybm0f5SLZDUQRCmVUm07AiAaKm/Rq0LXixe84TI/FyM+xsQqEqdinArqMN9jPs3VLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135599},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"45db7562944ee7dd9175a8e8d851686b4feebaf1","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.2"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.6_1778656953405_0.9353128932922077","host":"s3://npm-registry-packages-npm-production"}},"6.1.7":{"name":"@asaidimu/utils-persistence","version":"6.1.7","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.7","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"8544cca53e704bf22effaa3a7deb524e1bfea9fe","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.7.tgz","fileCount":7,"integrity":"sha512-ST0aXE47pcdiamj1XiZtmDmkrmYcPKj8aU4jwxai7KQyHwrs/smzaxhG4JX6Y9/gczc+1G2sz0ZFpxPgC9oumg==","signatures":[{"sig":"MEUCIQCfkxtBe17YIWwgBG9MIDGI6OTHkoi8XqPLm82+Ztdj0AIgVb2TNrZn1SOYkB9D2oEi4Qeuya8QV6KI4+B/JM0Z1MM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145871},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"5d9f13b01bc6d0c551b2a5990058c66abf089f46","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.5"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.7_1779712237341_0.21982959583250494","host":"s3://npm-registry-packages-npm-production"}},"6.1.8":{"name":"@asaidimu/utils-persistence","version":"6.1.8","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.8","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"bd9d7fefd49477c96067732b64cf10499df20442","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.8.tgz","fileCount":7,"integrity":"sha512-McfkfFerEzZCe5Hg5sCV7XBDBnwth6hmLRrcLMGko7dM1ha9YsJ0Mew8300DAmjSPT5QneYAvxVek0oN3Ag7EQ==","signatures":[{"sig":"MEUCIDuyjAwiJl9PsjopmmWUAqckF6ldCsmCb7xdULCCRL7iAiEA6UC14Wu/UAIKiv9cObbGlJ8RM0nYcL5ug217CHJPmC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146281},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"f7d6c04038b5d355280ec4b58355d5cb0eccb740","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.5"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.8_1780995829047_0.7970254034209607","host":"s3://npm-registry-packages-npm-production"}},"6.1.9":{"name":"@asaidimu/utils-persistence","version":"6.1.9","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.9","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"daabcfa14fef0cb07519298fead1394da4b5ca26","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.9.tgz","fileCount":7,"integrity":"sha512-LHvhY9/dSnS2eczemi3JjmCvta2/Ga2tpEFz02CEJUUEUwOytwxZFlBcOozMgvFOJk/QmAueA+3Uzab7gDfpkQ==","signatures":[{"sig":"MEQCIC9GdhA82Coss6YyJyzpeL2dk0zk4Oi6UkIxep2eBX8PAiAIgId0DozDAGdlaHQkmiZfZ0scvz/xYGMczuo4U5dnYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":146327},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"babe8181fcb5895cccd3259cc4b102e0eee86c8b","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.7"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.9_1781280343731_0.9192620362786494","host":"s3://npm-registry-packages-npm-production"}},"6.1.10":{"name":"@asaidimu/utils-persistence","version":"6.1.10","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.10","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"01cdd14e59cd597d8d6d822578fe5c96d85049b4","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.10.tgz","fileCount":7,"integrity":"sha512-qHJQAsZ2GX3IdGmYmneY3fJbnJ+Y6uJLi8d9i2y/v51TFP1rg3c27z50Tt6dIQdlrFZp/o92DqsETUQhGDlB7g==","signatures":[{"sig":"MEUCIBZtnP3um91QvxV1gYx3fGozZYjd0Ub3J3wjt0xNUzn/AiEA5bq/cAJDykDqf8SDwRZdO1ITMHJLeIymdZEon2dS/0k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136263},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"ea6587085ccc45b23875f01c65ffb4fef23c147a","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.7"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.10_1781711381108_0.14936210048749632","host":"s3://npm-registry-packages-npm-production"}},"6.1.11":{"name":"@asaidimu/utils-persistence","version":"6.1.11","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.11","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"ae4bc72ef7d6188ff0757b67a76afff9bfc56d5a","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.11.tgz","fileCount":7,"integrity":"sha512-GWlRNi1HWanTEva6ovttJVvv6/vtKN/CCpyhV+5H6awnjv/rEu4Yao2f8vX6tw57E7VaSSjGzfimLM1XcLQwqg==","signatures":[{"sig":"MEUCIQD/ywGbCH5Rlh00jWc1fb+A5fa1/WQn2FSYujaKTpMCRgIgf7VIuRmxRsVY1XXSPIJNfgzEc74FTX6J/nNKe7Y0FxE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":136263},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"d5f74737e9eaea79ca40423d911c6068c71f485d","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.8"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.11_1781764047558_0.5239867040964579","host":"s3://npm-registry-packages-npm-production"}},"6.1.12":{"name":"@asaidimu/utils-persistence","version":"6.1.12","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.12","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"ee8023f88e9079e2800584fb1550b3525a579a3a","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.12.tgz","fileCount":7,"integrity":"sha512-l7ifI3iR3z5TtjEMcgB38FwEzzSuM+yx6rwZHiBNV4AVK0TOUlwmLSB9NR6VF+R9W3uJKp0QoXDCWDQSucwuUQ==","signatures":[{"sig":"MEQCIF35w3luAu1nxYnd3btjro9PVxKsUu7RajC7qkoen4j5AiAkK3I9vOHbLjXyERV7orRuPLvtmIy9xEHiywwo30uRRg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134766},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"40ecbf4608ef9cfdcad1a786edcd4fa917e63fb1","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.9"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.12_1781943976464_0.6677496621396537","host":"s3://npm-registry-packages-npm-production"}},"6.1.13":{"name":"@asaidimu/utils-persistence","version":"6.1.13","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.13","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"74957d0183b7806591caeea687339fe046fd5074","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.13.tgz","fileCount":7,"integrity":"sha512-10OeLtSYurz2S37PMNDYqyhFtHc+xTz1S6ZRJAXodJO2DKKr69xqbRk8h+aDofeB8uBkOouLfaiV/+qivmwjMg==","signatures":[{"sig":"MEUCIQCHw3zXvxolzPjMoGMVMrNh1xRqH4P5LwAuLU0inMexcQIgfudEh8zTgyy63COkB8gxcuSsFUpCG1vxU5TyJ3gFd+M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125198},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7aa87677899187ee70b6aac9dc90e0209959103f","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^1.0.0","@asaidimu/utils-events":"^1.0.0","@asaidimu/utils-database":"^3.1.9"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.13_1782113589317_0.18964494363008155","host":"s3://npm-registry-packages-npm-production"}},"6.1.14":{"name":"@asaidimu/utils-persistence","version":"6.1.14","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.14","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"5b1b93cc235cf16adf448482a9d17bc4b0e84454","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.14.tgz","fileCount":7,"integrity":"sha512-ZAxz3DRjxW7CB+2CGqV/yWRpBmhEyYUJ5vr/dN5YStstPT+9ckhICiKazRVXdVU0c4yVbOIrbCJEF4SwfDot6A==","signatures":[{"sig":"MEYCIQCKOIL2Q4RK0BFxnwioMaOUgVGB8PxAVQkVLpmUYI/lhgIhAKjexPOttQrmuolCv3kZqpgyQ1UKfOyA+oQC4FcjoYAF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125199},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"368452817770ac9831921fc82db222aa9e807935","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.2","@asaidimu/utils-events":"^1.2.3","@asaidimu/utils-database":"^3.1.11"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.14_1782114865061_0.11517423312864361","host":"s3://npm-registry-packages-npm-production"}},"6.1.15":{"name":"@asaidimu/utils-persistence","version":"6.1.15","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.15","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"527fd872b396b31ac8214ee54762e209762a3e00","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.15.tgz","fileCount":7,"integrity":"sha512-Sa8uEJkND6+N71cQ1LYFGpIEzHdIic0HppmfU+TGjeNZOndkSfvCagRswwWGYELBk21wdwDGYmK7dyDH27teBw==","signatures":[{"sig":"MEQCIDxGGQUg6dyCF3wua/W5QQzWdLcE2BhW2/YjPac0azUsAiAH53gqzBWM93wCJm/ka9KZjGC0LnWfItHEL7QgpyOvlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125199},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"2330847a600476a2fef2c7531bed492071d10ae5","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.3","@asaidimu/utils-events":"^1.2.4","@asaidimu/utils-database":"^3.1.12"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.15_1782115548696_0.04533908489076821","host":"s3://npm-registry-packages-npm-production"}},"6.1.16":{"name":"@asaidimu/utils-persistence","version":"6.1.16","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.16","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"7e0ecfe440dff2274b36d7c47bb7eb65ea9b0a29","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.16.tgz","fileCount":7,"integrity":"sha512-/KM0q+QZuBt1NzKZtEV+QohEBOgNrp4U9Sf0pjUt7vp+WsHAkMs7WdqUj1gDH/fm7rRYPUDzZXK46iQlm9d6RQ==","signatures":[{"sig":"MEYCIQCSeCdI4atP3cPsKU/c8jcZIpIRs4aVlpON/CZSSN7SCwIhAIcSX3bCypxdwOBVq74SMmGBcIjjYKx/P+sOyxYO2PmB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125196},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"f9d04f24885ac8dd1bb262be7571f9e6a9c3ea04","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"2.3.4","@asaidimu/utils-events":"1.2.5","@asaidimu/utils-database":"3.1.13"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.16_1782224048251_0.9750194834630157","host":"s3://npm-registry-packages-npm-production"}},"6.1.17":{"name":"@asaidimu/utils-persistence","version":"6.1.17","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.17","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"fcf5523d1f67c019532fe904d18497415e725937","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.17.tgz","fileCount":7,"integrity":"sha512-6NtzPfELqRoH6yOro89B/0GJykY8vTYhIqQ/knKG+nQQwkaG0U+VEtcZsP2LjwWgmHjmJooxHc3mp6Zg0IjInw==","signatures":[{"sig":"MEQCIF7K3oy4nONJ0A4Pzyaq+3hzukrrsppfppOOfZs+D7UqAiA/JdYmXtGbTW4e3AfeZJ1CozTq7jlEal81WA6mrGua0w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125199},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"273eded81445def3d6ff2f29020c67ca8f21ced1","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.5","@asaidimu/utils-events":"^1.2.6","@asaidimu/utils-database":"^3.1.14"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.17_1782229157106_0.3931146724785517","host":"s3://npm-registry-packages-npm-production"}},"6.1.18":{"name":"@asaidimu/utils-persistence","version":"6.1.18","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.18","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"0a3fc9a088f1554ecbd2846c0ab2df997a6cd07b","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.18.tgz","fileCount":7,"integrity":"sha512-vwlfS483ZWgjzXAENRHQvFJW3Sj0s/DzvzgWeiabBiL7PARBAx4sZwKzJ6kL8LnSuOaM9nslYBTG19y9y2s2Ig==","signatures":[{"sig":"MEQCIFzgjv5RP02oKngfc4OrMR8vnB6PIVxN4ug3o0OWUMMkAiArDA1knfoTqozPr0YHa8sI7dctV0vXNVcmyUvfoALvVQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125199},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"71e8ca028387385c8280c22f6e79823af68d1169","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.6","@asaidimu/utils-events":"^1.2.7","@asaidimu/utils-database":"^3.1.15"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.18_1782397458963_0.004063028303454619","host":"s3://npm-registry-packages-npm-production"}},"6.1.19":{"name":"@asaidimu/utils-persistence","version":"6.1.19","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.19","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"806bfdd7ba2b4e03b6e690d0d67445a6116d309a","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.19.tgz","fileCount":7,"integrity":"sha512-SGTDEHKThwHiBWIcob+q81PGSMM2Xb+DYhpEfZfR2mhJKM7nSo+WM5E41QHDX9cntR/xOYao6utENRedka2l9Q==","signatures":[{"sig":"MEYCIQCAvaLVdd8Y0V2fBwB8Okl6sEjBxwOzAR3O18MSPtRL7AIhAOsO/8fzTbSz40Nhz12q64ai9Hh5MBrUJ5giCYX5pNqb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125199},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"8578a77005f8759b95921f762bb4b0ee24302495","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.0","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.7","@asaidimu/utils-events":"^1.2.8","@asaidimu/utils-database":"^3.1.16"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.19_1782891865580_0.39257582401786206","host":"s3://npm-registry-packages-npm-production"}},"6.1.20":{"name":"@asaidimu/utils-persistence","version":"6.1.20","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.20","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"68ad87742e1673962d9d2dabaa2f7559e43d6fc9","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.20.tgz","fileCount":7,"integrity":"sha512-HuVOV6o8J23HoQrk0vbcOyjdKUR/EnpOXvPojx5nAWfEEH1+I6KZwQ820qBe/hQ2z2DxOq9g13IFU6PL4Z5DXQ==","signatures":[{"sig":"MEUCIAMTAEPxUGfavr1ie8Mepa22JuvkOyxk8DcFt7d5g2epAiEAn66+oUPSc3GSDg6hVyUSQ0c0fdvquYkp8TAr8oxUTD0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109034},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"0ca7aaac7c4a9b0f508acbcc168a98b1e5bb22a6","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.7","@asaidimu/utils-events":"^1.2.8","@asaidimu/utils-database":"^3.1.16"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.20_1783754505082_0.2694507860003006","host":"s3://npm-registry-packages-npm-production"}},"6.1.21":{"name":"@asaidimu/utils-persistence","version":"6.1.21","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.21","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"7943d2d2840f319a59665b441774fa6a639472cc","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.21.tgz","fileCount":7,"integrity":"sha512-V1FLda9Tycc6ml5yfdRvMfgrjYBN6+67hDkK2R6b3f9Jd9WF1ZN8R8qy7t1yms8ByTcQytEE8Tmd5ns2j275DA==","signatures":[{"sig":"MEUCIFytn6Uv91t0vguqrAdCTx7dVAS21gsTXXTSmZRQtVyJAiEA42fm53uo/F0JBedP+Zm3otunqykTCZf5cdIgNIId4oA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143735},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"669408f091ec2b94456b24b193c7bdbc4170b118","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.8","@asaidimu/utils-events":"^1.2.9","@asaidimu/utils-database":"^3.1.18"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.21_1783861815615_0.34855312839101393","host":"s3://npm-registry-packages-npm-production"}},"6.1.22":{"name":"@asaidimu/utils-persistence","version":"6.1.22","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@6.1.22","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"aaa0a7611f25f5d33006075d238dda3fa00ae754","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-6.1.22.tgz","fileCount":7,"integrity":"sha512-BO+6L0T/T5bIVOHhiH7NJvWblmpYgATY7mh/+ytglyQzNx15sYoANqEloXwdzTeAgqsr1VGGB1fuYBMoG77/hw==","signatures":[{"sig":"MEYCIQDU6EIC1H5tNP5LwrjsGnHvy7/qbgjwSD7yZwYmLS3cSwIhAKD/x5i9ZAra+dwkqW8WR9q3oI3O1Df9c51guslWYpn6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143736},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"17eef8ccbb2c43af5db10a4f39aacef98852d5ca","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.9","@asaidimu/utils-events":"^1.2.10","@asaidimu/utils-database":"^3.1.19"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_6.1.22_1783863129161_0.34013539400817616","host":"s3://npm-registry-packages-npm-production"}},"7.0.0":{"name":"@asaidimu/utils-persistence","version":"7.0.0","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@7.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"2b46083c0de1833519b6300fb31dd758e08d74b2","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-7.0.0.tgz","fileCount":7,"integrity":"sha512-QgGqz8eYJbZ6lppJxCFyNyBsybqn0jTDTpNUCPcTjcaWXBoJBqLseeuyVvl6sPgSI1CFmmtRM9S8nzQZW6HrJg==","signatures":[{"sig":"MEYCIQDSYKXmtWoZnAz53vUJVlQl7H/k83iu8yR/T9RvKdTi7wIhAK/MIGJmfeMg4STDoCricMPOFzhQYYOb9AWBBWeVclx2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143736},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"c1d094f9dbf9767a739b1dfda491aed2ebce591f","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^2.3.10","@asaidimu/utils-events":"^1.2.11","@asaidimu/utils-database":"^3.1.20"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_7.0.0_1788167519137_0.9367229986877086","host":"s3://npm-registry-packages-npm-production"}},"7.0.1":{"name":"@asaidimu/utils-persistence","version":"7.0.1","keywords":["typescript","persistence","utility"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","_id":"@asaidimu/utils-persistence@7.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"ab320f06ba92d342c4931f3766dc56ad6ca141cd","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-7.0.1.tgz","fileCount":7,"integrity":"sha512-4ss9mqSm9/tC76Xgm3Fk+0Wy3MYwJkO6CVW5wtvW9fsaoSZjnAnUzEndA8Lmkr68I3I1eyNAz5r5KYdvpwgJfA==","signatures":[{"sig":"MEUCIQCZe2035I8AG4lNsrjlaWIlmqJogDbZ7xe1o+cOmAQcgAIgLN3849Ez9oCMtVIceGdTgdPPJJNPBVgUkxeC9Xo4MOc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143733},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"6732392872cc7400f69c764e4e0acea48d09ebcc","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/indexed":"^3.0.1","@asaidimu/utils-sync":"^3.0.0","@asaidimu/utils-events":"^2.0.0","@asaidimu/utils-database":"^4.0.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/utils-persistence_7.0.1_1788277245295_0.04167683704873282","host":"s3://npm-registry-packages-npm-production"}},"7.0.2":{"_id":"@asaidimu/utils-persistence@7.0.2","bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"dist":{"shasum":"f895686acf5d8697889679d34d8167164c8c75b3","tarball":"https://registry.npmjs.org/@asaidimu/utils-persistence/-/utils-persistence-7.0.2.tgz","fileCount":7,"integrity":"sha512-/jKMsmncKy7MMQEg4JOJsV4C/P+xAjtes2npcKKrgLWBy4TA8/otKfrohNRXZjk1T6zTT40NNkkYc3V2XWxSlA==","signatures":[{"sig":"MEQCIBgG4bBK+mAzaVXOnJ7t5Zb4YB3x6S4Ohfv+m5IhJb+mAiBGE76BvkIc7hqttvnXTdsy4ciXYDUz1NjsXV7JUKLYEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHND4/bfqwv4deN9M/49ilQ2LYpDkYQ+PvHtGPeeUjj5AiAhWuF+30pt4ZSK5hZufSHmGV97J9vC15TDJ9RKdak8+g=="}],"unpackedSize":143698},"main":"index.js","name":"@asaidimu/utils-persistence","types":"index.d.ts","author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"8b3270151f96417d9f3462a60baafdf410563000","license":"MIT","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-persistence v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"}]]},"version":"7.0.2","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","keywords":["typescript","persistence","utility"],"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"_npmVersion":"10.9.8","description":"Persistence utilities.","directories":{},"maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"uuid":"^14.0.0","@asaidimu/query":"^1.1.2","@asaidimu/utils-sync":"^3.0.0","@asaidimu/utils-events":"^2.0.0","@asaidimu/utils-database":"^5.0.0"},"publishConfig":{"tag":"latest","access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/utils-persistence_7.0.2_1789153637773_0.5629409272400088"}}},"time":{"created":"2025-06-06T19:27:11.452Z","modified":"2026-09-11T19:07:18.070Z","1.0.0":"2025-06-06T19:27:11.750Z","2.0.0":"2025-06-06T20:53:04.513Z","2.0.1":"2025-06-07T07:29:21.905Z","2.0.2":"2025-06-07T11:59:43.999Z","2.0.3":"2025-06-07T12:06:33.755Z","2.0.4":"2025-06-07T12:19:21.303Z","2.1.0":"2025-09-12T07:51:06.108Z","2.2.0":"2025-09-19T12:24:16.896Z","2.2.1":"2025-09-23T10:21:53.968Z","2.2.2":"2025-09-23T11:28:11.666Z","3.0.0":"2025-12-29T21:17:46.566Z","4.0.0":"2026-03-09T15:11:01.297Z","5.0.0":"2026-04-21T10:00:23.974Z","5.0.1":"2026-04-22T16:29:00.742Z","5.0.2":"2026-04-23T07:31:43.861Z","6.0.0":"2026-05-04T15:19:11.094Z","6.1.0":"2026-05-07T08:16:19.454Z","6.1.1":"2026-05-07T09:51:11.075Z","6.1.2":"2026-05-08T09:21:35.614Z","6.1.3":"2026-05-08T11:38:38.533Z","6.1.4":"2026-05-09T06:15:59.350Z","6.1.5":"2026-05-09T06:27:29.554Z","6.1.6":"2026-05-13T07:22:33.552Z","6.1.7":"2026-05-25T12:30:37.500Z","6.1.8":"2026-06-09T09:03:49.259Z","6.1.9":"2026-06-12T16:05:43.861Z","6.1.10":"2026-06-17T15:49:41.244Z","6.1.11":"2026-06-18T06:27:27.725Z","6.1.12":"2026-06-20T08:26:16.624Z","6.1.13":"2026-06-22T07:33:09.449Z","6.1.14":"2026-06-22T07:54:25.207Z","6.1.15":"2026-06-22T08:05:48.842Z","6.1.16":"2026-06-23T14:14:08.403Z","6.1.17":"2026-06-23T15:39:17.275Z","6.1.18":"2026-06-25T14:24:19.125Z","6.1.19":"2026-07-01T07:44:25.697Z","6.1.20":"2026-07-11T07:21:45.201Z","6.1.21":"2026-07-12T13:10:15.741Z","6.1.22":"2026-07-12T13:32:09.304Z","7.0.0":"2026-08-31T09:11:59.261Z","7.0.1":"2026-09-01T15:40:45.452Z","7.0.2":"2026-09-11T19:07:17.920Z"},"bugs":{"url":"https://github.com/asaidimu/erp-utils/issues"},"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","homepage":"https://github.com/asaidimu/erp-utils/tree/main/src/persistence#readme","keywords":["typescript","persistence","utility"],"repository":{"url":"git+https://github.com/asaidimu/erp-utils.git","type":"git"},"description":"Persistence utilities.","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"readme":"# `@asaidimu/utils-persistence`\n\n**Robust Data Persistence for Web Applications**\n\n[![npm version](https://img.shields.io/npm/v/@asaidimu/utils-persistence.svg?style=flat-square)](https://www.npmjs.com/package/@asaidimu/utils-persistence)\n[![License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://github.com/asaidimu/erp-utils/blob/main/LICENSE)\n[![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=flat-square)](https://github.com/asaidimu/erp-utils/actions)\n\n---\n\n## 📖 Table of Contents\n\n- [Overview & Features](#overview--features)\n- [Installation & Setup](#installation--setup)\n- [Usage Documentation](#usage-documentation)\n  - [Core Interface: `SimplePersistence`](#core-interface-simplepersistence)\n  - [The Power of Adapters](#the-power-of-adapters)\n  - [Usage Guidelines](#usage-guidelines-for-those-consuming-the-simplepersistence-interface)\n  - [When to Use and When to Avoid `SimplePersistence`](#when-to-use-and-when-to-avoid-simplepersistence)\n  - [Web Storage Persistence (`WebStoragePersistence`)](#web-storage-persistence-webstoragepersistence)\n  - [IndexedDB Persistence (`IndexedDBPersistence`)](#indexeddb-persistence-indexeddbpersistence)\n  - [Ephemeral Persistence (`EphemeralPersistence`)](#ephemeral-persistence-ephemeralpersistence)\n  - [Common Use Cases](#common-use-cases)\n- [Project Architecture](#project-architecture)\n- [Development & Contributing](#development--contributing)\n- [Additional Information](#additional-information)\n\n---\n\n## ✨ Overview & Features\n\n`@asaidimu/utils-persistence` is a lightweight, type-safe TypeScript library designed to simplify robust data persistence in modern web applications. It provides a unified, asynchronous-friendly API for interacting with various browser storage mechanisms, including `localStorage`, `sessionStorage`, `IndexedDB`, and even an in-memory store. A core strength of this library is its built-in support for **cross-instance synchronization**, ensuring that state changes made in one browser tab, window, or even a logically separate component instance within the same tab, are automatically reflected and propagated to other active instances using the same persistence mechanism. This enables seamless, real-time data consistency across your application.\n\nThis library is ideal for single-page applications (SPAs) that require robust state management, offline capabilities, or seamless data synchronization across multiple browser instances. By abstracting away the complexities of different storage APIs and handling synchronization, it allows developers to focus on application logic rather than intricate persistence details. It integrates smoothly with popular state management libraries or can be used standalone for direct data access.\n\n### 🚀 Key Features\n\n- **Unified `SimplePersistence<T>` API**: A consistent interface for all storage adapters, simplifying integration and making switching storage types straightforward.\n- **Flexible Storage Options**:\n  - `WebStoragePersistence`: Supports both `localStorage` (default) and `sessionStorage` for simple key-value storage. Ideal for user preferences or small, temporary data.\n  - `IndexedDBPersistence`: Provides robust, high-capacity, and structured data storage for more complex needs like offline caching or large datasets. Leverages `@asaidimu/indexed` for simplified IndexedDB interactions.\n  - `EphemeralPersistence`: Offers an in-memory store with cross-tab synchronization using a Last Write Wins (LWW) strategy. Ideal for transient, session-specific shared state that does not need to persist across page reloads.\n- **Automatic Cross-Instance Synchronization**: Real-time updates across multiple browser tabs, windows, or even components within the same tab. This is achieved by leveraging native `StorageEvent` (for `localStorage`) and `BroadcastChannel`-based event buses (from `@asaidimu/events`) for `WebStoragePersistence`, `IndexedDBPersistence`, and `EphemeralPersistence`.\n- **Data Versioning and Migration**: Each store can be configured with a `version` and an optional `onUpgrade` handler to manage data schema changes gracefully across application updates.\n- **Type-Safe**: Fully written in TypeScript, providing strong typing, compile-time checks, and autocompletion for a better developer experience.\n- **Lightweight & Minimal Dependencies**: Designed to be small and efficient, relying on a few focused internal utilities (`@asaidimu/events`, `@asaidimu/indexed`, `@asaidimu/query`).\n- **Robust Error Handling**: Includes internal error handling for common storage operations, providing clearer debugging messages when issues arise.\n- **Instance-Specific Subscriptions**: The `subscribe` method intelligently uses a unique `instanceId` to listen for changes from _other_ instances of the application (e.g., other tabs or different components sharing the same store), deliberately preventing self-triggered updates and enabling efficient state reconciliation without infinite loops.\n- **Asynchronous Operations**: `IndexedDBPersistence` methods return Promises, allowing for non-blocking UI and efficient handling of large data operations. `WebStoragePersistence` and `EphemeralPersistence` are synchronous where possible, but their cross-tab synchronization aspects are asynchronous.\n\n---\n\n## 📦 Installation & Setup\n\n### Prerequisites\n\nTo use `@asaidimu/utils-persistence`, you need:\n\n- Node.js (LTS version recommended)\n- npm, Yarn, or Bun package manager\n- A modern web browser environment (e.g., Chrome, Firefox, Safari, Edge) that supports `localStorage`, `sessionStorage`, `IndexedDB`, and `BroadcastChannel`.\n\n### Installation Steps\n\nInstall the package using your preferred package manager:\n\n```bash\n# Using Bun\nbun add @asaidimu/utils-persistence\n\n# Using Yarn\nyarn add @asaidimu/utils-persistence\n\n# Using npm\nnpm install @asaidimu/utils-persistence\n```\n\nIf you plan to use `uuid` for generating `instanceId`s as recommended in the examples, install it separately:\n\n```bash\nbun add uuid\n# or\nyarn add uuid\n# or\nnpm install uuid\n```\n\n### Configuration\n\nThis library does not require global configuration. All settings are passed directly to the constructor of the respective persistence adapter during instantiation. Each adapter's constructor expects a `StoreConfig<T>` object, potentially extended with adapter-specific options (e.g., `storageKey` for `WebStoragePersistence` or `database`/`collection` for `IndexedDBPersistence`).\n\n```typescript\n// The base configuration for any persistence store\nexport interface StoreConfig<T> {\n  /**\n   * The semantic version string (e.g., \"1.0.0\") of the data schema or application.\n   * Used for version control and data migrations.\n   */\n  version: string;\n\n  /**\n   * A unique application identifier (e.g., \"chat-app\").\n   * Prevents collisions between different apps sharing the same persistence backend.\n   */\n  app: string;\n\n  /**\n   * Optional handler for upgrading persisted state across versions.\n   * Called when the persisted state’s `version` does not match the config's `version`.\n   * @param state The existing state object { data: T | null; version: string; app: string }.\n   * @returns A new state object { state: T | null; version: string } with the migrated data.\n   */\n  onUpgrade?: (state: {\n    data: T | null;\n    version: string;\n    app: string;\n  }) => Promise<{ state: T | null; version: string }>;\n}\n```\n\n### Verification\n\nYou can quickly verify the installation by attempting to import one of the classes:\n\n```typescript\nimport {\n  WebStoragePersistence,\n  IndexedDBPersistence,\n  EphemeralPersistence,\n} from \"@asaidimu/utils-persistence\";\n\nconsole.log(\"Persistence modules loaded successfully!\");\n\n// You can now create instances:\n// const myLocalStorageStore = new WebStoragePersistence<{ appState: string }>(/* config */);\n// const myIndexedDBStore = new IndexedDBPersistence<{ userId: string; data: any }>(/* config */);\n// const myEphemeralStore = new EphemeralPersistence<{ sessionCount: number }>(/* config */);\n```\n\n---\n\n## 📚 Usage Documentation\n\nThe library exposes a common interface `SimplePersistence<T>` that all adapters adhere to, allowing for interchangeable persistence strategies.\n\n### Core Interface: `SimplePersistence`\n\nEvery persistence adapter in this library implements the `SimplePersistence<T>` interface, where `T` is the type of data you want to persist. This interface is designed to be flexible, supporting both synchronous and asynchronous operations, and is especially geared towards handling multi-instance scenarios (e.g., multiple browser tabs or independent components sharing the same data).\n\n```typescript\nexport interface SimplePersistence<T> {\n  /**\n   * Persists data to storage.\n   *\n   * @param id The **unique identifier of the *consumer instance*** making the change. This is NOT the ID of the data (`T`) itself.\n   * Think of it as the ID of the specific browser tab, component, or module that's currently interacting with the persistence layer.\n   * It should typically be a **UUID** generated once at the consumer instance's instantiation.\n   * This `id` is crucial for the `subscribe` method, helping to differentiate updates originating from the current instance versus other instances/tabs, thereby preventing self-triggered notification loops.\n   * @param state The state (of type T) to persist. This state is generally considered the **global or shared state** that all instances interact with.\n   * @returns `true` if the operation was successful, `false` if an error occurred. For asynchronous implementations (like `IndexedDBPersistence`), this returns a `Promise<boolean>`.\n   */\n  set(id: string, state: T): boolean | Promise<boolean>;\n\n  /**\n   * Retrieves the global persisted data from storage.\n   *\n   * @returns The retrieved state of type `T`, or `null` if no data is found or if an error occurs during retrieval/parsing.\n   * For asynchronous implementations, this returns a `Promise<T | null>`.\n   */\n  get(): (T | null) | Promise<T | null>;\n\n  /**\n   * Subscribes to changes in the global persisted data that originate from *other* instances of your application (e.g., other tabs or independent components using the same persistence layer).\n   *\n   * @param id The **unique identifier of the *consumer instance* subscribing**. This allows the persistence implementation to filter out notifications that were initiated by the subscribing instance itself.\n   * @param callback The function to call when the global persisted data changes from *another* source. The new state (`T`) is passed as an argument to this callback.\n   * @returns A function that, when called, will unsubscribe the provided callback from future updates. Call this when your component or instance is no longer active to prevent memory leaks.\n   */\n  subscribe(id: string, callback: (state: T) => void): () => void;\n\n  /**\n   * Clears (removes) the entire global persisted data from storage.\n   *\n   * @returns `true` if the operation was successful, `false` if an error occurred. For asynchronous implementations, this returns a `Promise<boolean>`.\n   */\n  clear(): boolean | Promise<boolean>;\n\n  /**\n   * Returns metadata about the persistence layer.\n   *\n   * This is useful for distinguishing between multiple apps running on the same host\n   * (e.g., several apps served at `localhost:3000` that share the same storage key).\n   *\n   * @returns An object containing:\n   * - `version`: The semantic version string of the persistence schema or application.\n   * - `id`: A unique identifier for the application using this persistence instance.\n   */\n  stats(): { version: string; id: string };\n}\n```\n\n### The Power of Adapters\n\nThe adapter pattern used by `SimplePersistence<T>` is a key strength, enabling seamless swapping of persistence backends without altering application logic. This decoupling offers several advantages:\n\n- **Interchangeability**: Switch between storage mechanisms (e.g., `localStorage`, `IndexedDB`, an in-memory store, or a remote API) by simply changing the adapter, keeping the interface consistent.\n- **Scalability**: Start with a lightweight adapter (e.g., `EphemeralPersistence` for prototyping) and transition to a robust solution (e.g., `IndexedDBPersistence` or a server-based database) as needs evolve, with minimal changes to the consuming code.\n- **Extensibility**: Easily create custom adapters for new storage technologies or environments (e.g., file systems, serverless functions) while adhering to the same interface.\n- **Environment-Agnostic**: Use the same interface in browser, server, or hybrid applications, supporting diverse use cases like offline-first apps or cross-tab synchronization.\n- **Testing Simplicity**: Implement mock adapters for testing, isolating persistence logic without touching real storage.\n\nThis flexibility ensures that the persistence layer can adapt to varying requirements, from small-scale prototypes to production-grade systems, while maintaining a consistent and predictable API.\n\n### Usage Guidelines (For those consuming the `SimplePersistence` interface)\n\nThis section provides practical advice for consuming the `SimplePersistence<T>` interface.\n\n#### 1. Understanding the `id` Parameter: **Consumer Instance ID, NOT Data ID**\n\nThis is the most crucial point to grasp:\n\n- **`id` does NOT refer to an ID _within_ your data type `T`**. If your `T` represents a complex object (e.g., `{ users: User[]; settings: AppSettings; }`), any IDs for `User` objects or specific settings should be managed _inside_ your `T` type.\n- **`id` refers to the unique identifier of the _consumer instance_ that is interacting with the persistence layer.**\n  - Think of a \"consumer instance\" as a specific browser tab, a running web worker, a distinct application component, or any other isolated context that uses `SimplePersistence`.\n  - This `id` should be a **UUID (Universally Unique Identifier)**, generated **once** when that consumer instance initializes.\n\n**Why is this `id` essential?**\n\nIt enables robust **multi-instance synchronization**. When multiple instances (e.g., different browser tabs) share the same underlying storage, the `id` allows the persistence layer to:\n\n- **Identify the source of a change:** When `set(id, state)` is called, the layer knows _which_ instance initiated the save.\n- **Filter notifications:** The `subscribe(id, callback)` method uses this `id` to ensure that a subscribing instance is notified of changes _only_ if they originated from _another_ instance, preventing unnecessary self-triggered updates.\n\n#### 2. Practical Examples for Consuming `SimplePersistence`\n\n##### 2.1 Generating and Managing the Consumer `instanceId`\n\nGenerate a unique UUID for your consumer instance at its very beginning (e.g., when your main application component mounts or your service initializes).\n\n```typescript\nimport { v4 as uuidv4 } from \"uuid\"; // Requires 'uuid' library to be installed: `bun add uuid`\nimport {\n  SimplePersistence,\n  WebStoragePersistence,\n  StoreConfig,\n} from \"@asaidimu/utils-persistence\";\n\ninterface MyAppState {\n  data: string;\n  count: number;\n  lastUpdated: number;\n}\n\nclass MyAppComponent {\n  private instanceId: string;\n  private persistence: SimplePersistence<MyAppState>;\n  private unsubscribe: (() => void) | null = null;\n  private appState: MyAppState = {\n    data: \"initial\",\n    count: 0,\n    lastUpdated: Date.now(),\n  };\n\n  constructor(persistenceAdapter: SimplePersistence<MyAppState>) {\n    this.instanceId = uuidv4(); // Generate unique ID for this app/tab instance\n    this.persistence = persistenceAdapter;\n    this.initializePersistence();\n  }\n\n  private async initializePersistence() {\n    try {\n      // Load initial state\n      const storedState = await this.persistence.get();\n      if (storedState) {\n        console.log(\n          `Instance ${this.instanceId}: Loaded initial state.`,\n          storedState,\n        );\n        this.appState = storedState; // Update your app's internal state with loaded data\n      } else {\n        console.log(\n          `Instance ${this.instanceId}: No initial state found. Using default.`,\n        );\n        // Optionally, persist default state if none exists\n        await this.persistence.set(this.instanceId, this.appState);\n      }\n\n      // Subscribe to changes from other instances\n      this.unsubscribe = this.persistence.subscribe(\n        this.instanceId,\n        (newState) => {\n          console.log(\n            `Instance ${this.instanceId}: Received global state update from another instance.`,\n            newState,\n          );\n          // Crucial: Update your local application state based on this shared change\n          this.appState = newState;\n          this.render(); // Re-render your component/UI\n        },\n      );\n      console.log(`Instance ${this.instanceId}: Subscribed to updates.`);\n    } catch (error) {\n      console.error(\n        `Instance ${this.instanceId}: Error during persistence initialization:`,\n        error,\n      );\n    }\n    this.render();\n  }\n\n  // Simulate a component render\n  private render() {\n    const outputElement = document.getElementById(\"app-output\");\n    if (outputElement) {\n      outputElement.innerHTML = `\n        <p><strong>Instance ID:</strong> ${this.instanceId}</p>\n        <p><strong>App State:</strong> ${JSON.stringify(this.appState, null, 2)}</p>\n        <p><strong>Persistence Stats:</strong> ${JSON.stringify(this.persistence.stats(), null, 2)}</p>\n      `;\n    }\n  }\n\n  // Call this when the component/app instance is being destroyed or unmounted\n  cleanup() {\n    if (this.unsubscribe) {\n      this.unsubscribe(); // Stop listening to updates\n      console.log(`Instance ${this.instanceId}: Unsubscribed from updates.`);\n      this.unsubscribe = null;\n    }\n  }\n\n  async updateAppState(newData: string) {\n    this.appState = {\n      ...this.appState,\n      data: newData,\n      count: this.appState.count + 1,\n      lastUpdated: Date.now(),\n    };\n    console.log(\n      `Instance ${this.instanceId}: Attempting to save new state:`,\n      this.appState,\n    );\n    const success = await this.persistence.set(this.instanceId, this.appState);\n    if (!success) {\n      console.error(`Instance ${this.instanceId}: Failed to save app state.`);\n    } else {\n      console.log(`Instance ${this.instanceId}: State saved successfully.`);\n    }\n    this.render(); // Render local changes immediately\n  }\n\n  async clearAppState() {\n    console.log(`Instance ${this.instanceId}: Attempting to clear app state.`);\n    const success = await this.persistence.clear();\n    if (!success) {\n      console.error(`Instance ${this.instanceId}: Failed to clear app state.`);\n    } else {\n      console.log(`Instance ${this.instanceId}: App state cleared.`);\n      this.appState = { data: \"cleared\", count: 0, lastUpdated: Date.now() }; // Reset local state\n    }\n    this.render();\n  }\n}\n\n// Example of how to use this in an HTML environment:\n// Add a div with id=\"app-output\" and some buttons to trigger actions.\n/*\ndocument.body.innerHTML = `\n  <div id=\"app-output\">Loading...</div>\n  <button id=\"update-btn\">Update State (Local)</button>\n  <button id=\"clear-btn\">Clear State (Global)</button>\n  <button id=\"close-btn\">Cleanup Instance</button>\n`;\n\nconst config: StoreConfig<MyAppState> = {\n  version: \"1.0.0\",\n  app: \"my-first-app\",\n  onUpgrade: async ({ data, version, app }) => {\n    console.log(`Migrating data for ${app} from version ${version} to 1.0.0. Current data:`, data);\n    // Simple example: if data was older, initialize count\n    return { state: data ? { ...data, count: data.count ?? 0 } : { data: 'migrated-default', count: 0, lastUpdated: Date.now() }, version: \"1.0.0\" };\n  }\n};\n\nconst webStore = new WebStoragePersistence<MyAppState>({ ...config, storageKey: 'my-shared-app-state' });\nconst appInstance = new MyAppComponent(webStore);\n\ndocument.getElementById('update-btn')?.addEventListener('click', () => {\n  const newData = prompt('Enter new data:', appInstance.getCurrentState().data);\n  if (newData !== null) {\n    appInstance.updateAppState(newData);\n  }\n});\ndocument.getElementById('clear-btn')?.addEventListener('click', () => appInstance.clearAppState());\ndocument.getElementById('close-btn')?.addEventListener('click', () => appInstance.cleanup());\n\n// To test cross-tab synchronization:\n// 1. Open this page in two browser tabs.\n// 2. Click \"Update State (Local)\" in one tab.\n// 3. Observe the \"Received global state update from another instance\" message in the other tab.\n// 4. Click \"Clear State (Global)\" in one tab.\n// 5. Observe the state clearing in both tabs.\n*/\n```\n\n##### 2.2 Using `set(id, state)`\n\n- Always pass the unique `instanceId` of your consumer when calling `set`.\n- The `state` object you pass will generally overwrite the entire global persisted state. Ensure it contains all necessary data.\n\n  ```typescript\n  import {\n    WebStoragePersistence,\n    StoreConfig,\n  } from \"@asaidimu/utils-persistence\";\n  import { v4 as uuidv4 } from \"uuid\";\n\n  interface Settings {\n    theme: string;\n    lastSaved: number;\n  }\n  const myInstanceId = uuidv4();\n\n  async function saveSettings(newSettings: Settings) {\n    const config: StoreConfig<Settings> & { storageKey: string } = {\n      version: \"1.0.0\",\n      app: \"app-settings-manager\",\n      storageKey: \"app-settings\",\n    };\n    const settingsStore = new WebStoragePersistence<Settings>(config);\n\n    console.log(`Instance ${myInstanceId}: Attempting to save settings.`);\n    const success = await settingsStore.set(myInstanceId, {\n      ...newSettings,\n      lastSaved: Date.now(),\n    });\n    if (!success) {\n      console.error(`Instance ${myInstanceId}: Failed to save settings.`);\n    } else {\n      console.log(`Instance ${myInstanceId}: Settings saved successfully.`);\n    }\n  }\n\n  // Example:\n  // saveSettings({ theme: 'dark', lastSaved: 0 });\n  ```\n\n##### 2.3 Using `get()`\n\n- `get()` retrieves the _entire global, shared_ persisted state. It does _not_ take an `id` because it's designed to fetch the single, overarching state accessible by all instances.\n- The returned `T | null` (or `Promise<T | null>`) should be used to initialize or update your application's local state.\n\n  ```typescript\n  import {\n    WebStoragePersistence,\n    StoreConfig,\n  } from \"@asaidimu/utils-persistence\";\n\n  interface Settings {\n    theme: string;\n    lastSaved: number;\n  }\n  const config: StoreConfig<Settings> & { storageKey: string } = {\n    version: \"1.0.0\",\n    app: \"app-settings-manager\",\n    storageKey: \"app-settings\",\n  };\n  const settingsStore = new WebStoragePersistence<Settings>(config);\n\n  async function retrieveGlobalState() {\n    const storedState = await settingsStore.get(); // Await for async adapters if it returns a Promise\n    if (storedState) {\n      console.log(\"Retrieved global app settings:\", storedState);\n      // Integrate storedState into your application's current state\n    } else {\n      console.log(\"No global app settings found in storage.\");\n    }\n  }\n\n  // Example:\n  // retrieveGlobalState();\n  ```\n\n##### 2.4 Using `subscribe(id, callback)`\n\n- Pass your consumer `instanceId` as the first argument.\n- The `callback` will be invoked when the global persisted state changes due to a `set` operation initiated by _another_ consumer instance.\n- **Always store the returned unsubscribe function** and call it when your consumer instance is no longer active (e.g., component unmounts, service shuts down) to prevent memory leaks and unnecessary processing.\n\n  ```typescript\n  import {\n    WebStoragePersistence,\n    StoreConfig,\n  } from \"@asaidimu/utils-persistence\";\n  import { v4 as uuidv4 } from \"uuid\";\n\n  interface NotificationState {\n    count: number;\n    lastMessage: string;\n  }\n  const myInstanceId = uuidv4();\n\n  const config: StoreConfig<NotificationState> & { storageKey: string } = {\n    version: \"1.0.0\",\n    app: \"notification-center\",\n    storageKey: \"app-notifications\",\n  };\n  const notificationStore = new WebStoragePersistence<NotificationState>(\n    config,\n  );\n\n  const unsubscribe = notificationStore.subscribe(myInstanceId, (newState) => {\n    console.log(\n      `🔔 Instance ${myInstanceId}: Received update from another instance:`,\n      newState,\n    );\n    // Update UI or internal state based on `newState`\n  });\n\n  console.log(`Instance ${myInstanceId}: Subscribed to notifications.`);\n\n  // To simulate a change from another instance, open a new browser tab\n  // and run something like this (ensure it's a different instanceId):\n  /*\n  setTimeout(async () => {\n    const anotherInstanceId = uuidv4();\n    const anotherNotificationStore = new WebStoragePersistence<NotificationState>(config);\n    console.log(`Instance ${anotherInstanceId}: Sending new notification...`);\n    await anotherNotificationStore.set(anotherInstanceId, { count: 5, lastMessage: 'New notification from another tab!' });\n    console.log(`Instance ${anotherInstanceId}: Notification sent.`);\n  }, 2000);\n  */\n\n  // When no longer needed (e.g., component unmounts):\n  // setTimeout(() => {\n  //   unsubscribe();\n  //   console.log(`Instance ${myInstanceId}: Unsubscribed from notification updates.`);\n  // }, 5000);\n  ```\n\n##### 2.5 Using `clear()`\n\n- `clear()` performs a global reset, completely removing the shared persisted data for _all_ instances. Use with caution.\n\n  ```typescript\n  import {\n    WebStoragePersistence,\n    StoreConfig,\n  } from \"@asaidimu/utils-persistence\";\n\n  interface UserData {\n    username: string;\n    email: string;\n  }\n  const config: StoreConfig<UserData> & { storageKey: string } = {\n    version: \"1.0.0\",\n    app: \"user-profile\",\n    storageKey: \"user-data\",\n  };\n  const userDataStore = new WebStoragePersistence<UserData>(config);\n\n  async function resetUserData() {\n    console.log(\"Attempting to clear all persisted user data...\");\n    const success = await userDataStore.clear(); // Await for async adapters if it returns a Promise\n    if (success) {\n      console.log(\"All persisted user data cleared successfully.\");\n    } else {\n      console.error(\"Failed to clear persisted user data.\");\n    }\n  }\n\n  // Example:\n  // resetUserData();\n  ```\n\n#### 3. When to Use and When to Avoid `SimplePersistence`\n\nTo ensure proper use of the `SimplePersistence<T>` interface and prevent misuse, consider the following guidelines for when it is appropriate and when it should be avoided.\n\n**When to Use**\n\n- **Multi-Instance Synchronization**: Ideal for applications where multiple instances (e.g., browser tabs, web workers, or independent components) need to share and synchronize a single global state, such as collaborative web apps, note-taking apps, or shared dashboards.\n- **Interchangeable Persistence Needs**: Perfect for projects requiring flexibility to switch between storage backends (e.g., `localStorage` for prototyping, `IndexedDB` for production, `EphemeralPersistence` for transient state, or even server-based storage for scalability) without changing application logic.\n- **Simple Global State Management**: Suitable for managing a single, shared state object (e.g., user settings, app configurations, or a shared data model) that needs to be persisted and accessed across instances.\n- **Offline-First Applications**: Useful for apps that need to persist state locally and optionally sync with a server when online, leveraging the adapter pattern to handle different storage mechanisms.\n- **Prototyping and Testing**: Great for quickly implementing persistence with a lightweight adapter (e.g., in-memory or `localStorage`) and later scaling to more robust solutions.\n\n**When to Avoid**\n\n- **Complex Data Relationships**: Avoid using for applications requiring complex data models with relational queries or indexing (e.g., large-scale databases with multiple tables or complex joins). The interface is designed for a single global state, not for managing multiple entities with intricate relationships. For such cases, consider using a dedicated database library (like `@asaidimu/indexed` directly) or a backend service.\n- **High-Frequency Updates**: Not suitable for scenarios with rapid, high-frequency state changes (e.g., real-time gaming or live data streams that update hundreds of times per second), as the global state overwrite model and broadcasting mechanism may introduce performance bottlenecks.\n- **Fine-Grained Data Access**: Do not use if you need to persist or retrieve specific parts of the state independently, as `set` and `get` operate on the entire state object, which can be inefficient for very large datasets where only small portions change.\n- **Critical Data with Strict Consistency**: Not ideal for systems requiring strict consistency guarantees (e.g., financial transactions) across distributed clients, as the interface does not enforce ACID properties or advanced conflict resolution beyond basic Last Write Wins (LWW) semantics for ephemeral storage, or simple overwrite for others.\n\n### Web Storage Persistence (`WebStoragePersistence`)\n\n`WebStoragePersistence` uses the browser's `localStorage` (default) or `sessionStorage`. Its `set`, `get`, and `clear` operations are synchronous, meaning they return `boolean` values directly, not Promises. It supports cross-tab synchronization and data versioning with upgrade handlers.\n\n```typescript\nimport {\n  WebStoragePersistence,\n  StoreConfig,\n} from \"@asaidimu/utils-persistence\";\nimport { v4 as uuidv4 } from \"uuid\"; // Recommended for generating unique instance IDs\n\ninterface UserPreferences {\n  theme: \"dark\" | \"light\";\n  notificationsEnabled: boolean;\n  language: string;\n}\n\n// Generate a unique instance ID for this specific browser tab/session/component.\n// This ID is crucial for differentiating self-updates from cross-instance updates.\nconst instanceId = uuidv4();\n\n// Common Store Configuration\nconst commonConfig: StoreConfig<UserPreferences> = {\n  version: \"1.0.0\",\n  app: \"user-dashboard\",\n  onUpgrade: ({ data, version, app }) => {\n    console.log(\n      `[${app}] Migrating user preferences from version ${version} to 1.0.0.`,\n    );\n    // Example migration: ensure language is set to default if missing\n    if (data && !data.language) {\n      return { state: { ...data, language: \"en-US\" }, version: \"1.0.0\" };\n    }\n    // For WebStoragePersistence, if data is null during upgrade, it means no data existed.\n    // We could return a default state here.\n    return {\n      state: data || {\n        theme: \"light\",\n        notificationsEnabled: true,\n        language: \"en-US\",\n      },\n      version: \"1.0.0\",\n    };\n  },\n};\n\n// 1. Using localStorage (default for persistent data)\n// Data stored here will persist across browser sessions.\nconst localStorageConfig = {\n  ...commonConfig,\n  storageKey: \"user-preferences-local\",\n};\nconst userPrefsStore = new WebStoragePersistence<UserPreferences>(\n  localStorageConfig,\n);\n\nconsole.log(\"--- localStorage Example ---\");\n\nasync function manageLocalStorage() {\n  // Set initial preferences\n  const initialPrefs: UserPreferences = {\n    theme: \"dark\",\n    notificationsEnabled: true,\n    language: \"en-US\",\n  };\n  const setResult = userPrefsStore.set(instanceId, initialPrefs);\n  console.log(\"Preferences set successfully:\", setResult); // Expected: true\n\n  // Retrieve data\n  let currentPrefs = userPrefsStore.get();\n  console.log(\"Current preferences:\", currentPrefs);\n\n  // Subscribe to changes from *other* tabs/instances.\n  // Open another browser tab to the same application URL to test this.\n  const unsubscribePrefs = userPrefsStore.subscribe(instanceId, (newState) => {\n    console.log(\"🔔 Preferences updated from another instance:\", newState);\n    // In a real app, you would update your UI or state management system here.\n  });\n  console.log(\"Subscribed to localStorage updates.\");\n\n  // Simulate an update from another tab:\n  // (In a different tab, generate a new instanceId and call set on the same storageKey)\n  /*\n  const anotherInstanceId_ls = uuidv4();\n  const anotherPrefsStore_ls = new WebStoragePersistence<UserPreferences>(localStorageConfig);\n  anotherPrefsStore_ls.set(anotherInstanceId_ls, { theme: 'light', notificationsEnabled: false, language: 'es-ES' });\n  */\n  // You would then see the \"🔔 Preferences updated from another instance:\" message in the first tab.\n  await new Promise((resolve) => setTimeout(resolve, 100)); // Allow event propagation\n\n  // After a while, if no longer needed, unsubscribe\n  // setTimeout(() => {\n  //   unsubscribePrefs();\n  //   console.log('Unsubscribed from localStorage preferences updates.');\n  // }, 5000);\n\n  // Clear data when no longer needed (e.g., user logs out)\n  const clearResult = userPrefsStore.clear();\n  console.log(\"Preferences cleared successfully:\", clearResult); // Expected: true\n  console.log(\"Preferences after clear:\", userPrefsStore.get()); // Expected: null\n  unsubscribePrefs(); // Unsubscribe immediately after clearing for the example\n}\nmanageLocalStorage();\n\nconsole.log(\"\\n--- sessionStorage Example ---\");\n\n// 2. Using sessionStorage (for session-specific data)\n// Data stored here will only persist for the duration of the browser tab.\n// It is cleared when the tab is closed.\nconst sessionStorageConfig = {\n  ...commonConfig,\n  storageKey: \"session-data\",\n  session: true,\n};\nconst sessionDataStore = new WebStoragePersistence<\n  { lastVisitedPage: string } & UserPreferences\n>(sessionStorageConfig);\n\nasync function manageSessionStorage() {\n  const initialSessionData: { lastVisitedPage: string } & UserPreferences = {\n    ...commonConfig.onUpgrade!({\n      data: null,\n      version: \"0.0.0\",\n      app: \"user-dashboard\",\n    }).state!, // Use migrated default\n    lastVisitedPage: \"/dashboard\",\n  };\n  sessionDataStore.set(instanceId, initialSessionData);\n  console.log(\"Session data set:\", sessionDataStore.get());\n\n  // sessionStorage also supports cross-tab synchronization via BroadcastChannel\n  const unsubscribeSession = sessionDataStore.subscribe(\n    instanceId,\n    (newState) => {\n      console.log(\"🔔 Session data updated from another instance:\", newState);\n    },\n  );\n  console.log(\"Subscribed to sessionStorage updates.\");\n\n  // To test session storage cross-tab, open two tabs to the same URL,\n  // set a value in one tab, and the other tab's subscriber will be notified.\n  // Note: If you close and reopen the tab, sessionStorage is cleared.\n  /*\n  const anotherInstanceId_ss = uuidv4();\n  const anotherSessionDataStore_ss = new WebStoragePersistence<{ lastVisitedPage: string } & UserPreferences>(sessionStorageConfig);\n  anotherSessionDataStore_ss.set(anotherInstanceId_ss, { ...initialSessionData, lastVisitedPage: '/settings', theme: 'dark' });\n  */\n  await new Promise((resolve) => setTimeout(resolve, 100)); // Allow event propagation\n\n  // unsubscribeSession();\n  // console.log('Unsubscribed from sessionStorage updates.');\n  unsubscribeSession(); // Unsubscribe for example cleanup\n}\nmanageSessionStorage();\n```\n\n### IndexedDB Persistence (`IndexedDBPersistence`)\n\n`IndexedDBPersistence` is designed for storing larger or more complex data structures. All its methods (`set`, `get`, `clear`, `close`) return `Promise`s because IndexedDB operations are asynchronous and non-blocking. It uses `@asaidimu/indexed` internally, which provides a higher-level, promise-based API over native IndexedDB.\n\n```typescript\nimport {\n  IndexedDBPersistence,\n  StoreConfig,\n  IndexedDBPersistenceConfig,\n} from \"@asaidimu/utils-persistence\";\nimport { v4 as uuidv4 } from \"uuid\"; // Recommended for generating unique instance IDs\n\ninterface Product {\n  id: string;\n  name: string;\n  price: number;\n  stock: number;\n  lastUpdated: number;\n}\n\n// Generate a unique instance ID for this specific browser tab/session/component.\nconst instanceId = uuidv4();\n\n// Instantiate the IndexedDB store.\n// A 'store' identifies the specific document/state within the database/collection.\n// The 'database' is the IndexedDB database name.\n// The 'collection' is the object store name within that database.\nconst indexedDBConfig: StoreConfig<Product[]> & IndexedDBPersistenceConfig = {\n  version: \"2.0.0\", // Let's use a new version for migration example\n  app: \"product-catalog\",\n  store: \"all-products-inventory\", // Unique identifier for this piece of data/document\n  database: \"my-app-database\", // Name of the IndexedDB database\n  collection: \"app-stores\", // Name of the object store (table-like structure)\n  enableTelemetry: false, // Optional: enable telemetry for underlying IndexedDB lib\n  onUpgrade: ({ data, version, app }) => {\n    console.log(\n      `[${app}] Migrating product data from version ${version} to 2.0.0.`,\n    );\n    if (version === \"1.0.0\" && data) {\n      // Example migration from v1.0.0: Add 'lastUpdated' field if it doesn't exist\n      const migratedData = data.map((p) => ({\n        ...p,\n        lastUpdated: p.lastUpdated || Date.now(),\n      }));\n      return { state: migratedData, version: \"2.0.0\" };\n    }\n    // If no existing data or unknown version, return null or a sensible default\n    return { state: data, version: \"2.0.0\" };\n  },\n};\n\nconst productCache = new IndexedDBPersistence<Product[]>(indexedDBConfig);\n\nasync function manageProductCache() {\n  console.log(\"--- IndexedDB Example ---\");\n\n  // Set initial product data - AWAIT the promise!\n  const products: Product[] = [\n    {\n      id: \"p001\",\n      name: \"Laptop\",\n      price: 1200,\n      stock: 50,\n      lastUpdated: Date.now(),\n    },\n    {\n      id: \"p002\",\n      name: \"Mouse\",\n      price: 25,\n      stock: 200,\n      lastUpdated: Date.now(),\n    },\n  ];\n  try {\n    const setResult = await productCache.set(instanceId, products);\n    console.log(\"Products cached successfully:\", setResult); // Expected: true\n  } catch (error) {\n    console.error(\"Failed to set products:\", error);\n  }\n\n  // Get data - AWAIT the promise!\n  const cachedProducts = await productCache.get();\n  if (cachedProducts) {\n    console.log(\"Retrieved products:\", cachedProducts);\n  } else {\n    console.log(\"No products found in cache.\");\n  }\n\n  // Subscribe to changes from *other* tabs/instances\n  const unsubscribeProducts = productCache.subscribe(instanceId, (newState) => {\n    console.log(\"🔔 Product cache updated by another instance:\", newState);\n    // Refresh your product list in the UI, re-fetch data, etc.\n  });\n  console.log(\"Subscribed to IndexedDB product updates.\");\n\n  // Simulate an update from another instance (e.g., from a different tab)\n  const updatedProducts: Product[] = [\n    {\n      id: \"p001\",\n      name: \"Laptop Pro\",\n      price: 1150,\n      stock: 45,\n      lastUpdated: Date.now(),\n    }, // Price and stock updated\n    {\n      id: \"p002\",\n      name: \"Wireless Mouse\",\n      price: 30,\n      stock: 190,\n      lastUpdated: Date.now(),\n    },\n    {\n      id: \"p003\",\n      name: \"Mechanical Keyboard\",\n      price: 75,\n      stock: 150,\n      lastUpdated: Date.now(),\n    }, // New product\n  ];\n  try {\n    // Use a *new* instanceId for simulation to trigger the subscriber in the *first* tab\n    const updateResult = await productCache.set(uuidv4(), updatedProducts);\n    console.log(\"Simulated update from another instance:\", updateResult);\n  } catch (error) {\n    console.error(\"Failed to simulate product update:\", error);\n  }\n\n  // Give time for the event to propagate and be processed by the subscriber\n  await new Promise((resolve) => setTimeout(resolve, 100)); // Short delay for async event bus\n\n  // Verify updated data\n  const updatedCachedProducts = await productCache.get();\n  console.log(\"Products after update:\", updatedCachedProducts);\n\n  // After a while, if no longer needed, unsubscribe\n  // setTimeout(() => {\n  //   unsubscribeProducts();\n  //   console.log('Unsubscribed from product cache updates.');\n  // }, 5000);\n  unsubscribeProducts(); // Unsubscribe for example cleanup\n\n  // Clear data - AWAIT the promise!\n  // const cleared = await productCache.clear();\n  // console.log('Products cleared:', cleared); // Expected: true\n  // console.log('Products after clear:', await productCache.get()); // Expected: null\n\n  // Important: Close the underlying IndexedDB connection when your application is shutting down\n  // or when no more IndexedDB operations are expected across all instances of IndexedDBPersistence.\n  // This is a static method that closes shared database connections managed by the library.\n  // This is generally called once when the application (or a specific database usage) fully shuts down.\n  // await IndexedDBPersistence.closeAll(); // If SharedResources was exposed publicly.\n  // Instead, use the instance's close() method if you want to close that specific database.\n  try {\n    await productCache.close(); // Closes 'my-app-database'\n    console.log('IndexedDB connection for \"my-app-database\" closed.');\n  } catch (error) {\n    console.error(\"Failed to close IndexedDB connection:\", error);\n  }\n}\n\n// Call the async function to start the example\n// manageProductCache();\n```\n\n### Ephemeral Persistence (`EphemeralPersistence`)\n\n`EphemeralPersistence` provides an in-memory store that **does not persist data across page reloads or application restarts**. Its primary strength lies in enabling **cross-tab synchronization** for transient, session-specific state using a Last Write Wins (LWW) strategy. This means if the same `storageKey` is used across multiple browser tabs, the latest update (based on timestamp) from any tab will propagate and overwrite the in-memory state in all other tabs.\n\nThis adapter's `set`, `get`, and `clear` operations are synchronous, returning `boolean` values or `T | null` directly.\n\n```typescript\nimport { EphemeralPersistence, StoreConfig } from \"@asaidimu/utils-persistence\";\nimport { v4 as uuidv4 } from \"uuid\";\n\ninterface SessionData {\n  activeUsers: number;\n  lastActivity: string;\n  isPolling: boolean;\n}\n\n// Generate a unique instance ID for this specific browser tab/session/component.\nconst instanceId = uuidv4();\n\n// Instantiate the Ephemeral store.\n// The 'storageKey' is a logical key for this specific piece of in-memory data.\nconst ephemeralConfig: StoreConfig<SessionData> & { storageKey: string } = {\n  version: \"1.0.0\",\n  app: \"multi-tab-session\",\n  storageKey: \"global-session-state\",\n  onUpgrade: ({ data, version, app }) => {\n    console.log(\n      `[${app}] Initializing/Migrating ephemeral state from version ${version}.`,\n    );\n    // For EphemeralPersistence, onUpgrade is called with data: null initially\n    return {\n      state: data || {\n        activeUsers: 0,\n        lastActivity: new Date().toISOString(),\n        isPolling: false,\n      },\n      version: \"1.0.0\",\n    };\n  },\n};\nconst sessionStateStore = new EphemeralPersistence<SessionData>(\n  ephemeralConfig,\n);\n\nasync function manageSessionState() {\n  console.log(\"--- Ephemeral Persistence Example ---\");\n\n  // Set initial session data\n  const initialData: SessionData = {\n    activeUsers: 1,\n    lastActivity: new Date().toISOString(),\n    isPolling: true,\n  };\n  const setResult = sessionStateStore.set(instanceId, initialData);\n  console.log(\"Session state set successfully:\", setResult); // Expected: true\n\n  // Get data\n  let currentSessionState = sessionStateStore.get();\n  console.log(\"Current session state:\", currentSessionState);\n\n  // Subscribe to changes from *other* tabs/instances\n  // Open another browser tab to the same application URL to test this.\n  const unsubscribeSessionState = sessionStateStore.subscribe(\n    instanceId,\n    (newState) => {\n      console.log(\"🔔 Session state updated from another instance:\", newState);\n      // You might update a UI counter, re-render a component, etc.\n    },\n  );\n  console.log(\"Subscribed to Ephemeral session state updates.\");\n\n  // Simulate an update from another instance (e.g., from a different tab)\n  const updatedData: SessionData = {\n    activeUsers: 2, // User joined in another tab\n    lastActivity: new Date().toISOString(),\n    isPolling: true,\n  };\n  // Use a *new* instanceId for simulation to trigger the subscriber in the *first* tab\n  const updateResult = sessionStateStore.set(uuidv4(), updatedData);\n  console.log(\"Simulated update from another instance:\", updateResult);\n\n  // Give time for the event to propagate and be processed by the subscriber\n  await new Promise((resolve) => setTimeout(resolve, 50)); // Short delay for async event bus\n\n  // Verify updated data locally\n  const updatedCurrentSessionState = sessionStateStore.get();\n  console.log(\"Session state after update:\", updatedCurrentSessionState);\n\n  // After a while, if no longer needed, unsubscribe\n  // setTimeout(() => {\n  //   unsubscribeSessionState();\n  //   console.log('Unsubscribed from session state updates.');\n  // }, 5000);\n  unsubscribeSessionState(); // Unsubscribe for example cleanup\n\n  // Clear data: this will also propagate via LWW to other tabs\n  const clearResult = sessionStateStore.clear();\n  console.log(\"Session state cleared:\", clearResult); // Expected: true\n  console.log(\"Session state after clear:\", sessionStateStore.get()); // Expected: null\n}\n\n// Call the async function to start the example\n// manageSessionState();\n```\n\n### Common Use Cases\n\n- **User Preferences**: Store user settings like theme, language, or notification preferences using `WebStoragePersistence`. These are often small and need to persist across sessions.\n- **Offline Data Caching**: Cache large datasets (e.g., product catalogs, article content, user-generated content) using `IndexedDBPersistence` to enable offline access and improve perceived performance.\n- **Shopping Cart State**: Persist a user's shopping cart items using `WebStoragePersistence` (for simple carts with limited items) or `IndexedDBPersistence` (for more complex carts with detailed product information, images, or large quantities) to survive page refreshes or browser restarts.\n- **Form State Preservation**: Temporarily save complex multi-step form data using `sessionStorage` (via `WebStoragePersistence`) to prevent data loss on accidental navigation or refreshes within the same browser tab session.\n- **Cross-Tab/Instance Synchronization**: Use the `subscribe` method to build features that require real-time updates across multiple browser tabs, such as a shared todo list, live chat status indicators, synchronized media playback state, or collaborative document editing. This is particularly useful for `EphemeralPersistence` for transient, non-persistent shared state.\n- **Feature Flags/A/B Testing**: Store user-specific feature flag assignments or A/B test group allocations in `localStorage` for consistent experiences across visits.\n\n---\n\n## 🏗️ Project Architecture\n\nThe `@asaidimu/utils-persistence` library is structured to be modular and extensible, adhering strictly to the `SimplePersistence` interface as its core contract. This design promotes interchangeability and ease of maintenance.\n\n### Core Components\n\n- **`SimplePersistence<T>`**: This is the fundamental TypeScript interface that defines the contract for any persistence adapter. It ensures a consistent API for `set`, `get`, `subscribe`, `clear`, and `stats` operations, regardless of the underlying storage mechanism. The `StoreConfig<T>` interface provides common configuration for versioning, application identification, and data migration.\n- **`WebStoragePersistence<T>`**:\n  - **Purpose**: Provides simple key-value persistence leveraging the browser's `localStorage` or `sessionStorage` APIs.\n  - **Mechanism**: Directly interacts with `window.localStorage` or `window.sessionStorage`. Data is serialized/deserialized using `JSON.stringify` and `JSON.parse`.\n  - **Synchronization**: Utilizes `window.addEventListener('storage', ...)` for `localStorage` (which triggers when changes occur in _other_ tabs on the same origin) and the `@asaidimu/events` event bus (which uses `BroadcastChannel` internally) to ensure real-time updates across multiple browser tabs for both `localStorage` and `sessionStorage`.\n- **`EphemeralPersistence<T>`**:\n  - **Purpose**: Offers an in-memory store for transient data that needs cross-tab synchronization but _not_ persistence across page reloads.\n  - **Mechanism**: Stores data in a private class property. Data is cloned using `structuredClone` to prevent direct mutation issues.\n  - **Synchronization**: Leverages the `@asaidimu/events` event bus (via `BroadcastChannel`) for cross-instance synchronization. It implements a Last Write Wins (LWW) strategy based on timestamps included in the broadcast events, ensuring all tabs converge to the most recently written state.\n- **`IndexedDBPersistence<T>`**:\n  - **Purpose**: Provides robust, asynchronous persistence using the browser's `IndexedDB` API, suitable for larger datasets and structured data.\n  - **Mechanism**: Builds upon `@asaidimu/indexed` for simplified IndexedDB interactions (handling databases, object stores, and transactions) and `@asaidimu/query` for declarative data querying. Data is stored in a specific `collection` (object store) within a `database`, identified by a `store` key.\n  - **Shared Resources**: Employs a `SharedResources` singleton pattern to manage and cache `Database` connections, `Collection` instances, and `EventBus` instances efficiently across multiple `IndexedDBPersistence` instances. This avoids redundant connections, ensures a single source of truth for IndexedDB operations, and manages global event listeners effectively.\n  - **Synchronization**: Leverages the `@asaidimu/events` event bus (via `BroadcastChannel`) for cross-instance synchronization of IndexedDB changes, notifying other instances about updates.\n- **`@asaidimu/events`**: An internal utility package that provides a powerful, cross-tab compatible event bus using `BroadcastChannel`. It's crucial for enabling the automatic synchronization features of all persistence adapters.\n- **`@asaidimu/indexed` & `@asaidimu/query`**: These are internal utility packages specifically used by `IndexedDBPersistence` to abstract and simplify complex interactions with the native IndexedDB API, offering a more declarative and promise-based interface. `@asaidimu/indexed` handles database schema, versions, and CRUD operations, while `@asaidimu/query` provides a query builder for data retrieval.\n\n### Data Flow for State Changes\n\n1.  **Setting State (`set(instanceId, state)`):**\n    - The provided `state` (of type `T`) is first serialized into a format suitable for the underlying storage (e.g., `JSON.stringify` for web storage, `structuredClone` for ephemeral, or directly as an object for IndexedDB).\n    - It's then saved to the respective storage mechanism (`localStorage`, `sessionStorage`, in-memory, or an IndexedDB object store). For IndexedDB, existing data for the given `store` key is updated, or new data is created.\n    - An event (of type `store:updated`) is immediately `emit`ted on an internal event bus (from `@asaidimu/events`). This event includes the `instanceId` of the updater, the `storageKey`/`store` identifying the data, and the new `state`. For `EphemeralPersistence`, a `timestamp` is also included for LWW resolution. This event is broadcast to other browser tabs via `BroadcastChannel` (managed by `@asaidimu/events`).\n    - For `localStorage`, native `StorageEvent`s also trigger when the value is set from another tab. The `WebStoragePersistence` adapter listens for these native events and re-emits them on its internal event bus, ensuring consistent notification pathways.\n2.  **Getting State (`get()`):**\n    - The adapter retrieves the serialized data using the configured `storageKey` or `store` from the underlying storage.\n    - It attempts to parse/deserialize the data back into the original `T` type (e.g., `JSON.parse` or direct access).\n    - Returns the deserialized data, or `null` if the data is not found or cannot be parsed.\n3.  **Subscribing to Changes (`subscribe(instanceId, callback)`):**\n    - A consumer instance registers a `callback` function with its unique `instanceId` to listen for `store:updated` events on the internal event bus.\n    - When an `store:updated` event is received, the adapter checks if the `instanceId` of the event's source matches the `instanceId` of the subscribing instance.\n    - The `callback` is invoked _only if_ the `instanceId` of the update source does _not_ match the `instanceId` of the subscribing instance. This crucial filtering prevents self-triggered loops (where an instance updates its own state, receives its own update notification, and attempts to re-update, leading to an infinite cycle) and ensures the `callback` is exclusively for external changes.\n\n### Extension Points\n\nThe library is designed with extensibility in mind. You can implement your own custom persistence adapters by simply adhering to the `SimplePersistence<T>` interface. This allows you to integrate with any storage mechanism you require.\n\nFor example, you could create adapters for:\n\n- **Remote Backend API**: An adapter that persists data to a remote server endpoint via `fetch` or `XMLHttpRequest`, enabling cross-device synchronization.\n- **Service Worker Cache API**: Leverage Service Workers for advanced caching strategies, providing highly performant offline capabilities.\n- **Custom Local Storage**: Implement a persistence layer over a custom browser extension storage or a file system in an Electron app.\n\n---\n\n## 🧑‍💻 Development & Contributing\n\nWe welcome contributions to `@asaidimu/utils-persistence`! Please follow these guidelines to ensure a smooth collaboration.\n\n### Development Setup\n\n1.  **Clone the Repository**: This library is part of a larger monorepo.\n    ```bash\n    git clone https://github.com/asaidimu/erp-utils.git # Or the actual monorepo URL\n    cd erp-utils # Navigate to the monorepo root\n    ```\n2.  **Install Dependencies**: Install all monorepo dependencies.\n    ```bash\n    bun install # or yarn install or npm install\n    ```\n    This will install all necessary development dependencies, including TypeScript, Vitest, ESLint, and Prettier.\n\n### Scripts\n\nThe following `bun` scripts are available for development within the `src/persistence` directory (or can be run from the monorepo root if configured):\n\n- `bun run build` (or `npm run build`): Compiles the TypeScript source files to JavaScript.\n- `bun run test` (or `npm run test`): Runs the test suite using `vitest`.\n- `bun run test:watch` (or `npm run test:watch`): Runs tests in watch mode, re-running on file changes.\n- `bun run lint` (or `npm run lint`): Lints the codebase using ESLint to identify potential issues and enforce coding standards.\n- `bun run format` (or `npm run format`): Formats the code using Prettier to ensure consistent code style.\n\n### Testing\n\nTests are crucial for maintaining the quality and stability of the library. The project uses `vitest` for testing.\n\n- To run all tests:\n  ```bash\n  bun test\n  ```\n- To run tests in watch mode during development:\n  ```bash\n  bun test:watch\n  ```\n- Ensure that your changes are covered by new or existing tests, and that all tests pass before submitting a pull request. The `fixtures.ts` file provides a generic test suite (`testSimplePersistence`) for any `SimplePersistence` implementation, ensuring consistent behavior across adapters.\n\n### Contributing Guidelines\n\n- **Fork the repository** and create your branch from `main`.\n- **Follow existing coding standards**: Adhere to the TypeScript, ESLint, and Prettier configurations defined in the project.\n- **Commit messages**: Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) for clear and consistent commit history (e.g., `feat(persistence): add new adapter`, `fix(webstorage): resolve subscription issue`, `docs(readme): update usage examples`).\n- **Pull Requests**:\n  - Open a pull request against the `main` branch.\n  - Provide a clear and detailed description of your changes, including the problem solved and the approach taken.\n  - Reference any related issues (e.g., `Closes #123`).\n  - Ensure all tests pass and the code is lint-free before submitting.\n- **Code Review**: Be open to feedback and suggestions during the code review process.\n\n### Issue Reporting\n\nIf you find a bug or have a feature request, please open an issue on our [GitHub Issues page](https://github.com/asaidimu/erp-utils/issues). When reporting a bug, please include:\n\n- A clear, concise title.\n- Steps to reproduce the issue.\n- Expected behavior.\n- Actual behavior.\n- Your environment (browser version, Node.js version, `@asaidimu/utils-persistence` version).\n- Any relevant code snippets or error messages.\n\n---\n\n## ℹ️ Additional Information\n\n### Troubleshooting\n\n- **Storage Limits**: Be aware that browser storage mechanisms have size limitations. `localStorage` and `sessionStorage` typically offer 5-10 MB, while `IndexedDB` can store much larger amounts (often gigabytes, depending on browser and available disk space). For large data sets, always prefer `IndexedDBPersistence`.\n- **JSON Parsing Errors**: `WebStoragePersistence` and `IndexedDBPersistence` (for the `data` field) serialize and deserialize your data using `JSON.stringify` and `JSON.parse`. `EphemeralPersistence` uses `structuredClone`. Ensure that the `state` object you are passing to `set` is a valid JSON-serializable object (i.e., it doesn't contain circular references, functions, or Symbols that JSON cannot handle).\n- **Cross-Origin Restrictions**: Browser storage is typically restricted to the same origin (protocol, host, port). You cannot access data stored by a different origin. Ensure your application is running on the same origin across all tabs for cross-tab synchronization to work.\n- **`IndexedDBPersistence` Asynchronous Nature**: Remember that `IndexedDBPersistence` methods (`set`, `get`, `clear`, `close`) return `Promise`s. Always use `await` or `.then()` to handle their results and ensure operations complete before proceeding. Forgetting to `await` can lead to unexpected behavior or race conditions.\n- **`EphemeralPersistence` Data Loss**: Data stored with `EphemeralPersistence` is _not_ persisted across page reloads or browser restarts. It is strictly an in-memory solution synchronized across active tabs for the current browsing session. If you need data to survive refreshes, use `WebStoragePersistence` or `IndexedDBPersistence`.\n- **`instanceId` Usage**: The `instanceId` parameter in `set` and `subscribe` is crucial for distinguishing between local updates and updates from other instances. Ensure each tab/instance of your application generates a _unique_ ID (e.g., a UUID, like `uuidv4()`) upon startup and consistently uses it for all `set` and `subscribe` calls from that instance. This ID is _not_ persisted to storage; it's ephemeral for the current session of that tab.\n- **`subscribe` Callback Not Firing**: The most common reason for this is attempting to trigger the callback from the _same_ `instanceId` that subscribed. The `subscribe` method deliberately filters out updates from the `instanceId` that subscribed to prevent infinite loops and ensure efficient state reconciliation. To test cross-instance synchronization, open two browser tabs to your application, or ensure two different logical instances are created (each with a unique `instanceId`). Perform a `set` operation in one instance using its unique `instanceId`; the `subscribe` callback in the _other_ instance (with a different `instanceId`) should then fire.\n- **Data Migration (`onUpgrade`):** When implementing `onUpgrade`, remember that the `data` parameter can be `null` if no prior state was found. Your handler should gracefully manage this, potentially returning a default state for the new version. The returned `version` in the `onUpgrade` handler _must_ match the `config.version` provided to the persistence constructor.\n\n### FAQ\n\n**Q: What's the difference between `store` (or `storageKey`) and `instanceId`?**\nA: `store` (for `IndexedDBPersistence` and `EphemeralPersistence`) or `storageKey` (for `WebStoragePersistence`) is the name or identifier of the _data set_ or \"document\" you are persisting (e.g., `'user-profile'`, `'shopping-cart'`, `'all-products-inventory'`). It's the key under which the data itself is stored.\n`instanceId` is a unique identifier for the _browser tab, application window, or a specific component instance_ currently interacting with the store. It's an ephemeral ID (e.g., a UUID generated at app startup) that helps the `subscribe` method differentiate between updates originating from the current instance versus those coming from _other_ instances (tabs, windows, or distinct components) of your application, preventing self-triggered loops in your state management.\n\n**Q: Why is `IndexedDBPersistence` asynchronous, but `WebStoragePersistence` and `EphemeralPersistence` are synchronous?**\nA: `WebStoragePersistence` utilizes `localStorage` and `sessionStorage`, which are inherently synchronous APIs in web browsers. This means operations block the main thread until they complete. Similarly, `EphemeralPersistence` is an in-memory solution, and its direct data access is synchronous. In contrast, `IndexedDB` is an asynchronous API by design to avoid blocking the main thread, which is especially important when dealing with potentially large datasets or complex queries. Our `IndexedDBPersistence` wrapper naturally exposes this asynchronous behavior through Promises to align with best practices for non-blocking operations. All three adapters use asynchronous mechanisms for _cross-tab synchronization_.\n\n**Q: Can I use this library in a Node.js environment?**\nA: No, this library is specifically designed for browser environments. It relies heavily on browser-specific global APIs such as `window.localStorage`, `window.sessionStorage`, `indexedDB`, and `BroadcastChannel` (for cross-tab synchronization), none of which are available in a standard Node.js runtime.\n\n**Q: My `subscribe` callback isn't firing, even when I change data.**\nA: The most common reason for this is attempting to trigger the callback from the _same_ `instanceId` that subscribed. The `subscribe` method deliberately filters out updates from the `instanceId` that subscribed to prevent infinite loops and ensure efficient state reconciliation. To test cross-instance synchronization, open two browser tabs to your application, or ensure two different logical instances are created (each with a unique `instanceId`). Perform a `set` operation in one instance using its unique `instanceId`; the `subscribe` callback in the _other_ instance (with a different `instanceId`) should then fire.\n\n**Q: When should I choose `EphemeralPersistence` over `WebStoragePersistence` or `IndexedDBPersistence`?**\nA: Choose `EphemeralPersistence` when:\n\n- You need cross-tab synchronized state that **does not need to persist across page reloads**.\n- The data is transient and only relevant for the current browsing session.\n- You want very fast in-memory operations.\n  Use `WebStoragePersistence` for small, persistent key-value data, and `IndexedDBPersistence` for larger, structured data that needs to persist reliably.\n\n### Changelog\n\nFor detailed changes between versions, please refer to the [CHANGELOG.md](https://github.com/asaidimu/erp-utils/blob/main/packages/utils/src/persistence/CHANGELOG.md) file in the project's root directory (or specific package directory).\n\n### License\n\nThis project is licensed under the MIT License. See the [LICENSE](https://github.com/asaidimu/erp-utils/blob/main/LICENSE) file for details.\n\n### Acknowledgments\n\nThis library leverages and builds upon the excellent work from:\n\n- [`@asaidimu/events`](https://github.com/asaidimu/events): For robust cross-tab event communication and asynchronous event bus capabilities.\n- [`@asaidimu/indexed`](https://github.com/asaidimu/indexed): For providing a simplified and promise-based interface for IndexedDB interactions.\n- [`@asaidimu/query`](https://github.com/asaidimu/query): For offering a declarative query builder used internally with IndexedDB operations.\n","readmeFilename":"README.md"}