{"_id":"@tweedegolf/storage-abstraction","_rev":"39-5fb83e5419f5258c8153e99da124b4ab","name":"@tweedegolf/storage-abstraction","dist-tags":{"latest":"3.0.4"},"versions":{"1.1.11":{"name":"@tweedegolf/storage-abstraction","version":"1.1.11","keywords":["storage","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.11","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"2486a21990164a157e25a03e8846fff9ca96ca15","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.11.tgz","fileCount":24,"integrity":"sha512-kgODGkkuWzX0wnggYseuL4ltfFdH/l4+ej9ICPY9IYqHy5U/8fO+1b8UOZaXKK2jhNLADyedtrmks0OAoLrUig==","signatures":[{"sig":"MEQCIA4vfgTeIGOtnY7jrBZueUbxTKHEWPKctevF7+QvXmgkAiAidxjgA3UBm+ZnNgEaO3CxFP9mop/9S8wqD08I/ibyNQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108246,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNhrmCRA9TVsSAnZWagAApbMP/13Jt83zLk7E3qi8RW7u\nriD73rQW5Ccd27hvzj5sVxeFdnQBk+UHBmAQiVODDlr4eXcgYJBrDzn55S/5\nBzU1CqhFmFk3sDlNZxWrkjsoT7IHBUHEL28Lh5ujFkbEL5RiESKqnozanNJI\nw7omcoMkyfMgH5SCMewStFlrXY/dk3+c6lfR5UA81cDqbRWx97GLTXeiPpyP\nZC2WMOQNlfRv1vvIzg27Fcvku9APe8KSb/FHj0qIpuwFA0O8TG0lVGpjFlkK\n99a5lwJeSjA8CgGOYAdTha2lCjR4gtyjKCe2dmr8LpgCHtWyoupMHsW06Huj\nb1uHovkyN2Hvcq2liIW6r28Sy3qhInrpClBfO2GingTbOLlbnWnhBbLO2l71\nb/s9t/Bl75ZWFPWAQWbGGwUBzX8QpQYYGYs5wm35sAx4YpQWIjrhBXkpSX/+\n5D8JX+g6KZfJyh3eONjwDcjOdsbrNIMq5NrZiUu29PK1YvTckUqpsVEASuAx\nrA3RDvmoXTT5u6XBNp2cGdqPEwDr0QBoIdY0JtCrXoZu4MqLnpZSgFW8weqv\nRA1xEFE1qsnKlRaReHQWAk4SxvqOy+0lccQHqWckGaA0gHftNHca9WzQCG2Z\nfisjVMvIc43VgNf4vl0V8b8f42Cjqwcgr5bVnVTCfl3l9tjWix14lTaZkB2r\nr+QI\r\n=WShs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"90d347415610bcbfc038e38f19f78f70dc4cd51f","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.1","description":"Provides an API for storing and retrieving files from a storage; this storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.11_1563826917375_0.4696792594277539","host":"s3://npm-registry-packages"}},"1.1.12":{"name":"@tweedegolf/storage-abstraction","version":"1.1.12","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.12","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"dd5f4de50aced7d76af99789f73b37e068c683f3","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.12.tgz","fileCount":24,"integrity":"sha512-Winskt4KYghFKDzHr6PHJXzi3bqV0ipGU39ZEdQALhiXgr6JFd1NIggoAkdVCmSYBix+HvbRx04qxwjAAi0oUA==","signatures":[{"sig":"MEYCIQCOfSekTzrqKHMk29zcRLfLrf/qTDA/I/7Vyjn9aMlStgIhANXA2g3nYrwjwqWoEU07HSkveri7D+LTibAHmXNn9xpc","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108283,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdNu/zCRA9TVsSAnZWagAAPRQP+wQvJTS8UW/3H+duwPaO\n+utR67zBDBo7pG3F4TJKjgU9tgE8K/WnWgYbg1TPwMh/f58G25kgXA4+IW5S\nw2oNSPz9kXdWDX0PFqyq2qnaLQFK+aRMP1I/IV3VvbBJ2jpxEJ1R7sIJmcK4\nhI6Q8sPUE/nVp1HNMsKvJ1Qjf4ef1vv3AxdeCVaeVY47MPQjyGL3w+dYtxox\nzvjMG4alq8DOK3iNtvBsHAOtW1Hc0XnyPbTmmgAMLuXCnHA00vTQIwWbj/If\nJpf90yrWCf/B0iOadiOR2SkNCP8iAmHnC3nyFoAXaesEeCMR6+uQatidB54k\ny6M1HZ/xzsjZ0VY+XeaF5JyRyOkh7uOIOyTK0u6CFYZYuouWM1iY5XOKrCqA\nDN4Uj9mSy/T3uiYtv3qk9yAyXhLovF+KqhnK5JchHkuiQm5HaqQKmX4IKoxW\nM8EIaBIoAYc8Zaeht6nnvRGaip0TOYF7YWzjd5gEnkb48FkzoELeJlJBOW+9\neLbE3RJ5yr6B+299UH38jEOdetoHV5iTuVailoSbQJMr8yFoeuI1HKcQoLho\nCx/ex7scVOqyAJs2Vx/vlW+ErL4ZlvxTqdiJWDHxagzocnlETno9D/2be9bi\nLQwWSAMozMKwjIoIGh6fRnTS6inLa25fDVEqAGbjKarJc/7+YK7QQjFIqoij\n65xe\r\n=lzB+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"6af60347e983faaf739392b7aca62b02f5924b17","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.12_1563881459036_0.27861262392926034","host":"s3://npm-registry-packages"}},"1.1.13":{"name":"@tweedegolf/storage-abstraction","version":"1.1.13","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.13","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"93867b7bc47f43b588012cc253794e1ea5397cf8","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.13.tgz","fileCount":24,"integrity":"sha512-kAJWKTiq/U/8r9Wd5h9z85Tit51lgQmZq8dM3FA0j7eRvXVHONFHQ+OCstcOgxhxt+/bFB7lozVvZHkajN/U8Q==","signatures":[{"sig":"MEUCIQCCXi6cQE1xQqwToUz+9QlY3SEEBOfshKFVuJiKJ5lKyQIgAzoQ5uPHgdl6OQ+ty6JgRGUzoqPpFeVKZOk1iM9gBww=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOBbgCRA9TVsSAnZWagAAo7kP/167RJ51X2ZI7nJhbkLi\nsqTcALMSZcxNvuSmcIblfdWeXTkz0Sm0hXznwUhL2vGaLtd5UHmkQDrSuhfn\niFvMRNxqt/bAjDX+jUuIt9kctA16AHM8LQHFDVkYyRvWc6KdvTPUxKuxqUHl\n3r3bzxqf8ANTE6iPX8LHD23mUCN7UrdC2lcIvirIGoIE4sGh271qXV19+Y2n\nEnknxBha3OLhQwATXwT6yKKwy5qQYBdhnGPKbqZrkmFpfi+Z4KI8Q3UHb3Cm\nfQIzq0X+Fi7c51ygD7NGNeqU+e1HBl0LsSThSxbtTXw8kPRHvnCEBHkIcX5X\n2mA2p5Ci9qLKSf7hxvPDlJCZ/XbV6CQpkR5H4Pb9qN4P4YvDrA65i+VHxtVO\n47zodQcJxFO8tg+7NT2j75ba2kuYz5lCmpAc84al85Evc++ausW2/jKCytaN\ngFdLb+pSiIKhri+kozsuo5tR9fGHxpi3fnOoFRtYJ0SXE5VwbznjUZ0DSxus\njpI/KKLfV49h4Xs/oBkc5uJNVSlzZolBAPzu5x8C6lV7w4QVJayBw4uCBwvD\nU6G84Q2ucfrXPQVhfbmVH4SlA2+BU7dbwuBW8oQ40TT13qL3c8oKg2+l+8Ya\nTEmntEXmFvZitntFWtVRQItjmde2DcvGsai4R7GBMef+CgdE6ugwUqEQdoJz\ntu8X\r\n=LlPJ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"4bdcd710c4299dede4547d0636587fafd514c5d8","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.13_1563956959686_0.5901856088052471","host":"s3://npm-registry-packages"}},"1.1.14":{"name":"@tweedegolf/storage-abstraction","version":"1.1.14","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.14","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"7261a8861a4f6a73827d0114a479fff703bf6a68","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.14.tgz","fileCount":24,"integrity":"sha512-NVvQCo+ts/pjNXHpN3CVbcHEomVP32EHmvmjYx8nSgI6dSXp5npqGtbWyZatxyWm1RIyngL+JWlMfDevTBysmQ==","signatures":[{"sig":"MEQCIETszG0Ckj+GIEJaIB0J5qtwv2TkzboUNyb9rmUnnrptAiBhcA/UXZrN1RPnGzaSkwJdtINXnW8K1S5HCQK9pj/8vQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108612,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOGJeCRA9TVsSAnZWagAA2vQP/jpeAPURK0BAU3dijU83\nQ0UBw//lmzzQy8pw4Yomwqrj6R2NPHKSc+KjeRlTks5iFCY2M+wO/7BakCVJ\nK/b0IGUAs2rFuqldFCiLkvfDhIwbfQGIqEgAabKg6Ph3/CHxG2mQH/kWR7iN\nMyKnAgl/ufZ1n6au3wG42FdBzq+rgw93awW3DS9Xddd2FGDp4RnkAoEX+NHl\nEmKXlirJDy1eDblI05VH5XSsljCKdlZpSVSHd+Ze5Xpi+cyD+2jFsxT8NAjh\n96p3Lzdug0G4igxWgaAWv+fgligmKVNHoRQNQtvOXbvxT7hB/iSEftwELgVV\nptx9VvzJKiyYyHjiBZEDBJm8TD0bnB9c1OS4NBRSJHpi2jPj5WvB8nKrgLNa\nsR3yRVyV3cmwKrs3hopBTR2n7DQZzr/luE3IqrwEuAKQRaSji3j3n/1r31eU\nBOhYuhs7U4d7XxHkQ6pgdydJ7Po8BxpNk74cUOmLUWE+YWR3jkFoe1hMK6Gs\n1HrMLWICUv9Us+NRD0wF0FgQc/1XnGl8upX148idB15a5TGWP5yI7tPZae9C\n2TeWcJKNov0vEzZzEd+ERfjHFNGe8/scCaF3YaakMetDvgqWeZz1PN0eqQ98\nh9f2ANt8WIv5KJb3SXP62KJuLft8k1W/lqBN06nkTXageFTxr0sXdI/DRBxJ\nq83Q\r\n=Xntn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cd72284ba2f671bfa01ca14ca3efbf4b7f082e1c","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.14_1563976286037_0.38779894180845154","host":"s3://npm-registry-packages"}},"1.1.15":{"name":"@tweedegolf/storage-abstraction","version":"1.1.15","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.15","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"3f4d6db3b568c862b7d5f3a9b433b019deabb0cd","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.15.tgz","fileCount":24,"integrity":"sha512-nJnU7KzpOlbkVFiEk9HD2rvw/MI8NRoYLTJtFnO7S5pjjLTgtv4VGd/iMQUfJ9bJtsbGQ+EyTS36CoA+AAibYg==","signatures":[{"sig":"MEQCIGzcFnsfUv/FAZKz5X1bpNcQAJUqTTAkkApD5W5WDov0AiBmZnWMiKxoj8vKpRF1p9C6gT8MeSA9P7IFAsybxIW7vA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":108921,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdOKVfCRA9TVsSAnZWagAAhqoP/1+P4WfZrf/1nBIzLA79\nrAtkq91PxZPsl0jD9ptVMprlJDcKfW2ODHnyjgfk5s3pjsSZOkp1dCkLj6zx\nOZ3TCXx3+9kes+LnTWmTEKhbWhjtp5DJoDZ8zHqBXke2dWSqmrqvu5C+bCS2\nAqj33Ybdw4PVo04huOGKUu+pQIYI4xsuASH/4Y5RVsw71DWKAYD/4FwPQgvP\nz/1rkfTC0v5R2Bl9aCNR4UBc6ui0va1HmV7JwlpC1wCWgX7990NuOOPEezKs\nrlkPKqps+EqSuAHFCqICLtsU6k97tCcMhEayudEScC+p9hDY6+eI1t2MLVML\n89FBEHjzTYPt6F6R1NANYJGYlAuNU6nmyBll+BLQWnPEAm2wEUWsVY0ox0Hs\neT5GUNuSfgD/2N1qkaMnAwJtCtj6rorOdPAGNBK/M9sjOwtDISIewkHgP0ik\nDRecCgq3RWrfrU/d20fKNf+DKeg89AMAGLz0ICu3M/387RbOJy7Dn69fDsEj\neYpaKhs7OYyY8x9l2KbG4ELOTql8zYCzTmSQaAC+tjKN0SQpNb0YFrRNdbr0\n6KHoaxyi39rMX7AS+4F7nxZTaM20frHuQqD1vK09eMbeqM+ehP3Ufdcc0Wff\nLix+Q4TeSWiPVnmK6vLUn1869h+GWQ4x133AgaZN/pqS+p5vV+zZfEOimvZF\n5o5g\r\n=IgSg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cfa67d4881323f2902747f81f2a60d8aa5762199","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.15_1563993438253_0.538234202686779","host":"s3://npm-registry-packages"}},"1.1.16":{"name":"@tweedegolf/storage-abstraction","version":"1.1.16","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.1.16","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"97451cfd86292d53afdbdb308238aee739bd02ad","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.1.16.tgz","fileCount":24,"integrity":"sha512-N5HaZiV9XUzjdQBOyaDz9oifrjkfS4HDcXfkt80roe5raL+awpvgIjG43zLUzQ8Vu9IA4vCK+SSuJya6m9DeZw==","signatures":[{"sig":"MEQCIFfrLyn303zgFAfYTPx0wIMa+yP6rRCN8vQ60UX6uOYcAiBP/ULmvrHgx3uRft7yHF0xp7rM+yaSK6Lo4kR58QkNzg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":109352,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkc0ICRA9TVsSAnZWagAAQEUP/jlHiQaXXO3JKBrY/QE1\nwZgC1TSFA+wQfE412TrVjvlfhuZV7D3Om4t6hQv1IoJzYAXE+zUTtob1joHe\nK+BQg4Ap66OEVtqX9ZdsWt1Pt812ncio7OcmZZoMvHyHigQ+US3IcgeRpSxw\nnuosJApSYfHS8ZnF/slPrLNZq3sJlgiuEFWJkp+dKS7xWZQplMMYhH8y/Y8C\nxPzzB3aKk5b247w055N2SHkXFYyJ4PsOn3VR8RijK5fqF0Bih0VSD1hVSdZJ\na0O9Q77S1toeYlDUu1dfNdyT5baaFM+dqYmi5yFRbuc5l88Sx1ZFK8SS0wfy\nMSO/g2e4WViYbTko+M5uYzOFJBZwCh/DGt0IOKjNBnkOXa+brdq9eDCviiPB\nPi5xGoD3GK/t2R3N+RsyJfDxPihJiLWmH45g5UsggPujV/iQ+3gn9s1Z3xc+\nu4yFW5As7N37po/uH05B5x96GUNk7OYWLt8eMehP/367ZPGLtpqdfGZ3TW2g\n24Vk63MuuoSGGsiguX4hHQrL4NqtTykhJxoqRGqaw9HwMYapRKnqY2Vhq7vw\n40rgw3xcgSdZPllgQLCBoeiJIHSKG7lRXzlu68h6STPZw7k+vfzdeue8u3yq\nk4NE0n6+kO2SWU/O48cWfRUtERvlVQLfMqxqDCmn5eesXUXnuljrnXl5ND+H\n/82F\r\n=KAV1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"7605d33bb1eeaca4325d2125ef6eba5990cda8ba","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.10.2","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.4","ramda":"^0.26.1","rimraf":"^2.6.3","aws-sdk":"^2.479.0","slugify":"^1.3.4","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.12","@types/rimraf":"^2.0.2","@google-cloud/storage":"^2.5.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.0.0","tslint":"^5.18.0","jasmine":"^3.4.0","ts-node":"^8.3.0","tsc-watch":"^2.2.1","jasmine-ts":"^0.3.0","typescript":"^3.4.5","@types/node":"^11.13.15","@types/jasmine":"^3.3.13","tslint-config-airbnb":"^5.11.1"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.1.16_1569836295931_0.15308102356978814","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@tweedegolf/storage-abstraction","version":"1.2.0","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.2.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"5624bcfd8874c00f8f6925dfe45883e0d00a6d37","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.2.0.tgz","fileCount":24,"integrity":"sha512-xlVLG4+LP8cpAtADBtnOlvNLpnFgKE8Y2G05WdimAW4UWmqSEhvSs+k9d/yQQyuUOHvnDQO8V6KpzrWkIUfTgw==","signatures":[{"sig":"MEUCIQChmurr2yCRqM/stgt1gf7qDtqBXG89zbgBrhEQqxLx+gIgduERwC4DNymT9I5x24oRMhuGj6NqttHGkqoLVZQPJyA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":109766,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd+kWYCRA9TVsSAnZWagAA/3kP/R+6+hD6wD4wmz1vx+uZ\nr9RsmqkeY1xvLu2Ip1RTOfYASxj/VpuuDsy5THI2ZFhhHAXnx/o6nQDr39os\nEqGDLdQT5VfuH+CGHjoPDTvN+BCrGSQd4WQaJJ/7vFqI/uANIKGA4aKpefm9\n5bOuncQl7jmBBKH1/PaLE9mpmfgYxJYRhkDh2nKy81UySzEmUqVNIZQEt2Aa\nBMn/yhVl/0oEKnSo4pYP3CU79YYBoTDr1n4XJUaNsqbjLSOrOUt4gefNn78a\nla3GkZ/uzuDG82qnC4KXpkoVVqdN5Z4vRKS/YErHJiF37VVJmMnCT6XaC+tP\no/nFvOUnxV9RjZkZeYAA/tcM916fESL3RHp0YSn2uG7dU27CGXTkCe2CIqyY\nSTBp0Ag6jyZ4mFn2pNnq9SXL4aBf1Fe1cJY2/obzEJaVzGJQCKN6YnBfyF1G\n6wD9SckzNm33f48Gnh3VQOuLKivOoDCVexDxlZEMiqCS/bTBzSX2e3gis5NI\nXDf/VXBWUL1TpeG8pJarG9jH9lpBqOwc/K+PJv5jIjUFDDJ/B2rQQDYLPgBO\nToj00c5i3xJ85G6zAEL6JMIUuC4vrO/PX5WzE/1Mlmql/12ByfjydzfF2F0f\nyPfTSgQHdS5wuk5R0GIz7JIlUCDQ2ZYRwNj2eOCykeplce7nw3SNn1mH9Gtc\nlJvF\r\n=yCCv\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3fff7b0061abf57ef616678bbf20f7c38a11e428","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"marlonb","email":"marlon@tweedegolf.com"},"_npmVersion":"6.12.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"12.13.1","dependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.592.0","slugify":"^1.3.6","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.38","@types/rimraf":"^2.0.3","@google-cloud/storage":"^4.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.2.0","tslint":"^5.20.1","jasmine":"^3.5.0","ts-node":"^8.5.4","tsc-watch":"^4.0.0","jasmine-ts":"^0.3.0","typescript":"^3.7.3","@types/node":"^12.12.20","@types/jasmine":"^3.5.0","tslint-config-airbnb":"^5.11.2"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.2.0_1576682904052_0.9348385595123565","host":"s3://npm-registry-packages"}},"1.2.1":{"name":"@tweedegolf/storage-abstraction","version":"1.2.1","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.2.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"b843cb0b74bd730b752fa7a5327bb89780403886","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.2.1.tgz","fileCount":24,"integrity":"sha512-rTywarH6SZkdjnGsKAoG1aouBQUUfAvcc4FPWeWJwhcsU97QF/k8iIX+wveaLUOtRMbljF+0W7ATyPaQu9fRzw==","signatures":[{"sig":"MEUCIDT2hhPspkpcaDTn6FEh/CXCu3IEGBi3FnR1tD7GfqtvAiEAyXRsf+D+311lQ8yBdvfGeeVzlTDZtRII1aO98VOmn9Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":119358,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeKvCSCRA9TVsSAnZWagAA/nQP/iuivzKVTFKb00q6YfKs\n8fzuxxcPn/6H10526EQ1hJxQT1xwbiyxJs7PD/4xB/Zz8m6maZIFPjhb50ZX\n/iCYWZUP2qqMjOx9lJ1vpyWqvWtPLWqxUyyeUSNSmKEWGx+6PEW2+lJqpsiT\ny7WD2vIp7G2W1b+Gavq0lq5rbgy6YVM1WrERT//Z7A2TA/5oazCHJGIAo2sV\nIPTZm6f4OGfX6O5akp5GfMb5PRFigpPQS+mubkSQmRko2UwCTmti+Ec7R4nQ\nEppWeap2amwWMFGNsr8kMAuArktq2CahnI3eQ1/EKpm7vqSeiaEK6B0uag7m\nCEcCpK577IdFBFB8eHfzTIUt83DZkQDssmZ2662yJoo9VtOwzvFegiD/Ll4V\n8CfRn+4Azhv/YU9Ez8Ha8i35IeApuED+vNpIWfHtxl7fWjUhkrA3S+DCJy4r\nAXB0rK4SKdcGQe3nfUQe7+wsvvoMwFkcfM6B2d+Kt6m7RHJDPrwPbkRZuf9T\nBTL69SsGFSnc8dGdXNTpdxFGG6zcm0pJtPfCAxZLyRBhk2FtwHvXSVvZiUeK\niDCTXKxqlmPVCwhIXgt4VngtP2CdrlBsTZXDZT+ey6Vvfx4/zbMuvPYmT7oY\npID+StlW9llxxBFZIZzmPBHrJi/MSoOF/NlcJfb9Ju9KrgitmVcWKkMAGsOI\nMmgl\r\n=8Cv7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af9722587e67038f434e4dcb27c4f962e0df8c95","scripts":{"tsc":"tsc","copy":"cd ./example/backend && ./copy.sh","test":"ts-node ./tests/test.ts","tsc2":"tsc --module commonjs --esModuleInterop --declaration --outDir dist index.ts","tsc:cp":"npm run tsc && npm run copy","tsc:watch":"tsc-watch --onSuccess 'npm run copy'","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='TYPE_LOCAL' jasmine-ts ./tests/*.ts","test-amazon":"TYPE='TYPE_AMAZON_S3' jasmine-ts ./tests/*.ts","test-google":"TYPE='TYPE_GOOGLE_CLOUD' jasmine-ts ./tests/*.ts","test-jasmine":"npm run test-local && npm run test-google && npm run test-amazon","prepublishOnly":"npm run tsc"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"_npmVersion":"6.13.6","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.592.0","slugify":"^1.3.6","uniquid":"^1.1.4","await-to-js":"^2.1.1","@types/ramda":"^0.26.38","@types/rimraf":"^2.0.3","@google-cloud/storage":"^4.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.2.0","tslint":"^5.20.1","jasmine":"^3.5.0","ts-node":"^8.5.4","tsc-watch":"^4.0.0","jasmine-ts":"^0.3.0","typescript":"^3.7.3","@types/node":"^12.12.20","@types/jasmine":"^3.5.0","tslint-config-airbnb":"^5.11.2"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.2.1_1579872402309_0.026545022346402103","host":"s3://npm-registry-packages"}},"1.3.0":{"name":"@tweedegolf/storage-abstraction","version":"1.3.0","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.3.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"a9ffb27eaf5280bf2689c534d21a8593dbc09ac1","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.3.0.tgz","fileCount":28,"integrity":"sha512-/Cxg5c42D6M1klbKXTjl9eWrmR5V1wED6yiNNQPXFrZkrP2SRUjP98UP+kZXAkbsLpFJlSWhEGR2w0qALmiXEA==","signatures":[{"sig":"MEQCID58feSZPqIUTIdibXJ+zKACSLb4K+rZ7vVUS7OrpcPvAiAo936BJVATANk+PjLapDSADLIdNuJCqqAmEunFcw5J+A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":138189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee2ZHCRA9TVsSAnZWagAAC/kQAKLPb9V6e9/EUYb1Fd80\ncj3Cbr3BkaE40l1zKUmyNWRzQ0Z1yCvjLCJWEkWNb860mZQSQxbStyENyDsR\nQ87+3ieAJ2kKyKPDhanVc340mtckmyP05kVBiXwkG4m/NldJiLNBE10qM8d5\nO8+Wtk5UH+KjTdMnIg6LmwiefXphlTIO7STRPFiQBPrCHqbp/n0KKNrcr7Av\nr9q05xDD2ci+JSCbYqXLYDC8XDrANrlrisM7Tmv7OzTg3yVaaP0EIHSysRhF\no4pAfRleVWneW1QyKXCNSuJjQ+lyGUY0zyPo7i5bl1aXOTyZZxw4TEPoekgg\n6eXyM9I1lwFSRmwhDfw+qTKgM7UPV3Fmac/c39q+Nl4YGD1rGz/4xfSuLR+k\nl7Ojm6G9NhcLsWUUiMw8OnXj3Zr1gTIjIql/2MgKz2miV76StlIluICMVa/A\nVDnOeOvCW0sxYuC9iekIs/qX6j0fgQ1HM6g4sUAud7dvAF7eYsDs1R8U+gMr\nYa5911hidrYHi8uvxSFmveamyPXNZicfJKQh/ANp17a9Ykl0Cojvy85AsBnE\n0tSzUadNPJZno80cGZD+M7KJHppUfACE9rWVfOZSQPEG0ojaI5cfpHhwtzNW\nDsdiDkpSBc8PflYRmwhrYsNY3QGQ5HDxDAHa+42GelI4dxTBkdHKi0sKyPkO\n5C2M\r\n=NlOe\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"30a39cb5df08064a70b2f3f3893e807ecbd97bfc","scripts":{"tsc":"tsc --module commonjs --esModuleInterop --declaration --outDir dist ./src/index.ts","test":"ts-node ./tests/test.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-urls":"ts-node ./tests/test-urls.ts","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='local' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-jasmine":"npm run test-urls-jasmine && npm run test-local && npm run test-gcs && npm run test-s3","prepublishOnly":"npm run tsc","test-urls-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test-urls.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"_npmVersion":"6.14.3","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.643.0","slugify":"^1.3.6","uniquid":"^1.1.4","await-to-js":"^2.1.1","fast-crc32c":"^2.0.0","@types/ramda":"^0.26.38","@types/rimraf":"^2.0.4","@google-cloud/storage":"^4.1.3"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.2.0","eslint":"^6.8.0","jasmine":"^3.5.0","ts-node":"^8.8.1","prettier":"^1.19.1","tsc-watch":"^4.0.0","jasmine-ts":"^0.3.0","typescript":"^3.7.3","@types/node":"^12.12.20","@types/jasmine":"^3.5.10","eslint-config-prettier":"^6.10.1","eslint-plugin-prettier":"^3.1.2","@typescript-eslint/parser":"^2.25.0","@typescript-eslint/eslint-plugin":"^2.25.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.3.0_1585145415106_0.8171608812601514","host":"s3://npm-registry-packages"}},"1.3.1":{"name":"@tweedegolf/storage-abstraction","version":"1.3.1","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.3.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","dist":{"shasum":"870c082172994374cf7cb8221ac390069318649f","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.3.1.tgz","fileCount":28,"integrity":"sha512-NE2N141vRmrjdka5mEA+2VBjalwVslg6YlLBFTKoGArVtrRqqK5OaphW7N2OYmqCqqnE9HduUU9nhlIeN4R9DA==","signatures":[{"sig":"MEUCICiRZhla3poP8fB76RL665qPy45WlHQVnNhuWUaW4G9RAiEAvz29e6Fbr+ZGFdq0BkAimSBY2k0pbKkGsuV6CCemWNE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":137799,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJee82LCRA9TVsSAnZWagAAWN4P/0rSSCEa93+n51WXJ8Qh\nX8iCtalMxt0lI6GPiWtQgsGb9KvU3JhwDoKrLomwSPK2x5WpQ0DPwTN/cIoi\nP4qxZvsvay5yYilF0I3dG1xu+Q2gEd8/tNuMatXLm3QtQfEJr3LjUBDTC3yq\nE+SJKnDjBRMp1ZAg/RGrDLKN0UR0KqSy7lQ3oAaEEkj+22HFU5L7W6s0TT24\n6r1aUO9WelGw20PF7zXWF7/gRfBfIld3z6e9cktBkvhyprxmomiOktpmVv4x\nAxBAJhjWZG1LN62LtP3fHTLbXZmmkFFYDzCAIHM0BH6NSK/lmhoI/vftGDI5\nrgJCbh3L1WGPMpyt5WTg2Xk5mvG8nn1ltysfJ5q9RmIrhCylpm4XMVAbEp2O\npeak2glbzJnS9SkbeuVsLpl6LjgznbIzpMqGyJHxeUTz9r1blkj0c/UP0HfN\nGZ/6SiredKJuDD72GikjOXotCArEtNNyoR6gsiRFbx10R7MMMqBn69/hYK3o\nUsJxOesSGF/pSJMo44arseWGoBSEhcH8w7mIQhnsxvRhSM8UaJpkhIUkri3B\nXwKmDsK0hQBNtiDuMJEFV1JrzQQHvQ56NBzVBG07dhocjNi37SUjvXzNu7jn\nNF98ybblfKYwd7vnUVn3NT8VMvAA5Jidaav2Df7GJvF3TkSRT5JwAcCwA2dN\n/FPX\r\n=P1/u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0f54704470b4c04c6623b46141c50f6df1dc359c","scripts":{"tsc":"tsc --module commonjs --esModuleInterop --declaration --outDir dist ./src/index.ts","test":"ts-node ./tests/test.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-urls":"ts-node ./tests/test-urls.ts","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='local' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-jasmine":"npm run test-urls-jasmine && npm run test-local && npm run test-gcs && npm run test-s3","prepublishOnly":"npm run tsc","test-urls-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test-urls.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"_npmVersion":"6.14.3","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.646.0","slugify":"^1.3.6","uniquid":"^1.1.4","await-to-js":"^2.1.1","fast-crc32c":"^2.0.0","@types/ramda":"^0.26.38","@types/rimraf":"^2.0.4","@google-cloud/storage":"^4.1.3"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^8.2.0","eslint":"^6.8.0","jasmine":"^3.5.0","ts-node":"^8.8.1","prettier":"^1.19.1","tsc-watch":"^4.0.0","typescript":"^3.7.3","@types/node":"^12.12.31","@types/jasmine":"^3.5.10","eslint-config-prettier":"^6.10.1","eslint-plugin-prettier":"^3.1.2","@typescript-eslint/parser":"^2.25.0","@typescript-eslint/eslint-plugin":"^2.25.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.3.1_1585171851257_0.9143383884176932","host":"s3://npm-registry-packages"}},"1.4.0":{"name":"@tweedegolf/storage-abstraction","version":"1.4.0","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"0393dfcaa2d1be209d33e4a7be5876246047e0e2","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.0.tgz","fileCount":31,"integrity":"sha512-iJV5fD+dStOF2RDNCnaeg0yBwDa45BjncXujc0djg022U6aIpjhE6x8OkfftQw67vB02KvFOZQyXnOffZzG5uQ==","signatures":[{"sig":"MEUCICaqxONgX8vbHakkUmqUr0r9ZYNdsf5x1g1id5S/dPoHAiEA3OBAKeqAnin7DQJkkCd7d4R0gR27ayiOJUM01B84lsQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180351,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenyLlCRA9TVsSAnZWagAAZDYP/1Pc7oKxuLkj4bO9Eu2z\nz0CoYBncZdvdb58s/oBdzVIn06oPS6Rj2I6hpR1nUpHBUlciop0bEsY09ws/\nUSM1kbmey6Gh/IAIlCaUc4Yy0KwjxSMTQ+AybpLHmrtM8BJGVynzUx6Q0cma\n9DvIHabPlljKs4WWLbH91GEkyXSUdvh0aXRuBXvXbqgc11nZ2F3vNlbzkL7Q\n8m5mW42OZ/W9B6bIe2xSRfOfbXLHpiNfDFSy4k+iyUKfBYP+HaIIZ8QOdG4M\nvIpXMKbOf+urJFoBUpAm8heJUUdNYoVkhV4pf44pwnwDPLC/27XGIV5p1n8y\nnz0hX3QBX1Ob4MEZHP22aIBBhTVzwjyKMfYEeM9hUBYnDTbm1CYIip0CgeKQ\nXnoS8AypzsjRO+zw4j/mOpZ7py/oYyXPSarMZ8UhU4FbPVtpokxQLta/h86f\n39d5CtDs/UKK7Px0I3ylN+Mgtxv0Fp7O/kUMweX3xWZr4KbaAKhq2T5wgGVE\nybrtJCYeBp+2HSYLG0IWNPNDJJh5vEgBVi0Sw6FZNvm/Ogah9emAXAl2ERvn\nSAQSfVnkUnBDnPwLMJBT6SXE697Ww9NNP/es3PWV9xJnvJ1acO9hTR/skafX\ngiN2Qm8vyzu0krTlMP6owELkIyQ5/UPESjF05qv3CUkB4ETzxvZxlElikkx1\nM1Nk\r\n=oDPq\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"6.14.4","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"slugify":"^1.3.6","await-to-js":"^2.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.656.0","backblaze-b2":"^1.5.0","@google-cloud/storage":"^4.7.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.0_1587487460429_0.8407361208979225","host":"s3://npm-registry-packages"}},"1.4.1":{"name":"@tweedegolf/storage-abstraction","version":"1.4.1","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"c3e371219ac8fced7c9490cd066037b4f0051eda","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.1.tgz","fileCount":32,"integrity":"sha512-G8BxDOrTyaR2rUXnGa3ajXgsMGw4HnD9Zl4BnfJuWA4zAk1Ml1UIrqanrJ4LEutHguzYwgKjojaVNJLEdiazOA==","signatures":[{"sig":"MEUCIBPX5ViROilDac+cZqX8AQn0trGqgLVNDkmhQGKD9iZBAiEA1VE/4pt4o+1tbRYqsXf2Fp89VdzaMPFa5DxcdIhfZkY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":207590,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJenypPCRA9TVsSAnZWagAAWEkP/iroVyGFWdRAd1qPJ+n1\nFmRihLUeH1hMyAci1mc19MUQf1eLTTUzmz+pyMocmTgFyyiYD5ylReS28Izl\n1S5UNOXpghFnq6rwSMJ59OIFiXYqEqZXQM+JK7wNwVbMwuqz66Sv5tREqm5D\ndq3h17oSBvgcmzGUAzooWpgNOBZf6pY359bYHPQ9ExRYExkjOMou3qCrnR6K\nISh2+4Gn9Qg6Z6X+KAdMtqwiNYqUSq7KzSaTZWGfZQYaZnRc05tDGHrpI90W\nU2Hvr6TznlNbhgVx1WEg3MxDzesRgpgPZg0jrD+wPD5FHNcRlKowjQr2vwlA\nkpagjxUJtekKNtfgWlArCi+AtZFWlVSLos9rI3Ojo1ZYb2XhjlW/GaQTw6FH\nnL+bDrthwQIAwdRcSapTmZbxTfu6ecU97C3LZ182twwvGHhu3421y1V0y6eO\nEG8UPUFAi4SbJZCYOcsCVi438VOqnlOrRrnijO6QrToWYAufGg3E1Gr7qpQb\nfnGFmsxBuwZG85I4r5WhlsEyFqPMc7iW331zVwCkhLrCFFC75nuK5Epp01st\nkVYrDkCu2bhKuoWo3eCZaEzKzznW9kwMRuDLM7gw9kcMvDhwCvaOhvSxh5qU\n1anCpj8y2V1FhWVogJ0ZiS4aqDXBaqXW/9yzXy+im7XeDti51Tlt0SsUEfzU\ndrar\r\n=OzLw\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"6.14.4","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"slugify":"^1.3.6","await-to-js":"^2.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^7.1.6","ramda":"^0.26.1","rimraf":"^3.0.0","aws-sdk":"^2.656.0","backblaze-b2":"^1.5.0","@google-cloud/storage":"^4.7.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.1_1587489358987_0.5104383140577107","host":"s3://npm-registry-packages"}},"1.4.2":{"name":"@tweedegolf/storage-abstraction","version":"1.4.2","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.2","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"288954b44eba19ec484fd170d680a9a362e89d81","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.2.tgz","fileCount":32,"integrity":"sha512-mA6nmF8v5qevvARyzwtEKTcIBSrc2JpQMtGtQEZ/Hd0GKlComyq+V5VWawyr6oELXBgUfFJzjRqDYL249FxmRA==","signatures":[{"sig":"MEQCIEV5b625V+PJQoe88DMB8QPddIR0YAjDbAFt1XIYQIMYAiATWArjlwgF4Bfb+RgORTC+N93IPhOOfdbqr0gzzxNYyA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":208369,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeuCXXCRA9TVsSAnZWagAAlXIP/Rtcao2BhyoQ21rutEQa\nXCvWLd0iyRqpPj3EAn2Hn76/cBjkR/+m4Jj+kFKsKh8C1OuyK/jJ4AMIH/Yu\nADeKeFI+fwx0bmpuiJWPbmybce6SpAAh9oGX9WH/9RaiYnhzncXhyRy+SaSh\nmI0tvVquIV0s2G34B4xDZ4qI9N0g9bV+U0pVDOnfQlVVR/Hdo01qj1c+nrY2\n0cIA4u87kcFnWEvpCkHElk4O+wLTm46iRmR4RdRyTC49LpQs+8uaqdzlsPQX\n+TeKKMWz7IM8rgPX96AQRhJc/6U1nGtMoEsViDSNo+xG7ifR7sog1hf+O27d\nrvfaYeUze2GZBcz2YgLx2l8BepuDx3PwNohPXuEFXgntbYDx/PvKqncVU6sE\ndLHlUSNXe15CrhCncu+DehgM0h5ccaoJWqFMtiVDTndUEbCTjAmjWU3Aa6aW\nTArWmzOyGWPLVJDLYxh5P+CtwoJgVodtKiabbFJ+g/locCGZtl7fGp+bayxx\n14zlKOTkigcTRW1PZd3lzPIpJqhcylO4D1sinlZG9wkBCe1B2qtZ2Cq0u10U\nAxxBGCMLCj+nDOP068gs8Qj2QNMy/w7f/J1uEA8U9jECHae3xBP+uDEtQe/+\nWW3tExURky4wKrTgSOD1b5lfV2FAFZyuNoHACSmhreD5wvhSBbqXZCY84g40\n6hYn\r\n=rXRI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"6.14.5","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"slugify":"^1.3.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^7.1.6","ramda":"^0.27","rimraf":"^3.0.0","aws-sdk":"^2.656.0","backblaze-b2":"^1.5.0","@google-cloud/storage":"^4.7.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.2_1589126614490_0.5805347170211224","host":"s3://npm-registry-packages"}},"1.4.3":{"name":"@tweedegolf/storage-abstraction","version":"1.4.3","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.3","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"c990f95423e89797f6a276d00306014448fc2d0b","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.3.tgz","fileCount":32,"integrity":"sha512-UTReZf70Ro9VfCCyLyB0UJ6bwdXi2E/w3Ar3HrmnuOb7VsuZ5h3Xcf0hU/UqyrBR8e4ihBOgCFhy0R3uI/7Jng==","signatures":[{"sig":"MEUCIQDX1Xn8uyZzKjPl91L92tV6rK6wXTU0EW67xaLE0H9WSAIgI3xGoVFQ9rqJCAmvlz/FXNyurZZ3CdcNptiVNGXUXCw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":208152,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe1LrlCRA9TVsSAnZWagAAQmcP/j4j0U70S7l7Esh6RbVp\nYiC1LBzOnmuPN+j1rXRrtpbtY9t1llty9KOiF90lReUBk6/iV8i1oYn2INsi\np27vjVqXFgI99Jk/tP6EJdZVLL0YDBhXFRtVy06lxnqx4NAN2pmI9qCMvU4a\n+iwi5B/W5jlpK4o33+e3UBPKVhVjTakuCyBwfZrZiL/I9DKdHQrcP248Kwg/\nMN02gMwsvnPuzfQVTyWmrSTFDD9niTpUWOjB6IRRHaZ0i82km/ihAdXwjtU+\nMLpub89dQ+F7VNIYaSFuL97pFn1mCyttH29LoO671mcmt2t+JLtaUue2OHcj\nvF9uAO/VoYQAROVNe63CeeP9JTU3XAaXLVkVbPLYCbscIbI+MyzfQ86MjLIE\nYixA+jAWYINFWZCko2nr1yZiMy+vUzEIm/luMTj+zyTNyz0Z+6b1iriZILnr\nA0W+E+fycHTnTRN/ZNctpV91bahZp2Gp9BdzcQA7xKw+Y4qWiBKtYW0QlfDP\nqQHxQ/yKF09eEvAe++iH/UnyH7u55bKM3vVuhwOtHusgxTeWFo4LF/rZvOC9\nwowLZr7hfTAVYEFRc29uz4sh968Cs7mq73beqvIjHBy54MmleekyQBJJfXsw\n9KxKD4qOhtsxGFBQw+q4xiG3LNS6mrowfGE8oRtnzpAYrTo5hzbbioHGhpp9\nniU/\r\n=8SL+\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"6.14.5","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"11.14.0","dependencies":{"slugify":"^1.3.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^7.1.6","ramda":"^0.27","rimraf":"^3.0.0","aws-sdk":"^2.656.0","backblaze-b2":"^1.5.0","@google-cloud/storage":"^4.7.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.3_1590999780635_0.8384925159204641","host":"s3://npm-registry-packages"}},"1.4.4":{"name":"@tweedegolf/storage-abstraction","version":"1.4.4","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.4","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"eee4747793dcd47fc6bd5718905425f85bf96a0b","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.4.tgz","fileCount":4,"integrity":"sha512-xAtjzCzbKmO+W3i7JJPujm/Im25dejcWUAYtP/I7C4ZAahuaL90S9p/z+J4LwBmKu1oUavaJ0nD9ie7A4zoEqg==","signatures":[{"sig":"MEYCIQDD2CUPA1FPG+U45eYBgyPacDWS6xY4YAnC9pntRxeFnQIhAOJMXcjF7BL6XnsOMSUgtgQTo4ea46pC2T4t6EECGnW4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38313},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"39bb4bacb47a6bbff2492fd5f98c0a38d7cfa5fc","scripts":{"ts":"ts-node","toc":"markdown-toc -i README.md","tsc":"tsc","test":"ts-node ./tests/test.ts","test1":"ts-node ./tests/test1.ts","test2":"ts-node ./tests/test2.ts","test3":"ts-node ./tests/test3.ts","test6":"ts-node ./tests/test6.ts","test-b2":"TYPE='b2' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-all":"npm run test-urls-jasmine && npm run test-local && npm run test-gcs && npm run test-s3 && npm run test-b2","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-urls":"ts-node ./tests/test-urls.ts","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='local' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","copy-readme":"copy ./README.md ./publish","test-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","prepublishOnly":"npm run tsc && npm run toc && npm run copy-readme","test-config-b2":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-b2.jasmine.ts","test-config-s3":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-s3.jasmine.ts","test-config-gcs":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-gcs.jasmine.ts","test-config-local":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-local.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.6","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"14.20.1","dependencies":{"glob":"^8.0.3","ramda":"^0.28.0","rimraf":"^3.0.2","slugify":"^1.3.6","uniquid":"^1.1.4","await-to-js":"^3.0.0","fast-crc32c":"^2.0.0","backblaze-b2":"^1.5.0","@aws-sdk/client-s3":"^3.245.0","@google-cloud/storage":"^6.5.2","@gideo-llc/backblaze-b2-upload-any":"^0.1.3"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-var-requires":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"],"ignorePatterns":["node_modules/","dist/"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"copy":"^0.3.2","dotenv":"^16.0.3","eslint":"^8.25.0","jasmine":"^4.4.0","ts-node":"^10.9.1","prettier":"^2.7.1","tsc-watch":"^5.0.3","typescript":"^4.8.4","@types/node":"^18.11.0","markdown-toc":"^1.2.0","@types/jasmine":"^4.3.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","@typescript-eslint/parser":"^5.40.0","@typescript-eslint/eslint-plugin":"^5.40.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.4_1683893028666_0.7047046488222004","host":"s3://npm-registry-packages"}},"1.4.5":{"name":"@tweedegolf/storage-abstraction","version":"1.4.5","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.5","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"701d847990cfa549965b023255304c8b7907eef6","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.5.tgz","fileCount":4,"integrity":"sha512-qa2uyc9LF2sR2EOUsHaObHjH1/DyikoFR+P7VDF5FLLrcj9NMwz/GlZGEezA5QEn+5mY2ZAUPSDX/5qgejgTWQ==","signatures":[{"sig":"MEYCIQCNVI04ZgkQ8tVpgWziUkzBcG2KGZID1lNFMHD6WgwqrgIhAIXL0U82Mngr0rFj8B6XDlZ/9/XJTX1o4eSATwR6I/ID","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":38726},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"75e4faf1436ae198136b1296eda73a4fec3469de","scripts":{"ts":"ts-node","toc":"markdown-toc -i README.md","tsc":"tsc","test":"ts-node ./tests/test.ts","test1":"ts-node ./tests/test1.ts","test2":"ts-node ./tests/test2.ts","test3":"ts-node ./tests/test3.ts","test6":"ts-node ./tests/test6.ts","test-b2":"TYPE='b2' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-all":"npm run test-urls-jasmine && npm run test-local && npm run test-gcs && npm run test-s3 && npm run test-b2","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-urls":"ts-node ./tests/test-urls.ts","test-await":"ts-node ./tests/test-await.ts","test-local":"TYPE='local' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","copy-readme":"copy ./README.md ./publish","test-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","prepublishOnly":"npm run tsc && npm run toc && npm run copy-readme","test-config-b2":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-b2.jasmine.ts","test-config-s3":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-s3.jasmine.ts","test-config-gcs":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-gcs.jasmine.ts","test-config-local":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-local.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.6","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"14.20.1","dependencies":{"glob":"^10.2.3","rimraf":"^5.0.0","uniquid":"^1.1.4","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.332.0","@google-cloud/storage":"^6.10.1","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-var-requires":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"],"ignorePatterns":["node_modules/","dist/"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"copy":"^0.3.2","dotenv":"^16.0.3","eslint":"^8.25.0","jasmine":"^4.4.0","ts-node":"^10.9.1","prettier":"^2.7.1","tsc-watch":"^6.0.4","typescript":"^5.0.4","@types/node":"^18.16.8","markdown-toc":"^1.2.0","@types/jasmine":"^4.3.0","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.2.1","@typescript-eslint/parser":"^5.40.0","@typescript-eslint/eslint-plugin":"^5.40.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.5_1684229817736_0.5254801550164274","host":"s3://npm-registry-packages"}},"1.4.6":{"name":"@tweedegolf/storage-abstraction","version":"1.4.6","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.6","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"8a57b4f0be096335235a7815018dc79dae36f8f3","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.6.tgz","fileCount":32,"integrity":"sha512-NGtP5iCmunzUnaoMWvNuY4ZZXlUjt7KzL6dWkHNX+mxprb52HzN3Da3I1d7toCebQDhZ6L1nEG98GIOauwbb0A==","signatures":[{"sig":"MEYCIQC2WXpH9gyKFp5kAym64AwDXxxJK6gGK8ju03i7bpVHuAIhAPcp/k5jBDkNGBoHQkAX+dmN08mBQw+m/67bKaewP/Ov","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":155360},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"fbd35c41197c50988fcd0ca358f12a48950297eb","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"14.20.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.2.3","rimraf":"^5.0.0","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.332.0","@google-cloud/storage":"^6.10.1","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.6_1685114715628_0.9546736120696888","host":"s3://npm-registry-packages"}},"1.4.7":{"name":"@tweedegolf/storage-abstraction","version":"1.4.7","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.7","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"2788502274c33e4a5564fc9cac9a818ad127f2a1","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.7.tgz","fileCount":4,"integrity":"sha512-nnVkDd3IRWZSHqwqW2YxnGGrSOiCxXdjnapQBnKoBwPPED8r91xJUfPPpZJkVcLvUS9GX6yz6M10ImT3/VIgRg==","signatures":[{"sig":"MEUCIQDU2VMqiVNqQ8rwuePLWkULAg/c+ZbmuDknx4jTZ68+0AIgGZiF4r4Q4fccdKjuftsKTSabbXRsDwEE9kH/jQKru58=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45775},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1d7c54c03770775019e3ace544ce17c0f9523e9f","scripts":{"ts":"ts-node","toc":"markdown-toc -i README.md","tsc":"tsc","test":"ts-node ./tests/test.ts","prepare":"npm run prepublishOnly","test-b2":"TYPE='b2' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-mode":"ts-node ./tests/test-mode.ts","test-azure":"TYPE='azure' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-local":"TYPE='local' BUCKET_NAME='the-buck' LOCAL_DIRECTORY='tests/test_directory' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","copy-readme":"cp ./README.md ./publish","test-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","prepublishOnly":"npm run tsc && npm run toc && npm run copy-readme","test-config-b2":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-b2.jasmine.ts","test-config-s3":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-s3.jasmine.ts","test-config-gcs":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-gcs.jasmine.ts","test-config-azure":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-azure.jasmine.ts","test-config-local":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-local.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","dependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","uniquid":"^1.1.4","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-var-requires":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"],"ignorePatterns":["node_modules/","dist/"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.3.8","dotenv":"^16.0.3","eslint":"^8.53.0","jasmine":"^5.1.0","ts-node":"^10.9.1","prettier":"^3.0.3","tsc-watch":"^6.0.4","typescript":"^5.0.4","@types/node":"^20.9.0","markdown-toc":"^1.2.0","@types/jasmine":"^5.1.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.10.0","@typescript-eslint/eslint-plugin":"^6.10.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.7_1699747191341_0.7539146405488095","host":"s3://npm-registry-packages"}},"1.4.8":{"name":"@tweedegolf/storage-abstraction","version":"1.4.8","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.4.8","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"af3e690f6cd23c489543db85132e4f5e33c692a0","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.4.8.tgz","fileCount":3,"integrity":"sha512-3AM5/HWl1rTCtfNgfFt0xzOQy5r+l2semz6yejSKLOxtCBqXPKsIi67aGBwjLK2YixsDkwvU55bSjWZ3vrDljQ==","signatures":[{"sig":"MEUCIGAnmPV8I9iDhN8wzrb6B63mASrsuLIKN8SM9b7H0EhMAiEAll8znWDWCcBDBDMubctJNy1YJCUxkalSK3XIpyAid10=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36002},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"4736c850955aeaac61d8362a7d758c0bf3d6e3ea","scripts":{"ts":"ts-node","toc":"markdown-toc -i README.md","tsc":"tsc","test":"ts-node ./tests/test.ts","prepare":"npm run prepublishOnly","test-b2":"TYPE='b2' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-mode":"ts-node ./tests/test-mode.ts","test-azure":"TYPE='azure' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-local":"TYPE='local' BUCKET_NAME='the-buck' LOCAL_DIRECTORY='tests/test_directory' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","copy-readme":"cp ./README.md ./publish","test-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","prepublishOnly":"npm run tsc && npm run toc && npm run copy-readme","test-config-b2":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-b2.jasmine.ts","test-config-s3":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-s3.jasmine.ts","test-config-gcs":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-gcs.jasmine.ts","test-config-azure":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-azure.jasmine.ts","test-config-local":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-local.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","dependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","uniquid":"^1.1.4","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-var-requires":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"],"ignorePatterns":["node_modules/","dist/"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.3.8","dotenv":"^16.0.3","eslint":"^8.53.0","jasmine":"^5.1.0","ts-node":"^10.9.1","prettier":"^3.0.3","tsc-watch":"^6.0.4","typescript":"^5.0.4","@types/node":"^20.9.0","markdown-toc":"^1.2.0","@types/jasmine":"^5.1.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.10.0","@typescript-eslint/eslint-plugin":"^6.10.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.4.8_1699749449709_0.7033624205524638","host":"s3://npm-registry-packages"}},"1.5.1":{"name":"@tweedegolf/storage-abstraction","version":"1.5.1","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"0bb4a289a5497e0b00c1946a369ac74d78b85e94","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.1.tgz","fileCount":40,"integrity":"sha512-BZl9OrTY91zLCgpBdYD7NffPymDRaQuqXod4XfHDJ7fBTqsDg0/O6FAXVDUMoyx6mtGJWSC4BlazFBptdEnzcg==","signatures":[{"sig":"MEYCIQDosFvWQ369XkYadulXmqmUG5a/gokInhBJBy+Y7/eJAAIhAIJcNcNj4FIrs+o+l7hHSVVvhxaBfF9+/EQI4hoyJ4cl","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":332746},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"7c7ee115e8313c060c9b7e52a4dc6b0f4e245c8e","scripts":{"ts":"ts-node","toc":"markdown-toc -i README.md","tsc":"tsc","test":"ts-node ./tests/test.ts","prepare":"npm run prepublishOnly","test-b2":"TYPE='b2' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-s3":"TYPE='s3' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-gcs":"TYPE='gcs' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-mode":"ts-node ./tests/test-mode.ts","test-azure":"TYPE='azure' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","test-local":"TYPE='local' BUCKET_NAME='the-buck' LOCAL_DIRECTORY='tests/test_directory' ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","copy-readme":"cp ./README.md ./publish","test-jasmine":"ts-node ./node_modules/.bin/jasmine ./tests/test.jasmine.ts","prepublishOnly":"npm run tsc && npm run toc && npm run copy-readme","test-config-b2":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-b2.jasmine.ts","test-config-s3":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-s3.jasmine.ts","test-config-gcs":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-gcs.jasmine.ts","test-config-azure":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-azure.jasmine.ts","test-config-local":"ts-node ./node_modules/.bin/jasmine ./tests/test-config-local.jasmine.ts"},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"prettier":{"semi":true,"printWidth":100,"trailingComma":"es5"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","dependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","uniquid":"^1.1.4","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"eslintConfig":{"env":{"es6":true,"node":true,"browser":true,"jasmine":true},"root":true,"rules":{"prettier/prettier":"error","no-dupe-class-members":"off","@typescript-eslint/no-unused-vars":"off","@typescript-eslint/no-var-requires":"off","@typescript-eslint/no-empty-function":"off","@typescript-eslint/no-inferrable-types":"off","@typescript-eslint/interface-name-prefix":"off"},"parser":"@typescript-eslint/parser","extends":["eslint:recommended","plugin:@typescript-eslint/recommended","prettier"],"globals":{},"plugins":["prettier"],"ignorePatterns":["node_modules/","dist/"]},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"nock":"^13.3.8","dotenv":"^16.0.3","eslint":"^8.53.0","jasmine":"^5.1.0","ts-node":"^10.9.1","prettier":"^3.0.3","tsc-watch":"^6.0.4","typescript":"^5.0.4","@types/node":"^20.9.0","markdown-toc":"^1.2.0","@types/jasmine":"^5.1.2","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.10.0","@typescript-eslint/eslint-plugin":"^6.10.0"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.1_1699750171157_0.46270944734307196","host":"s3://npm-registry-packages"}},"1.5.2":{"name":"@tweedegolf/storage-abstraction","version":"1.5.2","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.2","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"9b8329dcc924a7e0df31b1c43730cce380a44524","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.2.tgz","fileCount":38,"integrity":"sha512-hKJbLw4bjoEdWQ3m5NNT+lipOo8ZWc9LSLHpusuQ8zZQzQwufKzvJjvE8lnwKh9jrAcCKmDsYnNmeu00Y/T9Vg==","signatures":[{"sig":"MEQCIAQOkumdAZg3yabTpaAl/fmoHrTstJ0R5yr1WtebktypAiAOgp0yZOwzwYaa6Ms9+6DN9A23xceoG+uPS3Nt7IHlqA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206091},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3875136ae82546cf2d21ae66801522490824fe66","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.2_1699750645917_0.5931104768358777","host":"s3://npm-registry-packages"}},"1.5.3":{"name":"@tweedegolf/storage-abstraction","version":"1.5.3","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.3","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"13bbd3bcdcee1cedc7ed95ce2414a95b660d3180","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.3.tgz","fileCount":38,"integrity":"sha512-LxWlBqMZz4fOt4DXHIrDy8lD/v+0J4Ck3+7r7afNv/DSSspA9OdAAXxxJHLLeWDTzb5fFH4L4/SZDsDktpvjHA==","signatures":[{"sig":"MEUCIATasA6s0BpLvPyXZbl3tyXd/peS+NwjikRJ1VU8oWWmAiEA7T8O8WNVN3zhqXfMHQgNcahGee8hlqeHxUMXt+GTkyI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":205947},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d122350ff1d3c19728da075f70297e6eaa0e8766","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.3_1701946911172_0.17980370523673161","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@tweedegolf/storage-abstraction","version":"2.0.0","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.0.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"f073fa0abdc9f02c84786352a5c338aabc78ee52","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.0.0.tgz","fileCount":26,"integrity":"sha512-+4yRzN52nPxLHD6y2M9IWtWlhC5IpjQLWmLVFBaQfQ1CUqzKY3PIlNHTNp8alOFUo02WmNO0Ppug+w+JjeIlWw==","signatures":[{"sig":"MEYCIQCX8y2G/7wCflpMjPfLVf61son11g2QUf6U8rC4IkpWywIhANU3CU9cWfYtihtPfKJH7OcywNnjXRPlge9p35WiyPTl","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":82805},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"e60bc3283a9feff7d9898ed6e626b5a9a84e84d8","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.0.0_1705665021838_0.45423447671167505","host":"s3://npm-registry-packages"}},"1.5.4":{"name":"@tweedegolf/storage-abstraction","version":"1.5.4","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.4","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"d7c7d3356972404955e0489aa6d4d44fe0e6092e","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.4.tgz","fileCount":38,"integrity":"sha512-JnhQN7VVufcbUodWN3tcj4g3gelyzidhIiD+qMlV4i6jgx+EE1FzFH5yQga1UZgyscZ93WE1xPpCnUEghIKQ7g==","signatures":[{"sig":"MEQCIGncm5feIQ6yUGybasZlxVQtuHEpqYOpcgq0G1uEzAcyAiB4FRUvAzZUiPfd7IULAqAQqpKFEoGAT0G0n+qXLvak2Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":206483},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"8bc33c5c1ca64e48572aaac6119d2e1484b30f04","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","@ramda/zip":"^0.26.1","backblaze-b2":"^1.7.0","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.4_1705671062915_0.1120637317894666","host":"s3://npm-registry-packages"}},"1.5.5":{"name":"@tweedegolf/storage-abstraction","version":"1.5.5","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.5","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"17346e6c725cee7265a1893582680322bbadfbdc","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.5.tgz","fileCount":95,"integrity":"sha512-D5MV+je8xNvZvqog8LIzLRgPeVUz3CHkoeJZuxRMx0K55phOkEnmMWghZpc2auDzgIk89dQZjRGIm1/IRZjeMw==","signatures":[{"sig":"MEQCICCROSL2EbtjUDgbT1nsLvvHKamfo5alxB0MvsKfx7YTAiALNQclusSV472EmnB9UpwTSgKABRZrdlZw16DT1tKGRg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":290633},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ae382e7a49ef56ebe6c7cb3a36bb151e08cb7112","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","@ramda/zip":"^0.26.1","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@nichoth/backblaze-b2":"^1.7.1","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.5_1705777024710_0.28798711831584645","host":"s3://npm-registry-packages"}},"1.5.6":{"name":"@tweedegolf/storage-abstraction","version":"1.5.6","keywords":["storage","storage abstraction","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@1.5.6","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"dist":{"shasum":"035249f8f994dfa5fccf9f33e632ea3fbeaaa0c1","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-1.5.6.tgz","fileCount":95,"integrity":"sha512-E8MgiU00cgS2zHfE8Ysn/arY9ie74xwR3SrW709bPVhFKp8AZ7X3EI+fKN4h8YoNPlGw6HXaLTBhQuNccdK29g==","signatures":[{"sig":"MEYCIQDROSvidrIMS8us8Fk3+swZ7UkL/53mkTRmWOGNkUhGzQIhAKvWGuKqxKhttY68tOHiMQTv6FGtjCMHMUX0r7deUceX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":290389},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"91dcd8315fc304e28cb2f00f446f9be3120ec7cf","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or in the cloud.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"peerDependencies":{"glob":"^10.3.10","rimraf":"^5.0.5","@aws-sdk/client-s3":"^3.445.0","@azure/storage-blob":"^12.17.0","@google-cloud/storage":"^7.6.0","@nichoth/backblaze-b2":"^1.7.1","@aws-sdk/s3-request-presigner":"^3.445.0","@gideo-llc/backblaze-b2-upload-any":"^0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_1.5.6_1706264913064_0.49545364002305625","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@tweedegolf/storage-abstraction","version":"2.1.0","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.1.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"628f299bb20dc1f63e456c8e63a67c79b4315ae4","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.1.0.tgz","fileCount":26,"integrity":"sha512-EUobykGbr/O6PUryxIZ4sZXtrMK9lFlA7r/cDWtqHGu+wBjdOALtkd+f2BjIrSEaRg6bwO5YnI2OqGUn7F3W9Q==","signatures":[{"sig":"MEUCIQDlIF7QhwkTnmLGWB+rPbXsvXgKy1bStCPKxIqORhf+IQIgFupWCmdx45z0kcKKXdEhpuvwCEj6mHZE343QWMbuKHc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":113599},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"bbb2bb047d0fe4daef6b89d9bf110419890da2a6","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.1.0_1706728482781_0.31549732327631386","host":"s3://npm-registry-packages"}},"2.1.1":{"name":"@tweedegolf/storage-abstraction","version":"2.1.1","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.1.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"819309bb56b02574f1fbeb4fbcafe4b1530564f2","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.1.1.tgz","fileCount":27,"integrity":"sha512-QNJwFmGHLHerKk8ze+GJuzrKeYMR0xWGuE7z+dN3dU79St6Cdo/eiyObtdnydT1mzJoSsQRqK8HWAKfUheQqaA==","signatures":[{"sig":"MEQCIFa8W0Dxn/3PaGDXOnSK6znLAogsa+axzhW5uxkN7XWxAiBXRpeLKGn0cumX8COwjVptZceO6q1UuQfJPhbguAYugQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114081},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"83a5024c59361cbecbabd4f3c1ca270d2529b6df","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"9.6.7","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.1.1_1706786229017_0.32181584936858476","host":"s3://npm-registry-packages"}},"2.1.3":{"name":"@tweedegolf/storage-abstraction","version":"2.1.3","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.1.3","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"7ffdffde6ea77659d7d80a9222a288452ef26d9c","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.1.3.tgz","fileCount":27,"integrity":"sha512-9TuxASBo3DevzCMCKyPNgspdoORmopYVpUdeF1CLgMNleGjJm3Ikf/Op+moJG7+GTOmvTS1MbIGe+4kdthAgzg==","signatures":[{"sig":"MEUCIQDW9ZTF6RBQANY1yM/+bqB9FB01oz7cUMyMHa+fN6JurwIgB2/hRarQajg0D0shB+lsRCaO6SXeI+L06xb4C2Hamh8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":114144},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"579203dcd2d1f017c5f137a2d4a4301a89428ced","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"10.5.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.1.3_1712661457454_0.3212778888185439","host":"s3://npm-registry-packages"}},"2.1.6":{"name":"@tweedegolf/storage-abstraction","version":"2.1.6","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.1.6","homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"16889185f0790233d0e09736b2a3804961bdcdd0","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.1.6.tgz","fileCount":27,"integrity":"sha512-Zr79lm4wEiZXp5ZenaYvR4ocr8QeFrKwBa5Hh5X0unHO5R9aGG2D7+BvsJKOCVBBGrE7JqXEbjgl87er0Q35Pw==","signatures":[{"sig":"MEQCICSN618HNDLox1XsenefKHZnCxzhQyVhsUkJA/qD3BbJAiAwJFuFb6aPmmV9MtSGGESVrH/t8oyd6NOhTQqiGkVAqQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":111337},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"bf7cf7b4bbf349df992215c12ee90869c47c1902","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"10.8.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"22.2.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.1.6_1719934560198_0.5407846355558705","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"@tweedegolf/storage-abstraction","version":"2.2.0","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.2.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"37e5503630455b846e62a41860a1e66504527487","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.2.0.tgz","fileCount":27,"integrity":"sha512-HCAeq0g6rxJkBgIPnDTxMyXC5Gz1+JioetNW+rFlKSL+glNUCfRgKgZMGWMCzKSSIFSAxlhR+cznPCJsbHkJCg==","signatures":[{"sig":"MEQCIGneJd3FjGAmPbUShfOBuxqf3YvPeawVhlUNeBWqGTYlAiBi67hc1vrzEsNCa8+oGUk1f92FyZC52AXsQICBqKFz/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122035},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"5e3d6947bbf682691dc625501408935f6b5e15fc","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"10.8.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.2.0_1757886365359_0.7107211512799254","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@tweedegolf/storage-abstraction","version":"2.2.1","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@2.2.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"7cdc3e920746d163d5fcc4f05482fc394a0c19eb","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-2.2.1.tgz","fileCount":27,"integrity":"sha512-gnKg6HUZR4mQeSr+l6XOXYymPro3/VX1nMjkq7yCjiEz6SGgaXFvgsBTmn2ZkUccMo5NwMUhyCS/mRDL4hmBWQ==","signatures":[{"sig":"MEUCIQDi6cBHgOKO3FCCyIig32Ga237yBYsPb1pu5dmn2OfWqwIgErhvJ0XzYnHDA2qy4bQOMC/z7qde2mFB7EOg20mRAro=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134343},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"74cf8abfac9bc9774883804ccdde097f9cd157a2","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"11.6.0","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"22.17.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_2.2.1_1758455461421_0.14895236753878383","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@tweedegolf/storage-abstraction","version":"3.0.0","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@3.0.0","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"37838c53d12f751fd1bf7ca9b79d3e1915bc670d","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-3.0.0.tgz","fileCount":27,"integrity":"sha512-+ybAzLg5Kbyc3omcAB80P121Me4yjbi2AsCOOVKi11fyqnKBtEvDp809EfyEYYHWUuPNbe/nYX60DxvgG0+qZw==","signatures":[{"sig":"MEUCIQD0eSSmFx8s4Oi/apDxEnVqXWi70nHmIe9h0Rn8wNxMUQIgLrPk23KV0j56Z6TdJzkDXJ+cSvhjk0Sh2ha1WzF5SPc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150791},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"3c1dabe56f34bdc1421471ea4b3a461f6436d49c","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"10.8.1","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"20.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_3.0.0_1760918313790_0.4923226396116902","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@tweedegolf/storage-abstraction","version":"3.0.1","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@3.0.1","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"7c03c655e370ae8ea31f92700feba34582875c69","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-3.0.1.tgz","fileCount":27,"integrity":"sha512-eaK24MsBJQdCcJWL6OBjKLdRIgVQFuEYZ6okfJOqgSHRwB9XcJsSX8vIt5ZWu2B82wU2WnRwUrDWViKhzd4S9A==","signatures":[{"sig":"MEQCIG8PjKMtL2ER2omZf98atiB28WQfeujpp/cKe3gWbKnqAiBj9BwqiAKrnaR/nQQkplR1pwGdo2Z/4wkexxlHGOxyBA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157853},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"265d59c52d43b7260ba6af1ff0a35bcb68f6e952","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"11.6.2","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"24.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_3.0.1_1761209355100_0.14716518193021333","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@tweedegolf/storage-abstraction","version":"3.0.2","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@3.0.2","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"5f9393f86f512bf2ea83fa1272c54b47259caf43","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-3.0.2.tgz","fileCount":27,"integrity":"sha512-kumbld+6l5XDQVetxxsgdn2xQIrTKhVlwe8+N3bP6cvCJYw12YsJkktzzU38ivz5323J/yEGFL+vQEDHFCXeaA==","signatures":[{"sig":"MEQCIFrElNXFFM3MDLMuf7haETY7bzJ7reDnZVNIXbnwty1FAiB1t3YihhrIvbr7WnxuDkmkD7MmCUq/2bb98Zp7lZW3ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157510},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"265d59c52d43b7260ba6af1ff0a35bcb68f6e952","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"11.6.2","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"24.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_3.0.2_1761209693587_0.1512889218049427","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@tweedegolf/storage-abstraction","version":"3.0.3","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","_id":"@tweedegolf/storage-abstraction@3.0.3","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"homepage":"https://github.com/tweedegolf/storage-abstraction/","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"src":"src/Storage.js","dist":{"shasum":"e444a3131702649715082bc96ca3d85a3e63a409","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-3.0.3.tgz","fileCount":27,"integrity":"sha512-C5iyGGepIFCL3MHmDglTeih96DUG5of+jTHc9E5SfweOUanelZiC6oKeiCkqaPNKd4hW+AAzvweV/d8s+O8m/Q==","signatures":[{"sig":"MEUCID5YxKIF0SMNF0QyF/bTLk3sVyoyaG/TDrhPw9na43ZLAiEAox0V85xEnyfwAGLlXAP+6M3ug1mq2IhqmlUuTj176dk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158543},"main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","gitHead":"12e7c2ad4e0b6ac62aff1b3d33a0243fbdeb10b9","scripts":{},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"repository":{"url":"git+https://github.com/tweedegolf/storage-abstraction.git","type":"git"},"_npmVersion":"11.6.2","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","directories":{},"_nodeVersion":"24.9.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/storage-abstraction_3.0.3_1761567441356_0.384435551132289","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@tweedegolf/storage-abstraction","version":"3.0.4","description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","src":"src/Storage.js","main":"dist/index/Storage.js","types":"dist/index/Storage.d.ts","homepage":"https://github.com/tweedegolf/storage-abstraction/","repository":{"type":"git","url":"git+https://github.com/tweedegolf/storage-abstraction.git"},"scripts":{},"keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","publishConfig":{"access":"public"},"gitHead":"e3d37f25483b083a511ecf745f224c559d6a84c6","_id":"@tweedegolf/storage-abstraction@3.0.4","bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"_nodeVersion":"24.9.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-B7RbPsbrIjmFauDLjIU9jEIouA+4W90BFfgEJ8emaIHHdPkeasFXPG2Oqp8U9EFN/de4d5RhiqDRPrElY1jkVg==","shasum":"23db6ce1c919fdec11fe330610d17fe708e415b1","tarball":"https://registry.npmjs.org/@tweedegolf/storage-abstraction/-/storage-abstraction-3.0.4.tgz","fileCount":27,"unpackedSize":158984,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDNdjD++Gn3zoYXd6wuSevj+UujpZksA0j9IUn+1Wb1NwIgd/R7/rPCeKbVu5SElPJQcVg1AK4Af28ybzLseXMkGYk="}]},"_npmUser":{"name":"daniel2g","email":"daniel@tweedegolf.nl"},"directories":{},"maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/storage-abstraction_3.0.4_1778929294397_0.07870458223825594"},"_hasShrinkwrap":false}},"time":{"created":"2019-07-22T20:21:57.193Z","modified":"2026-05-16T11:01:34.678Z","1.1.11":"2019-07-22T20:21:57.515Z","1.1.12":"2019-07-23T11:30:59.176Z","1.1.13":"2019-07-24T08:29:19.851Z","1.1.14":"2019-07-24T13:51:26.173Z","1.1.15":"2019-07-24T18:37:18.455Z","1.1.16":"2019-09-30T09:38:16.079Z","1.2.0":"2019-12-18T15:28:24.185Z","1.2.1":"2020-01-24T13:26:42.418Z","1.3.0":"2020-03-25T14:10:15.214Z","1.3.1":"2020-03-25T21:30:51.391Z","1.4.0":"2020-04-21T16:44:20.556Z","1.4.1":"2020-04-21T17:15:59.155Z","1.4.2":"2020-05-10T16:03:34.592Z","1.4.3":"2020-06-01T08:23:00.750Z","1.4.4":"2023-05-12T12:03:48.838Z","1.4.5":"2023-05-16T09:36:57.910Z","1.4.6":"2023-05-26T15:25:15.825Z","1.4.7":"2023-11-11T23:59:51.540Z","1.4.8":"2023-11-12T00:37:29.862Z","1.5.1":"2023-11-12T00:49:31.509Z","1.5.2":"2023-11-12T00:57:26.111Z","1.5.3":"2023-12-07T11:01:51.398Z","2.0.0":"2024-01-19T11:50:22.018Z","1.5.4":"2024-01-19T13:31:03.068Z","1.5.5":"2024-01-20T18:57:04.895Z","1.5.6":"2024-01-26T10:28:33.221Z","2.1.0":"2024-01-31T19:14:43.047Z","2.1.1":"2024-02-01T11:17:09.205Z","2.1.3":"2024-04-09T11:17:37.638Z","2.1.6":"2024-07-02T15:36:00.353Z","2.2.0":"2025-09-14T21:46:05.540Z","2.2.1":"2025-09-21T11:51:01.615Z","3.0.0":"2025-10-19T23:58:34.010Z","3.0.1":"2025-10-23T08:49:15.295Z","3.0.2":"2025-10-23T08:54:53.776Z","3.0.3":"2025-10-27T12:17:21.579Z","3.0.4":"2026-05-16T11:01:34.517Z"},"bugs":{"url":"https://github.com/tweedegolf/storage-abstraction/issues"},"author":{"name":"daniel@tweedegolf.nl"},"license":"MIT","homepage":"https://github.com/tweedegolf/storage-abstraction/","keywords":["storage abstraction","cloud storage","storage","cloud","cloud filesystem","google cloud","amazon s3","backblaze b2","cloudflare r2","cubbit","minio","azure"],"repository":{"type":"git","url":"git+https://github.com/tweedegolf/storage-abstraction.git"},"description":"Provides an abstraction layer for interacting with a storage; the storage can be local or any of the supported cloud storage services.","maintainers":[{"name":"daniel2g","email":"daniel@tweedegolf.nl"},{"name":"marlonb","email":"marlon@tweedegolf.com"}],"readme":"# <a name='storage-abstraction'></a>Storage Abstraction\n\n[![ci](https://github.com/tweedegolf/storage-abstraction/actions/workflows/ci.yaml/badge.svg?branch=master)](https://github.com/tweedegolf/storage-abstraction/actions/workflows/ci.yaml)\n\nProvides an abstraction layer for interacting with a storage; the storage can be on a local file system or in the cloud. Supported cloud storage providers are:\n\n- Amazon S3\n- Google Cloud\n- Azure Blob\n- MinIO (native and S3)\n- Backblaze B2 (native and S3)\n- CloudFlare R2 (S3)\n- Cubbit (S3)\n\nThe storage abstraction API only supports basic storage operations (see [below](#adapter-api)) so the API can be cloud agnostic. This means that you can develop your application using local disk storage and then use for instance Google Cloud or Amazon S3 in your production environment without the need to change any code.\n\n## Table of contents\n\n<!--start_toc-->\n\nDocumentation|Adapter API|Introspective API|Storage API\n:---|:---|:---|:---\n[1. How it works](#how-it-works)|[listBuckets](#listbuckets)           |[getProvider](#getprovider)|[getAdapter](#getadapter)\n[2. Instantiate a storage](#instantiate-a-storage)|[listFiles](#listfiles)        |[getConfiguration](#getconfiguration)|[switchAdapter](#switchadapter)\n[a. Configuration object](#configuration-object)|[bucketIsPublic](#bucketispublic)|[getConfigurationError](#getconfigurationerror)|\n&nbsp; [b. Configuration URL](#configuration-url)|[bucketExists](#bucketexists)  |[getServiceClient](#getserviceclient)|\n&nbsp; [c. How bucketName is used](#how-bucketname-is-used)|[fileExists](#fileexists)         |[getSelectedBucket](#getselectedbucket)|\n[3. Adapters](#adapters)|[createBucket](#createbucket)|[setSelectedBucket](#setselectedbucket)|\n[4. Adding an adapter](#adding-an-adapter)|[clearBucket](#clearbucket)||\n&nbsp; [a. Add your storage type](#add-your-storage-type)|[deleteBucket](#deletebucket)||\n&nbsp; [b. Define your configuration](#define-your-configuration)|[addFile](#addfile)||\n&nbsp; [c. Adapter class](#adapter-class)|[addFileFromPath](#addfilefrompath)||\n&nbsp; [d. Adapter function](#adapter-function)|[addFileFromBuffer](#addfilefrombuffer)||\n&nbsp; [e. Register your adapter](#register-your-adapter)|[addFileFromStream](#addfilefromstream) ||\n&nbsp; [f. Adding your adapter code to this package](#adding-your-adapter-code-to-this-package)|[getPresignedUploadURL](#getPresignedUploadURL)||\n[5. Tests](#tests)|[getPublicURL](#getpublicurl)||\n[6. Example application](#example-application)|[getSignedURL](#getsignedurl) ||\n[7. Questions and requests](#questions-and-requests)|[getFileAsStream](#getfileasstream)||\n&nbsp;|[removeFile](#removefile)||\n&nbsp;|[sizeOf](#sizeof)||\n\n<!--end_toc-->\n\n## How it works\n\nA `Storage` instance is a thin wrapper around one of the available adapters. These adapters are available as separate packages on npm. This way your code base stays as slim as possible because you only have to add the adapter(s) that you need to your project.\n\nThe adapters itself are wrappers around the cloud storage provider specific client SDK's, e.g. the [AWS SDK](https://aws.amazon.com/sdk-for-javascript/).\n\nList of available adapters:\n\n- [Local file system](https://www.npmjs.com/package/@tweedegolf/sab-adapter-local) `npm i @tweedegolf/sab-adapter-local`\n- [Amazon S3 (Amazon S3 and fully compatible)](https://www.npmjs.com/package/@tweedegolf/sab-adapter-amazon-s3) `npm i @tweedegolf/sab-adapter-amazon-s3`\n- [Google cloud](https://www.npmjs.com/package/@tweedegolf/sab-adapter-google-cloud) `npm i @tweedegolf/sab-adapter-google-cloud`\n- [Azure Blob](https://www.npmjs.com/package/@tweedegolf/sab-adapter-azure-blob) `npm i @tweedegolf/sab-adapter-azure-blob`\n- [S3 (Amazon and Backblaze, Cloudflare, Cubbit and MinIO)](https://www.npmjs.com/package/@tweedegolf/sab-adapter-s3) `npm i @tweedegolf/sab-adapter-s3`\n- [Backblaze B2 using native API](https://www.npmjs.com/package/@tweedegolf/sab-adapter-backblaze-b2) `npm i @tweedegolf/sab-adapter-backblaze-b2`\n- [Backblaze B2 using S3 API](https://www.npmjs.com/package/@tweedegolf/sab-adapter-backblaze-s3) `npm i @tweedegolf/sab-adapter-backblaze-s3`\n- [MinIO using native API](https://www.npmjs.com/package/@tweedegolf/sab-adapter-minio) `npm i @tweedegolf/sab-adapter-minio`\n- [MinIO using S3 API](https://www.npmjs.com/package/@tweedegolf/sab-adapter-minio-s3) `npm i @tweedegolf/sab-adapter-minio-s3`\n- [Cubbit](https://www.npmjs.com/package/@tweedegolf/sab-adapter-cubbit-s3) `npm i @tweedegolf/sab-adapter-cubbit-s3`\n- [Cloudflare R2](https://www.npmjs.com/package/@tweedegolf/sab-adapter-cloudflare-s3) `npm i @tweedegolf/sab-adapter-cloudflare-s3`\n\nIt is important to know that `S3` and `Amazon S3` are different adapters; `Amazon S3` only supports Amazon S3 and strict compatible providers whereas `S3` supports Amazon S3 and the partial compatible providers Cubbit, Cloudflare, MinIO S3 and Backblaze S3. The latter adapter exists for historical reasons; originally we tried to create a single adapter for all S3 compatible providers but unfortunately the implementation of S3 differs quite across 'compatible' providers which led to a lot of if-else forking in the code making it hard to read and maintain. \n\nTherefor we decided to write one adapter with a strict Amazon S3 implementation and then write a separate adapters for every S3 compatible provider, extending the Amazon S3 adapter and overriding methods that had to be implemented differently. So far this has lead to 4 new adapters that extend the strict Amazon S3 adapter:\n\n- AdapterBackblazeS3\n- AdapterCloudflareS3\n- AdapterCubbitS3\n- AdapterMinioS3\n\n>[!NOTE]\n>The adapter `AdapterS3` is based on the code of the former version of `AdapterAmazonS3`. This means that if you are using a 1.x.x version of `AdapterAmazonS3` and you want to upgrade, you need to switch to `AdapterS3` or use the S3 adapter that matches your provider.\n\n>[!NOTE]\n>You might wonder why all adapter names starts with `sab-adapter`; sab is short for StorageABstraction. Sometimes we may refer to this library as sab or sablib.\n\nWhen you create a `Storage` instance it creates an instance of an adapter based on the configuration object or url that you provide. Then all API calls to the `Storage` are forwarded to this adapter instance, below a code snippet of the `Storage` class that shows how `createBucket` is forwarded:\n\n```typescript\n// member function of class Storage\npublic async createBucket(name: string): Promise<ResultObject> {\n  return this.adapter.createBucket(name);\n}\n```\n\nThe class `Storage` implements the interface `IAdapter` and this interface declares the complete API. Because all adapters have to implement this interface as well, either by extending `AbstractAdapter` or otherwise, all API calls on `Storage` can be directly forwarded to the adapters.\n\nThe adapter subsequently creates an instance of the cloud storage specific client and this instance handles the actual communication with the cloud service. For instance:\n\n```typescript\n// Amazon S3 adapter\nprivate const _client = new S3Client();\n\n// Azure Blob Storage adapter\nprivate const _client = new BlobServiceClient();\n```\n\nTherefor, dependent on what definitions you use, this library could be seen as a wrapper or a shim.\n\n## Instantiate a storage\n\n```javascript\nconst s = new Storage(config);\n```\n\nWhen you create a new `Storage` instance the `config` argument is used to instantiate the right adapter. You can provide the `config` argument in 2 forms:\n\n1. using a configuration object (js: `typeof === \"object\"` ts: `AdapterConfig`)\n2. using a configuration URL (`typeof === \"string\"`)\n\nInternally the configuration URL will be converted to a configuration object so any rule that applies to a configuration object applies to configuration URLs as well.\n\nThe configuration must at least specify a provider; the provider is used to determine which adapter should be created. Note that the adapters are not included in the Storage Abstraction package so you have to add them to you project's package.json before you can use them.\n\nThe value of the type is one of the enum members of `Provider`:\n\n```typescript\nexport enum Provider {\n  NONE = \"none\",          // initial value for the abstract adapter, don't use this one\n  LOCAL = \"local\",        // adapter for local storage (ideal for testing)\n  GCS = \"gcs\",            // Google Cloud Storage\n  GS = \"gs\",              // Google Cloud Storage\n  S3 = \"s3\",              // Amazon S3 and (partly) S3 compatible providers Cubbit, Cloudflare, Minio and Backblaze\n  AWS = \"aws\",            // Amazon S3 or providers that are fully S3 compatible)\n  AZURE = \"azure\",        // Azure Storage Blob\n  B2 = \"b2\",              // BackBlaze B2 using native API with AdapterBackblazeB2\n  BACKBLAZE = \"b2\",       // BackBlaze B2 using native API with AdapterBackblazeB2\n  B2_S3 = \"b2-s3\",        // Backblaze B2 using S3 API with AdapterAmazonS3\n  BACKBLAZE_S3 = \"b2-s3\", // Backblaze B2 using S3 API with AdapterAmazonS3\n  MINIO = \"minio\",        // Minio using native API with AdapterMinio\n  MINIO_S3 = \"minio-s3\",  // Minio using S3 API with AdapterAmazonS3\n  CUBBIT = \"cubbit\",      // Cubbit uses S3 API with AdapterAmazonS3  \n  R2 = \"r2\",              // Cloudflare R2 uses S3 API with AdapterAmazonS3    \n  CLOUDFLARE = \"r2\",      // Cloudflare R2 uses S3 API with AdapterAmazonS3   \n}\n```\n\nThe Storage instance is only interested in the provider so it checks if the provider is valid and then passes the rest of the configuration on to the adapter constructor. It is the responsibility of the adapter to perform further checks on the configuration. I.e. if all mandatory values are available such as credentials or an endpoint.\n\n>[!NOTE]\n> Some adapters have two entries, for instance the keys `Provider.BACKBLAZE` and `Provider.B2` both have value `b2` and use both `AdapterBackblazeB2`.\n\n>[!NOTE]\n> Although there are 16 keys in the enum, there are only 11 adapters supporting 7 different cloud storage providers. The providers Minio and Backblaze B2 have both a native API and support for the S3 API.\n\n### Configuration object\n\nTo enforce that the configuration object contains a `provider` key, it expects the configuration object to be of type `StorageAdapterConfig`\n\n```typescript\ninterface AdapterConfig {\n  bucketName?: string;\n  [id: string]: any; // any service specific mandatory or optional key\n}\n\ninterface StorageAdapterConfig extends AdapterConfig {\n  provider: Provider;\n}\n```\n\nBesides the mandatory key `provider` one or more keys may be mandatory or optional dependent on the provider; for instance keys for passing credentials such as `keyFilename` for Google Storage or `accessKeyId` and `secretAccessKey` for Amazon S3, and keys for further configuring the storage service such as `StoragePipelineOptions` for Azure Blob.\n\n### Configuration URL\n\nThe general format of configuration urls is:\n\n```typescript\nconst u = \"protocol://username:password@host:port/path/to/object?region=auto&option2=value2...\";\n```\n\nFor most storage services `username` and `password` are the credentials, such as key id and secret but this is not mandatory; you may use these values for other purposes.\n\nThe protocol part of the url defines the storage provider and must match the value of one of the keys in the `Provider` type:\n\n- `local://` &rarr; local storage\n- `aws://` &rarr; Amazon S3 (and fully S3 compatible providers)\n- `gcs://` &rarr; Google Cloud\n- `gs://` &rarr; Google Cloud\n- `azure://` &rarr; Azure Blob Storage\n- `s3://` &rarr; Amazon S3 (and partly S3 compatibles: Backblaze, Cloudflare, Cubbit and MinIO)\n- `minio://` &rarr; MinIO\n- `minio-s3://` &rarr; MinIO S3 API\n- `b2://` &rarr; Backblaze B2\n- `backblaze://` &rarr; Backblaze B2\n- `b2-s3://` &rarr; Backblaze B2 S3 API\n- `backblaze-s3://` &rarr; Backblaze B2 S3 API\n- `r2://` &rarr; Cloudflare R2 Storage\n- `cloudflare://` &rarr; Cloudflare R2 Storage\n- `cubbit://` &rarr; Cubbit Storage\n\nNote that some providers can be addressed by multiple protocols, e.g. for Google Cloud Storage you can use both `gcs` and `gs`.\n\nAlso note that `s3` and `aws` are different adapters; `aws` only supports Amazon S3 and strict compatible S3 providers whereas `s3` supports Amazon S3, Cubbit, Cloudflare, MinIO S3 and Backblaze S3.\n\n<!--\n```typescript\n// example with extra Azure option \"maxTries\"\nconst c = \"azure://account_name:account_key@bucket_name?maxTries=10\";\n\n// internally the config url is converted to a config object:\nconst c1 = {\n  type: Provider.AZURE,\n  accountName: \"account_name\",\n  accountKey: \"account_key\",\n  bucketName: \"bucket_name\",\n  maxTries: 10,\n};\n```\n// -->\n\nThe url parser generates a generic object with generic keys that resembles the standard javascript [URL object](https://developer.mozilla.org/en-US/docs/Web/API/URL). This object will be converted to the adapter specific AdapterConfig format in the constructor of the adapter. When converted the `searchParams` object will be flattened into the config object, for example:\n\n```typescript\n// port and bucket\nconst u = \"aws://key:secret@the-buck/path/to/object?region=auto&option2=value2\";\n\n// output parser\nconst p = {\n  protocol: \"aws\",\n  username: \"key\",\n  password: \"secret\",\n  host: \"the-buck\",\n  port: null,\n  path: \"path/to/object\",\n  searchParams: {\n    region: \"auto\",\n    option2: \"value2\",\n  },\n};\n\n// AdapterConfigAmazonS3\nconst c = {\n  type: \"aws\",\n  accessKeyId: \"key\",\n  secretAccessKey: \"secret\",\n  bucketName: \"the-buck\",\n  region: \"auto\",\n  option2: \"value2\",\n};\n```\n\nThe components of the url represent config parameters and because not all adapters require the same and/or the same number of parameters, not all components of the url are mandatory. When you leave certain components out, it may result in an invalid url according to the [official specification](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) but the parser will parse them anyway.\n\n```typescript\n// port and bucket\nconst u = \"aws://part1:part2@bucket:9000/path/to/object?region=auto&option2=value2\";\nconst p = {\n  protocol: \"aws\",\n  username: \"part1\",\n  part2: \"part2\",\n  host: \"bucket\",\n  port: \"9000\",\n  path: \"path/to/object\",\n  searchParams: { region: \"auto\", option2: \"value2\" },\n};\n\n// no bucket but with @\nconst u = \"aws://part1:part2@:9000/path/to/object?region=auto&option2=value2\";\nconst p = {\n  protocol: \"aws\",\n  username: \"part1\",\n  password: \"part2\",\n  host: null,\n  port: \"9000\",\n  path: \"path/to/object\",\n  searchParams: { region: \"auto\", option2: \"value2\" },\n};\n\n// no bucket\nconst u = \"aws://part1:part2:9000/path/to/object?region=auto&option2=value2\";\nconst p = {\n  protocol: \"aws\",\n  username: \"part1\",\n  password: \"part2\",\n  host: null,\n  port: \"9000\",\n  path: \"path/to/object\",\n  searchParams: { region: \"auto\", option2: \"value2\" },\n};\n\n// no credentials, note: @ is mandatory in order to be able to parse the bucket name\nconst u = \"aws://@bucket/path/to/object?region=auto&option2=value2\";\nconst p = {\n  protocol: \"aws\",\n  username: null,\n  password: null,\n  host: \"bucket\",\n  port: null,\n  path: \"path/to/object\",\n  searchParams: { region: \"auto\", option2: \"value2\" },\n};\n\n// no credentials, no bucket\nconst u = \"aws:///path/to/object?region=auto&option2=value2\";\nconst p = {\n  protocol: \"aws\",\n  username: \"/path/to/object\",\n  password: null,\n  host: null,\n  port: null,\n  path: null,\n  searchParams: { region: \"auto\", option2: \"value2\" },\n};\n\n// no credentials, no bucket, no extra options (query string)\nconst u = \"aws:///path/to/object\";\nconst p = {\n  protocol: \"aws\",\n  username: \"/path/to/object\",\n  password: null,\n  host: null,\n  port: null,\n  path: null,\n  searchParams: null,\n};\n\n// only protocol\nconst u = \"aws://\";\nconst p = {\n  protocol: \"aws\",\n  username: null,\n  password: null,\n  host: null,\n  port: null,\n  path: null,\n  searchParams: null,\n};\n\n// absolutely bare\nconst u = \"aws\";\nconst p = {\n  protocol: \"aws\",\n  username: null,\n  password: null,\n  host: null,\n  port: null,\n  path: null,\n  searchParams: null,\n};\n```\n\n### How bucketName is used\n\nIf you provide a bucket name it will be stored in the state of the Storage instance. This makes it for instance possible to add a file to a bucket without specifying the name of bucket:\n\n```typescript\nstorage.addFile(\"path/to/your/file\"); // the file was automatically added to the selected bucket\n```\n\nNote that if the bucket does not exist it will not be created automatically for you when you create a Storage instance! This was the case in earlier versions but as of version 2.0.0 you have to create the bucket yourself using `createBucket`.\n\n## Adapters\n\nThe adapters are the key part of this library; where the `Storage` is merely a thin wrapper, adapters perform the actual actions on the cloud storage by translating generic API methods calls to storage provider specific calls. The adapters are not part of the Storage Abstraction package; you need to install the separately. See [How it works](#how-it-works).\n\nA description of the available adapters; what the configuration objects and URLs look like and what the default values are can be found in the README of the adapter packages:\n\n| provider          | npm command                                  | readme                                                                                                    |\n| ------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------- |\n| Local storage | `npm i @tweedegolf/sab-adapter-local`        | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-local?activeTab=readme)        |\n| Amazon S3     | `npm i @tweedegolf/sab-adapter-amazon-s3`    | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-amazon-s3?activeTab=readme)    |\n| Azure Blob    | `npm i @tweedegolf/sab-adapter-azure-blob`   | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-azure-blob?activeTab=readme)   |\n| Backblaze B2  | `npm i @tweedegolf/sab-adapter-backblaze-b2` | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-backblaze-b2?activeTab=readme) |\n| Google Cloud  | `npm i @tweedegolf/sab-adapter-google-cloud` | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-google-cloud?activeTab=readme) |\n| MinIO         | `npm i @tweedegolf/sab-adapter-minio`        | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-minio?activeTab=readme)        |\n| S3            | `npm i @tweedegolf/sab-adapter-s3`           | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-s3?activeTab=readme)    |\n| Backblaze B2 S3 | `npm i @tweedegolf/sab-adapter-backblaze-s3`  | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-backblaze-s3?activeTab=readme)    |\n| Cubbit        | `npm i @tweedegolf/sab-adapter-cubbit-s3`    | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-cubbit-s3?activeTab=readme)    |\n| Cloudflare R2 | `npm i @tweedegolf/sab-adapter-cloudflare-s3` | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-cloudflare-s3?activeTab=readme)    |\n| MinIO S3      | `npm i @tweedegolf/sab-adapter-minio-s3`    | [**npm.com&#8599;**](https://www.npmjs.com/package/@tweedegolf/sab-adapter-minio-s3?activeTab=readme)    |\n\nYou can also add more adapters yourself very easily, see [below](#adding-more-adapters).\n\n>[!NOTE] \n> Note that the S3 adapter supports Amazon, Cubbit, Cloudflare R2 and the S3 API of Backblaze B2 and Minio.\n> The Amazon S3 adapter only supports Amazon and fully compatible S3 providers\n> It is recommended to use the provider specific S3 adapter (e.g. MinIO S3 `sab-adapter-minio-s3`) instead of the generic S3 adapter. \n\n## Adapter Introspect API\n\nThese methods can be used to introspect the adapter. Unlike all other methods, these methods do not return a promise but return a value immediately.\n\n### getProvider\n\n```typescript\ngetProvider(): Provider;\n```\n\nReturns the cloud storage provider, value is a member of the enum `Provider`.\n\nAlso implemented as getter:\n\n```typescript\nconst storage = new Storage(config);\nconsole.log(storage.provider);\n```\n<hr>\n\n### getSelectedBucket\n\n```typescript\ngetSelectedBucket(): null | string\n```\n\nReturns the name of the bucket that you've provided with the config upon instantiation or that you've set afterwards using `setSelectedBucket`\n\nAlso implemented as getter:\n\n```typescript\nconst storage = new Storage(config);\nconsole.log(storage.bucketName);\n```\n<hr>\n\n### setSelectedBucket\n\n```typescript\nsetSelectedBucket(null | string): void\n```\n\nSets the name of the bucket that will be stored in the local state of the Adapter instance. This overrides the value that you may have provided with the config upon instantiation. You can also clear this value by passing `null` as argument.\n\nIf you use this method to select a bucket you don't have to provide a bucket name when you call any of these methods:\n\n- `createBucket`\n- `clearBucket`\n- `deleteBucket`\n- `bucketExists`\n- `bucketIsPublic`\n- `addFile`, `addFileFromStream`, `addFileFromBuffer`, `addFileFromPath`\n- `getFileAsStream`\n- `getPublicURL`, `getSignedURL`\n- `fileExists`\n- `removeFile`\n- `listFiles`\n- `sizeof`\n\nAlso implemented as setter:\n\n```typescript\nconst storage = new Storage(config);\nstorage.bucketName = \"the-buck-2\";\n```\n\n<hr>\n\n### getConfiguration\n\n```typescript\ngetConfiguration(): AdapterConfig\n```\n\nReturns the typed configuration object as provided when the storage was instantiated. If you have provided the configuration in url form, the function will return it as an configuration object.\n\nAlso implemented as getter:\n\n```typescript\nconst storage = new Storage(config);\nconsole.log(storage.config);\n```\n\n<hr>\n\n### getConfigurationError\n\n```typescript\ngetConfigurationError(): string | null\n```\n\nReturns an error message if something has gone wrong with initialization or authorization. Returns `null` otherwise.\n\nAlso implemented as getter:\n\n```typescript\nconst storage = new Storage(config);\nconsole.log(storage.configError);\n```\n\n<hr>\n\n### getServiceClient\n\n```typescript\ngetServiceClient(): any\n```\n\nUnder the hood some adapters create an instance of a service client that actually makes connection with the cloud storage. If that is the case, this method returns the instance of that service client.\n\nFor instance in the adapter for Amazon S3 an instance of the S3Client of the aws sdk v3 is instantiated; this instance will be returned if you call `getServiceClient` on a storage instance with an S3 adapter.\n\n```typescript\n// inside the Amazon S3 adapter an instance of the S3Client is created. S3Client is part of the aws-sdk\nthis._client = new S3Client();\n```\n\nThis method is particularly handy if you need to make API calls that are not implemented in this library. The example below shows how the `CopyObjectCommand` is used directly on the service client of the Amazon S3 adapter. The API of the Storage Abstraction does not (yet) offer a method to copy an object that is already stored in the cloud so this can be a way to circumvent that.\n\n```typescript\nconst storage = new Storage(config);\nconst client = storage.getServiceClient(); // returns an instance of AWS S3Client\n\nconst input = {\n  Bucket: \"destinationbucket\",\n  CopySource: \"/sourcebucket/HappyFacejpg\",\n  Key: \"HappyFaceCopyjpg\",\n};\nconst command = new CopyObjectCommand(input);\nconst response = await client.send(command);\n```\n\nAlso implemented as getter:\n\n```typescript\nconst storage = new Storage(config);\nconsole.log(storage.serviceClient);\n```\n\n## Adapter API\n\nThese methods are actually accessing the underlying cloud storage service. All these methods are async and return a promise that always resolves in a `ResponseObject` type or a variant thereof:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nIf the call succeeds the `error` key will be `null` and the `value` key will hold the returned value. This can be a simple string `\"ok\"`, a status message, a warning or for instance an array of bucket names.\n\nIn case the call yields an error, the `value` key will be `null` and the `error` key will hold the error message. Usually this is the error message as sent by the cloud storage service so if necessary you can lookup the error message in the documentation of that service to learn more about the error.\n\n### listBuckets\n\n```typescript\nlistBuckets(): Promise<ResultObjectBuckets>\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectBuckets = {\n  value: Array<string> | null;\n  error: string | null;\n};\n```\n\nReturns an array with the names of all buckets in the storage.\n\n> [!NOTE]\n> dependent on the type of storage and the credentials used, you may need extra access rights for this action. E.g.: sometimes a user may only access the contents of one single bucket.\n\n<hr>\n\n### listFiles\n\n```typescript\nlistFiles(...args:\n  [bucketName?: string, numFiles?: number] |\n  [numFiles?: number] |\n  [bucketName?: string]\n)): Promise<ResultObjectFiles>;\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectFiles = {\n  error: string | null;\n  value: Array<[string, number]> | null;\n};\n```\n\nReturns a list of all files in the bucket; for each file a tuple is returned: the first value is the path and the second value is the size of the file. If the call succeeds the `value` key will hold an array of tuples.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n<hr>\n\n### bucketIsPublic\n\n```typescript\nbucketIsPublic(bucketName?: string): Promise<ResultObjectBoolean>;\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectBoolean = {\n  error: string | null;\n  value: boolean | null;\n};\n```\nCheck if the bucket is publicly accessible.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n>[!NOTE]\n> Both Cloudflare R2 and Cubbit do not provide a way to check if a bucket is public. You have to check this in the respective web consoles. Using this method return an error `{Cubbit | Cloudflare} does not support checking if a bucket is public, please use the {Cubbit | Cloudflare} web console\";`\n\n>[!NOTE]\n> If you are connected to Azure using a SAS token this method will return an error: \"This request is not authorized to perform this operation using this permission.\"\n> Please use any of the other ways to login to Azure if you want to use this method. \n\n<hr>\n\n### bucketExists\n\n```typescript\nbucketExists(bucketName?: string): Promise<ResultObjectBoolean>;\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectBoolean = {\n  error: string | null;\n  value: boolean | null;\n};\n```\n\nCheck whether a bucket exists or not. If the call succeeds the `value` key will hold a boolean value.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n<hr>\n\n### fileExists\n\n```typescript\nfileExists(...args:\n  [bucketName: string, fileName: string] |\n  [fileName: string]\n): Promise<ResultObjectBoolean>;\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectBoolean = {\n  error: string | null;\n  value: boolean | null;\n};\n```\n\nCheck whether a file exists or not. If the call succeeds the `value` key will hold a boolean value.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n<hr>\n\n### createBucket\n\n```typescript\ncreateBucket(...args:\n  [bucketName?: string, options?: Options] |\n  [options?: Options]\n): Promise<ResultObject>;\n```\n\n```typescript\ntype Options {\n  public: boolean, \n  [anykey]: any\n};\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nCreates a new bucket. If successful, value will hold a string \"ok\". You can provide extra storage-specific settings such as access rights using the `options` object. \n\nIf you want to create a public bucket add a key `public` to the options object and set its value to `true`. \n\nBy default a bucket is private and has no versioning.\n\nFails if the bucket already exists. This is done because bucket names must be globally unique so if the bucket already exists it might have been created by someone else and may therefor not be accessible for you.\n\n>[!NOTE]\n> Setting `public` to true equals `access='blob'` in Azure Blob Storage; if you want to set your bucket to another access level you add it to the options object: \n> ```typescript\n> // set custom access level\n> createBucket(\"test\", {access: \"container\"});\n>```\n\n>[!NOTE]\n> Cloudflare R2 and the S3 API of Backblaze don't support creating a public bucket; please use the web console of these services to make your bucket public. \n\n>[!NOTE]\n>Cloudflare R2 only supports public buckets if you add a custom domain to your bucket, see [the documentation](https://developers.cloudflare.com/r2/buckets/public-buckets/#managed-public-buckets-through-r2dev) on the Cloudflare site. You can add a custom domain to your bucket in the Cloudflare Console.\n\n>[!NOTE]\n> Cubbit allows you to create a public bucket but if you want the files stored in the bucket to be public as well you need to add `{ACL: \"public-read\"}` or `{ACL: \"public-read-write\"}` to the options object of `addFileFromPath`, `addFileFromBuffer` and `addFileFromStream` as well:\n>```typescript\n> addFileFromPath({\n>   bucketName: \"test\",\n>   origPath: \"path/to/your/file.ext\",\n>   targetPath: \"new-name.ext\",\n>   options: {\n>     ACL: \"public-read\",\n>   }\n>});\n>```\n> Note that adding `{ACL: \"public-read\"}` or `{ACL: \"public-read-write\"}` also makes files in a private bucket publicly accessible!\n\n\nIf the bucket was created successfully the `value` key will hold the string \"ok\". \n\nIf you wanted to create a public bucket and the bucket couldn't be made public because Backblaze with S3 API and Cloudflare R2 don't support it, `value` will hold `Bucket ${bucketName} created successfully but you can only make this bucket public using the ${provider} web console`.\n\nIf the bucket exists or if creating the bucket fails for another reason the `error` key will hold the error message.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n> [!NOTE] \n> dependent on the type of storage and the credentials used, you may need extra access rights for this action. E.g.: sometimes a user may only access the contents of one single bucket and has no rights to create a new bucket. Additionally you may not have the rights to create a public bucket.\n\n<hr>\n\n### clearBucket\n\n```typescript\nclearBucket(bucketName?: string): Promise<ResultObject>;\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nRemoves all files in the bucket. If the call succeeds the `value` key will hold the string \"ok\". Backblaze B2 uses by default a form of versioning which can't be turned off, `clearBucket` automatically removes all existing versions of the file.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n> Note: dependent on the type of storage and the credentials used, you may need extra access rights for this action.\n\n<hr>\n\n### deleteBucket\n\n```typescript\ndeleteBucket(bucketName?: string): Promise<ResultObject>;\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nDeletes the bucket and all files in it. If the call succeeds the `value` key will hold the string \"ok\". If the deleted bucket was the selected bucket, selected bucket will be set to `null`.\n\nDoes not fail if the bucket doesn't exist.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\n> Note: dependent on the type of storage and the credentials used, you may need extra access rights for this action.\n\n<hr>\n\n### addFile\n\n```typescript\naddFile(params: FilePathParams | FileStreamParams | FileBufferParams): Promise<ResultObject>;\n```\n\nA generic method that is called under the hood when you call `addFileFromPath`, `addFileFromStream` or `addFileFromBuffer`. It adds a file to a bucket and accepts the file in 3 different ways; as a path, a stream or a buffer, dependent on the type of `params`.\n\nThere is no difference between using this method or one of the 3 specific methods. For details about the `params` object and the return value see the documentation below.\n\n<hr>\n\n### addFileFromPath\n\n```typescript\naddFileFromPath(params: FilePathParams): Promise<ResultObject>;\n```\n\nparam type:\n\n```typescript\nexport type FilePathParams = {\n  bucketName?: string;\n  origPath: string;\n  targetPath: string;\n  options?: {\n    [id: string]: any;\n    checkIfBucketExists: boolean;\n    ACL?: string; // for Cubbit S3\n  };\n};\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nCopies a file from a local path `origPath` to the provided path `targetPath` in the storage. The value for `targetPath` needs to include at least a file name. You can provide extra storage-specific settings such as access rights using the `options` object.\n\nBy setting `checkIfBucketExists` to `false` you can skip the bucket check. This is useful when you have limited the access rights to the bucket.\n\nThe key `bucketName` is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will hold `\"no bucket selected\"`.\n\nIf the call is successful `value` will hold the string \"ok\".\n\n>[!NOTE]\n> For Cubbit: if you want the files stored in a public bucket to be public as well you need to add `{ACL: \"public-read\"}` or `{ACL: \"public-read-write\"}` to the options object.\n\n<hr>\n\n### addFileFromBuffer\n\n```typescript\naddFileFromBuffer(params: FileBufferParams): Promise<ResultObject>;\n```\n\nparam type:\n\n```typescript\nexport type FileBufferParams = {\n  bucketName?: string;\n  buffer: Buffer;\n  targetPath: string;\n  options?: {\n    [id: string]: any;\n    checkIfBucketExists: boolean;\n    ACL?: string; // for Cubbit S3\n  };\n};\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nCopies a buffer to a file in the storage. The value for `targetPath` needs to include at least a file name. You can provide extra storage-specific settings such as access rights using the `options` object.\n\nBy setting `checkIfBucketExists` to `false` you can skip the bucket check. This is useful when you have limited the access rights to the bucket.\n\nThe key `bucketName` is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will hold `\"no bucket selected\"`.\n\nIf the call is successful `value` will hold the string \"ok\".\n\nThis method is particularly handy when you want to move uploaded files directly to the storage, for instance when you use Express.Multer with [MemoryStorage](https://github.com/expressjs/multer#memorystorage).\n\n>[!NOTE]\n> For Cubbit: if you want the files stored in a public bucket to be public as well you need to add `{ACL: \"public-read\"}` or `{ACL: \"public-read-write\"}` to the options object.\n\n<hr>\n\n### addFileFromStream\n\n```typescript\naddFileFromStream(params: FileStreamParams): Promise<ResultObject>;\n```\n\nparam type:\n\n```typescript\nexport type FileStreamParams = {\n  bucketName?: string;\n  stream: Readable;\n  targetPath: string;\n  options?: {\n    [id: string]: any;\n    checkIfBucketExists: boolean;\n    ACL?: string // for Cubbit S3\n  };\n};\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: string | null;\n  error: string | null;\n}\n```\n\nAllows you to stream a file directly to the storage. The value for `targetPath` needs to include at least a file name. You can provide extra storage-specific settings such as access rights using the `options` object.\n\nBy setting `checkIfBucketExists` to `false` you can skip the bucket check. This is useful when you have limited the access rights to the bucket.\n\nThe key `bucketName` is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nIf the call is successful `value` will hold the string \"ok\".\n\nThis method is particularly handy when you want to store files while they are being processed; for instance if a user has uploaded a full-size image and you want to store resized versions of this image in the storage; you can pipe the output stream of the resizing process directly to the storage.\n\n\n>[!NOTE]\n> For Cubbit: if you want the files stored in a public bucket to be public as well you need to add `{ACL: \"public-read\"}` or `{ACL: \"public-read-write\"}` to the options object.\n\n<hr>\n\n### getPresignedUploadURL\n\n```typescript\ngetPresignedUploadURL(  \n  [bucketName: string, fileName: string, options?: Options] |\n  [fileName: string, options?: Options]\n): Promise<ResultObjectObject>;\n```\nOptions:\n\n```typescript\ntype Options = {\n  expiresIn?: number,\n  [id: string]: any,\n}\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  value: { url: string, [id: string]: any, } | null;\n  error: string | null;\n}\n```\n\nReturns a presigned upload URL that you can use to upload a file without having to log in to the cloud storage service.\n\nThe key `bucketName` is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nThe way presigned upload URLs are implemented in the various cloud storage services differs a lot. Below code examples for the supported services:\n\n#### Amazon S3, Backblaze S3, Cloudflare R2, Cubbit and MinIO S3\n\n```typescript\nconst r = await storage.getPresignedUploadURL(\"the-bucket\", \"test.jpg\", {\n  expiresIn: 3600, // seconds, default 300\n  conditions: [\n    [\"starts-with\", \"$key\", fileName], // only upload if the name of the uploaded file matches\n    [\"content-length-range\", 1, 25 * 1024 * 1024], // limit upload to 25MB\n    [\"starts-with\", \"$Content-Type\", \"image/\"], // only allow images\n    { \"x-amz-server-side-encryption\": \"AES256\" },\n    { \"acl\": \"private\" }, // if using ACLs\n    [\"starts-with\", \"$x-amz-meta-user\", \"\"], // force certain metadata fields\n  ],\n  fields: [\n    \"x-amz-server-side-encryption\": \"AES256\",\n    acl: \"bucket-owner-full-control\",\n  ] \n});\n\n// Process the result in Node 18+ using Node native fetch and FormData:\n\nconst {value: {url, fields}} = r;\nconst form = new FormData();\nconst fileBuffer = fs.readFileSync(\"./tests/data/image1.jpg\");\n\nObject.entries((r.value as any).fields).forEach(([field, value]) => {\n    form.append(field, value as string);\n});\nform.append(\"file\", new Blob([fileBuffer]), fileName);\n\nresponse = await fetch(url, {\n    method: 'POST',\n    body: form,\n});\n\n```\n\n#### Azure Blob\n\n```typescript\nconst r = await storage.getPresignedUploadURL(\"the-bucket\", \"test.jpg\", {\n  expiresIn: 3600, // seconds, default 300\n  startsAt: -60, // seconds, default -60\n  permissions: {\n    add: true,\n    create: true,\n    write: true,\n  }\n});\n\n// Process the result in Node 18+ using Node native fetch PUT:\n\nconst {value: {url}} = r;\nconst fileBuffer = fs.readFileSync(\"./tests/data/image1.jpg\");\n\nresponse = await fetch(url, {\n    method: 'PUT',\n    body: fileBuffer,\n    headers: {\n        'x-ms-blob-type': 'BlockBlob',\n    }\n});\n\n```\n\n#### Backblaze B2 (native API)\n\n```typescript\nconst r = await storage.getPresignedUploadURL(\"the-bucket\");\n\n// Process the result in Node 18+ using Node native fetch POST:\n\nconst {value: {url, authToken}} = r;\nconst fileBuffer = fs.readFileSync(\"./tests/data/image1.jpg\");\n\nresponse = await fetch(url, {\n    method: 'POST',\n    body: fileBuffer,\n    headers: {\n        \"Authorization\": authToken,\n        \"X-Bz-File-Name\": \"test.jpg\", \n        \"Content-Type\": \"image/jpeg\",\n        \"X-Bz-Content-Sha1\": crypto.createHash(\"sha1\").update(fileBuffer).digest(\"hex\"),\n        \"X-Bz-Info-Author\": \"sab-test\" // anything goes\n    }\n});\n\n```\n> [!NOTE] \n> You don't have to specify a filename and there are no options such as `expiresIn` available. The Backblaze B2 upload url is standard valid for 24 hours and this isn't customizable\n\n\n#### Google Cloud Storage\n\n```typescript\nconst r = await storage.getPresignedUploadURL(\"the-bucket\", \"test.jpg\", {\n  expiresIn: 3600,    // seconds, default 300\n  version: \"v4\",    // either \"v2\" or \"v4\", defaults to \"v4\"\n  action: \"write\",  // either \"write\", \"read\", \"delete\" or \"resumable\", defaults to \"write\"\n  contentType: \"application/octet-stream\", // set content type to match your file type or use the default \"application/octet-stream\" that works in any case\n});\n\n// Process the result in Node 18+ using Node native fetch PUT:\n\nconst {value: {url}} = r;\nconst fileBuffer = fs.readFileSync(\"./tests/data/image1.jpg\");\n\nresponse = await fetch(url, {\n    method: 'PUT',\n    body: fileBuffer,\n    headers: {\n        \"Content-Type\": \"application/octet-stream\" // content type must match with the value specified above!\n    }\n});\n```\n\n#### Minio\n\n```typescript\nconst r = await storage.getPresignedUploadURL(\"the-bucket\", \"test.jpg\", {\n  expiresIn: 3600,    // seconds, default 300\n});\n\n// Process the result in Node 18+ using Node native fetch PUT:\n\nconst {value: {url}} = r;\nconst fileBuffer = fs.readFileSync(\"./tests/data/image1.jpg\");\n\nresponse = await fetch(url, {\n    method: 'PUT',\n    body: fileBuffer,\n    headers: {\n        \"Content-Type\": \"application/octet-stream\"\n    }\n});\n```\n\n<hr>\n\n### getPublicURL\n\n```typescript\ngetPublicURL(...args:\n  [bucketName: string, fileName: string, options?: Options] |\n  [fileName: string, options?: Options]\n): Promise<ResultObject>;\n\nparam type:\n\n```typescript\ntype Options {\n  [id: string]: any;\n  noCheck?: boolean;\n  withoutDirectory?: boolean; // only for the local adapter\n}\n```\n\nreturn type:\n\n```typescript\nexport type ResultObject = {\n  value: string | null;\n  error: string | null;\n};\n```\n\nReturns the public url of the file. Returns an error if the bucket is not public. \n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nWith the `noCheck` key in the options object set to `true` you can bypass the check if the bucket is actually public. Using this the method will always return a url. The bypass was put in place because Cubbit and Backblaze S3 don't support checking if a bucket is public using their API; you can only check this using the web console of Cubbit and Backblaze respectively. You should only use this bypass if you are sure the bucket is public otherwise the url returned will be unreachable.\n\nThe Amazon S3 SDK doesn't have a method to retrieve a public url, instead the url is composed of known data using a cloud service specific template:\n- Amazon: `https://${bucket_name}.s3.${region}.amazon.com/${file_name}`\n- Backblaze S3: `https://${bucket_name}.s3.${region}.backblazeb2.com/${file_name}`\n- Cloudflare: N/A, see below\n- Cubbit: `https://${bucket_name}.s3.cubbit.eu/${file_name}`\n- Minio S3: `https://${endpoint}/${bucketName}/${fileName}`\n\nAlthough Cloudflare R2 is a S3 compatible storage, this method cannot return a public url because Cloudflare R2 only supports public buckets if you add a custom domain to your bucket, see [the documentation](https://developers.cloudflare.com/r2/buckets/public-buckets/#managed-public-buckets-through-r2dev) on the Cloudflare site. You can add a custom domain to your bucket in the Cloudflare Console and after that you can simply construct the url of the bucket in your own code. You could enable and use the Public Development URL but that is not meant to be used for production. Alternately, you could use a pre-signed url instead of a public url.\n\nFor the local adapter you can use the key `withoutDirectory` in the options object:\n\n```typescript\nconst s = new Storage({\n  type: Provider.LOCAL,\n  directory: \"./your_working_dir/sub_dir\",\n  bucketName: \"bucketName\",\n});\n\nconst url1 = getPublicURL(\"bucketName\", \"fileName.jpg\");\n// your_working_dir/sub_dir/bucketName/fileName.jpg\n\nconst url2 = getPublicURL(\"bucketName\", \"fileName.jpg\", { withoutDirectory: true });\n// bucketName/fileName.jpg\n```\n\n<hr>\n\n### getSignedURL\n\n```typescript\ngetSignedURL(...args:\n  [bucketName: string, fileName: string, options?: Options] |\n  [fileName: string, options?: Options]\n): Promise<ResultObject>;\n```\n\nparam type:\n\n```typescript\nexport Options {\n  expiresIn: number // number of seconds the url is valid, defaults to a week (604800)\n  [id: string]: any; \n}\n```\n\nreturn type:\n\n```typescript\nexport type ResultObject = {\n  value: string | null;\n  error: string | null;\n};\n```\n\nReturns a signed url of the file. \n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nBecause the local adapter does not support signed urls, this method behaves exactly the same as `getPublicURL` when using the local adapter, see previous section.\n\n> [!NOTE] \n> If you are connected to Azure using the password less option or with a SAS token you get an error: \"Can only generate the SAS when the client is initialized with a shared key credential\"\n> Please use any of the other ways to login to Azure if you want to use this method.\n\n<hr>\n\n### getFileAsStream\n\n```typescript\ngetFileAsStream(...args:\n  [bucketName: string, fileName: string, options?: StreamOptions] |\n  [fileName: string, options?: StreamOptions]\n): Promise<ResultObjectStream>;\n```\n\nparam type:\n\n```typescript\nexport interface StreamOptions extends Options {\n  start?: number;\n  end?: number;\n}\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectStream = {\n  value: Readable | null;\n  error: string | null;\n};\n```\n\nReturns a file in the storage as a readable stream. You can pass in extra options. If you use the keys `start` and/or `end` only the bytes between `start` and `end` of the file will be returned.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nSome examples:\n\n```typescript\ngetFileAsReadable(\"bucket-name\", \"image.png\"); // &rarr; reads whole file\n\ngetFileAsReadable(\"bucket-name\", \"image.png\", {}); // &rarr; reads whole file\n\ngetFileAsReadable(\"bucket-name\", \"image.png\", { start: 0 }); // &rarr; reads whole file\n\ngetFileAsReadable(\"bucket-name\", \"image.png\", { start: 0, end: 1999 }); // &rarr; reads first 2000 bytes\n\ngetFileAsReadable(\"bucket-name\", \"image.png\", { end: 1999 }); // &rarr; reads first 2000 bytes\n\ngetFileAsReadable(\"bucket-name\", \"image.png\", { start: 2000 }); // &rarr; reads file from byte 2000\n```\n\n<hr>\n\n### removeFile\n\n```typescript\nremoveFile(...args:\n  [bucketName: string, fileName: string] |\n  [fileName: string, options?: Options]\n): Promise<ResultObject>;\n```\n\nreturn type:\n\n```typescript\nexport interface ResultObject {\n  error: string | null;\n  value: string | null;\n}\n```\n\nRemoves a file from the bucket. Does not fail if the file doesn't exist.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nIf the bucket can not be found an error will be returned: `No bucket ${bucketname} found`. \n\nIf the call succeeds the `value` key will hold the string \"ok\".\n\nIf the file can not be found `value` will be: `No file ${filename} found in bucket ${bucketname}`. \n\n<hr>\n\n### sizeOf\n\n```typescript\nsizeOf(...args:\n  [bucketName: string, fileName: string] |\n  [fileName: string]\n): Promise<ResultObjectNumber>;\n```\n\nreturn type:\n\n```typescript\nexport type ResultObjectNumber = {\n  error: string | null;\n  value: number | null;\n};\n```\n\nReturns the size of a file.\n\nThe `bucketName` arg is optional; if you don't pass a value the selected bucket will be used. The selected bucket is the bucket that you've passed with the config upon instantiation or that you've set afterwards using `setSelectedBucket`. If no bucket is selected the value of the `error` key in the result object will set to `\"no bucket selected\"`.\n\nIf the call succeeds the `value` key will hold the size of the file.\n\n## Storage API\n\nThe Storage class has two extra method besides all methods of the `IAdapter` interface.\n\n### <a name='getadapter'></a>getAdapter\n\n```typescript\ngetAdapter(): IAdapter;\n\n// also implemented as getter\nconst s = new Storage({type: Provider.S3})\nconst a = s.adapter;\n```\n\nReturns the instance of the Adapter class that this Storage instance is currently using to access a storage service.\n\n<hr>\n\n### <a name='switchadapter'></a>switchAdapter\n\n```typescript\nswitchAdapter(config: string | AdapterConfig): void;\n```\n\nThis method is used to instantiate the right adapter when you create a Storage instance. The method can also be used to switch to another adapter in an existing Storage instance at runtime.\n\nThe config parameter is the same type of object or URL that you use to instantiate a Storage. This method can be handy if your application needs a view on multiple storages.\n\nIf your application needs to copy over files from one storage service to another, say for instance from Google Cloud to Amazon S3, then it is more convenient to create 2 separate Storage instances:\n\n```typescript\nimport { Storage } from \"@tweedegolf/storage-abstraction\"\n\nconst s1 = new Storage({type: \"s3\"});\nconst s2 = new Storage({type: \"gcs\"});\n\ns2.addFile({\n  bucketName: \"bucketOnGoogleCloud\"\n  stream: s1.getFileAsStream(\"bucketOnAmazon\", \"some-image.png\"),\n  targetPath: \"copy-of-some-image.png\",\n})\n\n```\n\n## Adding an adapter\n\nIt is relatively easy to add an adapter for an unsupported cloud service. Note however that many cloud storage services are compatible with Amazon S3 so if that is the case, please check first if the Amazon S3 adapter does the job; it might work right away. However, sometimes even if a storage service is S3 compatible you have to write a separate adapter. For instance: although MinIO is S3 compliant it was necessary to write a separate adapter for MinIO.\n\nIf you want to add an adapter you can choose to make your adapter a class or a function; so if you don't like OOP you can implement your adapter using FP or any other coding style or programming paradigm you like.\n\nYour adapter might have additional dependencies such as a service client library, like for instance the aws-sdk as is used in the Amazon S3 adapter. Add these dependencies to the package.json file in the `./publish/YourAdapter` folder.\n\nYou may want to add your Adapter code to this package, in that case please add your dependencies to the package.json file in the root folder of the Storage Abstraction package as well. Your dependencies will not be added to the Storage Abstraction package when published to npm because only the files in the publish folder are published and there is a stripped version of the package.json file in the `./publish/Storage` folder.\n\nYou may also want to add some tests for your adapter and it would be very much appreciated if you could publish your adapter to npm and add your adapter to this README, see [this table](#adapters).\n\nFollow these steps:\n\n1. Add a new type to the `Provider` enum in `./src/types/general.ts`\n2. Define a configuration object (and a configuration url if you like)\n3. Write your adapter, make sure it implements all API methods\n4. Register your adapter in `./src/adapters.ts`\n5. Publish your adapter on npm.\n6. You may also want to add the newly supported cloud storage provider to the keywords array in the package.json file of the Storage Abstraction storage (note: there 2 package.json file for this package, one in the root folder and another in the publish folder)\n\n### Add your storage type\n\nYou should add the name of the your type to the enum `Provider` in `./src/types/general.ts`. It is not mandatory but may be very handy.\n\n```typescript\n// add your type to the enum\nexport enum Provider {\n  LOCAL = \"local\",\n  GCS = \"gcs\",      // Google Cloud Storage\n  S3 = \"s3\",        // Amazon S3\n  B2 = \"b2\",        // BackBlaze B2\n  AZURE = \"azure\",  // Microsoft Azure Blob\n  MINIO = \"minio\",\n  ...\n  YOUR_PROVIDER = \"your-provider\",\n}\n```\n\n### Define your configuration\n\nA configuration object type should at least contain a key `provider`. To enforce this the Storage class expects the config object to be of type `StorageAdapterConfig`:\n\n```typescript\nexport interface AdapterConfig {\n  bucketName?: string;\n  [id: string]: any; // eslint-disable-line\n}\n\nexport interface StorageAdapterConfig extends AdapterConfig {\n  provider: Provider;\n}\n```\n\nFor your custom configuration object you can either choose to extend `StorageAdapterConfig` or `AdapterConfig`. If you choose the latter you can use your adapter standalone without having to specify a redundant key `provider`, which is why the configuration object of all existing adapters extend `AdapterConfig`.\n\n```typescript\nexport interface YourAdapterConfig extends AdapterConfig {\n  additionalKey: string,\n  ...\n}\n\nconst s = new Storage({\n  provider: Provider.YOUR_PROVIDER, // mandatory for Storage\n  key1: string, // other mandatory or optional key that your adapter need for instantiation\n  key2: string,\n}) // works!\n\nconst a = new YourAdapter({\n  key1: string,\n  key2: string,\n\n}) // works because provider is not mandatory\n```\n\nAlso your configuration URL should at least contain the provider. The name of the provider is used for the protocol part of the URL. Upon instantiation the Storage class checks if a protocol is present on the provided URL.\n\nexample:\n\n```typescript\n// your configuration URL\nconst u = \"your-provider://user:pass@bucket_name?option1=value1&...\";\n```\n\nYou can format the configuration URL completely as you like as long as your adapter has an appropriate function to parse it into the configuration object that your adapter expects. If your url follows the standard URL format you don't need to write a parse function, you can import the `parseUrl` function from `./src/util.ts`.\n\nFor more information about configuration URLs please read [this section](#configuration-url)\n\n### Adapter class\n\nIt is recommended that your adapter class extends `AbstractStorage`. If you look at the [code](https://github.com/tweedegolf/storage-abstraction/blob/master/src/AbstractAdapter.ts) you can see that it implements the complete introspective API. `getServiceClient` returns an `any` value and `getConfig` returns a generic `AdapterConfig` object; you may want to override these methods to make them return your adapter specific types.\n\nNote that all API methods that have and optional `bucketName` arg are implemented as overloaded methods:\n\n- `clearBucket`\n- `deleteBucket`\n- `bucketExists`\n- `bucketIsPublic`\n- `getPublicURL`\n- `getSignedURL`\n- `getFileAsStream`\n- `fileExists`\n- `removeFile`\n- `listFiles`\n- `sizeof`\n\nThe implementation of these methods in the AbstractAdapter handles the overloading part and performs some general checks that apply to all adapters. Then they call the cloud specific protected 'tandem' function that handles the adapter specific logic. The tandem function has the same name with an underscore prefix.\n\nFor instance: the implementation of `clearBucket` in AbstractAdapter checks for a `bucketName` arg and if it is not provided it looks if there is a selected bucket set. It also checks for configuration errors. Then it calls `_clearBucket` which should be implemented in your adapter code to handle your cloud storage specific logic. This saves you a lot of hassle and code in your adapter module.\n\nOne other thing to note is the way `addFileFromPath`, `addFileFromBuffer` and `addFileFromReadable` are implemented; these are all forwarded to the API function `addFile`. This function stores files in the storage using 3 different types of origin; a path, a buffer and a stream. Because these ways of storing have a lot in common they are grouped together in a single method.\n\nIf you look at `addFile` you see that just like the overloaded methods mentioned above, the implementation handles some generic logic and then calls `_addFile` in your adapter code.\n\nThe abstract stub methods need to be implemented and the other `IAdapter` methods can be overridden in the your adapter class if necessary. Note that your adapter should not implement the methods `getAdapter` and `switchAdapter`; these are part of the Storage API.\n\nYou don't necessarily have to extend `AbstractAdapter` but if you choose not to your class should implement the `IAdapter` interface. You'll find some configuration parse functions in the separate file `./src/util.ts` so you can easily import these in your own class if these are useful for you.\n\nYou can use this [template](https://github.com/tweedegolf/storage-abstraction/blob/master/src/template_class.ts) as a starting point for your adapter. The template contains a lot of additional documentation per method.\n\n### Adapter function\n\nThe only requirement for this type of adapter is that your module exports a function `createAdapter` that takes a configuration object or URL as parameter and returns an object that has the shape or type of the interface `IAdapter`.\n\nYou may want to check if you can use some of the utility functions defined in `./src/util.js`. Also there is a [template](https://github.com/tweedegolf/storage-abstraction/blob/master/src/template_functional.ts) file that you can use as a starting point for your module.\n\n### Register your adapter\n\nThe `switchAdapter` method of Storage parses the type from the configuration and then creates the appropriate adapter instance. This is done by a lookup table that maps a storage type to a tuple that contains the name of the adapter and the path to the adapter module:\n\n```typescript\nexport const adapterClasses = {\n  s3: [\"AdapterAmazonS3\", \"@tweedegolf/sab-adapter-amazon-s3\"],\n  your_type: [\"AdapterYourService\", \"@you/sab-adapter-your-service\"],\n  ...\n};\n```\n\nIf `switchAdapter` fails to find the module at the specified path it tries to find it in the source folder by looking for a file that has the same name as your adapter, so in the example above it looks for `./src/AdapterYourService.ts`.\n\nOnce the module is found it will be loaded at runtime using `require()`. An error will be thrown the type is not declared or if the module can not be found.\n\nThe lookup table is defined in `./src/adapters.ts`.\n\n### Adding your adapter code to this package\n\nYou can create your own adapter in a separate repository and publish it from there to npm. You may also want to add your adapter code to this package, to do this follow these steps:\n\n1. Place the adapter in the `./src` folder\n2. Create a file that contains all your types in the `./src/types` folder\n3. Create an index file in the `./src/indexes` folder\n4. Create a folder with the same name as your adapter in the `./publish` folder\n5. Add a package.json and a README.md file to this folder\n6. Add your adapter to the `copy.ts` file in the root folder\n\n## Tests\n\nIf you want to run the tests you have to checkout the repository from github and install all dependencies with `npm install` or `yarn install`. There are tests for all storage types; note that you may need to add your credentials to a `.env` file, see the file `.env.default` and `config_urls.md` for more explanation, or provide credentials in another way. Also it should be noted that some of these tests require that the credentials allow to create, delete and list buckets.\n\nTo run all Jasmine tests consecutively:\n\n```bash\nnpm run test-all\n```\n\nTo run the Jasmine tests per provider you can specify it as commandline argument:\n\n```bash\n# test local disk\nnpm run jasmine local\n\n# test Amazon S3\nnpm run jasmine s3\n\n# test Backblaze B2 S3 API\nnpm run jasmine b2-s3\n\n# and so on\n```\n\nNote that you can specify the provider using the values in the `Provider` enum, see [here](README.md#instantiate-a-storage)\n\n>[!NOTE]\n>For some reason you can't run jasmine with ts-node and the current settings in tsconfig.json. So please don't forget to run `npm run tsc` after you've changed files in the `src` folder or in the `jasmine.ts` file itself. You can also run `npm run watch` to enable compiling on save.\n\nYou can find some additional non-Jasmine tests in the file `tests/test_runs.ts`. Every test is a functions that makes a series of API calls to test certain functionality in isolation. A the bottom of this file you'll find the `run` function where you can comment out the  you don't want to run.\n\nYou can find the API calls in the file `tests/api_calls.ts`. Every API call is declared in a function with the same name as the API method it is calling, some additional functionality like logging and checking the result is added to the function.\n\nYou can select the provider you want to test by passing it as a commandline parameter:\n```bash\nnpm test local\nnpm test s3\nnpm test b2-s3\n```\n\nNote that the test `testPublicBucket` tries to create a public bucket. However creating a public bucket on Cloudflare R2 and on Backblaze B2 when using the S3 adapter is not possible; even if you add `{public: true}` the created bucket  `sab-test-public` will be private.\n\nYou can make the created bucket public using the web console of Cloudflare and Backblaze. You can also create a public bucket `sab-test-public` before you run the test.\n\n## Example application\n\n> [!NOTE]\n> not yet updated to API 2.0!\n\nA simple application that shows how you can use the storage abstraction package can be found in [this repository](https://github.com/tweedegolf/storage-abstraction-example). It uses and Ts.ED and TypeORM and it consists of both a backend and a frontend.\n\n## Questions and requests\n\nPlease let us know if you have any questions and/or request by creating an [issue](https://github.com/tweedegolf/storage-abstraction/issues).\n\n```\n\n```\n","readmeFilename":"README.md"}