{"_id":"@amirrivand/nestjs-file-storage","_rev":"13-492c609c817fbae72e5081bfee965b64","name":"@amirrivand/nestjs-file-storage","dist-tags":{"latest":"1.1.2"},"versions":{"1.0.0":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.0","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.0","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"054d921a065bb3a4379811f27e71766b8b2c1a26","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.0.tgz","fileCount":120,"integrity":"sha512-TiLlgUW4BNVXZoaxwfmfmlE02YwcHjWL3vjGpGRyay/3+BXeHapubunyZjj/YrpomCIBykZqIy40cLWeLOjv3Q==","signatures":[{"sig":"MEUCIQCJ6hNSQB+KCfuafX75pkxS3/i73FZIFlJejbNXw9X95AIgBkUUWTPJHHCeIFTucN7mxoGEqfHrxpHooXUEZSy5JNA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":694489},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"59349193080a07fc900bf46a3a697ba765cdb983","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS, inspired by Laravel Flysystem.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.0_1753127042207_0.5279518914494064","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.1","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.1","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"830a61247490f9c24e105f19bc5e9e9ff2d1d434","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.1.tgz","fileCount":120,"integrity":"sha512-fLde/j/inBRNGCV1Y7LowVxPBhRuLJeoRqIVscsjXJIU0tPcOyq3ZZ1QbFctGOxoWYFT/HbG2/r9YSr47j8xHg==","signatures":[{"sig":"MEUCIQDvvW535xI6wLto2Zmq9XLcT1AmO/62mHi0lKj791/ZDwIgGcQxD3gGyDe+QReiCQ2NP3k/d+8WC8ccHq24e5wq7YY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":694762},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"b1cccd1f2fe5c68ab4853b824ceda0ac30943397","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS, inspired by Laravel Flysystem.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.1_1753127301131_0.24143477082053377","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.2","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.2","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"e47afda24091f7cdb46326db4f99855bc0cf7119","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.2.tgz","fileCount":120,"integrity":"sha512-nAK8ZVuxBdT+hL53rc6gP2twx+0K0JE3bbaXBMV8CHs2Bue/ZWCUz6yQ7bNkuLLP2dKYg1txL+f7CYU7TqtDwA==","signatures":[{"sig":"MEQCIB1AQ+iQMB4kLvBf4A3H67Q+2Gpiu/resRfHxN81Ckq4AiBf1tawyntzwyw19UfaDyswP6UUFhybeDWzg7FbI9Tqpg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":694954},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"2cad480d012966320339b8fa773afb9c71d906d0","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS, inspired by Laravel Flysystem.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.2_1753141244117_0.01465281697572185","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.3","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.3","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"3020ab79acbe91108820dddad80b66485c872bc9","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.3.tgz","fileCount":123,"integrity":"sha512-LUBtq7Dn9MKzLG/4OCfgAFT5rzAtwIaGjzSvRxPT/sp6kIVJ++Py2FPrdl0lDyOZKlDHQ0guxbWTXSPxoY5YKA==","signatures":[{"sig":"MEUCIQDTAJyFpg+qdD9vx0snd0If7KNZ6ZoH9YVts33LjU8oJwIgdqBsWZXtf2k4Gmuz134XSu9Tb6VAbzseCdhrsSefDMw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":716874},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"ed7b25b8162e5aad29ff4926a54acce8472d2459","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS, inspired by Laravel Flysystem.","directories":{},"_nodeVersion":"22.17.0","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.3_1753143098686_0.3239778822526014","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.4","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.4","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"1c13bbc7caa700b5cedf3d737a2682df24ec536b","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.4.tgz","fileCount":130,"integrity":"sha512-FTOjPOq/pqESs9tFqcbVdEdZS7gx+75K/4HDVAh4iMsuPVCqFXyV1EV8rcj7x35tCnWtQeBOKQKZlLTcu5n5ag==","signatures":[{"sig":"MEQCIGqPms707NJCPAvUBXDI/cF0xGcIPrKISLD5AJfMGLDcAiAY++NN57UunIczchrT1nqkWcC2PWAckfab1PYVG7B3vQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1155676},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"0733215fd5926b601530edf0d4f54aea5b2d13e0","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.13.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.4_1753198964680_0.9626509811411426","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.5","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.5","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"ef75fe554048e591ffe4916527bd86307be804a3","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.5.tgz","fileCount":123,"integrity":"sha512-7iGBBOWYcxx76HsOFh7YSm60URet+wewAFbzyz0iukYfS22eKXhK+iHmVv9AUmiBJb1Vu8+ED0GbeVgtWtGl+Q==","signatures":[{"sig":"MEYCIQDvkKPhuBqNuwbDBE6szLskG/Oua2h9gbjadctCbOtl8QIhAOUiGzKplM8zhp+x4VH8npLk3nD11xWAIng2gZ7nz9rt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":718360},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"bf2bab5711b491b95f145158c6bc962c974ed55b","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.5_1755090544282_0.7089903295905475","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.6","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.6","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"bf1262b8e13c37cfd57ed33617e8c7044fd74da7","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.6.tgz","fileCount":123,"integrity":"sha512-Dqjyrs3+5xxGjQPgaHNskNtsfvyUHifMzIuVk+3MkO/9PIsXagEW9ujo8mAaAAp8WI7R3D9jfOODpCfgGahRzA==","signatures":[{"sig":"MEQCICgEp2EiehCzpvzBsu0zVwnk55kc1qk3IiC61wfls7ZNAiBPbK/CEp7oEh8K6fZO+8rGGsGT3xyprz0/P/NpoChx0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":723607},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"c4e33d87a7559bf175bd6ab681a43a4c209110bd","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.6_1755095064597_0.5887586289474429","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.8","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.8","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"17854d78e2d954bf68274c81b7cdf5347e604589","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.8.tgz","fileCount":123,"integrity":"sha512-aAXPBd5EDSmTsfBSZo2U004M9Y5CpCiSp9eCBWTg0V2ucwzgs9ll7znn9QqSX1F2uV+m4ypT38obcwMQeif57g==","signatures":[{"sig":"MEQCIEju2aHIZppo3codBs05h4iE81Iuc+Pk1H0SkyvKYEWQAiAyrlPTnBju4Fu5NcBlmqWkt07pf0yLapjP7HagUcv0HA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725706},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"e1ef04d84532894921930db98cfc7740b222fabb","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.8_1755101683164_0.9432006670097528","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.9","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.9","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"07ced2873bc94cd8b2b71b994e7a26da7dde647c","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.9.tgz","fileCount":123,"integrity":"sha512-+qDTWESXEI0V+/HZJJDKfm52Qt5cT7oYPUbNljiUpNOhGHiWGpKpgTjFFsnWKROuH5l+G+NoEfmGvCxp/vUjrQ==","signatures":[{"sig":"MEQCIH3HNbAsV8gUgbUim1y6NUM34Y5kEqlvQV7yNAYfOe2tAiBm0ILtutHDTHeqsDd19yXBlZ5Ti4Z1D1dqmULiYZaHmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725815},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"f529046f9798f41e10d038c886dc95fda387c5d3","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.9_1755530629266_0.2410286566593267","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@amirrivand/nestjs-file-storage","version":"1.0.10","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.0.10","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"9e8072fcf1401b281d08ae036d02dd54bc907c1d","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.0.10.tgz","fileCount":123,"integrity":"sha512-0/rMfFOdzq++kBQ5s+XVlIy3mppzsUq/ADZIMzSmX1v0ks2jgnxnwmsYTU0QXJM9WO5nWSqrqA/EoPF6o+VYWw==","signatures":[{"sig":"MEQCIC1hWqJLcXXaO63przoeczcn9Pn2C85IbKrIXXrjYB17AiAtXfOoI+c/OIll9sPTyEDvM2AGbYsKuRC8JIgRuSY8pQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":726282},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"aaa31ff653f12f499b2bafc5a631ce6014fd0077","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.0.10_1755533417736_0.4237595498355302","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@amirrivand/nestjs-file-storage","version":"1.1.0","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.1.0","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"9be77b8b2a20bcfd8cc7b31986350b8d113ad01f","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.1.0.tgz","fileCount":123,"integrity":"sha512-4MpLq+d5HtWnJjyNyU3CB+3pwzy67yQ5aTo+JB0QPorm5QRcFthJ3chtG+j76xd4KzJX4V1V6TplsMYvAGnGMw==","signatures":[{"sig":"MEYCIQDNl78Ro/KnhVC1RcaK2KFI1pJOooFEGNFMSbqL68fcGgIhALlusO5eRnxjWq739WsKVQ0aQrW+YTfu7h/TZ669RbiJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":731225},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"gitHead":"1a8120622da7861a721bb54d548bc8c53a34cb67","scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"git+https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"_npmVersion":"10.9.2","description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"_nodeVersion":"22.17.1","dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.1.0_1759144722325_0.7112135349993998","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@amirrivand/nestjs-file-storage","version":"1.1.1","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","_id":"@amirrivand/nestjs-file-storage@1.1.1","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"dist":{"shasum":"0a4ec4a78c57d8743f6cf5d22a500d063b5d5602","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.1.1.tgz","fileCount":141,"integrity":"sha512-SxvOlJkRdqpjRlYUptDOrlxIK1f9vaQLFkOCzn2MyIHch3cK1R8hiPX+OHwjyyyM75KPuJW+u8pBhcz/xdCUCA==","signatures":[{"sig":"MEUCIGk3lVGydgPfM4MHCWTRtV03cyYK+6oDNSZhMFNAufqfAiEAtpvmDAGClgo7COmblfUqSJk/3svC2XlOEuh3lr7tjeA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":732162},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"npm":">=7.0.0","node":">=16.0.0"},"scripts":{"test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"repository":{"url":"https://github.com/amirrivand/NestJs-File-Storage.git","type":"git"},"description":"A powerful, multi-driver file storage solution for NestJS.","directories":{},"dependencies":{"rxjs":"^7.8.2","multer":"^2.0.2","dropbox":"^10.34.0","basic-ftp":"^5.0.5","googleapis":"^153.0.0","node-fetch":"^3.3.2","@nestjs/core":"^11.1.5","@nestjs/common":"^11.1.5","@nestjs/swagger":"^11.2.0","class-validator":"^0.14.2","ssh2-sftp-client":"^12.0.1","@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","devDependencies":{"jest":"^30.0.4","eslint":"^9.31.0","ts-jest":"^29.4.0","prettier":"^3.6.2","typescript":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.15","@types/multer":"^2.0.0","@types/express":"^5.0.3","@nestjs/testing":"^11.1.5","reflect-metadata":"^0.2.2","@types/node-fetch":"^2.6.12","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/parser":"^8.37.0","@typescript-eslint/eslint-plugin":"^8.37.0"},"peerDependencies":{"rxjs":"^7.8.1","@nestjs/core":"^9.0.0 || ^10.0.0","@nestjs/common":"^9.0.0 || ^10.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-file-storage_1.1.1_1760449494934_0.9284833786049138","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@amirrivand/nestjs-file-storage","version":"1.1.2","description":"A powerful, multi-driver file storage solution for NestJS.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","prepublishOnly":"npm run build","test":"jest"},"peerDependencies":{"@nestjs/common":"^9.0.0 || ^10.0.0","@nestjs/core":"^9.0.0 || ^10.0.0","rxjs":"^7.8.1"},"dependencies":{"@aws-sdk/client-s3":"^3.848.0","@aws-sdk/s3-request-presigner":"^3.848.0","@nestjs/common":"^11.1.5","@nestjs/core":"^11.1.5","@nestjs/swagger":"^11.2.0","basic-ftp":"^5.0.5","class-validator":"^0.14.2","dropbox":"^10.34.0","googleapis":"^153.0.0","multer":"^2.0.2","node-fetch":"^3.3.2","rxjs":"^7.8.2","ssh2-sftp-client":"^12.0.1"},"devDependencies":{"@nestjs/testing":"^11.1.5","@types/express":"^5.0.3","@types/jest":"^30.0.0","@types/multer":"^2.0.0","@types/node":"^24.0.15","@types/node-fetch":"^2.6.12","@types/ssh2-sftp-client":"^9.0.5","@typescript-eslint/eslint-plugin":"^8.37.0","@typescript-eslint/parser":"^8.37.0","eslint":"^9.31.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.3","jest":"^30.0.4","prettier":"^3.6.2","reflect-metadata":"^0.2.2","ts-jest":"^29.4.0","typescript":"^5.0.0"},"keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","repository":{"type":"git","url":"https://github.com/amirrivand/NestJs-File-Storage.git"},"homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"engines":{"node":">=16.0.0","npm":">=7.0.0"},"publishConfig":{"access":"public"},"packageManager":"yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610","_id":"@amirrivand/nestjs-file-storage@1.1.2","dist":{"shasum":"10bc88ae5e8a1e362f7b0825dd6e49281dd9e0bd","integrity":"sha512-KZvb3Bh7cT/NAFbMhOiMSkUx8CM1+8ef08ak7FG23kZP25NHURVX6ScI6Hl/U4p9UWo4p/s3lGDYwJj1Vh2t8w==","tarball":"https://registry.npmjs.org/@amirrivand/nestjs-file-storage/-/nestjs-file-storage-1.1.2.tgz","fileCount":141,"unpackedSize":732115,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCKb09pWJRx8UZvAV8aZd91CUIQCSB1ROw9ThyPOgICbQIgWxdnfsDD1E8vApgLTAbvEjs3WY/8GjVlhOlfOVJdsEQ="}]},"_npmUser":{"name":"rivand","email":"a_rivand@yahoo.com"},"directories":{},"maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-file-storage_1.1.2_1760774411468_0.257147116570974"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-21T19:44:02.129Z","modified":"2025-10-18T08:00:11.941Z","1.0.0":"2025-07-21T19:44:02.458Z","1.0.1":"2025-07-21T19:48:21.371Z","1.0.2":"2025-07-21T23:40:44.354Z","1.0.3":"2025-07-22T00:11:38.954Z","1.0.4":"2025-07-22T15:42:44.898Z","1.0.5":"2025-08-13T13:09:04.520Z","1.0.6":"2025-08-13T14:24:24.849Z","1.0.8":"2025-08-13T16:14:43.387Z","1.0.9":"2025-08-18T15:23:49.547Z","1.0.10":"2025-08-18T16:10:18.008Z","1.1.0":"2025-09-29T11:18:42.569Z","1.1.1":"2025-10-14T13:44:55.149Z","1.1.2":"2025-10-18T08:00:11.716Z"},"bugs":{"url":"https://github.com/amirrivand/NestJs-File-Storage/issues"},"author":{"name":"Amir Mohammad Rivand","email":"a_rivand@yahoo.com"},"license":"MIT","homepage":"https://github.com/amirrivand/NestJs-File-Storage#readme","keywords":["nestjs","file-storage","s3","ftp","dropbox","google-drive","upload","laravel","flysystem"],"repository":{"type":"git","url":"https://github.com/amirrivand/NestJs-File-Storage.git"},"description":"A powerful, multi-driver file storage solution for NestJS.","maintainers":[{"name":"rivand","email":"a_rivand@yahoo.com"}],"readme":"# @amirrivand/nestjs-file-storage\n\n> **A powerful, multi-driver file storage solution for NestJS, inspired by Laravel Flysystem.**\n\n[![npm version](https://img.shields.io/npm/v/@amirrivand/nestjs-file-storage.svg?style=flat-square)](https://www.npmjs.com/package/@amirrivand/nestjs-file-storage)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![NestJS](https://img.shields.io/badge/nestjs-ready-brightgreen.svg)](https://nestjs.com/)\n\n---\n\n## 🚀 Features\n\n- **Multi-driver**: Local, S3, FTP, SFTP, Dropbox, Google Drive, Buffer (in-memory)\n- **Unified API**: Consistent, extensible, and type-safe\n- **Advanced Operations**: Upload, download, streaming, metadata, visibility, URLs, temp URLs, prepend/append, copy/move\n- **Stream Support**: Upload files directly from streams with `putStream` method\n- **Timed/Expiring Files**: Upload files with automatic expiration using `putTimed` and `deleteExpiredFiles`\n- **Scoped & Read-Only Disks**: Restrict access or scope to subfolders\n- **NestJS-Native**: Decorators, pipes, guards, interceptors, DTOs, async module registration\n- **Internal Upload Solution**: Seamless file handling in controllers\n- **Validation**: File type, size, and multi-file validation pipes\n- **Async/Dynamic Disks**: Register disks at runtime from config/db\n- **Flexible Filename Generation**: Global and per-upload filename generator support\n- **Visibility Management**: Set and get file visibility (public/private) across drivers\n\n---\n\n## 📦 Installation\n\n```sh\npnpm add @amirrivand/nestjs-file-storage\n```\n\n---\n\n## ☁️ Cloud Storage Preparation\n\n<details>\n<summary><strong>Google Drive Preparation</strong></summary>\n\n1. Go to the [Google Cloud Console](https://console.cloud.google.com/).\n2. Create a new project (or select an existing one).\n3. Navigate to <strong>APIs & Services &rarr; Library</strong> and enable the <strong>Google Drive API</strong>.\n4. Go to <strong>APIs & Services &rarr; Credentials</strong>.\n5. Click <strong>Create Credentials</strong> &rarr; <strong>OAuth client ID</strong> or <strong>Service account</strong> (recommended for server-side):\n   - For <strong>Service account</strong>:\n     - Create a new service account and download the JSON key file.\n     - Share the target Google Drive folder with the service account email.\n   - For <strong>OAuth client ID</strong>:\n     - Set up consent screen and download the client ID/secret.\n6. Store the credentials securely and provide them in your disk config (see below).\n7. (Optional) Set folder permissions as needed for your use case.\n\n</details>\n\n<details>\n<summary><strong>Dropbox Preparation</strong></summary>\n\n1. Go to the [Dropbox App Console](https://www.dropbox.com/developers/apps).\n2. Click <strong>Create App</strong>.\n3. Choose <strong>Scoped access</strong> and select <strong>Full dropbox</strong> or <strong>App folder</strong> access as needed.\n4. Name your app and create it.\n5. Under <strong>Permissions</strong>, enable the required scopes (e.g., files.content.write, files.content.read).\n6. Go to <strong>Settings</strong> and generate an <strong>Access Token</strong> (for development) or set up OAuth 2.0 for production.\n7. Copy the <strong>App key</strong>, <strong>App secret</strong>, and <strong>Access token</strong> as needed for your disk config.\n8. (Optional) Set up webhook or additional permissions as required.\n\n</details>\n\n---\n\n## 📚 Table of Contents\n\n- [Quick Start](#-quick-start)\n- [Configuration](#-configuration)\n- [Async Module Registration](#-async-module-registration)\n- [Usage Examples](#-usage-examples)\n- [Filename Generation](#-filename-generation)\n- [Stream Support](#-stream-support)\n- [Injecting a Specific Disk](#-injecting-a-specific-disk)\n- [Advanced Patterns](#-advanced-patterns)\n- [NestJS Integration](#-nestjs-integration)\n- [Drivers](#-drivers)\n- [Validation](#-validation)\n- [Temporary/Signed URLs](#-temporarysigned-urls)\n- [Timed/Expiring Uploads](#-timedexpiring-uploads)\n- [Types](#-types)\n- [License](#-license)\n\n---\n\n## ⚡ Quick Start\n\n```ts\nimport { FileStorageModule } from '@amirrivand/nestjs-file-storage';\n\n@Module({\n  imports: [\n    FileStorageModule.forRoot({\n      default: 'local',\n      disks: {\n        local: { driver: 'local', root: './uploads' },\n        s3: { driver: 's3' /* ... */ },\n        // ...\n      },\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n---\n\n## ⚙️ Configuration\n\n```ts\nimport { FilenameGenerator } from '@amirrivand/nestjs-file-storage';\n\nconst myGlobalFilenameGenerator: FilenameGenerator = (file, context) => {\n  // Example: Add timestamp to filename\n  const ext = file.originalname.split('.').pop();\n  return `${Date.now()}-${file.fieldname}.${ext}`;\n};\n\nFileStorageModule.forRoot({\n  default: 'local',\n  disks: {\n    local: { driver: 'local', root: './uploads' },\n    s3: {\n      driver: 's3',\n      accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n      region: process.env.AWS_REGION,\n      bucket: process.env.AWS_BUCKET,\n      endpoint: process.env.AWS_ENDPOINT,\n      cdnBaseUrl: process.env.AWS_URL,\n    },\n    // ftp, sftp, dropbox, gdrive, ...\n  },\n  filenameGenerator: myGlobalFilenameGenerator, // 👈 Add global filename generator\n});\n```\n\n---\n\n## 📝 Usage Examples\n\n### Single File Upload\n\n```ts\nimport { Controller, Post } from '@nestjs/common';\nimport { UploadFile, UploadedFile, StoredFile } from '@amirrivand/nestjs-file-storage';\n\n@Controller('files')\nexport class FileController {\n  @Post('upload')\n  @UploadFile('file', {\n    disk: 'local',\n    rules: [\n      { type: 'type', allowedMimeTypes: ['image/png'], allowedExtensions: ['png'] },\n    ],\n  })\n  async upload(@UploadedFile() file: StoredFile) {\n    // file.storagePath, file.mimetype, file.size, etc.\n    return file;\n  }\n}\n```\n\n### Multiple File Upload\n\n```ts\nimport { UploadFiles, UploadedFiles, StoredFile } from '@amirrivand/nestjs-file-storage';\n\n@Post('multi-upload')\n@UploadFiles('files', {\n  disk: 's3',\n  rules: [{ type: 'size', maxSize: 5 * 1024 * 1024 }],\n})\nasync uploadMany(@UploadedFiles() files: StoredFile[]) {\n  // files is an array of StoredFile\n  return files;\n}\n```\n\n### File Download/Streaming\n\n```ts\nimport { FileResponse } from '@amirrivand/nestjs-file-storage';\n\n@Get('download/:path')\n@FileResponse('local', ctx => ctx.switchToHttp().getRequest().params.path, true)\nasync download() {}\n```\n\n### Per-upload filenameGenerator (Override)\n\n```ts\nimport { Controller, Post } from '@nestjs/common';\nimport { UploadFile, UploadedFile, StoredFile } from '@amirrivand/nestjs-file-storage';\n\n@Controller('files')\nexport class FileController {\n  @Post('upload-custom')\n  @UploadFile('file', {\n    disk: 'local',\n    filenameGenerator: (file, ctx) => {\n      // Example: Add userId from token to filename\n      const userId = ctx.switchToHttp().getRequest().user?.id ?? 'anon';\n      const ext = file.originalname.split('.').pop();\n      return `${userId}-${Date.now()}.${ext}`;\n    },\n  })\n  async upload(@UploadedFile() file: StoredFile) {\n    return file;\n  }\n}\n```\n\n---\n\n## 🏷️ Filename Generation\n\n### Priority\n\n- If `filenameGenerator` is set in the decorator (per-upload), it will be used.\n- Otherwise, the global `filenameGenerator` from the module config will be used (if set).\n- If neither is set, the default logic is used: the original filename, with a counter if a file with the same name exists.\n\n### API\n\n```ts\ntype FilenameGenerator = (file: Express.Multer.File, context: ExecutionContext) => Promise<string> | string;\n```\n\n- You can set this function globally in the module config as `filenameGenerator`.\n- Or override it per-upload in the decorator options.\n\n---\n\n## 🌊 Stream Support\n\nThe library supports uploading files directly from streams using the `putStream` method. This is useful for handling large files or when you want to avoid loading the entire file into memory.\n\n### Usage\n\n```ts\nimport { FileStorageService } from '@amirrivand/nestjs-file-storage';\nimport { createReadStream } from 'fs';\n\n// Upload from file stream\nconst stream = createReadStream('./large-file.zip');\nawait fileStorageService.putStream('uploads/large-file.zip', stream, {\n  visibility: 'public',\n  ContentType: 'application/zip'\n}, 's3');\n\n// Upload from HTTP request stream\n@Post('upload-stream')\nasync uploadStream(@Req() req: Request) {\n  const stream = req;\n  await fileStorageService.putStream('uploads/from-stream.txt', stream, {\n    visibility: 'private'\n  }, 'local');\n}\n```\n\n### Driver Support\n\n| Driver | Stream Support | Notes |\n|--------|----------------|-------|\n| Local | ✅ | Full support |\n| S3 | ✅ | Full support with AWS SDK |\n| FTP | ⚠️ | Limited support |\n| SFTP | ⚠️ | Limited support |\n| Dropbox | ⚠️ | Limited support |\n| Google Drive | ⚠️ | Limited support |\n| Buffer | ✅ | Full support |\n\nFor drivers with limited stream support, the library automatically falls back to buffering the stream content.\n\n---\n\n## 🧲 Injecting a Specific Disk\n\nYou can inject a specific disk instance directly into your providers or controllers using the `@InjectDisk()` decorator. This is useful when you want to work with a specific disk (e.g., 'local', 's3') and need direct access to the `FileStorageService` for that disk.\n\n```ts\nimport { Controller } from '@nestjs/common';\nimport { StorageDriver } from '@amirrivand/nestjs-file-storage';\nimport { InjectDisk } from '@amirrivand/nestjs-file-storage';\n\n@Controller('files')\nexport class FileController {\n  constructor(\n    @InjectDisk('local')\n    private readonly localDisk: StorageDriver,\n  ) {}\n\n  // ... use this.localDisk.put/get/etc\n}\n```\n\n- The string passed to `@InjectDisk('local')` should match the disk name defined in your `FileStorageModule` configuration.\n- The injected value is the disk's `StorageDriver` (e.g., Local, S3). Use its methods like `put`, `get`, `delete`, etc.\n - If you register the module with `forRootAsync`, you must also list that disk in the module option `injectables` so the provider token is available (see below).\n\n---\n\n## 🔄 Async Module Registration\n\nWhen configuring the module asynchronously, you can expose specific disks for injection via the `injectables` option. This makes tokens like `FILE_STORAGE_DISK_LOCAL` available so `@InjectDisk('local')` works.\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule, ConfigService } from '@nestjs/config';\nimport { FileStorageModule } from '@amirrivand/nestjs-file-storage';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({ isGlobal: true }),\n    FileStorageModule.forRootAsync({\n      isGlobal: true,\n      imports: [ConfigModule],\n      inject: [ConfigService],\n      useFactory: async (config: ConfigService) => ({\n        default: 'local',\n        disks: {\n          local: { driver: 'local', root: config.get<string>('FS_ROOT')! },\n          s3: {\n            driver: 's3',\n            accessKeyId: config.get<string>('AWS_ACCESS_KEY_ID')!,\n            secretAccessKey: config.get<string>('AWS_SECRET_ACCESS_KEY')!,\n            region: config.get<string>('AWS_REGION')!,\n            bucket: config.get<string>('AWS_BUCKET')!,\n          },\n        },\n      }),\n      // List disks you want to inject via @InjectDisk('...')\n      injectables: ['local', 's3'],\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nNotes:\n- `injectables` should list disk keys you plan to inject with `@InjectDisk('...')`.\n- If you don't inject disks, you can omit `injectables` and use `FileStorageService` with `storage.disk('name')`.\n\nType-safety tip:\n- `injectables` is typed from your generic config so disk names are checked at compile time.\n\n---\n\n## 🧩 Advanced Patterns\n\n- **Async Module Registration**: `FileStorageModule.forRootAsync({ ... })`\n- **Scoped Disks**: Restrict a disk to a subfolder\n- **Read-Only Disks**: Enforce read-only access\n- **Custom Drivers**: Easily add your own\n- **Guards & Policies**: Use `FilePermissionGuard` and `@FilePermissionPolicy()`\n- **Validation**: Use `FileTypePipe`, `FileSizePipe`, `MultiFilePipe`\n\n---\n\n## 🛠️ NestJS Integration\n\n- **Decorators**: `@UploadFile`, `@UploadFiles`, `@FileResponse`, `@InjectDisk`\n- **Pipes**: `FileTypePipe`, `FileSizePipe`, `MultiFilePipe`, `FileToDiskPipe`\n- **Guards**: `FilePermissionGuard`\n- **Interceptors**: `FileUploadInterceptor`, `FileStorageInterceptor`\n- **DTOs**: `FileUploadDto`, `FileDownloadDto`\n- **Async Providers**: `createDiskProvider`\n\n### FileToDiskPipe\n\nThe `FileToDiskPipe` allows you to store uploaded files directly to a specific disk using the `FileStorageService`.\n\n```ts\nimport { FileToDiskPipe } from '@amirrivand/nestjs-file-storage';\n\n@Post('upload-to-disk')\nasync uploadFile(\n  @Body('file', new FileToDiskPipe(fileStorageService, 's3', { visibility: 'public' }))\n  storagePath: string\n) {\n  return { message: 'File uploaded', path: storagePath };\n}\n```\n\n### FileStorageInterceptor\n\nThe `FileStorageInterceptor` automatically stores uploaded files and attaches the storage path to the request.\n\n```ts\nimport { FileStorageInterceptor } from '@amirrivand/nestjs-file-storage';\n\n@Post('upload-with-interceptor')\n@UseInterceptors(new FileStorageInterceptor(fileStorageService, 'local'))\nasync uploadWithInterceptor(@Req() req: Request) {\n  // req.file.storagePath contains the storage path\n  return { path: req.file.storagePath };\n}\n```\n\n### Upload options\n\n```ts\ntype FileUploadInterceptorOptions = {\n  fieldName: string; // provided by decorator\n  disk: string; // required\n  isArray?: boolean; // inferred by decorator\n  maxCount?: number; // for arrays\n  rules?: FileValidationRule[]; // validation rules\n  filenameGenerator?: (file: Express.Multer.File, ctx: ExecutionContext) => Promise<string> | string; // per-upload\n  uploadPath?: string | ((file: Express.Multer.File, ctx: ExecutionContext) => string | Promise<string>);\n  visibility?: 'public' | 'private';\n}\n```\n\n- `filenameGenerator`: per-upload override; falls back to global config.\n- `uploadPath`: string or function to compute destination subdirectory.\n- `visibility`: persisted if driver supports it.\n- `maxCount`: cap number of files accepted for arrays.\n\n---\n\n## 🌐 Drivers\n\n- **Local**: File system storage with metadata support\n- **S3**: AWS S3 and S3-compatible services (MinIO, etc.) with object tagging and ACL management\n- **FTP**: Traditional FTP server support\n- **SFTP**: Secure FTP with SSH key authentication\n- **Dropbox**: Cloud storage via Dropbox API\n- **Google Drive**: Google Drive integration with service account authentication\n- **Buffer**: In-memory storage for testing and temporary files\n- **Scoped**: Restrict disk access to specific subdirectories\n- **ReadOnly**: Enforce read-only access to prevent modifications\n\n### S3 Driver Features\n\nThe S3 driver includes advanced features:\n\n- **Object Tagging**: Automatic expiration tags for timed uploads\n- **ACL Management**: Set and get object visibility (public/private)\n- **Signed URLs**: Generate temporary URLs with expiration\n- **Stream Support**: Direct stream uploads without buffering\n- **Metadata**: Full file metadata including size, content type, and last modified\n- **Bulk Operations**: Efficient listing and deletion of files\n\n```ts\n// S3-specific operations\nawait s3Driver.setVisibility('file.txt', 'public');\nconst visibility = await s3Driver.getVisibility('file.txt');\n\n// Object tagging for expiration\nawait s3Driver.putTimed('temp-file.txt', content, { ttl: 3600 });\nawait s3Driver.deleteExpiredFiles(); // Removes all expired files\n```\n\n---\n\n## 🛡️ Validation\n\n- **FileTypePipe**: Restrict by mimetype/extension\n- **FileSizePipe**: Restrict by size\n- **MultiFilePipe**: Validate arrays of files\n- **Flexible FileValidationRule**: Use the `rules` option in upload decorators for advanced validation\n\n### FileValidationRule (rules)\n\nYou can use the `rules` property in upload decorators to define flexible validation logic for uploaded files. Rules can be combined as an array.\n\n#### Type Rule\n```ts\n@UploadFile('file', {\n  disk: 'local',\n  rules: [\n    { type: 'type', allowedMimeTypes: ['image/png', 'image/jpeg'], allowedExtensions: ['png', 'jpg', 'jpeg'] },\n  ],\n})\n```\n\n#### Size Rule\n```ts\n@UploadFile('file', {\n  disk: 'local',\n  rules: [\n    { type: 'size', maxSize: 5 * 1024 * 1024, minSize: 1024 }, // 1KB - 5MB\n  ],\n})\n```\n\n#### Custom Rule\n```ts\n@UploadFile('file', {\n  disk: 'local',\n  rules: [\n    {\n      type: 'custom',\n      validate: async (file) => file.originalname.startsWith('invoice_'),\n      message: 'Filename must start with invoice_.'\n    },\n  ],\n})\n```\n\n**Rule Types:**\n- `type`: Restrict by MIME type and/or file extension\n- `size`: Restrict by file size (min/max, optionally per MIME type)\n- `custom`: Provide any async/sync validation logic\n\nYou can use these rules in both `@UploadFile` and `@UploadFiles` decorators.\n\n---\n\n## 🔗 Temporary/Signed URLs\n\nYou can generate temporary (signed) URLs for files using the `getTemporaryUrl` method on the `FileStorageService` or directly on the driver. This allows you to share a file for a limited time, optionally restricted to a specific IP or device (if supported).\n\n### Usage\n\n```ts\n// Inject FileStorageService\nconst url = await fileStorageService.getTemporaryUrl(\n  'path/to/file.txt',\n  600, // expires in 600 seconds (10 minutes)\n  { ip: '1.2.3.4', deviceId: 'abc123' }, // optional, only for local\n  'local' // disk name (optional, default is default disk)\n);\n```\n\n### Options\n- `expiresIn`: Expiration time in seconds (default: 3600)\n- `ip`: (Optional, only for local) Restrict link to a specific IP\n- `deviceId`: (Optional, only for local) Restrict link to a specific device (must be sent as `x-device-id` header)\n\n### Driver Support\n- **Local**: Supported. Generates a signed URL with a token, validates expiration, IP, and device if provided.\n- **S3**: Supported. Generates a signed URL with expiration. IP/device restriction is NOT supported (throws error if used).\n- **FTP, SFTP, Dropbox, Google Drive**: Not supported. Throws an error if called.\n\n### Example: S3\n```ts\nconst url = await fileStorageService.getTemporaryUrl('myfile.txt', 900, undefined, 's3');\n// url is a signed AWS S3 URL valid for 15 minutes\n```\n\n### Example: Local\n```ts\nconst url = await fileStorageService.getTemporaryUrl('myfile.txt', 600, { ip: '1.2.3.4' }, 'local');\n// url is something like http://localhost:3000/files/temp?token=...\n// You need to implement a route to serve this (see below)\n```\n\n### Serving Local Temp Links\nFor local driver, you must implement an endpoint (e.g., `/files/temp?token=...`) that:\n- Validates the token using `LocalStorageDriver.validateTempToken(token, req)`\n- Streams the file if valid, or returns 404/403 if invalid/expired\n\nExample (NestJS):\n```ts\n@Get('files/temp')\nasync serveTemp(@Query('token') token: string, @Req() req: Request, @Res() res: Response) {\n  const relPath = LocalStorageDriver.validateTempToken(token, req);\n  if (!relPath) return res.status(403).send('Invalid or expired link');\n  const stream = fileStorageService.disk('local').createReadStream(relPath);\n  stream.pipe(res);\n}\n```\n\n---\n\n## ⏳ Timed/Expiring Uploads\n\nYou can upload files with an expiration time using the `putTimed` method. After the specified time, the file will be automatically deleted by calling `deleteExpiredFiles` (which you can schedule as a cron job or call manually).\n\n### Usage\n\n```ts\n// Upload a file that expires in 1 hour\nawait fileStorageService.putTimed(\n  'myfile.txt',\n  buffer,\n  { ttl: 3600 } // or { expiresAt: new Date(Date.now() + 3600 * 1000) }\n);\n\n// Remove all expired files (should be called periodically)\nconst deletedCount = await fileStorageService.deleteExpiredFiles();\n```\n\n### Options\n- `ttl`: Time to live in seconds\n- `expiresAt`: Absolute expiration date/time (Date object)\n- `visibility`: (optional) 'public' or 'private'\n\n### Driver Support Table\n| Driver        | Expiry Metadata Location         | Auto-Delete Support | Notes |\n|--------------|----------------------------------|--------------------|-------|\n| Local        | `.meta.json` sidecar file        | Yes                | Full metadata support |\n| S3           | S3 object tag (`expiresAt`)      | Yes                | Uses AWS object tagging |\n| Buffer       | In-memory metadata               | Yes                | Perfect for testing |\n| FTP          | `.ftp-expirations.json` in root  | Yes                | JSON metadata file |\n| SFTP         | `.sftp-expirations.json` in root | Yes                | JSON metadata file |\n| Dropbox      | `.dropbox-expirations.json`      | Yes                | JSON metadata file |\n| Google Drive | `.gdrive-expirations.json`       | Yes                | JSON metadata file |\n\n### Example: Local\n```ts\nawait fileStorageService.putTimed('foo.txt', Buffer.from('data'), { ttl: 600 }, 'local');\n// ...\nawait fileStorageService.deleteExpiredFiles('local');\n```\n\n### Example: S3\n```ts\nawait fileStorageService.putTimed('foo.txt', Buffer.from('data'), { expiresAt: new Date(Date.now() + 3600 * 1000) }, 's3');\n// ...\nawait fileStorageService.deleteExpiredFiles('s3');\n```\n\n### Example: Buffer (Testing)\n```ts\nawait fileStorageService.putTimed('foo.txt', Buffer.from('data'), { ttl: 60 }, 'buffer');\n// ...\nawait fileStorageService.deleteExpiredFiles('buffer');\n```\n\n### Example: FTP/SFTP/Dropbox/Google Drive\n```ts\nawait fileStorageService.putTimed('foo.txt', Buffer.from('data'), { ttl: 1800 }, 'ftp');\n// ...\nawait fileStorageService.deleteExpiredFiles('ftp');\n```\n\n### Notes\n- For drivers with central metadata files, ensure the application has read/write access to the root directory.\n- You should schedule `deleteExpiredFiles` to run periodically (e.g., with a cron job) to ensure expired files are cleaned up.\n- If you use both `ttl` and `expiresAt`, `expiresAt` takes precedence.\n\n---\n\n## 🏷️ Types\n\n- **StoredFile**: The type returned by `@UploadedFile()` and each item in `@UploadedFiles()`. Extends `Express.Multer.File` with a `storagePath` property.\n- **FilenameGenerator**: `(file: Express.Multer.File, context: ExecutionContext) => Promise<string> | string;`\n\n---\n\n## 📄 License\n\nMIT\n","readmeFilename":"README.md"}