UNPKG

@swishapp/browser

Version:

JS library to integrate Swish into a browser environment.

128 lines (127 loc) 27.9 kB
var Ke=Object.defineProperty;var l=(e,t)=>Ke(e,"name",{value:t,configurable:!0});var Ye=Object.defineProperty,d=l((e,t)=>Ye(e,"name",{value:t,configurable:!0}),"o"),ze=d(async(e,t)=>{let r=typeof t=="function"?await t(e):t;if(r)return e.scheme==="bearer"?`Bearer ${r}`:e.scheme==="basic"?`Basic ${btoa(r)}`:r},"A"),Xe={bodySerializer:d(e=>JSON.stringify(e,(t,r)=>typeof r=="bigint"?r.toString():r),"bodySerializer")},Je=d(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}},"U"),Ze=d(e=>{switch(e){case"form":return",";case"pipeDelimited":return"|";case"spaceDelimited":return"%20";default:return","}},"_"),et=d(e=>{switch(e){case"label":return".";case"matrix":return";";case"simple":return",";default:return"&"}},"D"),ue=d(({allowReserved:e,explode:t,name:r,style:n,value:i})=>{if(!t){let s=(e?i:i.map(c=>encodeURIComponent(c))).join(Ze(n));switch(n){case"label":return`.${s}`;case"matrix":return`;${r}=${s}`;case"simple":return s;default:return`${r}=${s}`}}let a=Je(n),o=i.map(s=>n==="label"||n==="simple"?e?s:encodeURIComponent(s):V({allowReserved:e,name:r,value:s})).join(a);return n==="label"||n==="matrix"?a+o:o},"O"),V=d(({allowReserved:e,name:t,value:r})=>{if(r==null)return"";if(typeof r=="object")throw new Error("Deeply-nested arrays/objects aren\u2019t supported. Provide your own `querySerializer()` to handle these.");return`${t}=${e?r:encodeURIComponent(r)}`},"y"),pe=d(({allowReserved:e,explode:t,name:r,style:n,value:i})=>{if(i instanceof Date)return`${r}=${i.toISOString()}`;if(n!=="deepObject"&&!t){let s=[];Object.entries(i).forEach(([p,f])=>{s=[...s,p,e?f:encodeURIComponent(f)]});let c=s.join(",");switch(n){case"form":return`${r}=${c}`;case"label":return`.${c}`;case"matrix":return`;${r}=${c}`;default:return c}}let a=et(n),o=Object.entries(i).map(([s,c])=>V({allowReserved:e,name:n==="deepObject"?`${r}[${s}]`:s,value:c})).join(a);return n==="label"||n==="matrix"?a+o:o},"q"),tt=/\{[^{}]+\}/g,rt=d(({path:e,url:t})=>{let r=t,n=t.match(tt);if(n)for(let i of n){let a=!1,o=i.substring(1,i.length-1),s="simple";o.endsWith("*")&&(a=!0,o=o.substring(0,o.length-1)),o.startsWith(".")?(o=o.substring(1),s="label"):o.startsWith(";")&&(o=o.substring(1),s="matrix");let c=e[o];if(c==null)continue;if(Array.isArray(c)){r=r.replace(i,ue({explode:a,name:o,style:s,value:c}));continue}if(typeof c=="object"){r=r.replace(i,pe({explode:a,name:o,style:s,value:c}));continue}if(s==="matrix"){r=r.replace(i,`;${V({name:o,value:c})}`);continue}let p=encodeURIComponent(s==="label"?`.${c}`:c);r=r.replace(i,p)}return r},"B"),he=d(({allowReserved:e,array:t,object:r}={})=>n=>{let i=[];if(n&&typeof n=="object")for(let a in n){let o=n[a];if(o!=null){if(Array.isArray(o)){i=[...i,ue({allowReserved:e,explode:!0,name:a,style:"form",value:o,...t})];continue}if(typeof o=="object"){i=[...i,pe({allowReserved:e,explode:!0,name:a,style:"deepObject",value:o,...r})];continue}i=[...i,V({allowReserved:e,name:a,value:o})]}}return i.join("&")},"E"),nt=d(e=>{var t;if(!e)return"stream";let r=(t=e.split(";")[0])==null?void 0:t.trim();if(r){if(r.startsWith("application/json")||r.endsWith("+json"))return"json";if(r==="multipart/form-data")return"formData";if(["application/","audio/","image/","video/"].some(n=>r.startsWith(n)))return"blob";if(r.startsWith("text/"))return"text"}},"P"),ot=d(async({security:e,...t})=>{for(let r of e){let n=await ze(r,t.auth);if(!n)continue;let i=r.name??"Authorization";switch(r.in){case"query":t.query||(t.query={}),t.query[i]=n;break;case"header":default:t.headers.set(i,n);break}return}},"I"),de=d(e=>it({baseUrl:e.baseUrl,path:e.path,query:e.query,querySerializer:typeof e.querySerializer=="function"?e.querySerializer:he(e.querySerializer),url:e.url}),"S"),it=d(({baseUrl:e,path:t,query:r,querySerializer:n,url:i})=>{let a=i.startsWith("/")?i:`/${i}`,o=(e??"")+a;t&&(o=rt({path:t,url:o}));let s=r?n(r):"";return s.startsWith("?")&&(s=s.substring(1)),s&&(o+=`?${s}`),o},"W"),ce=d((e,t)=>{var r;let n={...e,...t};return(r=n.baseUrl)!=null&&r.endsWith("/")&&(n.baseUrl=n.baseUrl.substring(0,n.baseUrl.length-1)),n.headers=fe(e.headers,t.headers),n},"C"),fe=d((...e)=>{let t=new Headers;for(let r of e){if(!r||typeof r!="object")continue;let n=r instanceof Headers?r.entries():Object.entries(r);for(let[i,a]of n)if(a===null)t.delete(i);else if(Array.isArray(a))for(let o of a)t.append(i,o);else a!==void 0&&t.set(i,typeof a=="object"?JSON.stringify(a):a)}return t},"x"),G,U=(G=class{static{l(this,"C")}_fns;constructor(){this._fns=[]}clear(){this._fns=[]}exists(e){return this._fns.indexOf(e)!==-1}eject(e){let t=this._fns.indexOf(e);t!==-1&&(this._fns=[...this._fns.slice(0,t),...this._fns.slice(t+1)])}use(e){this._fns=[...this._fns,e]}},d(G,"m"),G),st=d(()=>({error:new U,request:new U,response:new U}),"T"),at=he({allowReserved:!1,array:{explode:!0,style:"form"},object:{explode:!0,style:"deepObject"}}),lt={"Content-Type":"application/json"},M=d((e={})=>({...Xe,headers:lt,parseAs:"auto",querySerializer:at,...e}),"w"),ye=d((e={})=>{let t=ce(M(),e),r=d(()=>({...t}),"e"),n=d(o=>(t=ce(t,o),r()),"a"),i=st(),a=d(async o=>{let s={...t,...o,fetch:o.fetch??t.fetch??globalThis.fetch,headers:fe(t.headers,o.headers)};s.security&&await ot({...s,security:s.security}),s.body&&s.bodySerializer&&(s.body=s.bodySerializer(s.body)),(s.body===void 0||s.body==="")&&s.headers.delete("Content-Type");let c=de(s),p={redirect:"follow",...s},f=new Request(c,p);for(let R of i.request._fns)f=await R(f,s);let m=s.fetch,h=await m(f);for(let R of i.response._fns)h=await R(h,f,s);let E={request:f,response:h};if(h.ok){if(h.status===204||h.headers.get("Content-Length")==="0")return{data:{},...E};let R=(s.parseAs==="auto"?nt(h.headers.get("Content-Type")):s.parseAs)??"json";if(R==="stream")return{data:h.body,...E};let S=await h[R]();return R==="json"&&(s.responseValidator&&await s.responseValidator(S),s.responseTransformer&&(S=await s.responseTransformer(S))),{data:S,...E}}let C=await h.text();try{C=JSON.parse(C)}catch{}let A=C;for(let R of i.error._fns)A=await R(C,h,f,s);if(A=A||{},s.throwOnError)throw A;return{error:A,...E}},"o");return{buildUrl:de,connect:d(o=>a({...o,method:"CONNECT"}),"connect"),delete:d(o=>a({...o,method:"DELETE"}),"delete"),get:d(o=>a({...o,method:"GET"}),"get"),getConfig:r,head:d(o=>a({...o,method:"HEAD"}),"head"),interceptors:i,options:d(o=>a({...o,method:"OPTIONS"}),"options"),patch:d(o=>a({...o,method:"PATCH"}),"patch"),post:d(o=>a({...o,method:"POST"}),"post"),put:d(o=>a({...o,method:"PUT"}),"put"),request:a,setConfig:n,trace:d(o=>a({...o,method:"TRACE"}),"trace")}},"J"),T=ye(M({baseUrl:"https://swish.app/api/2025-04"})),dt=d(e=>(e?.client??T).get({url:"/lists",...e}),"listControllerFind"),ct=d(e=>(e.client??T).post({url:"/lists",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"listControllerCreate"),ut=d(e=>(e.client??T).delete({url:"/lists/{listId}",...e}),"listControllerDeleteById"),pt=d(e=>(e.client??T).get({url:"/lists/{listId}",...e}),"listControllerFindById"),ht=d(e=>(e.client??T).patch({url:"/lists/{listId}",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"listControllerUpdateById"),ft=d(e=>(e.client??T).put({url:"/lists/{listId}/items/order",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"listControllerSetListItemsOrder"),yt=d(e=>(e.client??T).delete({url:"/items",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"itemControllerDelete"),mt=d(e=>(e?.client??T).get({url:"/items",...e}),"itemControllerFind"),Et=d(e=>(e.client??T).post({url:"/items",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"itemControllerCreate"),Tt=d(e=>(e.client??T).delete({url:"/items/{itemId}",...e}),"itemControllerDeleteById"),Rt=d(e=>(e.client??T).get({url:"/items/{itemId}",...e}),"itemControllerFindById"),It=d(e=>(e.client??T).patch({url:"/items/{itemId}",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"itemControllerUpdateById"),At=d(e=>(e.client??T).put({url:"/items/{itemId}/lists",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"itemControllerSetListsById"),gt=d(e=>(e?.client??T).get({url:"/profiles/accounts-version",...e}),"profileControllerCustomerAccountsVersion"),St=d(e=>(e.client??T).post({url:"/profiles/identify",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"profileControllerIdentify"),_t=d(e=>(e.client??T).post({url:"/profiles/token",...e,headers:{"Content-Type":"application/json",...e?.headers}}),"profileControllerCreateToken"),me=d(e=>new Ct(e),"createApiClient"),Ee=class{static{l(this,"L")}constructor(t){this.client=ye(M({baseUrl:"https://swish.app/api/2025-04"})),this.items={list:d(r=>this.handleRequest(mt({query:r,client:this.client})),"list"),create:d(r=>this.handleRequest(Et({body:r,client:this.client})),"create"),delete:d(r=>this.handleRequest(yt({body:{itemIds:r},client:this.client})),"delete"),findById:d(r=>this.handleRequest(Rt({path:{itemId:r},client:this.client})),"findById"),updateById:d((r,n)=>this.handleRequest(It({body:n,path:{itemId:r},client:this.client})),"updateById"),deleteById:d(r=>this.handleRequest(Tt({path:{itemId:r},client:this.client})),"deleteById"),setListsById:d((r,n)=>this.handleRequest(At({body:{listIds:n},path:{itemId:r},client:this.client})),"setListsById")},this.lists={list:d(r=>this.handleRequest(dt({query:r,client:this.client})),"list"),create:d(r=>this.handleRequest(ct({body:r,client:this.client})),"create"),findById:d((r,n)=>this.handleRequest(pt({path:{listId:r},query:n??{sort:"recently_saved"},client:this.client})),"findById"),updateById:d((r,n)=>this.handleRequest(ht({body:n,path:{listId:r},client:this.client})),"updateById"),deleteById:d(r=>this.handleRequest(ut({path:{listId:r},client:this.client})),"deleteById"),orderItems:d((r,n)=>this.handleRequest(ft({body:{itemIds:n},path:{listId:r},client:this.client})),"orderItems")},this.profiles={customerAccountsVersion:d(()=>this.handleRequest(gt({client:this.client})),"customerAccountsVersion"),createToken:d((r={})=>this.handleRequest(_t({body:r,client:this.client})),"createToken"),identify:d(r=>this.handleRequest(St({body:r,client:this.client})),"identify")},this.handleRequest=d(async r=>{let{data:n,error:i}=await r;if(i!=null&&i.error)return{data:null,error:i?.error};if(n!=null&&n.data){let a={data:n.data,error:null};return n.pageInfo&&(a.pageInfo=n.pageInfo),a}return{data:null,error:null}},"handleRequest"),this.profile=t.profile,t.authToken&&(this.authToken=t.authToken),t.config&&this.client.setConfig(t.config),this.client.interceptors.request.use(this.requestInterceptor.bind(this)),t.requestInterceptor&&this.client.interceptors.request.use(t.requestInterceptor),t.responseInterceptor&&this.client.interceptors.response.use(t.responseInterceptor)}setProfile(t){this.profile=t}setAuthToken(t){this.authToken=t}setConfig(t){this.client.setConfig(t)}requestInterceptor(t){return this.authToken&&t.headers.set("Authorization",`Bearer ${this.authToken}`),this.profile&&t.headers.set("Profile",this.profile),t}};d(Ee,"SwishClient");var Ct=Ee;var N=class{constructor(t,r=0){this.worker=t;this.rpcTimeout=r;this.worker=t,this.rpcTimeout=r,this.worker.onmessage=n=>{this.#i(n.data)}}static{l(this,"WorkerRpc")}#t=new Map;#r=new Map;#o=0;call(t,...r){let n=this.#o++;return this.worker.postMessage({type:"RPC",transactionId:n,id:t,payload:r}),new Promise((i,a)=>{let o={id:n,resolve:i,reject:a};this.rpcTimeout>0&&(o.timeoutHandle=setTimeout(()=>this.#l(o),this.rpcTimeout)),this.#r.set(n,o)})}addMethod(t,r){if(this.#t.has(t))throw new Error(`rpc handler for ${t} already registered`);this.#t.set(t,r)}removeMethod(t){this.#t.delete(t)}#i(t){let r=t;switch(r.type){case"RPC":return this.#s(r);case"INTERNAL":return this.#a(r);default:this.#e(`invalid message type ${r.type}`)}}#e(t){console.error(t),this.worker.postMessage({type:"INTERNAL",id:"ERROR",payload:t})}async#s(t){let r=this.#t.get(t.id);if(!r)return this.#e(`invalid rpc ${t.id}`);try{let n=await r(...t.payload);this.worker.postMessage({type:"INTERNAL",id:"RESOLVE_TRANSACTION",transactionId:t.transactionId,payload:n})}catch(n){this.worker.postMessage({type:"INTERNAL",id:"REJECT_TRANSACTION",transactionId:t.transactionId,payload:n})}}#a(t){let r=typeof t.transactionId=="number"?this.#r.get(t.transactionId):void 0;switch(t.id){case"RESOLVE_TRANSACTION":if(!r)return this.#e(`no pending transaction with id ${t.transactionId}`);r.resolve(t.payload),this.#n(r);break;case"REJECT_TRANSACTION":if(!r)return this.#e(`no pending transaction with id ${t.transactionId}`);r.reject(t.payload),this.#n(r);break;case"ERROR":console.error(`remote error: ${t.payload}`);break;default:this.#e(`unhandled internal message ${t.id}`);break}}#l(t){t.reject("transaction timed out"),this.#e(`transaction ${t.id} timed out`),this.#r.delete(t.id)}#n(t){typeof t.timeoutHandle<"u"&&clearTimeout(t.timeoutHandle),this.#r.delete(t.id)}};var O="GraphQL Client";var H="An error occurred while fetching from the API. Review 'graphQLErrors' for details.",j="Response returned unexpected Content-Type:",k="An unknown error has occurred. The API did not return a data object or any errors in its response.",P={json:"application/json",multipart:"multipart/mixed"},Q="X-SDK-Variant",F="X-SDK-Version",Re="shopify-graphql-client",Ie="1.4.0",v=1e3,Ae=[429,503],W=/@(defer)\b/i,Te=`\r `,ge=/boundary="?([^=";]+)"?/i,K=Te+Te;function g(e,t=O){return e.startsWith(`${t}`)?e:`${t}: ${e}`}l(g,"formatErrorMessage");function _(e){return e instanceof Error?e.message:JSON.stringify(e)}l(_,"getErrorMessage");function Y(e){return e instanceof Error&&e.cause?e.cause:void 0}l(Y,"getErrorCause");function z(e){return e.flatMap(({errors:t})=>t??[])}l(z,"combineErrors");function $({client:e,retries:t}){if(t!==void 0&&(typeof t!="number"||t<0||t>3))throw new Error(`${e}: The provided "retries" value (${t}) is invalid - it cannot be less than ${0} or greater than ${3}`)}l($,"validateRetries");function I(e,t){return t&&(typeof t!="object"||Array.isArray(t)||typeof t=="object"&&Object.keys(t).length>0)?{[e]:t}:{}}l(I,"getKeyValueIfValid");function X(e,t){if(e.length===0)return t;let n={[e.pop()]:t};return e.length===0?n:X(e,n)}l(X,"buildDataObjectByPath");function Ce(e,t){return Object.keys(t||{}).reduce((r,n)=>(typeof t[n]=="object"||Array.isArray(t[n]))&&e[n]?(r[n]=Ce(e[n],t[n]),r):(r[n]=t[n],r),Array.isArray(e)?[...e]:{...e})}l(Ce,"combineObjects");function J([e,...t]){return t.reduce(Ce,{...e})}l(J,"buildCombinedDataObject");function Z({clientLogger:e,customFetchApi:t=fetch,client:r=O,defaultRetryWaitTime:n=v,retriableCodes:i=Ae}){let a=l(async(o,s,c)=>{let p=s+1,f=c+1,m;try{if(m=await t(...o),e({type:"HTTP-Response",content:{requestParams:o,response:m}}),!m.ok&&i.includes(m.status)&&p<=f)throw new Error;let h=m?.headers.get("X-Shopify-API-Deprecated-Reason")||"";return h&&e({type:"HTTP-Response-GraphQL-Deprecation-Notice",content:{requestParams:o,deprecationNotice:h}}),m}catch(h){if(p<=f){let E=m?.headers.get("Retry-After");return await Ot(E?parseInt(E,10):n),e({type:"HTTP-Retry",content:{requestParams:o,lastResponse:m,retryAttempt:s,maxRetries:c}}),a(o,p,c)}throw new Error(g(`${c>0?`Attempted maximum number of ${c} network retries. Last message - `:""}${_(h)}`,r))}},"httpFetch");return a}l(Z,"generateHttpFetch");async function Ot(e){return new Promise(t=>setTimeout(t,e))}l(Ot,"sleep");function ee({headers:e,url:t,customFetchApi:r=fetch,retries:n=0,logger:i}){$({client:O,retries:n});let a={headers:e,url:t,retries:n},o=bt(i),s=Z({customFetchApi:r,clientLogger:o,defaultRetryWaitTime:v}),c=wt(s,a),p=Nt(c),f=Lt(c);return{config:a,fetch:c,request:p,requestStream:f}}l(ee,"createGraphQLClient");function bt(e){return t=>{e&&e(t)}}l(bt,"generateClientLogger");async function Oe(e){let{errors:t,data:r,extensions:n}=await e.json();return{...I("data",r),...I("extensions",n),headers:e.headers,...t||!r?{errors:{networkStatusCode:e.status,message:g(t?H:k),...I("graphQLErrors",t),response:e}}:{}}}l(Oe,"processJSONResponse");function wt(e,{url:t,headers:r,retries:n}){return async(i,a={})=>{let{variables:o,headers:s,url:c,retries:p,keepalive:f,signal:m}=a,h=JSON.stringify({query:i,variables:o});$({client:O,retries:p});let E=Object.entries({...r,...s}).reduce((A,[R,S])=>(A[R]=Array.isArray(S)?S.join(", "):S.toString(),A),{});return!E[Q]&&!E[F]&&(E[Q]=Re,E[F]=Ie),e([c??t,{method:"POST",headers:E,body:h,signal:m,keepalive:f}],1,p??n)}}l(wt,"generateFetch");function Nt(e){return async(...t)=>{if(W.test(t[0]))throw new Error(g("This operation will result in a streamable response - use requestStream() instead."));try{let r=await e(...t),{status:n,statusText:i}=r,a=r.headers.get("content-type")||"";return r.ok?a.includes(P.json)?Oe(r):{errors:{networkStatusCode:n,message:g(`${j} ${a}`),response:r}}:{errors:{networkStatusCode:n,message:g(i),response:r}}}catch(r){return{errors:{message:_(r)}}}}}l(Nt,"generateRequest");async function*Dt(e){let t=new TextDecoder;if(e.body[Symbol.asyncIterator])for await(let r of e.body)yield t.decode(r);else{let r=e.body.getReader(),n;try{for(;!(n=await r.read()).done;)yield t.decode(n.value)}finally{r.cancel()}}}l(Dt,"getStreamBodyIterator");function Vt(e,t){return{async*[Symbol.asyncIterator](){try{let r="";for await(let n of e)if(r+=n,r.indexOf(t)>-1){let i=r.lastIndexOf(t),o=r.slice(0,i).split(t).filter(s=>s.trim().length>0).map(s=>s.slice(s.indexOf(K)+K.length).trim());o.length>0&&(yield o),r=r.slice(i+t.length),r.trim()==="--"&&(r="")}}catch(r){throw new Error(`Error occured while processing stream payload - ${_(r)}`)}}}}l(Vt,"readStreamChunk");function Pt(e){return{async*[Symbol.asyncIterator](){yield{...await Oe(e),hasNext:!1}}}}l(Pt,"createJsonResponseAsyncIterator");function vt(e){return e.map(t=>{try{return JSON.parse(t)}catch(r){throw new Error(`Error in parsing multipart response - ${_(r)}`)}}).map(t=>{let{data:r,incremental:n,hasNext:i,extensions:a,errors:o}=t;if(!n)return{data:r||{},...I("errors",o),...I("extensions",a),hasNext:i};let s=n.map(({data:c,path:p,errors:f})=>({data:c&&p?X(p,c):{},...I("errors",f)}));return{data:s.length===1?s[0].data:J([...s.map(({data:c})=>c)]),...I("errors",z(s)),hasNext:i}})}l(vt,"getResponseDataFromChunkBodies");function $t(e,t){if(e.length>0)throw new Error(H,{cause:{graphQLErrors:e}});if(Object.keys(t).length===0)throw new Error(k)}l($t,"validateResponseData");function xt(e,t){let r=(t??"").match(ge),n=`--${r?r[1]:"-"}`;if(!e.body?.getReader&&!e.body?.[Symbol.asyncIterator])throw new Error("API multipart response did not return an iterable body",{cause:e});let i=Dt(e),a={},o;return{async*[Symbol.asyncIterator](){try{let s=!0;for await(let c of Vt(i,n)){let p=vt(c);o=p.find(m=>m.extensions)?.extensions??o;let f=z(p);a=J([a,...p.map(({data:m})=>m)]),s=p.slice(-1)[0].hasNext,$t(f,a),yield{...I("data",a),...I("extensions",o),hasNext:s}}if(s)throw new Error("Response stream terminated unexpectedly")}catch(s){let c=Y(s);yield{...I("data",a),...I("extensions",o),errors:{message:g(_(s)),networkStatusCode:e.status,...I("graphQLErrors",c?.graphQLErrors),response:e},hasNext:!1}}}}}l(xt,"createMultipartResponseAsyncInterator");function Lt(e){return async(...t)=>{if(!W.test(t[0]))throw new Error(g("This operation does not result in a streamable response - use request() instead."));try{let r=await e(...t),{statusText:n}=r;if(!r.ok)throw new Error(n,{cause:r});let i=r.headers.get("content-type")||"";switch(!0){case i.includes(P.json):return Pt(r);case i.includes(P.multipart):return xt(r,i);default:throw new Error(`${j} ${i}`,{cause:r})}}catch(r){return{async*[Symbol.asyncIterator](){let n=Y(r);yield{errors:{message:g(_(r)),...I("networkStatusCode",n?.status),...I("response",n)},hasNext:!1}}}}}}l(Lt,"generateRequestStream");function te({client:e,storeDomain:t}){try{if(!t||typeof t!="string")throw new Error;let r=t.trim(),n=r.match(/^https?:/)?r:`https://${r}`,i=new URL(n);return i.protocol="https",i.origin}catch(r){throw new Error(`${e}: a valid store domain ("${t}") must be provided`,{cause:r})}}l(te,"validateDomainAndGetStoreUrl");function x({client:e,currentSupportedApiVersions:t,apiVersion:r,logger:n}){let i=`${e}: the provided apiVersion ("${r}")`,a=`Currently supported API versions: ${t.join(", ")}`;if(!r||typeof r!="string")throw new Error(`${i} is invalid. ${a}`);let o=r.trim();t.includes(o)||(n?n({type:"Unsupported_Api_Version",content:{apiVersion:r,supportedApiVersions:t}}):console.warn(`${i} is likely deprecated or not supported. ${a}`))}l(x,"validateApiVersion");function L(e){let t=e*3-2;return t===10?t:`0${t}`}l(L,"getQuarterMonth");function re(e,t,r){let n=t-r;return n<=0?`${e-1}-${L(n+4)}`:`${e}-${L(n)}`}l(re,"getPrevousVersion");function be(){let e=new Date,t=e.getUTCMonth(),r=e.getUTCFullYear(),n=Math.floor(t/3+1);return{year:r,quarter:n,version:`${r}-${L(n)}`}}l(be,"getCurrentApiVersion");function ne(){let{year:e,quarter:t,version:r}=be(),n=t===4?`${e+1}-01`:`${e}-${L(t+1)}`;return[re(e,t,3),re(e,t,2),re(e,t,1),r,n,"unstable"]}l(ne,"getCurrentSupportedApiVersions");function oe(e){return t=>({...t??{},...e.headers})}l(oe,"generateGetHeaders");function ie({getHeaders:e,getApiUrl:t}){return(r,n)=>{let i=[r];if(n&&Object.keys(n).length>0){let{variables:a,apiVersion:o,headers:s,retries:c}=n;i.push({...a?{variables:a}:{},...s?{headers:e(s)}:{},...o?{url:t(o)}:{},...c?{retries:c}:{}})}return i}}l(ie,"generateGetGQLClientParams");var se="application/json",we="storefront-api-client",Ne="1.0.8",De="X-Shopify-Storefront-Access-Token",Ve="Shopify-Storefront-Private-Token",Pe="X-SDK-Variant",ve="X-SDK-Version",$e="X-SDK-Variant-Source",b="Storefront API Client";function xe(e){if(e&&typeof window<"u")throw new Error(`${b}: private access tokens and headers should only be used in a server-to-server implementation. Use the public API access token in nonserver environments.`)}l(xe,"validatePrivateAccessTokenUsage");function Le(e,t){if(!e&&!t)throw new Error(`${b}: a public or private access token must be provided`);if(e&&t)throw new Error(`${b}: only provide either a public or private access token`)}l(Le,"validateRequiredAccessTokens");function ae({storeDomain:e,apiVersion:t,publicAccessToken:r,privateAccessToken:n,clientName:i,retries:a=0,customFetchApi:o,logger:s}){let c=ne(),p=te({client:b,storeDomain:e}),f={client:b,currentSupportedApiVersions:c,logger:s};x({...f,apiVersion:t}),Le(r,n),xe(n);let m=qt(p,t,f),h={storeDomain:p,apiVersion:t,...r?{publicAccessToken:r}:{privateAccessToken:n},headers:{"Content-Type":se,Accept:se,[Pe]:we,[ve]:Ne,...i?{[$e]:i}:{},...r?{[De]:r}:{[Ve]:n}},apiUrl:m(),clientName:i},E=ee({headers:h.headers,url:h.apiUrl,retries:a,customFetchApi:o,logger:s}),C=oe(h),A=Bt(h,m),R=ie({getHeaders:C,getApiUrl:A});return Object.freeze({config:h,getHeaders:C,getApiUrl:A,fetch:l((...w)=>E.fetch(...R(...w)),"fetch"),request:l((...w)=>E.request(...R(...w)),"request"),requestStream:l((...w)=>E.requestStream(...R(...w)),"requestStream")})}l(ae,"createStorefrontApiClient");function qt(e,t,r){return n=>{n&&x({...r,apiVersion:n});let i=(n??t).trim();return`${e}/api/${i}/graphql.json`}}l(qt,"generateApiUrlFormatter");function Bt(e,t){return r=>r?t(r):e.apiUrl}l(Bt,"generateGetApiUrl");var D=l((e,t)=>`gid://shopify/${e}/${t}`,"shopifyIdToGid");var q=` fragment productOptionsFields on Product { id encodedVariantAvailability encodedVariantExistence variantsCount { count precision } options { id name optionValues { name swatch { color image { previewImage { url } } } firstSelectableVariant { id image { url } } } } } `,qe=` fragment productOptionsVariantFields on ProductVariant { id selectedOptions { name value } } `,Be=` query GetProductOptions($productId: ID!) { product(id: $productId) { ...productOptionsFields } } ${q} `,Ge=` query GetProductOptionsByHandle($handle: String!) { product(handle: $handle) { ...productOptionsFields } } ${q} `,Ue=` query GetProductOptionsWithVariant($productId: ID!, $variantId: ID!) { product(id: $productId) { ...productOptionsFields } variant: node(id: $variantId) { ...productOptionsVariantFields } } ${q} ${qe} `,Me=` query GetProductOptionsByHandleWithVariant( $handle: String! $variantId: ID! ) { product(handle: $handle) { ...productOptionsFields } variant: node(id: $variantId) { ...productOptionsVariantFields } } ${q} ${qe} `,He=` fragment selectedVariantFields on Product { id title handle variantBySelectedOptions(selectedOptions: $selectedOptions) { id availableForSale compareAtPrice { amount currencyCode } currentlyNotInStock image { url } price { amount currencyCode } title selectedOptions { name value } } } `,je=` query GetSelectedVariant( $productId: ID! $selectedOptions: [SelectedOptionInput!]! ) { product(id: $productId) { ...selectedVariantFields } } ${He} `,ke=` query GetSelectedVariantByHandle( $handle: String! $selectedOptions: [SelectedOptionInput!]! ) { product(handle: $handle) { ...selectedVariantFields } } ${He} `;var Qe=l(async({productId:e,productHandle:t,variantId:r})=>{if(!e&&!t)throw new Error("Either productId or handle must be provided");let n=l(()=>{if(e&&!r)return Be;if(t&&!r)return Ge;if(e&&r)return Ue;if(t&&r)return Me},"getProductOptionsQuery"),i=l(()=>{if(e&&!r)return{productId:D("Product",e)};if(t&&!r)return{handle:t};if(e&&r)return{productId:D("Product",e),variantId:D("ProductVariant",r)};if(t&&r)return{handle:t,variantId:D("ProductVariant",r)}},"getVariables"),a=n(),o=i();if(!o||!a)throw new Error("Invalid query arguments");return B(a,o)},"loadProductOptions");var Fe=l(async({productId:e,productHandle:t,selectedOptions:r})=>{if(!e&&!t)throw new Error("Either productId or handle must be provided");let n=e?je:ke,i=e?{productId:`gid://shopify/Product/${e}`,selectedOptions:r}:{handle:t,selectedOptions:r};return B(n,i)},"loadSelectedVariant");var Gt="2025-04",le=null,We=l(e=>{le=ae({storeDomain:e.storeDomain,publicAccessToken:e.accessToken,apiVersion:Gt})},"setConfig"),B=l(async(e,t)=>{if(!le)throw new Error("Storefront API client not initialized");let r=await le.request(e,{variables:t});return{data:r.data,error:r.errors??null}},"queryStorefrontApi");var y=new N(self),u=me({responseInterceptor:l(e=>{let t=e.headers.get("Set-Profile");return t?y.call("storeProfile",t):t===""&&y.call("deleteProfile"),e},"responseInterceptor")});y.addMethod("api.setConfig",u.setConfig.bind(u));y.addMethod("api.setProfile",u.setProfile.bind(u));y.addMethod("api.items.list",u.items.list.bind(u));y.addMethod("api.items.create",u.items.create.bind(u));y.addMethod("api.items.delete",u.items.delete.bind(u));y.addMethod("api.items.findById",u.items.findById.bind(u));y.addMethod("api.items.deleteById",u.items.deleteById.bind(u));y.addMethod("api.items.updateById",u.items.updateById.bind(u));y.addMethod("api.lists.list",u.lists.list.bind(u));y.addMethod("api.lists.findById",u.lists.findById.bind(u));y.addMethod("api.lists.create",u.lists.create.bind(u));y.addMethod("api.lists.deleteById",u.lists.deleteById.bind(u));y.addMethod("api.lists.updateById",u.lists.updateById.bind(u));y.addMethod("api.lists.orderItems",u.lists.orderItems.bind(u));y.addMethod("api.profiles.customerAccountsVersion",u.profiles.customerAccountsVersion.bind(u));y.addMethod("api.profiles.createToken",u.profiles.createToken.bind(u));y.addMethod("api.profiles.identify",u.profiles.identify.bind(u));y.addMethod("storefront.setConfig",We);y.addMethod("storefront.loadProductOptions",Qe);y.addMethod("storefront.loadSelectedVariant",Fe);