"use strict";(self.webpackChunkui=self.webpackChunkui||[]).push([[24],{267:(e,r,t)=>{t.d(r,{a:()=>K});const n="GraphQL Client",s=0,o=3,a="An error occurred while fetching from the API. Review 'graphQLErrors' for details.",i="Response returned unexpected Content-Type:",c="An unknown error has occurred. The API did not return a data object or any errors in its response.",u={json:"application/json",multipart:"multipart/mixed"},l="X-SDK-Variant",p="X-SDK-Version",d="shopify-graphql-client",h="1.4.1",f=1e3,y=[429,503],m=/@(defer)\b/i,w=/boundary="?([^=";]+)"?/i,g="\r\n\r\n";function b(e,r=n){return e.startsWith(`${r}`)?e:`${r}: ${e}`}function $(e){return e instanceof Error?e.message:JSON.stringify(e)}function A(e){return e instanceof Error&&e.cause?e.cause:void 0}function S(e){return e.flatMap((({errors:e})=>e??[]))}function k({client:e,retries:r}){if(void 0!==r&&("number"!=typeof r||ro))throw new Error(`${e}: The provided "retries" value (${r}) is invalid - it cannot be less than ${s} or greater than ${o}`)}function v(e,r){return r&&("object"!=typeof r||Array.isArray(r)||"object"==typeof r&&Object.keys(r).length>0)?{[e]:r}:{}}function E(e,r){if(0===e.length)return r;const t=e.pop(),n={[t]:r};return 0===e.length?n:E(e,n)}function x(e,r){return Object.keys(r||{}).reduce(((t,n)=>("object"==typeof r[n]||Array.isArray(r[n]))&&e[n]?(t[n]=x(e[n],r[n]),t):(t[n]=r[n],t)),Array.isArray(e)?[...e]:{...e})}function T([e,...r]){return r.reduce(x,{...e})}function j({headers:e,url:r,customFetchApi:t=fetch,retries:s=0,logger:o}){k({client:n,retries:s});const a={headers:e,url:r,retries:s},c=function(e){return r=>{e&&e(r)}}(o),E=function(e,{url:r,headers:t,retries:s}){return async(o,a={})=>{const{variables:i,headers:c,url:u,retries:f,keepalive:y,signal:m}=a,w=JSON.stringify({query:o,variables:i});k({client:n,retries:f});const g=Object.entries({...t,...c}).reduce(((e,[r,t])=>(e[r]=Array.isArray(t)?t.join(", "):t.toString(),e)),{});return g[l]||g[p]||(g[l]=d,g[p]=h),e([u??r,{method:"POST",headers:g,body:w,signal:m,keepalive:y}],1,f??s)}}(function({clientLogger:e,customFetchApi:r=fetch,client:t=n,defaultRetryWaitTime:s=f,retriableCodes:o=y}){const a=async(n,i,c)=>{const u=i+1,l=c+1;let p;try{if(p=await r(...n),e({type:"HTTP-Response",content:{requestParams:n,response:p}}),!p.ok&&o.includes(p.status)&&u<=l)throw new Error;const t=p?.headers.get("X-Shopify-API-Deprecated-Reason")||"";return t&&e({type:"HTTP-Response-GraphQL-Deprecation-Notice",content:{requestParams:n,deprecationNotice:t}}),p}catch(r){if(u<=l){const r=p?.headers.get("Retry-After");return await async function(e){return new Promise((r=>setTimeout(r,e)))}(r?parseInt(r,10):s),e({type:"HTTP-Retry",content:{requestParams:n,lastResponse:p,retryAttempt:i,maxRetries:c}}),a(n,u,c)}throw new Error(b(`${c>0?`Attempted maximum number of ${c} network retries. Last message - `:""}${$(r)}`,t))}};return a}({customFetchApi:t,clientLogger:c,defaultRetryWaitTime:f}),a),x=function(e){return async(...r)=>{if(m.test(r[0]))throw new Error(b("This operation will result in a streamable response - use requestStream() instead."));let t=null;try{t=await e(...r);const{status:n,statusText:s}=t,o=t.headers.get("content-type")||"";return t.ok?o.includes(u.json)?await V(t):{errors:{networkStatusCode:n,message:b(`${i} ${o}`),response:t}}:{errors:{networkStatusCode:n,message:b(s),response:t}}}catch(e){return{errors:{message:$(e),...null==t?{}:{networkStatusCode:t.status,response:t}}}}}}(E),j=function(e){return async(...r)=>{if(!m.test(r[0]))throw new Error(b("This operation does not result in a streamable response - use request() instead."));try{const t=await e(...r),{statusText:n}=t;if(!t.ok)throw new Error(n,{cause:t});const s=t.headers.get("content-type")||"";switch(!0){case s.includes(u.json):return function(e){return{async*[Symbol.asyncIterator](){const r=await V(e);yield{...r,hasNext:!1}}}}(t);case s.includes(u.multipart):return function(e,r){const t=(r??"").match(w),n=`--${t?t[1]:"-"}`;if(!e.body?.getReader&&!e.body?.[Symbol.asyncIterator])throw new Error("API multipart response did not return an iterable body",{cause:e});const s=async function*(e){const r=new TextDecoder;if(e.body[Symbol.asyncIterator])for await(const t of e.body)yield r.decode(t);else{const t=e.body.getReader();let n;try{for(;!(n=await t.read()).done;)yield r.decode(n.value)}finally{t.cancel()}}}(e);let o,a={};return{async*[Symbol.asyncIterator](){try{let e=!0;for await(const r of function(e,r){return{async*[Symbol.asyncIterator](){try{let t="";for await(const n of e)if(t+=n,t.indexOf(r)>-1){const e=t.lastIndexOf(r),n=t.slice(0,e).split(r).filter((e=>e.trim().length>0)).map((e=>e.slice(e.indexOf(g)+g.length).trim()));n.length>0&&(yield n),t=t.slice(e+r.length),"--"===t.trim()&&(t="")}}catch(e){throw new Error(`Error occured while processing stream payload - ${$(e)}`)}}}}(s,n)){const t=q(r);o=t.find((e=>e.extensions))?.extensions??o;const n=S(t);a=T([a,...t.map((({data:e})=>e))]),e=t.slice(-1)[0].hasNext,C(n,a),yield{...v("data",a),...v("extensions",o),hasNext:e}}if(e)throw new Error("Response stream terminated unexpectedly")}catch(r){const t=A(r);yield{...v("data",a),...v("extensions",o),errors:{message:b($(r)),networkStatusCode:e.status,...v("graphQLErrors",t?.graphQLErrors),response:e},hasNext:!1}}}}}(t,s);default:throw new Error(`${i} ${s}`,{cause:t})}}catch(e){return{async*[Symbol.asyncIterator](){const r=A(e);yield{errors:{message:b($(e)),...v("networkStatusCode",r?.status),...v("response",r)},hasNext:!1}}}}}}(E);return{config:a,fetch:E,request:x,requestStream:j}}async function V(e){const{errors:r,data:t,extensions:n}=await e.json();return{...v("data",t),...v("extensions",n),headers:e.headers,...r||!t?{errors:{networkStatusCode:e.status,message:b(r?a:c),...v("graphQLErrors",r),response:e}}:{}}}function q(e){return e.map((e=>{try{return JSON.parse(e)}catch(e){throw new Error(`Error in parsing multipart response - ${$(e)}`)}})).map((e=>{const{data:r,incremental:t,hasNext:n,extensions:s,errors:o}=e;if(!t)return{data:r||{},...v("errors",o),...v("extensions",s),hasNext:n};const a=t.map((({data:e,path:r,errors:t})=>({data:e&&r?E(r,e):{},...v("errors",t)})));return{data:1===a.length?a[0].data:T([...a.map((({data:e})=>e))]),...v("errors",S(a)),hasNext:n}}))}function C(e,r){if(e.length>0)throw new Error(a,{cause:{graphQLErrors:e}});if(0===Object.keys(r).length)throw new Error(c)}function P({client:e,currentSupportedApiVersions:r,apiVersion:t,logger:n}){const s=`${e}: the provided apiVersion ("${t}")`,o=`Currently supported API versions: ${r.join(", ")}`;if(!t||"string"!=typeof t)throw new Error(`${s} is invalid. ${o}`);const a=t.trim();r.includes(a)||(n?n({type:"Unsupported_Api_Version",content:{apiVersion:t,supportedApiVersions:r}}):console.warn(`${s} is likely deprecated or not supported. ${o}`))}function I(e){const r=3*e-2;return 10===r?r:`0${r}`}function N(e,r,t){const n=r-t;return n<=0?`${e-1}-${I(n+4)}`:`${e}-${I(n)}`}const R="application/json",D="storefront-api-client",O="1.0.9",L="X-Shopify-Storefront-Access-Token",U="Shopify-Storefront-Private-Token",Q="X-SDK-Variant",X="X-SDK-Version",F="X-SDK-Variant-Source",H="Storefront API Client";function K({storeDomain:e,apiVersion:r,publicAccessToken:t,privateAccessToken:n,clientName:s,retries:o=0,customFetchApi:a,logger:i}){const c=function(){const{year:e,quarter:r,version:t}=function(){const e=new Date,r=e.getUTCMonth(),t=e.getUTCFullYear(),n=Math.floor(r/3+1);return{year:t,quarter:n,version:`${t}-${I(n)}`}}(),n=4===r?`${e+1}-01`:`${e}-${I(r+1)}`;return[N(e,r,3),N(e,r,2),N(e,r,1),t,n,"unstable"]}(),u=function({client:e,storeDomain:r}){try{if(!r||"string"!=typeof r)throw new Error;const e=r.trim(),t=e.match(/^https?:/)?e:`https://${e}`,n=new URL(t);return n.protocol="https",n.origin}catch(t){throw new Error(`${e}: a valid store domain ("${r}") must be provided`,{cause:t})}}({client:H,storeDomain:e}),l={client:H,currentSupportedApiVersions:c,logger:i};P({...l,apiVersion:r}),function(e,r){if(!e&&!r)throw new Error(`${H}: a public or private access token must be provided`);if(e&&r)throw new Error(`${H}: only provide either a public or private access token`)}(t,n),function(e){if(e&&"undefined"!=typeof window)throw new Error(`${H}: private access tokens and headers should only be used in a server-to-server implementation. Use the public API access token in nonserver environments.`)}(n);const p=function(e,r,t){return n=>{n&&P({...t,apiVersion:n});const s=(n??r).trim();return`${e}/api/${s}/graphql.json`}}(u,r,l),d={storeDomain:u,apiVersion:r,...t?{publicAccessToken:t}:{privateAccessToken:n},headers:{"Content-Type":R,Accept:R,[Q]:D,[X]:O,...s?{[F]:s}:{},...t?{[L]:t}:{[U]:n}},apiUrl:p(),clientName:s},h=j({headers:d.headers,url:d.apiUrl,retries:o,customFetchApi:a,logger:i}),f=function(e){return r=>({...r??{},...e.headers})}(d),y=function(e,r){return t=>t?r(t):e.apiUrl}(d,p),m=function({getHeaders:e,getApiUrl:r}){return(t,n)=>{const s=[t];if(n&&Object.keys(n).length>0){const{variables:t,apiVersion:o,headers:a,retries:i,signal:c}=n;s.push({...t?{variables:t}:{},...a?{headers:e(a)}:{},...o?{url:r(o)}:{},...i?{retries:i}:{},...c?{signal:c}:{}})}return s}}({getHeaders:f,getApiUrl:y}),w={config:d,getHeaders:f,getApiUrl:y,fetch:(...e)=>h.fetch(...m(...e)),request:(...e)=>h.request(...m(...e)),requestStream:(...e)=>h.requestStream(...m(...e))};return Object.freeze(w)}}}]);