@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.
- package/dist/development/index.cjs +121 -11
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +122 -13
- package/dist/development/index.js.map +1 -1
- package/dist/production/index.cjs +74 -73
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.d.cts +115 -18
- package/dist/production/index.d.ts +115 -18
- package/dist/production/index.js +28 -28
- package/dist/production/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -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
|
|
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
|
|
12
|
+
var $n__default = /*#__PURE__*/_interopDefault($n);
|
|
13
13
|
|
|
14
|
-
var
|
|
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
|
|
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}`,
|
|
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,
|
|
22
|
-
`+
|
|
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
|
|
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(
|
|
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:
|
|
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
|
-
`,
|
|
310
|
+
`,R=`#graphql
|
|
311
311
|
fragment CartApiMutation on Cart {
|
|
312
312
|
id
|
|
313
313
|
totalQuantity
|
|
314
314
|
}
|
|
315
|
-
`;function
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
`,
|
|
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 =
|
|
742
|
-
exports.AnalyticsEvent =
|
|
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 =
|
|
747
|
-
exports.CartForm =
|
|
746
|
+
exports.CacheShort = Y;
|
|
747
|
+
exports.CartForm = G;
|
|
748
748
|
exports.InMemoryCache = it;
|
|
749
|
-
exports.OptimisticInput =
|
|
750
|
-
exports.Pagination =
|
|
751
|
-
exports.RichText =
|
|
752
|
-
exports.Script =
|
|
753
|
-
exports.Seo =
|
|
754
|
-
exports.ShopPayButton =
|
|
755
|
-
exports.VariantSelector =
|
|
756
|
-
exports.cartAttributesUpdateDefault =
|
|
757
|
-
exports.cartBuyerIdentityUpdateDefault =
|
|
758
|
-
exports.cartCreateDefault =
|
|
759
|
-
exports.cartDiscountCodesUpdateDefault =
|
|
760
|
-
exports.cartGetDefault =
|
|
761
|
-
exports.cartGetIdDefault =
|
|
762
|
-
exports.cartLinesAddDefault =
|
|
763
|
-
exports.cartLinesRemoveDefault =
|
|
764
|
-
exports.cartLinesUpdateDefault =
|
|
765
|
-
exports.cartMetafieldDeleteDefault =
|
|
766
|
-
exports.cartMetafieldsSetDefault =
|
|
767
|
-
exports.cartNoteUpdateDefault =
|
|
768
|
-
exports.cartSelectedDeliveryOptionsUpdateDefault =
|
|
769
|
-
exports.cartSetIdDefault =
|
|
770
|
-
exports.changelogHandler =
|
|
771
|
-
exports.createCartHandler =
|
|
772
|
-
exports.createContentSecurityPolicy =
|
|
773
|
-
exports.createCustomerAccountClient =
|
|
774
|
-
exports.
|
|
775
|
-
exports.
|
|
776
|
-
exports.
|
|
777
|
-
exports.
|
|
778
|
-
exports.
|
|
779
|
-
exports.
|
|
780
|
-
exports.
|
|
781
|
-
exports.
|
|
782
|
-
exports.
|
|
783
|
-
exports.
|
|
784
|
-
exports.
|
|
785
|
-
exports.
|
|
786
|
-
exports.
|
|
787
|
-
exports.
|
|
788
|
-
exports.
|
|
789
|
-
exports.
|
|
790
|
-
exports.
|
|
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
|