UNPKG

@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.93 kB
import w from"cloudinary";import I from"crypto";function d(r,e){try{let a=Object.keys(r).sort().map(i=>`${i}=${r[i]}`).join("&");return{success:!0,signature:I.createHash("sha256").update(a+e).digest("hex")}}catch(a){return{success:!1,error:a.message}}}async function g(r,e={}){let{cloud_name:a,api_key:o,api_secret:i,folder:f="uploads",public_id:c,useSigned:s=!1,transformation:t={},tags:p=[],resource_type:y="image"}=e;try{w.v2.config({cloud_name:a,api_key:o,api_secret:i});let n={folder:f,public_id:c,tags:p,resource_type:y,transformation:t};if(s){let m=Math.floor(Date.now()/1e3),x={timestamp:m,folder:f,public_id:c,...t},l=d(x,i);if(!l.success)throw new Error(l.error);n={...n,timestamp:m,signature:l.signature,api_key:o}}let u=await w.v2.uploader.upload(r,n);return{success:!0,data:{url:u.secure_url,publicId:u.public_id,width:u.width,height:u.height,size:u.bytes,format:u.format,folder:u.folder,etag:u.etag}}}catch(n){return{success:!1,error:n.message}}}async function b(r,e={}){try{return{success:!0,data:await Promise.all(r.map(async o=>{let i=await g(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:c="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})),c==="jpeg"&&(t=t.jpeg({quality:o})),c==="png"&&(t=t.png({quality:o})),c==="webp"&&(t=t.webp({quality:o})),await t.toFile(e),{success:!0,output:e}}catch(t){return{success:!1,error:t.message}}}import S from"fs";import _ from"exif-parser";function h(r){try{let e=S.readFileSync(r);return{success:!0,data:_.create(e).parse().tags}}catch(e){return{success:!1,error:e.message}}}import k from"fs";import v from"crypto";import{imageHash as j}from"image-hash";function E(r){try{let e=k.readFileSync(r);return{success:!0,hash:v.createHash("sha256").update(e).digest("hex")}}catch(e){return{success:!1,error:e.message}}}async function A(r){try{return new Promise((e,a)=>{j(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 F from"sharp";async function D(r,e={}){let{minWidth:a=600,minHeight:o=600,maxAgeDays:i=365,minBrightness:f=20,minSharpness:c=15}=e;try{let s=await F(r).metadata(),t=s.width>=a&&s.height>=o,p=(s==null?void 0:s.brightness)||null,y=p?p>=f:!0,n=s!=null&&s.sharpness?s.sharpness>=c:!0,u=h(r),m=!0;if(u.success&&u.data.DateTimeOriginal){let x=new Date(u.data.DateTimeOriginal*1e3);m=(Date.now()-x.getTime())/(1e3*3600*24)<=i}return{success:!0,data:{resolutionOk:t,brightnessOk:y,sharpnessOk:n,ageOk:m,width:s.width,height:s.height,exif:u.data||{}}}}catch(s){return{success:!1,error:s.message}}}export{H as compressImageNode,d as generateSignature,h as getExif,A as hashPHash,E as hashSHA256,g as uploadImage,b as uploadImages,D as validateQuality};