@shopify/hydrogen 2024.7.2 → 2024.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,21 +5,21 @@ var react = require('react');
5
5
  var react$1 = require('@remix-run/react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var cookie = require('worktop/cookie');
8
- var Ma = require('content-security-policy-builder');
8
+ var $n = require('content-security-policy-builder');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
- var Ma__default = /*#__PURE__*/_interopDefault(Ma);
12
+ var $n__default = /*#__PURE__*/_interopDefault($n);
13
13
 
14
- var Yr=Object.defineProperty;var Xr=(e,t)=>()=>(e&&(t=e(e=0)),t);var Zr=(e,t)=>{for(var r in t)Yr(e,r,{get:t[r],enumerable:!0});};var rr={};Zr(rr,{default:()=>er,logSeoTags:()=>tr});function er({headTags:e}){return tr(e),null}function tr(e){console.log(" "),console.log("%cSEO Meta Tags",`${Io}`),console.log(" "),e.forEach(t=>{if(t.tag==="script"){if(console.log("%c\u2022 JSON LD ",yt),t.children)try{console.table(JSON.parse(t.children),["name","content"]);}catch{console.log(t.children);}}else {if(console.log(`%c\u2022 ${t.tag} `,yt),t.children)if(typeof t.children=="string")console.log(`\u21B3 ${t.children}`);else try{Object.entries(JSON.parse(t.children)).map(([r,o])=>console.log(`\u21B3 ${o}`));}catch{console.log(t.children);}if(t.props.property==="og:image:url"){let r=t.props.content;bo(r).then(o=>{let a=`font-size: 400px; padding: 10px; background: white url(${o}) no-repeat center; background-size: contain;`;console.log("%c\u2022 Share image preview",yt),console.log("%c ",a),console.log(`\u21B3 ${r}`);}).catch(o=>{console.error(o);});}Object.entries(t.props).map(([r,o])=>{console.log(`\u21B3 ${r} \u2192 ${o}`);});}console.log(" ");});}async function bo(e){let o=await(await(await fetch(e)).blob()).arrayBuffer();return `data:image/png;base64,${wo(o)}`}function wo(e){let t="",r=new Uint8Array(e),o=r.byteLength;for(let a=0;a<o;a++)t+=String.fromCharCode(r[a]);return btoa(t)}var yt,Io,or=Xr(()=>{yt="text-transform: uppercase;",Io="text-transform: uppercase; font-weight: bold; text-transform: uppercase;font-weight: bold";});var Ee="public",eo="private",je="no-store",_t={maxAge:"max-age",staleWhileRevalidate:"stale-while-revalidate",sMaxAge:"s-maxage",staleIfError:"stale-if-error"};function fe(e){let t=[];return Object.keys(e).forEach(r=>{r==="mode"?t.push(e[r]):_t[r]&&t.push(`${_t[r]}=${e[r]}`);}),t.join(", ")}function Ke(){return {mode:je}}function ze(e){if(e?.mode&&e?.mode!==Ee&&e?.mode!==eo)throw Error("'mode' must be either 'public' or 'private'")}function J(e){return ze(e),{mode:Ee,maxAge:1,staleWhileRevalidate:9,...e}}function Je(e){return ze(e),{mode:Ee,maxAge:3600,staleWhileRevalidate:82800,...e}}function ae(e){return ze(e),{mode:Ee,maxAge:1,staleWhileRevalidate:86399,...e}}function Ye(e){return e}function Y(e){return String(e).includes("__proto__")?JSON.parse(e,to):JSON.parse(e)}function to(e,t){if(e!=="__proto__")return t}function Oe(e,t){return e&&t?{...e,...t}:e||ae()}function Xe(e){return fe(Oe(e))}async function ro(e,t){if(!e)return;let r=await e.match(t);if(!r){return}return r}async function oo(e,t,r,o){if(!e)return;let a=Oe(o),n=Xe(Oe(a,{maxAge:(a.maxAge||0)+(a.staleWhileRevalidate||0)})),i=Xe(Oe(a));r.headers.set("cache-control",n),r.headers.set("real-cache-control",i),r.headers.set("cache-put-date",String(Date.now())),await e.put(t,r);}async function ao(e,t){e&&await e.delete(t);}function no(e,t){let r=e.headers.get("real-cache-control"),o=0;if(r){let n=r.match(/max-age=(\d*)/);n&&n.length>1&&(o=parseFloat(n[1]));}return [(Date.now()-Number(t))/1e3,o]}function io(e,t){let r=t.headers.get("cache-put-date");if(!r)return !1;let[o,a]=no(t,r),n=o>a;return n}var De={get:ro,set:oo,delete:ao,generateDefaultCacheControlHeader:Xe,isStale:io};function me(e){return `https://shopify.dev/?${e}`}function so(e){return e||ae()}async function Ut(e,t){if(!e)return;let r=me(t),o=new Request(r),a=await De.get(e,o);if(!a)return;let n=await a.text();try{return [Y(n),a]}catch{return [n,a]}}async function Nt(e,t,r,o){if(!e)return;let a=me(t),n=new Request(a),i=new Response(JSON.stringify(r));await De.set(e,n,i,so(o));}function Vt(e,t){return De.isStale(new Request(me(e)),t)}function Mt(e){let t=Array.isArray(e)?e:[e],r="";for(let o of t)o!=null&&(typeof o=="object"?r+=JSON.stringify(o):r+=o.toString());return encodeURIComponent(r)}var Ze=new Set;async function xe(e,t,{strategy:r=J(),cacheInstance:o,shouldCacheResult:a=()=>!0,waitUntil:n,debugInfo:i}){let c=Mt([...typeof e=="string"?[e]:e]),y=f=>{({displayName:f.displayName,url:f.response?.url,responseInit:{status:f.response?.status||0,statusText:f.response?.statusText||"",headers:Array.from(f.response?.headers.entries()||[])}});},d=void 0;if(!o||!r||r.mode===je){let f=await t({addDebugData:y});return f}let p=f=>Nt(o,c,{value:f,debugInfo:void 0},r),h=await Ut(o,c);if(h&&typeof h[0]!="string"){let[{value:f,debugInfo:v},I]=h;let _=Vt(c,I)?"STALE":"HIT";if(!Ze.has(c)&&_==="STALE"){Ze.add(c);let U=Promise.resolve().then(async()=>{let re=Date.now();try{let N=await t({addDebugData:y});a(N)&&(await p(N),d?.({result:N,cacheStatus:"PUT",overrideStartTime:re}));}catch(N){N.message&&(N.message="SWR in sub-request failed: "+N.message),console.error(N);}finally{Ze.delete(c);}});n?.(U);}return f}let g=await t({addDebugData:y});if(a(g)){let f=Promise.resolve().then(async()=>{await p(g);});n?.(f);}return g}function Ft(e,t){return [e,{status:t.status,statusText:t.statusText,headers:Array.from(t.headers.entries())}]}function $t([e,t]){return [e,new Response(e,t)]}var qt=(e,t)=>!e?.errors&&t.status<400;async function Ht(e,t,{cacheInstance:r,cache:o,cacheKey:a=[e,t],shouldCacheResponse:n=()=>!0,waitUntil:i,returnType:u="json",debugInfo:c}={}){return !o&&(!t.method||t.method==="GET")&&(o=J()),xe(a,async()=>{let s=await fetch(e,t),l;try{l=await s[u]();}catch{try{l=await s.text();}catch{return Ft("",s)}}return Ft(l,s)},{cacheInstance:r,waitUntil:i,strategy:o??null,debugInfo:c,shouldCacheResult:s=>n(...$t(s))}).then($t)}var et="Custom-Storefront-Request-Group-ID",tt="X-Shopify-Storefront-Access-Token",rt="X-SDK-Variant",ot="X-SDK-Variant-Source",at="X-SDK-Version";function Qt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`weak-${Math.random().toString(16).substring(2)}`}var Bt=new Set,Wt=e=>{Bt.has(e)||(console.warn(e),Bt.add(e));},Gt=new Set,nt=e=>{Gt.has(e)||(console.error(new Error(e)),Gt.add(e));};var he="2024.7.2";function ne(e){return e.replace(/\s*#.*$/gm,"").replace(/\s+/gm," ").trim()}var co=/(^|}\s)query[\s({]/im,uo=/(^|}\s)mutation[\s({]/im;function ke(e,t){if(!co.test(e))throw new Error(`[h2:error:${t}] Can only execute queries`)}function Le(e,t){if(!uo.test(e))throw new Error(`[h2:error:${t}] Can only execute mutations`)}var X=class extends Error{locations;path;extensions;constructor(t,r={}){let a=(r.clientOperation?`[h2:error:${r.clientOperation}] `:"")+t+(r.requestId?` - Request ID: ${r.requestId}`:"");super(a),this.name="GraphQLError",this.extensions=r.extensions,this.locations=r.locations,this.path=r.path,this.stack=r.stack||void 0;try{this.cause=JSON.stringify({...typeof r.cause=="object"?r.cause:{},requestId:r.requestId});}catch{r.cause&&(this.cause=r.cause);}}get[Symbol.toStringTag](){return this.name}toString(){let t=`${this.name}: ${this.message}`;if(this.path)try{t+=` | path: ${JSON.stringify(this.path)}`;}catch{}if(this.extensions)try{t+=` | extensions: ${JSON.stringify(this.extensions)}`;}catch{}return t+=`
14
+ var no=Object.defineProperty;var ao=(e,t)=>()=>(e&&(t=e(e=0)),t);var so=(e,t)=>{for(var r in t)no(e,r,{get:t[r],enumerable:!0});};var cr={};so(cr,{default:()=>sr,logSeoTags:()=>ir});function sr({headTags:e}){return ir(e),null}function ir(e){console.log(" "),console.log("%cSEO Meta Tags",`${Do}`),console.log(" "),e.forEach(t=>{if(t.tag==="script"){if(console.log("%c\u2022 JSON LD ",ft),t.children)try{console.table(JSON.parse(t.children),["name","content"]);}catch{console.log(t.children);}}else {if(console.log(`%c\u2022 ${t.tag} `,ft),t.children)if(typeof t.children=="string")console.log(`\u21B3 ${t.children}`);else try{Object.entries(JSON.parse(t.children)).map(([r,o])=>console.log(`\u21B3 ${o}`));}catch{console.log(t.children);}if(t.props.property==="og:image:url"){let r=t.props.content;Lo(r).then(o=>{let n=`font-size: 400px; padding: 10px; background: white url(${o}) no-repeat center; background-size: contain;`;console.log("%c\u2022 Share image preview",ft),console.log("%c ",n),console.log(`\u21B3 ${r}`);}).catch(o=>{console.error(o);});}Object.entries(t.props).map(([r,o])=>{console.log(`\u21B3 ${r} \u2192 ${o}`);});}console.log(" ");});}async function Lo(e){let o=await(await(await fetch(e)).blob()).arrayBuffer();return `data:image/png;base64,${Uo(o)}`}function Uo(e){let t="",r=new Uint8Array(e),o=r.byteLength;for(let n=0;n<o;n++)t+=String.fromCharCode(r[n]);return btoa(t)}var ft,Do,ur=ao(()=>{ft="text-transform: uppercase;",Do="text-transform: uppercase; font-weight: bold; text-transform: uppercase;font-weight: bold";});var Oe="public",io="private",je="no-store",Ht={maxAge:"max-age",staleWhileRevalidate:"stale-while-revalidate",sMaxAge:"s-maxage",staleIfError:"stale-if-error"};function me(e){let t=[];return Object.keys(e).forEach(r=>{r==="mode"?t.push(e[r]):Ht[r]&&t.push(`${Ht[r]}=${e[r]}`);}),t.join(", ")}function Ke(){return {mode:je}}function ze(e){if(e?.mode&&e?.mode!==Oe&&e?.mode!==io)throw Error("'mode' must be either 'public' or 'private'")}function Y(e){return ze(e),{mode:Oe,maxAge:1,staleWhileRevalidate:9,...e}}function Je(e){return ze(e),{mode:Oe,maxAge:3600,staleWhileRevalidate:82800,...e}}function ae(e){return ze(e),{mode:Oe,maxAge:1,staleWhileRevalidate:86399,...e}}function Ye(e){return e}function X(e){return String(e).includes("__proto__")?JSON.parse(e,co):JSON.parse(e)}function co(e,t){if(e!=="__proto__")return t}function xe(e,t){return e&&t?{...e,...t}:e||ae()}function Xe(e){return me(xe(e))}async function uo(e,t){if(!e)return;let r=await e.match(t);if(!r){return}return r}async function po(e,t,r,o){if(!e)return;let n=xe(o),a=Xe(xe(n,{maxAge:(n.maxAge||0)+(n.staleWhileRevalidate||0)})),s=Xe(xe(n));r.headers.set("cache-control",a),r.headers.set("real-cache-control",s),r.headers.set("cache-put-date",String(Date.now())),await e.put(t,r);}async function lo(e,t){e&&await e.delete(t);}function yo(e,t){let r=e.headers.get("real-cache-control"),o=0;if(r){let a=r.match(/max-age=(\d*)/);a&&a.length>1&&(o=parseFloat(a[1]));}return [(Date.now()-Number(t))/1e3,o]}function fo(e,t){let r=t.headers.get("cache-put-date");if(!r)return !1;let[o,n]=yo(t,r),a=o>n;return a}var De={get:uo,set:po,delete:lo,generateDefaultCacheControlHeader:Xe,isStale:fo};function ge(e){return `https://shopify.dev/?${e}`}function mo(e){return e||ae()}async function Ft(e,t){if(!e)return;let r=ge(t),o=new Request(r),n=await De.get(e,o);if(!n)return;let a=await n.text();try{return [X(a),n]}catch{return [a,n]}}async function qt(e,t,r,o){if(!e)return;let n=ge(t),a=new Request(n),s=new Response(JSON.stringify(r));await De.set(e,a,s,mo(o));}function $t(e,t){return De.isStale(new Request(ge(e)),t)}function Bt(e){let t=Array.isArray(e)?e:[e],r="";for(let o of t)o!=null&&(typeof o=="object"?r+=JSON.stringify(o):r+=o.toString());return encodeURIComponent(r)}var Ze=new Set;async function Le(e,t,{strategy:r=Y(),cacheInstance:o,shouldCacheResult:n=()=>!0,waitUntil:a,debugInfo:s}){let i=Bt([...typeof e=="string"?[e]:e]),l=f=>{({displayName:f.displayName,url:f.response?.url,responseInit:{status:f.response?.status||0,statusText:f.response?.statusText||"",headers:Array.from(f.response?.headers.entries()||[])}});},p=void 0;if(!o||!r||r.mode===je){let f=await t({addDebugData:l});return f}let y=f=>qt(o,i,{value:f,debugInfo:void 0},r),g=await Ft(o,i);if(g&&typeof g[0]!="string"){let[{value:f,debugInfo:v},I]=g;let k=$t(i,I)?"STALE":"HIT";if(!Ze.has(i)&&k==="STALE"){Ze.add(i);let _=Promise.resolve().then(async()=>{let oe=Date.now();try{let V=await t({addDebugData:l});n(V)&&(await y(V),p?.({result:V,cacheStatus:"PUT",overrideStartTime:oe}));}catch(V){V.message&&(V.message="SWR in sub-request failed: "+V.message),console.error(V);}finally{Ze.delete(i);}});a?.(_);}return f}let h=await t({addDebugData:l});if(n(h)){let f=Promise.resolve().then(async()=>{await y(h);});a?.(f);}return h}function Qt(e,t){return [e,{status:t.status,statusText:t.statusText,headers:Array.from(t.headers.entries())}]}function Gt([e,t]){return [e,new Response(e,t)]}var Wt=(e,t)=>!e?.errors&&t.status<400;async function jt(e,t,{cacheInstance:r,cache:o,cacheKey:n=[e,t],shouldCacheResponse:a=()=>!0,waitUntil:s,returnType:u="json",debugInfo:i}={}){return !o&&(!t.method||t.method==="GET")&&(o=Y()),Le(n,async()=>{let c=await fetch(e,t),d;try{d=await c[u]();}catch{try{d=await c.text();}catch{return Qt("",c)}}return Qt(d,c)},{cacheInstance:r,waitUntil:s,strategy:o??null,debugInfo:i,shouldCacheResult:c=>a(...Gt(c))}).then(Gt)}var et="Custom-Storefront-Request-Group-ID",tt="X-Shopify-Storefront-Access-Token",rt="X-SDK-Variant",ot="X-SDK-Variant-Source",nt="X-SDK-Version";function Kt(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`weak-${Math.random().toString(16).substring(2)}`}var zt=new Set,Yt=e=>{zt.has(e)||(console.warn(e),zt.add(e));},Jt=new Set,at=e=>{Jt.has(e)||(console.error(new Error(e)),Jt.add(e));};var he="2024.7.4";function se(e){return e.replace(/\s*#.*$/gm,"").replace(/\s+/gm," ").trim()}var go=/(^|}\s)query[\s({]/im,ho=/(^|}\s)mutation[\s({]/im;function Ue(e,t){if(!go.test(e))throw new Error(`[h2:error:${t}] Can only execute queries`)}function ke(e,t){if(!ho.test(e))throw new Error(`[h2:error:${t}] Can only execute mutations`)}var Z=class extends Error{locations;path;extensions;constructor(t,r={}){let n=(r.clientOperation?`[h2:error:${r.clientOperation}] `:"")+t+(r.requestId?` - Request ID: ${r.requestId}`:"");super(n),this.name="GraphQLError",this.extensions=r.extensions,this.locations=r.locations,this.path=r.path,this.stack=r.stack||void 0;try{this.cause=JSON.stringify({...typeof r.cause=="object"?r.cause:{},requestId:r.requestId});}catch{r.cause&&(this.cause=r.cause);}}get[Symbol.toStringTag](){return this.name}toString(){let t=`${this.name}: ${this.message}`;if(this.path)try{t+=` | path: ${JSON.stringify(this.path)}`;}catch{}if(this.extensions)try{t+=` | extensions: ${JSON.stringify(this.extensions)}`;}catch{}return t+=`
15
15
  `,this.stack&&(t+=`${this.stack.slice(this.stack.indexOf(`
16
16
  `)+1)}
17
- `),t}toJSON(){return {name:"Error",message:""}}};function ge({url:e,response:t,errors:r,type:o,query:a,queryVariables:n,ErrorConstructor:i=Error,client:u="storefront"}){let c=(typeof r=="string"?r:r?.map?.(l=>l.message).join(`
17
+ `),t}toJSON(){return {name:"Error",message:""}}};function Ce({url:e,response:t,errors:r,type:o,query:n,queryVariables:a,ErrorConstructor:s=Error,client:u="storefront"}){let i=(typeof r=="string"?r:r?.map?.(d=>d.message).join(`
18
18
  `))||`URL: ${e}
19
- API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{errors:r},clientOperation:`${u}.${o}`,requestId:t.headers.get("x-request-id")});throw new i(s.message,{cause:s.cause})}function ie(e,t={}){let r=new Error,o=(a,n="Error")=>{let i=(r.stack??"").split(`
19
+ API response error: ${t.status}`,c=new Z(i,{query:n,queryVariables:a,cause:{errors:r},clientOperation:`${u}.${o}`,requestId:t.headers.get("x-request-id")});throw new s(c.message,{cause:c.cause})}function ie(e,t={}){let r=new Error,o=(n,a="Error")=>{let s=(r.stack??"").split(`
20
20
  `).slice(3+(t.stackOffset??0)).join(`
21
- `).replace(/ at loader(\d+) \(/,(u,c)=>u.replace(c,""));return `${n}: ${a}
22
- `+i};return e.then(a=>{if(a?.errors&&Array.isArray(a.errors)){let n=typeof t.logErrors=="function"?t.logErrors:()=>t.logErrors??!1;a.errors.forEach(i=>{i&&(i.stack=o(i.message,i.name),n(i)&&console.error(i));});}return a}).catch(a=>{throw a&&(a.stack=o(a.message,a.name)),a})}var q=void 0;var ho={language:"EN",country:"US"};function Pi(e){let {storefrontHeaders:t,cache:r,waitUntil:o,i18n:a,storefrontId:n,logErrors:i=!0,...u}=e,{getPublicTokenHeaders:s,getPrivateTokenHeaders:l,getStorefrontApiUrl:y,getShopifyDomain:m}=hydrogenReact.createStorefrontClient(u),p=(u.privateStorefrontToken?l:s)({contentType:"json",buyerIp:t?.buyerIp||""});if(p[et]=t?.requestGroupId||Qt(),n&&(p[hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER]=n),(p["user-agent"]=`Hydrogen ${he}`),t&&t.cookie){let f=hydrogenReact.getShopifyCookies(t.cookie??"");f[hydrogenReact.SHOPIFY_Y]&&(p[hydrogenReact.SHOPIFY_STOREFRONT_Y_HEADER]=f[hydrogenReact.SHOPIFY_Y]),f[hydrogenReact.SHOPIFY_S]&&(p[hydrogenReact.SHOPIFY_STOREFRONT_S_HEADER]=f[hydrogenReact.SHOPIFY_S]);}let h=JSON.stringify({"content-type":p["content-type"],"user-agent":p["user-agent"],[rt]:p[rt],[ot]:p[ot],[at]:p[at],[tt]:p[tt]});async function g({query:f,mutation:v,variables:I,cache:_,headers:U=[],storefrontApiVersion:re,displayName:N,stackInfo:Re}){let C=U instanceof Headers?Object.fromEntries(U.entries()):Array.isArray(U)?Object.fromEntries(U):U,P=f??v,A={...I};a&&(!I?.country&&/\$country/.test(P)&&(A.country=a.country),!I?.language&&/\$language/.test(P)&&(A.language=a.language));let T=y({storefrontApiVersion:re}),M=JSON.stringify({query:P,variables:A}),F={method:"POST",headers:{...p,...C},body:M},D=[T,F.method,h,F.body],[x,k]=await Ht(T,F,{cacheInstance:v?void 0:r,cache:_||ae(),cacheKey:D,shouldCacheResponse:qt,waitUntil:o,debugInfo:{requestId:F.headers[et],displayName:N,url:T,stackInfo:Re,graphql:M,purpose:t?.purpose}}),R={url:T,response:k,type:v?"mutation":"query",query:P,queryVariables:A,errors:void 0};if(!k.ok){let $;try{$=Y(x);}catch{$=[{message:x}];}ge({...R,errors:$});}let{data:W,errors:le}=x,oe=le?.map(({message:$,...ye})=>new X($,{...ye,clientOperation:`storefront.${R.type}`,requestId:k.headers.get("x-request-id"),queryVariables:A,query:P}));return S(W,oe)}return {storefront:{query(f,v){f=ne(f),ke(f,"storefront.query");let I=zt?.(f);return ie(g({...v,query:f,stackInfo:q?.(I)}),{stackOffset:I,logErrors:i})},mutate(f,v){f=ne(f),Le(f,"storefront.mutate");let I=zt?.(f);return ie(g({...v,mutation:f,stackInfo:q?.(I)}),{stackOffset:I,logErrors:i})},cache:r,CacheNone:Ke,CacheLong:Je,CacheShort:J,CacheCustom:Ye,generateCacheControlHeader:fe,getPublicTokenHeaders:s,getPrivateTokenHeaders:l,getShopifyDomain:m,getApiUrl:y,i18n:a??ho}}}var zt=void 0;function S(e,t){return {...e,...t&&{errors:t}}}function _e(e,t){let r=e.headers?.get?.(t)??e.headers?.[t];return typeof r=="string"?r:null}function Z(e){return {requestId:e?_e(e,"request-id"):void 0,purpose:e?_e(e,"purpose"):void 0}}function go({cache:e,waitUntil:t,request:r}){return function(a,n,i){return xe(a,i,{strategy:n,cacheInstance:e,waitUntil:t,debugInfo:{...Z(r),stackInfo:q?.()}})}}var it=class{#e;constructor(){this.#e=new Map;}add(t){throw new Error("Method not implemented. Use `put` instead.")}addAll(t){throw new Error("Method not implemented. Use `put` instead.")}matchAll(t,r){throw new Error("Method not implemented. Use `match` instead.")}async put(t,r){if(t.method!=="GET")throw new TypeError("Cannot cache response to non-GET request.");if(r.status===206)throw new TypeError("Cannot cache response to a range request (206 Partial Content).");if(r.headers.get("vary")?.includes("*"))throw new TypeError("Cannot cache response with 'Vary: *' header.");this.#e.set(t.url,{body:new Uint8Array(await r.arrayBuffer()),status:r.status,headers:[...r.headers],timestamp:Date.now()});}async match(t){if(t.method!=="GET")return;let r=this.#e.get(t.url);if(!r)return;let{body:o,timestamp:a,...n}=r,i=new Headers(n.headers),u=i.get("cache-control")||i.get("real-cache-control")||"",c=parseInt(u.match(/max-age=(\d+)/)?.[1]||"0",10),s=parseInt(u.match(/stale-while-revalidate=(\d+)/)?.[1]||"0",10),l=(Date.now()-a)/1e3;if(l>c+s){this.#e.delete(t.url);return}let m=l>c;return i.set("cache",m?"STALE":"HIT"),i.set("date",new Date(a).toUTCString()),new Response(o,{status:n.status??200,headers:i})}async delete(t){return this.#e.has(t.url)?(this.#e.delete(t.url),!0):!1}keys(t){let r=[];for(let o of this.#e.keys())(!t||t.url===o)&&r.push(new Request(o));return Promise.resolve(r)}};function Ue(e){if(!e)return;let{pathname:t,search:r}=new URL(e),o=t+r,a=new URLSearchParams(r),n=a.get("return_to")||a.get("redirect");if(n){if(Yt(e,n))return n;console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${n}`);}}function Yt(e,t){try{return new URL(e).origin===new URL(t,e).origin}catch{return !1}}function st({requestUrl:e,defaultUrl:t,redirectUrl:r}){let o=e,a=Jt(e,t),n=r?Jt(e,r):a;return Yt(e,n.toString())?n.toString():(console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${n}. Default url ${a} is used instead.`),a.toString())}function Jt(e,t){return Co(t)?new URL(t):new URL(t,new URL(e).origin)}function Co(e){try{return new URL(e),!0}catch{return !1}}async function Po(e){let{storefront:t,request:r,noAdminRedirect:o,matchQueryParams:a,response:n=new Response("Not Found",{status:404})}=e,i=new URL(r.url),{pathname:u,searchParams:c}=i,s=c.has("_data");c.delete("redirect"),c.delete("return_to"),c.delete("_data");let l=(a?i.toString().replace(i.origin,""):u).toLowerCase();if(i.pathname==="/admin"&&!o)return ut(`${t.getShopifyDomain()}/admin`,s,c,a);try{let{urlRedirects:y}=await t.query(So,{variables:{query:"path:"+l.replace(/\/+$/,"")}}),m=y?.edges?.[0]?.node?.target;if(m)return ut(m,s,c,a);let d=Ue(r.url);if(d)return ut(d,s,c,a)}catch(y){console.error(`Failed to fetch redirects from Storefront API for route ${l}`,y);}return n}var ct="https://example.com";function ut(e,t,r,o){let a=new URL(e,ct);if(!o)for(let[n,i]of r)a.searchParams.append(n,i);return t?new Response(null,{status:200,headers:{"X-Remix-Redirect":a.toString().replace(ct,""),"X-Remix-Status":"301"}}):new Response(null,{status:301,headers:{location:a.toString().replace(ct,"")}})}var So=`#graphql
21
+ `).replace(/ at loader(\d+) \(/,(u,i)=>u.replace(i,""));return `${a}: ${n}
22
+ `+s};return e.then(n=>{if(n?.errors&&Array.isArray(n.errors)){let a=typeof t.logErrors=="function"?t.logErrors:()=>t.logErrors??!1;n.errors.forEach(s=>{s&&(s.stack=o(s.message,s.name),a(s)&&console.error(s));});}return n}).catch(n=>{throw n&&(n.stack=o(n.message,n.name)),n})}var q=void 0;var vo={language:"EN",country:"US"};function tr(e){let {storefrontHeaders:t,cache:r,waitUntil:o,i18n:n,storefrontId:a,logErrors:s=!0,...u}=e,{getPublicTokenHeaders:c,getPrivateTokenHeaders:d,getStorefrontApiUrl:l,getShopifyDomain:m}=hydrogenReact.createStorefrontClient(u),y=(u.privateStorefrontToken?d:c)({contentType:"json",buyerIp:t?.buyerIp||""});if(y[et]=t?.requestGroupId||Kt(),a&&(y[hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER]=a),(y["user-agent"]=`Hydrogen ${he}`),t&&t.cookie){let f=hydrogenReact.getShopifyCookies(t.cookie??"");f[hydrogenReact.SHOPIFY_Y]&&(y[hydrogenReact.SHOPIFY_STOREFRONT_Y_HEADER]=f[hydrogenReact.SHOPIFY_Y]),f[hydrogenReact.SHOPIFY_S]&&(y[hydrogenReact.SHOPIFY_STOREFRONT_S_HEADER]=f[hydrogenReact.SHOPIFY_S]);}let g=JSON.stringify({"content-type":y["content-type"],"user-agent":y["user-agent"],[rt]:y[rt],[ot]:y[ot],[nt]:y[nt],[tt]:y[tt]});async function h({query:f,mutation:v,variables:I,cache:k,headers:_=[],storefrontApiVersion:oe,displayName:V,stackInfo:Ee}){let C=_ instanceof Headers?Object.fromEntries(_.entries()):Array.isArray(_)?Object.fromEntries(_):_,S=f??v,A={...I};n&&(!I?.country&&/\$country/.test(S)&&(A.country=n.country),!I?.language&&/\$language/.test(S)&&(A.language=n.language));let T=l({storefrontApiVersion:oe}),M=JSON.stringify({query:S,variables:A}),H={method:"POST",headers:{...y,...C},body:M},x=[T,H.method,g,H.body],[D,L]=await jt(T,H,{cacheInstance:v?void 0:r,cache:k||ae(),cacheKey:x,shouldCacheResponse:Wt,waitUntil:o,debugInfo:{requestId:H.headers[et],displayName:V,url:T,stackInfo:Ee,graphql:M,purpose:t?.purpose}}),w={url:T,response:L,type:v?"mutation":"query",query:S,queryVariables:A,errors:void 0};if(!L.ok){let F;try{F=X(D);}catch{F=[{message:D}];}Ce({...w,errors:F});}let{data:j,errors:ye}=D,ne=ye?.map(({message:F,...fe})=>new Z(F,{...fe,clientOperation:`storefront.${w.type}`,requestId:L.headers.get("x-request-id"),queryVariables:A,query:S}));return P(j,ne)}return {storefront:{query(f,v){f=se(f),Ue(f,"storefront.query");let I=er?.(f);return ie(h({...v,query:f,stackInfo:q?.(I)}),{stackOffset:I,logErrors:s})},mutate(f,v){f=se(f),ke(f,"storefront.mutate");let I=er?.(f);return ie(h({...v,mutation:f,stackInfo:q?.(I)}),{stackOffset:I,logErrors:s})},cache:r,CacheNone:Ke,CacheLong:Je,CacheShort:Y,CacheCustom:Ye,generateCacheControlHeader:me,getPublicTokenHeaders:c,getPrivateTokenHeaders:d,getShopifyDomain:m,getApiUrl:l,i18n:n??vo}}}var er=void 0;function P(e,t){return {...e,...t&&{errors:t}}}function $(e,t){return st(e.headers,t)}function st(e,t){let r=e?.get?.(t)??e?.[t];return typeof r=="string"?r:null}function ee(e){return {requestId:e?$(e,"request-id"):void 0,purpose:e?$(e,"purpose"):void 0}}function Io(e){let{cache:t,waitUntil:r,request:o}=e;return function(a,s,u){return Le(a,u,{strategy:s,cacheInstance:t,waitUntil:r,debugInfo:{...ee(o),stackInfo:q?.()}})}}var it=class{#e;constructor(){this.#e=new Map;}add(t){throw new Error("Method not implemented. Use `put` instead.")}addAll(t){throw new Error("Method not implemented. Use `put` instead.")}matchAll(t,r){throw new Error("Method not implemented. Use `match` instead.")}async put(t,r){if(t.method!=="GET")throw new TypeError("Cannot cache response to non-GET request.");if(r.status===206)throw new TypeError("Cannot cache response to a range request (206 Partial Content).");if(r.headers.get("vary")?.includes("*"))throw new TypeError("Cannot cache response with 'Vary: *' header.");this.#e.set(t.url,{body:new Uint8Array(await r.arrayBuffer()),status:r.status,headers:[...r.headers],timestamp:Date.now()});}async match(t){if(t.method!=="GET")return;let r=this.#e.get(t.url);if(!r)return;let{body:o,timestamp:n,...a}=r,s=new Headers(a.headers),u=s.get("cache-control")||s.get("real-cache-control")||"",i=parseInt(u.match(/max-age=(\d+)/)?.[1]||"0",10),c=parseInt(u.match(/stale-while-revalidate=(\d+)/)?.[1]||"0",10),d=(Date.now()-n)/1e3;if(d>i+c){this.#e.delete(t.url);return}let m=d>i;return s.set("cache",m?"STALE":"HIT"),s.set("date",new Date(n).toUTCString()),new Response(o,{status:a.status??200,headers:s})}async delete(t){return this.#e.has(t.url)?(this.#e.delete(t.url),!0):!1}keys(t){let r=[];for(let o of this.#e.keys())(!t||t.url===o)&&r.push(new Request(o));return Promise.resolve(r)}};function _e(e){if(!e)return;let{pathname:t,search:r}=new URL(e),o=t+r,n=new URLSearchParams(r),a=n.get("return_to")||n.get("redirect");if(a){if(or(e,a))return a;console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}`);}}function or(e,t){try{return new URL(e).origin===new URL(t,e).origin}catch{return !1}}function ct({requestUrl:e,defaultUrl:t,redirectUrl:r}){let o=e,n=rr(e,t),a=r?rr(e,r):n;return or(e,a.toString())?a.toString():(console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}. Default url ${n} is used instead.`),n.toString())}function rr(e,t){return bo(t)?new URL(t):new URL(t,new URL(e).origin)}function bo(e){try{return new URL(e),!0}catch{return !1}}async function Ro(e){let{storefront:t,request:r,noAdminRedirect:o,matchQueryParams:n,response:a=new Response("Not Found",{status:404})}=e,s=new URL(r.url),{pathname:u,searchParams:i}=s,c=i.has("_data");i.delete("redirect"),i.delete("return_to"),i.delete("_data");let d=(n?s.toString().replace(s.origin,""):u).toLowerCase();if(s.pathname==="/admin"&&!o)return pt(`${t.getShopifyDomain()}/admin`,c,i,n);try{let{urlRedirects:l}=await t.query(wo,{variables:{query:"path:"+d.replace(/\/+$/,"")}}),m=l?.edges?.[0]?.node?.target;if(m)return pt(m,c,i,n);let p=_e(r.url);if(p)return pt(p,c,i,n)}catch(l){console.error(`Failed to fetch redirects from Storefront API for route ${d}`,l);}return a}var ut="https://example.com";function pt(e,t,r,o){let n=new URL(e,ut);if(!o)for(let[a,s]of r)n.searchParams.append(a,s);return t?new Response(null,{status:200,headers:{"X-Remix-Redirect":n.toString().replace(ut,""),"X-Remix-Status":"301"}}):new Response(null,{status:301,headers:{location:n.toString().replace(ut,"")}})}var wo=`#graphql
23
23
  query redirects($query: String) {
24
24
  urlRedirects(first: 1, query: $query) {
25
25
  edges {
@@ -29,7 +29,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
29
29
  }
30
30
  }
31
31
  }
32
- `;var Ao=async function({request:t,context:r}){let o=r.storefront,a=r.customerAccount,n=new URL(t.url);if(!o)throw new Error("GraphiQL: Hydrogen's storefront client must be injected in the loader context.");let i={};if(o){let s="X-Shopify-Storefront-Access-Token";i.storefront={name:"Storefront API",authHeader:s,accessToken:o.getPublicTokenHeaders()[s],apiUrl:o.getApiUrl(),icon:"SF"};}if(a){let s=await(await fetch(n.origin+"/graphiql/customer-account.schema.json")).json(),l=await a.getAccessToken();s&&(i["customer-account"]={name:"Customer Account API",value:s,authHeader:"Authorization",accessToken:l,apiUrl:a.getApiUrl(),icon:"CA"});}let u="https://avatars.githubusercontent.com/u/12972006?s=48&v=4",c=String.raw;return new Response(c`
32
+ `;var Eo=async function({request:t,context:r}){let o=r.storefront,n=r.customerAccount,a=new URL(t.url);if(!o)throw new Error("GraphiQL: Hydrogen's storefront client must be injected in the loader context.");let s={};if(o){let c="X-Shopify-Storefront-Access-Token";s.storefront={name:"Storefront API",authHeader:c,accessToken:o.getPublicTokenHeaders()[c],apiUrl:o.getApiUrl(),icon:"SF"};}if(n){let c=await(await fetch(a.origin+"/graphiql/customer-account.schema.json")).json(),d=await n.getAccessToken();c&&(s["customer-account"]={name:"Customer Account API",value:c,authHeader:"Authorization",accessToken:d,apiUrl:n.getApiUrl(),icon:"CA"});}let u="https://avatars.githubusercontent.com/u/12972006?s=48&v=4",i=String.raw;return new Response(i`
33
33
  <!DOCTYPE html>
34
34
  <html lang="en">
35
35
  <head>
@@ -124,7 +124,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
124
124
  variables = JSON.stringify(JSON.parse(variables), null, 2);
125
125
  }
126
126
 
127
- const schemas = ${JSON.stringify(i)};
127
+ const schemas = ${JSON.stringify(s)};
128
128
  let lastActiveTabIndex = -1;
129
129
  let lastTabAmount = -1;
130
130
 
@@ -295,24 +295,24 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
295
295
  </script>
296
296
  </body>
297
297
  </html>
298
- `,{status:200,headers:{"content-type":"text/html"}})};var To={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},vo=/[&><\u2028\u2029]/g;function Xt(e){return e.replace(vo,t=>To[t])}var j="Error in SEO input: ",H={title:{validate:e=>{if(typeof e!="string")throw new Error(j.concat("`title` should be a string"));if(typeof e=="string"&&e.length>120)throw new Error(j.concat("`title` should not be longer than 120 characters"));return e}},description:{validate:e=>{if(typeof e!="string")throw new Error(j.concat("`description` should be a string"));if(typeof e=="string"&&e.length>155)throw new Error(j.concat("`description` should not be longer than 155 characters"));return e}},url:{validate:e=>{if(typeof e!="string")throw new Error(j.concat("`url` should be a string"));if(typeof e=="string"&&!e.startsWith("http"))throw new Error(j.concat("`url` should be a valid URL"));return e}},handle:{validate:e=>{if(typeof e!="string")throw new Error(j.concat("`handle` should be a string"));if(typeof e=="string"&&!e.startsWith("@"))throw new Error(j.concat("`handle` should start with `@`"));return e}}};function Zt(e){let t=[];for(let r of Object.keys(e))switch(r){case"title":{let o=Q(H.title,e.title),a=dt(e?.titleTemplate,o);if(!a)break;t.push(E("title",{title:a}),E("meta",{property:"og:title",content:a}),E("meta",{name:"twitter:title",content:a}));break}case"description":{let o=Q(H.description,e.description);if(!o)break;t.push(E("meta",{name:"description",content:o}),E("meta",{property:"og:description",content:o}),E("meta",{name:"twitter:description",content:o}));break}case"url":{let o=Q(H.url,e.url);if(!o)break;let n=o.split("?")[0].replace(/\/$/,"");t.push(E("link",{rel:"canonical",href:n}),E("meta",{property:"og:url",content:n}));break}case"handle":{let o=Q(H.handle,e.handle);if(!o)break;t.push(E("meta",{name:"twitter:site",content:o}),E("meta",{name:"twitter:creator",content:o}));break}case"media":{let o,a=K(e.media);for(let n of a)if(typeof n=="string"&&t.push(E("meta",{name:"og:image",content:n})),n&&typeof n=="object"){let i=n.type||"image",u=n?{url:n?.url,secure_url:n?.url,type:lt(n.url),width:n?.width,height:n?.height,alt:n?.altText}:{};for(let c of Object.keys(u))u[c]&&(o=u[c],t.push(E("meta",{property:`og:${i}:${c}`,content:o},u.url)));}break}case"jsonLd":{let o=K(e.jsonLd),a=0;for(let n of o){if(typeof n!="object")continue;let i=E("script",{type:"application/ld+json",children:JSON.stringify(n,(u,c)=>typeof c=="string"?Xt(c):c)},`json-ld-${n?.["@type"]||n?.name||a++}`);t.push(i);}break}case"alternates":{let o=K(e.alternates);for(let a of o){if(!a)continue;let{language:n,url:i,default:u}=a,c=n?`${n}${u?"-default":""}`:void 0;t.push(E("link",{rel:"alternate",hrefLang:c,href:i}));}break}case"robots":{if(!e.robots)break;let{maxImagePreview:o,maxSnippet:a,maxVideoPreview:n,noArchive:i,noFollow:u,noImageIndex:c,noIndex:s,noSnippet:l,noTranslate:y,unavailableAfter:m}=e.robots,d=[i&&"noarchive",c&&"noimageindex",l&&"nosnippet",y&&"notranslate",o&&`max-image-preview:${o}`,a&&`max-snippet:${a}`,n&&`max-video-preview:${n}`,m&&`unavailable_after:${m}`],p=(s?"noindex":"index")+","+(u?"nofollow":"follow");for(let h of d)h&&(p+=`,${h}`);t.push(E("meta",{name:"robots",content:p}));break}}return t.flat().sort((r,o)=>r.key.localeCompare(o.key))}function E(e,t,r){let o={tag:e,props:{},key:""};return e==="title"?(o.children=t.title,o.key=pt(o),o):e==="script"?(o.children=typeof t.children=="string"?t.children:"",o.key=pt(o,r),delete t.children,o.props=t,o):(o.props=t,Object.keys(o.props).forEach(a=>!o.props[a]&&delete o.props[a]),o.key=pt(o,r),o)}function pt(e,t){let{tag:r,props:o}=e;if(r==="title")return "0-title";if(r==="meta"){let a=o.content===t&&typeof o.property=="string"&&!o.property.endsWith("secure_url")&&"0";return [r,...[t,a],o.property||o.name].filter(i=>i).join("-")}return r==="link"?[r,o.rel,o.hrefLang||o.media].filter(n=>n).join("-").replace(/\s+/g,"-"):r==="script"?`${r}-${t}`:`${r}-${o.type}`}function dt(e,t){if(t)return e?typeof e=="function"?e(t):e.replace("%s",t??""):t}function lt(e){switch(e&&e.split(".").pop()){case"svg":return "image/svg+xml";case"png":return "image/png";case"gif":return "image/gif";case"swf":return "application/x-shockwave-flash";case"mp3":return "audio/mpeg";case"jpg":case"jpeg":default:return "image/jpeg"}}function K(e){return Array.isArray(e)?e:[e]}function Q(e,t){try{return e.validate(t)}catch(r){return console.warn(r.message),t}}var ko=react.lazy(()=>Promise.resolve().then(()=>(or(),rr)));function Lo({debug:e}){let t=react$1.useMatches(),r=react$1.useLocation();console.warn("[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\nSee: https://shopify.dev/docs/api/hydrogen/2024-01/utilities/getseometa");let o=react.useMemo(()=>t.flatMap(i=>{let{handle:u,...c}=i,s={...c,...r},l=u?.seo,y=c?.data?.seo;return !l&&!y?[]:l?Ne(l,s):[y]}).reduce((i,u)=>{Object.keys(u).forEach(s=>!u[s]&&delete u[s]);let{jsonLd:c}=u;return c?i?.jsonLd?Array.isArray(c)?{...i,...u,jsonLd:[...i.jsonLd,...c]}:{...i,...u,jsonLd:[...i.jsonLd,c]}:{...i,...u,jsonLd:[c]}:{...i,...u}},{}),[t,r]),{html:a,loggerMarkup:n}=react.useMemo(()=>{let i=Zt(o),u=i.map(s=>s.tag==="script"?react.createElement(s.tag,{...s.props,key:s.key,dangerouslySetInnerHTML:{__html:s.children}}):react.createElement(s.tag,{...s.props,key:s.key},s.children)),c=react.createElement(react.Suspense,{fallback:null},react.createElement(ko,{headTags:i}));return {html:u,loggerMarkup:c}},[o]);return react.createElement(react.Fragment,null,a,e&&n)}function Ne(e,...t){if(e instanceof Function)return Ne(e(...t),...t);let r={};return Array.isArray(e)?(r=e.reduce((o,a)=>[...o,Ne(a)],[]),r):e instanceof Object?(Object.entries(e).forEach(([a,n])=>{r[a]=Ne(n,...t);}),r):e}function _o(...e){let t=[],r=e.reduce((o,a)=>{if(!a)return o;Object.keys(a).forEach(i=>!a[i]&&delete a[i]);let{jsonLd:n}=a;return n?o?.jsonLd?{...o,...a,jsonLd:K(o.jsonLd).concat(n)}:{...o,...a,jsonLd:[n]}:{...o,...a}},{})||{};for(let o of Object.keys(r))switch(o){case"title":{let a=Q(H.title,r.title),n=dt(r?.titleTemplate,a);if(!n)break;t.push({title:n},{property:"og:title",content:n},{property:"twitter:title",content:n});break}case"description":{let a=Q(H.description,r.description);if(!a)break;t.push({name:"description",content:a},{property:"og:description",content:a},{property:"twitter:description",content:a});break}case"url":{let a=Q(H.url,r.url);if(!a)break;let i=a.split("?")[0].replace(/\/$/,"");t.push({tagName:"link",rel:"canonical",href:i},{property:"og:url",content:i});break}case"handle":{let a=Q(H.handle,r.handle);if(!a)break;t.push({property:"twitter:site",content:a},{property:"twitter:creator",content:a});break}case"media":{let a,n=K(r.media);for(let i of n)if(typeof i=="string"&&t.push({property:"og:image",content:i}),i&&typeof i=="object"){let u=i.type||"image",c=i?{url:i?.url,secure_url:i?.url,type:lt(i.url),width:i?.width,height:i?.height,alt:i?.altText}:{};for(let s of Object.keys(c))c[s]&&(a=c[s],t.push({property:`og:${u}:${s}`,content:a}));}break}case"jsonLd":{let a=K(r.jsonLd);for(let i of a)typeof i!="object"||Object.keys(i).length===0||t.push({"script:ld+json":i});break}case"alternates":{let a=K(r.alternates);for(let n of a){if(!n)continue;let{language:i,url:u,default:c}=n,s=i?`${i}${c?"-default":""}`:void 0;t.push({tagName:"link",rel:"alternate",hrefLang:s,href:u});}break}case"robots":{if(!r.robots)break;let{maxImagePreview:a,maxSnippet:n,maxVideoPreview:i,noArchive:u,noFollow:c,noImageIndex:s,noIndex:l,noSnippet:y,noTranslate:m,unavailableAfter:d}=r.robots,p=[u&&"noarchive",s&&"noimageindex",y&&"nosnippet",m&&"notranslate",a&&`max-image-preview:${a}`,n&&`max-snippet:${n}`,i&&`max-video-preview:${i}`,d&&`unavailable_after:${d}`],h=(l?"noindex":"index")+","+(c?"nofollow":"follow");for(let g of p)g&&(h+=`,${g}`);t.push({name:"robots",content:h});break}}return t}function Fo({connection:e,children:t=()=>(console.warn("<Pagination> requires children to work properly"),null)}){let o=react$1.useNavigation().state==="loading",{endCursor:a,hasNextPage:n,hasPreviousPage:i,nextPageUrl:u,nodes:c,previousPageUrl:s,startCursor:l}=$o(e),y=react.useMemo(()=>({pageInfo:{endCursor:a,hasPreviousPage:i,hasNextPage:n,startCursor:l},nodes:c}),[a,n,i,l,c]),m=react.useMemo(()=>react.forwardRef(function(h,g){return n?react.createElement(react$1.Link,{preventScrollReset:!0,...h,to:u,state:y,replace:!0,ref:g}):null}),[n,u,y]),d=react.useMemo(()=>react.forwardRef(function(h,g){return i?react.createElement(react$1.Link,{preventScrollReset:!0,...h,to:s,state:y,replace:!0,ref:g}):null}),[i,s,y]);return t({state:y,hasNextPage:n,hasPreviousPage:i,isLoading:o,nextPageUrl:u,nodes:c,previousPageUrl:s,NextLink:m,PreviousLink:d})}function Ve(e){let t=new URLSearchParams(e);return t.delete("cursor"),t.delete("direction"),t.toString()}function Pe(e){throw new Error(`The Pagination component requires ${"`"+e+"`"} to be a part of your query. See the guide on how to setup your query to include ${"`"+e+"`"}: https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/pagination#setup-the-paginated-query`)}function $o(e){e.pageInfo||Pe("pageInfo"),typeof e.pageInfo.startCursor>"u"&&Pe("pageInfo.startCursor"),typeof e.pageInfo.endCursor>"u"&&Pe("pageInfo.endCursor"),typeof e.pageInfo.hasNextPage>"u"&&Pe("pageInfo.hasNextPage"),typeof e.pageInfo.hasPreviousPage>"u"&&Pe("pageInfo.hasPreviousPage");let t=react$1.useNavigate(),{state:r,search:o,pathname:a}=react$1.useLocation(),u=new URLSearchParams(o).get("direction")==="previous",c=react.useMemo(()=>!globalThis?.window?.__hydrogenHydrated||!r||!r?.nodes?hydrogenReact.flattenConnection(e):u?[...hydrogenReact.flattenConnection(e),...r.nodes]:[...r.nodes,...hydrogenReact.flattenConnection(e)],[r,e]),s=react.useMemo(()=>{let d=globalThis?.window?.__hydrogenHydrated,p=!d||r?.pageInfo?.startCursor===void 0?e.pageInfo.startCursor:r.pageInfo.startCursor,h=!d||r?.pageInfo?.endCursor===void 0?e.pageInfo.endCursor:r.pageInfo.endCursor,g=!d||r?.pageInfo?.hasPreviousPage===void 0?e.pageInfo.hasPreviousPage:r.pageInfo.hasPreviousPage,f=!d||r?.pageInfo?.hasNextPage===void 0?e.pageInfo.hasNextPage:r.pageInfo.hasNextPage;return r?.nodes&&(u?(p=e.pageInfo.startCursor,g=e.pageInfo.hasPreviousPage):(h=e.pageInfo.endCursor,f=e.pageInfo.hasNextPage)),{startCursor:p,endCursor:h,hasPreviousPage:g,hasNextPage:f}},[u,r,e.pageInfo.hasNextPage,e.pageInfo.hasPreviousPage,e.pageInfo.startCursor,e.pageInfo.endCursor]),l=react.useRef({params:Ve(o),pathname:a});react.useEffect(()=>{window.__hydrogenHydrated=!0;},[]),react.useEffect(()=>{(Ve(o)!==l.current.params||a!==l.current.pathname)&&(l.current={pathname:a,params:Ve(o)},t(`${a}?${Ve(o)}`,{replace:!0,preventScrollReset:!0,state:{nodes:void 0,pageInfo:void 0}}));},[a,o]);let y=react.useMemo(()=>{let d=new URLSearchParams(o);return d.set("direction","previous"),s.startCursor&&d.set("cursor",s.startCursor),`?${d.toString()}`},[o,s.startCursor]),m=react.useMemo(()=>{let d=new URLSearchParams(o);return d.set("direction","next"),s.endCursor&&d.set("cursor",s.endCursor),`?${d.toString()}`},[o,s.endCursor]);return {...s,previousPageUrl:y,nextPageUrl:m,nodes:c}}function qo(e,t={pageBy:20}){if(typeof e?.url>"u")throw new Error("getPaginationVariables must be called with the Request object passed to your loader function");let{pageBy:r}=t,o=new URLSearchParams(new URL(e.url).search),a=o.get("cursor")??void 0;return (o.get("direction")==="previous"?"previous":"next")==="previous"?{last:r,startCursor:a??null}:{first:r,endCursor:a??null}}var Me="2024-07",se=`Shopify Hydrogen ${he}`,ur="30243aa5-17c1-465a-8493-944bcc4e88aa",O="customerAccount",ce="buyer";var V=class extends Response{constructor(t,r,o){super(`Bad request: ${t}`,{status:400,headers:o});}};function Ae(e,t={}){let r=t.headers?new Headers(t.headers):new Headers({});return r.set("location",e),new Response(null,{status:t.status||302,headers:r})}async function Ho({session:e,customerAccountId:t,customerAccountUrl:r,httpsOrigin:o,debugInfo:a,exchangeForStorefrontCustomerAccessToken:n}){let i=new URLSearchParams,u=e.get(O),c=u?.refreshToken,s=u?.idToken;if(!c)throw new V("Unauthorized","No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.");i.append("grant_type","refresh_token"),i.append("refresh_token",c),i.append("client_id",t);let l={"content-type":"application/x-www-form-urlencoded","User-Agent":se,Origin:o};new Date().getTime();let m=`${r}/auth/oauth/token`,d=await fetch(m,{method:"POST",headers:l,body:i});if(!d.ok){let v=await d.text();throw new Response(v,{status:d.status,headers:{"Content-Type":"text/html; charset=utf-8"}})}let{access_token:p,expires_in:h,refresh_token:g}=await d.json(),f=await mt(p,t,r,o);e.set(O,{accessToken:f,expiresAt:new Date(new Date().getTime()+(h-120)*1e3).getTime()+"",refreshToken:g,idToken:s}),await n();}function ue(e){e.unset(O),e.unset(ce);}async function pr({locks:e,expiresAt:t,session:r,customerAccountId:o,customerAccountUrl:a,httpsOrigin:n,debugInfo:i,exchangeForStorefrontCustomerAccessToken:u}){if(parseInt(t,10)-1e3<new Date().getTime())try{e.refresh||(e.refresh=Ho({session:r,customerAccountId:o,customerAccountUrl:a,httpsOrigin:n,debugInfo:i,exchangeForStorefrontCustomerAccessToken:u})),await e.refresh,delete e.refresh;}catch(c){throw ue(r),c&&c.status!==401?c:new V("Unauthorized","Login before querying the Customer Account API.")}}function dr(){let e=Qo();return yr(e)}async function lr(e){let t=await crypto.subtle.digest({name:"SHA-256"},new TextEncoder().encode(e)),r=Bo(t);return yr(r)}function Qo(){let e=new Uint8Array(32);return crypto.getRandomValues(e),String.fromCharCode.apply(null,Array.from(e))}function yr(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Bo(e){let t=new Uint8Array(e),r=Array.from(t);return String.fromCharCode(...r)}function fr(){let e=Date.now().toString(),t=Math.random().toString(36).substring(2);return e+t}async function mt(e,t,r,o,a){let n=t;if(!e)throw new V("Unauthorized","oAuth access token was not provided during token exchange.");let i=new URLSearchParams;i.append("grant_type","urn:ietf:params:oauth:grant-type:token-exchange"),i.append("client_id",n),i.append("audience",ur),i.append("subject_token",e),i.append("subject_token_type","urn:ietf:params:oauth:token-type:access_token"),i.append("scopes","https://api.customers.com/auth/customer.graphql");let u={"content-type":"application/x-www-form-urlencoded","User-Agent":se,Origin:o};new Date().getTime();let s=`${r}/auth/oauth/token`,l=await fetch(s,{method:"POST",headers:u,body:i});let y=await l.json();if(y.error)throw new V(y.error_description);return y.access_token}function mr(e){return Go(e).payload.nonce}function Go(e){let[t,r,o]=e.split("."),a=JSON.parse(atob(t)),n=JSON.parse(atob(r));return {header:a,payload:n,signature:o}}function Fe(){return jo(Wo())}function Wo(){try{return crypto.getRandomValues(new Uint8Array(16))}catch{return new Uint8Array(16).map(()=>Math.random()*255|0)}}function jo(e){return Array.from(e,function(t){return ("0"+(t&255).toString(16)).slice(-2)}).join("")}var hr="/account/login",Ko="/account/authorize",gr="/account";function zo(e){if(!e.url)return hr;let{pathname:t}=new URL(e.url),r=hr+`?${new URLSearchParams({return_to:t}).toString()}`;return Ae(r)}function Jo({session:e,customerAccountId:t,customerAccountUrl:r,customerApiVersion:o=Me,request:a,waitUntil:n,authUrl:i,customAuthStatusHandler:u,logErrors:c=!0,unstableB2b:s=!1}){if(o!==Me&&console.warn(`[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${o} when this version of Hydrogen was built for ${Me}.`),!a?.url)throw new Error("[h2:error:createCustomerAccountClient] The request object does not contain a URL.");let l=u||(()=>zo(a)),y=new URL(a.url),m=y.protocol==="http:"?y.origin.replace("http","https"):y.origin,d=st({requestUrl:m,defaultUrl:Ko,redirectUrl:i}),p=`${r}/account/customer/api/${o}/graphql`,h={};async function g({query:C,type:P,variables:A={}}){let T=await I();if(!T)throw l();new Date().getTime();let D=await fetch(p,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":se,Origin:m,Authorization:T},body:JSON.stringify({query:C,variables:A})});let x=await D.text(),k={url:p,response:D,type:P,query:C,queryVariables:A,errors:void 0,client:"customer"};if(!D.ok){if(D.status===401)throw ue(e),l();let R;try{R=Y(x);}catch{R=[{message:x}];}ge({...k,errors:R});}try{let R=Y(x),{errors:W}=R,le=W?.map(({message:oe,...$})=>new X(oe,{...$,clientOperation:`customerAccount.${k.type}`,requestId:D.headers.get("x-request-id"),queryVariables:A,query:C}));return {...R,...W&&{errors:le}}}catch{ge({...k,errors:[{message:x}]});}}async function f(){if(!r||!t)return !1;let C=e.get(O),P=C?.accessToken,A=C?.expiresAt;if(!P||!A)return !1;let T=q?.();try{await pr({locks:h,expiresAt:A,session:e,customerAccountId:t,customerAccountUrl:r,httpsOrigin:m,debugInfo:{waitUntil:n,stackInfo:T,...Z(a)},exchangeForStorefrontCustomerAccessToken:Re});}catch{return !1}return !0}async function v(){if(!await f())throw l()}async function I(){if(await f())return e.get(O)?.accessToken}async function _(C,P){return Te(r,t),C=ne(C),Le(C,"customer.mutate"),ie(g({query:C,type:"mutation",...P}),{logErrors:c})}async function U(C,P){return Te(r,t),C=ne(C),ke(C,"customer.query"),ie(g({query:C,type:"query",...P}),{logErrors:c})}function re(C){e.set(ce,{...e.get(ce),...C});}async function N(){if(await f())return e.get(ce)}async function Re(){if(!s)return;let C=`#graphql
298
+ `,{status:200,headers:{"content-type":"text/html"}})};var Oo={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},xo=/[&><\u2028\u2029]/g;function nr(e){return e.replace(xo,t=>Oo[t])}var K="Error in SEO input: ",B={title:{validate:e=>{if(typeof e!="string")throw new Error(K.concat("`title` should be a string"));if(typeof e=="string"&&e.length>120)throw new Error(K.concat("`title` should not be longer than 120 characters"));return e}},description:{validate:e=>{if(typeof e!="string")throw new Error(K.concat("`description` should be a string"));if(typeof e=="string"&&e.length>155)throw new Error(K.concat("`description` should not be longer than 155 characters"));return e}},url:{validate:e=>{if(typeof e!="string")throw new Error(K.concat("`url` should be a string"));if(typeof e=="string"&&!e.startsWith("http"))throw new Error(K.concat("`url` should be a valid URL"));return e}},handle:{validate:e=>{if(typeof e!="string")throw new Error(K.concat("`handle` should be a string"));if(typeof e=="string"&&!e.startsWith("@"))throw new Error(K.concat("`handle` should start with `@`"));return e}}};function ar(e){let t=[];for(let r of Object.keys(e))switch(r){case"title":{let o=Q(B.title,e.title),n=lt(e?.titleTemplate,o);if(!n)break;t.push(E("title",{title:n}),E("meta",{property:"og:title",content:n}),E("meta",{name:"twitter:title",content:n}));break}case"description":{let o=Q(B.description,e.description);if(!o)break;t.push(E("meta",{name:"description",content:o}),E("meta",{property:"og:description",content:o}),E("meta",{name:"twitter:description",content:o}));break}case"url":{let o=Q(B.url,e.url);if(!o)break;let a=o.split("?")[0].replace(/\/$/,"");t.push(E("link",{rel:"canonical",href:a}),E("meta",{property:"og:url",content:a}));break}case"handle":{let o=Q(B.handle,e.handle);if(!o)break;t.push(E("meta",{name:"twitter:site",content:o}),E("meta",{name:"twitter:creator",content:o}));break}case"media":{let o,n=z(e.media);for(let a of n)if(typeof a=="string"&&t.push(E("meta",{name:"og:image",content:a})),a&&typeof a=="object"){let s=a.type||"image",u=a?{url:a?.url,secure_url:a?.url,type:yt(a.url),width:a?.width,height:a?.height,alt:a?.altText}:{};for(let i of Object.keys(u))u[i]&&(o=u[i],t.push(E("meta",{property:`og:${s}:${i}`,content:o},u.url)));}break}case"jsonLd":{let o=z(e.jsonLd),n=0;for(let a of o){if(typeof a!="object")continue;let s=E("script",{type:"application/ld+json",children:JSON.stringify(a,(u,i)=>typeof i=="string"?nr(i):i)},`json-ld-${a?.["@type"]||a?.name||n++}`);t.push(s);}break}case"alternates":{let o=z(e.alternates);for(let n of o){if(!n)continue;let{language:a,url:s,default:u}=n,i=a?`${a}${u?"-default":""}`:void 0;t.push(E("link",{rel:"alternate",hrefLang:i,href:s}));}break}case"robots":{if(!e.robots)break;let{maxImagePreview:o,maxSnippet:n,maxVideoPreview:a,noArchive:s,noFollow:u,noImageIndex:i,noIndex:c,noSnippet:d,noTranslate:l,unavailableAfter:m}=e.robots,p=[s&&"noarchive",i&&"noimageindex",d&&"nosnippet",l&&"notranslate",o&&`max-image-preview:${o}`,n&&`max-snippet:${n}`,a&&`max-video-preview:${a}`,m&&`unavailable_after:${m}`],y=(c?"noindex":"index")+","+(u?"nofollow":"follow");for(let g of p)g&&(y+=`,${g}`);t.push(E("meta",{name:"robots",content:y}));break}}return t.flat().sort((r,o)=>r.key.localeCompare(o.key))}function E(e,t,r){let o={tag:e,props:{},key:""};return e==="title"?(o.children=t.title,o.key=dt(o),o):e==="script"?(o.children=typeof t.children=="string"?t.children:"",o.key=dt(o,r),delete t.children,o.props=t,o):(o.props=t,Object.keys(o.props).forEach(n=>!o.props[n]&&delete o.props[n]),o.key=dt(o,r),o)}function dt(e,t){let{tag:r,props:o}=e;if(r==="title")return "0-title";if(r==="meta"){let n=o.content===t&&typeof o.property=="string"&&!o.property.endsWith("secure_url")&&"0";return [r,...[t,n],o.property||o.name].filter(s=>s).join("-")}return r==="link"?[r,o.rel,o.hrefLang||o.media].filter(a=>a).join("-").replace(/\s+/g,"-"):r==="script"?`${r}-${t}`:`${r}-${o.type}`}function lt(e,t){if(t)return e?typeof e=="function"?e(t):e.replace("%s",t??""):t}function yt(e){switch(e&&e.split(".").pop()){case"svg":return "image/svg+xml";case"png":return "image/png";case"gif":return "image/gif";case"swf":return "application/x-shockwave-flash";case"mp3":return "audio/mpeg";case"jpg":case"jpeg":default:return "image/jpeg"}}function z(e){return Array.isArray(e)?e:[e]}function Q(e,t){try{return e.validate(t)}catch(r){return console.warn(r.message),t}}var Ho=react.lazy(()=>Promise.resolve().then(()=>(ur(),cr)));function Fo({debug:e}){let t=react$1.useMatches(),r=react$1.useLocation();console.warn("[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\nSee: https://shopify.dev/docs/api/hydrogen/2024-07/utilities/getseometa");let o=react.useMemo(()=>t.flatMap(s=>{let{handle:u,...i}=s,c={...i,...r},d=u?.seo,l=i?.data?.seo;return !d&&!l?[]:d?Ve(d,c):[l]}).reduce((s,u)=>{Object.keys(u).forEach(c=>!u[c]&&delete u[c]);let{jsonLd:i}=u;return i?s?.jsonLd?Array.isArray(i)?{...s,...u,jsonLd:[...s.jsonLd,...i]}:{...s,...u,jsonLd:[...s.jsonLd,i]}:{...s,...u,jsonLd:[i]}:{...s,...u}},{}),[t,r]),{html:n,loggerMarkup:a}=react.useMemo(()=>{let s=ar(o),u=s.map(c=>c.tag==="script"?react.createElement(c.tag,{...c.props,key:c.key,dangerouslySetInnerHTML:{__html:c.children}}):react.createElement(c.tag,{...c.props,key:c.key},c.children)),i=react.createElement(react.Suspense,{fallback:null},react.createElement(Ho,{headTags:s}));return {html:u,loggerMarkup:i}},[o]);return react.createElement(react.Fragment,null,n,e&&a)}function Ve(e,...t){if(e instanceof Function)return Ve(e(...t),...t);let r={};return Array.isArray(e)?(r=e.reduce((o,n)=>[...o,Ve(n)],[]),r):e instanceof Object?(Object.entries(e).forEach(([n,a])=>{r[n]=Ve(a,...t);}),r):e}function qo(...e){let t=[],r=e.reduce((o,n)=>{if(!n)return o;Object.keys(n).forEach(s=>!n[s]&&delete n[s]);let{jsonLd:a}=n;return a?o?.jsonLd?{...o,...n,jsonLd:z(o.jsonLd).concat(a)}:{...o,...n,jsonLd:[a]}:{...o,...n}},{})||{};for(let o of Object.keys(r))switch(o){case"title":{let n=Q(B.title,r.title),a=lt(r?.titleTemplate,n);if(!a)break;t.push({title:a},{property:"og:title",content:a},{property:"twitter:title",content:a});break}case"description":{let n=Q(B.description,r.description);if(!n)break;t.push({name:"description",content:n},{property:"og:description",content:n},{property:"twitter:description",content:n});break}case"url":{let n=Q(B.url,r.url);if(!n)break;let s=n.split("?")[0].replace(/\/$/,"");t.push({tagName:"link",rel:"canonical",href:s},{property:"og:url",content:s});break}case"handle":{let n=Q(B.handle,r.handle);if(!n)break;t.push({property:"twitter:site",content:n},{property:"twitter:creator",content:n});break}case"media":{let n,a=z(r.media);for(let s of a)if(typeof s=="string"&&t.push({property:"og:image",content:s}),s&&typeof s=="object"){let u=s.type||"image",i=s?{url:s?.url,secure_url:s?.url,type:yt(s.url),width:s?.width,height:s?.height,alt:s?.altText}:{};for(let c of Object.keys(i))i[c]&&(n=i[c],t.push({property:`og:${u}:${c}`,content:n}));}break}case"jsonLd":{let n=z(r.jsonLd);for(let s of n)typeof s!="object"||Object.keys(s).length===0||t.push({"script:ld+json":s});break}case"alternates":{let n=z(r.alternates);for(let a of n){if(!a)continue;let{language:s,url:u,default:i}=a,c=s?`${s}${i?"-default":""}`:void 0;t.push({tagName:"link",rel:"alternate",hrefLang:c,href:u});}break}case"robots":{if(!r.robots)break;let{maxImagePreview:n,maxSnippet:a,maxVideoPreview:s,noArchive:u,noFollow:i,noImageIndex:c,noIndex:d,noSnippet:l,noTranslate:m,unavailableAfter:p}=r.robots,y=[u&&"noarchive",c&&"noimageindex",l&&"nosnippet",m&&"notranslate",n&&`max-image-preview:${n}`,a&&`max-snippet:${a}`,s&&`max-video-preview:${s}`,p&&`unavailable_after:${p}`],g=(d?"noindex":"index")+","+(i?"nofollow":"follow");for(let h of y)h&&(g+=`,${h}`);t.push({name:"robots",content:g});break}}return t}function Wo({connection:e,children:t=()=>(console.warn("<Pagination> requires children to work properly"),null)}){let o=react$1.useNavigation().state==="loading",{endCursor:n,hasNextPage:a,hasPreviousPage:s,nextPageUrl:u,nodes:i,previousPageUrl:c,startCursor:d}=jo(e),l=react.useMemo(()=>({pageInfo:{endCursor:n,hasPreviousPage:s,hasNextPage:a,startCursor:d},nodes:i}),[n,a,s,d,i]),m=react.useMemo(()=>react.forwardRef(function(g,h){return a?react.createElement(react$1.Link,{preventScrollReset:!0,...g,to:u,state:l,replace:!0,ref:h}):null}),[a,u,l]),p=react.useMemo(()=>react.forwardRef(function(g,h){return s?react.createElement(react$1.Link,{preventScrollReset:!0,...g,to:c,state:l,replace:!0,ref:h}):null}),[s,c,l]);return t({state:l,hasNextPage:a,hasPreviousPage:s,isLoading:o,nextPageUrl:u,nodes:i,previousPageUrl:c,NextLink:m,PreviousLink:p})}function Ne(e){let t=new URLSearchParams(e);return t.delete("cursor"),t.delete("direction"),t.toString()}function Pe(e){throw new Error(`The Pagination component requires ${"`"+e+"`"} to be a part of your query. See the guide on how to setup your query to include ${"`"+e+"`"}: https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/pagination#setup-the-paginated-query`)}function jo(e){e.pageInfo||Pe("pageInfo"),typeof e.pageInfo.startCursor>"u"&&Pe("pageInfo.startCursor"),typeof e.pageInfo.endCursor>"u"&&Pe("pageInfo.endCursor"),typeof e.pageInfo.hasNextPage>"u"&&Pe("pageInfo.hasNextPage"),typeof e.pageInfo.hasPreviousPage>"u"&&Pe("pageInfo.hasPreviousPage");let t=react$1.useNavigate(),{state:r,search:o,pathname:n}=react$1.useLocation(),u=new URLSearchParams(o).get("direction")==="previous",i=react.useMemo(()=>!globalThis?.window?.__hydrogenHydrated||!r||!r?.nodes?hydrogenReact.flattenConnection(e):u?[...hydrogenReact.flattenConnection(e),...r.nodes]:[...r.nodes,...hydrogenReact.flattenConnection(e)],[r,e]),c=react.useMemo(()=>{let p=globalThis?.window?.__hydrogenHydrated,y=!p||r?.pageInfo?.startCursor===void 0?e.pageInfo.startCursor:r.pageInfo.startCursor,g=!p||r?.pageInfo?.endCursor===void 0?e.pageInfo.endCursor:r.pageInfo.endCursor,h=!p||r?.pageInfo?.hasPreviousPage===void 0?e.pageInfo.hasPreviousPage:r.pageInfo.hasPreviousPage,f=!p||r?.pageInfo?.hasNextPage===void 0?e.pageInfo.hasNextPage:r.pageInfo.hasNextPage;return r?.nodes&&(u?(y=e.pageInfo.startCursor,h=e.pageInfo.hasPreviousPage):(g=e.pageInfo.endCursor,f=e.pageInfo.hasNextPage)),{startCursor:y,endCursor:g,hasPreviousPage:h,hasNextPage:f}},[u,r,e.pageInfo.hasNextPage,e.pageInfo.hasPreviousPage,e.pageInfo.startCursor,e.pageInfo.endCursor]),d=react.useRef({params:Ne(o),pathname:n});react.useEffect(()=>{window.__hydrogenHydrated=!0;},[]),react.useEffect(()=>{(Ne(o)!==d.current.params||n!==d.current.pathname)&&(d.current={pathname:n,params:Ne(o)},t(`${n}?${Ne(o)}`,{replace:!0,preventScrollReset:!0,state:{nodes:void 0,pageInfo:void 0}}));},[n,o]);let l=react.useMemo(()=>{let p=new URLSearchParams(o);return p.set("direction","previous"),c.startCursor&&p.set("cursor",c.startCursor),`?${p.toString()}`},[o,c.startCursor]),m=react.useMemo(()=>{let p=new URLSearchParams(o);return p.set("direction","next"),c.endCursor&&p.set("cursor",c.endCursor),`?${p.toString()}`},[o,c.endCursor]);return {...c,previousPageUrl:l,nextPageUrl:m,nodes:i}}function Ko(e,t={pageBy:20}){if(typeof e?.url>"u")throw new Error("getPaginationVariables must be called with the Request object passed to your loader function");let{pageBy:r}=t,o=new URLSearchParams(new URL(e.url).search),n=o.get("cursor")??void 0;return (o.get("direction")==="previous"?"previous":"next")==="previous"?{last:r,startCursor:n??null}:{first:r,endCursor:n??null}}var Me="2024-07",ce=`Shopify Hydrogen ${he}`,mr="30243aa5-17c1-465a-8493-944bcc4e88aa",O="customerAccount",ue="buyer";var N=class extends Response{constructor(t,r,o){super(`Bad request: ${t}`,{status:400,headers:o});}};function Te(e,t={}){let r=t.headers?new Headers(t.headers):new Headers({});return r.set("location",e),new Response(null,{status:t.status||302,headers:r})}async function zo({session:e,customerAccountId:t,customerAccountUrl:r,httpsOrigin:o,debugInfo:n,exchangeForStorefrontCustomerAccessToken:a}){let s=new URLSearchParams,u=e.get(O),i=u?.refreshToken,c=u?.idToken;if(!i)throw new N("Unauthorized","No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.");s.append("grant_type","refresh_token"),s.append("refresh_token",i),s.append("client_id",t);let d={"content-type":"application/x-www-form-urlencoded","User-Agent":ce,Origin:o};new Date().getTime();let m=`${r}/auth/oauth/token`,p=await fetch(m,{method:"POST",headers:d,body:s});if(!p.ok){let v=await p.text();throw new Response(v,{status:p.status,headers:{"Content-Type":"text/html; charset=utf-8"}})}let{access_token:y,expires_in:g,refresh_token:h}=await p.json(),f=await gt(y,t,r,o);e.set(O,{accessToken:f,expiresAt:new Date(new Date().getTime()+(g-120)*1e3).getTime()+"",refreshToken:h,idToken:c}),await a();}function pe(e){e.unset(O),e.unset(ue);}async function gr({locks:e,expiresAt:t,session:r,customerAccountId:o,customerAccountUrl:n,httpsOrigin:a,debugInfo:s,exchangeForStorefrontCustomerAccessToken:u}){if(parseInt(t,10)-1e3<new Date().getTime())try{e.refresh||(e.refresh=zo({session:r,customerAccountId:o,customerAccountUrl:n,httpsOrigin:a,debugInfo:s,exchangeForStorefrontCustomerAccessToken:u})),await e.refresh,delete e.refresh;}catch(i){throw pe(r),i&&i.status!==401?i:new N("Unauthorized","Login before querying the Customer Account API.")}}function hr(){let e=Jo();return Sr(e)}async function Cr(e){let t=await crypto.subtle.digest({name:"SHA-256"},new TextEncoder().encode(e)),r=Yo(t);return Sr(r)}function Jo(){let e=new Uint8Array(32);return crypto.getRandomValues(e),String.fromCharCode.apply(null,Array.from(e))}function Sr(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function Yo(e){let t=new Uint8Array(e),r=Array.from(t);return String.fromCharCode(...r)}function Pr(){let e=Date.now().toString(),t=Math.random().toString(36).substring(2);return e+t}async function gt(e,t,r,o,n){let a=t;if(!e)throw new N("Unauthorized","oAuth access token was not provided during token exchange.");let s=new URLSearchParams;s.append("grant_type","urn:ietf:params:oauth:grant-type:token-exchange"),s.append("client_id",a),s.append("audience",mr),s.append("subject_token",e),s.append("subject_token_type","urn:ietf:params:oauth:token-type:access_token"),s.append("scopes","https://api.customers.com/auth/customer.graphql");let u={"content-type":"application/x-www-form-urlencoded","User-Agent":ce,Origin:o};new Date().getTime();let c=`${r}/auth/oauth/token`,d=await fetch(c,{method:"POST",headers:u,body:s});let l=await d.json();if(l.error)throw new N(l.error_description);return l.access_token}function Ar(e){return Xo(e).payload.nonce}function Xo(e){let[t,r,o]=e.split("."),n=JSON.parse(atob(t)),a=JSON.parse(atob(r));return {header:n,payload:a,signature:o}}function He(){return en(Zo())}function Zo(){try{return crypto.getRandomValues(new Uint8Array(16))}catch{return new Uint8Array(16).map(()=>Math.random()*255|0)}}function en(e){return Array.from(e,function(t){return ("0"+(t&255).toString(16)).slice(-2)}).join("")}var Tr="/account/login",tn="/account/authorize",vr="/account";function rn(e){if(!e.url)return Tr;let{pathname:t}=new URL(e.url),r=Tr+`?${new URLSearchParams({return_to:t}).toString()}`;return Te(r)}function ht({session:e,customerAccountId:t,customerAccountUrl:r,customerApiVersion:o=Me,request:n,waitUntil:a,authUrl:s,customAuthStatusHandler:u,logErrors:i=!0,unstableB2b:c=!1}){if(o!==Me&&console.warn(`[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${o} when this version of Hydrogen was built for ${Me}.`),e||console.warn("[h2:warn:createCustomerAccountClient] session is required to use Customer Account API. Ensure the session object passed in exist."),!n?.url)throw new Error("[h2:error:createCustomerAccountClient] The request object does not contain a URL.");let d=u||(()=>rn(n)),l=new URL(n.url),m=l.protocol==="http:"?l.origin.replace("http","https"):l.origin,p=ct({requestUrl:m,defaultUrl:tn,redirectUrl:s}),y=`${r}/account/customer/api/${o}/graphql`,g={};async function h({query:C,type:S,variables:A={}}){let T=await I();if(!T)throw d();new Date().getTime();let x=await fetch(y,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":ce,Origin:m,Authorization:T},body:JSON.stringify({query:C,variables:A})});let D=await x.text(),L={url:y,response:x,type:S,query:C,queryVariables:A,errors:void 0,client:"customer"};if(!x.ok){if(x.status===401)throw pe(e),d();let w;try{w=X(D);}catch{w=[{message:D}];}Ce({...L,errors:w});}try{let w=X(D),{errors:j}=w,ye=j?.map(({message:ne,...F})=>new Z(ne,{...F,clientOperation:`customerAccount.${L.type}`,requestId:x.headers.get("x-request-id"),queryVariables:A,query:C}));return {...w,...j&&{errors:ye}}}catch{Ce({...L,errors:[{message:D}]});}}async function f(){if(!r||!t)return !1;let C=e.get(O),S=C?.accessToken,A=C?.expiresAt;if(!S||!A)return !1;let T=q?.();try{await gr({locks:g,expiresAt:A,session:e,customerAccountId:t,customerAccountUrl:r,httpsOrigin:m,debugInfo:{waitUntil:a,stackInfo:T,...ee(n)},exchangeForStorefrontCustomerAccessToken:Ee});}catch{return !1}return !0}async function v(){if(!await f())throw d()}async function I(){if(await f())return e.get(O)?.accessToken}async function k(C,S){return ve(r,t),C=se(C),ke(C,"customer.mutate"),ie(h({query:C,type:"mutation",...S}),{logErrors:i})}async function _(C,S){return ve(r,t),C=se(C),Ue(C,"customer.query"),ie(h({query:C,type:"query",...S}),{logErrors:i})}function oe(C){e.set(ue,{...e.get(ue),...C});}async function V(){if(await f())return e.get(ue)}async function Ee(){if(!c)return;let C=`#graphql
299
299
  mutation storefrontCustomerAccessTokenCreate {
300
300
  storefrontCustomerAccessTokenCreate {
301
301
  customerAccessToken
302
302
  }
303
303
  }
304
- `,{data:P}=await _(C),A=P?.storefrontCustomerAccessTokenCreate?.customerAccessToken;A&&re({customerAccessToken:A});}return {login:async C=>{Te(r,t);let P=new URL(`${r}/auth/oauth/authorize`),A=fr(),T=Fe();if(P.searchParams.set("client_id",t),P.searchParams.set("scope","openid email"),P.searchParams.append("response_type","code"),P.searchParams.append("redirect_uri",d),P.searchParams.set("scope","openid email https://api.customers.com/auth/customer.graphql"),P.searchParams.append("state",A),P.searchParams.append("nonce",T),C?.uiLocales){let[D,x]=C.uiLocales.split("-"),k=D.toLowerCase();x&&(k+=`-${x.toUpperCase()}`),P.searchParams.append("ui_locales",k);}let M=dr(),F=await lr(M);return e.set(O,{...e.get(O),codeVerifier:M,state:A,nonce:T,redirectPath:Ue(a.url)||_e(a,"Referer")||gr}),P.searchParams.append("code_challenge",F),P.searchParams.append("code_challenge_method","S256"),Ae(P.toString())},logout:async C=>{Te(r,t);let P=e.get(O)?.idToken,A=st({requestUrl:m,defaultUrl:m,redirectUrl:C?.postLogoutRedirectUri}),T=P?new URL(`${r}/auth/logout?${new URLSearchParams([["id_token_hint",P],["post_logout_redirect_uri",A]]).toString()}`).toString():A;return ue(e),Ae(T)},isLoggedIn:f,handleAuthStatus:v,getAccessToken:I,getApiUrl:()=>p,mutate:_,query:U,authorize:async()=>{Te(r,t);let C=y.searchParams.get("code"),P=y.searchParams.get("state");if(!C||!P)throw ue(e),new V("Unauthorized","No code or state parameter found in the redirect URL.");if(e.get(O)?.state!==P)throw ue(e),new V("Unauthorized","The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");let A=t,T=new URLSearchParams;T.append("grant_type","authorization_code"),T.append("client_id",A),T.append("redirect_uri",d),T.append("code",C);let M=e.get(O)?.codeVerifier;if(!M)throw new V("Unauthorized","No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");T.append("code_verifier",M);let F={"content-type":"application/x-www-form-urlencoded","User-Agent":se,Origin:m},D=q?.();new Date().getTime();let k=`${r}/auth/oauth/token`,R=await fetch(k,{method:"POST",headers:F,body:T});if(!R.ok)throw new Response(await R.text(),{status:R.status,headers:{"Content-Type":"text/html; charset=utf-8"}});let{access_token:W,expires_in:le,id_token:oe,refresh_token:$}=await R.json(),ye=e.get(O)?.nonce,Lt=await mr(oe);if(ye!==Lt)throw new V("Unauthorized",`Returned nonce does not match: ${ye} !== ${Lt}`);let zr=await mt(W,t,r,m,{waitUntil:n,stackInfo:D,...Z(a)}),Jr=e.get(O)?.redirectPath;return e.set(O,{accessToken:zr,expiresAt:new Date(new Date().getTime()+(le-120)*1e3).getTime()+"",refreshToken:$,idToken:oe}),await Re(),Ae(Jr||gr)},UNSTABLE_setBuyer:re,UNSTABLE_getBuyer:N}}function Te(e,t){try{if(!e||!t)throw Error();new URL(e);}catch{console.error(new Error("[h2:error:customerAccount] You do not have the valid credential to use Customer Account API.\nRun `h2 env pull` to link your store credentials."));let r="Internal Server Error";throw new Response(r,{status:500})}}var Yo="https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json";async function Xo({request:e,changelogUrl:t}){new URL(e.url).searchParams;return fetch(t||Yo)}var Cr="cartFormInput";function B({children:e,action:t,inputs:r,route:o,fetcherKey:a}){let n=react$1.useFetcher({key:a});return jsxRuntime.jsxs(n.Form,{action:o||"",method:"post",children:[(t||r)&&jsxRuntime.jsx("input",{type:"hidden",name:Cr,value:JSON.stringify({action:t,inputs:r})}),typeof e=="function"?e(n):e]})}B.INPUT_NAME=Cr;B.ACTIONS={AttributesUpdateInput:"AttributesUpdateInput",BuyerIdentityUpdate:"BuyerIdentityUpdate",Create:"Create",DiscountCodesUpdate:"DiscountCodesUpdate",LinesAdd:"LinesAdd",LinesRemove:"LinesRemove",LinesUpdate:"LinesUpdate",NoteUpdate:"NoteUpdate",SelectedDeliveryOptionsUpdate:"SelectedDeliveryOptionsUpdate",MetafieldsSet:"MetafieldsSet",MetafieldDelete:"MetafieldDelete"};function ea(e){let t={};for(let i of e.entries()){let u=i[0],c=e.getAll(u);t[u]=c.length>1?c:i[1];}let{cartFormInput:r,...o}=t,{action:a,inputs:n}=r?JSON.parse(String(r)):{};return {action:a,inputs:{...n,...o}}}B.getFormInput=ea;var b=`#graphql
304
+ `,{data:S}=await k(C),A=S?.storefrontCustomerAccessTokenCreate?.customerAccessToken;A&&oe({customerAccessToken:A});}return {login:async C=>{ve(r,t);let S=new URL(`${r}/auth/oauth/authorize`),A=Pr(),T=He();if(S.searchParams.set("client_id",t),S.searchParams.set("scope","openid email"),S.searchParams.append("response_type","code"),S.searchParams.append("redirect_uri",p),S.searchParams.set("scope","openid email https://api.customers.com/auth/customer.graphql"),S.searchParams.append("state",A),S.searchParams.append("nonce",T),C?.uiLocales){let[x,D]=C.uiLocales.split("-"),L=x.toLowerCase();D&&(L+=`-${D.toUpperCase()}`),S.searchParams.append("ui_locales",L);}let M=hr(),H=await Cr(M);return e.set(O,{...e.get(O),codeVerifier:M,state:A,nonce:T,redirectPath:_e(n.url)||$(n,"Referer")||vr}),S.searchParams.append("code_challenge",H),S.searchParams.append("code_challenge_method","S256"),Te(S.toString())},logout:async C=>{ve(r,t);let S=e.get(O)?.idToken,A=ct({requestUrl:m,defaultUrl:m,redirectUrl:C?.postLogoutRedirectUri}),T=S?new URL(`${r}/auth/logout?${new URLSearchParams([["id_token_hint",S],["post_logout_redirect_uri",A]]).toString()}`).toString():A;return pe(e),Te(T)},isLoggedIn:f,handleAuthStatus:v,getAccessToken:I,getApiUrl:()=>y,mutate:k,query:_,authorize:async()=>{ve(r,t);let C=l.searchParams.get("code"),S=l.searchParams.get("state");if(!C||!S)throw pe(e),new N("Unauthorized","No code or state parameter found in the redirect URL.");if(e.get(O)?.state!==S)throw pe(e),new N("Unauthorized","The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");let A=t,T=new URLSearchParams;T.append("grant_type","authorization_code"),T.append("client_id",A),T.append("redirect_uri",p),T.append("code",C);let M=e.get(O)?.codeVerifier;if(!M)throw new N("Unauthorized","No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");T.append("code_verifier",M);let H={"content-type":"application/x-www-form-urlencoded","User-Agent":ce,Origin:m},x=q?.();new Date().getTime();let L=`${r}/auth/oauth/token`,w=await fetch(L,{method:"POST",headers:H,body:T});if(!w.ok)throw new Response(await w.text(),{status:w.status,headers:{"Content-Type":"text/html; charset=utf-8"}});let{access_token:j,expires_in:ye,id_token:ne,refresh_token:F}=await w.json(),fe=e.get(O)?.nonce,Mt=await Ar(ne);if(fe!==Mt)throw new N("Unauthorized",`Returned nonce does not match: ${fe} !== ${Mt}`);let ro=await gt(j,t,r,m,{waitUntil:a,stackInfo:x,...ee(n)}),oo=e.get(O)?.redirectPath;return e.set(O,{accessToken:ro,expiresAt:new Date(new Date().getTime()+(ye-120)*1e3).getTime()+"",refreshToken:F,idToken:ne}),await Ee(),Te(oo||vr)},UNSTABLE_setBuyer:oe,UNSTABLE_getBuyer:V}}function ve(e,t){try{if(!e||!t)throw Error();new URL(e);}catch{console.error(new Error("[h2:error:customerAccount] You do not have the valid credential to use Customer Account API.\nRun `h2 env pull` to link your store credentials."));let r="Internal Server Error";throw new Response(r,{status:500})}}var on="https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json";async function nn({request:e,changelogUrl:t}){new URL(e.url).searchParams;return fetch(t||on)}var Ir="cartFormInput";function G({children:e,action:t,inputs:r,route:o,fetcherKey:n}){let a=react$1.useFetcher({key:n});return jsxRuntime.jsxs(a.Form,{action:o||"",method:"post",children:[(t||r)&&jsxRuntime.jsx("input",{type:"hidden",name:Ir,value:JSON.stringify({action:t,inputs:r})}),typeof e=="function"?e(a):e]})}G.INPUT_NAME=Ir;G.ACTIONS={AttributesUpdateInput:"AttributesUpdateInput",BuyerIdentityUpdate:"BuyerIdentityUpdate",Create:"Create",DiscountCodesUpdate:"DiscountCodesUpdate",LinesAdd:"LinesAdd",LinesRemove:"LinesRemove",LinesUpdate:"LinesUpdate",NoteUpdate:"NoteUpdate",SelectedDeliveryOptionsUpdate:"SelectedDeliveryOptionsUpdate",MetafieldsSet:"MetafieldsSet",MetafieldDelete:"MetafieldDelete"};function sn(e){let t={};for(let s of e.entries()){let u=s[0],i=e.getAll(u);t[u]=i.length>1?i:s[1];}let{cartFormInput:r,...o}=t,{action:n,inputs:a}=r?JSON.parse(String(r)):{};return {action:n,inputs:{...a,...o}}}G.getFormInput=sn;var b=`#graphql
305
305
  fragment CartApiError on CartUserError {
306
306
  message
307
307
  field
308
308
  code
309
309
  }
310
- `,w=`#graphql
310
+ `,R=`#graphql
311
311
  fragment CartApiMutation on Cart {
312
312
  id
313
313
  totalQuantity
314
314
  }
315
- `;function ht(e){return async(t,r)=>{let o=e.customerAccount?await e.customerAccount.UNSTABLE_getBuyer():void 0,{cartId:a,...n}=r||{},{buyerIdentity:i,...u}=t,{cartCreate:c,errors:s}=await e.storefront.mutate(oa(e.cartFragment),{variables:{input:{...u,buyerIdentity:{...o,...i}},...n}});return S(c,s)}}var oa=(e=w)=>`#graphql
315
+ `;function Ct(e){return async(t,r)=>{let o=e.customerAccount?await e.customerAccount.UNSTABLE_getBuyer():void 0,{cartId:n,...a}=r||{},{buyerIdentity:s,...u}=t,{cartCreate:i,errors:c}=await e.storefront.mutate(pn(e.cartFragment),{variables:{input:{...u,buyerIdentity:{...o,...s}},...a}});return P(i,c)}}var pn=(e=R)=>`#graphql
316
316
  mutation cartCreate(
317
317
  $input: CartInput!
318
318
  $country: CountryCode = ZZ
@@ -330,7 +330,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
330
330
  }
331
331
  ${e}
332
332
  ${b}
333
- `;function gt({storefront:e,customerAccount:t,getCartId:r,cartFragment:o}){return async a=>{let n=r();if(!n)return null;let[i,{cart:u,errors:c}]=await Promise.all([t?t.isLoggedIn():!1,e.query(aa(o),{variables:{cartId:n,...a},cache:e.CacheNone()})]);if(i&&u?.checkoutUrl){let s=new URL(u.checkoutUrl);s.searchParams.set("logged_in","true"),u.checkoutUrl=s.toString();}return u||c?S(u,c):null}}var aa=(e=na)=>`#graphql
333
+ `;function St({storefront:e,customerAccount:t,getCartId:r,cartFragment:o}){return async n=>{let a=r();if(!a)return null;let[s,{cart:u,errors:i}]=await Promise.all([t?t.isLoggedIn():!1,e.query(dn(o),{variables:{cartId:a,...n},cache:e.CacheNone()})]);if(s&&u?.checkoutUrl){let c=new URL(u.checkoutUrl);c.searchParams.set("logged_in","true"),u.checkoutUrl=c.toString();}return u||i?P(u,i):null}}var dn=(e=ln)=>`#graphql
334
334
  query CartQuery(
335
335
  $cartId: ID!
336
336
  $numCartLines: Int = 100
@@ -343,7 +343,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
343
343
  }
344
344
 
345
345
  ${e}
346
- `,na=`#graphql
346
+ `,ln=`#graphql
347
347
  fragment CartApiQuery on Cart {
348
348
  updatedAt
349
349
  id
@@ -451,7 +451,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
451
451
  width
452
452
  height
453
453
  }
454
- `;function Ct(e){return async(t,r)=>{let{cartLinesAdd:o,errors:a}=await e.storefront.mutate(ia(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return S(o,a)}}var ia=(e=w)=>`#graphql
454
+ `;function Pt(e){return async(t,r)=>{let{cartLinesAdd:o,errors:n}=await e.storefront.mutate(yn(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return P(o,n)}}var yn=(e=R)=>`#graphql
455
455
  mutation cartLinesAdd(
456
456
  $cartId: ID!
457
457
  $lines: [CartLineInput!]!
@@ -470,7 +470,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
470
470
 
471
471
  ${e}
472
472
  ${b}
473
- `;var Pr="__h_pending_";function Sr(e){return Pr+e}function $e(e){return e.startsWith(Pr)}function qe(e,t){if(t.some(r=>$e(typeof r=="string"?r:r.id)))throw new Error(`Tried to perform an action on an optimistic line. Make sure to disable your "${e}" CartForm action when the line is optimistic.`)}function Pt(e){return async(t,r)=>{qe("updateLines",t);let{cartLinesUpdate:o,errors:a}=await e.storefront.mutate(sa(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return S(o,a)}}var sa=(e=w)=>`#graphql
473
+ `;var br="__h_pending_";function Rr(e){return br+e}function Fe(e){return e.startsWith(br)}function qe(e,t){if(t.some(r=>Fe(typeof r=="string"?r:r.id)))throw new Error(`Tried to perform an action on an optimistic line. Make sure to disable your "${e}" CartForm action when the line is optimistic.`)}function At(e){return async(t,r)=>{qe("updateLines",t);let{cartLinesUpdate:o,errors:n}=await e.storefront.mutate(fn(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return P(o,n)}}var fn=(e=R)=>`#graphql
474
474
  mutation cartLinesUpdate(
475
475
  $cartId: ID!
476
476
  $lines: [CartLineUpdateInput!]!
@@ -489,7 +489,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
489
489
 
490
490
  ${e}
491
491
  ${b}
492
- `;function St(e){return async(t,r)=>{qe("removeLines",t);let{cartLinesRemove:o,errors:a}=await e.storefront.mutate(ca(e.cartFragment),{variables:{cartId:e.getCartId(),lineIds:t,...r}});return S(o,a)}}var ca=(e=w)=>`#graphql
492
+ `;function Tt(e){return async(t,r)=>{qe("removeLines",t);let{cartLinesRemove:o,errors:n}=await e.storefront.mutate(mn(e.cartFragment),{variables:{cartId:e.getCartId(),lineIds:t,...r}});return P(o,n)}}var mn=(e=R)=>`#graphql
493
493
  mutation cartLinesRemove(
494
494
  $cartId: ID!
495
495
  $lineIds: [ID!]!
@@ -508,7 +508,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
508
508
 
509
509
  ${e}
510
510
  ${b}
511
- `;function At(e){return async(t,r)=>{let o=t.filter((i,u,c)=>c.indexOf(i)===u),{cartDiscountCodesUpdate:a,errors:n}=await e.storefront.mutate(ua(e.cartFragment),{variables:{cartId:e.getCartId(),discountCodes:o,...r}});return S(a,n)}}var ua=(e=w)=>`#graphql
511
+ `;function vt(e){return async(t,r)=>{let o=t.filter((s,u,i)=>i.indexOf(s)===u),{cartDiscountCodesUpdate:n,errors:a}=await e.storefront.mutate(gn(e.cartFragment),{variables:{cartId:e.getCartId(),discountCodes:o,...r}});return P(n,a)}}var gn=(e=R)=>`#graphql
512
512
  mutation cartDiscountCodesUpdate(
513
513
  $cartId: ID!
514
514
  $discountCodes: [String!]
@@ -526,7 +526,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
526
526
  }
527
527
  ${e}
528
528
  ${b}
529
- `;function Tt(e){return async(t,r)=>{t.companyLocationId&&e.customerAccount&&e.customerAccount.UNSTABLE_setBuyer({companyLocationId:t.companyLocationId});let o=e.customerAccount?await e.customerAccount.UNSTABLE_getBuyer():void 0,{cartBuyerIdentityUpdate:a,errors:n}=await e.storefront.mutate(pa(e.cartFragment),{variables:{cartId:e.getCartId(),buyerIdentity:{...o,...t},...r}});return S(a,n)}}var pa=(e=w)=>`#graphql
529
+ `;function It(e){return async(t,r)=>{t.companyLocationId&&e.customerAccount&&e.customerAccount.UNSTABLE_setBuyer({companyLocationId:t.companyLocationId});let o=e.customerAccount?await e.customerAccount.UNSTABLE_getBuyer():void 0,{cartBuyerIdentityUpdate:n,errors:a}=await e.storefront.mutate(hn(e.cartFragment),{variables:{cartId:e.getCartId(),buyerIdentity:{...o,...t},...r}});return P(n,a)}}var hn=(e=R)=>`#graphql
530
530
  mutation cartBuyerIdentityUpdate(
531
531
  $cartId: ID!
532
532
  $buyerIdentity: CartBuyerIdentityInput!
@@ -544,7 +544,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
544
544
  }
545
545
  ${e}
546
546
  ${b}
547
- `;function vt(e){return async(t,r)=>{let{cartNoteUpdate:o,errors:a}=await e.storefront.mutate(da(e.cartFragment),{variables:{cartId:e.getCartId(),note:t,...r}});return S(o,a)}}var da=(e=w)=>`#graphql
547
+ `;function bt(e){return async(t,r)=>{let{cartNoteUpdate:o,errors:n}=await e.storefront.mutate(Cn(e.cartFragment),{variables:{cartId:e.getCartId(),note:t,...r}});return P(o,n)}}var Cn=(e=R)=>`#graphql
548
548
  mutation cartNoteUpdate(
549
549
  $cartId: ID!
550
550
  $note: String!
@@ -562,7 +562,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
562
562
  }
563
563
  ${e}
564
564
  ${b}
565
- `;function It(e){return async(t,r)=>{let{cartSelectedDeliveryOptionsUpdate:o,errors:a}=await e.storefront.mutate(la(e.cartFragment),{variables:{cartId:e.getCartId(),selectedDeliveryOptions:t,...r}});return S(o,a)}}var la=(e=w)=>`#graphql
565
+ `;function Rt(e){return async(t,r)=>{let{cartSelectedDeliveryOptionsUpdate:o,errors:n}=await e.storefront.mutate(Sn(e.cartFragment),{variables:{cartId:e.getCartId(),selectedDeliveryOptions:t,...r}});return P(o,n)}}var Sn=(e=R)=>`#graphql
566
566
  mutation cartSelectedDeliveryOptionsUpdate(
567
567
  $cartId: ID!
568
568
  $selectedDeliveryOptions: [CartSelectedDeliveryOptionInput!]!
@@ -580,7 +580,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
580
580
  }
581
581
  ${e}
582
582
  ${b}
583
- `;function bt(e){return async(t,r)=>{let{cartAttributesUpdate:o,errors:a}=await e.storefront.mutate(ya(e.cartFragment),{variables:{cartId:r?.cartId||e.getCartId(),attributes:t}});return S(o,a)}}var ya=(e=w)=>`#graphql
583
+ `;function wt(e){return async(t,r)=>{let{cartAttributesUpdate:o,errors:n}=await e.storefront.mutate(Pn(e.cartFragment),{variables:{cartId:r?.cartId||e.getCartId(),attributes:t}});return P(o,n)}}var Pn=(e=R)=>`#graphql
584
584
  mutation cartAttributesUpdate(
585
585
  $cartId: ID!
586
586
  $attributes: [AttributeInput!]!
@@ -596,7 +596,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
596
596
  }
597
597
  ${e}
598
598
  ${b}
599
- `;function wt(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),a=t.map(u=>({...u,ownerId:o})),{cartMetafieldsSet:n,errors:i}=await e.storefront.mutate(fa(),{variables:{metafields:a}});return S({cart:{id:o},...n},i)}}var fa=()=>`#graphql
599
+ `;function Et(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),n=t.map(u=>({...u,ownerId:o})),{cartMetafieldsSet:a,errors:s}=await e.storefront.mutate(An(),{variables:{metafields:n}});return P({cart:{id:o},...a},s)}}var An=()=>`#graphql
600
600
  mutation cartMetafieldsSet(
601
601
  $metafields: [CartMetafieldsSetInput!]!
602
602
  $language: LanguageCode
@@ -611,7 +611,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
611
611
  }
612
612
  }
613
613
  }
614
- `;function Rt(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),{cartMetafieldDelete:a,errors:n}=await e.storefront.mutate(ma(),{variables:{input:{ownerId:o,key:t}}});return S({cart:{id:o},...a},n)}}var ma=()=>`#graphql
614
+ `;function Ot(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),{cartMetafieldDelete:n,errors:a}=await e.storefront.mutate(Tn(),{variables:{input:{ownerId:o,key:t}}});return P({cart:{id:o},...n},a)}}var Tn=()=>`#graphql
615
615
  mutation cartMetafieldDelete(
616
616
  $input: CartMetafieldDeleteInput!
617
617
  ) {
@@ -623,7 +623,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
623
623
  }
624
624
  }
625
625
  }
626
- `;var ga=e=>{let t=cookie.parse(e.get("Cookie")||"");return ()=>t.cart?`gid://shopify/Cart/${t.cart}`:void 0};var Pa=e=>t=>{let r=new Headers;return r.append("Set-Cookie",cookie.stringify("cart",t.split("/").pop()||"",{path:"/",...e})),r};function Sa(e){let{getCartId:t,setCartId:r,storefront:o,customerAccount:a,cartQueryFragment:n,cartMutateFragment:i}=e,u=t(),c=()=>u||t(),s={storefront:o,getCartId:c,cartFragment:i,customerAccount:a},l=ht(s),y=async function(...d){let p=await l(...d);return u=p?.cart?.id,p},m={get:gt({storefront:o,customerAccount:a,getCartId:c,cartFragment:n}),getCartId:c,setCartId:r,create:y,addLines:async(d,p)=>{let h=d.map(g=>({attributes:g.attributes,quantity:g.quantity,merchandiseId:g.merchandiseId,sellingPlanId:g.sellingPlanId}));return u||p?.cartId?await Ct(s)(h,p):await y({lines:h},p)},updateLines:Pt(s),removeLines:St(s),updateDiscountCodes:async(d,p)=>u||p?.cartId?await At(s)(d,p):await y({discountCodes:d},p),updateBuyerIdentity:async(d,p)=>u||p?.cartId?await Tt(s)(d,p):await y({buyerIdentity:d},p),updateNote:async(d,p)=>u||p?.cartId?await vt(s)(d,p):await y({note:d},p),updateSelectedDeliveryOption:It(s),updateAttributes:async(d,p)=>u||p?.cartId?await bt(s)(d,p):await y({attributes:d},p),setMetafields:async(d,p)=>u||p?.cartId?await wt(s)(d,p):await y({metafields:d},p),deleteMetafield:Rt(s)};return "customMethods"in e?{...m,...e.customMethods??{}}:m}function Ta(e){let t=react$1.useFetchers();if(!t||!t.length)return e;let r=e?.lines?structuredClone(e):{lines:{nodes:[]}},o=r.lines.nodes,a=!1;for(let{formData:n}of t){if(!n)continue;let i=B.getFormInput(n);if(i.action===B.ACTIONS.LinesAdd)for(let u of i.inputs.lines){if(!u.selectedVariant){console.error("[h2:error:useOptimisticCart] No selected variant was passed in the cart action. Make sure to pass the selected variant if you want to use an optimistic cart");continue}let c=o.find(s=>s.merchandise.id===u.selectedVariant?.id);a=!0,c?(c.quantity=(c.quantity||1)+(u.quantity||1),c.isOptimistic=!0):o.unshift({id:Sr(u.selectedVariant.id),merchandise:u.selectedVariant,isOptimistic:!0,quantity:u.quantity||1});}else if(i.action===B.ACTIONS.LinesRemove)for(let u of i.inputs.lineIds){let c=o.findIndex(s=>s.id===u);if(c!==-1){if($e(o[c].id)){console.error("[h2:error:useOptimisticCart] Tried to remove an optimistic line that has not been added to the cart yet");continue}o.splice(c,1),a=!0;}else console.warn(`[h2:warn:useOptimisticCart] Tried to remove line '${u}' but it doesn't exist in the cart`);}else if(i.action===B.ACTIONS.LinesUpdate)for(let u of i.inputs.lines){let c=o.findIndex(s=>u.id===s.id);if(c>-1){if($e(o[c].id)){console.error("[h2:error:useOptimisticCart] Tried to update an optimistic line that has not been added to the cart yet");continue}o[c].quantity=u.quantity,o[c].quantity===0&&o.splice(c,1),a=!0;}else console.warn(`[h2:warn:useOptimisticCart] Tried to update line '${u.id}' but it doesn't exist in the cart`);}}return a&&(r.isOptimistic=a),r}function Ea({handle:e,options:t=[],variants:r=[],productPath:o="products",waitForNavigation:a=!1,children:n}){let i=r instanceof Array?r:hydrogenReact.flattenConnection(r),{searchParams:u,path:c,alreadyOnProductPage:s}=Da(e,o,a),l=t.filter(y=>y?.values?.length===1);return react.createElement(react.Fragment,null,...react.useMemo(()=>t.map(y=>{let m,d=[];for(let p of y.values){let h=new URLSearchParams(s?u:void 0);h.set(y.name,p),l.forEach(_=>{h.set(_.name,_.values[0]);});let g=i.find(_=>_?.selectedOptions?.every(U=>h.get(U?.name)===U?.value)),f=u.get(y.name),v=f?f===p:!1;v&&(m=p);let I="?"+h.toString();d.push({value:p,isAvailable:g?g.availableForSale:!0,to:c+I,search:I,isActive:v,variant:g});}return n({option:{name:y.name,value:m,values:d}})}),[t,i,n]))}var Oa=e=>{if(typeof e?.url>"u")throw new TypeError(`Expected a Request instance, got ${typeof e}`);let t=new URL(e.url).searchParams,r=[];return t.forEach((o,a)=>{r.push({name:a,value:o});}),r};function Da(e,t,r){let{pathname:o,search:a}=react$1.useLocation(),n=react$1.useNavigation();return react.useMemo(()=>{let i=/(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(o),u=i&&i.length>0;t=t.startsWith("/")?t.substring(1):t;let c=u?`${i[0]}${t}/${e}`:`/${t}/${e}`;return {searchParams:new URLSearchParams(r||n.state!=="loading"?a:n.location.search),alreadyOnProductPage:c===o,path:c}},[o,a,r,e,t,n])}function _a(e,t){let r=react$1.useNavigation(),[o,a]=react.useState([]);if(react.useEffect(()=>{Promise.resolve(t).then(n=>{n&&a(n instanceof Array?n:n.product?.variants?.nodes||[]);}).catch(n=>{reportError(new Error("[h2:error:useOptimisticVariant] An error occurred while resolving the variants for the optimistic product hook.",{cause:n}));});},[t]),r.state==="loading"){let n=new URLSearchParams(r.location.search),i=!1,u=o.find(c=>c.selectedOptions?c.selectedOptions.every(s=>n.get(s.name)===s.value):(i||(i=!0,reportError(new Error("[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field."))),!1));if(u)return {...u,isOptimistic:!0}}return e}var Tr=react.createContext(void 0),Fa=Tr.Provider,Et=()=>react.useContext(Tr);function $a(e){let t=Fe(),r=qa(t,e);return {nonce:t,header:r,NonceProvider:({children:a})=>react.createElement(Fa,{value:t},a)}}function qa(e,t){let{shop:r,...o}=t??{},a=`'nonce-${e}'`,n=["'self'","'unsafe-inline'","https://cdn.shopify.com"],i=["'self'","https://monorail-edge.shopifysvc.com"];r&&r.checkoutDomain&&i.push(`https://${r.checkoutDomain}`),r&&r.storeDomain&&i.push(`https://${r.storeDomain}`);let c={baseUri:["'self'"],defaultSrc:["'self'",a,"https://cdn.shopify.com","https://shopify.com"],frameAncestors:["'none'"],styleSrc:n,connectSrc:i},s=Object.assign({},c,o);for(let l in c){let y=o[l];l&&y&&(s[l]=Ha(y,c[l]));}return s.scriptSrc instanceof Array&&!s.scriptSrc.includes(a)?s.scriptSrc.push(a):s.defaultSrc instanceof Array&&!s.defaultSrc.includes(a)&&s.defaultSrc.push(a),Ma__default.default({directives:s})}function Ha(e,t){let r=typeof t=="string"?[t]:t,o=Array.isArray(e)?e:[String(e)];return Array.isArray(r)?r.every(n=>n==="'none'")?o:[...o,...r]:r}var Ba=react.forwardRef((e,t)=>{let r=Et();return jsxRuntime.jsx("script",{suppressHydrationWarning:!0,...e,nonce:r,ref:t})});function ja(e){let t=react$1.useFetchers(),r={};for(let{formData:o}of t)if(o?.get("optimistic-identifier")===e)try{if(o.has("optimistic-data")){let a=JSON.parse(String(o.get("optimistic-data")));Object.assign(r,a);}}catch{}return r}function Ka({id:e,data:t}){return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-identifier",value:e}),jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-data",value:JSON.stringify(t)})]})}function Xa(e){return jsxRuntime.jsx(hydrogenReact.ShopPayButton,{channel:"hydrogen",...e})}function pe(e){let{type:t,data:r={},customData:o}=e,a=react$1.useLocation(),{publish:n,cart:i,prevCart:u,shop:c,customData:s}=G(),l=a.pathname+a.search,y={...r,customData:{...s,...o},cart:i,prevCart:u,shop:c};return react.useEffect(()=>{c?.shopId&&(y={...y,url:window.location.href},n(t,y));},[n,l,c?.shopId]),null}function Ir(e){return jsxRuntime.jsx(pe,{...e,type:"page_viewed"})}function br(e){return jsxRuntime.jsx(pe,{...e,type:"product_viewed"})}function wr(e){return jsxRuntime.jsx(pe,{...e,type:"collection_viewed"})}function Rr(e){return jsxRuntime.jsx(pe,{...e,type:"cart_viewed"})}function Er(e){return jsxRuntime.jsx(pe,{...e,type:"search_viewed"})}function Or(e){return jsxRuntime.jsx(pe,{...e})}var L={PAGE_VIEWED:"page_viewed",PRODUCT_VIEWED:"product_viewed",COLLECTION_VIEWED:"collection_viewed",CART_VIEWED:"cart_viewed",SEARCH_VIEWED:"search_viewed",CART_UPDATED:"cart_updated",PRODUCT_ADD_TO_CART:"product_added_to_cart",PRODUCT_REMOVED_FROM_CART:"product_removed_from_cart",CUSTOM_EVENT:"custom_"};var an="https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.1/consent-tracking-api.js",nn="https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js";function xr(e){console.error(`[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${e} configuration.`);}function Ot(e){let{withPrivacyBanner:t=!0,onVisitorConsentCollected:r,onReady:o,...a}=e,n=react.useRef(!1),i=hydrogenReact.useLoadScript(t?nn:an,{attributes:{id:"customer-privacy-api"}});react.useEffect(()=>{let u=c=>{r&&r(c.detail);};return document.addEventListener("visitorConsentCollected",u),()=>{document.removeEventListener("visitorConsentCollected",u);}},[r]),react.useEffect(()=>{if(i!=="done"||n.current)return;n.current=!0;let{checkoutDomain:u,storefrontAccessToken:c}=a;u||xr("checkoutDomain"),c||xr("storefrontAccessToken"),(c.startsWith("shpat_")||c.length!==32)&&console.error("[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token");let s={checkoutRootDomain:u,storefrontAccessToken:c};if(u){let m=window.document.location.host,d=u.split(".").reverse(),p=m.split(".").reverse(),h=[];d.forEach((g,f)=>{g===p[f]&&h.push(g);}),m=h.reverse().join("."),m&&(s.storefrontRootDomain=m);}if(t&&window?.privacyBanner&&window.privacyBanner?.loadBanner(s),!window.Shopify?.customerPrivacy)return;let l=window.Shopify.customerPrivacy.setTrackingConsent;function y(m,d){l({...m,headlessStorefront:!0,...s},d);}window.Shopify.customerPrivacy.setTrackingConsent=y,o&&o();},[i,t,a]);}function Dt(){try{return window.Shopify&&window.Shopify.customerPrivacy?window.Shopify?.customerPrivacy:null}catch{return null}}function pn(){let e=Dt();if(!e)throw new Error("Shopify Customer Privacy API not available. Must be used within a useEffect. Make sure to load the Shopify Customer Privacy API with useCustomerPrivacy() or <AnalyticsProvider>.");return e}function Lr({consent:e,onReady:t,domain:r}){let{subscribe:o,register:a,canTrack:n}=G(),[i,u]=react.useState(!1),[c,s]=react.useState(!1),{ready:l}=a("Internal_Shopify_Analytics"),{ready:y}=a("Internal_Shopify_CustomerPrivacy"),m=()=>{i&&c&&t();},d=()=>{s(!0),y(),m();},{checkoutDomain:p,storefrontAccessToken:h,withPrivacyBanner:g}=e;return Ot({checkoutDomain:p||"mock.shop",storefrontAccessToken:h||"abcdefghijklmnopqrstuvwxyz123456",withPrivacyBanner:g,onVisitorConsentCollected:d,onReady:()=>{setTimeout(d,3e3);}}),hydrogenReact.useShopifyCookies({hasUserConsent:i&&c?n():!0,domain:r,checkoutDomain:p}),react.useEffect(()=>{o(L.PAGE_VIEWED,ln),o(L.PRODUCT_VIEWED,yn),o(L.COLLECTION_VIEWED,fn),o(L.SEARCH_VIEWED,mn),o(L.PRODUCT_ADD_TO_CART,hn),l(),u(!0),m();},[o,l]),null}function He(e){console.error(`[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${e} configuration.`);}function be(e){let t=pn(),r=t.analyticsProcessingAllowed();if(!e?.shop?.shopId){He("shopId");return}if(!e?.shop?.acceptedLanguage){He("acceptedLanguage");return}if(!e?.shop?.currency){He("currency");return}if(!e?.shop?.hydrogenSubchannelId){He("hydrogenSubchannelId");return}return {shopifySalesChannel:"hydrogen",...e.shop,hasUserConsent:r,...hydrogenReact.getClientBrowserParameters(),ccpaEnforced:!t.saleOfDataAllowed(),gdprEnforced:!(t.marketingAllowed()&&t.analyticsProcessingAllowed())}}function dn(e,t){if(t===null)return;let r=be(e);return r?{...r,cartId:t.id}:void 0}var z={};function ln(e){let t=be(e);t&&(hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PAGE_VIEW_2,payload:{...t,...z}}),z={});}function yn(e){let t=be(e);if(t&&_r({type:"product",products:e.products})){let r=xt(e.products);z={pageType:hydrogenReact.AnalyticsPageType.product,resourceId:r[0].productGid},t={...t,...z,products:xt(e.products)},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PRODUCT_VIEW,payload:t});}}function fn(e){let t=be(e);t&&(z={pageType:hydrogenReact.AnalyticsPageType.collection,resourceId:e.collection.id},t={...t,...z,collectionHandle:e.collection.handle},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.COLLECTION_VIEW,payload:t}));}function mn(e){let t=be(e);t&&(z={pageType:hydrogenReact.AnalyticsPageType.search},t={...t,...z,searchString:e.searchTerm},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.SEARCH_VIEW,payload:t}));}function hn(e){let{cart:t,currentLine:r}=e,o=dn(e,t);!o||!r?.id||gn({matchedLine:r,eventPayload:o});}function gn({matchedLine:e,eventPayload:t}){let r={id:e.merchandise.product.id,variantId:e.id,title:e.merchandise.product.title,variantTitle:e.merchandise.title,vendor:e.merchandise.product.vendor,price:e.merchandise.price.amount,quantity:e.quantity,productType:e.merchandise.product.productType,sku:e.merchandise.sku};_r({type:"cart",products:[r]})&&hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.ADD_TO_CART,payload:{...t,products:xt([r])}});}function te(e,t,r,o){if(e==="cart"){let a=`${r?"merchandise":"merchandise.product"}.${t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up cart analytics events because the \`cart.lines[].${a}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartLine on CartLine\` is defined and make sure \`${a}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L25-L56.`);}else {let a=`${o||t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up product view analytics events because the \`${a}\` is missing from your \`<Analytics.ProductView>\`. Make sure \`${a}\` is part of your products data prop. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx#L159-L165.`);}}function _r({type:e,products:t}){return !t||t.length===0?(te(e,"",!1,"data.products"),!1):(t.forEach(r=>{if(!r.id)return te(e,"id",!1),!1;if(!r.title)return te(e,"title",!1),!1;if(!r.price)return te(e,"price.amount",!0,"price"),!1;if(!r.vendor)return te(e,"vendor",!1),!1;if(!r.variantId)return te(e,"id",!0,"variantId"),!1;if(!r.variantTitle)return te(e,"title",!0,"variantTitle"),!1}),!0)}function xt(e){return e.map(t=>{let r={productGid:t.id,variantGid:t.variantId,name:t.title,variantName:t.variantTitle,brand:t.vendor,price:t.price,quantity:t.quantity||1,category:t.productType};return t.sku&&(r.sku=t.sku),t.productType&&(r.category=t.productType),r})}function Vr(e){console.error(`[h2:error:CartAnalytics] Can't set up cart analytics events because the \`cart.${e}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartApiQuery on Cart\` is defined and make sure \`${e}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L59.`);}function Mr({cart:e,setCarts:t}){let{publish:r,shop:o,customData:a,canTrack:n,cart:i,prevCart:u}=G(),c=react.useRef(null);return react.useEffect(()=>{if(e)return Promise.resolve(e).then(s=>{if(s&&s.lines){if(!s.id){Vr("id");return}if(!s.updatedAt){Vr("updatedAt");return}}t(({cart:l,prevCart:y})=>s?.updatedAt!==l?.updatedAt?{cart:s,prevCart:l}:{cart:l,prevCart:y});}),()=>{}},[t,e]),react.useEffect(()=>{if(!i||!i?.updatedAt||i?.updatedAt===u?.updatedAt)return;let s;try{s=JSON.parse(localStorage.getItem("cartLastUpdatedAt")||"");}catch{s=null;}if(i.id===s?.id&&i.updatedAt===s?.updatedAt)return;let l={eventTimestamp:Date.now(),cart:i,prevCart:u,shop:o,customData:a};if(i.updatedAt===c.current)return;c.current=i.updatedAt,r("cart_updated",l),localStorage.setItem("cartLastUpdatedAt",JSON.stringify({id:i.id,updatedAt:i.updatedAt}));let y=u?.lines?hydrogenReact.flattenConnection(u?.lines):[],m=i.lines?hydrogenReact.flattenConnection(i.lines):[];y?.forEach(d=>{let p=m.filter(h=>d.id===h.id);if(p?.length===1){let h=p[0];d.quantity<h.quantity?r("product_added_to_cart",{...l,prevLine:d,currentLine:h}):d.quantity>h.quantity&&r("product_removed_from_cart",{...l,prevLine:d,currentLine:h});}else r("product_removed_from_cart",{...l,prevLine:d});}),m?.forEach(d=>{let p=y.filter(h=>d.id===h.id);(!p||p.length===0)&&r("product_added_to_cart",{...l,currentLine:d});});},[i,u,r,o,a,n]),null}var vn="https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-1bd852a.min.js";function Fr({shop:e}){let t=react.useRef(!1),{subscribe:r,register:o}=G(),{ready:a}=o("Internal_Shopify_Perf_Kit"),n=hydrogenReact.useLoadScript(vn,{attributes:{id:"perfkit","data-application":"hydrogen","data-shop-id":hydrogenReact.parseGid(e.shopId).id.toString(),"data-storefront-id":e.hydrogenSubchannelId,"data-monorail-region":"global","data-spa-mode":"true","data-resource-timing-sampling-rate":"100"}});return react.useEffect(()=>{n!=="done"||t.current||(t.current=!0,r(L.PAGE_VIEWED,()=>{window.PerfKit?.navigate();}),r(L.PRODUCT_VIEWED,()=>{window.PerfKit?.setPageType("product");}),r(L.COLLECTION_VIEWED,()=>{window.PerfKit?.setPageType("collection");}),r(L.SEARCH_VIEWED,()=>{window.PerfKit?.setPageType("search");}),r(L.CART_VIEWED,()=>{window.PerfKit?.setPageType("cart");}),a());},[r,a,n]),null}var On={canTrack:()=>!1,cart:null,customData:{},prevCart:null,publish:()=>{},shop:null,subscribe:()=>{},register:()=>({ready:()=>{}})},Gr=react.createContext(On),Ge=new Map,we={};function Wr(){return Object.values(we).every(Boolean)}function $r(e,t){Ge.has(e)||Ge.set(e,new Map),Ge.get(e)?.set(t.toString(),t);}var We=new Map;function qr(e,t){if(!Wr()){We.set(e,t);return}jr(e,t);}function jr(e,t){(Ge.get(e)??new Map).forEach((r,o)=>{try{r(t);}catch(a){typeof a=="object"&&a instanceof Error?console.error("Analytics publish error",a.message,o,a.stack):console.error("Analytics publish error",a,o);}});}function Hr(e){return we.hasOwnProperty(e)||(we[e]=!1),{ready:()=>{we[e]=!0,Wr()&&We.size>0&&(We.forEach((t,r)=>{jr(r,t);}),We.clear());}}}function Qr(){try{return window.Shopify.customerPrivacy.analyticsProcessingAllowed()}catch{}return !1}function Br(e,t){return `[h2:error:Analytics.Provider] - ${e} is required. Make sure ${t} is defined in your environment variables. See https://h2o.fyi/analytics/consent to learn how to setup environment variables in the Shopify admin.`}function Dn({canTrack:e,cart:t,children:r,consent:o,customData:a={},shop:n=null,disableThrowOnError:i=!1,cookieDomain:u}){let c=react.useRef(!1),{shop:s}=xn(n),[l,y]=react.useState(!!e),[m,d]=react.useState({cart:null,prevCart:null}),[p,h]=react.useState(e?()=>e:()=>Qr);if(s)if(/\/68817551382$/.test(s.shopId))Wt("[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.");else {if(!o.checkoutDomain){let f=Br("consent.checkoutDomain","PUBLIC_CHECKOUT_DOMAIN");nt(f);}if(!o.storefrontAccessToken){let f=Br("consent.storefrontAccessToken","PUBLIC_STOREFRONT_API_TOKEN");nt(f);}}let g=react.useMemo(()=>({canTrack:p,...m,customData:a,publish:p()?qr:()=>{},shop:s,subscribe:$r,register:Hr}),[l,p(),p,JSON.stringify(p),m,m.cart?.updatedAt,m.prevCart,qr,$r,a,s,Hr,JSON.stringify(we)]);return jsxRuntime.jsxs(Gr.Provider,{value:g,children:[r,!!s&&jsxRuntime.jsx(Ir,{}),!!s&&!!t&&jsxRuntime.jsx(Mr,{cart:t,setCarts:d}),!!s&&o.checkoutDomain&&jsxRuntime.jsx(Lr,{consent:o,onReady:()=>{c.current=!0,y(!0),h(()=>Qr);},domain:u}),!!s&&jsxRuntime.jsx(Fr,{shop:s})]})}function G(){let e=react.useContext(Gr);if(!e)throw new Error("[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>");return e}function xn(e){let[t,r]=react.useState(null);return react.useEffect(()=>(Promise.resolve(e).then(r),()=>{}),[r,e]),{shop:t}}async function kn({storefront:e,publicStorefrontId:t="0"}){return e.query(Ln,{cache:e.CacheLong()}).then(({shop:r,localization:o})=>({shopId:r.id,acceptedLanguage:o.language.isoCode,currency:o.country.currency.isoCode,hydrogenSubchannelId:t}))}var Ln=`#graphql
626
+ `;var xt=e=>{let t=cookie.parse(st(e,"Cookie")||"");return ()=>t.cart?`gid://shopify/Cart/${t.cart}`:void 0};var Dt=e=>t=>{let r=new Headers;return r.append("Set-Cookie",cookie.stringify("cart",t.split("/").pop()||"",{path:"/",...e})),r};function Lt(e){let{getCartId:t,setCartId:r,storefront:o,customerAccount:n,cartQueryFragment:a,cartMutateFragment:s}=e,u=t(),i=()=>u||t(),c={storefront:o,getCartId:i,cartFragment:s,customerAccount:n},d=Ct(c),l=async function(...p){let y=await d(...p);return u=y?.cart?.id,y},m={get:St({storefront:o,customerAccount:n,getCartId:i,cartFragment:a}),getCartId:i,setCartId:r,create:l,addLines:async(p,y)=>{let g=p.map(h=>({attributes:h.attributes,quantity:h.quantity,merchandiseId:h.merchandiseId,sellingPlanId:h.sellingPlanId}));return u||y?.cartId?await Pt(c)(g,y):await l({lines:g},y)},updateLines:At(c),removeLines:Tt(c),updateDiscountCodes:async(p,y)=>u||y?.cartId?await vt(c)(p,y):await l({discountCodes:p},y),updateBuyerIdentity:async(p,y)=>u||y?.cartId?await It(c)(p,y):await l({buyerIdentity:p},y),updateNote:async(p,y)=>u||y?.cartId?await bt(c)(p,y):await l({note:p},y),updateSelectedDeliveryOption:Rt(c),updateAttributes:async(p,y)=>u||y?.cartId?await wt(c)(p,y):await l({attributes:p},y),setMetafields:async(p,y)=>u||y?.cartId?await Et(c)(p,y):await l({metafields:p},y),deleteMetafield:Ot(c)};return "customMethods"in e?{...m,...e.customMethods??{}}:m}function Rn(e){let t=react$1.useFetchers();if(!t||!t.length)return e;let r=e?.lines?structuredClone(e):{lines:{nodes:[]}},o=r.lines.nodes,n=!1;for(let{formData:a}of t){if(!a)continue;let s=G.getFormInput(a);if(s.action===G.ACTIONS.LinesAdd)for(let u of s.inputs.lines){if(!u.selectedVariant){console.error("[h2:error:useOptimisticCart] No selected variant was passed in the cart action. Make sure to pass the selected variant if you want to use an optimistic cart");continue}let i=o.find(c=>c.merchandise.id===u.selectedVariant?.id);n=!0,i?(i.quantity=(i.quantity||1)+(u.quantity||1),i.isOptimistic=!0):o.unshift({id:Rr(u.selectedVariant.id),merchandise:u.selectedVariant,isOptimistic:!0,quantity:u.quantity||1});}else if(s.action===G.ACTIONS.LinesRemove)for(let u of s.inputs.lineIds){let i=o.findIndex(c=>c.id===u);if(i!==-1){if(Fe(o[i].id)){console.error("[h2:error:useOptimisticCart] Tried to remove an optimistic line that has not been added to the cart yet");continue}o.splice(i,1),n=!0;}else console.warn(`[h2:warn:useOptimisticCart] Tried to remove line '${u}' but it doesn't exist in the cart`);}else if(s.action===G.ACTIONS.LinesUpdate)for(let u of s.inputs.lines){let i=o.findIndex(c=>u.id===c.id);if(i>-1){if(Fe(o[i].id)){console.error("[h2:error:useOptimisticCart] Tried to update an optimistic line that has not been added to the cart yet");continue}o[i].quantity=u.quantity,o[i].quantity===0&&o.splice(i,1),n=!0;}else console.warn(`[h2:warn:useOptimisticCart] Tried to update line '${u.id}' but it doesn't exist in the cart`);}}return n&&(r.isOptimistic=n),r}function Ln({handle:e,options:t=[],variants:r=[],productPath:o="products",waitForNavigation:n=!1,children:a}){let s=r instanceof Array?r:hydrogenReact.flattenConnection(r),{searchParams:u,path:i,alreadyOnProductPage:c}=kn(e,o,n),d=t.filter(l=>l?.values?.length===1);return react.createElement(react.Fragment,null,...react.useMemo(()=>t.map(l=>{let m,p=[];for(let y of l.values){let g=new URLSearchParams(c?u:void 0);g.set(l.name,y),d.forEach(k=>{g.set(k.name,k.values[0]);});let h=s.find(k=>k?.selectedOptions?.every(_=>g.get(_?.name)===_?.value)),f=u.get(l.name),v=f?f===y:!1;v&&(m=y);let I="?"+g.toString();p.push({value:y,isAvailable:h?h.availableForSale:!0,to:i+I,search:I,isActive:v,variant:h});}return a({option:{name:l.name,value:m,values:p}})}),[t,s,a]))}var Un=e=>{if(typeof e?.url>"u")throw new TypeError(`Expected a Request instance, got ${typeof e}`);let t=new URL(e.url).searchParams,r=[];return t.forEach((o,n)=>{r.push({name:n,value:o});}),r};function kn(e,t,r){let{pathname:o,search:n}=react$1.useLocation(),a=react$1.useNavigation();return react.useMemo(()=>{let s=/(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(o),u=s&&s.length>0;t=t.startsWith("/")?t.substring(1):t;let i=u?`${s[0]}${t}/${e}`:`/${t}/${e}`;return {searchParams:new URLSearchParams(r||a.state!=="loading"?n:a.location.search),alreadyOnProductPage:i===o,path:i}},[o,n,r,e,t,a])}function Mn(e,t){let r=react$1.useNavigation(),[o,n]=react.useState([]);if(react.useEffect(()=>{Promise.resolve(t).then(a=>{a&&n(a instanceof Array?a:a.product?.variants?.nodes||[]);}).catch(a=>{reportError(new Error("[h2:error:useOptimisticVariant] An error occurred while resolving the variants for the optimistic product hook.",{cause:a}));});},[t]),r.state==="loading"){let a=new URLSearchParams(r.location.search),s=!1,u=o.find(i=>i.selectedOptions?i.selectedOptions.every(c=>a.get(c.name)===c.value):(s||(s=!0,reportError(new Error("[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field."))),!1));if(u)return {...u,isOptimistic:!0}}return e}var Er=react.createContext(void 0),Bn=Er.Provider,Ut=()=>react.useContext(Er);function Qn(e){let t=He(),r=Gn(t,e);return {nonce:t,header:r,NonceProvider:({children:n})=>react.createElement(Bn,{value:t},n)}}function Gn(e,t){let{shop:r,...o}=t??{},n=`'nonce-${e}'`,a=["'self'","'unsafe-inline'","https://cdn.shopify.com"],s=["'self'","https://monorail-edge.shopifysvc.com"];r&&r.checkoutDomain&&s.push(`https://${r.checkoutDomain}`),r&&r.storeDomain&&s.push(`https://${r.storeDomain}`);let i={baseUri:["'self'"],defaultSrc:["'self'",n,"https://cdn.shopify.com","https://shopify.com"],frameAncestors:["'none'"],styleSrc:a,connectSrc:s},c=Object.assign({},i,o);for(let d in i){let l=o[d];d&&l&&(c[d]=Wn(l,i[d]));}return c.scriptSrc instanceof Array&&!c.scriptSrc.includes(n)?c.scriptSrc.push(n):c.defaultSrc instanceof Array&&!c.defaultSrc.includes(n)&&c.defaultSrc.push(n),$n__default.default({directives:c})}function Wn(e,t){let r=typeof t=="string"?[t]:t,o=Array.isArray(e)?e:[String(e)];return Array.isArray(r)?r.every(a=>a==="'none'")?o:[...o,...r]:r}var zn=react.forwardRef((e,t)=>{let{waitForHydration:r,src:o,...n}=e;if(r)return jsxRuntime.jsx(Jn,{src:o,options:n});let a=Ut();return jsxRuntime.jsx("script",{suppressHydrationWarning:!0,...n,src:o,nonce:a,ref:t})});function Jn({src:e,options:t}){if(!e)throw new Error("`waitForHydration` with the Script component requires a `src` prop");return hydrogenReact.useLoadScript(e,{attributes:t}),null}function Xn(e){let t=react$1.useFetchers(),r={};for(let{formData:o}of t)if(o?.get("optimistic-identifier")===e)try{if(o.has("optimistic-data")){let n=JSON.parse(String(o.get("optimistic-data")));Object.assign(r,n);}}catch{}return r}function Zn({id:e,data:t}){return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-identifier",value:e}),jsxRuntime.jsx("input",{type:"hidden",name:"optimistic-data",value:JSON.stringify(t)})]})}function oa(e){return jsxRuntime.jsx(hydrogenReact.ShopPayButton,{channel:"hydrogen",...e})}function de(e){let{type:t,data:r={},customData:o}=e,n=react$1.useLocation(),{publish:a,cart:s,prevCart:u,shop:i,customData:c}=W(),d=n.pathname+n.search,l={...r,customData:{...c,...o},cart:s,prevCart:u,shop:i};return react.useEffect(()=>{i?.shopId&&(l={...l,url:window.location.href},a(t,l));},[a,d,i?.shopId]),null}function Dr(e){return jsxRuntime.jsx(de,{...e,type:"page_viewed"})}function Lr(e){return jsxRuntime.jsx(de,{...e,type:"product_viewed"})}function Ur(e){return jsxRuntime.jsx(de,{...e,type:"collection_viewed"})}function kr(e){return jsxRuntime.jsx(de,{...e,type:"cart_viewed"})}function _r(e){return jsxRuntime.jsx(de,{...e,type:"search_viewed"})}function Vr(e){return jsxRuntime.jsx(de,{...e})}var U={PAGE_VIEWED:"page_viewed",PRODUCT_VIEWED:"product_viewed",COLLECTION_VIEWED:"collection_viewed",CART_VIEWED:"cart_viewed",SEARCH_VIEWED:"search_viewed",CART_UPDATED:"cart_updated",PRODUCT_ADD_TO_CART:"product_added_to_cart",PRODUCT_REMOVED_FROM_CART:"product_removed_from_cart",CUSTOM_EVENT:"custom_"};var ua="https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.1/consent-tracking-api.js",pa="https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js";function Mr(e){console.error(`[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${e} configuration.`);}function kt(e){let{withPrivacyBanner:t=!0,onVisitorConsentCollected:r,onReady:o,...n}=e,a=react.useRef(!1),s=hydrogenReact.useLoadScript(t?pa:ua,{attributes:{id:"customer-privacy-api"}});react.useEffect(()=>{let u=i=>{r&&r(i.detail);};return document.addEventListener("visitorConsentCollected",u),()=>{document.removeEventListener("visitorConsentCollected",u);}},[r]),react.useEffect(()=>{if(s!=="done"||a.current)return;a.current=!0;let{checkoutDomain:u,storefrontAccessToken:i}=n;u||Mr("checkoutDomain"),i||Mr("storefrontAccessToken"),(i.startsWith("shpat_")||i.length!==32)&&console.error("[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token");let c={checkoutRootDomain:u,storefrontAccessToken:i};if(u){let m=window.document.location.host,p=u.split(".").reverse(),y=m.split(".").reverse(),g=[];p.forEach((h,f)=>{h===y[f]&&g.push(h);}),m=g.reverse().join("."),m&&(c.storefrontRootDomain=m);}if(t&&window?.privacyBanner&&window.privacyBanner?.loadBanner(c),!window.Shopify?.customerPrivacy)return;let d=window.Shopify.customerPrivacy.setTrackingConsent;function l(m,p){d({...m,headlessStorefront:!0,...c},p);}window.Shopify.customerPrivacy.setTrackingConsent=l,o&&o();},[s,t,n]);}function _t(){try{return window.Shopify&&window.Shopify.customerPrivacy?window.Shopify?.customerPrivacy:null}catch{return null}}function ma(){let e=_t();if(!e)throw new Error("Shopify Customer Privacy API not available. Must be used within a useEffect. Make sure to load the Shopify Customer Privacy API with useCustomerPrivacy() or <AnalyticsProvider>.");return e}function Fr({consent:e,onReady:t,domain:r}){let{subscribe:o,register:n,canTrack:a}=W(),[s,u]=react.useState(!1),[i,c]=react.useState(!1),d=react.useRef(!1),{ready:l}=n("Internal_Shopify_Analytics"),{ready:m}=n("Internal_Shopify_CustomerPrivacy"),p=()=>{s&&i&&t();},y=()=>{c(!0),m(),p();},{checkoutDomain:g,storefrontAccessToken:h,withPrivacyBanner:f}=e;return kt({checkoutDomain:g||"mock.shop",storefrontAccessToken:h||"abcdefghijklmnopqrstuvwxyz123456",withPrivacyBanner:f,onVisitorConsentCollected:y,onReady:()=>{setTimeout(y,3e3);}}),hydrogenReact.useShopifyCookies({hasUserConsent:s&&i?a():!0,domain:r,checkoutDomain:g}),react.useEffect(()=>{d.current||(d.current=!0,o(U.PAGE_VIEWED,ha),o(U.PRODUCT_VIEWED,Ca),o(U.COLLECTION_VIEWED,Sa),o(U.SEARCH_VIEWED,Pa),o(U.PRODUCT_ADD_TO_CART,Aa),l(),u(!0),p());},[o,l]),null}function $e(e){console.error(`[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${e} configuration.`);}function Re(e){let t=ma(),r=t.analyticsProcessingAllowed();if(!e?.shop?.shopId){$e("shopId");return}if(!e?.shop?.acceptedLanguage){$e("acceptedLanguage");return}if(!e?.shop?.currency){$e("currency");return}if(!e?.shop?.hydrogenSubchannelId){$e("hydrogenSubchannelId");return}return {shopifySalesChannel:"hydrogen",...e.shop,hasUserConsent:r,...hydrogenReact.getClientBrowserParameters(),ccpaEnforced:!t.saleOfDataAllowed(),gdprEnforced:!(t.marketingAllowed()&&t.analyticsProcessingAllowed())}}function ga(e,t){if(t===null)return;let r=Re(e);return r?{...r,cartId:t.id}:void 0}var J={};function ha(e){let t=Re(e);t&&(hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PAGE_VIEW_2,payload:{...t,...J}}),J={});}function Ca(e){let t=Re(e);if(t&&qr({type:"product",products:e.products})){let r=Vt(e.products);J={pageType:hydrogenReact.AnalyticsPageType.product,resourceId:r[0].productGid},t={...t,...J,products:Vt(e.products)},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PRODUCT_VIEW,payload:t});}}function Sa(e){let t=Re(e);t&&(J={pageType:hydrogenReact.AnalyticsPageType.collection,resourceId:e.collection.id},t={...t,...J,collectionHandle:e.collection.handle},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.COLLECTION_VIEW,payload:t}));}function Pa(e){let t=Re(e);t&&(J={pageType:hydrogenReact.AnalyticsPageType.search},t={...t,...J,searchString:e.searchTerm},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.SEARCH_VIEW,payload:t}));}function Aa(e){let{cart:t,currentLine:r}=e,o=ga(e,t);!o||!r?.id||Ta({matchedLine:r,eventPayload:o});}function Ta({matchedLine:e,eventPayload:t}){let r={id:e.merchandise.product.id,variantId:e.id,title:e.merchandise.product.title,variantTitle:e.merchandise.title,vendor:e.merchandise.product.vendor,price:e.merchandise.price.amount,quantity:e.quantity,productType:e.merchandise.product.productType,sku:e.merchandise.sku};qr({type:"cart",products:[r]})&&hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.ADD_TO_CART,payload:{...t,products:Vt([r])}});}function re(e,t,r,o){if(e==="cart"){let n=`${r?"merchandise":"merchandise.product"}.${t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up cart analytics events because the \`cart.lines[].${n}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartLine on CartLine\` is defined and make sure \`${n}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L25-L56.`);}else {let n=`${o||t}`;console.error(`[h2:error:ShopifyAnalytics] Can't set up product view analytics events because the \`${n}\` is missing from your \`<Analytics.ProductView>\`. Make sure \`${n}\` is part of your products data prop. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx#L159-L165.`);}}function qr({type:e,products:t}){return !t||t.length===0?(re(e,"",!1,"data.products"),!1):(t.forEach(r=>{if(!r.id)return re(e,"id",!1),!1;if(!r.title)return re(e,"title",!1),!1;if(!r.price)return re(e,"price.amount",!0,"price"),!1;if(!r.vendor)return re(e,"vendor",!1),!1;if(!r.variantId)return re(e,"id",!0,"variantId"),!1;if(!r.variantTitle)return re(e,"title",!0,"variantTitle"),!1}),!0)}function Vt(e){return e.map(t=>{let r={productGid:t.id,variantGid:t.variantId,name:t.title,variantName:t.variantTitle,brand:t.vendor,price:t.price,quantity:t.quantity||1,category:t.productType};return t.sku&&(r.sku=t.sku),t.productType&&(r.category=t.productType),r})}function Qr(e){console.error(`[h2:error:CartAnalytics] Can't set up cart analytics events because the \`cart.${e}\` value is missing from your GraphQL cart query. In your project, search for where \`fragment CartApiQuery on Cart\` is defined and make sure \`${e}\` is part of your cart query. Check the Hydrogen Skeleton template for reference: https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/lib/fragments.ts#L59.`);}function Gr({cart:e,setCarts:t}){let{publish:r,shop:o,customData:n,canTrack:a,cart:s,prevCart:u}=W(),i=react.useRef(null);return react.useEffect(()=>{if(e)return Promise.resolve(e).then(c=>{if(c&&c.lines){if(!c.id){Qr("id");return}if(!c.updatedAt){Qr("updatedAt");return}}t(({cart:d,prevCart:l})=>c?.updatedAt!==d?.updatedAt?{cart:c,prevCart:d}:{cart:d,prevCart:l});}),()=>{}},[t,e]),react.useEffect(()=>{if(!s||!s?.updatedAt||s?.updatedAt===u?.updatedAt)return;let c;try{c=JSON.parse(localStorage.getItem("cartLastUpdatedAt")||"");}catch{c=null;}if(s.id===c?.id&&s.updatedAt===c?.updatedAt)return;let d={eventTimestamp:Date.now(),cart:s,prevCart:u,shop:o,customData:n};if(s.updatedAt===i.current)return;i.current=s.updatedAt,r("cart_updated",d),localStorage.setItem("cartLastUpdatedAt",JSON.stringify({id:s.id,updatedAt:s.updatedAt}));let l=u?.lines?hydrogenReact.flattenConnection(u?.lines):[],m=s.lines?hydrogenReact.flattenConnection(s.lines):[];l?.forEach(p=>{let y=m.filter(g=>p.id===g.id);if(y?.length===1){let g=y[0];p.quantity<g.quantity?r("product_added_to_cart",{...d,prevLine:p,currentLine:g}):p.quantity>g.quantity&&r("product_removed_from_cart",{...d,prevLine:p,currentLine:g});}else r("product_removed_from_cart",{...d,prevLine:p});}),m?.forEach(p=>{let y=l.filter(g=>p.id===g.id);(!y||y.length===0)&&r("product_added_to_cart",{...d,currentLine:p});});},[s,u,r,o,n,a]),null}var Ea="https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-1bd852a.min.js";function Wr({shop:e}){let t=react.useRef(!1),{subscribe:r,register:o}=W(),{ready:n}=o("Internal_Shopify_Perf_Kit"),a=hydrogenReact.useLoadScript(Ea,{attributes:{id:"perfkit","data-application":"hydrogen","data-shop-id":hydrogenReact.parseGid(e.shopId).id.toString(),"data-storefront-id":e.hydrogenSubchannelId,"data-monorail-region":"global","data-spa-mode":"true","data-resource-timing-sampling-rate":"100"}});return react.useEffect(()=>{a!=="done"||t.current||(t.current=!0,r(U.PAGE_VIEWED,()=>{window.PerfKit?.navigate();}),r(U.PRODUCT_VIEWED,()=>{window.PerfKit?.setPageType("product");}),r(U.COLLECTION_VIEWED,()=>{window.PerfKit?.setPageType("collection");}),r(U.SEARCH_VIEWED,()=>{window.PerfKit?.setPageType("search");}),r(U.CART_VIEWED,()=>{window.PerfKit?.setPageType("cart");}),n());},[r,n,a]),null}var ka={canTrack:()=>!1,cart:null,customData:{},prevCart:null,publish:()=>{},shop:null,subscribe:()=>{},register:()=>({ready:()=>{}})},Xr=react.createContext(ka),Ge=new Map,we={};function Zr(){return Object.values(we).every(Boolean)}function jr(e,t){Ge.has(e)||Ge.set(e,new Map),Ge.get(e)?.set(t.toString(),t);}var We=new Map;function Kr(e,t){if(!Zr()){We.set(e,t);return}eo(e,t);}function eo(e,t){(Ge.get(e)??new Map).forEach((r,o)=>{try{r(t);}catch(n){typeof n=="object"&&n instanceof Error?console.error("Analytics publish error",n.message,o,n.stack):console.error("Analytics publish error",n,o);}});}function zr(e){return we.hasOwnProperty(e)||(we[e]=!1),{ready:()=>{we[e]=!0,Zr()&&We.size>0&&(We.forEach((t,r)=>{eo(r,t);}),We.clear());}}}function Jr(){try{return window.Shopify.customerPrivacy.analyticsProcessingAllowed()}catch{}return !1}function Yr(e,t){return `[h2:error:Analytics.Provider] - ${e} is required. Make sure ${t} is defined in your environment variables. See https://h2o.fyi/analytics/consent to learn how to setup environment variables in the Shopify admin.`}function _a({canTrack:e,cart:t,children:r,consent:o,customData:n={},shop:a=null,cookieDomain:s}){let u=react.useRef(!1),{shop:i}=Va(a),[c,d]=react.useState(!!e),[l,m]=react.useState({cart:null,prevCart:null}),[p,y]=react.useState(e?()=>e:()=>Jr);if(i)if(/\/68817551382$/.test(i.shopId))Yt("[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.");else {if(!o.checkoutDomain){let h=Yr("consent.checkoutDomain","PUBLIC_CHECKOUT_DOMAIN");at(h);}if(!o.storefrontAccessToken){let h=Yr("consent.storefrontAccessToken","PUBLIC_STOREFRONT_API_TOKEN");at(h);}}let g=react.useMemo(()=>({canTrack:p,...l,customData:n,publish:p()?Kr:()=>{},shop:i,subscribe:jr,register:zr}),[c,p(),p,JSON.stringify(p),l,l.cart?.updatedAt,l.prevCart,Kr,jr,n,i,zr,JSON.stringify(we)]);return jsxRuntime.jsxs(Xr.Provider,{value:g,children:[r,!!i&&jsxRuntime.jsx(Dr,{}),!!i&&!!t&&jsxRuntime.jsx(Gr,{cart:t,setCarts:m}),!!i&&o.checkoutDomain&&jsxRuntime.jsx(Fr,{consent:o,onReady:()=>{u.current=!0,d(!0),y(()=>Jr);},domain:s}),!!i&&jsxRuntime.jsx(Wr,{shop:i})]})}function W(){let e=react.useContext(Xr);if(!e)throw new Error("[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>");return e}function Va(e){let[t,r]=react.useState(null);return react.useEffect(()=>(Promise.resolve(e).then(r),()=>{}),[r,e]),{shop:t}}async function Na({storefront:e,publicStorefrontId:t="0"}){return e.query(Ma,{cache:e.CacheLong()}).then(({shop:r,localization:o})=>({shopId:r.id,acceptedLanguage:o.language.isoCode,currency:o.country.currency.isoCode,hydrogenSubchannelId:t}))}var Ma=`#graphql
627
627
  query ShopData(
628
628
  $country: CountryCode
629
629
  $language: LanguageCode
@@ -642,7 +642,7 @@ API response error: ${t.status}`,s=new X(c,{query:a,queryVariables:n,cause:{erro
642
642
  }
643
643
  }
644
644
  }
645
- `,_n={CartView:Rr,CollectionView:wr,CustomView:Or,ProductView:br,Provider:Dn,SearchView:Er};var Mn=function(e){return jsxRuntime.jsx(hydrogenReact.RichText,{...e,components:{link:({node:t})=>jsxRuntime.jsx(react$1.Link,{to:t.url,title:t.title,target:t.target,prefetch:"intent",children:t.children}),...e.components}})};//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate
645
+ `,Ha={CartView:kr,CollectionView:Ur,CustomView:Vr,ProductView:Lr,Provider:_a,SearchView:_r};var Ba=function(e){return jsxRuntime.jsx(hydrogenReact.RichText,{...e,components:{link:({node:t})=>jsxRuntime.jsx(react$1.Link,{to:t.url,title:t.title,target:t.target,prefetch:"intent",children:t.children}),...e.components}})};function Qa(e){let{env:t,request:r,cache:o,waitUntil:n,i18n:a,session:s,logErrors:u,storefront:i={},customerAccount:c,cart:d={}}=e;s||console.warn("[h2:warn:createHydrogenContext] A session object is required to create hydrogen context.");let{storefront:l}=tr({cache:o,waitUntil:n,i18n:a,logErrors:u,storefrontHeaders:i.headers||Ga(r),storefrontApiVersion:i.apiVersion,storefrontId:t.PUBLIC_STOREFRONT_ID,storeDomain:t.PUBLIC_STORE_DOMAIN,privateStorefrontToken:t.PRIVATE_STOREFRONT_API_TOKEN,publicStorefrontToken:t.PUBLIC_STOREFRONT_API_TOKEN}),m=ht({session:s,request:r,waitUntil:n,logErrors:u,customerApiVersion:c?.apiVersion,authUrl:c?.authUrl,customAuthStatusHandler:c?.customAuthStatusHandler,unstableB2b:c?.unstableB2b,customerAccountId:t.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,customerAccountUrl:t.PUBLIC_CUSTOMER_ACCOUNT_API_URL}),p=Lt({getCartId:d.getId||xt(r.headers),setCartId:d.setId||Dt(),cartQueryFragment:d.queryFragment,cartMutateFragment:d.mutateFragment,customMethods:d.customMethods,storefront:l,customerAccount:m});return {storefront:l,customerAccount:m,cart:p,env:t,waitUntil:n,session:s}}function Ga(e){return {requestGroupId:$(e,"request-id"),buyerIp:$(e,"oxygen-buyer-ip"),cookie:$(e,"cookie"),purpose:$(e,"purpose")}}//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate
646
646
  //! @see https://shopify.dev/docs/api/storefront/latest/queries/cart
647
647
  //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesAdd
648
648
  //! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesUpdate
@@ -738,55 +738,56 @@ Object.defineProperty(exports, "useShopifyCookies", {
738
738
  enumerable: true,
739
739
  get: function () { return hydrogenReact.useShopifyCookies; }
740
740
  });
741
- exports.Analytics = _n;
742
- exports.AnalyticsEvent = L;
741
+ exports.Analytics = Ha;
742
+ exports.AnalyticsEvent = U;
743
743
  exports.CacheCustom = Ye;
744
744
  exports.CacheLong = Je;
745
745
  exports.CacheNone = Ke;
746
- exports.CacheShort = J;
747
- exports.CartForm = B;
746
+ exports.CacheShort = Y;
747
+ exports.CartForm = G;
748
748
  exports.InMemoryCache = it;
749
- exports.OptimisticInput = Ka;
750
- exports.Pagination = Fo;
751
- exports.RichText = Mn;
752
- exports.Script = Ba;
753
- exports.Seo = Lo;
754
- exports.ShopPayButton = Xa;
755
- exports.VariantSelector = Ea;
756
- exports.cartAttributesUpdateDefault = bt;
757
- exports.cartBuyerIdentityUpdateDefault = Tt;
758
- exports.cartCreateDefault = ht;
759
- exports.cartDiscountCodesUpdateDefault = At;
760
- exports.cartGetDefault = gt;
761
- exports.cartGetIdDefault = ga;
762
- exports.cartLinesAddDefault = Ct;
763
- exports.cartLinesRemoveDefault = St;
764
- exports.cartLinesUpdateDefault = Pt;
765
- exports.cartMetafieldDeleteDefault = Rt;
766
- exports.cartMetafieldsSetDefault = wt;
767
- exports.cartNoteUpdateDefault = vt;
768
- exports.cartSelectedDeliveryOptionsUpdateDefault = It;
769
- exports.cartSetIdDefault = Pa;
770
- exports.changelogHandler = Xo;
771
- exports.createCartHandler = Sa;
772
- exports.createContentSecurityPolicy = $a;
773
- exports.createCustomerAccountClient = Jo;
774
- exports.createStorefrontClient = Pi;
775
- exports.createWithCache = go;
776
- exports.formatAPIResult = S;
777
- exports.generateCacheControlHeader = fe;
778
- exports.getCustomerPrivacy = Dt;
779
- exports.getPaginationVariables = qo;
780
- exports.getSelectedProductOptions = Oa;
781
- exports.getSeoMeta = _o;
782
- exports.getShopAnalytics = kn;
783
- exports.graphiqlLoader = Ao;
784
- exports.storefrontRedirect = Po;
785
- exports.useAnalytics = G;
786
- exports.useCustomerPrivacy = Ot;
787
- exports.useNonce = Et;
788
- exports.useOptimisticCart = Ta;
789
- exports.useOptimisticData = ja;
790
- exports.useOptimisticVariant = _a;
749
+ exports.OptimisticInput = Zn;
750
+ exports.Pagination = Wo;
751
+ exports.RichText = Ba;
752
+ exports.Script = zn;
753
+ exports.Seo = Fo;
754
+ exports.ShopPayButton = oa;
755
+ exports.VariantSelector = Ln;
756
+ exports.cartAttributesUpdateDefault = wt;
757
+ exports.cartBuyerIdentityUpdateDefault = It;
758
+ exports.cartCreateDefault = Ct;
759
+ exports.cartDiscountCodesUpdateDefault = vt;
760
+ exports.cartGetDefault = St;
761
+ exports.cartGetIdDefault = xt;
762
+ exports.cartLinesAddDefault = Pt;
763
+ exports.cartLinesRemoveDefault = Tt;
764
+ exports.cartLinesUpdateDefault = At;
765
+ exports.cartMetafieldDeleteDefault = Ot;
766
+ exports.cartMetafieldsSetDefault = Et;
767
+ exports.cartNoteUpdateDefault = bt;
768
+ exports.cartSelectedDeliveryOptionsUpdateDefault = Rt;
769
+ exports.cartSetIdDefault = Dt;
770
+ exports.changelogHandler = nn;
771
+ exports.createCartHandler = Lt;
772
+ exports.createContentSecurityPolicy = Qn;
773
+ exports.createCustomerAccountClient = ht;
774
+ exports.createHydrogenContext = Qa;
775
+ exports.createStorefrontClient = tr;
776
+ exports.createWithCache = Io;
777
+ exports.formatAPIResult = P;
778
+ exports.generateCacheControlHeader = me;
779
+ exports.getCustomerPrivacy = _t;
780
+ exports.getPaginationVariables = Ko;
781
+ exports.getSelectedProductOptions = Un;
782
+ exports.getSeoMeta = qo;
783
+ exports.getShopAnalytics = Na;
784
+ exports.graphiqlLoader = Eo;
785
+ exports.storefrontRedirect = Ro;
786
+ exports.useAnalytics = W;
787
+ exports.useCustomerPrivacy = kt;
788
+ exports.useNonce = Ut;
789
+ exports.useOptimisticCart = Rn;
790
+ exports.useOptimisticData = Xn;
791
+ exports.useOptimisticVariant = Mn;
791
792
  //# sourceMappingURL=out.js.map
792
793
  //# sourceMappingURL=index.cjs.map