@bonhomie/cloudinary-super-uploader
Version:
A powerful React + Node Cloudinary toolkit with drag & drop, browser compression, EXIF checks, duplicate detection, signed uploads, and more.
2 lines (1 loc) • 2.84 kB
JavaScript
import b from"crypto";function d(r,e){try{let a=Object.keys(r).sort().map(i=>`${i}=${r[i]}`).join("&");return{success:!0,signature:b.createHash("sha256").update(a+e).digest("hex")}}catch(a){return{success:!1,error:a.message}}}import x from"cloudinary";async function y(r,e={}){let{cloud_name:a,api_key:o,api_secret:i,folder:f="uploads",public_id:n,useSigned:s=!1,transformation:t={},tags:p=[],resource_type:l="image"}=e;try{x.v2.config({cloud_name:a,api_key:o,api_secret:i});let u={folder:f,public_id:n,tags:p,resource_type:l,transformation:t};if(s){let m=Math.floor(Date.now()/1e3),g={timestamp:m,folder:f,public_id:n,...t},h=d(g,i);if(!h.success)throw new Error(h.error);u={...u,timestamp:m,signature:h.signature,api_key:o}}let c=await x.v2.uploader.upload(r,u);return{success:!0,data:{url:c.secure_url,publicId:c.public_id,width:c.width,height:c.height,size:c.bytes,format:c.format,folder:c.folder,etag:c.etag}}}catch(u){return{success:!1,error:u.message}}}async function D(r,e={}){try{return{success:!0,data:await Promise.all(r.map(async o=>{let i=await y(o,e);return{file:o,...i}}))}}catch(a){return{success:!1,error:a.message}}}import O from"sharp";async function H(r,e,a={}){let{quality:o=80,maxWidth:i=2e3,maxHeight:f=2e3,format:n="jpeg",removeMetadata:s=!0}=a;try{let t=O(r).rotate();return t=t.resize({width:i,height:f,fit:"inside",withoutEnlargement:!0}),s&&(t=t.withMetadata({exif:!1})),n==="jpeg"&&(t=t.jpeg({quality:o})),n==="png"&&(t=t.png({quality:o})),n==="webp"&&(t=t.webp({quality:o})),await t.toFile(e),{success:!0,output:e}}catch(t){return{success:!1,error:t.message}}}import _ from"fs";import k from"exif-parser";function w(r){try{let e=_.readFileSync(r);return{success:!0,data:k.create(e).parse().tags}}catch(e){return{success:!1,error:e.message}}}import S from"fs";import j from"crypto";import{imageHash as v}from"image-hash";function J(r){try{let e=S.readFileSync(r);return{success:!0,hash:j.createHash("sha256").update(e).digest("hex")}}catch(e){return{success:!1,error:e.message}}}async function K(r){try{return new Promise((e,a)=>{v(r,16,!0,(o,i)=>{o?a({success:!1,error:o.message}):e({success:!0,hash:i})})})}catch(e){return{success:!1,error:e.message}}}import I from"sharp";async function E(r,e={}){let{minWidth:a=600,minHeight:o=600,maxAgeDays:i=365,minBrightness:f=20,minSharpness:n=15}=e;try{let s=await I(r).metadata(),t=s.width>=a&&s.height>=o,p=(s==null?void 0:s.brightness)||null,l=p?p>=f:!0,u=s!=null&&s.sharpness?s.sharpness>=n:!0,c=w(r),m=!0;if(c.success&&c.data.DateTimeOriginal){let g=new Date(c.data.DateTimeOriginal*1e3);m=(Date.now()-g.getTime())/(1e3*3600*24)<=i}return{success:!0,data:{resolutionOk:t,brightnessOk:l,sharpnessOk:u,ageOk:m,width:s.width,height:s.height,exif:c.data||{}}}}catch(s){return{success:!1,error:s.message}}}export{d as a,y as b,D as c,H as d,w as e,J as f,K as g,E as h};