@xman.io/xman-js-sdk
Version:
Javascript/typescript SDK to access the data published using XMan.io
2 lines (1 loc) • 2.67 kB
JavaScript
import e from"axios";import{Agent as t}from"https";class r{constructor(e,t,r="live",s="https://xman.live",i){this.clientId=e,this.workspace=t,this.stageId=r,this.cdnDomain=s,this.imageBaseUrl=`${s}/i/${t}/${r}/`,this.secret=i,this._httpsClient=null}getHttpClient(){if(this._httpsClient)return this._httpsClient;const r=new t({keepAlive:!0}),s={Authorization:"Bearer "+this.clientId};return this.secret&&(s["XMAN-CLIENT-SECRET"]=this.secret),this._httpsClient=e.create({baseURL:`${this.cdnDomain}/c/${this.workspace}/${this.stageId}/`,httpsAgent:r,headers:s}),this._httpsClient}async list(t,r={}){try{return(await this.getHttpClient().get(t,{params:{...r}})).data}catch(t){throw e.isAxiosError(t)?new Error(t.message):t}}async read(t,r){var s;let i=t+"/"+r;try{return(await this.getHttpClient().get(i)).data}catch(t){if(e.isAxiosError(t)){if(404===(null===(s=t.response)||void 0===s?void 0:s.status))return null;throw new Error(t.message)}throw t}}async readReferencedItem(e){return Array.isArray(e)?0===e.length?null:this.read(e[0].collection,e[0].id):null}async readReferencedItems(e,t){if(!Array.isArray(e))return[];const r=e.filter((e=>e&&e.collection&&e.id)),s=await Promise.allSettled(r.map((e=>this.read(e.collection,e.id)))),i=s.filter((e=>"fulfilled"===e.status&&Boolean(e.value)));if(t&&s.length!==i.length){const e=s.filter((e=>"rejected"===e.status)).map((e=>{var t;return null===(t=e.reason)||void 0===t?void 0:t.message})).join(";");throw new Error(e)}return i.map((e=>e.value))}async getImages(e,t){return Promise.all(e.map((e=>this.getImage(e,t))))}async getImage(e,t=[{key:"main"}]){if(!e)throw new Error("Invalid Image Reference");const{collection:r,id:s}=e;if(!r||!s)throw new Error("Invalid Image Reference");const i=await this.read(e.collection,e.id);let a=(null==i?void 0:i.data.altText)||e.altText||e.label||"";const n=this.imageBaseUrl+e.id;return{alt:a,variations:t.reduce(((e,t)=>{const r=new URL(n),{key:s,width:i,height:a,fit:l}=t;if(!s)throw new Error("key is required for each image setting");i&&r.searchParams.set("width",`${i}`),a&&r.searchParams.set("height",`${a}`),l&&r.searchParams.set("fit",l),r.searchParams.set("xacid",this.clientId);const o={src:r.href};return i&&(o.width=i),a&&(o.height=a),{[s]:o,...e}}),{})}}}const s=(e,t,i="live",a="https://xman.live",n)=>{const l=new r(e,t,i,a,n);return{read:(e,t)=>l.read(e,t),readReferencedItem:e=>l.readReferencedItem(e),readReferencedItems:(e,t)=>l.readReferencedItems(e,t),getImages:(e,t)=>l.getImages(e,t),getImage:(e,t)=>l.getImage(e,t),list:(e,t)=>l.list(e,t),stage:(r="live")=>s(e,t,r,a,n),cdn:(r="https://xman.live")=>s(e,t,i,r,n),secret:r=>s(e,t,i,a,r)}};export{s as getWorkspace};