New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@nhost/hasura-storage-js

Package Overview
Dependencies
Maintainers
3
Versions
67
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nhost/hasura-storage-js - npm Package Compare versions

Comparing version 0.7.1 to 0.7.2

2

dist/index.cjs.js

@@ -1,2 +0,2 @@

"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});var S=require("axios"),L=require("form-data"),i=require("xstate");function E(r){return r&&typeof r=="object"&&"default"in r?r:{default:r}}var D=E(S),T=E(L);class _{constructor({url:e}){this.url=e,this.httpClient=D.default.create({baseURL:this.url})}async upload(e){const{formData:t}=e;try{return{fileMetadata:(await this.httpClient.post("/files",t,{headers:{...this.generateUploadHeaders(e),...this.generateAuthHeaders(),"Content-Type":"multipart/form-data"}})).data,error:null}}catch(s){return{fileMetadata:null,error:s}}}async getPresignedUrl(e){try{const{fileId:t}=e;return{presignedUrl:(await this.httpClient.get(`/files/${t}/presignedurl`,{headers:{...this.generateAuthHeaders()}})).data,error:null}}catch(t){return{presignedUrl:null,error:t}}}async delete(e){try{const{fileId:t}=e;return await this.httpClient.delete(`/files/${t}`,{headers:{...this.generateAuthHeaders()}}),{error:null}}catch(t){return{error:t}}}setAccessToken(e){return this.accessToken=e,this}setAdminSecret(e){return this.adminSecret=e,this}generateUploadHeaders(e){const{bucketId:t,name:s,id:a}=e,n={};return t&&(n["x-nhost-bucket-id"]=t),a&&(n["x-nhost-file-id"]=a),s&&(n["x-nhost-file-name"]=s),n}generateAuthHeaders(){return!this.adminSecret&&!this.accessToken?null:this.adminSecret?{"x-hasura-admin-secret":this.adminSecret}:{Authorization:`Bearer ${this.accessToken}`}}}class I{constructor({url:e,adminSecret:t}){this.url=e,this.api=new _({url:e}),this.setAdminSecret(t)}async upload(e){let t;"file"in e?(t=new T.default,t.append("file",e.file)):t=e.formData;const{fileMetadata:s,error:a}=await this.api.upload({...e,formData:t});return a?{fileMetadata:null,error:a}:s?{fileMetadata:s,error:null}:{fileMetadata:null,error:new Error("Invalid file returned")}}getUrl(e){return this.getPublicUrl(e)}getPublicUrl(e){const{fileId:t}=e;return`${this.url}/files/${t}`}async getPresignedUrl(e){const{presignedUrl:t,error:s}=await this.api.getPresignedUrl(e);return s?{presignedUrl:null,error:s}:t?{presignedUrl:t,error:null}:{presignedUrl:null,error:new Error("Invalid file id")}}async delete(e){const{error:t}=await this.api.delete(e);return t?{error:t}:{error:null}}setAccessToken(e){return this.api.setAccessToken(e),this}setAdminSecret(e){return this.api.setAdminSecret(e),this}}const f={progress:null,loaded:0,error:null},O=()=>i.createMachine({predictableActionArguments:!0,schema:{context:{},events:{}},tsTypes:{},context:{...f},initial:"idle",on:{DESTROY:{actions:"sendDestroy",target:"stopped"}},states:{idle:{on:{ADD:{actions:"addFile"},UPLOAD:{cond:"hasFile",target:"uploading"}}},uploading:{entry:"resetProgress",on:{UPLOAD_PROGRESS:{actions:["incrementProgress","sendProgress"]},UPLOAD_DONE:"uploaded",UPLOAD_ERROR:"error",CANCEL:"idle"},invoke:{src:"uploadFile"}},uploaded:{entry:["setFileMetadata","sendDone"]},error:{entry:["setError","sendError"]},stopped:{type:"final"}}},{guards:{hasFile:(r,e)=>!!r.file||!!e.file},actions:{incrementProgress:i.assign({loaded:(r,{loaded:e})=>e,progress:(r,{progress:e})=>e}),setFileMetadata:i.assign({id:(r,{id:e})=>e,bucketId:(r,{bucketId:e})=>e,progress:r=>100}),setError:i.assign({error:(r,{error:e})=>e}),sendProgress:()=>{},sendError:()=>{},sendDestroy:()=>{},sendDone:()=>{},resetProgress:i.assign({progress:r=>null,loaded:r=>0}),addFile:i.assign({file:(r,{file:e})=>e,bucketId:(r,{bucketId:e})=>e,id:(r,{id:e})=>e})},services:{uploadFile:(r,e)=>t=>{const s={"Content-Type":"multipart/form-data"},a=e.id||r.id;a&&(s["x-nhost-file-id"]=a);const n=e.bucketId||r.bucketId;n&&(s["x-nhost-bucket-id"]=n);const l=e.file||r.file;s["x-nhost-file-name"]=e.name||l.name;const c=new FormData;c.append("file",l),e.adminSecret&&(s["x-hasura-admin-secret"]=e.adminSecret),e.accessToken&&(s.Authorization=`Bearer ${e.accessToken}`);let u=0;const m=new AbortController;return D.default.post(e.url+"/files",c,{headers:s,signal:m.signal,onUploadProgress:o=>{const d=Math.round(o.loaded*l.size/o.total),g=d-u;u=d,t({type:"UPLOAD_PROGRESS",progress:Math.round(d*100/o.total),loaded:d,additions:g})}}).then(({data:{id:o,bucketId:d}})=>{t({type:"UPLOAD_DONE",id:o,bucketId:d})}).catch(({response:o,message:d})=>{var g,A,P,U,y;t({type:"UPLOAD_ERROR",error:{status:(g=o==null?void 0:o.status)!=null?g:0,message:((P=(A=o==null?void 0:o.data)==null?void 0:A.error)==null?void 0:P.message)||d,error:((y=(U=o==null?void 0:o.data)==null?void 0:U.error)==null?void 0:y.message)||d}})}),()=>{m.abort()}}}}),{pure:h,sendParent:p}=i.actions,R=()=>i.createMachine({id:"files-list",schema:{context:{},events:{}},tsTypes:{},context:{progress:null,files:[],loaded:0,total:0},initial:"idle",on:{UPLOAD:{cond:"hasFileToDownload",actions:"addItem",target:"uploading"},ADD:{actions:"addItem"},REMOVE:{actions:"removeItem"}},states:{idle:{entry:["resetProgress","resetLoaded","resetTotal"],on:{CLEAR:{actions:"clearList",target:"idle"}}},uploading:{entry:["upload","startProgress","resetLoaded","resetTotal"],on:{UPLOAD_PROGRESS:{actions:["incrementProgress"]},UPLOAD_DONE:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],UPLOAD_ERROR:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],CANCEL:{actions:"cancel",target:"idle"}}},uploaded:{entry:"setUploaded",on:{CLEAR:{actions:"clearList",target:"idle"}}},error:{on:{CLEAR:{actions:"clearList",target:"idle"}}}}},{guards:{hasFileToDownload:(r,e)=>r.files.some(t=>t.getSnapshot().matches("idle"))||!!e.files,isAllUploaded:r=>r.files.every(e=>{var t;return(t=e.getSnapshot())==null?void 0:t.matches("uploaded")}),isAllUploadedOrError:r=>r.files.every(e=>{const t=e.getSnapshot();return(t==null?void 0:t.matches("error"))||(t==null?void 0:t.matches("uploaded"))})},actions:{incrementProgress:i.assign((r,e)=>{const t=r.loaded+e.additions,s=Math.round(t*100/r.total);return{...r,loaded:t,progress:s}}),setUploaded:i.assign({progress:r=>100,loaded:({files:r})=>r.map(e=>e.getSnapshot()).filter(e=>e.matches("uploaded")).reduce((e,t)=>{var s;return e+((s=t.context.file)==null?void 0:s.size)},0)}),resetTotal:i.assign({total:({files:r})=>r.map(e=>e.getSnapshot()).filter(e=>!e.matches("uploaded")).reduce((e,t)=>{var s;return e+((s=t.context.file)==null?void 0:s.size)},0)}),resetLoaded:i.assign({loaded:r=>0}),startProgress:i.assign({progress:r=>0}),resetProgress:i.assign({progress:r=>null}),addItem:i.assign((r,{files:e,bucketId:t})=>{const s=e?Array.isArray(e)?e:"length"in e?Array.from(e):[e]:[],a=r.total+s.reduce((l,c)=>l+c.size,0),n=Math.round(r.loaded*100/a);return{files:[...r.files,...s.map(l=>i.spawn(O().withConfig({actions:{sendProgress:p((c,{additions:u})=>({type:"UPLOAD_PROGRESS",additions:u})),sendDone:p("UPLOAD_DONE"),sendError:p("UPLOAD_ERROR"),sendDestroy:p("REMOVE")}}).withContext({...f,file:l,bucketId:t}),{sync:!0}))],total:a,loaded:r.loaded,progress:n}}),removeItem:i.assign({files:r=>r.files.filter(e=>{var s,a;const t=(s=e.getSnapshot())==null?void 0:s.matches("stopped");return t&&((a=e.stop)==null||a.call(e)),!t})}),clearList:h(r=>r.files.map(e=>i.send({type:"DESTROY"},{to:e.id}))),upload:h((r,e)=>r.files.map(t=>i.send(e,{to:t.id}))),cancel:h(r=>r.files.map(e=>i.send({type:"CANCEL"},{to:e.id})))}}),M=async(r,e,t)=>new Promise(s=>{e.send({type:"UPLOAD",url:r.storage.url,accessToken:r.auth.getAccessToken(),adminSecret:r.adminSecret,...t}),e.subscribe(a=>{var n;a.matches("error")?s({error:a.context.error,isError:!0,isUploaded:!1}):a.matches("uploaded")&&s({error:null,isError:!1,isUploaded:!0,id:a.context.id,bucketId:a.context.id,name:(n=a.context.file)==null?void 0:n.name})})}),k=async(r,e,t)=>new Promise(s=>{e.send({type:"UPLOAD",url:r.storage.url,accessToken:r.auth.getAccessToken(),adminSecret:r.adminSecret,bucketId:t==null?void 0:t.bucketId,files:t==null?void 0:t.files}),e.onTransition(a=>{a.matches("error")?s({errors:a.context.files.filter(n=>{var l;return(l=n.getSnapshot())==null?void 0:l.context.error}),isError:!0,files:[]}):a.matches("uploaded")&&s({errors:[],isError:!1,files:a.context.files})})});exports.HasuraStorageApi=_;exports.HasuraStorageClient=I;exports.INITIAL_FILE_CONTEXT=f;exports.createFileUploadMachine=O;exports.createMultipleFilesUploadMachine=R;exports.uploadFilePromise=M;exports.uploadMultipleFilesPromise=k;
"use strict";var L=Object.defineProperty;var T=(r,e,t)=>e in r?L(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var c=(r,e,t)=>(T(r,typeof e!="symbol"?e+"":e,t),t);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const I=require("axios"),R=require("form-data"),i=require("xstate"),D=r=>r&&typeof r=="object"&&"default"in r?r:{default:r},_=D(I),k=D(R);class O{constructor({url:e}){c(this,"url");c(this,"httpClient");c(this,"accessToken");c(this,"adminSecret");this.url=e,this.httpClient=_.default.create({baseURL:this.url})}async upload(e){const{formData:t}=e;try{return{fileMetadata:(await this.httpClient.post("/files",t,{headers:{...this.generateUploadHeaders(e),...this.generateAuthHeaders(),"Content-Type":"multipart/form-data"}})).data,error:null}}catch(s){return{fileMetadata:null,error:s}}}async getPresignedUrl(e){try{const{fileId:t}=e;return{presignedUrl:(await this.httpClient.get(`/files/${t}/presignedurl`,{headers:{...this.generateAuthHeaders()}})).data,error:null}}catch(t){return{presignedUrl:null,error:t}}}async delete(e){try{const{fileId:t}=e;return await this.httpClient.delete(`/files/${t}`,{headers:{...this.generateAuthHeaders()}}),{error:null}}catch(t){return{error:t}}}setAccessToken(e){return this.accessToken=e,this}setAdminSecret(e){return this.adminSecret=e,this}generateUploadHeaders(e){const{bucketId:t,name:s,id:a}=e,n={};return t&&(n["x-nhost-bucket-id"]=t),a&&(n["x-nhost-file-id"]=a),s&&(n["x-nhost-file-name"]=s),n}generateAuthHeaders(){return!this.adminSecret&&!this.accessToken?null:this.adminSecret?{"x-hasura-admin-secret":this.adminSecret}:{Authorization:`Bearer ${this.accessToken}`}}}class M{constructor({url:e,adminSecret:t}){c(this,"url");c(this,"api");this.url=e,this.api=new O({url:e}),this.setAdminSecret(t)}async upload(e){let t;"file"in e?(t=new k.default,t.append("file",e.file)):t=e.formData;const{fileMetadata:s,error:a}=await this.api.upload({...e,formData:t});return a?{fileMetadata:null,error:a}:s?{fileMetadata:s,error:null}:{fileMetadata:null,error:new Error("Invalid file returned")}}getUrl(e){return this.getPublicUrl(e)}getPublicUrl(e){const{fileId:t}=e;return`${this.url}/files/${t}`}async getPresignedUrl(e){const{presignedUrl:t,error:s}=await this.api.getPresignedUrl(e);return s?{presignedUrl:null,error:s}:t?{presignedUrl:t,error:null}:{presignedUrl:null,error:new Error("Invalid file id")}}async delete(e){const{error:t}=await this.api.delete(e);return t?{error:t}:{error:null}}setAccessToken(e){return this.api.setAccessToken(e),this}setAdminSecret(e){return this.api.setAdminSecret(e),this}}const m={progress:null,loaded:0,error:null},S=()=>i.createMachine({predictableActionArguments:!0,schema:{context:{},events:{}},tsTypes:{},context:{...m},initial:"idle",on:{DESTROY:{actions:"sendDestroy",target:"stopped"}},states:{idle:{on:{ADD:{actions:"addFile"},UPLOAD:{cond:"hasFile",target:"uploading"}}},uploading:{entry:"resetProgress",on:{UPLOAD_PROGRESS:{actions:["incrementProgress","sendProgress"]},UPLOAD_DONE:"uploaded",UPLOAD_ERROR:"error",CANCEL:"idle"},invoke:{src:"uploadFile"}},uploaded:{entry:["setFileMetadata","sendDone"]},error:{entry:["setError","sendError"]},stopped:{type:"final"}}},{guards:{hasFile:(r,e)=>!!r.file||!!e.file},actions:{incrementProgress:i.assign({loaded:(r,{loaded:e})=>e,progress:(r,{progress:e})=>e}),setFileMetadata:i.assign({id:(r,{id:e})=>e,bucketId:(r,{bucketId:e})=>e,progress:r=>100}),setError:i.assign({error:(r,{error:e})=>e}),sendProgress:()=>{},sendError:()=>{},sendDestroy:()=>{},sendDone:()=>{},resetProgress:i.assign({progress:r=>null,loaded:r=>0}),addFile:i.assign({file:(r,{file:e})=>e,bucketId:(r,{bucketId:e})=>e,id:(r,{id:e})=>e})},services:{uploadFile:(r,e)=>t=>{const s={"Content-Type":"multipart/form-data"},a=e.id||r.id;a&&(s["x-nhost-file-id"]=a);const n=e.bucketId||r.bucketId;n&&(s["x-nhost-bucket-id"]=n);const l=e.file||r.file;s["x-nhost-file-name"]=e.name||l.name;const u=new FormData;u.append("file",l),e.adminSecret&&(s["x-hasura-admin-secret"]=e.adminSecret),e.accessToken&&(s.Authorization=`Bearer ${e.accessToken}`);let g=0;const A=new AbortController;return _.default.post(e.url+"/files",u,{headers:s,signal:A.signal,onUploadProgress:o=>{const d=o.total?Math.round(o.loaded*l.size/o.total):0,p=d-g;g=d,t({type:"UPLOAD_PROGRESS",progress:o.total?Math.round(d*100/o.total):0,loaded:d,additions:p})}}).then(({data:{id:o,bucketId:d}})=>{t({type:"UPLOAD_DONE",id:o,bucketId:d})}).catch(({response:o,message:d})=>{var p,P,U,y,E;t({type:"UPLOAD_ERROR",error:{status:(p=o==null?void 0:o.status)!=null?p:0,message:((U=(P=o==null?void 0:o.data)==null?void 0:P.error)==null?void 0:U.message)||d,error:((E=(y=o==null?void 0:o.data)==null?void 0:y.error)==null?void 0:E.message)||d}})}),()=>{A.abort()}}}}),{pure:f,sendParent:h}=i.actions,b=()=>i.createMachine({id:"files-list",schema:{context:{},events:{}},tsTypes:{},predictableActionArguments:!0,context:{progress:null,files:[],loaded:0,total:0},initial:"idle",on:{UPLOAD:{cond:"hasFileToDownload",actions:"addItem",target:"uploading"},ADD:{actions:"addItem"},REMOVE:{actions:"removeItem"}},states:{idle:{entry:["resetProgress","resetLoaded","resetTotal"],on:{CLEAR:{actions:"clearList",target:"idle"}}},uploading:{entry:["upload","startProgress","resetLoaded","resetTotal"],on:{UPLOAD_PROGRESS:{actions:["incrementProgress"]},UPLOAD_DONE:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],UPLOAD_ERROR:[{cond:"isAllUploaded",target:"uploaded"},{cond:"isAllUploadedOrError",target:"error"}],CANCEL:{actions:"cancel",target:"idle"}}},uploaded:{entry:"setUploaded",on:{CLEAR:{actions:"clearList",target:"idle"}}},error:{on:{CLEAR:{actions:"clearList",target:"idle"}}}}},{guards:{hasFileToDownload:(r,e)=>r.files.some(t=>t.getSnapshot().matches("idle"))||!!e.files,isAllUploaded:r=>r.files.every(e=>{var t;return(t=e.getSnapshot())==null?void 0:t.matches("uploaded")}),isAllUploadedOrError:r=>r.files.every(e=>{const t=e.getSnapshot();return(t==null?void 0:t.matches("error"))||(t==null?void 0:t.matches("uploaded"))})},actions:{incrementProgress:i.assign((r,e)=>{const t=r.loaded+e.additions,s=Math.round(t*100/r.total);return{...r,loaded:t,progress:s}}),setUploaded:i.assign({progress:r=>100,loaded:({files:r})=>r.map(e=>e.getSnapshot()).filter(e=>e.matches("uploaded")).reduce((e,t)=>{var s;return e+((s=t.context.file)==null?void 0:s.size)},0)}),resetTotal:i.assign({total:({files:r})=>r.map(e=>e.getSnapshot()).filter(e=>!e.matches("uploaded")).reduce((e,t)=>{var s;return e+((s=t.context.file)==null?void 0:s.size)},0)}),resetLoaded:i.assign({loaded:r=>0}),startProgress:i.assign({progress:r=>0}),resetProgress:i.assign({progress:r=>null}),addItem:i.assign((r,{files:e,bucketId:t})=>{const s=e?Array.isArray(e)?e:"length"in e?Array.from(e):[e]:[],a=r.total+s.reduce((l,u)=>l+u.size,0),n=Math.round(r.loaded*100/a);return{files:[...r.files,...s.map(l=>i.spawn(S().withConfig({actions:{sendProgress:h((u,{additions:g})=>({type:"UPLOAD_PROGRESS",additions:g})),sendDone:h("UPLOAD_DONE"),sendError:h("UPLOAD_ERROR"),sendDestroy:h("REMOVE")}}).withContext({...m,file:l,bucketId:t}),{sync:!0}))],total:a,loaded:r.loaded,progress:n}}),removeItem:i.assign({files:r=>r.files.filter(e=>{var s,a;const t=(s=e.getSnapshot())==null?void 0:s.matches("stopped");return t&&((a=e.stop)==null||a.call(e)),!t})}),clearList:f(r=>r.files.map(e=>i.send({type:"DESTROY"},{to:e.id}))),upload:f((r,e)=>r.files.map(t=>i.send(e,{to:t.id}))),cancel:f(r=>r.files.map(e=>i.send({type:"CANCEL"},{to:e.id})))}}),C=async(r,e,t)=>new Promise(s=>{e.send({type:"UPLOAD",url:r.storage.url,accessToken:r.auth.getAccessToken(),adminSecret:r.adminSecret,...t}),e.subscribe(a=>{var n;a.matches("error")?s({error:a.context.error,isError:!0,isUploaded:!1}):a.matches("uploaded")&&s({error:null,isError:!1,isUploaded:!0,id:a.context.id,bucketId:a.context.id,name:(n=a.context.file)==null?void 0:n.name})})}),F=async(r,e,t)=>new Promise(s=>{e.send({type:"UPLOAD",url:r.storage.url,accessToken:r.auth.getAccessToken(),adminSecret:r.adminSecret,bucketId:t==null?void 0:t.bucketId,files:t==null?void 0:t.files}),e.onTransition(a=>{a.matches("error")?s({errors:a.context.files.filter(n=>{var l;return(l=n.getSnapshot())==null?void 0:l.context.error}),isError:!0,files:[]}):a.matches("uploaded")&&s({errors:[],isError:!1,files:a.context.files})})});exports.HasuraStorageApi=O;exports.HasuraStorageClient=M;exports.INITIAL_FILE_CONTEXT=m;exports.createFileUploadMachine=S;exports.createMultipleFilesUploadMachine=b;exports.uploadFilePromise=C;exports.uploadMultipleFilesPromise=F;
//# sourceMappingURL=index.cjs.js.map

