{"_id":"@push.rocks/smartfs","_rev":"14-6bb3df13adba4f2bc391e3bdec1228bd","name":"@push.rocks/smartfs","dist-tags":{"latest":"1.7.0"},"versions":{"1.1.0":{"name":"@push.rocks/smartfs","version":"1.1.0","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.1.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"8e928c2335850c636677b2b69f6eee3d07c43283","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.1.0.tgz","fileCount":43,"integrity":"sha512-fg8JIjFUPPX5laRoBpTaGwhMfZ3Y8mFT4fUaW54Y4J/BfOBa/y0+rIFgvgvqcOZgkQlyZU+FIfL8Z6zezqxyTg==","signatures":[{"sig":"MEQCIC4BQDXgE7tHcMHMZKLXvBRT4CCGs1OPX7akzLdNtbKcAiBT4PC2Y+xEfg/fw68RRpDJ32Y1nf9AJQu/dFjxoLmU7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228365},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.1.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/60012a9cfb1b758a29b03d6166f67eae/push.rocks-smartfs-1.1.0.tgz","_integrity":"sha512-fg8JIjFUPPX5laRoBpTaGwhMfZ3Y8mFT4fUaW54Y4J/BfOBa/y0+rIFgvgvqcOZgkQlyZU+FIfL8Z6zezqxyTg==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.3.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"23.8.0","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.1.0_1763750269877_0.3673319527911565","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@push.rocks/smartfs","version":"1.1.1","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.1.1","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"a25aa5333852095e4cd49c19983f7feedc2cb302","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.1.1.tgz","fileCount":43,"integrity":"sha512-Usaqo8Vzm7n39xIztaMs6V3LFD2pFvoO24stUTmNB6XHqbNmYFkRxqNvMkI9WxHi2asf5F37mFIhnXNWiMu9CQ==","signatures":[{"sig":"MEQCIDYpmn4p9epM7othQ7IcbB8qzBdGLNGYqjmuRr9371O3AiBHJld10oGc1fFD/XldNOxzcNAN5RICzEtK1KJv1DE9rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":228393},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.1.1.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/b6a61ec4e5eb49286854ea4dbae9ce33/push.rocks-smartfs-1.1.1.tgz","_integrity":"sha512-Usaqo8Vzm7n39xIztaMs6V3LFD2pFvoO24stUTmNB6XHqbNmYFkRxqNvMkI9WxHi2asf5F37mFIhnXNWiMu9CQ==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.3.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"23.8.0","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.1.1_1764447973041_0.0009386141662928171","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@push.rocks/smartfs","version":"1.1.2","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.1.2","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"8988e4dd8a4132e8a8d88c13879e57fb1ced662f","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.1.2.tgz","fileCount":43,"integrity":"sha512-zk2RaflQMKoQa7ct1l/+dTtgBsW6cZI151H1H6TLrqKncyHETYBJBKdFL/cJTJKXvvi9jYhb/j7c5kDLCYX+7Q==","signatures":[{"sig":"MEUCIQDFo9VKdQuQn7kv7GDPvd1sB0oWdFuqSMVfMpgNb4+zoAIgQyoA/95IRQNGM0YxLMdUZ1Nkd1lSkrrBvo3dWn1++bk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229176},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.1.2.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/e5c73657178ae2b8b3803d54118b9e33/push.rocks-smartfs-1.1.2.tgz","_integrity":"sha512-zk2RaflQMKoQa7ct1l/+dTtgBsW6cZI151H1H6TLrqKncyHETYBJBKdFL/cJTJKXvvi9jYhb/j7c5kDLCYX+7Q==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.3.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"23.8.0","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.1.2_1764450121498_0.9259060329927826","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@push.rocks/smartfs","version":"1.1.3","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.1.3","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"093bcdecea1ed24a4c972824064730e5d90ce508","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.1.3.tgz","fileCount":43,"integrity":"sha512-yUGHv27D2wTRTTsSai6FPT4P4LypNoRxioS7//wHFLD1l5i6LS64SvGq54fgZCP72fXxYPzeLbVCqABweCmocg==","signatures":[{"sig":"MEUCIQCfwgKs0yeU2DTJzaFysR+XSKEDrVuS7lHCUh4N93fEZQIgG+HZq+qBC2j/G4MjIOjLLjg0gSjEuvvTezIFp8ygsV0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":229204},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.1.3.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/8571ff4544ff7eadc9bec18a9055cb0a/push.rocks-smartfs-1.1.3.tgz","_integrity":"sha512-yUGHv27D2wTRTTsSai6FPT4P4LypNoRxioS7//wHFLD1l5i6LS64SvGq54fgZCP72fXxYPzeLbVCqABweCmocg==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.3.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"23.8.0","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.1.3_1764526235125_0.4375110116924179","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@push.rocks/smartfs","version":"1.2.0","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.2.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"6dddce88c1a9dd1baee88820bb1ec5c941d8dafb","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.2.0.tgz","fileCount":43,"integrity":"sha512-1R47jJZwX869z7DYgKeAZKTU1SbGnM7W/ZmgsI7AkQQhiascNqY3/gF4V5kIprmuf1WhpRbCbZyum8s7J1LDdg==","signatures":[{"sig":"MEYCIQDiA6BYhC0M5r4Z3c7V5cfh5pQlKO0pFW9EdEO1E9zGQgIhAOyMHAQG1ncWuZHgybdT9IiQAzL08A2XPmD0scdC04bl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236668},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.2.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/f512b27ca4140eaad645b4ca15f2d173/push.rocks-smartfs-1.2.0.tgz","_integrity":"sha512-1R47jJZwX869z7DYgKeAZKTU1SbGnM7W/ZmgsI7AkQQhiascNqY3/gF4V5kIprmuf1WhpRbCbZyum8s7J1LDdg==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.3.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"23.8.0","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.2.0_1764664546695_0.44146915738708103","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@push.rocks/smartfs","version":"1.3.0","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.3.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"38d288fcf9bc0f1d9dc922b174a0b23955c626ac","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.3.0.tgz","fileCount":43,"integrity":"sha512-pelswIM49HyU9SAve+nzMg4uzJ4IxCiuwGwehE/p41PLDfejV6dQgyfmYQ328Ghpa/X8ZILvmH8zpg3KrOCqkw==","signatures":[{"sig":"MEYCIQCEsuNPVmxyrkHCmVlfid3tUSTIHvLJ4ye3x+6t4AOjXwIhALmCw0LgXEafhvj8Pp5UWouSz6cd+RQhmDSmqSDX6uD4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252458},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"6a7f7496eae60e71af5629a35f055db3d2d60552","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.3.0_1765879369365_0.3544308544505945","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@push.rocks/smartfs","version":"1.3.1","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.3.1","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"3acd2005e9bfc94811c3e6d2b753fc359a8c2436","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.3.1.tgz","fileCount":43,"integrity":"sha512-ZSduVS8tM+/erbyCTvRRvc9gLWwbpqN5xdIIkMr+gub7fowSeJb7tR2rnGwySa63DyimU0q2KTp79VV9YqGLeg==","signatures":[{"sig":"MEYCIQDXzpojrh3An6q7jZnZGY2vl1qM0K+wp4Dj1T60CyBckwIhAP5Bgq8S/kde+BtrS30JlfKKjmFdsOjw372o3rG8/lga","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254057},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"e993f6deb95bb286fbafb39787de76369f64c9e1","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.3.1_1765879827104_0.016520426704375923","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@push.rocks/smartfs","version":"1.3.2","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.3.2","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"b47f6a63cc8a8aee4031b0a8e4323123a5ffa236","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.3.2.tgz","fileCount":43,"integrity":"sha512-Fpr4O4xb5DUMBjmgUr3TCimmt6tAjCAPefUU2isV5xexbZS0vhBNiB2GehhuvAXmXDrbQcsTgd8hs6ags6SDog==","signatures":[{"sig":"MEMCH32tLRFdlp5Cz6PD/QfPOFll3e0h/h3+tu0FhGx2p/cCIBi8pVAvE4XP1dbmek82LNbJv2vhHPBgSoo+532eib9t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254965},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"9b47e0d00242e39f560edc58f14822729d00de26","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.3.2_1772714729570_0.5012026683553323","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@push.rocks/smartfs","version":"1.3.3","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.3.3","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"3241dfeaa44f556e54ab6b690bcde9eafcba3e5c","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.3.3.tgz","fileCount":43,"integrity":"sha512-IF16dgeDFDv65j+lhyhqjhm6gFhBrWTrnayVOCwbBg4yJ/6tNpd7sL8YsvBJRBRCBWrMFBCSL7thG0Thvq0VZA==","signatures":[{"sig":"MEQCICn20L/62CHCbf0wHnToO9Z6anpb4lZGcHZOo0usIwrhAiBWVPTMVoDI2FUN593YecDxyW++AwLgRoZKD5YTbjzP9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254057},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"61e3f3a0b6bfcb932f506cf8a5520493d2db4d93","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^20.8.7","@git.zone/tsrun":"^2.0.0","@git.zone/tstest":"^3.1.1","@git.zone/tsbuild":"^3.1.0","@git.zone/tsbundle":"^2.0.5","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.3.3_1772717309333_0.052336166216673474","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@push.rocks/smartfs","version":"1.4.0","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.4.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"9474a014a693a51a9b5cf7ef601a955b124be187","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.4.0.tgz","fileCount":47,"integrity":"sha512-4PgteGOyMBiUWKLfTXOjxrZz+sXPLnvcmHeAEHY2gwZJflfp5/YDVPhodctOydersXzkynO359dIGLSCyQnnAQ==","signatures":[{"sig":"MEUCIQC/s0wIROtD/2HvqkPgGnZk7Ml+R0BVjZus4IQT0k5NcgIgXS8CXReqv4E8wdXgaU4y/QEbtxYWR2pqEZbAetrT+MU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2301920},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"647cb5e92f804c9e8c0fc0a55a39d9076059969c","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany && tsrust)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0","@push.rocks/smartrust":"^1.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^25.3.3","@git.zone/tsrun":"^2.0.1","@git.zone/tsrust":"^1.3.0","@git.zone/tstest":"^3.2.0","@git.zone/tsbuild":"^4.2.6","@git.zone/tsbundle":"^2.9.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.4.0_1772739390728_0.622081704030625","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@push.rocks/smartfs","version":"1.5.0","author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.5.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"64f146d3d98fdafd2420ae9df63366e575ffbda7","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.5.0.tgz","fileCount":47,"integrity":"sha512-QwMD44HgX3d9PPxUwR0uS+0PEMtesKvKbZR+s4pezL2er6oPneKJMLkO6TJPvJ38nug6Lmlk9Bu7UrwR2kS3Vw==","signatures":[{"sig":"MEYCIQD3CMU3bCuM9ueVXK2erPYASx7HJIekaXbusnvjW+M1PQIhAP7FYdL3AAhfLA8wBYItFApd6OpXnAdYXw0EDxzzDBbL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2301376},"main":"dist_ts/index.js","pnpm":{"overrides":{}},"type":"module","gitHead":"e0d82eff2593dda12bfeb200577a6640a343ef18","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web --allowimplicitany && tsrust)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"a cross platform extendable fs  module","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0","@push.rocks/smartrust":"^1.3.1"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34","devDependencies":{"@types/node":"^25.3.3","@git.zone/tsrun":"^2.0.1","@git.zone/tsrust":"^1.3.0","@git.zone/tstest":"^3.3.0","@git.zone/tsbuild":"^4.2.6","@git.zone/tsbundle":"^2.9.1","@push.rocks/tapbundle":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.5.0_1772796922385_0.10216819749334194","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@push.rocks/smartfs","version":"1.5.1","keywords":["filesystem","fs","typescript","rust","streams","transactions","watching","storage"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.5.1","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"8505e66da64ac0a5ee14cbd2abd4a193cb92f67c","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.5.1.tgz","fileCount":48,"integrity":"sha512-M/JIRWhVwY6EhwEGL+wz3d1CkuNTcBTXKylOv/gk1fyfw3tnkOQheux+NjV/8lVMQG+NeQca5yUaJIz1s+OESA==","signatures":[{"sig":"MEYCIQDBfa1OVOJTB5I+fVr+0sFB6r/U+L+NfOaoAO+1U53QYwIhALi+mbLBJ0iRo93kUvUGFBfZ57V0tKESONUptM3qHW5C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2304459},"main":"dist_ts/index.js","type":"module","gitHead":"8420bb3c2ddd6fe0a416876311fdb54e91f1b334","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web && tsrust)","buildDocs":"(tsdoc)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"A cross-platform, extensible filesystem module with pluggable providers and Rust-backed durability.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0","@push.rocks/smartrust":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.28.2","devDependencies":{"@types/node":"^25.6.0","@git.zone/tsrun":"^2.0.2","@git.zone/tsrust":"^1.3.2","@git.zone/tstest":"^3.6.3","@git.zone/tsbuild":"^4.4.0","@git.zone/tsbundle":"^2.10.0"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.5.1_1777538693008_0.5231834137054026","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@push.rocks/smartfs","version":"1.6.0","keywords":["filesystem","fs","typescript","rust","streams","transactions","watching","storage"],"author":{"name":"Task Venture Capital GmbH"},"license":"MIT","_id":"@push.rocks/smartfs@1.6.0","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"homepage":"https://code.foss.global/push.rocks/smartfs#readme","bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"dist":{"shasum":"0e8a66fc4ffcc3e01d762f7a0427b5f8fe8630a6","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.6.0.tgz","fileCount":49,"integrity":"sha512-NQL/vahWZt2NEGl5zEQ9nd8K+C+5Mopd1aYAOTdkK/mF1boSVvTBFXMQkxKbRhshV9T/rTT6c4zmDNDF6YUa/A==","signatures":[{"sig":"MEUCIQCquGSVMhEQQIehqIIZVjZO4S/ENiS09/jMUOROoNVkKQIgQ/3Z88KNcJbGoFiX6/TqLlJKT7GXFM/oOo+IzwdpBy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6063343},"main":"dist_ts/index.js","type":"module","_from":"file:push.rocks-smartfs-1.6.0.tgz","private":false,"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","build":"(tsbuild --web && tsrust)","buildDocs":"(tsdoc)","test:rust":"(cd rust && cargo test)"},"typings":"dist_ts/index.d.ts","_npmUser":{"name":"lossless","email":"hello@lossless.com"},"_resolved":"/tmp/20e07dc00be5a1f96e1beb19a4e951d5/push.rocks-smartfs-1.6.0.tgz","_integrity":"sha512-NQL/vahWZt2NEGl5zEQ9nd8K+C+5Mopd1aYAOTdkK/mF1boSVvTBFXMQkxKbRhshV9T/rTT6c4zmDNDF6YUa/A==","repository":{"url":"https://code.foss.global/push.rocks/smartfs.git","type":"git"},"_npmVersion":"11.7.0","description":"A cross-platform, extensible filesystem module with pluggable providers and Rust-backed durability.","directories":{},"_nodeVersion":"25.2.1","dependencies":{"@push.rocks/smartpath":"^6.0.0","@push.rocks/smartrust":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^25.9.1","@git.zone/tsrun":"^2.0.4","@git.zone/tsrust":"^1.4.1","@git.zone/tstest":"^3.6.6","@git.zone/tsbuild":"^4.4.2","@git.zone/tsbundle":"^2.10.4"},"_npmOperationalInternal":{"tmp":"tmp/smartfs_1.6.0_1781052152922_0.39993517561510994","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@push.rocks/smartfs","version":"1.7.0","private":false,"description":"A cross-platform, extensible filesystem module with pluggable providers and Rust-backed durability.","main":"dist_ts/index.js","typings":"dist_ts/index.d.ts","type":"module","author":"Task Venture Capital GmbH","license":"MIT","devDependencies":{"@git.zone/tsbuild":"^4.4.2","@git.zone/tsbundle":"^2.11.4","@git.zone/tsrun":"^2.0.6","@git.zone/tsrust":"^1.8.0","@git.zone/tstest":"^4.0.0","@types/node":"^26.2.0"},"repository":{"type":"git","url":"https://code.foss.global/push.rocks/smartfs.git"},"bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"homepage":"https://code.foss.global/push.rocks/smartfs#readme","dependencies":{"@push.rocks/smartpath":"^6.0.0","@push.rocks/smartrust":"^1.7.0"},"keywords":["filesystem","fs","typescript","rust","streams","transactions","watching","storage"],"scripts":{"test":"(tstest test/ --verbose --logfile --timeout 120)","test:identity":"(SMARTFS_REQUIRE_EXT4_IDENTITY_TEST=1 tstest test/test.persistentidentity.node.ts --verbose --logfile --timeout 120)","test:rust":"(cd rust && cargo test)","build":"(tsbuild --web && tsrust)","buildDocs":"(tsdoc)"},"_nodeVersion":"25.2.1","_id":"@push.rocks/smartfs@1.7.0","dist":{"integrity":"sha512-2ILwOnq71TkmE3cVTNPkZ5oMnCqtR9hkGq1b3ytAYIjIlba7aO9cdmAZz7fd7W/Df9kLbrLw7N1oivN79K6hOQ==","shasum":"6288f2d2e723439a157e8bb66efd939b5fc4fdcf","tarball":"https://registry.npmjs.org/@push.rocks/smartfs/-/smartfs-1.7.0.tgz","fileCount":49,"unpackedSize":6283536,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFw4bO3dSfq83TSgAiGTbeu3zUz1r//p/WsU/WzP8h7tAiEA5knuMKomByYIz0KvuO3DploS/8jpRfCGGcjdSkwTtU4="}]},"_npmUser":{"name":"lossless","email":"hello@lossless.com"},"directories":{},"maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/smartfs_1.7.0_1786880829682_0.432336884613403"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-21T18:37:49.782Z","modified":"2026-08-16T11:47:10.120Z","1.1.0":"2025-11-21T18:37:50.091Z","1.1.1":"2025-11-29T20:26:13.240Z","1.1.2":"2025-11-29T21:02:01.695Z","1.1.3":"2025-11-30T18:10:35.357Z","1.2.0":"2025-12-02T08:35:46.887Z","1.3.0":"2025-12-16T10:02:49.515Z","1.3.1":"2025-12-16T10:10:27.236Z","1.3.2":"2026-03-05T12:45:29.697Z","1.3.3":"2026-03-05T13:28:29.498Z","1.4.0":"2026-03-05T19:36:30.906Z","1.5.0":"2026-03-06T11:35:22.580Z","1.5.1":"2026-04-30T08:44:53.189Z","1.6.0":"2026-06-10T00:42:33.276Z","1.7.0":"2026-08-16T11:47:09.929Z"},"bugs":{"url":"https://code.foss.global/push.rocks/smartfs/issues"},"author":"Task Venture Capital GmbH","license":"MIT","homepage":"https://code.foss.global/push.rocks/smartfs#readme","keywords":["filesystem","fs","typescript","rust","streams","transactions","watching","storage"],"repository":{"type":"git","url":"https://code.foss.global/push.rocks/smartfs.git"},"description":"A cross-platform, extensible filesystem module with pluggable providers and Rust-backed durability.","maintainers":[{"name":"lossless","email":"hello@lossless.com"}],"readme":"# @push.rocks/smartfs\n\nModern, pluggable filesystem module with fluent API, Web Streams, Rust-powered durability, and multiple storage backends.\n\n## Issue Reporting and Security\n\nFor reporting bugs, issues, or security vulnerabilities, please visit [community.foss.global/](https://community.foss.global/). This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a [code.foss.global/](https://code.foss.global/) account to submit Pull Requests directly.\n\n## Features\n\n- 🎯 **Fluent API** — Action-last chainable interface for elegant, readable code\n- 🔌 **Pluggable Providers** — Swap backends (Node.js fs, in-memory, Rust) without changing a line of application code\n- 🦀 **Rust Provider** — XFS-safe `fsync` durability, cross-compiled binary via IPC for production-grade reliability\n- 🌊 **Web Streams** — True chunked streaming with the Web Streams API (including over IPC for the Rust provider)\n- 💾 **Transactions** — Atomic multi-file operations with automatic rollback on failure\n- 👀 **File Watching** — Event-based filesystem monitoring with debounce, filters, and recursive watching\n- 🔐 **Tree Hashing** — Deterministic SHA-256 directory hashing for cache-busting and change detection\n- **Persistent ext4 Identity** — Descriptor-backed root-to-target identities that distinguish inode reuse\n- 📁 **Directory Copy & Move** — Full directory tree operations with conflict handling, filtering, and timestamp preservation\n- ⚡ **Async-Only** — Modern `async`/`await` patterns throughout — no sync footguns\n- 🎨 **TypeScript-First** — Full type safety, IntelliSense, and exported interfaces\n- 🌍 **Multi-Runtime** — Works on Node.js, Bun, and Deno\n\n## Installation\n\n```bash\npnpm add @push.rocks/smartfs\n```\n\n## Quick Start\n\n```typescript\nimport { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs';\n\n// Create a SmartFS instance with the Node.js provider\nconst fs = new SmartFs(new SmartFsProviderNode());\n\n// Write a file\nawait fs.file('/path/to/file.txt')\n  .encoding('utf8')\n  .write('Hello, World!');\n\n// Read it back\nconst content = await fs.file('/path/to/file.txt')\n  .encoding('utf8')\n  .read();\n\nconsole.log(content); // \"Hello, World!\"\n```\n\n## API Overview\n\n### 📄 File Operations\n\nThe fluent API uses an **action-last pattern** — configure first, then execute:\n\n```typescript\n// Read\nconst content = await fs.file('/path/to/file.txt')\n  .encoding('utf8')\n  .read();\n\n// Write\nawait fs.file('/path/to/file.txt')\n  .encoding('utf8')\n  .mode(0o644)\n  .write('content');\n\n// Atomic write (write to temp file, then rename — crash-safe)\nawait fs.file('/path/to/file.txt')\n  .atomic()\n  .write('content');\n\n// Append\nawait fs.file('/path/to/file.txt')\n  .append('more content');\n\n// Copy with preserved timestamps\nawait fs.file('/source.txt')\n  .preserveTimestamps()\n  .copy('/destination.txt');\n\n// Move / rename\nawait fs.file('/old.txt').move('/new.txt');\n\n// Delete\nawait fs.file('/path/to/file.txt').delete();\n\n// Existence check\nconst exists = await fs.file('/path/to/file.txt').exists();\n\n// Stats (size, timestamps, permissions, etc.)\nconst stats = await fs.file('/path/to/file.txt').stat();\n```\n\n### 📂 Directory Operations\n\n```typescript\n// Create directory (recursive by default)\nawait fs.directory('/path/to/nested/dir').create();\n\n// List contents\nconst entries = await fs.directory('/path/to/dir').list();\n\n// List recursively with glob filter and stats\nconst tsFiles = await fs.directory('/src')\n  .recursive()\n  .filter('*.ts')\n  .includeStats()\n  .list();\n\n// Filter with RegExp\nconst configs = await fs.directory('/project')\n  .filter(/\\.config\\.(ts|js)$/)\n  .list();\n\n// Filter with function\nconst largeFiles = await fs.directory('/data')\n  .includeStats()\n  .filter(entry => entry.stats && entry.stats.size > 1024)\n  .list();\n\n// Delete directory recursively\nawait fs.directory('/path/to/dir').recursive().delete();\n\n// Check existence\nconst exists = await fs.directory('/path/to/dir').exists();\n```\n\n### 📁 Directory Copy & Move\n\nCopy or move entire directory trees with fine-grained control:\n\n```typescript\n// Basic copy\nawait fs.directory('/source').copy('/destination');\n\n// Basic move\nawait fs.directory('/old-location').move('/new-location');\n\n// Copy with options\nawait fs.directory('/source')\n  .filter(/\\.ts$/)           // Only copy TypeScript files\n  .overwrite(true)           // Overwrite existing files\n  .preserveTimestamps(true)  // Keep original timestamps\n  .copy('/destination');\n\n// Ignore filter for copy (copy everything regardless of list filter)\nawait fs.directory('/source')\n  .filter('*.ts')\n  .applyFilter(false)\n  .copy('/destination');\n\n// Handle target directory conflicts\nawait fs.directory('/source')\n  .onConflict('merge')       // Default: merge contents\n  .copy('/destination');\n\nawait fs.directory('/source')\n  .onConflict('error')       // Throw if target exists\n  .copy('/destination');\n\nawait fs.directory('/source')\n  .onConflict('replace')     // Delete target first, then copy\n  .copy('/destination');\n```\n\n**Configuration Options:**\n\n| Method | Default | Description |\n|--------|---------|-------------|\n| `filter(pattern)` | none | Filter files by glob, regex, or function |\n| `applyFilter(bool)` | `true` | Whether to apply filter during copy/move |\n| `overwrite(bool)` | `false` | Overwrite existing files at destination |\n| `preserveTimestamps(bool)` | `false` | Preserve original file timestamps |\n| `onConflict(mode)` | `'merge'` | `'merge'`, `'error'`, or `'replace'` |\n\n### 🌊 Streaming Operations\n\nSmartFS uses the **Web Streams API** for efficient, memory-friendly handling of large files. All providers — including the Rust provider over IPC — support true chunked streaming:\n\n```typescript\n// Read stream\nconst readStream = await fs.file('/large-file.bin')\n  .chunkSize(64 * 1024) // 64 KB chunks\n  .readStream();\n\nconst reader = readStream.getReader();\nwhile (true) {\n  const { done, value } = await reader.read();\n  if (done) break;\n  // Process chunk (Uint8Array)\n}\n\n// Write stream\nconst writeStream = await fs.file('/output.bin').writeStream();\nconst writer = writeStream.getWriter();\n\nawait writer.write(new Uint8Array([1, 2, 3]));\nawait writer.write(new Uint8Array([4, 5, 6]));\nawait writer.close();\n\n// Pipe one stream to another\nconst input = await fs.file('/input.txt').readStream();\nconst output = await fs.file('/output.txt').writeStream();\nawait input.pipeTo(output);\n```\n\n### 💾 Transactions\n\nExecute multiple file operations atomically with automatic rollback on failure:\n\n```typescript\n// Simple transaction — all-or-nothing\nawait fs.transaction()\n  .file('/file1.txt').write('content 1')\n  .file('/file2.txt').write('content 2')\n  .file('/file3.txt').delete()\n  .commit();\n\n// Transaction with error handling\nconst tx = fs.transaction()\n  .file('/important.txt').write('critical data')\n  .file('/backup.txt').copy('/backup-old.txt')\n  .file('/temp.txt').delete();\n\ntry {\n  await tx.commit();\n  console.log('Transaction completed successfully');\n} catch (error) {\n  console.error('Transaction failed and was rolled back:', error);\n  // All operations are automatically reverted\n}\n```\n\n### 👀 File Watching\n\nMonitor filesystem changes with event-based watching:\n\n```typescript\n// Watch a single file\nconst watcher = await fs.watch('/path/to/file.txt')\n  .onChange(event => console.log('Changed:', event.path))\n  .start();\n\n// Watch a directory recursively with filters and debounce\nconst dirWatcher = await fs.watch('/src')\n  .recursive()\n  .filter(/\\.ts$/)\n  .debounce(100) // ms\n  .onChange(event => console.log('Changed:', event.path))\n  .onAdd(event => console.log('Added:', event.path))\n  .onDelete(event => console.log('Deleted:', event.path))\n  .start();\n\n// Watch with a function filter\nconst customWatcher = await fs.watch('/src')\n  .recursive()\n  .filter(path => path.endsWith('.ts') && !path.includes('test'))\n  .onAll(event => console.log(`${event.type}: ${event.path}`))\n  .start();\n\n// Stop watching\nawait dirWatcher.stop();\n```\n\n### 🔐 Tree Hashing (Cache-Busting)\n\nCompute a deterministic hash of all files in a directory — ideal for cache invalidation, change detection, and build triggers:\n\n```typescript\n// Hash all files in a directory recursively\nconst hash = await fs.directory('/assets')\n  .recursive()\n  .treeHash();\n// → \"a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1\"\n\n// Hash only specific file types\nconst cssHash = await fs.directory('/styles')\n  .filter(/\\.css$/)\n  .recursive()\n  .treeHash();\n\n// Use a different algorithm\nconst sha512Hash = await fs.directory('/data')\n  .recursive()\n  .treeHash({ algorithm: 'sha512' });\n```\n\n**How it works:**\n- Files are sorted by path for deterministic ordering\n- Hashes relative path + file contents (streaming, memory-efficient)\n- Does **not** include metadata (mtime/size) — pure content-based\n- Same content always produces the same hash, regardless of timestamps\n\n**Use cases:**\n- 🚀 Cache-busting static assets\n- 📦 Detecting when served files have changed\n- 🔄 Incremental build triggers\n- ✅ Content integrity verification\n\n## Providers\n\nSmartFS supports multiple storage backends through its provider architecture. Swap providers without changing any application code.\n\n### 🟢 Node.js Provider\n\nUses Node.js `fs/promises` for local filesystem operations. The default choice for most applications:\n\n```typescript\nimport { SmartFs, SmartFsProviderNode } from '@push.rocks/smartfs';\n\nconst fs = new SmartFs(new SmartFsProviderNode());\n```\n\n| Capability | Status |\n|---|---|\n| File watching | ✅ |\n| Atomic writes | ✅ |\n| Transactions | ✅ |\n| Streaming | ✅ |\n| Symbolic links | ✅ |\n| File permissions | ✅ |\n| Persistent identity | ❌ |\n\n### 🦀 Rust Provider\n\nA high-durability provider powered by a cross-compiled Rust binary that communicates via JSON-over-IPC. The Rust provider adds **XFS-safe `fsync` guarantees** that the Node.js `fs` module cannot provide — after every metadata-changing operation (`write`, `rename`, `unlink`, `mkdir`), the parent directory is explicitly `fsync`'d to ensure durability on delayed-logging filesystems like XFS.\n\n```typescript\nimport { SmartFs, SmartFsProviderRust } from '@push.rocks/smartfs';\n\nconst fs = new SmartFs(new SmartFsProviderRust());\n\n// Use it exactly like any other provider\nawait fs.file('/data/important.json')\n  .atomic()\n  .write(JSON.stringify(data));\n\n// Don't forget to shut down when done\nconst provider = fs.provider as SmartFsProviderRust;\nawait provider.shutdown();\n```\n\n| Capability | Status |\n|---|---|\n| File watching | ✅ (via `notify` crate) |\n| Atomic writes | ✅ (with fsync + parent fsync) |\n| Transactions | ✅ (with batch fsync) |\n| Streaming | ✅ (chunked IPC) |\n| Symbolic links | ✅ |\n| File permissions | ✅ |\n| Persistent identity | ✅ (Linux ext4, path-specific negotiation) |\n\n**Key advantages over the Node.js provider:**\n- `fsync` on parent directories after all metadata changes (crash-safe on XFS)\n- Atomic writes with `fsync` → `rename` → `fsync parent` sequence\n- Batch `fsync` for transactions (collect affected directories, sync once at end)\n- Cross-device move with fallback (`EXDEV` handling)\n- Uses the [`notify`](https://crates.io/crates/notify) crate for reliable file watching\n\n#### Persistent ext4 identity leases\n\nThe Rust provider can acquire a stable identity for every ancestry component from `/` to a file or directory. Each successful acquisition retains a second, independently verified descriptor set in the Rust process. The returned file descriptor numbers remain valid until the lease is released or the provider shuts down.\n\n```typescript\nimport { open } from 'node:fs/promises';\nimport { SmartFsProviderRust } from '@push.rocks/smartfs';\n\nconst provider = new SmartFsProviderRust();\ntry {\n  const lease = await provider.persistentIdentity.acquire('/srv/projects/example', 'directory');\n  if (lease.status === 'unsupported') {\n    throw new Error(`${lease.code}: ${lease.message}`);\n  }\n\n  try {\n    for (const component of lease.components) {\n      const descriptor = await open(\n        `/proc/${lease.ownerPid}/fd/${component.fdNumber}`,\n        'r',\n      );\n      try {\n        const stats = await descriptor.stat({ bigint: true });\n        if (\n          stats.dev.toString() !== component.runtime.deviceId\n          || stats.ino.toString() !== component.runtime.inode\n        ) {\n          throw new Error('Leased descriptor verification failed');\n        }\n      } finally {\n        await descriptor.close();\n      }\n    }\n\n    // Persist component.identity values only. Runtime values and descriptor\n    // numbers belong to this lease and process generation.\n  } finally {\n    await provider.persistentIdentity.release(lease.leaseId);\n  }\n} finally {\n  await provider.shutdown();\n}\n```\n\nSupport is deliberately fail-closed:\n\n- The path must be absolute, NUL-free, at most 4096 bytes, and contain no symbolic links or parent (`..`) components. At most 256 non-root components are accepted, and each ext4 component is limited to 255 bytes.\n- Every root-to-target component must be on ext4 and expose an inode-generation file handle.\n- The mounted root-owned block device must resolve to exactly one root-owned UUID alias in a non-writable `/dev/disk/by-uuid` directory.\n- Linux must provide `openat2(2)`, `name_to_handle_at(2)`, `/proc/self/mountinfo`, and `/proc/<pid>/fd` access from the parent process.\n- The current scheme requires a little-endian Linux target.\n- Leases and retained descriptors are bounded. Release leases promptly with `finally`; provider shutdown also closes them.\n\nThe persisted scheme is `linux-ext4-file-handle-v1`. It combines the trusted OS-maintained UUID alias, opaque ext4 handle bytes, handle type, byte order, and object type. This detects normal deletion and inode reuse, including when the replacement receives the same inode number. A lease proves the identities of retained objects, not an atomic or enduring pathname/mount topology; perform sensitive work through descriptors opened from the lease. Closing a lease closes the Rust-owned descriptors, but any duplicate opened by the caller remains valid until the caller closes it. The API assumes the Rust worker, its parent, same-UID processes, and the root-owned `/dev` namespace are within the trusted OS boundary. It does not claim protection against privileged mount administration, cloned or rolled-back filesystems, or ext4 generation collision/wrap.\n\n### 🧪 Memory Provider\n\nIn-memory virtual filesystem — perfect for testing:\n\n```typescript\nimport { SmartFs, SmartFsProviderMemory } from '@push.rocks/smartfs';\n\nconst fs = new SmartFs(new SmartFsProviderMemory());\n\n// All operations work in memory — fast, isolated, no cleanup needed\nawait fs.file('/virtual/file.txt').write('data');\nconst content = await fs.file('/virtual/file.txt').encoding('utf8').read();\n\n// Clear all data between tests\n(fs.provider as SmartFsProviderMemory).clear();\n```\n\n| Capability | Status |\n|---|---|\n| File watching | ✅ |\n| Atomic writes | ✅ |\n| Transactions | ✅ |\n| Streaming | ✅ |\n| Symbolic links | ❌ |\n| File permissions | ✅ |\n| Persistent identity | ❌ |\n\n### 🔧 Custom Providers\n\nBuild your own provider by implementing the `ISmartFsProvider` interface:\n\n```typescript\nimport type { ISmartFsProvider } from '@push.rocks/smartfs';\n\nclass MyS3Provider implements ISmartFsProvider {\n  public readonly name = 's3';\n  public readonly capabilities = {\n    supportsWatch: false,\n    supportsAtomic: true,\n    supportsTransactions: true,\n    supportsStreaming: true,\n    supportsSymlinks: false,\n    supportsPermissions: false,\n    supportsPersistentIdentity: false,\n  };\n\n  // Implement all required methods...\n  async readFile(path: string, options?) { /* ... */ }\n  async writeFile(path: string, content, options?) { /* ... */ }\n  // ... etc\n}\n\nconst fs = new SmartFs(new MyS3Provider());\n```\n\n## Advanced Usage\n\n### Encoding Options\n\n```typescript\n// UTF-8 (default for text)\nawait fs.file('/file.txt').encoding('utf8').write('text');\n\n// Binary (Buffer)\nconst buffer = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);\nawait fs.file('/file.bin').write(buffer);\nconst data = await fs.file('/file.bin').read(); // Returns Buffer\n\n// Base64\nawait fs.file('/file.txt').encoding('base64').write('SGVsbG8=');\n\n// Hex\nawait fs.file('/file.txt').encoding('hex').write('48656c6c6f');\n```\n\n### File Permissions\n\n```typescript\n// Set file mode\nawait fs.file('/script.sh')\n  .mode(0o755)\n  .write('#!/bin/bash\\necho \"Hello\"');\n\n// Set directory mode\nawait fs.directory('/private')\n  .mode(0o700)\n  .create();\n```\n\n### Complex Filtering\n\n```typescript\nconst recentLargeTs = await fs.directory('/src')\n  .recursive()\n  .includeStats()\n  .filter(entry => {\n    if (!entry.stats) return false;\n    return entry.isFile &&\n           entry.name.endsWith('.ts') &&\n           entry.stats.size > 1024 &&\n           entry.stats.mtime > new Date('2024-01-01');\n  })\n  .list();\n```\n\n### Transaction Operations\n\n```typescript\nconst tx = fs.transaction();\n\n// Build up operations\ntx.file('/data/file1.json').write(JSON.stringify(data1));\ntx.file('/data/file2.json').write(JSON.stringify(data2));\ntx.file('/data/file1.json').copy('/backup/file1.json');\ntx.file('/data/old.json').delete();\n\n// Execute atomically — all succeed or all revert\nawait tx.commit();\n```\n\n## Type Definitions\n\nSmartFS is fully typed. Common interfaces and types are exported:\n\n```typescript\nimport type {\n  // Provider interface\n  ISmartFsProvider,\n  IProviderCapabilities,\n  TWatchCallback,\n  IWatcherHandle,\n\n  // Core types\n  TEncoding,        // 'utf8' | 'utf-8' | 'ascii' | 'base64' | 'hex' | 'binary' | 'buffer'\n  TFileMode,        // number\n  IFileStats,\n  IDirectoryEntry,\n\n  // Watch types\n  TWatchEventType,  // 'add' | 'change' | 'delete'\n  IWatchEvent,\n  IWatchOptions,\n\n  // Operation types\n  TTransactionOperationType, // 'write' | 'delete' | 'copy' | 'move' | 'append'\n  ITransactionOperation,\n  IReadOptions,\n  IWriteOptions,\n  IStreamOptions,\n  ICopyOptions,\n  IListOptions,\n\n  // Persistent identity types\n  TPersistentIdentityObjectType, // 'file' | 'directory'\n  IPersistentFilesystemIdentity,\n  IPersistentIdentityRuntime,\n  IPersistentIdentityComponent,\n  TPersistentIdentityUnsupportedCode,\n  TPersistentIdentityAcquireResult,\n  IPersistentIdentityCapability,\n} from '@push.rocks/smartfs';\n```\n\n## Error Handling\n\nSmartFS throws descriptive errors that mirror POSIX conventions:\n\n```typescript\ntry {\n  await fs.file('/nonexistent.txt').read();\n} catch (error) {\n  console.error(error.message);\n  // \"ENOENT: no such file or directory, open '/nonexistent.txt'\"\n}\n\n// Transactions automatically rollback on error\ntry {\n  await fs.transaction()\n    .file('/file1.txt').write('data')\n    .file('/readonly/file2.txt').write('data') // fails\n    .commit();\n} catch (error) {\n  // file1.txt is reverted to its original state\n  console.error('Transaction failed:', error);\n}\n```\n\n## Performance Tips\n\n1. **Use streaming** for large files (> 1MB) — avoids loading entire files into memory\n2. **Batch operations** with transactions for durability and performance\n3. **Use the memory provider** for testing — instant, isolated, no disk I/O\n4. **Enable atomic writes** for critical data — prevents partial writes on crash\n5. **Debounce watchers** to reduce event noise during rapid changes\n6. **Use `treeHash`** instead of reading individual files for change detection\n7. **Use the Rust provider** on XFS or when you need guaranteed durability\n\n## License and Legal Information\n\nThis repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [license](./license) file.\n\n**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.\n\n### Trademarks\n\nThis project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH or third parties, and are not included within the scope of the MIT license granted herein.\n\nUse of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines or the guidelines of the respective third-party owners, and any usage must be approved in writing. Third-party trademarks used herein are the property of their respective owners and used only in a descriptive manner, e.g. for an implementation of an API or similar.\n\n### Company Information\n\nTask Venture Capital GmbH\nRegistered at District Court Bremen HRB 35230 HB, Germany\n\nFor any legal inquiries or further information, please contact us via email at hello@task.vc.\n\nBy using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.\n","readmeFilename":""}