{"_id":"@bonhomie/cloudinary-super-uploader","_rev":"9-e7de0304c160108eef70cf41cecfba68","name":"@bonhomie/cloudinary-super-uploader","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@bonhomie/cloudinary-super-uploader","version":"1.0.0","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop upload","sharp compression","exif","image hashing","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@1.0.0","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"90b2d0f05ca96eddcdd59a2fd8ecc997db293ef3","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-1.0.0.tgz","fileCount":7,"integrity":"sha512-DmcA1Lzu+n2av/BTT8aRdYH2cUYG0bC6AcIg9vpk5fJQ+zx8mJ4T8fkzsdcVdxwEw9kmfl0TyMdw2xy5mOaV9g==","signatures":[{"sig":"MEUCIQCY9wfdigRfHvUph4DUvSJqX+yR1MjmjfKx7202ozghOgIgVWWhlt5Bxw9LSMKuXEuFr6JnnNiN/Jxt9JcNuCznDYM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5455},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./CloudinaryUploader":{"import":"./dist/react/CloudinaryUploader.js","require":"./dist/react/CloudinaryUploader.cjs"},"./useCloudinaryUpload":{"import":"./dist/react/useCloudinaryUpload.js","require":"./dist/react/useCloudinaryUpload.cjs"}},"scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsup src/index.js --dts --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_1.0.0_1764180679726_0.666887838894239","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bonhomie/cloudinary-super-uploader","version":"1.0.1","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop upload","sharp compression","exif","image hashing","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@1.0.1","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"6d5320cdcba1fa8d06b3c30b81f898076596e404","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-1.0.1.tgz","fileCount":7,"integrity":"sha512-rY6OXKfJrfiqx32jdY6/6SJcP+ozs/lNPbU1X/4Vn3EEP2xu2CDlAn2wQhSPScx6SIH5rgLTzbtdetKp+IJ3lg==","signatures":[{"sig":"MEUCIQCsv8lFT/5kWfwT//NnMt7Vz0y3nA3bmyohVPycn6HR4QIgGJR+L7MgCFSgXA3wSVwJSKjhccQQAJg7sCoGS2apU+U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7909},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./CloudinaryUploader":{"import":"./dist/react/CloudinaryUploader.js","require":"./dist/react/CloudinaryUploader.cjs"},"./useCloudinaryUpload":{"import":"./dist/react/useCloudinaryUpload.js","require":"./dist/react/useCloudinaryUpload.cjs"}},"gitHead":"6d8f6f8904b14222c560230c0571407647c83176","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsup src/index.js --dts --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_1.0.1_1764279449959_0.5457376229883297","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bonhomie/cloudinary-super-uploader","version":"1.0.2","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop upload","sharp compression","exif","image hashing","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@1.0.2","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"a2207f9d120460dfc54e1ac18cc12d04895adbc9","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-1.0.2.tgz","fileCount":7,"integrity":"sha512-JmtAv6fpbee8qpSuFQ+03KutqE8efryIZI0Cpw3V/8HZPXqsN3wFoGeHDA8ZzjM9yI343zKmzP99YYd1LjNVNQ==","signatures":[{"sig":"MEQCIBzgpHsmQUWY8Tp/2vU1U0qPgIW5x7cHJfxqKRQdZ2trAiBGn7cfOh479GHkgFjdP2/sZp9kJ7Y+naRuKUy2VMTA6A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7693},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./CloudinaryUploader":{"import":"./dist/react/CloudinaryUploader.js","require":"./dist/react/CloudinaryUploader.cjs"},"./useCloudinaryUpload":{"import":"./dist/react/useCloudinaryUpload.js","require":"./dist/react/useCloudinaryUpload.cjs"}},"gitHead":"6d8f6f8904b14222c560230c0571407647c83176","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsup src/index.js --dts --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_1.0.2_1764279526203_0.26847607489507297","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@bonhomie/cloudinary-super-uploader","version":"1.0.3","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop upload","sharp compression","exif","image hashing","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@1.0.3","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"a2a720cbaed004125e49cf13411475a6bffee9b4","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-1.0.3.tgz","fileCount":7,"integrity":"sha512-TcXqOZFD4t04jPaq8jN7GfTlCeydDSRMnmSDCBwl3kJYd6V8ZzYFqZGLnY+RgE4KrXJ7/Lgey3k0K2lDrp5+3w==","signatures":[{"sig":"MEYCIQDGh3K/56bZGaY927DKUFAKvtA9NNX0LtuCRPmwJJb6/AIhAKnSyTXVFPpcS7nl25fJ9CR9ZzzLD7V0qtlkudT1keO1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8479},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node/getExif":{"import":"./dist/node/getExif.js","require":"./dist/node/getExif.cjs"},"./node/hashSHA256":{"import":"./dist/node/hashSHA256.js","require":"./dist/node/hashSHA256.cjs"},"./node/uploadImage":{"import":"./dist/node/uploadImage.js","require":"./dist/node/uploadImage.cjs"},"./node/uploadImages":{"import":"./dist/node/uploadImages.js","require":"./dist/node/uploadImages.cjs"},"./CloudinaryUploader":{"import":"./dist/react/CloudinaryUploader.js","require":"./dist/react/CloudinaryUploader.cjs"},"./useCloudinaryUpload":{"import":"./dist/react/useCloudinaryUpload.js","require":"./dist/react/useCloudinaryUpload.cjs"},"./node/validateQuality":{"import":"./dist/node/validateQuality.js","require":"./dist/node/validateQuality.cjs"},"./node/compressImageNode":{"import":"./dist/node/compressImageNode.js","require":"./dist/node/compressImageNode.cjs"}},"gitHead":"bd306b3cec3ebcd7acd0f0d8e87ab0a4f931b9bb","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsup src/index.js --dts --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_1.0.3_1764280307225_0.4923985817806418","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@bonhomie/cloudinary-super-uploader","version":"1.0.4","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop upload","sharp compression","exif","image hashing","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@1.0.4","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"5d4f20fb28516ac7f7b1532e6fef2430b3bf14e1","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-1.0.4.tgz","fileCount":11,"integrity":"sha512-Ok5j0CLtylQ3xp50Lj2sEcQv+jnedWbUuuMSf1WCYr9yy9nFRGLb+vCidcVJ949cHeBS/4i4M6PeneyFW/ldbA==","signatures":[{"sig":"MEYCIQCWX9V19n9kom+acxjyI2ijEyDXm+Uqq0kKJ6MNFFt5QgIhAJFsTC6y6GjePrqooFRVUUsHVCQqs0yjCsG3B0YgAR3D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31475},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node/getExif":{"import":"./dist/node/getExif.js","require":"./dist/node/getExif.cjs"},"./node/hashSHA256":{"import":"./dist/node/hashSHA256.js","require":"./dist/node/hashSHA256.cjs"},"./node/uploadImage":{"import":"./dist/node/uploadImage.js","require":"./dist/node/uploadImage.cjs"},"./node/uploadImages":{"import":"./dist/node/uploadImages.js","require":"./dist/node/uploadImages.cjs"},"./CloudinaryUploader":{"import":"./dist/react/CloudinaryUploader.js","require":"./dist/react/CloudinaryUploader.cjs"},"./useCloudinaryUpload":{"import":"./dist/react/useCloudinaryUpload.js","require":"./dist/react/useCloudinaryUpload.cjs"},"./node/validateQuality":{"import":"./dist/node/validateQuality.js","require":"./dist/node/validateQuality.cjs"},"./node/compressImageNode":{"import":"./dist/node/compressImageNode.js","require":"./dist/node/compressImageNode.cjs"}},"gitHead":"c3069eaed32125a2f5fca37bf1935d44f4403cac","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"tsup src/index.js src/node/index.js --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"react":"^19.2.0","sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_1.0.4_1764281954306_0.7091791108174044","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bonhomie/cloudinary-super-uploader","version":"2.0.0","keywords":["cloudinary","cloudinary upload","react uploader","image uploader","drag and drop","sharp","compress","exif","hash","react component","node cloudinary"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@2.0.0","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"b5274a7dbbaadc45c493e4145a4fb7f51b1163b0","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-2.0.0.tgz","fileCount":12,"integrity":"sha512-+4gBBqHffMy1Jd/2DHqCgEz3LBK2p3TQ5nUZ/uXygl8DZxW5aHmW8Z5oikiwazeTw31/zYocLdR5IP7H9NoLAg==","signatures":[{"sig":"MEYCIQDk8RWy6zjqVcTk+tCWlWqbpnAOdTLx45TuV1p7r1pwNAIhAMg2gKzwKhD58b23ps0G39N/552zRMf/QYmSz/mOr0QZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35802},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"import":"./dist/node/index.js","require":"./dist/node/index.cjs"}},"gitHead":"11299b799ac7444e7271335601050b3bc8035a2a","scripts":{"test":"echo \"No tests yet\"","build":"tsup src/index.js src/node/index.js --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_2.0.0_1764310720159_0.9020357585338006","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bonhomie/cloudinary-super-uploader","version":"2.0.1","keywords":["content-protection","content-security","media-security","image-protection","cloud-security","frontend-drm","asset-protection","view-protection","copyguard","screen-guard","screen-protection","image-guard","watermarking","dynamic-watermark","anti-download","anti-save","anti-snoop"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@2.0.1","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"d0a49544dfc9183ac5aa10a41eea3a44aefcc698","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-2.0.1.tgz","fileCount":12,"integrity":"sha512-eWdHA6TlA/e8XJQoC3cxamd9zI+2bTWsXuJ8C6LIzUIcdem0HfMBAmChvqOwV5fiT4EGxjUDpyXn3ISX/51poQ==","signatures":[{"sig":"MEUCIQD3qByFhFd6cbNpcXczhXd9t0wgbsFCtXorX4cGUo4nfgIgJ3dAr4hXhB9CLA2dyoNfUJhNm8jwY2+WVz2z7bcSOpI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35962},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"import":"./dist/node/index.js","require":"./dist/node/index.cjs"}},"gitHead":"7908fd2306ad7fcb209b3e60e2becf3f75e4c148","scripts":{"test":"echo \"No tests yet\"","build":"tsup src/index.js src/node/index.js --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_2.0.1_1764321114466_0.5947597754100149","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bonhomie/cloudinary-super-uploader","version":"2.0.2","keywords":["content-protection","content-security","media-security","image-protection","cloud-security","frontend-drm","asset-protection","view-protection","copyguard","screen-guard","screen-protection","image-guard","watermarking","dynamic-watermark","anti-download","anti-save","anti-snoop"],"author":{"name":"Bonhomie"},"license":"MIT","_id":"@bonhomie/cloudinary-super-uploader@2.0.2","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"dist":{"shasum":"81c36962fdac3b40a4a9c1624d00ef616a45c6f7","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-2.0.2.tgz","fileCount":12,"integrity":"sha512-eDhFmntyfREaZkVfisVv3CpWSjr+j41RLd5nZpalIHftF8Byf8WCb2FKK7JhKuoB8TusfEY+pvXWm7WHFZgZnA==","signatures":[{"sig":"MEUCIQD4z3ncpJPlgfZlSeRuW4nGVUAz468lxaNerHJgoH9iZQIgBSP+M7bOCtStYHmBlaU+abVcQ+1/B9FKocphsVEFEe4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35743},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"import":"./dist/node/index.js","require":"./dist/node/index.cjs"}},"gitHead":"c0c7c4f6214b8ff5063c17e9ab7837035b29cdde","scripts":{"test":"echo \"No tests yet\"","build":"tsup src/index.js src/node/index.js --format esm,cjs --minify","prepublishOnly":"npm run build"},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"_npmVersion":"10.8.0","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"sharp":"^0.34.5","cloudinary":"^2.8.0","image-hash":"^7.0.1","exif-parser":"^0.1.12"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary-super-uploader_2.0.2_1773822975179_0.6926371870781343","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@bonhomie/cloudinary-super-uploader","version":"2.1.0","type":"module","description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","sideEffects":false,"exports":{".":{"import":"./dist/index.js","require":"./dist/index.cjs"},"./node":{"import":"./dist/node/index.js","require":"./dist/node/index.cjs"}},"keywords":["cloudinary","image-upload","react-upload","drag-drop-upload","browser-compression","exif","duplicate-detection","signed-upload","image-toolkit","sharp","cloudinary-sdk","upload-component","react-hooks","file-upload","bonhomie"],"scripts":{"build":"tsup","prepublishOnly":"npm run build","test":"echo \"No tests yet\""},"author":{"name":"Bonhomie"},"license":"MIT","peerDependencies":{"react":">=17.0.0"},"dependencies":{"exif-parser":"^0.1.12"},"optionalDependencies":{"cloudinary":"^2.8.0","image-hash":"^7.0.1","sharp":"^0.34.5"},"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3"},"_id":"@bonhomie/cloudinary-super-uploader@2.1.0","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-MlI8TqqYVvHhHk0wgAWrX0vmOVyCIDGw5bFD1Gvv/WfaNRoR5RP7qMXDQkIOOLEP1aKWfOFr1ydaSuxJV9uqMw==","shasum":"7cbe0b8ae8563f6ccb354287d381f17e8496b778","tarball":"https://registry.npmjs.org/@bonhomie/cloudinary-super-uploader/-/cloudinary-super-uploader-2.1.0.tgz","fileCount":8,"unpackedSize":30453,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGktuMLoZZt/QkprN/0znCqsLcE81e/aPaKqPU4DobcwAiBbZgQIeSWh0eu0LO3yeWHREFiY9tw1yWuUZeEFFoXC/Q=="}]},"_npmUser":{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"},"directories":{},"maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cloudinary-super-uploader_2.1.0_1777495579562_0.7948435676274939"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-26T18:11:19.607Z","modified":"2026-04-29T20:46:19.855Z","1.0.0":"2025-11-26T18:11:19.952Z","1.0.1":"2025-11-27T21:37:30.160Z","1.0.2":"2025-11-27T21:38:46.402Z","1.0.3":"2025-11-27T21:51:47.499Z","1.0.4":"2025-11-27T22:19:14.522Z","2.0.0":"2025-11-28T06:18:40.338Z","2.0.1":"2025-11-28T09:11:54.645Z","2.0.2":"2026-03-18T08:36:15.326Z","2.1.0":"2026-04-29T20:46:19.697Z"},"author":{"name":"Bonhomie"},"license":"MIT","keywords":["cloudinary","image-upload","react-upload","drag-drop-upload","browser-compression","exif","duplicate-detection","signed-upload","image-toolkit","sharp","cloudinary-sdk","upload-component","react-hooks","file-upload","bonhomie"],"description":"A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.","maintainers":[{"name":"bonhomie95","email":"adeyemibabatundejoseph@gmail.com"}],"readme":"# @bonhomie/cloudinary-super-uploader\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/npm/v/@bonhomie/cloudinary-super-uploader?color=blue&label=npm%20version\" />\n  <img src=\"https://img.shields.io/npm/dm/@bonhomie/cloudinary-super-uploader?color=orange&label=downloads\" />\n  <img src=\"https://img.shields.io/bundlephobia/min/@bonhomie/cloudinary-super-uploader?color=yellow&label=minified%20size\" />\n  <img src=\"https://img.shields.io/github/license/bonhomie/cloudinary-super-uploader?color=green&label=license\" />\n</p>\n\n<p align=\"center\">\n  ✨ A complete Cloudinary image upload toolkit for React + Node.<br />\n  Drag & drop uploader, browser compression, EXIF checks, duplicate detection,<br />\n  progress tracking, and backend helpers — all in one package.\n</p>\n\n---\n\n## ✅ Features\n\n### React (Frontend)\n\n- Drag & drop uploader + click-to-upload\n- Live progress bar\n- Thumbnail grid with drag-to-reorder\n- Browser-side compression (canvas)\n- **SHA-256** duplicate detection (deduplicates within the session)\n- EXIF checks — warns on old photos\n- Toast-style inline error messages\n- Works with any upload endpoint (recommended: your Node backend)\n\n### Node.js (Backend)\n\n- Upload single or multiple images to Cloudinary\n- Sharp-based compression with metadata stripping\n- EXIF metadata extraction\n- SHA-256 hashing + perceptual pHash for duplicate detection\n- Quality validation (resolution + EXIF date)\n\n### Browser Utilities\n\n- Canvas-based image compression\n- Browser-side EXIF extraction\n- Minimum dimension validation\n- SHA-256 hash for duplicate detection\n- Thumbnail URL builder using Cloudinary transformations\n\n---\n\n## 📥 Installation\n\n```bash\nnpm install @bonhomie/cloudinary-super-uploader\n# or\nyarn add @bonhomie/cloudinary-super-uploader\n```\n\nThe Node.js backend helpers (`uploadImage`, `compressImageNode`, etc.) depend on `sharp` and `cloudinary`, which are **optional** dependencies. They are only installed when needed and are not bundled into the browser build.\n\n```bash\n# Only needed for the Node.js side:\nnpm install sharp cloudinary image-hash\n```\n\n---\n\n## 🎨 Usage — React Component\n\n```jsx\nimport { CloudinaryUploader } from \"@bonhomie/cloudinary-super-uploader\";\n\nexport default function App() {\n  return (\n    <div style={{ maxWidth: 600, margin: \"40px auto\" }}>\n      <h1>Upload property photos</h1>\n      <CloudinaryUploader\n        uploadUrl=\"/api/upload\"\n        maxWidth={2000}\n        maxHeight={2000}\n        minWidth={600}\n        minHeight={600}\n        maxFiles={10}\n        allowedTypes={[\"image/jpeg\", \"image/png\", \"image/webp\"]}\n        autoCompress={true}\n        maxAgeDays={365}\n      />\n    </div>\n  );\n}\n```\n\nThe component will: validate dimensions, compress large images in-browser, read EXIF + SHA-256 hash, skip duplicates, and POST each file to `uploadUrl` as `file` in `FormData`.\n\nExpected JSON response shape from your backend:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"url\": \"https://res.cloudinary.com/.../image.jpg\",\n    \"publicId\": \"folder/image-id\",\n    \"width\": 1200,\n    \"height\": 800,\n    \"thumbnail\": \"https://res.cloudinary.com/.../c_fill,w_400,h_400/image.jpg\"\n  }\n}\n```\n\n---\n\n## 🪝 Usage — React Hook (Custom UI)\n\n```jsx\nimport { useCloudinaryUpload } from \"@bonhomie/cloudinary-super-uploader\";\n\nexport default function CustomUploader() {\n  const {\n    images,\n    progress,\n    uploading,\n    errors,\n    upload,\n    removeImage,\n    reorderImages,\n  } = useCloudinaryUpload({\n    uploadUrl: \"/api/upload\",\n    maxWidth: 2000,\n    maxHeight: 2000,\n    minWidth: 600,\n    minHeight: 600,\n    maxFiles: 10,\n    maxAgeDays: 365,\n  });\n\n  return (\n    <div>\n      <input type=\"file\" multiple accept=\"image/*\" onChange={(e) => upload(e.target.files)} />\n\n      {uploading && (\n        <div style={{ width: `${progress}%`, height: 4, background: \"blue\" }} />\n      )}\n\n      {errors.map((err, i) => (\n        <p key={i} style={{ color: \"red\" }}>{err}</p>\n      ))}\n\n      <div style={{ display: \"grid\", gridTemplateColumns: \"repeat(4, 1fr)\", gap: 8 }}>\n        {images.map((img) => (\n          <div key={img.publicId} style={{ position: \"relative\" }}>\n            <img src={img.thumbnail || img.url} alt=\"\" />\n            <button onClick={() => removeImage(img.publicId)}>Remove</button>\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n```\n\n---\n\n## 🖥 Usage — Node.js Backend\n\n### Single upload\n\n```js\nimport express from \"express\";\nimport multer from \"multer\";\nimport { uploadImage } from \"@bonhomie/cloudinary-super-uploader/node\";\n\nconst upload = multer({ dest: \"temp/\" });\nconst router = express.Router();\n\nrouter.post(\"/upload\", upload.single(\"file\"), async (req, res) => {\n  const result = await uploadImage(req.file.path, {\n    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,\n    api_key: process.env.CLOUDINARY_API_KEY,\n    api_secret: process.env.CLOUDINARY_API_SECRET,\n    folder: \"uploads\",\n    tags: [\"app-upload\"],\n  });\n  res.json(result);\n});\n```\n\n### Multiple uploads\n\n```js\nimport { uploadImages } from \"@bonhomie/cloudinary-super-uploader/node\";\n\nrouter.post(\"/upload-many\", upload.array(\"files\"), async (req, res) => {\n  const filePaths = req.files.map((f) => f.path);\n  const result = await uploadImages(filePaths, {\n    cloud_name: process.env.CLOUDINARY_CLOUD_NAME,\n    api_key: process.env.CLOUDINARY_API_KEY,\n    api_secret: process.env.CLOUDINARY_API_SECRET,\n    folder: \"multi\",\n  });\n  res.json(result);\n});\n```\n\n### Concurrent multi-account usage\n\nUse `createCloudinaryClient` when handling multiple Cloudinary accounts to avoid race conditions with the global config:\n\n```js\nimport { createCloudinaryClient } from \"@bonhomie/cloudinary-super-uploader/node\";\n\nconst client = createCloudinaryClient({\n  cloud_name: process.env.CLOUDINARY_CLOUD_NAME,\n  api_key: process.env.CLOUDINARY_API_KEY,\n  api_secret: process.env.CLOUDINARY_API_SECRET,\n});\n\nconst result = await client.upload(filePath, { folder: \"secure\" });\n```\n\n---\n\n## 🧰 Browser Utilities\n\n```js\nimport {\n  buildThumbnailUrl,\n  compressImageBrowser,\n  getExifBrowser,\n  hashBrowser,\n  validateDimensions,\n} from \"@bonhomie/cloudinary-super-uploader\";\n\n// Build a Cloudinary thumbnail URL from an existing URL\nconst thumb = buildThumbnailUrl(cloudinaryUrl, { width: 400, height: 400, crop: \"fill\" });\n\n// Validate minimum dimensions\nconst dims = await validateDimensions(file, 600, 600);\n\n// Compress before upload\nconst compressed = await compressImageBrowser(file, 2000, 2000);\n\n// Extract EXIF metadata\nconst exif = await getExifBrowser(file);\n\n// SHA-256 hash for duplicate detection\nconst hash = await hashBrowser(file);\n```\n\n---\n\n## 🖥 Node Utilities\n\n```js\nimport {\n  compressImageNode,\n  getExif,\n  hashSHA256,\n  hashPHash,\n  validateQuality,\n} from \"@bonhomie/cloudinary-super-uploader/node\";\n\nconst compressed = await compressImageNode(\"input.jpg\", \"output.jpg\", {\n  quality: 80,\n  maxWidth: 2000,\n  maxHeight: 2000,\n});\n\nconst exif = getExif(\"output.jpg\");\nconst sha = hashSHA256(\"output.jpg\");\nconst pHash = await hashPHash(\"output.jpg\");\n\nconst quality = await validateQuality(\"output.jpg\", {\n  minWidth: 600,\n  minHeight: 600,\n  maxAgeDays: 365,\n});\n```\n\n---\n\n## ⚙️ Hook Options\n\n| Option         | Default       | Description                              |\n| -------------- | ------------- | ---------------------------------------- |\n| `uploadUrl`    | **required**  | Backend endpoint that receives `file`    |\n| `maxWidth`     | `2000`        | Resize limit before upload (browser)     |\n| `maxHeight`    | `2000`        | Resize limit before upload (browser)     |\n| `minWidth`     | `600`         | Minimum allowed width                    |\n| `minHeight`    | `600`         | Minimum allowed height                   |\n| `maxFiles`     | `10`          | Max files per session                    |\n| `autoCompress` | `true`        | Enable browser canvas compression        |\n| `allowedTypes` | jpeg/png/webp | MIME types accepted                      |\n| `maxAgeDays`   | `365`         | Warn when EXIF date is older than N days |\n\n---\n\n## 🔐 Signed Uploads\n\n```js\nimport { generateSignature } from \"@bonhomie/cloudinary-super-uploader/node\";\n\nconst params = {\n  folder: \"secure\",\n  timestamp: Math.floor(Date.now() / 1000),\n};\n\nconst { signature } = generateSignature(params, process.env.CLOUDINARY_API_SECRET);\n// Send signature, timestamp, and api_key to your frontend\n```\n\n---\n\n## 📄 License\n\nMIT — free for personal & commercial use.\n\n## 🧑‍💻 Author\n\nBuilt by **Bonhomie** · Full-stack Web & Mobile Developer.  \nIf this package helps you, a ⭐ on GitHub would mean a lot.\n","readmeFilename":"README.md"}