@@ -1,84 +0,69 @@

import axios from "axios";
import FormData$1 from "form-data";
import { createMachine, assign, spawn, send, actions } from "xstate";
class HasuraStorageApi {
constructor({ url }) {
this.url = url;
this.httpClient = axios.create({
var L = Object.defineProperty;
var _ = (r, e, t) => e in r ? L(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
var c = (r, e, t) => (_(r, typeof e != "symbol" ? e + "" : e, t), t);
import D from "axios";
import R from "form-data";
import { createMachine as O, assign as n, spawn as T, send as f, actions as I } from "xstate";
class k {
constructor({ url: e }) {
c(this, "url");
c(this, "httpClient");
c(this, "accessToken");
c(this, "adminSecret");
this.url = e, this.httpClient = D.create({
baseURL: this.url
});
}
async upload(params) {
const { formData } = params;
async upload(e) {
const { formData: t } = e;
try {
const res = await this.httpClient.post("/files", formData, {
return { fileMetadata: (await this.httpClient.post("/files", t, {
headers: {
...this.generateUploadHeaders(params),
...this.generateUploadHeaders(e),
...this.generateAuthHeaders(),
"Content-Type": "multipart/form-data"
}
});
return { fileMetadata: res.data, error: null };
} catch (error) {
return { fileMetadata: null, error };
})).data, error: null };
} catch (s) {
return { fileMetadata: null, error: s };
}
}
async getPresignedUrl(params) {
async getPresignedUrl(e) {
try {
const { fileId } = params;
const res = await this.httpClient.get(`/files/${fileId}/presignedurl`, {
const { fileId: t } = e;
return { presignedUrl: (await this.httpClient.get(`/files/${t}/presignedurl`, {
headers: {
...this.generateAuthHeaders()
}
});
return { presignedUrl: res.data, error: null };
} catch (error) {
return { presignedUrl: null, error };
})).data, error: null };
} catch (t) {
return { presignedUrl: null, error: t };
}
}
async delete(params) {
async delete(e) {
try {
const { fileId } = params;
await this.httpClient.delete(`/files/${fileId}`, {
const { fileId: t } = e;
return await this.httpClient.delete(`/files/${t}`, {
headers: {
...this.generateAuthHeaders()
}
});
return { error: null };
} catch (error) {
return { error };
}), { error: null };
} catch (t) {
return { error: t };
}
}
setAccessToken(accessToken) {
this.accessToken = accessToken;
return this;
setAccessToken(e) {
return this.accessToken = e, this;
}
setAdminSecret(adminSecret) {
this.adminSecret = adminSecret;
return this;
setAdminSecret(e) {
return this.adminSecret = e, this;
}
generateUploadHeaders(params) {
const { bucketId, name, id } = params;
const uploadheaders = {};
if (bucketId) {
uploadheaders["x-nhost-bucket-id"] = bucketId;
}
if (id) {
uploadheaders["x-nhost-file-id"] = id;
}
if (name) {
uploadheaders["x-nhost-file-name"] = name;
}
return uploadheaders;
generateUploadHeaders(e) {
const { bucketId: t, name: s, id: a } = e, i = {};
return t && (i["x-nhost-bucket-id"] = t), a && (i["x-nhost-file-id"] = a), s && (i["x-nhost-file-name"] = s), i;
}
generateAuthHeaders() {
if (!this.adminSecret && !this.accessToken) {
return null;
}
if (this.adminSecret) {
return {
"x-hasura-admin-secret": this.adminSecret
};
}
return {
return !this.adminSecret && !this.accessToken ? null : this.adminSecret ? {
"x-hasura-admin-secret": this.adminSecret
} : {
Authorization: `Bearer ${this.accessToken}`

@@ -88,65 +73,42 @@ };

}
class HasuraStorageClient {
constructor({ url, adminSecret }) {
this.url = url;
this.api = new HasuraStorageApi({ url });
this.setAdminSecret(adminSecret);
class F {
constructor({ url: e, adminSecret: t }) {
c(this, "url");
c(this, "api");
this.url = e, this.api = new k({ url: e }), this.setAdminSecret(t);
}
async upload(params) {
let formData;
if ("file" in params) {
formData = new FormData$1();
formData.append("file", params.file);
} else {
formData = params.formData;
}
const { fileMetadata, error } = await this.api.upload({
...params,
formData
async upload(e) {
let t;
"file" in e ? (t = new R(), t.append("file", e.file)) : t = e.formData;
const { fileMetadata: s, error: a } = await this.api.upload({
...e,
formData: t
});
if (error) {
return { fileMetadata: null, error };
}
if (!fileMetadata) {
return { fileMetadata: null, error: new Error("Invalid file returned") };
}
return { fileMetadata, error: null };
return a ? { fileMetadata: null, error: a } : s ? { fileMetadata: s, error: null } : { fileMetadata: null, error: new Error("Invalid file returned") };
}
getUrl(params) {
return this.getPublicUrl(params);
getUrl(e) {
return this.getPublicUrl(e);
}
getPublicUrl(params) {
const { fileId } = params;
return `${this.url}/files/${fileId}`;
getPublicUrl(e) {
const { fileId: t } = e;
return `${this.url}/files/${t}`;
}
async getPresignedUrl(params) {
const { presignedUrl, error } = await this.api.getPresignedUrl(params);
if (error) {
return { presignedUrl: null, error };
}
if (!presignedUrl) {
return { presignedUrl: null, error: new Error("Invalid file id") };
}
return { presignedUrl, error: null };
async getPresignedUrl(e) {
const { presignedUrl: t, error: s } = await this.api.getPresignedUrl(e);
return s ? { presignedUrl: null, error: s } : t ? { presignedUrl: t, error: null } : { presignedUrl: null, error: new Error("Invalid file id") };
}
async delete(params) {
const { error } = await this.api.delete(params);
if (error) {
return { error };
}
return { error: null };
async delete(e) {
const { error: t } = await this.api.delete(e);
return t ? { error: t } : { error: null };
}
setAccessToken(accessToken) {
this.api.setAccessToken(accessToken);
return this;
setAccessToken(e) {
return this.api.setAccessToken(e), this;
}
setAdminSecret(adminSecret) {
this.api.setAdminSecret(adminSecret);
return this;
setAdminSecret(e) {
return this.api.setAdminSecret(e), this;
}
}
const INITIAL_FILE_CONTEXT = { progress: null, loaded: 0, error: null };
const createFileUploadMachine = () => createMachine(
const S = { progress: null, loaded: 0, error: null }, C = () => O(
{
predictableActionArguments: true,
predictableActionArguments: !0,
schema: {

@@ -157,3 +119,3 @@ context: {},

tsTypes: {},
context: { ...INITIAL_FILE_CONTEXT },
context: { ...S },
initial: "idle",

@@ -187,15 +149,15 @@ on: {

guards: {
hasFile: (context, event) => !!context.file || !!event.file
hasFile: (r, e) => !!r.file || !!e.file
},
actions: {
incrementProgress: assign({
loaded: (_, { loaded }) => loaded,
progress: (_, { progress }) => progress
incrementProgress: n({
loaded: (r, { loaded: e }) => e,
progress: (r, { progress: e }) => e
}),
setFileMetadata: assign({
id: (_, { id }) => id,
bucketId: (_, { bucketId }) => bucketId,
progress: (_) => 100
setFileMetadata: n({
id: (r, { id: e }) => e,
bucketId: (r, { bucketId: e }) => e,
progress: (r) => 100
}),
setError: assign({ error: (_, { error }) => error }),
setError: n({ error: (r, { error: e }) => e }),
sendProgress: () => {

@@ -209,63 +171,49 @@ },

},
resetProgress: assign({ progress: (_) => null, loaded: (_) => 0 }),
addFile: assign({
file: (_, { file }) => file,
bucketId: (_, { bucketId }) => bucketId,
id: (_, { id }) => id
resetProgress: n({ progress: (r) => null, loaded: (r) => 0 }),
addFile: n({
file: (r, { file: e }) => e,
bucketId: (r, { bucketId: e }) => e,
id: (r, { id: e }) => e
})
},
services: {
uploadFile: (context, event) => (callback) => {
const headers = {
uploadFile: (r, e) => (t) => {
const s = {
"Content-Type": "multipart/form-data"
};
const fileId = event.id || context.id;
if (fileId) {
headers["x-nhost-file-id"] = fileId;
}
const bucketId = event.bucketId || context.bucketId;
if (bucketId) {
headers["x-nhost-bucket-id"] = bucketId;
}
const file = event.file || context.file;
headers["x-nhost-file-name"] = event.name || file.name;
const data = new FormData();
data.append("file", file);
if (event.adminSecret) {
headers["x-hasura-admin-secret"] = event.adminSecret;
}
if (event.accessToken) {
headers["Authorization"] = `Bearer ${event.accessToken}`;
}
let currentLoaded = 0;
const controller = new AbortController();
axios.post(event.url + "/files", data, {
headers,
signal: controller.signal,
onUploadProgress: (event2) => {
const loaded = Math.round(event2.loaded * file.size / event2.total);
const additions = loaded - currentLoaded;
currentLoaded = loaded;
callback({
}, a = e.id || r.id;
a && (s["x-nhost-file-id"] = a);
const i = e.bucketId || r.bucketId;
i && (s["x-nhost-bucket-id"] = i);
const d = e.file || r.file;
s["x-nhost-file-name"] = e.name || d.name;
const u = new FormData();
u.append("file", d), e.adminSecret && (s["x-hasura-admin-secret"] = e.adminSecret), e.accessToken && (s.Authorization = `Bearer ${e.accessToken}`);
let h = 0;
const A = new AbortController();
return D.post(e.url + "/files", u, {
headers: s,
signal: A.signal,
onUploadProgress: (o) => {
const l = o.total ? Math.round(o.loaded * d.size / o.total) : 0, p = l - h;
h = l, t({
type: "UPLOAD_PROGRESS",
progress: Math.round(loaded * 100 / event2.total),
loaded,
additions
progress: o.total ? Math.round(l * 100 / o.total) : 0,
loaded: l,
additions: p
});
}
}).then(({ data: { id, bucketId: bucketId2 } }) => {
callback({ type: "UPLOAD_DONE", id, bucketId: bucketId2 });
}).catch(({ response, message }) => {
var _a, _b, _c, _d, _e;
callback({
}).then(({ data: { id: o, bucketId: l } }) => {
t({ type: "UPLOAD_DONE", id: o, bucketId: l });
}).catch(({ response: o, message: l }) => {
var p, P, U, E, y;
t({
type: "UPLOAD_ERROR",
error: {
status: (_a = response == null ? void 0 : response.status) != null ? _a : 0,
message: ((_c = (_b = response == null ? void 0 : response.data) == null ? void 0 : _b.error) == null ? void 0 : _c.message) || message,
error: ((_e = (_d = response == null ? void 0 : response.data) == null ? void 0 : _d.error) == null ? void 0 : _e.message) || message
status: (p = o == null ? void 0 : o.status) != null ? p : 0,
message: ((U = (P = o == null ? void 0 : o.data) == null ? void 0 : P.error) == null ? void 0 : U.message) || l,
error: ((y = (E = o == null ? void 0 : o.data) == null ? void 0 : E.error) == null ? void 0 : y.message) || l
}
});
});
return () => {
controller.abort();
}), () => {
A.abort();
};

@@ -275,197 +223,184 @@ }

}
);
const { pure, sendParent } = actions;
const createMultipleFilesUploadMachine = () => {
return createMachine(
{
id: "files-list",
schema: {
context: {},
events: {}
), { pure: m, sendParent: g } = I, N = () => O(
{
id: "files-list",
schema: {
context: {},
events: {}
},
tsTypes: {},
predictableActionArguments: !0,
context: {
progress: null,
files: [],
loaded: 0,
total: 0
},
initial: "idle",
on: {
UPLOAD: { cond: "hasFileToDownload", actions: "addItem", target: "uploading" },
ADD: { actions: "addItem" },
REMOVE: { actions: "removeItem" }
},
states: {
idle: {
entry: ["resetProgress", "resetLoaded", "resetTotal"],
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
},
tsTypes: {},
context: {
progress: null,
files: [],
loaded: 0,
total: 0
uploading: {
entry: ["upload", "startProgress", "resetLoaded", "resetTotal"],
on: {
UPLOAD_PROGRESS: { actions: ["incrementProgress"] },
UPLOAD_DONE: [
{ cond: "isAllUploaded", target: "uploaded" },
{ cond: "isAllUploadedOrError", target: "error" }
],
UPLOAD_ERROR: [
{ cond: "isAllUploaded", target: "uploaded" },
{ cond: "isAllUploadedOrError", target: "error" }
],
CANCEL: { actions: "cancel", target: "idle" }
}
},
initial: "idle",
on: {
UPLOAD: { cond: "hasFileToDownload", actions: "addItem", target: "uploading" },
ADD: { actions: "addItem" },
REMOVE: { actions: "removeItem" }
uploaded: {
entry: "setUploaded",
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
},
states: {
idle: {
entry: ["resetProgress", "resetLoaded", "resetTotal"],
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
},
uploading: {
entry: ["upload", "startProgress", "resetLoaded", "resetTotal"],
on: {
UPLOAD_PROGRESS: { actions: ["incrementProgress"] },
UPLOAD_DONE: [
{ cond: "isAllUploaded", target: "uploaded" },
{ cond: "isAllUploadedOrError", target: "error" }
],
UPLOAD_ERROR: [
{ cond: "isAllUploaded", target: "uploaded" },
{ cond: "isAllUploadedOrError", target: "error" }
],
CANCEL: { actions: "cancel", target: "idle" }
}
},
uploaded: {
entry: "setUploaded",
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
},
error: {
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
error: {
on: {
CLEAR: { actions: "clearList", target: "idle" }
}
}
}
},
{
guards: {
hasFileToDownload: (r, e) => r.files.some((t) => t.getSnapshot().matches("idle")) || !!e.files,
isAllUploaded: (r) => r.files.every((e) => {
var t;
return (t = e.getSnapshot()) == null ? void 0 : t.matches("uploaded");
}),
isAllUploadedOrError: (r) => r.files.every((e) => {
const t = e.getSnapshot();
return (t == null ? void 0 : t.matches("error")) || (t == null ? void 0 : t.matches("uploaded"));
})
},
{
guards: {
hasFileToDownload: (context, event) => context.files.some((ref) => ref.getSnapshot().matches("idle")) || !!event.files,
isAllUploaded: (context) => context.files.every((item) => {
var _a;
return (_a = item.getSnapshot()) == null ? void 0 : _a.matches("uploaded");
}),
isAllUploadedOrError: (context) => context.files.every((item) => {
const snap = item.getSnapshot();
return (snap == null ? void 0 : snap.matches("error")) || (snap == null ? void 0 : snap.matches("uploaded"));
actions: {
incrementProgress: n((r, e) => {
const t = r.loaded + e.additions, s = Math.round(t * 100 / r.total);
return { ...r, loaded: t, progress: s };
}),
setUploaded: n({
progress: (r) => 100,
loaded: ({ files: r }) => r.map((e) => e.getSnapshot()).filter((e) => e.matches("uploaded")).reduce((e, t) => {
var s;
return e + ((s = t.context.file) == null ? void 0 : s.size);
}, 0)
}),
resetTotal: n({
total: ({ files: r }) => r.map((e) => e.getSnapshot()).filter((e) => !e.matches("uploaded")).reduce((e, t) => {
var s;
return e + ((s = t.context.file) == null ? void 0 : s.size);
}, 0)
}),
resetLoaded: n({ loaded: (r) => 0 }),
startProgress: n({ progress: (r) => 0 }),
resetProgress: n({ progress: (r) => null }),
addItem: n((r, { files: e, bucketId: t }) => {
const s = e ? Array.isArray(e) ? e : "length" in e ? Array.from(e) : [e] : [], a = r.total + s.reduce((d, u) => d + u.size, 0), i = Math.round(r.loaded * 100 / a);
return {
files: [
...r.files,
...s.map(
(d) => T(
C().withConfig({
actions: {
sendProgress: g((u, { additions: h }) => ({
type: "UPLOAD_PROGRESS",
additions: h
})),
sendDone: g("UPLOAD_DONE"),
sendError: g("UPLOAD_ERROR"),
sendDestroy: g("REMOVE")
}
}).withContext({ ...S, file: d, bucketId: t }),
{ sync: !0 }
)
)
],
total: a,
loaded: r.loaded,
progress: i
};
}),
removeItem: n({
files: (r) => r.files.filter((e) => {
var s, a;
const t = (s = e.getSnapshot()) == null ? void 0 : s.matches("stopped");
return t && ((a = e.stop) == null || a.call(e)), !t;
})
},
actions: {
incrementProgress: assign((context, event) => {
const loaded = context.loaded + event.additions;
const progress = Math.round(loaded * 100 / context.total);
return { ...context, loaded, progress };
}),
setUploaded: assign({
progress: (_) => 100,
loaded: ({ files }) => files.map((ref) => ref.getSnapshot()).filter((snap) => snap.matches("uploaded")).reduce((agg, curr) => {
var _a;
return agg + ((_a = curr.context.file) == null ? void 0 : _a.size);
}, 0)
}),
resetTotal: assign({
total: ({ files }) => files.map((ref) => ref.getSnapshot()).filter((snap) => !snap.matches("uploaded")).reduce((agg, curr) => {
var _a;
return agg + ((_a = curr.context.file) == null ? void 0 : _a.size);
}, 0)
}),
resetLoaded: assign({ loaded: (_) => 0 }),
startProgress: assign({ progress: (_) => 0 }),
resetProgress: assign({ progress: (_) => null }),
addItem: assign((context, { files, bucketId }) => {
const additions = files ? Array.isArray(files) ? files : "length" in files ? Array.from(files) : [files] : [];
const total = context.total + additions.reduce((agg, curr) => agg + curr.size, 0);
const progress = Math.round(context.loaded * 100 / total);
return {
files: [
...context.files,
...additions.map(
(file) => spawn(
createFileUploadMachine().withConfig({
actions: {
sendProgress: sendParent((_, { additions: additions2 }) => ({
type: "UPLOAD_PROGRESS",
additions: additions2
})),
sendDone: sendParent("UPLOAD_DONE"),
sendError: sendParent("UPLOAD_ERROR"),
sendDestroy: sendParent("REMOVE")
}
}).withContext({ ...INITIAL_FILE_CONTEXT, file, bucketId }),
{ sync: true }
)
)
],
total,
loaded: context.loaded,
progress
};
}),
removeItem: assign({
files: (context) => context.files.filter((ref) => {
var _a, _b;
const stopped = (_a = ref.getSnapshot()) == null ? void 0 : _a.matches("stopped");
if (stopped) {
(_b = ref.stop) == null ? void 0 : _b.call(ref);
}
return !stopped;
})
}),
clearList: pure(
(context) => context.files.map((ref) => send({ type: "DESTROY" }, { to: ref.id }))
),
upload: pure((context, event) => context.files.map((ref) => send(event, { to: ref.id }))),
cancel: pure(
(context) => context.files.map((ref) => send({ type: "CANCEL" }, { to: ref.id }))
)
}
}),
clearList: m(
(r) => r.files.map((e) => f({ type: "DESTROY" }, { to: e.id }))
),
upload: m((r, e) => r.files.map((t) => f(e, { to: t.id }))),
cancel: m(
(r) => r.files.map((e) => f({ type: "CANCEL" }, { to: e.id }))
)
}
);
};
const uploadFilePromise = async (nhost, interpreter, params) => new Promise((resolve) => {
interpreter.send({
}
), H = async (r, e, t) => new Promise((s) => {
e.send({
type: "UPLOAD",
url: nhost.storage.url,
accessToken: nhost.auth.getAccessToken(),
adminSecret: nhost.adminSecret,
...params
url: r.storage.url,
accessToken: r.auth.getAccessToken(),
adminSecret: r.adminSecret,
...t
}), e.subscribe((a) => {
var i;
a.matches("error") ? s({
error: a.context.error,
isError: !0,
isUploaded: !1
}) : a.matches("uploaded") && s({
error: null,
isError: !1,
isUploaded: !0,
id: a.context.id,
bucketId: a.context.id,
name: (i = a.context.file) == null ? void 0 : i.name
});
});
interpreter.subscribe((s) => {
var _a;
if (s.matches("error")) {
resolve({
error: s.context.error,
isError: true,
isUploaded: false
});
} else if (s.matches("uploaded")) {
resolve({
error: null,
isError: false,
isUploaded: true,
id: s.context.id,
bucketId: s.context.id,
name: (_a = s.context.file) == null ? void 0 : _a.name
});
}
});
});
const uploadMultipleFilesPromise = async (nhost, service, params) => new Promise((resolve) => {
service.send({
}), $ = async (r, e, t) => new Promise((s) => {
e.send({
type: "UPLOAD",
url: nhost.storage.url,
accessToken: nhost.auth.getAccessToken(),
adminSecret: nhost.adminSecret,
bucketId: params == null ? void 0 : params.bucketId,
files: params == null ? void 0 : params.files
url: r.storage.url,
accessToken: r.auth.getAccessToken(),
adminSecret: r.adminSecret,
bucketId: t == null ? void 0 : t.bucketId,
files: t == null ? void 0 : t.files
}), e.onTransition((a) => {
a.matches("error") ? s({
errors: a.context.files.filter((i) => {
var d;
return (d = i.getSnapshot()) == null ? void 0 : d.context.error;
}),
isError: !0,
files: []
}) : a.matches("uploaded") && s({ errors: [], isError: !1, files: a.context.files });
});
service.onTransition((s) => {
if (s.matches("error")) {
resolve({
errors: s.context.files.filter((ref) => {
var _a;
return (_a = ref.getSnapshot()) == null ? void 0 : _a.context.error;
}),
isError: true,
files: []
});
} else if (s.matches("uploaded")) {
resolve({ errors: [], isError: false, files: s.context.files });
}
});
});
export { HasuraStorageApi, HasuraStorageClient, INITIAL_FILE_CONTEXT, createFileUploadMachine, createMultipleFilesUploadMachine, uploadFilePromise, uploadMultipleFilesPromise };
export {
k as HasuraStorageApi,
F as HasuraStorageClient,
S as INITIAL_FILE_CONTEXT,
C as createFileUploadMachine,
N as createMultipleFilesUploadMachine,
H as uploadFilePromise,
$ as uploadMultipleFilesPromise
};
//# sourceMappingURL=index.esm.js.map
export interface Typegen0 {
'@@xstate/typegen': true;
eventsCausingActions: {
sendDestroy: 'DESTROY';
addFile: 'ADD';
incrementProgress: 'UPLOAD_PROGRESS';
sendProgress: 'UPLOAD_PROGRESS';
resetProgress: 'UPLOAD';
setFileMetadata: 'UPLOAD_DONE';
sendDone: 'UPLOAD_DONE';
setError: 'UPLOAD_ERROR';
sendError: 'UPLOAD_ERROR';
};
internalEvents: {

@@ -28,2 +17,13 @@ 'xstate.init': {

};
eventsCausingActions: {
addFile: 'ADD';
incrementProgress: 'UPLOAD_PROGRESS';
resetProgress: 'UPLOAD';
sendDestroy: 'DESTROY';
sendDone: 'UPLOAD_DONE';
sendError: 'UPLOAD_ERROR';
sendProgress: 'UPLOAD_PROGRESS';
setError: 'UPLOAD_ERROR';
setFileMetadata: 'UPLOAD_DONE';
};
eventsCausingServices: {

@@ -36,5 +36,5 @@ uploadFile: 'UPLOAD';

eventsCausingDelays: {};
matchesStates: 'idle' | 'uploading' | 'uploaded' | 'error' | 'stopped';
matchesStates: 'error' | 'idle' | 'stopped' | 'uploaded' | 'uploading';
tags: never;
}
//# sourceMappingURL=file-upload.typegen.d.ts.map
export interface Typegen0 {
'@@xstate/typegen': true;
eventsCausingActions: {
addItem: 'UPLOAD' | 'ADD';
removeItem: 'REMOVE';
clearList: 'CLEAR';
incrementProgress: 'UPLOAD_PROGRESS';
cancel: 'CANCEL';
resetProgress: 'CLEAR' | 'CANCEL';
resetLoaded: 'CLEAR' | 'CANCEL' | 'UPLOAD';
resetTotal: 'CLEAR' | 'CANCEL' | 'UPLOAD';
upload: 'UPLOAD';
startProgress: 'UPLOAD';
setUploaded: 'UPLOAD_DONE' | 'UPLOAD_ERROR';
};
internalEvents: {

@@ -28,2 +15,15 @@ 'xstate.init': {

};
eventsCausingActions: {
addItem: 'ADD' | 'UPLOAD';
cancel: 'CANCEL';
clearList: 'CLEAR';
incrementProgress: 'UPLOAD_PROGRESS';
removeItem: 'REMOVE';
resetLoaded: 'CANCEL' | 'CLEAR' | 'UPLOAD' | 'xstate.init';
resetProgress: 'CANCEL' | 'CLEAR' | 'UPLOAD' | 'xstate.init';
resetTotal: 'CANCEL' | 'CLEAR' | 'UPLOAD' | 'xstate.init';
setUploaded: 'UPLOAD_DONE' | 'UPLOAD_ERROR';
startProgress: 'UPLOAD';
upload: 'UPLOAD';
};
eventsCausingServices: {};

@@ -36,5 +36,5 @@ eventsCausingGuards: {

eventsCausingDelays: {};
matchesStates: 'idle' | 'uploading' | 'uploaded' | 'error';
matchesStates: 'error' | 'idle' | 'uploaded' | 'uploading';
tags: never;
}
//# sourceMappingURL=multiple-files-upload.typegen.d.ts.map

@@ -38,3 +38,3 @@ import { InterpreterFrom } from 'xstate';

};
export declare const uploadMultipleFilesPromise: (nhost: NhostClientReturnType, service: InterpreterFrom<MultipleFilesUploadMachine>, params?: UploadMultipleFilesActionParams | undefined) => Promise<MultipleFilesHandlerResult>;
export declare const uploadMultipleFilesPromise: (nhost: NhostClientReturnType, service: InterpreterFrom<MultipleFilesUploadMachine>, params?: UploadMultipleFilesActionParams) => Promise<MultipleFilesHandlerResult>;
//# sourceMappingURL=multiple-files-upload.d.ts.map
{
"name": "@nhost/hasura-storage-js",
"version": "0.7.1",
"version": "0.7.2",
"description": "Hasura-storage client",

@@ -43,3 +43,3 @@ "license": "MIT",

"dependencies": {
"axios": "^0.27.2",
"axios": "^1.1.3",
"form-data": "^4.0.0",

@@ -49,6 +49,6 @@ "xstate": "^4.33.5"

"peerDependencies": {
"@nhost/core": "0.9.1"
"@nhost/core": "0.9.2"
},
"devDependencies": {
"@nhost/core": "0.9.1",
"@nhost/core": "0.9.2",
"@nhost/docgen": "0.1.3",

@@ -55,0 +55,0 @@ "cross-fetch": "^3.1.5",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc