UNPKG

@commercelayer/sdk-utils

Version:
2 lines (1 loc) 14.7 kB
var V=e=>{throw TypeError(e)};var X=(e,r,t)=>r.has(e)||V("Cannot "+t);var q=(e,r,t)=>(X(e,r,"read from private field"),t?t.call(e):r.get(e)),W=(e,r,t)=>r.has(e)?V("Cannot add the same private member more than once"):r instanceof WeakSet?r.add(e):r.set(e,t),K=(e,r,t,i)=>(X(e,r,"write to private field"),i?i.call(e,t):r.set(e,t),t);var S,F=class{constructor(){W(this,S)}set sdk(r){if(r==null)throw Error("Invalid Commerce Layer client provided");K(this,S,r)}get sdk(){if(!q(this,S))throw Error("CommerceLayer Utils not initialized");return q(this,S)}};S=new WeakMap;var Y=new F,Z=e=>{if(e)if(e.application)Y.sdk=e;else throw Error("Only SDK 6 client is supported");return Y},T=Z;var y={api:{page_max_size:25},exports:{max_size:1e4,queue_size:10},cleanups:{max_size:1e4,queue_size:10},imports:{max_size:1e4,queue_size:10},webhooks:{signature:{algorithm:"sha256",digest:"base64",header:"x-commercelayer-signature"},topic:"x-commercelayer-topic",jsonapi:{maxResourceIncluded:2}}};var k=e=>{if(!e)throw new Error("Unable to find rate limit headers in response");return{interval:Number(e["x-ratelimit-interval"]),limit:Number(e["x-ratelimit-limit"]),remaining:Number(e["x-ratelimit-remaining"])}},P=(e,r,t,i)=>{let a=i||"test",o=10*1e3,s=a==="live"?50:25,u=typeof r=="string"?r:r.resourceType,n={limit:e.limit,interval:e.interval,delay:0},c=t||e?.limit*2||0;if(e){let l=typeof c=="number"?c:c.length;n.requests=l,l>=e.limit?n.delay=Math.ceil(e.interval*1e3/e.limit):(typeof c=="number"?l:c.filter(d=>d.resourceType===u).length)>=s&&(n.delay=Math.ceil(o/s))}return n};import{CommerceLayerStatic as xe}from"@commercelayer/sdk";var h=async e=>new Promise(r=>setTimeout(r,e)),N=()=>{let e=Math.trunc(Math.random()*46656),r=Math.trunc(Math.random()*46656),t=("000"+e.toString(36)).slice(-3),i=("000"+r.toString(36)).slice(-3);return t+i},ee=e=>xe.isApiError(e)&&e.status===401&&e.first().code==="INVALID_TOKEN";var re=async(e,r)=>{let t=T().sdk,i=t[e],a=t.addRawResponseReader({headers:!0}),o=null,s=null,u=null,n=(r?.limit||0)>0?r?.limit:void 0;n&&r&&delete r.limit;let c=r||{};c.pageNumber=1,c.pageSize=y.api.page_max_size,c.sort=["id"],c.filters||(c.filters={});do{s&&(c.filters.id_gt=s),u&&await h(u.delay);let m=await i.list(c);if(o===null?o=m:o.push(...m),s=m.last()?.id,!u)try{let d=k(a.headers);u=P(d,e,o.pageCount),u&&t.removeRawResponseReader()}catch{}}while(o.length<Math.min(n||o.recordCount,o.recordCount));n&&o.splice(n,o.length-n);let l=o.meta;return delete l.currentPage,o},te=async(e,r,t)=>{let i=T().sdk,a=i[e],o=i.addRawResponseReader({headers:!0}),s={total:0,processed:0,errors:0,resources:{}},u=null,n=null,c=t||{};c.pageNumber=1,c.pageSize=y.api.page_max_size,c.sort=["id"],c.filters||(c.filters={});do{u&&(c.filters.id_gt=u),n&&await h(n.delay);let l=await a.list(c);if(u||(s.total=l.recordCount),!n)try{let m=k(o.headers);n=P(m,e,s.total+l.pageCount),n&&i.removeRawResponseReader()}catch{}for(let m of l){s.resources[m.id]={success:!1};let d=s.resources[m.id];try{let R={...r,id:m.id,type:e};n&&await h(n.delay),await a.update(R),s.processed++,d.success=!0}catch(R){s.errors++,i.isApiError(R)&&(d.error=R),d.errorMessage=R.message}}u=l.last()?.id}while(s.processed+s.errors<s.total);return s},be=async(e,r)=>{let t=T().sdk,i=t[e],a=t.addRawResponseReader({headers:!0}),o={total:0,processed:0,errors:0,resources:{}},s=null,u=null,n=r||{};n.pageNumber=1,n.pageSize=y.api.page_max_size,n.sort=["id"],n.filters||(n.filters={});do{s&&(n.filters.id_gt=s),u&&await h(u.delay);let c=await i.list(n);if(s||(o.total=c.recordCount),!u)try{let l=k(a.headers);u=P(l,e,o.total+c.pageCount),u&&t.removeRawResponseReader()}catch{}for(let l of c){o.resources[l.id]={success:!1};let m=o.resources[l.id];try{u&&await h(u.delay),await i.delete(l.id),o.processed++,m.success=!0}catch(d){o.errors++,t.isApiError(d)&&(m.error=d),m.errorMessage=d.message}}s=c.last()?.id}while(o.processed+o.errors<o.total);return o},he={retrieveAll:re,updateAll:te};var oe=e=>JSON.parse(atob(e.split(".")[1]));var se=typeof process>"u"?void 0:process.env.CL_SDK_TEST,f=typeof process>"u"?void 0:process.env.CL_SDK_DEBUG,Te=se?950:1e3,ke=se?475:500,Ce=async(e,r)=>{let t=0,i=T().sdk,a=i[e],o=null,s={fields:r?.fields,filters:r?.filters,sort:r?.sort,include:r?.include},n=oe(i.currentAccessToken).test?ke:Te;f&&console.log("maxPageSize: "+n);let c=Math.max(1,r?.pageSize||1);if(f&&console.log("pageSize: "+c),c>n)throw new Error(`Page size exceeds the maximum allowed of ${n}: [${c}]`);f&&console.log("requests: "+ ++t);let l=await a.count(s);f&&console.log("recordCount: "+l);let m=Math.max(1,r?.pageNumber||1);f&&console.log("pageNumber: "+m);let d=Math.ceil(l/c);if(m>d)throw new Error(`Page number greater than the last page number ${d}: [${m}]`);if(c<=y.api.page_max_size)s.pageSize=c,s.pageNumber=m,f&&console.log("requests: "+ ++t),o=await a.list(s);else{let R=y.api.page_max_size;s.pageSize=R;let _=c*(m-1)+1,w=Math.min(_+c-1,l);f&&console.log("recordStart: "+_),f&&console.log("recordEnd: "+w);let C=Math.ceil(_/R),L=Math.ceil(w/R);f&&console.log("pageStartApi: "+C),f&&console.log("pageEndApi: "+L);for(let I=C;I<=L;I++){s.pageNumber=I,f&&console.log("FOR requests: "+ ++t);let H=await a.list(s);o===null?o=H:o.push(...H)}if(!o)throw new Error(`Error retrieving ${e} page`);if(f&&console.log("result.length: "+o.length),o.length===0)return o;f&&console.log("requests: "+ ++t),f&&console.log("requests: "+ ++t);let g=(await a.list({...s,pageNumber:_,pageSize:1})).first(),J=(await a.list({...s,pageNumber:w,pageSize:1})).first();f&&console.log("firstResource: "+g?.id),f&&console.log("lastResource: "+J?.id);let z=o.findIndex(I=>I.id===g?.id),v=o.findIndex(I=>I.id===J?.id);f&&console.log("firstResourceIdx: "+z),f&&console.log("lastResourceIdx: "+v),o.splice(v+1),f&&console.log("End trim - result.length: "+o.length),o.splice(0,z),f&&console.log("Start trim - result.length: "+o.length);let A=o.meta;A.recordsPerPage=c,A.currentPage=m,A.pageCount=d,f&&console.log(A),f&&console.log("requests: "+ ++t)}return o};var U=class extends Error{constructor(r){super(r.first().detail),this.cause=r}},Pe=e=>e.resource&&["create","retrieve","update","delete"].includes(e.operation),ie=(e,r,t)=>{t&&(e.rateLimits||(e.rateLimits={}),Object.assign(e.rateLimits||{},{[r.resourceType]:{[r.operation]:t}}));let i=e.rateLimits?.[r.resourceType];return i?i[r.operation]:void 0},ae=async(e,r,t={})=>{let i=e[r.resourceType],a;try{if(r.executed=!1,!i[r.operation])throw new Error(`Unsupported operation [resource: ${r.resourceType}, operation: ${r.operation}]`);switch(r.operation){case"list":{a=await i[r.operation](r.params,r.options);break}case"delete":{await i[r.operation](r.resource,r.options);break}case"create":case"retrieve":case"update":{a=await i[r.operation](r.resource,r.params,r.options);break}}r.onSuccess||(r.onSuccess={});let s=r.onSuccess;if(s.result=a,s.callback)try{await s.callback(s.result,r)}catch{}return a}catch(o){if(ee(o))throw new U(o);r.onFailure||(r.onFailure={});let s=r.onFailure;s.error=o;let u=t.haltOnError||s.haltOnError;if(s.errorHandler)try{u=u||await s.errorHandler(s.error,r)}catch{}if(u)throw o}finally{r.executed=!0}},_e=(e,r)=>{},ne=async e=>{let r=T().sdk,t=r.addRawResponseReader({headers:!0});e.running=!1;let i={startedAt:new Date},a=-1,o;for(let s of e.tasks){a++,e.running=!0,e.runningTask=s.label||String(a);let u=ie(e,s);u&&await h(u.delay);try{if(o&&Pe(s)){let n;try{s.resource&&s.prepareResource?n=await s.prepareResource(s.resource,o):n=await _e(s.resource,o)}catch{n=void 0}n&&(s.resource=n)}o=void 0,o=await ae(r,s,e.options)}catch(n){if(n instanceof U&&e.options?.refreshToken){let c=await e.options.refreshToken(n,s);r.config({accessToken:c}),await ae(r,s,e.options)}else throw n}finally{e.running=!1,e.runningTask=void 0}if(!u)try{let n=k(t.headers);u=P(n,s,e.tasks),ie(e,s,u)}catch{}}return r&&t&&r.removeRawResponseReader(),i.finishedAt=new Date,i},Le={execute:ne};var ce=(e,r,t)=>{let i=[];if(!e?.inputs||e.inputs.length===0)return i;let a=t?.noGroupId?void 0:N(),o=t?.size,s=o?Math.min(Math.max(1,o),y[r].max_size):y[r].max_size,u=e.inputs,n=Math.ceil(u.length/s),c=0;for(;u.length>0;){c++;let l={...e,inputs:u.splice(0,s),metadata:{...e.metadata}};a&&(l.reference=`${a}-${c}`),t?.noMetadata||(l.metadata||(l.metadata={}),l.metadata.progress_number=`${c}/${n}`,a&&(l.metadata.group_id=a)),i.push(l)}return i},D=async(e,r,t)=>{let i=T().sdk,a=i.addRawResponseReader({headers:!0}),o=i[e.resource_type],s=t?.size,u=s?Math.min(Math.max(1,s),y[r].max_size):y[r].max_size,n=t?.delay,c=await o.count({filters:e.filters,pageSize:1,pageNumber:1});if(!n){let C=k(a.headers);n=P(C,r).delay}i.removeRawResponseReader();let l=Math.ceil(c/u),m=[],d=t?.noGroupId?void 0:N(),R=null,_=null,w=0;for(let C=0;C<l;C++){let L=C+1,g={...e,filters:{...e.filters},metadata:{...e.metadata}};d&&(g.reference=`${d}-${L}`),g.filters||(g.filters={}),t?.noMetadata||(g.metadata||(g.metadata={}),g.metadata.progress_number=`${L}/${l}`,d&&(g.metadata.group_id=d));let J=1,z=Math.min(u,c-u*C),v=Math.ceil(z/J);w+=v,await h(n),_=(await o.list({filters:e.filters,pageSize:J,pageNumber:w,sort:{id:"asc"}})).last()?.id,R&&(g.filters.id_gt=R),L<l&&(g.filters.id_lteq=_),m.push(g),R=_}return m},E=(e,r,t)=>e.map(i=>{let a={operation:"create",resourceType:r,resource:{...i}};return t&&(a.onFailure=t.onFailure,a.onSuccess=t.onSuccess,a.params=t.params,a.options=t.options),a}),Ie=e=>!e.status||["pending","in_progress"].includes(e.status),we=e=>e.filter(r=>Ie(r)).length,ue=e=>["completed","interrupted"].includes(e.status),Se=e=>e.filter(r=>ue(r)).length,O=async(e,r,t)=>{let a=T().sdk,o=a.addRawResponseReader({headers:!0}),s=a[r],u=[],n=t?.queueLength||y[r].queue_size||e.length,c=-1;do{for(;we(u)<n&&u.length<e.length;){let l=await s.create(e[u.length]);if(u.push(l),c<0){let m=k(o.headers);c=P(m,r).delay,a.removeRawResponseReader()}else await h(c)}for(let l of u){if(ue(l))continue;await h(c);let m=await s.retrieve(l);Object.assign(l,m)}await h(1e3)}while(Se(u)<e.length);return u};var Q=async(e,r)=>D(e,"cleanups",r),pe=(e,r)=>E(e,"cleanups",r),Ee=async(e,r)=>O(e,"cleanups",r),le=async(e,r)=>{let t=await Q(e,r);return Ee(t,r)},Oe={split:Q,execute:le,toBatchTasks:pe};var $=async(e,r)=>D(e,"exports",r),me=(e,r)=>E(e,"exports",r),Je=async(e,r)=>O(e,"exports",r),de=async(e,r)=>{let t=await $(e,r);return Je(t,r)},Ae={split:$,execute:de,toBatchTasks:me};var j=(e,r)=>ce(e,"imports",r),fe=(e,r)=>E(e,"imports",r),ze=async(e,r)=>O(e,"imports",r),ye=async(e,r)=>{let t=j(e,r);return ze(t,r)},ve={split:j,execute:ye,toBatchTasks:fe};import{CommerceLayerStatic as Ue}from"@commercelayer/sdk";import De from"crypto";var Be=e=>{let r;try{r=JSON.parse(e)}catch(t){throw new Error(`Error parsing payload [${t.message}]`)}if(!Ue.resources().includes(r.data?.type))throw new Error(`Invalid resource type [${r.data?.type}]`);return r},G=e=>{let r,t=Be(e);t.links&&delete t.links;let i=t.data,a=t.included;return i?Array.isArray(i)?r=i.map(o=>B(o,a)):r=B(i,a):r=i,r},Re=(e,r=[])=>r.find(i=>e.id===i.id&&e.type===i.type)||e,B=(e,r,t=[])=>{if(!e)return e;let i={id:e.id,type:e.type,...e.attributes};return e.relationships&&Object.keys(e.relationships).forEach(a=>{let o=e.relationships[a].data;o?(t.filter(s=>s.id===o.id&&s.type===o.type).length>=y.webhooks.jsonapi.maxResourceIncluded&&(i[a]=o),Array.isArray(o)?i[a]=o.map(s=>B(Re(s,r),r,[...t,s])):i[a]=B(Re(o,r),r,[...t,o])):o===null&&(i[a]=null)}),i},Me=(e,r)=>{let{algorithm:t,digest:i}=y.webhooks.signature;return De.createHmac(t,r).update(e).digest(i)},ge=(e,r,t)=>{let i={ok:!1};try{let a=typeof r=="string"?void 0:r[y.webhooks.topic],o=typeof r=="string"?r:r[y.webhooks.signature.header];if(!t)return{...i,message:"Missing shared secret"};if(!o)return{...i,message:"Missing webhook signature"};let s=Me(e,t);i.topic=a,o===s?(i.ok=!0,i.message="Signature successfully checked"):i.message="Payload signature verification failed"}catch(a){i.ok=!1,i.message=a.message}return i},M=class extends Error{constructor(r){super(r),this.name="ParseError"}},p=(e,r)=>{try{let t=G(e),i=t.type;if(i!==r)throw new M(`Invalid resource type [${i}]`);return t}catch(t){throw new M(`Payload parse error [${t.message}]`)}},qe={addresses(e){return p(e,"addresses")},authorizations(e){return p(e,"authorizations")},avalara_accounts(e){return p(e,"avalara_accounts")},bundles(e){return p(e,"bundles")},buy_x_pay_y_promotions(e){return p(e,"buy_x_pay_y_promotions")},captures(e){return p(e,"captures")},cleanups(e){return p(e,"cleanups")},coupons(e){return p(e,"coupons")},customer_addresses(e){return p(e,"customer_addresses")},customer_password_resets(e){return p(e,"customer_password_resets")},customer_subscriptions(e){return p(e,"customer_subscriptions")},customers(e){return p(e,"customers")},exports(e){return p(e,"exports")},external_promotions(e){return p(e,"external_promotions")},fixed_amount_promotions(e){return p(e,"fixed_amount_promotions")},fixed_price_promotions(e){return p(e,"fixed_price_promotions")},free_gift_promotions(e){return p(e,"free_gift_promotions")},free_shipping_promotions(e){return p(e,"free_shipping_promotions")},gift_cards(e){return p(e,"gift_cards")},imports(e){return p(e,"imports")},in_stock_subscriptions(e){return p(e,"in_stock_subscriptions")},line_items(e){return p(e,"line_items")},line_items_options(e){return p(e,"line_items_options")},orders(e){return p(e,"orders")},order_copies(e){return p(e,"order_copies")},order_subscriptions(e){return p(e,"order_subscriptions")},parcels(e){return p(e,"parcels")},percentage_discount_promotions(e){return p(e,"percentage_discount_promotions")},price_frequency_tiers(e){return p(e,"price_frequency_tiers")},price_volume_tiers(e){return p(e,"price_volume_tiers")},promotions(e){return p(e,"promotions")},recurring_order_copies(e){return p(e,"recurring_order_copies")},refunds(e){return p(e,"refunds")},returns(e){return p(e,"returns")},shipments(e){return p(e,"shipments")},shipping_weight_tiers(e){return p(e,"shipping_weight_tiers")},skus(e){return p(e,"skus")},sku_options(e){return p(e,"sku_options")},stock_transfers(e){return p(e,"stock_transfers")},transactions(e){return p(e,"transactions")},voids(e){return p(e,"voids")}},Fe={denormalizePayload:G,checkSignature:ge,parse:qe};export{Z as CommerceLayerUtils,he as all,Le as batch,ge as checkSignature,Oe as cleanups,pe as cleanupsToBatchTasks,T as default,be as deleteAll,G as denormalizePayload,ne as executeBatch,le as executeCleanup,de as executeExport,ye as executeImport,me as exportsToBatchTasks,Ae as exportz,k as headerRateLimits,ve as imports,fe as importsToBatchTasks,re as retrieveAll,Ce as retrievePage,Q as splitCleanup,$ as splitExport,j as splitImport,te as updateAll,Fe as webhooks};