@jvddavid/cloudflare-images
Version:
Cloudflare Images API wrapper
2 lines (1 loc) • 5.61 kB
JavaScript
"use strict";var p=Object.defineProperty;var h=(u,t)=>p(u,"name",{value:t,configurable:!0});var g=require("axios"),d=require("form-data");class l extends Error{static{h(this,"HttpError")}code;constructor(t){super(t.message),this.name="HttpError",this.code=t.code}}class m extends Error{static{h(this,"RequestError")}code;data;request;response;constructor(t){super(t.message),this.name="RequestError",this.code=t.code,this.data=t.data,this.request=t.request,this.response=t.response}}class ${static{h(this,"CloudFlareImages")}auth;baseUrl;constructor(t,e){this.baseUrl=e.endpoint??"https://api.cloudflare.com/client/v4",this.auth=t}async list(t={page:1,perPage:1e3}){const{page:e,perPage:s}=t;if(e<1)throw new Error("page must be greater or equal than 1");if(s<10)throw new Error("perPage must be greater or equal than 1");const a=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1`,r=new URLSearchParams({page:e.toString(),per_page:s.toString()});return this.get(`${a}?${r.toString()}`)}async stats(){const t=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/stats`;return this.get(t)}async imageDetails(t){const e=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/${t}`;return this.get(e)}async baseImage(t){const e=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/${t}/blob`;return this.get(e,"text","BASE64")}async uploadImage(t){const{name:e,image:s,metadata:a,requireSignedURLs:r}=t,n=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1`,i=new d;a&&i.append("metadata",JSON.stringify(a),{contentType:"application/json"}),r&&i.append("requireSignedURLs",r.toString());const o={contentType:"image/*",filename:e};return typeof s=="string"?i.append("file",Buffer.from(s,"base64"),o):i.append("file",s,o),this.post(n,i)}async uploadImageURL(t){const{imageURL:e,metadata:s,requireSignedURLs:a}=t,r=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1`,n=new d;return s&&n.append("metadata",JSON.stringify(s),{contentType:"application/json"}),a&&n.append("requireSignedURLs",a.toString()),n.append("url",e),this.post(r,n)}async updateImage(t){const{imageId:e,metadata:s,requireSignedURLs:a}=t,r=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/${e}`;return this.patch(r,{metadata:s,requireSignedURLs:a})}async deleteImage(t){const e=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/${t}`;return this.delete(e)}async listV2(t={perPage:1e3,sortOrder:null,continuationToken:null}){const{perPage:e,sortOrder:s,continuationToken:a}=t;if(e<10)throw new Error("perPage must be greater or equal than 1");const r=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v2`,n=new URLSearchParams({per_page:e.toString()});return s&&n.append("sort_order",s),a&&n.append("continuation_token",a),this.get(`${r}?${n.toString()}`)}async directUploadUrlV2(t={}){const{expiry:e,metadata:s,requireSignedURLs:a}=t,r=`${this.baseUrl}/accounts/${this.auth.accountId}/images/v2/direct_upload`,n=new d;return e?n.append("expiry",e.toISOString()):n.append("expiry",new Date(Date.now()+1e3*60*60*1).toISOString()),s&&n.append("metadata",JSON.stringify(s),{contentType:"application/json"}),a&&n.append("requireSignedURLs",a.toString()),this.post(r,n,"json","UTF-8")}async listSigningKeys(){return this.get(`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/keys`,"json","UTF-8")}async listVariants(){return this.get(`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/variants`)}async variantDetails(t){return this.get(`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/variants/${t}`)}async createVariant(t){return this.post(`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/variants`,t,"json","UTF-8")}async updateVariant(t){return this.patch(`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/variants/${t.id}`,{options:t.options,neverRequireSignedURLs:t.neverRequireSignedURLs},"json","UTF-8")}async deleteVariant(t){const e=await this.request({method:"DELETE",url:`${this.baseUrl}/accounts/${this.auth.accountId}/images/v1/variants/${t}`});return this.parseResponse(e,"json")}async get(t,e="json",s){const a=await this.request({method:"GET",url:t,type:e,encoding:s});return this.parseResponse(a,e)}async post(t,e,s="json",a){let r={};e instanceof d?r=e.getHeaders():r={"Content-Type":"application/json"};const n=await this.request({method:"POST",url:t,data:e,type:s,encoding:a,headers:r});return this.parseResponse(n,s)}async patch(t,e,s="json",a){const r=await this.request({method:"PATCH",url:t,data:e,type:s,encoding:a,headers:{"Content-Type":"application/json"}});return this.parseResponse(r,s)}async delete(t,e="json",s){const a=await this.request({method:"DELETE",url:t,type:e,encoding:s});return this.parseResponse(a,e)}async parseResponse(t,e){if(!(t.status>=200&&t.status<300)){if(t.status>=400&&t.status<500)return t.data;throw new l({code:t.status,message:t.statusText})}switch(e){case"json":return t.data;default:return{success:!0,errors:[],messages:[],result:t.data}}}getHeaders(t){const e={Accept:"*/*","User-Agent":"CloudflareImages/1.0.0"};return"token"in this.auth?e.Authorization=`Bearer ${this.auth.token}`:(e["X-Auth-Email"]=this.auth.email,e["X-Auth-Key"]=this.auth.key),t&&(e["Content-Type"]=t),e}async request(t){const{method:e,url:s,data:a,headers:r,type:n,encoding:i}=t;try{return await g.request({method:e,url:s,data:a,headers:{...this.getHeaders(),...r},responseType:n,responseEncoding:i})}catch(o){if(o.isAxiosError){const c=o;if(c.response)return c.response;throw new m({code:c.status??500,message:c.message,data:c.config?.data,request:c.request,response:c.response})}throw o}}}module.exports=$;