@shopify/hydrogen 2025.7.0 → 2025.7.2
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/dev/{get-virtual-routes-KWSSQH4L.js → get-virtual-routes-ZEUPNZWL.js} +0 -36
- package/dist/dev/hydrogen-routes.js +1 -1
- package/dist/development/{get-virtual-routes-6PVSMJPH.js → get-virtual-routes-XE7G57DS.js} +3 -36
- package/dist/development/get-virtual-routes-XE7G57DS.js.map +1 -0
- package/dist/development/index.cjs +406 -124
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +395 -81
- package/dist/development/index.js.map +1 -1
- package/dist/development/react-router-preset.d.ts +5 -5
- package/dist/development/react-router-preset.js +4 -4
- package/dist/development/react-router-preset.js.map +1 -1
- package/dist/oxygen/index.d.ts +120 -3
- package/dist/oxygen/index.js +111 -5
- package/dist/production/get-virtual-routes-MYYLGSAS.js +3 -0
- package/dist/production/get-virtual-routes-MYYLGSAS.js.map +1 -0
- package/dist/production/index.cjs +76 -76
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.d.cts +76 -15
- package/dist/production/index.d.ts +76 -15
- package/dist/production/index.js +76 -76
- package/dist/production/index.js.map +1 -1
- package/dist/production/react-router-preset.d.ts +5 -5
- package/dist/production/react-router-preset.js +2 -2
- package/dist/vite/get-virtual-routes.d.ts +1 -17
- package/dist/vite/get-virtual-routes.js +0 -36
- package/package.json +6 -6
- package/dist/development/get-virtual-routes-6PVSMJPH.js.map +0 -1
- package/dist/oxygen/chunk-RVXKHOUX.js +0 -39
- package/dist/oxygen/chunk-T4YWBSCF.js +0 -14
- package/dist/oxygen/createRequestHandler.d.ts +0 -10
- package/dist/oxygen/createRequestHandler.js +0 -6
- package/dist/oxygen/getStorefrontHeaders-BqPh5S1b.d.ts +0 -69
- package/dist/oxygen/getStorefrontHeaders.d.ts +0 -1
- package/dist/oxygen/getStorefrontHeaders.js +0 -6
- package/dist/production/get-virtual-routes-JVKSNI4M.js +0 -3
- package/dist/production/get-virtual-routes-JVKSNI4M.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var url=require('url'),rt=require('path'),promises=require('fs/promises'),react=require('react'),reactRouter=require('react-router'),jsxRuntime=require('react/jsx-runtime'),hydrogenReact=require('@shopify/hydrogen-react'),graphqlClient=require('@shopify/graphql-client'),cookie=require('worktop/cookie'),Ga=require('content-security-policy-builder');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var rt__default=/*#__PURE__*/_interopDefault(rt);var Ga__default=/*#__PURE__*/_interopDefault(Ga);var Qo=Object.defineProperty;var pr=(e,t)=>()=>(e&&(t=e(e=0)),t);var dr=(e,t)=>{for(var r in t)Qo(e,r,{get:t[r],enumerable:true});};var Io={};dr(Io,{VIRTUAL_ROOT:()=>Za,VIRTUAL_ROOT_ORIG:()=>Xt,VIRTUAL_ROUTES_DIR:()=>_e,VIRTUAL_ROUTES_DIR_ORIG:()=>Yt,VIRTUAL_ROUTES_DIR_PARTS:()=>Ro,VIRTUAL_ROUTES_ROUTES_DIR_PARTS:()=>Ue,getVirtualRoutes:()=>ts,getVirtualRoutesV3:()=>es});function De(e,t){let r=new URL("../",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),o=e.reduce((n,a)=>new URL(`${a}/`,n),r);return new URL(t,o).pathname.replace(/^\/[a-zA-Z]:\//,"/")}async function es(){return {routes:[{id:`${_e}/graphiql`,path:"graphiql",file:De(Ue,"graphiql.jsx"),index:false},{id:`${_e}/subrequest-profiler`,path:"subrequest-profiler",file:De(Ue,"subrequest-profiler.jsx"),index:false},{id:`${_e}/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json`,path:".well-known/appspecific/com.chrome.devtools.json",file:De(Ue,"[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx"),index:false},{id:`${_e}/index`,path:"",file:De(Ue,"index.jsx"),index:true}],layout:{file:De(Ro,"layout.jsx")}}}async function ts(){let e=rt__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),t=rt__default.default.join(e,Yt);return {routes:await promises.readdir(t,{recursive:true}).then(o=>o.map(n=>{let a=rt__default.default.join(t,n),s=n.replace(/\.[jt]sx?$/,"").replaceAll("\\","/"),c=/(^|\/)index$/.test(s),i=s.replace(/(^|\/)index$/,"");return {id:`${Yt}/${s}`,path:i,file:a,index:c}})),root:{id:Xt,path:"",file:rt__default.default.join(e,Xt+".jsx")}}}var _e,Ue,Ro,Za,Yt,Xt;var $o={};dr($o,{default:()=>Mo,logSeoTags:()=>Vo});function Mo({headTags:e}){return Vo(e),null}function Vo(e){console.log(" "),console.log("%cSEO Meta Tags",`${ks}`),console.log(" "),e.forEach(t=>{if(t.tag==="script"){if(console.log("%c\u2022 JSON LD ",sr),t.children)try{console.table(JSON.parse(t.children),["name","content"]);}catch{console.log(t.children);}}else {if(console.log(`%c\u2022 ${t.tag} `,sr),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;Ns(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",sr),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 Ns(e){let o=await(await(await fetch(e)).blob()).arrayBuffer();return `data:image/png;base64,${Ms(o)}`}function Ms(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 sr,ks,Fo=pr(()=>{sr="text-transform: uppercase;",ks="text-transform: uppercase; font-weight: bold; text-transform: uppercase;font-weight: bold";});function pe(e){let{type:t,data:r={},customData:o}=e,n=reactRouter.useLocation(),{publish:a,cart:s,prevCart:c,shop:i,customData:u}=j(),p=n.pathname+n.search,d={...r,customData:{...u,...o},cart:s,prevCart:c,shop:i};return react.useEffect(()=>{i?.shopId&&(d={...d,url:window.location.href},a(t,d));},[a,p,i?.shopId]),null}function lr(e){return jsxRuntime.jsx(pe,{...e,type:"page_viewed"})}function yr(e){return jsxRuntime.jsx(pe,{...e,type:"product_viewed"})}function fr(e){return jsxRuntime.jsx(pe,{...e,type:"collection_viewed"})}function mr(e){return jsxRuntime.jsx(pe,{...e,type:"cart_viewed"})}function gr(e){return jsxRuntime.jsx(pe,{...e,type:"search_viewed"})}function hr(e){return jsxRuntime.jsx(pe,{...e})}var $={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 Xo="https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.1/consent-tracking-api.js",Zo="https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js";function st(e){console.error(`[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${e} configuration.`);}function it(e){let{withPrivacyBanner:t=false,onVisitorConsentCollected:r,onReady:o,...n}=e;hydrogenReact.useLoadScript(t?Zo:Xo,{attributes:{id:"customer-privacy-api"}});let{observing:a,setLoaded:s}=en({withPrivacyBanner:t,onLoaded:o}),c=react.useMemo(()=>{let{checkoutDomain:u,storefrontAccessToken:p}=n;return u||st("checkoutDomain"),p||st("storefrontAccessToken"),(p.startsWith("shpat_")||p.length!==32)&&console.error("[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token"),{checkoutRootDomain:u,storefrontAccessToken:p,storefrontRootDomain:Pr(u),country:n.country,locale:n.locale}},[n,Pr,st]);react.useEffect(()=>{let u=p=>{r&&r(p.detail);};return document.addEventListener("visitorConsentCollected",u),()=>{document.removeEventListener("visitorConsentCollected",u);}},[r]),react.useEffect(()=>{if(!t||a.current.privacyBanner)return;a.current.privacyBanner=true;let u=window.privacyBanner||void 0;Object.defineProperty(window,"privacyBanner",{configurable:true,get(){return u},set(d){if(typeof d=="object"&&d!==null&&"showPreferences"in d&&"loadBanner"in d){let g=d;g.loadBanner(c),u=vr({privacyBanner:g,config:c}),s.privacyBanner(),Ar();}}});},[t,c,vr,s.privacyBanner]),react.useEffect(()=>{if(a.current.customerPrivacy)return;a.current.customerPrivacy=true;let u=null,p=window.Shopify||void 0;Object.defineProperty(window,"Shopify",{configurable:true,get(){return p},set(d){typeof d=="object"&&d!==null&&Object.keys(d).length===0&&(p=d,Object.defineProperty(window.Shopify,"customerPrivacy",{configurable:true,get(){return u},set(g){if(typeof g=="object"&&g!==null&&"setTrackingConsent"in g){let m=g;u={...m,setTrackingConsent:Sr({customerPrivacy:m,config:c})},p={...p,customerPrivacy:u},s.customerPrivacy(),Ar();}}}));}});},[c,Sr,s.customerPrivacy]);let i={customerPrivacy:le()};return t&&(i.privacyBanner=Ve()),i}var Cr=false;function Ar(){if(Cr)return;Cr=true;let e=new CustomEvent("shopifyCustomerPrivacyApiLoaded");document.dispatchEvent(e);}function en({withPrivacyBanner:e,onLoaded:t}){let r=react.useRef({customerPrivacy:false,privacyBanner:false}),[o,n]=react.useState(e?[false,false]:[false]),a=o.every(Boolean),s={customerPrivacy:()=>{n(e?c=>[true,c[1]]:()=>[true]);},privacyBanner:()=>{e&&n(c=>[c[0],true]);}};return react.useEffect(()=>{a&&t&&t();},[a,t]),{observing:r,setLoaded:s}}function Pr(e){if(typeof window>"u")return;let t=window.document.location.host,r=e.split(".").reverse(),o=t.split(".").reverse(),n=[];return r.forEach((a,s)=>{a===o[s]&&n.push(a);}),n.reverse().join(".")}function Sr({customerPrivacy:e,config:t}){let r=e.setTrackingConsent,{locale:o,country:n,...a}=t;function s(c,i){r({...a,headlessStorefront:true,...c},i);}return s}function vr({privacyBanner:e,config:t}){let r=e.loadBanner,o=e.showPreferences;function n(s){if(typeof s=="object"){r({...t,...s});return}r(t);}function a(s){if(typeof s=="object"){o({...t,...s});return}o(t);}return {loadBanner:n,showPreferences:a}}function le(){try{return window.Shopify&&window.Shopify.customerPrivacy?window.Shopify?.customerPrivacy:null}catch{return null}}function Ve(){try{return window&&window?.privacyBanner?window.privacyBanner:null}catch{return null}}var Rr="2025.7.0";function an(){let e=le();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 Er({consent:e,onReady:t,domain:r}){let{subscribe:o,register:n,canTrack:a}=j(),[s,c]=react.useState(false),[i,u]=react.useState(false),p=react.useRef(false),{checkoutDomain:d,storefrontAccessToken:g,language:m}=e,{ready:l}=n("Internal_Shopify_Analytics");return it({...e,locale:m,checkoutDomain:d||"mock.shop",storefrontAccessToken:g||"abcdefghijklmnopqrstuvwxyz123456",onVisitorConsentCollected:()=>u(true),onReady:()=>u(true)}),hydrogenReact.useShopifyCookies({hasUserConsent:i?a():true,domain:r,checkoutDomain:d}),react.useEffect(()=>{p.current||(p.current=true,o($.PAGE_VIEWED,cn),o($.PRODUCT_VIEWED,un),o($.COLLECTION_VIEWED,pn),o($.SEARCH_VIEWED,dn),o($.PRODUCT_ADD_TO_CART,ln),c(true));},[o]),react.useEffect(()=>{s&&i&&(l(),t());},[s,i,t]),null}function $e(e){console.error(`[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${e} configuration.`);}function Re(e){let t=an(),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",assetVersionId:Rr,...e.shop,hasUserConsent:r,...hydrogenReact.getClientBrowserParameters(),ccpaEnforced:!t.saleOfDataAllowed(),gdprEnforced:!(t.marketingAllowed()&&t.analyticsProcessingAllowed()),analyticsAllowed:t.analyticsProcessingAllowed(),marketingAllowed:t.marketingAllowed(),saleOfDataAllowed:t.saleOfDataAllowed()}}function sn(e,t){if(t===null)return;let r=Re(e);return r?{...r,cartId:t.id}:void 0}var te={};function cn(e){let t=Re(e);t&&(hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PAGE_VIEW_2,payload:{...t,...te}}),te={});}function un(e){let t=Re(e);if(t&&br({type:"product",products:e.products})){let r=ct(e.products);te={pageType:hydrogenReact.AnalyticsPageType.product,resourceId:r[0].productGid},t={...t,...te,products:ct(e.products)},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PRODUCT_VIEW,payload:t});}}function pn(e){let t=Re(e);t&&(te={pageType:hydrogenReact.AnalyticsPageType.collection,resourceId:e.collection.id},t={...t,...te,collectionHandle:e.collection.handle,collectionId:e.collection.id},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.COLLECTION_VIEW,payload:t}));}function dn(e){let t=Re(e);t&&(te={pageType:hydrogenReact.AnalyticsPageType.search},t={...t,...te,searchString:e.searchTerm},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.SEARCH_VIEW,payload:t}));}function ln(e){let{cart:t,currentLine:r}=e,o=sn(e,t);!o||!r?.id||yn({matchedLine:r,eventPayload:o});}function yn({matchedLine:e,eventPayload:t}){let r={id:e.merchandise.product.id,variantId:e.merchandise.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};br({type:"cart",products:[r]})&&hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.ADD_TO_CART,payload:{...t,products:ct([r])}});}function se(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 br({type:e,products:t}){return !t||t.length===0?(se(e,"",false,"data.products"),false):(t.forEach(r=>{if(!r.id)return se(e,"id",false),false;if(!r.title)return se(e,"title",false),false;if(!r.price)return se(e,"price.amount",true,"price"),false;if(!r.vendor)return se(e,"vendor",false),false;if(!r.variantId)return se(e,"id",true,"variantId"),false;if(!r.variantTitle)return se(e,"title",true,"variantTitle"),false}),true)}function ct(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 Or(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 Dr({cart:e,setCarts:t}){let{publish:r,shop:o,customData:n,canTrack:a,cart:s,prevCart:c}=j(),i=react.useRef(null);return react.useEffect(()=>{if(e)return Promise.resolve(e).then(u=>{if(u&&u.lines){if(!u.id){Or("id");return}if(!u.updatedAt){Or("updatedAt");return}}t(({cart:p,prevCart:d})=>u?.updatedAt!==p?.updatedAt?{cart:u,prevCart:p}:{cart:p,prevCart:d});}),()=>{}},[t,e]),react.useEffect(()=>{if(!s||!s?.updatedAt||s?.updatedAt===c?.updatedAt)return;let u;try{u=JSON.parse(localStorage.getItem("cartLastUpdatedAt")||"");}catch{u=null;}if(s.id===u?.id&&s.updatedAt===u?.updatedAt)return;let p={eventTimestamp:Date.now(),cart:s,prevCart:c,shop:o,customData:n};if(s.updatedAt===i.current)return;i.current=s.updatedAt,r("cart_updated",p),localStorage.setItem("cartLastUpdatedAt",JSON.stringify({id:s.id,updatedAt:s.updatedAt}));let d=c?.lines?hydrogenReact.flattenConnection(c?.lines):[],g=s.lines?hydrogenReact.flattenConnection(s.lines):[];d?.forEach(m=>{let l=g.filter(y=>m.id===y.id);if(l?.length===1){let y=l[0];m.quantity<y.quantity?r("product_added_to_cart",{...p,prevLine:m,currentLine:y}):m.quantity>y.quantity&&r("product_removed_from_cart",{...p,prevLine:m,currentLine:y});}else r("product_removed_from_cart",{...p,prevLine:m});}),g?.forEach(m=>{let l=d.filter(y=>m.id===y.id);(!l||l.length===0)&&r("product_added_to_cart",{...p,currentLine:m});});},[s,c,r,o,n,a]),null}var An="https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-spa.min.js";function _r({shop:e}){let t=react.useRef(false),{subscribe:r,register:o}=j(),{ready:n}=o("Internal_Shopify_Perf_Kit"),a=hydrogenReact.useLoadScript(An,{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=true,r($.PAGE_VIEWED,()=>{window.PerfKit?.navigate();}),r($.PRODUCT_VIEWED,()=>{window.PerfKit?.setPageType("product");}),r($.COLLECTION_VIEWED,()=>{window.PerfKit?.setPageType("collection");}),r($.SEARCH_VIEWED,()=>{window.PerfKit?.setPageType("search");}),r($.CART_VIEWED,()=>{window.PerfKit?.setPageType("cart");}),n());},[r,n,a]),null}var Ur=new Set,K=e=>{Ur.has(e)||(console.warn(e),Ur.add(e));},Lr=new Set,pt=e=>{Lr.has(e)||(console.error(new Error(e)),Lr.add(e));};var Tn={canTrack:()=>false,cart:null,customData:{},prevCart:null,publish:()=>{},shop:null,subscribe:()=>{},register:()=>({ready:()=>{}}),customerPrivacy:null,privacyBanner:null},Fr=react.createContext(Tn),He=new Map,Ie={};function qr(){return Object.values(Ie).every(Boolean)}function kr(e,t){He.has(e)||He.set(e,new Map),He.get(e)?.set(t.toString(),t);}var Ge=new Map;function Nr(e,t){if(!qr()){Ge.set(e,t);return}Hr(e,t);}function Hr(e,t){(He.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 Mr(e){return Ie.hasOwnProperty(e)||(Ie[e]=false),{ready:()=>{Ie[e]=true,qr()&&Ge.size>0&&(Ge.forEach((t,r)=>{Hr(r,t);}),Ge.clear());}}}function Vr(){try{return window.Shopify.customerPrivacy.analyticsProcessingAllowed()}catch{}return false}function $r(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 En({canTrack:e,cart:t,children:r,consent:o,customData:n={},shop:a=null,cookieDomain:s}){let c=react.useRef(false),{shop:i}=bn(a),[u,p]=react.useState(!!e),[d,g]=react.useState({cart:null,prevCart:null}),[m,l]=react.useState(e?()=>e:()=>Vr);if(i)if(/\/68817551382$/.test(i.shopId))K("[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.");else {if(!o.checkoutDomain){let h=$r("consent.checkoutDomain","PUBLIC_CHECKOUT_DOMAIN");pt(h);}if(!o.storefrontAccessToken){let h=$r("consent.storefrontAccessToken","PUBLIC_STOREFRONT_API_TOKEN");pt(h);}o?.country||(o.country="US"),o?.language||(o.language="EN"),o.withPrivacyBanner===void 0&&(o.withPrivacyBanner=false);}let y=react.useMemo(()=>({canTrack:m,...d,customData:n,publish:m()?Nr:()=>{},shop:i,subscribe:kr,register:Mr,customerPrivacy:le(),privacyBanner:Ve()}),[u,m,d,d.cart?.updatedAt,d.prevCart,Nr,kr,n,i,Mr,JSON.stringify(Ie),le,Ve]);return jsxRuntime.jsxs(Fr.Provider,{value:y,children:[r,!!i&&jsxRuntime.jsx(lr,{}),!!i&&!!t&&jsxRuntime.jsx(Dr,{cart:t,setCarts:g}),!!i&&o.checkoutDomain&&jsxRuntime.jsx(Er,{consent:o,onReady:()=>{c.current=true,p(true),l(e?()=>e:()=>Vr);},domain:s}),!!i&&jsxRuntime.jsx(_r,{shop:i})]})}function j(){let e=react.useContext(Fr);if(!e)throw new Error("[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>");return e}function bn(e){let[t,r]=react.useState(null);return react.useEffect(()=>(Promise.resolve(e).then(r),()=>{}),[r,e]),{shop:t}}async function wn({storefront:e,publicStorefrontId:t="0"}){return e.query(xn,{cache:e.CacheLong()}).then(({shop:r,localization:o})=>({shopId:r.id,acceptedLanguage:o.language.isoCode,currency:o.country.currency.isoCode,hydrogenSubchannelId:t}))}var xn=`#graphql
|
|
1
|
+
'use strict';var react=require('react'),reactRouter=require('react-router'),jsxRuntime=require('react/jsx-runtime'),hydrogenReact=require('@shopify/hydrogen-react'),loadScript=require('@shopify/hydrogen-react/load-script'),graphqlClient=require('@shopify/graphql-client'),cookie=require('worktop/cookie'),as=require('content-security-policy-builder');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var as__default=/*#__PURE__*/_interopDefault(as);var rn=Object.defineProperty;var Ar=(e,t)=>()=>(e&&(t=e(e=0)),t);var Sr=(e,t)=>{for(var r in t)rn(e,r,{get:t[r],enumerable:true});};var ko={};Sr(ko,{VIRTUAL_ROUTES_DIR:()=>He,VIRTUAL_ROUTES_DIR_PARTS:()=>Lo,VIRTUAL_ROUTES_ROUTES_DIR_PARTS:()=>Fe,getVirtualRoutesV3:()=>ys});function Ve(e,t){let r=new URL("../",(typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),o=e.reduce((n,a)=>new URL(`${a}/`,n),r);return new URL(t,o).pathname.replace(/^\/[a-zA-Z]:\//,"/")}async function ys(){return {routes:[{id:`${He}/graphiql`,path:"graphiql",file:Ve(Fe,"graphiql.jsx"),index:false},{id:`${He}/subrequest-profiler`,path:"subrequest-profiler",file:Ve(Fe,"subrequest-profiler.jsx"),index:false},{id:`${He}/[.]well-known.appspecific.com[.]chrome[.]devtools[.]json`,path:".well-known/appspecific/com.chrome.devtools.json",file:Ve(Fe,"[.]well-known.appspecific.com[.]chrome[.]devtools[.]json.jsx"),index:false},{id:`${He}/index`,path:"",file:Ve(Fe,"index.jsx"),index:true}],layout:{file:Ve(Lo,"layout.jsx")}}}var He,Fe,Lo;var zo={};Sr(zo,{default:()=>Ko,logSeoTags:()=>Yo});function Ko({headTags:e}){return Yo(e),null}function Yo(e){console.log(" "),console.log("%cSEO Meta Tags",`${js}`),console.log(" "),e.forEach(t=>{if(t.tag==="script"){if(console.log("%c\u2022 JSON LD ",Cr),t.children)try{console.table(JSON.parse(t.children),["name","content"]);}catch{console.log(t.children);}}else {if(console.log(`%c\u2022 ${t.tag} `,Cr),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;Ks(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",Cr),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 Ks(e){let o=await(await(await fetch(e)).blob()).arrayBuffer();return `data:image/png;base64,${Ys(o)}`}function Ys(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 Cr,js,Jo=Ar(()=>{Cr="text-transform: uppercase;",js="text-transform: uppercase; font-weight: bold; text-transform: uppercase;font-weight: bold";});function le(e){let{type:t,data:r={},customData:o}=e,n=reactRouter.useLocation(),{publish:a,cart:s,prevCart:c,shop:i,customData:u}=Y(),p=n.pathname+n.search,y={...r,customData:{...u,...o},cart:s,prevCart:c,shop:i};return react.useEffect(()=>{i?.shopId&&(y={...y,url:window.location.href},a(t,y));},[a,p,i?.shopId]),null}function Pr(e){return jsxRuntime.jsx(le,{...e,type:"page_viewed"})}function vr(e){return jsxRuntime.jsx(le,{...e,type:"product_viewed"})}function Rr(e){return jsxRuntime.jsx(le,{...e,type:"collection_viewed"})}function Tr(e){return jsxRuntime.jsx(le,{...e,type:"cart_viewed"})}function Ir(e){return jsxRuntime.jsx(le,{...e,type:"search_viewed"})}function Er(e){return jsxRuntime.jsx(le,{...e})}var F={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 Qe="Custom-Storefront-Request-Group-ID",We="X-Shopify-Storefront-Access-Token",ht="X-SDK-Variant",Ct="X-SDK-Variant-Source",At="X-SDK-Version",St="X-Shopify-Client-IP",Re="X-Shopify-Client-IP-Sig",je="_sfapi_proxy",Ke="_server_tracking";function an(e){return Object.entries(e).map(([t,r])=>r?`${t};desc=${r}`:void 0).filter(Boolean).join(", ")}function Te(e,t){let r=typeof t=="string"?t:an(t);r&&e.headers.append("Server-Timing",r);}var sn=["_y","_s","_cmp"];function br(e){let t={};if(!e)return t;let r=new RegExp(`\\b(${sn.join("|")});desc="?([^",]+)"?`,"g"),o;for(;(o=r.exec(e))!==null;)t[o[1]]=o[2];return t}function wr(e){if(typeof window>"u")return false;try{return !!window.performance.getEntriesByType("navigation")[0]?.serverTiming?.some(r=>r.name===e)}catch{return false}}function xr(){return wr(je)}function Or(){return wr(Ke)}var yn="https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.2/consent-tracking-api.js",fn="https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js";function vt(e){console.error(`[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${e} configuration.`);}function Rt(e){let{withPrivacyBanner:t=false,onVisitorConsentCollected:r,onReady:o,checkoutDomain:n,storefrontAccessToken:a,country:s,locale:c,sameDomainForStorefrontApi:i}=e,u=react.useMemo(()=>i??xr(),[i]),p=react.useMemo(()=>u&&!Or(),[u]),y=hydrogenReact.useShopifyCookies({fetchTrackingValues:p,storefrontAccessToken:a,ignoreDeprecatedCookies:true}),g=react.useMemo(hydrogenReact.getTrackingValues,[y]),{revalidate:m}=reactRouter.useRevalidator();loadScript.useLoadScript(t?fn:yn,{attributes:{id:"customer-privacy-api"}});let{observing:d,setLoaded:l,apisLoaded:S}=gn({withPrivacyBanner:t}),f=react.useMemo(()=>{n||vt("checkoutDomain"),a||vt("storefrontAccessToken"),(a.startsWith("shpat_")||a.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=hn(n);return {checkoutRootDomain:u&&typeof window<"u"?window.location.host:n,storefrontRootDomain:C?"."+C:void 0,storefrontAccessToken:a,country:s,locale:c}},[vt,n,a,s,c]);react.useEffect(()=>{let C=A=>{let h=hydrogenReact.getTrackingValues();if((g.visitToken!==h.visitToken||g.uniqueToken!==h.uniqueToken)&&m().catch(()=>{console.warn("[h2:warn:useCustomerPrivacy] Revalidation failed after consent change.");}),r){let R=re();if(R?.shouldShowBanner()){let T=R.currentVisitorConsent();if(T&&T.marketing===""&&T.analytics===""&&T.preferences==="")return}r(A.detail);}};return document.addEventListener("visitorConsentCollected",C),()=>{document.removeEventListener("visitorConsentCollected",C);}},[r]),react.useEffect(()=>{if(!t||d.current.privacyBanner)return;d.current.privacyBanner=true;let C=window.privacyBanner||void 0;Object.defineProperty(window,"privacyBanner",{configurable:true,get(){return C},set(h){typeof h=="object"&&h!==null&&"showPreferences"in h&&"loadBanner"in h&&(C=Ur({privacyBanner:h,config:f}),l.privacyBanner());}});},[t,f,Ur,l.privacyBanner]),react.useEffect(()=>{if(d.current.customerPrivacy)return;d.current.customerPrivacy=true;let C=null,A=window.Shopify||void 0;Object.defineProperty(window,"Shopify",{configurable:true,get(){return A},set(h){typeof h=="object"&&h!==null&&Object.keys(h).length===0&&(A=h,Object.defineProperty(window.Shopify,"customerPrivacy",{configurable:true,get(){return C},set(R){if(typeof R=="object"&&R!==null&&"setTrackingConsent"in R){let T=R;C={...T,setTrackingConsent:_r({customerPrivacy:T,config:f})},A={...A,customerPrivacy:C},l.customerPrivacy();}}}));}});},[f,_r,l.customerPrivacy]),react.useEffect(()=>{if(!S||!y)return;let C=re();if(C&&!C.cachedConsent){let A=hydrogenReact.getTrackingValues();A.consent&&(C.cachedConsent=A.consent);}if(t){let A=Ie();A&&A.loadBanner(f);}mn(),o?.();},[S,y]);let P={customerPrivacy:re()};return t&&(P.privacyBanner=Ie()),P}var Dr=false;function mn(){if(Dr)return;Dr=true;let e=new CustomEvent("shopifyCustomerPrivacyApiLoaded");document.dispatchEvent(e);}function gn({withPrivacyBanner:e}){let t=react.useRef({customerPrivacy:false,privacyBanner:false}),[r,o]=react.useState(e?[false,false]:[false]),n=r.every(Boolean);return {observing:t,setLoaded:{customerPrivacy:()=>{o(e?s=>[true,s[1]]:()=>[true]);},privacyBanner:()=>{e&&o(s=>[s[0],true]);}},apisLoaded:n}}function hn(e){if(typeof window>"u")return;let t=window.location.host,r=e.split(".").reverse(),o=t.split(".").reverse(),n=[];return r.forEach((a,s)=>{a===o[s]&&n.push(a);}),n.reverse().join(".")||void 0}function _r({customerPrivacy:e,config:t}){let r=e.setTrackingConsent,{locale:o,country:n,...a}=t;function s(c,i){r({...a,headlessStorefront:true,...c},i);}return s}function Ur({privacyBanner:e,config:t}){let r=e.loadBanner,o=e.showPreferences;function n(s){if(typeof s=="object"){r({...t,...s});return}r(t);}function a(s){if(typeof s=="object"){o({...t,...s});return}o(t);}return {loadBanner:n,showPreferences:a}}function re(){try{return window.Shopify&&window.Shopify.customerPrivacy?window.Shopify?.customerPrivacy:null}catch{return null}}function Ie(){try{return window&&window?.privacyBanner?window.privacyBanner:null}catch{return null}}var Lr="2025.7.2";function Rn(){let e=re();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 Nr({consent:e,onReady:t,domain:r}){let{subscribe:o,register:n,canTrack:a}=Y(),[s,c]=react.useState(false),[i,u]=react.useState(false),[p,y]=react.useState(""),g=react.useRef(false),{checkoutDomain:m,storefrontAccessToken:d,language:l}=e,{ready:S}=n("Internal_Shopify_Analytics");Rt({...e,locale:l,checkoutDomain:m||"mock.shop",storefrontAccessToken:d||"abcdefghijklmnopqrstuvwxyz123456",onReady:()=>!e.withPrivacyBanner&&u(true),onVisitorConsentCollected:P=>{try{y(JSON.stringify(P));}catch{}u(true);}});let f=react.useMemo(()=>i?a():true,[i,a,p]);return hydrogenReact.useShopifyCookies({hasUserConsent:f,domain:r,checkoutDomain:m,fetchTrackingValues:false,ignoreDeprecatedCookies:!i}),react.useEffect(()=>{g.current||(g.current=true,o(F.PAGE_VIEWED,In),o(F.PRODUCT_VIEWED,En),o(F.COLLECTION_VIEWED,bn),o(F.SEARCH_VIEWED,wn),o(F.PRODUCT_ADD_TO_CART,xn),c(true));},[o]),react.useEffect(()=>{s&&i&&(S(),t());},[s,i,t]),null}function Je(e){console.error(`[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${e} configuration.`);}function we(e){let t=Rn(),r=t.analyticsProcessingAllowed();if(!e?.shop?.shopId){Je("shopId");return}if(!e?.shop?.acceptedLanguage){Je("acceptedLanguage");return}if(!e?.shop?.currency){Je("currency");return}if(!e?.shop?.hydrogenSubchannelId){Je("hydrogenSubchannelId");return}return {shopifySalesChannel:"hydrogen",assetVersionId:Lr,...e.shop,hasUserConsent:r,...hydrogenReact.getClientBrowserParameters(),analyticsAllowed:t.analyticsProcessingAllowed(),marketingAllowed:t.marketingAllowed(),saleOfDataAllowed:t.saleOfDataAllowed(),ccpaEnforced:!t.saleOfDataAllowed(),gdprEnforced:!(t.marketingAllowed()&&t.analyticsProcessingAllowed())}}function Tn(e,t){if(t===null)return;let r=we(e);return r?{...r,cartId:t.id}:void 0}var oe={};function In(e){let t=we(e);t&&(hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PAGE_VIEW_2,payload:{...t,...oe}}),oe={});}function En(e){let t=we(e);if(t&&Mr({type:"product",products:e.products})){let r=It(e.products);oe={pageType:hydrogenReact.AnalyticsPageType.product,resourceId:r[0].productGid},t={...t,...oe,products:It(e.products)},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.PRODUCT_VIEW,payload:t});}}function bn(e){let t=we(e);t&&(oe={pageType:hydrogenReact.AnalyticsPageType.collection,resourceId:e.collection.id},t={...t,...oe,collectionHandle:e.collection.handle,collectionId:e.collection.id},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.COLLECTION_VIEW,payload:t}));}function wn(e){let t=we(e);t&&(oe={pageType:hydrogenReact.AnalyticsPageType.search},t={...t,...oe,searchString:e.searchTerm},hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.SEARCH_VIEW,payload:t}));}function xn(e){let{cart:t,currentLine:r}=e,o=Tn(e,t);!o||!r?.id||On({matchedLine:r,eventPayload:o});}function On({matchedLine:e,eventPayload:t}){let r={id:e.merchandise.product.id,variantId:e.merchandise.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};Mr({type:"cart",products:[r]})&&hydrogenReact.sendShopifyAnalytics({eventName:hydrogenReact.AnalyticsEventName.ADD_TO_CART,payload:{...t,products:It([r])}});}function ce(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 Mr({type:e,products:t}){return !t||t.length===0?(ce(e,"",false,"data.products"),false):(t.forEach(r=>{if(!r.id)return ce(e,"id",false),false;if(!r.title)return ce(e,"title",false),false;if(!r.price)return ce(e,"price.amount",true,"price"),false;if(!r.vendor)return ce(e,"vendor",false),false;if(!r.variantId)return ce(e,"id",true,"variantId"),false;if(!r.variantTitle)return ce(e,"title",true,"variantTitle"),false}),true)}function It(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 Fr(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 qr({cart:e,setCarts:t}){let{publish:r,shop:o,customData:n,canTrack:a,cart:s,prevCart:c}=Y(),i=react.useRef(null);return react.useEffect(()=>{if(e)return Promise.resolve(e).then(u=>{if(u&&u.lines){if(!u.id){Fr("id");return}if(!u.updatedAt){Fr("updatedAt");return}}t(({cart:p,prevCart:y})=>u?.updatedAt!==p?.updatedAt?{cart:u,prevCart:p}:{cart:p,prevCart:y});}),()=>{}},[t,e]),react.useEffect(()=>{if(!s||!s?.updatedAt||s?.updatedAt===c?.updatedAt)return;let u;try{u=JSON.parse(localStorage.getItem("cartLastUpdatedAt")||"");}catch{u=null;}if(s.id===u?.id&&s.updatedAt===u?.updatedAt)return;let p={eventTimestamp:Date.now(),cart:s,prevCart:c,shop:o,customData:n};if(s.updatedAt===i.current)return;i.current=s.updatedAt,r("cart_updated",p),localStorage.setItem("cartLastUpdatedAt",JSON.stringify({id:s.id,updatedAt:s.updatedAt}));let y=c?.lines?hydrogenReact.flattenConnection(c?.lines):[],g=s.lines?hydrogenReact.flattenConnection(s.lines):[];y?.forEach(m=>{let d=g.filter(l=>m.id===l.id);if(d?.length===1){let l=d[0];m.quantity<l.quantity?r("product_added_to_cart",{...p,prevLine:m,currentLine:l}):m.quantity>l.quantity&&r("product_removed_from_cart",{...p,prevLine:m,currentLine:l});}else r("product_removed_from_cart",{...p,prevLine:m});}),g?.forEach(m=>{let d=y.filter(l=>m.id===l.id);(!d||d.length===0)&&r("product_added_to_cart",{...p,currentLine:m});});},[s,c,r,o,n,a]),null}var Nn="https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-spa.min.js";function $r({shop:e}){let t=react.useRef(false),{subscribe:r,register:o}=Y(),{ready:n}=o("Internal_Shopify_Perf_Kit"),a=hydrogenReact.useLoadScript(Nn,{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=true,r(F.PAGE_VIEWED,()=>{window.PerfKit?.navigate();}),r(F.PRODUCT_VIEWED,()=>{window.PerfKit?.setPageType("product");}),r(F.COLLECTION_VIEWED,()=>{window.PerfKit?.setPageType("collection");}),r(F.SEARCH_VIEWED,()=>{window.PerfKit?.setPageType("search");}),r(F.CART_VIEWED,()=>{window.PerfKit?.setPageType("cart");}),n());},[r,n,a]),null}var Gr=new Set,B=e=>{Gr.has(e)||(console.warn(e),Gr.add(e));},Br=new Set,bt=e=>{Br.has(e)||(console.error(new Error(e)),Br.add(e));};var qn={canTrack:()=>false,cart:null,customData:{},prevCart:null,publish:()=>{},shop:null,subscribe:()=>{},register:()=>({ready:()=>{}}),customerPrivacy:null,privacyBanner:null},zr=react.createContext(qn),Ze=new Map,Oe={};function Jr(){return Object.values(Oe).every(Boolean)}function Qr(e,t){Ze.has(e)||Ze.set(e,new Map),Ze.get(e)?.set(t.toString(),t);}var et=new Map;function Wr(e,t){if(!Jr()){et.set(e,t);return}Xr(e,t);}function Xr(e,t){(Ze.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 jr(e){return Oe.hasOwnProperty(e)||(Oe[e]=false),{ready:()=>{Oe[e]=true,Jr()&&et.size>0&&(et.forEach((t,r)=>{Xr(r,t);}),et.clear());}}}function Kr(){try{return window.Shopify.customerPrivacy.analyticsProcessingAllowed()}catch{}return false}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 $n({canTrack:e,cart:t,children:r,consent:o,customData:n={},shop:a=null,cookieDomain:s}){let{shop:c}=Gn(a),[i,u]=react.useState(!!e),[p,y]=react.useState(false),[g,m]=react.useState({cart:null,prevCart:null}),[d,l]=react.useState(e?()=>e:()=>Kr);if(c)if(/\/68817551382$/.test(c.shopId))B("[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.");else {if(!o.checkoutDomain){let f=Yr("consent.checkoutDomain","PUBLIC_CHECKOUT_DOMAIN");bt(f);}if(!o.storefrontAccessToken){let f=Yr("consent.storefrontAccessToken","PUBLIC_STOREFRONT_API_TOKEN");bt(f);}o?.country||(o.country="US"),o?.language||(o.language="EN"),o.withPrivacyBanner===void 0&&(o.withPrivacyBanner=false);}let S=react.useMemo(()=>({canTrack:d,...g,customData:n,publish:d()?Wr:()=>{},shop:c,subscribe:Qr,register:jr,customerPrivacy:re(),privacyBanner:Ie()}),[i,d,g,g.cart?.updatedAt,g.prevCart,Wr,Qr,n,c,jr,JSON.stringify(Oe),re,Ie]);return jsxRuntime.jsxs(zr.Provider,{value:S,children:[r,!!c&&jsxRuntime.jsx(Pr,{}),!!c&&!!t&&jsxRuntime.jsx(qr,{cart:t,setCarts:m}),!!c&&jsxRuntime.jsx(Nr,{consent:o,onReady:()=>{u(true),l(e?()=>e:()=>Kr),y(true);},domain:s}),!!c&&p&&jsxRuntime.jsx($r,{shop:c})]})}function Y(){let e=react.useContext(zr);if(!e)throw new Error("[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>");return e}function Gn(e){let[t,r]=react.useState(null);return react.useEffect(()=>(Promise.resolve(e).then(r),()=>{}),[r,e]),{shop:t}}async function Bn({storefront:e,publicStorefrontId:t="0"}){return e.query(Qn,{cache:e.CacheLong()}).then(({shop:r,localization:o})=>({shopId:r.id,acceptedLanguage:o.language.isoCode,currency:o.country.currency.isoCode,hydrogenSubchannelId:t}))}var Qn=`#graphql
|
|
2
2
|
query ShopData(
|
|
3
3
|
$country: CountryCode
|
|
4
4
|
$language: LanguageCode
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
`,
|
|
20
|
+
`,Wn={CartView:Tr,CollectionView:Rr,CustomView:Er,ProductView:vr,Provider:$n,SearchView:Ir};function W(e,t){return wt(e.headers,t)}function wt(e,t){let r=e?.get?.(t)??e?.[t];return typeof r=="string"?r:null}function ne(e){return {requestId:e?W(e,"request-id"):void 0,purpose:e?W(e,"purpose"):void 0}}function Zr(e){return {requestGroupId:W(e,"request-id"),buyerIp:W(e,"oxygen-buyer-ip"),buyerIpSig:W(e,Re),cookie:W(e,"cookie"),purpose:W(e,"sec-purpose")||W(e,"purpose")}}var xt=/^\/api\/(unstable|2\d{3}-\d{2})\/graphql\.json$/,Ot=e=>{try{return new URL(e,"http://e.c").pathname}catch{return "/"}};function Dt(e,t){return t.reduce((r,o)=>{let n=e(o);return n&&r.push([o,n]),r},[])}function fe(e,t={}){let r=new Error,o=(n,a="Error")=>{let s=(r.stack??"").split(`
|
|
21
21
|
`).slice(3+(t.stackOffset??0)).join(`
|
|
22
22
|
`).replace(/ at loader(\d+) \(/,(c,i)=>c.replace(i,""));return `${a}: ${n}
|
|
23
|
-
`+s};return e.then(n=>{if(n?.errors&&Array.isArray(n.errors)){let a=typeof t.logErrors=="function"?t.logErrors:()=>t.logErrors??false;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
|
|
23
|
+
`+s};return e.then(n=>{if(n?.errors&&Array.isArray(n.errors)){let a=typeof t.logErrors=="function"?t.logErrors:()=>t.logErrors??false;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 j=void 0;var tt="public",Kn="private",_t="no-store",eo={maxAge:"max-age",staleWhileRevalidate:"stale-while-revalidate",sMaxAge:"s-maxage",staleIfError:"stale-if-error"};function De(e){let t=[];return Object.keys(e).forEach(r=>{r==="mode"?t.push(e[r]):eo[r]&&t.push(`${eo[r]}=${e[r]}`);}),t.join(", ")}function Ut(){return {mode:_t}}function Lt(e){if(e?.mode&&e?.mode!==tt&&e?.mode!==Kn)throw Error("'mode' must be either 'public' or 'private'")}function ue(e){return Lt(e),{mode:tt,maxAge:1,staleWhileRevalidate:9,...e}}function kt(e){return Lt(e),{mode:tt,maxAge:3600,staleWhileRevalidate:82800,...e}}function me(e){return Lt(e),{mode:tt,maxAge:1,staleWhileRevalidate:86399,...e}}function Nt(e){return e}function z(e){return String(e).includes("__proto__")?JSON.parse(e,Yn):JSON.parse(e)}function Yn(e,t){if(e!=="__proto__")return t}function rt(e,t){return e&&t?{...e,...t}:e||me()}function Mt(e){return De(rt(e))}async function zn(e,t){if(!e)return;let r=await e.match(t);if(!r){return}return r}async function Jn(e,t,r,o){if(!e)return;let n=rt(o),a=Mt(rt(n,{maxAge:(n.maxAge||0)+(n.staleWhileRevalidate||0)})),s=Mt(rt(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 Xn(e,t){e&&await e.delete(t);}function Zn(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 ea(e,t){let r=t.headers.get("cache-put-date");if(!r)return false;let[o,n]=Zn(t,r),a=o>n;return a}var ot={get:zn,set:Jn,delete:Xn,generateDefaultCacheControlHeader:Mt,isStale:ea};function _e(e){return `https://shopify.dev/?${e}`}function ta(e){return e||me()}async function to(e,t){if(!e)return;let r=_e(t),o=new Request(r),n=await ot.get(e,o);if(!n)return;let a=await n.text();try{return [z(a),n]}catch{return [a,n]}}async function ro(e,t,r,o){if(!e)return;let n=_e(t),a=new Request(n),s=new Response(JSON.stringify(r));await ot.set(e,a,s,ta(o));}function oo(e,t){return ot.isStale(new Request(_e(e)),t)}function no(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 Vt=new Set;async function nt(e,t,{strategy:r=ue(),cacheInstance:o,shouldCacheResult:n=()=>true,waitUntil:a,debugInfo:s}){let i=no([...typeof e=="string"?[e]:e]),y=f=>{({displayName:f.displayName,url:f.response?.url,responseInit:{status:f.response?.status||0,statusText:f.response?.statusText||"",headers:Array.from(f.response?.headers.entries()||[])}});},m=void 0;if(!o||!r||r.mode===_t){let f=await t({addDebugData:y});return f}let d=f=>ro(o,i,{value:f,debugInfo:void 0},r),l=await to(o,i);if(l&&typeof l[0]!="string"){let[{value:f,debugInfo:P},C]=l;let A=oo(i,C)?"STALE":"HIT";if(!Vt.has(i)&&A==="STALE"){Vt.add(i);let h=Promise.resolve().then(async()=>{let R=Date.now();try{let T=await t({addDebugData:y});n(T)&&(await d(T),m?.({result:T,cacheStatus:"PUT",overrideStartTime:R}));}catch(T){T.message&&(T.message="SWR in sub-request failed: "+T.message),console.error(T);}finally{Vt.delete(i);}});a?.(h);}return f}let S=await t({addDebugData:y});if(n(S)){let f=Promise.resolve().then(async()=>{await d(S);});a?.(f);}return S}var oa=["set-cookie","server-timing"];function ao(e,t){return [e,{status:t.status,statusText:t.statusText,headers:[...t.headers].filter(([r])=>!oa.includes(r.toLowerCase()))}]}function so([e,t]){return [e,new Response(e,t)]}async function at(e,t,{cacheInstance:r,cache:o,cacheKey:n=[e,t],shouldCacheResponse:a,waitUntil:s,debugInfo:c,streamConfig:i,onRawHeaders:u}){return !o&&(!t.method||t.method==="GET")&&(o=ue()),nt(n,async()=>{if(i){let g=null,d=await graphqlClient.createGraphQLClient({url:e,customFetchApi:async(f,P)=>(g=await fetch(f,P),u?.(g.headers),g),headers:t.headers}).requestStream(i.query,{variables:i.variables}),l,S;for await(let f of d){let{data:P,errors:C}=f;l=P,S=C?.graphQLErrors??C;}return g?.ok?ao({data:l,errors:S},g):g}let p=await fetch(e,t);if(u?.(p.headers),!p.ok)return p;let y=await p.text().catch(()=>"");try{y&&(y=z(y));}catch{}return ao(y,p)},{cacheInstance:r,waitUntil:s,strategy:o??null,debugInfo:c,shouldCacheResult:p=>"ok"in p?!1:a(...so(p))}).then(p=>"ok"in p?[null,p]:so(p))}function na(e){let{cache:t,waitUntil:r,request:o}=e;return {run:({cacheKey:n,cacheStrategy:a,shouldCacheResult:s},c)=>nt(n,c,{shouldCacheResult:s,strategy:a,cacheInstance:t,waitUntil:r,debugInfo:{...ne(o),stackInfo:j?.()}}),fetch:(n,a,s)=>at(n,a??{},{waitUntil:r,cacheKey:[n,a],cacheInstance:t,debugInfo:{url:n,...ne(o),stackInfo:j?.(),displayName:s?.displayName},cache:s.cacheStrategy,...s}).then(([c,i])=>({data:c,response:i}))}}var Ht=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),c=s.get("cache-control")||s.get("real-cache-control")||"",i=parseInt(c.match(/max-age=(\d+)/)?.[1]||"0",10),u=parseInt(c.match(/stale-while-revalidate=(\d+)/)?.[1]||"0",10),p=(Date.now()-n)/1e3;if(p>i+u){this.#e.delete(t.url);return}let g=p>i;return s.set("cache",g?"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),true):false}keys(t){let r=[];for(let o of this.#e.keys())(!t||t.url===o)&&r.push(new Request(o));return Promise.resolve(r)}};var io="cartFormInput";function J({children:e,action:t,inputs:r,route:o,fetcherKey:n}){let a=reactRouter.useFetcher({key:n});return jsxRuntime.jsxs(a.Form,{action:o||"",method:"post",children:[(t||r)&&jsxRuntime.jsx("input",{type:"hidden",name:io,value:JSON.stringify({action:t,inputs:r})}),typeof e=="function"?e(a):e]})}J.INPUT_NAME=io;J.ACTIONS={AttributesUpdateInput:"AttributesUpdateInput",BuyerIdentityUpdate:"BuyerIdentityUpdate",Create:"Create",DiscountCodesUpdate:"DiscountCodesUpdate",GiftCardCodesUpdate:"GiftCardCodesUpdate",GiftCardCodesRemove:"GiftCardCodesRemove",LinesAdd:"LinesAdd",LinesRemove:"LinesRemove",LinesUpdate:"LinesUpdate",NoteUpdate:"NoteUpdate",SelectedDeliveryOptionsUpdate:"SelectedDeliveryOptionsUpdate",MetafieldsSet:"MetafieldsSet",MetafieldDelete:"MetafieldDelete",DeliveryAddressesAdd:"DeliveryAddressesAdd",DeliveryAddressesUpdate:"DeliveryAddressesUpdate",DeliveryAddressesRemove:"DeliveryAddressesRemove"};function sa(e){let t={};for(let s of e.entries()){let c=s[0],i=e.getAll(c);t[c]=i.length>1?i:s[1],t[c]==="on"?t[c]=true:t[c]==="off"&&(t[c]=false);}let{cartFormInput:r,...o}=t,{action:n,inputs:a}=r?JSON.parse(String(r)):{};return {action:n,inputs:{...a,...o}}}J.getFormInput=sa;var Ft=e=>{let t=cookie.parse(wt(e,"Cookie")||"");return ()=>t.cart?`gid://shopify/Cart/${t.cart}`:void 0};var qt=e=>t=>{let r=new Headers;return r.append("Set-Cookie",cookie.stringify("cart",t.split("/").pop()||"",{path:"/",...e})),r};function st(){return typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`weak-${Math.random().toString(16).substring(2)}`}var Ue="2025.7.2";function ge(e){return e.replace(/\s*#.*$/gm,"").replace(/\s+/gm," ").trim()}var da=/(^|}\s)query[\s({]/im,la=/(^|}\s)mutation[\s({]/im;function it(e,t){if(!da.test(e))throw new Error(`[h2:error:${t}] Can only execute queries`)}function ct(e,t){if(!la.test(e))throw new Error(`[h2:error:${t}] Can only execute mutations`)}var pe=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+=`
|
|
24
24
|
`,this.stack&&(t+=`${this.stack.slice(this.stack.indexOf(`
|
|
25
25
|
`)+1)}
|
|
26
|
-
`),t}toJSON(){return {name:"Error",message:""}}};function
|
|
26
|
+
`),t}toJSON(){return {name:"Error",message:""}}};function Le({url:e,response:t,errors:r,type:o,query:n,queryVariables:a,ErrorConstructor:s=Error,client:c="storefront"}){let i=(typeof r=="string"?r:r?.map?.(p=>p.message).join(`
|
|
27
27
|
`))||`URL: ${e}
|
|
28
|
-
API response error: ${t.status}`,u=new
|
|
28
|
+
API response error: ${t.status}`,u=new pe(i,{query:n,queryVariables:a,cause:{errors:r},clientOperation:`${c}.${o}`,requestId:t.headers.get("x-request-id")});throw new s(u.message,{cause:u.cause})}var ga={language:"EN",country:"US"};function yo(e){let {storefrontHeaders:t,cache:r,waitUntil:o,i18n:n,storefrontId:a,logErrors:s=true,...c}=e,{getPublicTokenHeaders:u,getPrivateTokenHeaders:p,getStorefrontApiUrl:y,getShopifyDomain:g}=hydrogenReact.createStorefrontClient(c),d=(c.privateStorefrontToken?p:u)({contentType:"json",buyerIp:t?.buyerIp||""});t?.buyerIp&&(d[St]=t.buyerIp),t?.buyerIpSig&&(d[Re]=t.buyerIpSig),d[Qe]=t?.requestGroupId||st(),a&&(d[hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER]=a),(d["user-agent"]=`Hydrogen ${Ue}`);let l=t?.cookie??"";l&&(d.cookie=l);let S,f;if(!/\b_shopify_(analytics|marketing)=/.test(l)){let h=l.match(/\b_shopify_y=([^;]+)/)?.[1],R=l.match(/\b_shopify_s=([^;]+)/)?.[1];h&&(d[hydrogenReact.SHOPIFY_STOREFRONT_Y_HEADER]=h),R&&(d[hydrogenReact.SHOPIFY_STOREFRONT_S_HEADER]=R),S=h??st(),f=R??st(),d[hydrogenReact.SHOPIFY_UNIQUE_TOKEN_HEADER]=S,d[hydrogenReact.SHOPIFY_VISIT_TOKEN_HEADER]=f;}let P,C=JSON.stringify({"content-type":d["content-type"],"user-agent":d["user-agent"],[ht]:d[ht],[Ct]:d[Ct],[At]:d[At],[We]:d[We]});async function A({query:h,mutation:R,variables:T,cache:N,headers:k=[],storefrontApiVersion:ie,displayName:Ge,stackInfo:Be}){let v=k instanceof Headers?Object.fromEntries(k.entries()):Array.isArray(k)?Object.fromEntries(k):k,I=h??R,O={...T};n&&(!T?.country&&/\$country/.test(I)&&(O.country=n.country),!T?.language&&/\$language/.test(I)&&(O.language=n.language));let D=y({storefrontApiVersion:ie}),M=JSON.stringify({query:I,variables:O}),$={method:"POST",headers:{...d,...v},body:M},V=[D,$.method,C,$.body],ee=I.includes("@defer")?{query:I,variables:O}:void 0,[K,_]=await at(D,$,{cacheInstance:R?void 0:r,cache:N||me(),cacheKey:V,waitUntil:o,shouldCacheResponse:H=>!H?.errors,debugInfo:{requestId:$.headers[Qe],displayName:Ge,url:D,stackInfo:Be,graphql:M,purpose:t?.purpose},streamConfig:ee,onRawHeaders:H=>{P??={setCookie:H.getSetCookie(),serverTiming:H.get("server-timing")??""};}}),Q={url:D,response:_,type:R?"mutation":"query",query:I,queryVariables:O,errors:void 0};if(!_.ok){let H,te=K;try{te??=await _.text(),H=z(te);}catch{H=[{message:te??"Could not parse Storefront API response"}];}Le({...Q,errors:H});}let{data:Pe,errors:G}=K;G=G?Array.isArray(G)?G:[G]:void 0;let ve=G?.map(({message:H,...te})=>new pe(H,{...te,clientOperation:`storefront.${Q.type}`,requestId:_.headers.get("x-request-id"),queryVariables:O,query:I}));return E(Pe,ve)}return {storefront:{query(h,R){h=ge(h),it(h,"storefront.query");let T=lo?.(h);return fe(A({...R,query:h,stackInfo:j?.(T)}),{stackOffset:T,logErrors:s})},mutate(h,R){h=ge(h),ct(h,"storefront.mutate");let T=lo?.(h);return fe(A({...R,mutation:h,stackInfo:j?.(T)}),{stackOffset:T,logErrors:s})},cache:r,CacheNone:Ut,CacheLong:kt,CacheShort:ue,CacheCustom:Nt,generateCacheControlHeader:De,getPublicTokenHeaders:u,getPrivateTokenHeaders:p,getHeaders:()=>({...d}),getShopifyDomain:g,getApiUrl:y,i18n:n??ga,isStorefrontApiUrl(h){return xt.test(Ot(h.url??""))},async forward(h,R){let T=new Headers([...Dt(ie=>h.headers.get(ie),["accept","accept-encoding","accept-language","access-control-request-headers","access-control-request-method","content-type","content-length","cookie","origin","referer","user-agent",We,hydrogenReact.SHOPIFY_UNIQUE_TOKEN_HEADER,hydrogenReact.SHOPIFY_VISIT_TOKEN_HEADER]),...Dt(ie=>d[ie],[St,Re,hydrogenReact.SHOPIFY_STOREFRONT_ID_HEADER,Qe])]);t?.buyerIp&&T.set("x-forwarded-for",t.buyerIp);let N=R?.storefrontApiVersion??Ot(h.url).match(xt)?.[1],k=await fetch(y({storefrontApiVersion:N}),{method:h.method,body:h.body,headers:T});return new Response(k.body,k)},setCollectedSubrequestHeaders:h=>{if(P)for(let k of P.setCookie)h.headers.append("Set-Cookie",k);let R=br(P?.serverTiming),T=h.headers.get("content-type")?.startsWith("text/html");Te(h,{...T?{_y:S,_s:f}:void 0,...R}),T&&P&&P.setCookie.length>1&&R?._y&&R?._s&&R?._cmp&&Te(h,{[Ke]:"1"});}}}}var lo=void 0;function E(e,t){return {...e,...t&&{errors:t}}}function $t({storefront:e,customerAccount:t,getCartId:r,cartFragment:o}){return async n=>{let a=r();if(!a)return null;let[s,{cart:c,errors:i}]=await Promise.all([t?t.isLoggedIn():false,e.query(ha(o),{variables:{cartId:a,...n},cache:e.CacheNone()})]);if(s&&c?.checkoutUrl){let u=new URL(c.checkoutUrl);u.searchParams.set("logged_in","true"),c.checkoutUrl=u.toString();}return c||i?E(c,i):null}}var ha=(e=Ca)=>`#graphql
|
|
29
29
|
query CartQuery(
|
|
30
30
|
$cartId: ID!
|
|
31
31
|
$numCartLines: Int = 100
|
|
@@ -38,7 +38,7 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
${e}
|
|
41
|
-
`,
|
|
41
|
+
`,Ca=`#graphql
|
|
42
42
|
fragment CartApiQuery on Cart {
|
|
43
43
|
updatedAt
|
|
44
44
|
id
|
|
@@ -153,25 +153,25 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
153
153
|
width
|
|
154
154
|
height
|
|
155
155
|
}
|
|
156
|
-
`;var
|
|
156
|
+
`;var b=`#graphql
|
|
157
157
|
fragment CartApiError on CartUserError {
|
|
158
158
|
message
|
|
159
159
|
field
|
|
160
160
|
code
|
|
161
161
|
}
|
|
162
|
-
`,
|
|
162
|
+
`,w=`#graphql
|
|
163
163
|
fragment CartApiMutation on Cart {
|
|
164
164
|
id
|
|
165
165
|
totalQuantity
|
|
166
166
|
checkoutUrl
|
|
167
167
|
}
|
|
168
|
-
`,
|
|
168
|
+
`,x=`#graphql
|
|
169
169
|
fragment CartApiWarning on CartWarning {
|
|
170
170
|
code
|
|
171
171
|
message
|
|
172
172
|
target
|
|
173
173
|
}
|
|
174
|
-
`;function
|
|
174
|
+
`;function Gt(e){return async(t,r)=>{let o=e.customerAccount?await e.customerAccount.getBuyer():void 0,{cartId:n,...a}=r||{},{buyerIdentity:s,...c}=t,{cartCreate:i,errors:u}=await e.storefront.mutate(Aa(e.cartFragment),{variables:{input:{...c,buyerIdentity:{...o,...s}},...a}});return E(i,u)}}var Aa=(e=w)=>`#graphql
|
|
175
175
|
mutation cartCreate(
|
|
176
176
|
$input: CartInput!
|
|
177
177
|
$country: CountryCode = ZZ
|
|
@@ -191,9 +191,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
${e}
|
|
194
|
-
${
|
|
195
|
-
${
|
|
196
|
-
`;function
|
|
194
|
+
${b}
|
|
195
|
+
${x}
|
|
196
|
+
`;function Bt(e){return async(t,r)=>{let{cartLinesAdd:o,errors:n}=await e.storefront.mutate(Sa(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return E(o,n)}}var Sa=(e=w)=>`#graphql
|
|
197
197
|
mutation cartLinesAdd(
|
|
198
198
|
$cartId: ID!
|
|
199
199
|
$lines: [CartLineInput!]!
|
|
@@ -213,9 +213,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
${e}
|
|
216
|
-
${
|
|
217
|
-
${
|
|
218
|
-
`;var
|
|
216
|
+
${b}
|
|
217
|
+
${x}
|
|
218
|
+
`;var fo="__h_pending_";function mo(e){return fo+e}function ut(e){return e.startsWith(fo)}function pt(e,t){if(t.some(r=>ut(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 Qt(e){return async(t,r)=>{pt("updateLines",t);let{cartLinesUpdate:o,errors:n}=await e.storefront.mutate(Pa(e.cartFragment),{variables:{cartId:e.getCartId(),lines:t,...r}});return E(o,n)}}var Pa=(e=w)=>`#graphql
|
|
219
219
|
mutation cartLinesUpdate(
|
|
220
220
|
$cartId: ID!
|
|
221
221
|
$lines: [CartLineUpdateInput!]!
|
|
@@ -235,9 +235,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
${e}
|
|
238
|
-
${
|
|
239
|
-
${
|
|
240
|
-
`;function
|
|
238
|
+
${b}
|
|
239
|
+
${x}
|
|
240
|
+
`;function Wt(e){return async(t,r)=>{pt("removeLines",t);let{cartLinesRemove:o,errors:n}=await e.storefront.mutate(va(e.cartFragment),{variables:{cartId:e.getCartId(),lineIds:t,...r}});return E(o,n)}}var va=(e=w)=>`#graphql
|
|
241
241
|
mutation cartLinesRemove(
|
|
242
242
|
$cartId: ID!
|
|
243
243
|
$lineIds: [ID!]!
|
|
@@ -257,9 +257,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
257
257
|
}
|
|
258
258
|
}
|
|
259
259
|
${e}
|
|
260
|
-
${
|
|
261
|
-
${
|
|
262
|
-
`;function
|
|
260
|
+
${b}
|
|
261
|
+
${x}
|
|
262
|
+
`;function jt(e){return async(t,r)=>{let o=t.filter((s,c,i)=>i.indexOf(s)===c),{cartDiscountCodesUpdate:n,errors:a}=await e.storefront.mutate(Ra(e.cartFragment),{variables:{cartId:e.getCartId(),discountCodes:o,...r}});return E(n,a)}}var Ra=(e=w)=>`#graphql
|
|
263
263
|
mutation cartDiscountCodesUpdate(
|
|
264
264
|
$cartId: ID!
|
|
265
265
|
$discountCodes: [String!]
|
|
@@ -281,9 +281,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
${e}
|
|
284
|
-
${
|
|
285
|
-
${
|
|
286
|
-
`;function
|
|
284
|
+
${b}
|
|
285
|
+
${x}
|
|
286
|
+
`;function Kt(e){return async(t,r)=>{t.companyLocationId&&e.customerAccount&&e.customerAccount.setBuyer({companyLocationId:t.companyLocationId});let o=e.customerAccount?await e.customerAccount.getBuyer():void 0,{cartBuyerIdentityUpdate:n,errors:a}=await e.storefront.mutate(Ta(e.cartFragment),{variables:{cartId:e.getCartId(),buyerIdentity:{...o,...t},...r}});return E(n,a)}}var Ta=(e=w)=>`#graphql
|
|
287
287
|
mutation cartBuyerIdentityUpdate(
|
|
288
288
|
$cartId: ID!
|
|
289
289
|
$buyerIdentity: CartBuyerIdentityInput!
|
|
@@ -303,9 +303,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
${e}
|
|
306
|
-
${
|
|
307
|
-
${
|
|
308
|
-
`;function
|
|
306
|
+
${b}
|
|
307
|
+
${x}
|
|
308
|
+
`;function Yt(e){return async(t,r)=>{let{cartNoteUpdate:o,errors:n}=await e.storefront.mutate(Ia(e.cartFragment),{variables:{cartId:e.getCartId(),note:t,...r}});return E(o,n)}}var Ia=(e=w)=>`#graphql
|
|
309
309
|
mutation cartNoteUpdate(
|
|
310
310
|
$cartId: ID!
|
|
311
311
|
$note: String!
|
|
@@ -325,9 +325,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
325
325
|
}
|
|
326
326
|
}
|
|
327
327
|
${e}
|
|
328
|
-
${
|
|
329
|
-
${
|
|
330
|
-
`;function
|
|
328
|
+
${b}
|
|
329
|
+
${x}
|
|
330
|
+
`;function zt(e){return async(t,r)=>{let{cartSelectedDeliveryOptionsUpdate:o,errors:n}=await e.storefront.mutate(Ea(e.cartFragment),{variables:{cartId:e.getCartId(),selectedDeliveryOptions:t,...r}});return E(o,n)}}var Ea=(e=w)=>`#graphql
|
|
331
331
|
mutation cartSelectedDeliveryOptionsUpdate(
|
|
332
332
|
$cartId: ID!
|
|
333
333
|
$selectedDeliveryOptions: [CartSelectedDeliveryOptionInput!]!
|
|
@@ -347,9 +347,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
349
|
${e}
|
|
350
|
-
${
|
|
351
|
-
${
|
|
352
|
-
`;function
|
|
350
|
+
${b}
|
|
351
|
+
${x}
|
|
352
|
+
`;function Jt(e){return async(t,r)=>{let{cartAttributesUpdate:o,errors:n}=await e.storefront.mutate(ba(e.cartFragment),{variables:{cartId:r?.cartId||e.getCartId(),attributes:t}});return E(o,n)}}var ba=(e=w)=>`#graphql
|
|
353
353
|
mutation cartAttributesUpdate(
|
|
354
354
|
$cartId: ID!
|
|
355
355
|
$attributes: [AttributeInput!]!
|
|
@@ -367,9 +367,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
367
367
|
}
|
|
368
368
|
}
|
|
369
369
|
${e}
|
|
370
|
-
${
|
|
371
|
-
${
|
|
372
|
-
`;function
|
|
370
|
+
${b}
|
|
371
|
+
${x}
|
|
372
|
+
`;function Xt(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),n=t.map(c=>({...c,ownerId:o})),{cartMetafieldsSet:a,errors:s}=await e.storefront.mutate(wa(),{variables:{metafields:n}});return E({cart:{id:o},...a},s)}}var wa=()=>`#graphql
|
|
373
373
|
mutation cartMetafieldsSet(
|
|
374
374
|
$metafields: [CartMetafieldsSetInput!]!
|
|
375
375
|
$language: LanguageCode
|
|
@@ -384,7 +384,7 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
384
384
|
}
|
|
385
385
|
}
|
|
386
386
|
}
|
|
387
|
-
`;function
|
|
387
|
+
`;function Zt(e){return async(t,r)=>{let o=r?.cartId||e.getCartId(),{cartMetafieldDelete:n,errors:a}=await e.storefront.mutate(xa(),{variables:{input:{ownerId:o,key:t}}});return E({cart:{id:o},...n},a)}}var xa=()=>`#graphql
|
|
388
388
|
mutation cartMetafieldDelete(
|
|
389
389
|
$input: CartMetafieldDeleteInput!
|
|
390
390
|
) {
|
|
@@ -396,7 +396,7 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
-
`;function
|
|
399
|
+
`;function er(e){return async(t,r)=>{let o=t.filter((s,c,i)=>i.indexOf(s)===c),{cartGiftCardCodesUpdate:n,errors:a}=await e.storefront.mutate(Oa(e.cartFragment),{variables:{cartId:e.getCartId(),giftCardCodes:o,...r}});return E(n,a)}}var Oa=(e=w)=>`#graphql
|
|
400
400
|
mutation cartGiftCardCodesUpdate(
|
|
401
401
|
$cartId: ID!
|
|
402
402
|
$giftCardCodes: [String!]!
|
|
@@ -416,9 +416,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
416
416
|
}
|
|
417
417
|
}
|
|
418
418
|
${e}
|
|
419
|
-
${
|
|
420
|
-
${
|
|
421
|
-
`;function
|
|
419
|
+
${b}
|
|
420
|
+
${x}
|
|
421
|
+
`;function tr(e){return async(t,r)=>{let{cartGiftCardCodesRemove:o,errors:n}=await e.storefront.mutate(Da(e.cartFragment),{variables:{cartId:e.getCartId(),appliedGiftCardIds:t,...r}});return E(o,n)}}var Da=(e=w)=>`#graphql
|
|
422
422
|
mutation cartGiftCardCodesRemove(
|
|
423
423
|
$cartId: ID!
|
|
424
424
|
$appliedGiftCardIds: [ID!]!
|
|
@@ -438,9 +438,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
438
438
|
}
|
|
439
439
|
}
|
|
440
440
|
${e}
|
|
441
|
-
${
|
|
442
|
-
${
|
|
443
|
-
`;function
|
|
441
|
+
${b}
|
|
442
|
+
${x}
|
|
443
|
+
`;function go(e){return async(t,r)=>{let{cartDeliveryAddressesAdd:o,errors:n}=await e.storefront.mutate(_a(e.cartFragment),{variables:{cartId:e.getCartId(),addresses:t,...r}});return E(o,n)}}var _a=(e=w)=>`#graphql
|
|
444
444
|
mutation cartDeliveryAddressesAdd(
|
|
445
445
|
$cartId: ID!
|
|
446
446
|
$addresses: [CartSelectableAddressInput!]!,
|
|
@@ -460,9 +460,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
${e}
|
|
463
|
-
${
|
|
464
|
-
${
|
|
465
|
-
`;function
|
|
463
|
+
${b}
|
|
464
|
+
${x}
|
|
465
|
+
`;function ho(e){return async(t,r)=>{let{cartDeliveryAddressesRemove:o,errors:n}=await e.storefront.mutate(Ua(e.cartFragment),{variables:{cartId:e.getCartId(),addressIds:t,...r}});return E(o,n)}}var Ua=(e=w)=>`#graphql
|
|
466
466
|
mutation cartDeliveryAddressesRemove(
|
|
467
467
|
$cartId: ID!
|
|
468
468
|
$addressIds: [ID!]!,
|
|
@@ -482,9 +482,9 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
482
482
|
}
|
|
483
483
|
}
|
|
484
484
|
${e}
|
|
485
|
-
${
|
|
486
|
-
${
|
|
487
|
-
`;function
|
|
485
|
+
${b}
|
|
486
|
+
${x}
|
|
487
|
+
`;function Co(e){return async(t,r)=>{let{cartDeliveryAddressesUpdate:o,errors:n}=await e.storefront.mutate(La(e.cartFragment),{variables:{cartId:e.getCartId(),addresses:t,...r}});return E(o,n)}}var La=(e=w)=>`#graphql
|
|
488
488
|
mutation cartDeliveryAddressesUpdate(
|
|
489
489
|
$cartId: ID!
|
|
490
490
|
$addresses: [CartSelectableAddressUpdateInput!]!,
|
|
@@ -504,19 +504,19 @@ API response error: ${t.status}`,u=new ce(i,{query:n,queryVariables:a,cause:{err
|
|
|
504
504
|
}
|
|
505
505
|
}
|
|
506
506
|
${e}
|
|
507
|
-
${
|
|
508
|
-
${
|
|
509
|
-
`;function qt(e){let{getCartId:t,setCartId:r,storefront:o,customerAccount:n,cartQueryFragment:a,cartMutateFragment:s,buyerIdentity:c}=e,i=t(),u=()=>i||t(),p={storefront:o,getCartId:u,cartFragment:s,customerAccount:n},d=wt(p),g=async function(...l){l[0].buyerIdentity={...c,...l[0].buyerIdentity};let y=await d(...l);return i=y?.cart?.id,y},m={get:bt({storefront:o,customerAccount:n,getCartId:u,cartFragment:a}),getCartId:u,setCartId:r,create:g,addLines:async(l,y)=>{let h=l.map(f=>({attributes:f.attributes,quantity:f.quantity,merchandiseId:f.merchandiseId,sellingPlanId:f.sellingPlanId}));return i||y?.cartId?await xt(p)(h,y):await g({lines:h,buyerIdentity:c},y)},updateLines:Ot(p),removeLines:Dt(p),updateDiscountCodes:async(l,y)=>i||y?.cartId?await _t(p)(l,y):await g({discountCodes:l},y),updateGiftCardCodes:async(l,y)=>i||y?.cartId?await $t(p)(l,y):await g({giftCardCodes:l},y),removeGiftCardCodes:Ft(p),updateBuyerIdentity:async(l,y)=>i||y?.cartId?await Ut(p)(l,y):await g({buyerIdentity:l},y),updateNote:async(l,y)=>i||y?.cartId?await Lt(p)(l,y):await g({note:l},y),updateSelectedDeliveryOption:kt(p),updateAttributes:async(l,y)=>i||y?.cartId?await Nt(p)(l,y):await g({attributes:l},y),setMetafields:async(l,y)=>i||y?.cartId?await Mt(p)(l,y):await g({metafields:l},y),deleteMetafield:Vt(p),addDeliveryAddresses:no(p),removeDeliveryAddresses:ao(p),updateDeliveryAddresses:so(p)};return "customMethods"in e?{...m,...e.customMethods??{}}:m}function Sa(e){let t=reactRouter.useFetchers();if(!t||!t.length)return e;let r=e?.lines?structuredClone(e):{lines:{nodes:[]}},o=r.lines.nodes,n=false;for(let{formData:a}of t){if(!a)continue;let s=Y.getFormInput(a);if(s.action===Y.ACTIONS.LinesAdd)for(let c of s.inputs.lines){if(!c.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(u=>u.merchandise.id===c.selectedVariant?.id);n=true,i?(i.quantity=(i.quantity||1)+(c.quantity||1),i.isOptimistic=true):o.unshift({id:oo(c.selectedVariant.id),merchandise:c.selectedVariant,isOptimistic:true,quantity:c.quantity||1});}else if(s.action===Y.ACTIONS.LinesRemove)for(let c of s.inputs.lineIds){let i=o.findIndex(u=>u.id===c);if(i!==-1){if(Ye(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=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to remove line '${c}' but it doesn't exist in the cart`);}else if(s.action===Y.ACTIONS.LinesUpdate)for(let c of s.inputs.lines){let i=o.findIndex(u=>c.id===u.id);if(i>-1){if(Ye(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=c.quantity,o[i].quantity===0&&o.splice(i,1),n=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to update line '${c.id}' but it doesn't exist in the cart`);}}return n&&(r.isOptimistic=n),r.totalQuantity=o.reduce((a,s)=>a+s.quantity,0),r}var va="https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json";async function Ra({request:e,changelogUrl:t}){new URL(e.url).searchParams;return fetch(t||va)}var Ht=reactRouter.createContext(),Gt=reactRouter.createContext(),Bt=reactRouter.createContext(),Qt=reactRouter.createContext(),Wt=reactRouter.createContext(),jt=reactRouter.createContext(),Ia={storefront:Ht,cart:Gt,customerAccount:Bt,env:Qt,session:Wt,waitUntil:jt};var Ze="2025-07",he=`Shopify Hydrogen ${be}`,io="30243aa5-17c1-465a-8493-944bcc4e88aa",L="customerAccount",Ce="buyer";var F=class extends Response{constructor(t,r,o){super(`Bad request: ${t}`,{status:400,headers:o});}};function Oe(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 Ta({session:e,customerAccountId:t,customerAccountTokenExchangeUrl:r,httpsOrigin:o,debugInfo:n}){let a=new URLSearchParams,s=e.get(L),c=s?.refreshToken,i=s?.idToken;if(!c)throw new F("Unauthorized","No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.");a.append("grant_type","refresh_token"),a.append("refresh_token",c),a.append("client_id",t);let u={"content-type":"application/x-www-form-urlencoded","User-Agent":he,Origin:o};new Date().getTime();let d=r,g=await fetch(d,{method:"POST",headers:u,body:a});if(!g.ok){let h=await g.text();throw new Response(h,{status:g.status,headers:{"Content-Type":"text/html; charset=utf-8"}})}let{access_token:m,expires_in:l,refresh_token:y}=await g.json();if(!m||m.length===0)throw new F("Unauthorized","Invalid access token received.");e.set(L,{accessToken:m,expiresAt:new Date(new Date().getTime()+(l-120)*1e3).getTime()+"",refreshToken:y,idToken:i});}function Ae(e){e.unset(L),e.unset(Ce);}async function co({locks:e,expiresAt:t,session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s}){if(parseInt(t,10)-1e3<new Date().getTime())try{e.refresh||(e.refresh=Ta({session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s})),await e.refresh,delete e.refresh;}catch(c){throw Ae(r),c&&c.status!==401?c:new F("Unauthorized","Login before querying the Customer Account API.")}}function uo(){let e=Ea();return lo(e)}async function po(e){let t=await crypto.subtle.digest({name:"SHA-256"},new TextEncoder().encode(e)),r=ba(t);return lo(r)}function Ea(){let e=new Uint8Array(32);return crypto.getRandomValues(e),String.fromCharCode.apply(null,Array.from(e))}function lo(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function ba(e){let t=new Uint8Array(e),r=Array.from(t);return String.fromCharCode(...r)}function yo(){let e=Date.now().toString(),t=Math.random().toString(36).substring(2);return e+t}async function fo(e,t,r,o,n){let a=t;if(!e)throw new F("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",io),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 c={"content-type":"application/x-www-form-urlencoded","User-Agent":he,Origin:o};new Date().getTime();let u=r,p=await fetch(u,{method:"POST",headers:c,body:s});let d=await p.json();if(d.error)throw new F(d.error_description);return d.access_token}function mo(e){return wa(e).payload.nonce}function wa(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 et(){return Oa(xa())}function xa(){try{return crypto.getRandomValues(new Uint8Array(16))}catch{return new Uint8Array(16).map(()=>Math.random()*255|0)}}function Oa(e){return Array.from(e,function(t){return ("0"+(t&255).toString(16)).slice(-2)}).join("")}function tt(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(ho(e,a))return a;console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}`);}}function ho(e,t){try{return new URL(e).origin===new URL(t,e).origin}catch{return false}}function Kt({requestUrl:e,defaultUrl:t,redirectUrl:r}){let o=e,n=go(e,t),a=r?go(e,r):n;return ho(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 go(e,t){return Da(t)?new URL(t):new URL(t,new URL(e).origin)}function Da(e){try{return new URL(e),!0}catch{return false}}function Co(e,t){let r=`https://shopify.com/${t}`,o=`https://shopify.com/authentication/${t}`;return function(a){switch(a){case "CA_BASE_URL":return r;case "CA_BASE_AUTH_URL":return o;case "GRAPHQL":return `${r}/account/customer/api/${e}/graphql`;case "AUTH":return `${o}/oauth/authorize`;case "LOGIN_SCOPE":return t?"openid email customer-account-api:full":"openid email https://api.customers.com/auth/customer.graphql";case "TOKEN_EXCHANGE":return `${o}/oauth/token`;case "LOGOUT":return `${o}/logout`}}}function _a(e,t){if(!e.url)return t;let{pathname:r}=new URL(e.url),o=r.replace(/\.data$/,"").replace(/\/_root$/,"/").replace(/(.+)\/$/,"$1"),n=t+`?${new URLSearchParams({return_to:o}).toString()}`;return Oe(n)}function zt({session:e,customerAccountId:t,shopId:r,customerApiVersion:o=Ze,request:n,waitUntil:a,authUrl:s,customAuthStatusHandler:c,logErrors:i=true,loginPath:u="/account/login",authorizePath:p="/account/authorize",defaultRedirectPath:d="/account",language:g}){if(o!==Ze&&console.warn(`[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${o} when this version of Hydrogen was built for ${Ze}.`),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 m=c||(()=>_a(n,u)),l=new URL(n.url),y=l.protocol==="http:"?l.origin.replace("http","https"):l.origin,h=Kt({requestUrl:y,defaultUrl:p,redirectUrl:s}),f=Co(o,r),P=Ua(f,t),C=f("GRAPHQL"),v={};async function b({query:A,type:R,variables:D={}}){let x=await G();if(!x)throw m();new Date().getTime();let N=await fetch(C,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":he,Origin:y,Authorization:x},body:JSON.stringify({query:A,variables:D})});let ee=await N.text(),V={url:C,response:N,type:R,query:A,queryVariables:D,errors:void 0,client:"customer"};if(!N.ok){if(N.status===401)throw Ae(e),m();let _;try{_=J(ee);}catch{_=[{message:ee}];}we({...V,errors:_});}try{let _=J(ee),{errors:U}=_,W=U?.map(({message:Pe,...at})=>new ce(Pe,{...at,clientOperation:`customerAccount.${V.type}`,requestId:N.headers.get("x-request-id"),queryVariables:D,query:A}));return {..._,...U&&{errors:W}}}catch{we({...V,errors:[{message:ee}]});}}async function O(){if(!r)return false;let A=e.get(L),R=A?.accessToken,D=A?.expiresAt;if(!R||!D)return false;let x=H?.();try{await co({locks:v,expiresAt:D,session:e,customerAccountId:t,customerAccountTokenExchangeUrl:f("TOKEN_EXCHANGE"),httpsOrigin:y,debugInfo:{waitUntil:a,stackInfo:x,...re(n)}});}catch{return false}return true}async function w(){if(!await O())throw m()}async function G(){if(await O())return e.get(L)?.accessToken}async function Ne(A,R){return P(),A=me(A),Je(A,"customer.mutate"),ye(b({query:A,type:"mutation",...R}),{logErrors:i})}async function B(A,R){return P(),A=me(A),ze(A,"customer.query"),ye(b({query:A,type:"query",...R}),{logErrors:i})}function Q(A){e.set(Ce,{...e.get(Ce),...A});}async function ae(){let A=await G();if(A)return {...e.get(Ce),customerAccessToken:A}}return {i18n:{language:g??"EN"},login:async A=>{P();let R=new URL(f("AUTH")),D=yo(),x=et();R.searchParams.set("client_id",t),R.searchParams.set("scope","openid email"),R.searchParams.append("response_type","code"),R.searchParams.append("redirect_uri",h),R.searchParams.set("scope",f("LOGIN_SCOPE")),R.searchParams.append("state",D),R.searchParams.append("nonce",x);let M=La({contextLanguage:g??null,uiLocalesOverride:A?.uiLocales??null});M!=null&&R.searchParams.append("ui_locales",M),A?.countryCode&&R.searchParams.append("region_country",A.countryCode);let q=uo(),N=await po(q);return e.set(L,{...e.get(L),codeVerifier:q,state:D,nonce:x,redirectPath:tt(n.url)||z(n,"Referer")||d}),R.searchParams.append("code_challenge",N),R.searchParams.append("code_challenge_method","S256"),Oe(R.toString())},logout:async A=>{P();let R=e.get(L)?.idToken,D=Kt({requestUrl:y,defaultUrl:y,redirectUrl:A?.postLogoutRedirectUri}),x=R?new URL(`${f("LOGOUT")}?${new URLSearchParams([["id_token_hint",R],["post_logout_redirect_uri",D]]).toString()}`).toString():D;Ae(e);let M=A?.headers instanceof Headers?A?.headers:new Headers(A?.headers);return A?.keepSession||(e.destroy?M.set("Set-Cookie",await e.destroy()):console.warn("[h2:warn:customerAccount] session.destroy is not available on your session implementation. All session data might not be cleared on logout."),e.isPending=false),Oe(x,{headers:M})},isLoggedIn:O,handleAuthStatus:w,getAccessToken:G,getApiUrl:()=>C,mutate:Ne,query:B,authorize:async()=>{P();let A=l.searchParams.get("code"),R=l.searchParams.get("state");if(!A||!R)throw Ae(e),new F("Unauthorized","No code or state parameter found in the redirect URL.");if(e.get(L)?.state!==R)throw Ae(e),new F("Unauthorized","The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");let D=t,x=new URLSearchParams;x.append("grant_type","authorization_code"),x.append("client_id",D),x.append("redirect_uri",h),x.append("code",A);let M=e.get(L)?.codeVerifier;if(!M)throw new F("Unauthorized","No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");x.append("code_verifier",M);let q={"content-type":"application/x-www-form-urlencoded","User-Agent":he,Origin:y};new Date().getTime();let V=f("TOKEN_EXCHANGE"),_=await fetch(V,{method:"POST",headers:q,body:x});if(!_.ok)throw new Response(await _.text(),{status:_.status,headers:{"Content-Type":"text/html; charset=utf-8"}});let{access_token:U,expires_in:W,id_token:Pe,refresh_token:at}=await _.json(),ir=e.get(L)?.nonce,cr=await mo(Pe);if(ir!==cr)throw new F("Unauthorized",`Returned nonce does not match: ${ir} !== ${cr}`);let ur=U;r||(ur=await fo(U,t,f("TOKEN_EXCHANGE"),y,{...re(n)}));let Bo=e.get(L)?.redirectPath;return e.set(L,{accessToken:ur,expiresAt:new Date(new Date().getTime()+(W-120)*1e3).getTime()+"",refreshToken:at,idToken:Pe}),Oe(Bo||d)},setBuyer:Q,getBuyer:ae,UNSTABLE_setBuyer:A=>{K("[h2:warn:customerAccount] `customerAccount.UNSTABLE_setBuyer` is deprecated. Please use `customerAccount.setBuyer`."),Q(A);},UNSTABLE_getBuyer:()=>(K("[h2:warn:customerAccount] `customerAccount.UNSTABLE_getBuyer` is deprecated. Please use `customerAccount.getBuyer`."),ae())}}function Ua(e,t){return function(){try{if(!t)throw Error();new URL(e("CA_BASE_URL")),new URL(e("CA_BASE_AUTH_URL"));}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 o="Internal Server Error";throw new Response(o,{status:500})}}}function La(e){let t=Ao(e.contextLanguage??null);return Ao(e.uiLocalesOverride)??t??null}function Ao(e){if(e==null)return null;let o=Na(e).toLowerCase().replaceAll("_","-").split("-"),n=o.at(0)??null,a=o.at(1)??null;return a?`${n}-${a.toUpperCase()}`:n}var ka={PT:"PT_PT",ZH:"ZH_CN"};function Na(e){return ka[e]??e}function Va(e,t){let{env:r,request:o,cache:n,waitUntil:a,i18n:s,session:c,logErrors:i,storefront:u={},customerAccount:p,cart:d={},buyerIdentity:g}=e;c||console.warn("[h2:warn:createHydrogenContext] A session object is required to create hydrogen context."),p?.unstableB2b&&K("[h2:warn:createHydrogenContext] `customerAccount.unstableB2b` is now stable. Please remove the `unstableB2b` option.");let{storefront:m}=to({cache:n,waitUntil:a,i18n:s,logErrors:i,storefrontHeaders:u.headers||$a(o),storefrontApiVersion:u.apiVersion,storefrontId:r.PUBLIC_STOREFRONT_ID,storeDomain:r.PUBLIC_STORE_DOMAIN,privateStorefrontToken:r.PRIVATE_STOREFRONT_API_TOKEN,publicStorefrontToken:r.PUBLIC_STOREFRONT_API_TOKEN}),l=zt({session:c,request:o,waitUntil:a,logErrors:i,customerApiVersion:p?.apiVersion,authUrl:p?.authUrl,customAuthStatusHandler:p?.customAuthStatusHandler,language:s?.language,customerAccountId:r.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,shopId:r.SHOP_ID}),y=qt({getCartId:d.getId||Pt(o.headers),setCartId:d.setId||St(),cartQueryFragment:d.queryFragment,cartMutateFragment:d.mutateFragment,customMethods:d.customMethods,buyerIdentity:g,storefront:m,customerAccount:l}),h=new reactRouter.RouterContextProvider;h.set(Ht,m),h.set(Gt,y),h.set(Bt,l),h.set(Qt,r),h.set(Wt,c),a&&h.set(jt,a);let f={storefront:m,cart:y,customerAccount:l,env:r,session:c,waitUntil:a,...t||{}};return new Proxy(h,{get(C,v,b){if(v in C){let O=C[v];return typeof O=="function"?O.bind(C):O}return v in f?f[v]:Reflect.get(C,v,b)},has(C,v){return v in C||v in f},ownKeys(C){return [...Reflect.ownKeys(C),...Object.keys(f)]},getOwnPropertyDescriptor(C,v){if(v in C)return Reflect.getOwnPropertyDescriptor(C,v);if(v in f)return {enumerable:true,configurable:true,writable:false,value:f[v]}}})}function $a(e){return {requestGroupId:z(e,"request-id"),buyerIp:z(e,"oxygen-buyer-ip"),cookie:z(e,"cookie"),purpose:z(e,"purpose")}}var Po=react.createContext(void 0),So=Po.Provider,Jt=()=>react.useContext(Po);function Ba(e){let t=et(),r=Qa(t,e);return {nonce:t,header:r,NonceProvider:({children:n})=>react.createElement(So,{value:t},n)}}function Qa(e,t){let{shop:r,...o}=t??{},n=`'nonce-${e}'`,a=["'self'","'unsafe-inline'","https://cdn.shopify.com"],s=["'self'","https://cdn.shopify.com/","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},u=Object.assign({},i,o);for(let p in i){let d=o[p];p&&d&&(u[p]=Wa(d,i[p]));}return u.scriptSrc instanceof Array?u.scriptSrc=[...u.scriptSrc.filter(p=>!p.startsWith("'nonce")),n]:u.defaultSrc instanceof Array&&(u.defaultSrc=[...u.defaultSrc.filter(p=>!p.startsWith("'nonce")),n]),Ga__default.default({directives:u})}function Wa(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 za=react.forwardRef((e,t)=>{let{waitForHydration:r,src:o,...n}=e,a=Jt();return r?jsxRuntime.jsx(Ja,{src:o,options:n}):jsxRuntime.jsx("script",{suppressHydrationWarning:true,...n,src:o,nonce:a,ref:t})});function Ja({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}async function rs(e){return e;}function ns(e){let t=reactRouter.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 as({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 ps({connection:e,children:t=()=>(console.warn("<Pagination> requires children to work properly"),null),namespace:r=""}){let [o,n]=react.useState(false),a=reactRouter.useNavigation(),s=reactRouter.useLocation();reactRouter.useNavigate();react.useEffect(()=>{a.state==="idle"&&n(false);},[a.state]);let{endCursor:i,hasNextPage:u,hasPreviousPage:p,nextPageUrl:d,nodes:g,previousPageUrl:m,startCursor:l}=ds(e,r),y=react.useMemo(()=>({...s.state,pagination:{...s.state?.pagination||{},[r]:{pageInfo:{endCursor:i,hasPreviousPage:p,hasNextPage:u,startCursor:l},nodes:g}}}),[i,u,p,l,g,r,s.state]),h=react.useMemo(()=>react.forwardRef(function(C,v){return u?react.createElement(reactRouter.Link,{preventScrollReset:true,...C,to:d,state:y,replace:true,ref:v,onClick:()=>n(true)}):null}),[u,d,y]),f=react.useMemo(()=>react.forwardRef(function(C,v){return p?react.createElement(reactRouter.Link,{preventScrollReset:true,...C,to:m,state:y,replace:true,ref:v,onClick:()=>n(true)}):null}),[p,m,y]);return t({state:y,hasNextPage:u,hasPreviousPage:p,isLoading:o,nextPageUrl:d,nodes:g,previousPageUrl:m,NextLink:h,PreviousLink:f})}function ot(e,t){let r=new URLSearchParams(e);return Object.keys(t?.pagination||{}).forEach(n=>{let a=n===""?"":`${n}_`,s=`${a}cursor`,c=`${a}direction`;r.delete(s),r.delete(c);}),r.toString()}function Le(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 ds(e,t=""){e.pageInfo||Le("pageInfo"),typeof e.pageInfo.startCursor>"u"&&Le("pageInfo.startCursor"),typeof e.pageInfo.endCursor>"u"&&Le("pageInfo.endCursor"),typeof e.pageInfo.hasNextPage>"u"&&Le("pageInfo.hasNextPage"),typeof e.pageInfo.hasPreviousPage>"u"&&Le("pageInfo.hasPreviousPage");let r=reactRouter.useNavigation(),o=reactRouter.useNavigate(),{state:n,search:a,pathname:s}=reactRouter.useLocation(),c=t?`${t}_cursor`:"cursor",i=t?`${t}_direction`:"direction",d=new URLSearchParams(a).get(i)==="previous",g=react.useMemo(()=>!globalThis?.window?.__hydrogenHydrated||!n?.pagination?.[t]?.nodes?hydrogenReact.flattenConnection(e):d?[...hydrogenReact.flattenConnection(e),...n.pagination[t].nodes||[]]:[...n.pagination[t].nodes||[],...hydrogenReact.flattenConnection(e)],[n,e,t]),m=react.useMemo(()=>{let f=globalThis?.window?.__hydrogenHydrated,P=n?.pagination?.[t]?.pageInfo,C=!f||P?.startCursor===void 0?e.pageInfo.startCursor:P.startCursor,v=!f||P?.endCursor===void 0?e.pageInfo.endCursor:P.endCursor,b=!f||P?.hasPreviousPage===void 0?e.pageInfo.hasPreviousPage:P.hasPreviousPage,O=!f||P?.hasNextPage===void 0?e.pageInfo.hasNextPage:P.hasNextPage;return n?.pagination?.[t]?.nodes&&(d?(C=e.pageInfo.startCursor,b=e.pageInfo.hasPreviousPage):(v=e.pageInfo.endCursor,O=e.pageInfo.hasNextPage)),{startCursor:C,endCursor:v,hasPreviousPage:b,hasNextPage:O}},[d,n,t,e.pageInfo.hasNextPage,e.pageInfo.hasPreviousPage,e.pageInfo.startCursor,e.pageInfo.endCursor]),l=react.useRef({params:ot(a,n),pathname:s});react.useEffect(()=>{window.__hydrogenHydrated=true;},[]),react.useEffect(()=>{let f=ot(a,n),P=l.current.params;(s!==l.current.pathname||f!==P)&&!(r.state==="idle"&&!r.location)&&(l.current={pathname:s,params:ot(a,n)},o(`${s}?${ot(a,n)}`,{replace:true,preventScrollReset:true,state:{nodes:void 0,pageInfo:void 0}}));},[s,a,n]);let y=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(i,"previous"),m.startCursor&&f.set(c,m.startCursor),`?${f.toString()}`},[a,m.startCursor]),h=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(i,"next"),m.endCursor&&f.set(c,m.endCursor),`?${f.toString()}`},[a,m.endCursor]);return {...m,previousPageUrl:y,nextPageUrl:h,nodes:g}}function ls(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,namespace:o=""}=t,n=new URLSearchParams(new URL(e.url).search),a=o?`${o}_cursor`:"cursor",s=o?`${o}_direction`:"direction",c=n.get(a)??void 0;return (n.get(s)==="previous"?"previous":"next")==="previous"?{last:r,startCursor:c??null}:{first:r,endCursor:c??null}}function gs(e,t){let r=reactRouter.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}));});},[JSON.stringify(t)]),r.state==="loading"){let a=new URLSearchParams(r.location.search),s=false,c=o.find(i=>i.selectedOptions?i.selectedOptions.every(u=>a.get(u.name)===u.value):(s||(s=true,reportError(new Error("[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field."))),false));if(c)return {...c,isOptimistic:true}}return e}function vs({handle:e,options:t=[],variants:r=[],productPath:o="products",waitForNavigation:n=false,selectedVariant:a,children:s}){let c=t;c[0]?.values&&(K("[h2:warn:VariantSelector] product.options.values is deprecated. Use product.options.optionValues instead."),c[0]&&!c[0].optionValues&&(c=t.map(l=>({...l,optionValues:l.values?.map(y=>({name:y}))||[]}))));let i=r instanceof Array?r:hydrogenReact.flattenConnection(r),{searchParams:u,path:p,alreadyOnProductPage:d}=Is(e,o,n),g=c.filter(l=>l?.optionValues?.length===1),m=a?a?.selectedOptions?.reduce((l,y)=>(l[y.name]=y.value,l),{}):{};return react.createElement(react.Fragment,null,...react.useMemo(()=>c.map(l=>{let y,h=[];for(let f of l.optionValues){let P=new URLSearchParams(d?u:void 0);P.set(l.name,f.name),g.forEach(w=>{w.optionValues[0].name&&P.set(w.name,w.optionValues[0].name);});let C=i.find(w=>w?.selectedOptions?.every(G=>(P.get(G?.name)||m?.[G?.name])===G?.value)),v=u.get(l.name);!v&&a&&(v=m?.[l.name]||null);let b=v?v===f.name:false;b&&(y=f.name);let O="?"+P.toString();h.push({value:f.name,optionValue:f,isAvailable:C?C.availableForSale:true,to:p+O,search:O,isActive:b,variant:C});}return s({option:{name:l.name,value:y,values:h}})}),[c,i,s]))}var Rs=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 Is(e,t,r){let{pathname:o,search:n}=reactRouter.useLocation(),a=reactRouter.useNavigation();return react.useMemo(()=>{let s=/(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(o),c=s&&s.length>0;t=t.startsWith("/")?t.substring(1):t;let i=c?`${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 Ts(){return {name:"hydrogen-2025.7.0",reactRouterConfig:()=>({appDirectory:"app",buildDirectory:"dist",ssr:true,future:{v8_middleware:true,unstable_optimizeDeps:true,unstable_splitRouteModules:true,unstable_subResourceIntegrity:false,unstable_viteEnvironmentApi:false}}),reactRouterConfigResolved:({reactRouterConfig:e})=>{if(e.basename&&e.basename!=="/")throw new Error(`[Hydrogen Preset] basename is not supported in Hydrogen 2025.7.0.
|
|
507
|
+
${b}
|
|
508
|
+
${x}
|
|
509
|
+
`;function rr(e){let{getCartId:t,setCartId:r,storefront:o,customerAccount:n,cartQueryFragment:a,cartMutateFragment:s,buyerIdentity:c}=e,i=t(),u=()=>i||t(),p={storefront:o,getCartId:u,cartFragment:s,customerAccount:n},y=Gt(p),g=async function(...d){d[0].buyerIdentity={...c,...d[0].buyerIdentity};let l=await y(...d);return i=l?.cart?.id,l},m={get:$t({storefront:o,customerAccount:n,getCartId:u,cartFragment:a}),getCartId:u,setCartId:r,create:g,addLines:async(d,l)=>{let S=d.map(f=>({attributes:f.attributes,quantity:f.quantity,merchandiseId:f.merchandiseId,sellingPlanId:f.sellingPlanId}));return i||l?.cartId?await Bt(p)(S,l):await g({lines:S,buyerIdentity:c},l)},updateLines:Qt(p),removeLines:Wt(p),updateDiscountCodes:async(d,l)=>i||l?.cartId?await jt(p)(d,l):await g({discountCodes:d},l),updateGiftCardCodes:async(d,l)=>i||l?.cartId?await er(p)(d,l):await g({giftCardCodes:d},l),removeGiftCardCodes:tr(p),updateBuyerIdentity:async(d,l)=>i||l?.cartId?await Kt(p)(d,l):await g({buyerIdentity:d},l),updateNote:async(d,l)=>i||l?.cartId?await Yt(p)(d,l):await g({note:d},l),updateSelectedDeliveryOption:zt(p),updateAttributes:async(d,l)=>i||l?.cartId?await Jt(p)(d,l):await g({attributes:d},l),setMetafields:async(d,l)=>i||l?.cartId?await Xt(p)(d,l):await g({metafields:d},l),deleteMetafield:Zt(p),addDeliveryAddresses:go(p),removeDeliveryAddresses:ho(p),updateDeliveryAddresses:Co(p)};return "customMethods"in e?{...m,...e.customMethods??{}}:m}function Na(e){let t=reactRouter.useFetchers();if(!t||!t.length)return e;let r=e?.lines?structuredClone(e):{lines:{nodes:[]}},o=r.lines.nodes,n=false;for(let{formData:a}of t){if(!a)continue;let s=J.getFormInput(a);if(s.action===J.ACTIONS.LinesAdd)for(let c of s.inputs.lines){if(!c.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(u=>u.merchandise.id===c.selectedVariant?.id);n=true,i?(i.quantity=(i.quantity||1)+(c.quantity||1),i.isOptimistic=true):o.unshift({id:mo(c.selectedVariant.id),merchandise:c.selectedVariant,isOptimistic:true,quantity:c.quantity||1});}else if(s.action===J.ACTIONS.LinesRemove)for(let c of s.inputs.lineIds){let i=o.findIndex(u=>u.id===c);if(i!==-1){if(ut(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=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to remove line '${c}' but it doesn't exist in the cart`);}else if(s.action===J.ACTIONS.LinesUpdate)for(let c of s.inputs.lines){let i=o.findIndex(u=>c.id===u.id);if(i>-1){if(ut(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=c.quantity,o[i].quantity===0&&o.splice(i,1),n=true;}else console.warn(`[h2:warn:useOptimisticCart] Tried to update line '${c.id}' but it doesn't exist in the cart`);}}return n&&(r.isOptimistic=n),r.totalQuantity=o.reduce((a,s)=>a+s.quantity,0),r}var Ma="https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json";async function Va({request:e,changelogUrl:t}){new URL(e.url).searchParams;return fetch(t||Ma)}var ke=reactRouter.createContext(),or=reactRouter.createContext(),nr=reactRouter.createContext(),ar=reactRouter.createContext(),sr=reactRouter.createContext(),ir=reactRouter.createContext(),Ha={storefront:ke,cart:or,customerAccount:nr,env:ar,session:sr,waitUntil:ir};var dt="2025-07",Ce=`Shopify Hydrogen ${Ue}`,Ao="30243aa5-17c1-465a-8493-944bcc4e88aa",U="customerAccount",Ae="buyer";var q=class extends Response{constructor(t,r,o){super(`Bad request: ${t}`,{status:400,headers:o});}};function Me(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 Fa({session:e,customerAccountId:t,customerAccountTokenExchangeUrl:r,httpsOrigin:o,debugInfo:n}){let a=new URLSearchParams,s=e.get(U),c=s?.refreshToken,i=s?.idToken;if(!c)throw new q("Unauthorized","No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.");a.append("grant_type","refresh_token"),a.append("refresh_token",c),a.append("client_id",t);let u={"content-type":"application/x-www-form-urlencoded","User-Agent":Ce,Origin:o};new Date().getTime();let y=r,g=await fetch(y,{method:"POST",headers:u,body:a});if(!g.ok){let S=await g.text();throw new Response(S,{status:g.status,headers:{"Content-Type":"text/html; charset=utf-8"}})}let{access_token:m,expires_in:d,refresh_token:l}=await g.json();if(!m||m.length===0)throw new q("Unauthorized","Invalid access token received.");e.set(U,{accessToken:m,expiresAt:new Date(new Date().getTime()+(d-120)*1e3).getTime()+"",refreshToken:l,idToken:i});}function Se(e){e.unset(U),e.unset(Ae);}async function So({locks:e,expiresAt:t,session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s}){if(parseInt(t,10)-1e3<new Date().getTime())try{e.refresh||(e.refresh=Fa({session:r,customerAccountId:o,customerAccountTokenExchangeUrl:n,httpsOrigin:a,debugInfo:s})),await e.refresh,delete e.refresh;}catch(c){throw Se(r),c&&c.status!==401?c:new q("Unauthorized","Login before querying the Customer Account API.")}}function Po(){let e=qa();return Ro(e)}async function vo(e){let t=await crypto.subtle.digest({name:"SHA-256"},new TextEncoder().encode(e)),r=$a(t);return Ro(r)}function qa(){let e=new Uint8Array(32);return crypto.getRandomValues(e),String.fromCharCode.apply(null,Array.from(e))}function Ro(e){return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function $a(e){let t=new Uint8Array(e),r=Array.from(t);return String.fromCharCode(...r)}function To(){let e=Date.now().toString(),t=Math.random().toString(36).substring(2);return e+t}async function Io(e,t,r,o,n){let a=t;if(!e)throw new q("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",Ao),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 c={"content-type":"application/x-www-form-urlencoded","User-Agent":Ce,Origin:o};new Date().getTime();let u=r,p=await fetch(u,{method:"POST",headers:c,body:s});let y=await p.json();if(y.error)throw new q(y.error_description);return y.access_token}function Eo(e){return Ga(e).payload.nonce}function Ga(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 lt(){return Qa(Ba())}function Ba(){try{return crypto.getRandomValues(new Uint8Array(16))}catch{return new Uint8Array(16).map(()=>Math.random()*255|0)}}function Qa(e){return Array.from(e,function(t){return ("0"+(t&255).toString(16)).slice(-2)}).join("")}function yt(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(wo(e,a))return a;console.warn(`Cross-domain redirects are not supported. Tried to redirect from ${o} to ${a}`);}}function wo(e,t){try{return new URL(e).origin===new URL(t,e).origin}catch{return false}}function cr({requestUrl:e,defaultUrl:t,redirectUrl:r}){let o=e,n=bo(e,t),a=r?bo(e,r):n;return wo(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 bo(e,t){return Wa(t)?new URL(t):new URL(t,new URL(e).origin)}function Wa(e){try{return new URL(e),!0}catch{return false}}function xo(e,t){let r=`https://shopify.com/${t}`,o=`https://shopify.com/authentication/${t}`;return function(a){switch(a){case "CA_BASE_URL":return r;case "CA_BASE_AUTH_URL":return o;case "GRAPHQL":return `${r}/account/customer/api/${e}/graphql`;case "AUTH":return `${o}/oauth/authorize`;case "LOGIN_SCOPE":return t?"openid email customer-account-api:full":"openid email https://api.customers.com/auth/customer.graphql";case "TOKEN_EXCHANGE":return `${o}/oauth/token`;case "LOGOUT":return `${o}/logout`}}}function ja(e,t){if(!e.url)return t;let{pathname:r}=new URL(e.url),o=r.replace(/\.data$/,"").replace(/\/_root$/,"/").replace(/(.+)\/$/,"$1"),n=t+`?${new URLSearchParams({return_to:o}).toString()}`;return Me(n)}function ur({session:e,customerAccountId:t,shopId:r,customerApiVersion:o=dt,request:n,waitUntil:a,authUrl:s,customAuthStatusHandler:c,logErrors:i=true,loginPath:u="/account/login",authorizePath:p="/account/authorize",defaultRedirectPath:y="/account",language:g}){if(o!==dt&&console.warn(`[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${o} when this version of Hydrogen was built for ${dt}.`),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 m=c||(()=>ja(n,u)),d=new URL(n.url),l=d.protocol==="http:"?d.origin.replace("http","https"):d.origin,S=cr({requestUrl:l,defaultUrl:p,redirectUrl:s}),f=xo(o,r),P=Ka(f,t),C=f("GRAPHQL"),A={};async function h({query:v,type:I,variables:O={}}){let D=await N();if(!D)throw m();new Date().getTime();let V=await fetch(C,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":Ce,Origin:l,Authorization:D},body:JSON.stringify({query:v,variables:O})});let ee=await V.text(),K={url:C,response:V,type:I,query:v,queryVariables:O,errors:void 0,client:"customer"};if(!V.ok){if(V.status===401)throw Se(e),m();let _;try{_=z(ee);}catch{_=[{message:ee}];}Le({...K,errors:_});}try{let _=z(ee),{errors:Q}=_,Pe=Q?.map(({message:G,...ve})=>new pe(G,{...ve,clientOperation:`customerAccount.${K.type}`,requestId:V.headers.get("x-request-id"),queryVariables:O,query:v}));return {..._,...Q&&{errors:Pe}}}catch{Le({...K,errors:[{message:ee}]});}}async function R(){if(!r)return false;let v=e.get(U),I=v?.accessToken,O=v?.expiresAt;if(!I||!O)return false;let D=j?.();try{await So({locks:A,expiresAt:O,session:e,customerAccountId:t,customerAccountTokenExchangeUrl:f("TOKEN_EXCHANGE"),httpsOrigin:l,debugInfo:{waitUntil:a,stackInfo:D,...ne(n)}});}catch{return false}return true}async function T(){if(!await R())throw m()}async function N(){if(await R())return e.get(U)?.accessToken}async function k(v,I){return P(),v=ge(v),ct(v,"customer.mutate"),fe(h({query:v,type:"mutation",...I}),{logErrors:i})}async function ie(v,I){return P(),v=ge(v),it(v,"customer.query"),fe(h({query:v,type:"query",...I}),{logErrors:i})}function Ge(v){e.set(Ae,{...e.get(Ae),...v});}async function Be(){let v=await N();if(v)return {...e.get(Ae),customerAccessToken:v}}return {i18n:{language:g??"EN"},login:async v=>{P();let I=new URL(f("AUTH")),O=To(),D=lt();I.searchParams.set("client_id",t),I.searchParams.set("scope","openid email"),I.searchParams.append("response_type","code"),I.searchParams.append("redirect_uri",S),I.searchParams.set("scope",f("LOGIN_SCOPE")),I.searchParams.append("state",O),I.searchParams.append("nonce",D);let M=Ya({contextLanguage:g??null,uiLocalesOverride:v?.uiLocales??null});M!=null&&I.searchParams.append("ui_locales",M),v?.countryCode&&I.searchParams.append("region_country",v.countryCode),v?.acrValues&&I.searchParams.append("acr_values",v.acrValues),v?.loginHint&&I.searchParams.append("login_hint",v.loginHint);let $=Po(),V=await vo($);return e.set(U,{...e.get(U),codeVerifier:$,state:O,nonce:D,redirectPath:yt(n.url)||W(n,"Referer")||y}),I.searchParams.append("code_challenge",V),I.searchParams.append("code_challenge_method","S256"),Me(I.toString())},logout:async v=>{P();let I=e.get(U)?.idToken,O=cr({requestUrl:l,defaultUrl:l,redirectUrl:v?.postLogoutRedirectUri}),D=I?new URL(`${f("LOGOUT")}?${new URLSearchParams([["id_token_hint",I],["post_logout_redirect_uri",O]]).toString()}`).toString():O;Se(e);let M=v?.headers instanceof Headers?v?.headers:new Headers(v?.headers);return v?.keepSession||(e.destroy?M.set("Set-Cookie",await e.destroy()):console.warn("[h2:warn:customerAccount] session.destroy is not available on your session implementation. All session data might not be cleared on logout."),e.isPending=false),Me(D,{headers:M})},isLoggedIn:R,handleAuthStatus:T,getAccessToken:N,getApiUrl:()=>C,mutate:k,query:ie,authorize:async()=>{P();let v=d.searchParams.get("code"),I=d.searchParams.get("state");if(!v||!I)throw Se(e),new q("Unauthorized","No code or state parameter found in the redirect URL.");if(e.get(U)?.state!==I)throw Se(e),new q("Unauthorized","The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");let O=t,D=new URLSearchParams;D.append("grant_type","authorization_code"),D.append("client_id",O),D.append("redirect_uri",S),D.append("code",v);let M=e.get(U)?.codeVerifier;if(!M)throw new q("Unauthorized","No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.");D.append("code_verifier",M);let $={"content-type":"application/x-www-form-urlencoded","User-Agent":Ce,Origin:l};new Date().getTime();let K=f("TOKEN_EXCHANGE"),_=await fetch(K,{method:"POST",headers:$,body:D});if(!_.ok)throw new Response(await _.text(),{status:_.status,headers:{"Content-Type":"text/html; charset=utf-8"}});let{access_token:Q,expires_in:Pe,id_token:G,refresh_token:ve}=await _.json(),H=e.get(U)?.nonce,te=await Eo(G);if(H!==te)throw new q("Unauthorized",`Returned nonce does not match: ${H} !== ${te}`);let gt=Q;r||(gt=await Io(Q,t,f("TOKEN_EXCHANGE"),l,{...ne(n)}));let tn=e.get(U)?.redirectPath;return e.set(U,{accessToken:gt,expiresAt:new Date(new Date().getTime()+(Pe-120)*1e3).getTime()+"",refreshToken:ve,idToken:G}),Me(tn||y)},setBuyer:Ge,getBuyer:Be,UNSTABLE_setBuyer:v=>{B("[h2:warn:customerAccount] `customerAccount.UNSTABLE_setBuyer` is deprecated. Please use `customerAccount.setBuyer`."),Ge(v);},UNSTABLE_getBuyer:()=>(B("[h2:warn:customerAccount] `customerAccount.UNSTABLE_getBuyer` is deprecated. Please use `customerAccount.getBuyer`."),Be())}}function Ka(e,t){return function(){try{if(!t)throw Error();new URL(e("CA_BASE_URL")),new URL(e("CA_BASE_AUTH_URL"));}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 o="Internal Server Error";throw new Response(o,{status:500})}}}function Ya(e){let t=Oo(e.contextLanguage??null);return Oo(e.uiLocalesOverride)??t??null}function Oo(e){if(e==null)return null;let o=Ja(e).toLowerCase().replaceAll("_","-").split("-"),n=o.at(0)??null,a=o.at(1)??null;return a?`${n}-${a.toUpperCase()}`:n}var za={PT:"PT_PT",ZH:"ZH_CN"};function Ja(e){return za[e]??e}function Za(e,t){let{env:r,request:o,cache:n,waitUntil:a,i18n:s,session:c,logErrors:i,storefront:u={},customerAccount:p,cart:y={},buyerIdentity:g}=e;c||console.warn("[h2:warn:createHydrogenContext] A session object is required to create hydrogen context."),p?.unstableB2b&&B("[h2:warn:createHydrogenContext] `customerAccount.unstableB2b` is now stable. Please remove the `unstableB2b` option.");let{storefront:m}=yo({cache:n,waitUntil:a,i18n:s,logErrors:i,storefrontHeaders:u.headers||Zr(o),storefrontApiVersion:u.apiVersion,storefrontId:r.PUBLIC_STOREFRONT_ID,storeDomain:r.PUBLIC_STORE_DOMAIN,privateStorefrontToken:r.PRIVATE_STOREFRONT_API_TOKEN,publicStorefrontToken:r.PUBLIC_STOREFRONT_API_TOKEN}),d=ur({session:c,request:o,waitUntil:a,logErrors:i,customerApiVersion:p?.apiVersion,authUrl:p?.authUrl,customAuthStatusHandler:p?.customAuthStatusHandler,language:s?.language,customerAccountId:r.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,shopId:r.SHOP_ID}),l=rr({getCartId:y.getId||Ft(o.headers),setCartId:y.setId||qt(),cartQueryFragment:y.queryFragment,cartMutateFragment:y.mutateFragment,customMethods:y.customMethods,buyerIdentity:g,storefront:m,customerAccount:d}),S=new reactRouter.RouterContextProvider;S.set(ke,m),S.set(or,l),S.set(nr,d),S.set(ar,r),S.set(sr,c),a&&S.set(ir,a);let f={storefront:m,cart:l,customerAccount:d,env:r,session:c,waitUntil:a,...t||{}};return new Proxy(S,{get(C,A,h){if(A in C){let R=C[A];return typeof R=="function"?R.bind(C):R}return A in f?f[A]:Reflect.get(C,A,h)},has(C,A){return A in C||A in f},ownKeys(C){return [...Reflect.ownKeys(C),...Object.keys(f)]},getOwnPropertyDescriptor(C,A){if(A in C)return Reflect.getOwnPropertyDescriptor(C,A);if(A in f)return {enumerable:true,configurable:true,writable:false,value:f[A]}}})}function ts({build:e,mode:t,poweredByHeader:r=true,getLoadContext:o,collectTrackingInformation:n=true,proxyStandardRoutes:a=true}){let s=reactRouter.createRequestHandler(e,t),c=r?i=>i.headers.append("powered-by","Shopify, Hydrogen"):void 0;return async i=>{let u=i.method;if((u==="GET"||u==="HEAD")&&i.body)return new Response(`${u} requests cannot have a body`,{status:400});let p=new URL(i.url);if(p.pathname.includes("//"))return new Response(null,{status:301,headers:{location:p.pathname.replace(/\/+/g,"/")}});let y=await o?.(i),g=y?.storefront||y?.get?.(ke);if(a&&(g||B("[h2:createRequestHandler] Storefront instance is required to proxy standard routes."),g?.isStorefrontApiUrl(i))){let d=await g.forward(i);return c?.(d),d}let m=await s(i,y);if(g&&a){n&&g.setCollectedSubrequestHeaders(m);let d=i.headers.get("sec-fetch-dest");(d&&d==="document"||i.headers.get("accept")?.includes("text/html"))&&Te(m,{[je]:"1"});}return c?.(m),m}}var Do=react.createContext(void 0),_o=Do.Provider,pr=()=>react.useContext(Do);function ss(e){let t=lt(),r=is(t,e);return {nonce:t,header:r,NonceProvider:({children:n})=>react.createElement(_o,{value:t},n)}}function is(e,t){let{shop:r,...o}=t??{},n=`'nonce-${e}'`,a=["'self'","'unsafe-inline'","https://cdn.shopify.com"],s=["'self'","https://cdn.shopify.com/","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},u=Object.assign({},i,o);for(let p in i){let y=o[p];p&&y&&(u[p]=cs(y,i[p]));}return u.scriptSrc instanceof Array?u.scriptSrc=[...u.scriptSrc.filter(p=>!p.startsWith("'nonce")),n]:u.defaultSrc instanceof Array&&(u.defaultSrc=[...u.defaultSrc.filter(p=>!p.startsWith("'nonce")),n]),as__default.default({directives:u})}function cs(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 ds=react.forwardRef((e,t)=>{let{waitForHydration:r,src:o,...n}=e,a=pr();return r?jsxRuntime.jsx(ls,{src:o,options:n}):jsxRuntime.jsx("script",{suppressHydrationWarning:true,...n,src:o,nonce:a,ref:t})});function ls({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}async function fs(e){return e;}function gs(e){let t=reactRouter.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 hs({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 vs({connection:e,children:t=()=>(console.warn("<Pagination> requires children to work properly"),null),namespace:r=""}){let [o,n]=react.useState(false),a=reactRouter.useNavigation(),s=reactRouter.useLocation();reactRouter.useNavigate();react.useEffect(()=>{a.state==="idle"&&n(false);},[a.state]);let{endCursor:i,hasNextPage:u,hasPreviousPage:p,nextPageUrl:y,nodes:g,previousPageUrl:m,startCursor:d}=Rs(e,r),l=react.useMemo(()=>({...s.state,pagination:{...s.state?.pagination||{},[r]:{pageInfo:{endCursor:i,hasPreviousPage:p,hasNextPage:u,startCursor:d},nodes:g}}}),[i,u,p,d,g,r,s.state]),S=react.useMemo(()=>react.forwardRef(function(C,A){return u?react.createElement(reactRouter.Link,{preventScrollReset:true,...C,to:y,state:l,replace:true,ref:A,onClick:()=>n(true)}):null}),[u,y,l]),f=react.useMemo(()=>react.forwardRef(function(C,A){return p?react.createElement(reactRouter.Link,{preventScrollReset:true,...C,to:m,state:l,replace:true,ref:A,onClick:()=>n(true)}):null}),[p,m,l]);return t({state:l,hasNextPage:u,hasPreviousPage:p,isLoading:o,nextPageUrl:y,nodes:g,previousPageUrl:m,NextLink:S,PreviousLink:f})}function ft(e,t){let r=new URLSearchParams(e);return Object.keys(t?.pagination||{}).forEach(n=>{let a=n===""?"":`${n}_`,s=`${a}cursor`,c=`${a}direction`;r.delete(s),r.delete(c);}),r.toString()}function qe(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 Rs(e,t=""){e.pageInfo||qe("pageInfo"),typeof e.pageInfo.startCursor>"u"&&qe("pageInfo.startCursor"),typeof e.pageInfo.endCursor>"u"&&qe("pageInfo.endCursor"),typeof e.pageInfo.hasNextPage>"u"&&qe("pageInfo.hasNextPage"),typeof e.pageInfo.hasPreviousPage>"u"&&qe("pageInfo.hasPreviousPage");let r=reactRouter.useNavigation(),o=reactRouter.useNavigate(),{state:n,search:a,pathname:s}=reactRouter.useLocation(),c=t?`${t}_cursor`:"cursor",i=t?`${t}_direction`:"direction",y=new URLSearchParams(a).get(i)==="previous",g=react.useMemo(()=>!globalThis?.window?.__hydrogenHydrated||!n?.pagination?.[t]?.nodes?hydrogenReact.flattenConnection(e):y?[...hydrogenReact.flattenConnection(e),...n.pagination[t].nodes||[]]:[...n.pagination[t].nodes||[],...hydrogenReact.flattenConnection(e)],[n,e,t]),m=react.useMemo(()=>{let f=globalThis?.window?.__hydrogenHydrated,P=n?.pagination?.[t]?.pageInfo,C=!f||P?.startCursor===void 0?e.pageInfo.startCursor:P.startCursor,A=!f||P?.endCursor===void 0?e.pageInfo.endCursor:P.endCursor,h=!f||P?.hasPreviousPage===void 0?e.pageInfo.hasPreviousPage:P.hasPreviousPage,R=!f||P?.hasNextPage===void 0?e.pageInfo.hasNextPage:P.hasNextPage;return n?.pagination?.[t]?.nodes&&(y?(C=e.pageInfo.startCursor,h=e.pageInfo.hasPreviousPage):(A=e.pageInfo.endCursor,R=e.pageInfo.hasNextPage)),{startCursor:C,endCursor:A,hasPreviousPage:h,hasNextPage:R}},[y,n,t,e.pageInfo.hasNextPage,e.pageInfo.hasPreviousPage,e.pageInfo.startCursor,e.pageInfo.endCursor]),d=react.useRef({params:ft(a,n),pathname:s});react.useEffect(()=>{window.__hydrogenHydrated=true;},[]),react.useEffect(()=>{let f=ft(a,n),P=d.current.params;(s!==d.current.pathname||f!==P)&&!(r.state==="idle"&&!r.location)&&(d.current={pathname:s,params:ft(a,n)},o(`${s}?${ft(a,n)}`,{replace:true,preventScrollReset:true,state:{nodes:void 0,pageInfo:void 0}}));},[s,a,n]);let l=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(i,"previous"),m.startCursor&&f.set(c,m.startCursor),`?${f.toString()}`},[a,m.startCursor]),S=react.useMemo(()=>{let f=new URLSearchParams(a);return f.set(i,"next"),m.endCursor&&f.set(c,m.endCursor),`?${f.toString()}`},[a,m.endCursor]);return {...m,previousPageUrl:l,nextPageUrl:S,nodes:g}}function Ts(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,namespace:o=""}=t,n=new URLSearchParams(new URL(e.url).search),a=o?`${o}_cursor`:"cursor",s=o?`${o}_direction`:"direction",c=n.get(a)??void 0;return (n.get(s)==="previous"?"previous":"next")==="previous"?{last:r,startCursor:c??null}:{first:r,endCursor:c??null}}function ws(e,t){let r=reactRouter.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}));});},[JSON.stringify(t)]),r.state==="loading"){let a=new URLSearchParams(r.location.search),s=false,c=o.find(i=>i.selectedOptions?i.selectedOptions.every(u=>a.get(u.name)===u.value):(s||(s=true,reportError(new Error("[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field."))),false));if(c)return {...c,isOptimistic:true}}return e}function Ls({handle:e,options:t=[],variants:r=[],productPath:o="products",waitForNavigation:n=false,selectedVariant:a,children:s}){let c=t;c[0]?.values&&(B("[h2:warn:VariantSelector] product.options.values is deprecated. Use product.options.optionValues instead."),c[0]&&!c[0].optionValues&&(c=t.map(d=>({...d,optionValues:d.values?.map(l=>({name:l}))||[]}))));let i=r instanceof Array?r:hydrogenReact.flattenConnection(r),{searchParams:u,path:p,alreadyOnProductPage:y}=Ns(e,o,n),g=c.filter(d=>d?.optionValues?.length===1),m=a?a?.selectedOptions?.reduce((d,l)=>(d[l.name]=l.value,d),{}):{};return react.createElement(react.Fragment,null,...react.useMemo(()=>c.map(d=>{let l,S=[];for(let f of d.optionValues){let P=new URLSearchParams(y?u:void 0);P.set(d.name,f.name),g.forEach(T=>{T.optionValues[0].name&&P.set(T.name,T.optionValues[0].name);});let C=i.find(T=>T?.selectedOptions?.every(N=>(P.get(N?.name)||m?.[N?.name])===N?.value)),A=u.get(d.name);!A&&a&&(A=m?.[d.name]||null);let h=A?A===f.name:false;h&&(l=f.name);let R="?"+P.toString();S.push({value:f.name,optionValue:f,isAvailable:C?C.availableForSale:true,to:p+R,search:R,isActive:h,variant:C});}return s({option:{name:d.name,value:l,values:S}})}),[c,i,s]))}var ks=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 Ns(e,t,r){let{pathname:o,search:n}=reactRouter.useLocation(),a=reactRouter.useNavigation();return react.useMemo(()=>{let s=/(\/[a-zA-Z]{2}-[a-zA-Z]{2}\/)/g.exec(o),c=s&&s.length>0;t=t.startsWith("/")?t.substring(1):t;let i=c?`${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 Ms(){return {name:"hydrogen-2025.7.0",reactRouterConfig:()=>({appDirectory:"app",buildDirectory:"dist",ssr:true,future:{v8_middleware:true,v8_splitRouteModules:true,v8_viteEnvironmentApi:false,unstable_optimizeDeps:true,unstable_subResourceIntegrity:false}}),reactRouterConfigResolved:({reactRouterConfig:e})=>{if(e.basename&&e.basename!=="/")throw new Error(`[Hydrogen Preset] basename is not supported in Hydrogen 2025.7.0.
|
|
510
510
|
Reason: Requires major CLI infrastructure modernization.
|
|
511
511
|
Workaround: Use reverse proxy or CDN path rewriting for subdirectory hosting.`);if(e.prerender)throw new Error(`[Hydrogen Preset] prerender is not supported in Hydrogen 2025.7.0.
|
|
512
512
|
Reason: React Router plugin incompatibility with Hydrogen CLI build pipeline.
|
|
513
513
|
Workaround: Use external static generation tools or server-side caching.`);if(e.serverBundles)throw new Error(`[Hydrogen Preset] serverBundles is not supported in Hydrogen 2025.7.0.
|
|
514
514
|
Reason: React Router plugin manifest incompatibility with Hydrogen CLI.
|
|
515
|
-
Alternative: Route-level code splitting via
|
|
515
|
+
Alternative: Route-level code splitting via v8_splitRouteModules is enabled.`);if(e.buildEnd)throw new Error(`[Hydrogen Preset] buildEnd is not supported in Hydrogen 2025.7.0.
|
|
516
516
|
Reason: Hydrogen CLI bypasses React Router buildEnd hook execution.
|
|
517
517
|
Workaround: Use external build scripts or package.json post-build hooks.`);if(e.future?.unstable_subResourceIntegrity===true)throw new Error(`[Hydrogen Preset] unstable_subResourceIntegrity cannot be enabled.
|
|
518
518
|
Reason: Conflicts with Hydrogen CSP nonce-based authentication.
|
|
519
|
-
Impact: Would break Content Security Policy and cause script execution failures.`)}}}var
|
|
519
|
+
Impact: Would break Content Security Policy and cause script execution failures.`)}}}var Fs=function(e){return jsxRuntime.jsx(hydrogenReact.RichText,{...e,components:{link:({node:t})=>jsxRuntime.jsx(reactRouter.Link,{to:t.url,title:t.title,target:t.target,prefetch:"intent",children:t.children}),...e.components}})};var qs=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 u="X-Shopify-Storefront-Access-Token";s.storefront={name:"Storefront API",authHeader:u,accessToken:o.getPublicTokenHeaders()[u],apiUrl:o.getApiUrl(),icon:"SF"};}if(n){let u=await(await fetch(a.origin+"/graphiql/customer-account.schema.json")).json(),p=await n.getAccessToken();u&&(s["customer-account"]={name:"Customer Account API",value:u,authHeader:"Authorization",accessToken:p,apiUrl:n.getApiUrl(),icon:"CA"});}let c="https://avatars.githubusercontent.com/u/12972006?s=48&v=4",i=String.raw;return new Response(i`
|
|
520
520
|
<!DOCTYPE html>
|
|
521
521
|
<html lang="en">
|
|
522
522
|
<head>
|
|
@@ -835,7 +835,7 @@ Impact: Would break Content Security Policy and cause script execution failures.
|
|
|
835
835
|
</div>
|
|
836
836
|
</body>
|
|
837
837
|
</html>
|
|
838
|
-
`,{status:200,headers:{"content-type":"text/html"}})};async function
|
|
838
|
+
`,{status:200,headers:{"content-type":"text/html"}})};async function $s(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:c,searchParams:i}=s,u=i.has("_data");i.delete("redirect"),i.delete("return_to"),i.delete("_data");let p=(n?s.toString().replace(s.origin,""):c).toLowerCase();if(s.pathname==="/admin"&&!o)return fr(`${t.getShopifyDomain()}/admin`,u,i,n);try{let{urlRedirects:y}=await t.query(Gs,{variables:{query:"path:"+p.replace(/\/+$/,"")}}),g=y?.edges?.[0]?.node?.target;if(g)return fr(g,u,i,n);let m=yt(r.url);if(m)return fr(m,u,i,n)}catch(y){console.error(`Failed to fetch redirects from Storefront API for route ${p}`,y);}return a}var yr="https://example.com";function fr(e,t,r,o){let n=new URL(e,yr);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(yr,""),"X-Remix-Status":"301"}}):new Response(null,{status:301,headers:{location:n.toString().replace(yr,"")}})}var Gs=`#graphql
|
|
839
839
|
query redirects($query: String) {
|
|
840
840
|
urlRedirects(first: 1, query: $query) {
|
|
841
841
|
edges {
|
|
@@ -845,24 +845,24 @@ Impact: Would break Content Security Policy and cause script execution failures.
|
|
|
845
845
|
}
|
|
846
846
|
}
|
|
847
847
|
}
|
|
848
|
-
`;var
|
|
848
|
+
`;var Bs={"&":"\\u0026",">":"\\u003e","<":"\\u003c","\u2028":"\\u2028","\u2029":"\\u2029"},Qs=/[&><\u2028\u2029]/g;function Wo(e){return e.replace(Qs,t=>Bs[t])}var ae="Error in SEO input: ",X={title:{validate:e=>{if(typeof e!="string")throw new Error(ae.concat("`title` should be a string"));if(typeof e=="string"&&e.length>70)throw new Error(ae.concat("`title` should not be longer than 70 characters"));return e}},description:{validate:e=>{if(typeof e!="string")throw new Error(ae.concat("`description` should be a string"));if(typeof e=="string"&&e.length>155)throw new Error(ae.concat("`description` should not be longer than 160 characters"));return e}},url:{validate:e=>{if(typeof e!="string")throw new Error(ae.concat("`url` should be a string"));if(typeof e=="string"&&!e.startsWith("http"))throw new Error(ae.concat("`url` should be a valid URL"));return e}},handle:{validate:e=>{if(typeof e!="string")throw new Error(ae.concat("`handle` should be a string"));if(typeof e=="string"&&!e.startsWith("@"))throw new Error(ae.concat("`handle` should start with `@`"));return e}}};function jo(e){let t=[];for(let r of Object.keys(e))switch(r){case "title":{let o=Z(X.title,e.title),n=gr(e?.titleTemplate,o);if(!n)break;t.push(L("title",{title:n}),L("meta",{property:"og:title",content:n}),L("meta",{name:"twitter:title",content:n}));break}case "description":{let o=Z(X.description,e.description);if(!o)break;t.push(L("meta",{name:"description",content:o}),L("meta",{property:"og:description",content:o}),L("meta",{name:"twitter:description",content:o}));break}case "url":{let o=Z(X.url,e.url);if(!o)break;let a=o.split("?")[0].replace(/\/$/,"");t.push(L("link",{rel:"canonical",href:a}),L("meta",{property:"og:url",content:a}));break}case "handle":{let o=Z(X.handle,e.handle);if(!o)break;t.push(L("meta",{name:"twitter:site",content:o}),L("meta",{name:"twitter:creator",content:o}));break}case "media":{let o,n=se(e.media);for(let a of n)if(typeof a=="string"&&t.push(L("meta",{name:"og:image",content:a})),a&&typeof a=="object"){let s=a.type||"image",c=a?{url:a?.url,secure_url:a?.url,type:hr(a.url),width:a?.width,height:a?.height,alt:a?.altText}:{};for(let i of Object.keys(c))c[i]&&(o=c[i],t.push(L("meta",{property:`og:${s}:${i}`,content:o},c.url)));}break}case "jsonLd":{let o=se(e.jsonLd),n=0;for(let a of o){if(typeof a!="object")continue;let s=L("script",{type:"application/ld+json",children:JSON.stringify(a,(c,i)=>typeof i=="string"?Wo(i):i)},`json-ld-${a?.["@type"]||a?.name||n++}`);t.push(s);}break}case "alternates":{let o=se(e.alternates);for(let n of o){if(!n)continue;let{language:a,url:s,default:c}=n,i=a?`${a}${c?"-default":""}`:void 0;t.push(L("link",{rel:"alternate",hrefLang:i,href:s}));}break}case "robots":{if(!e.robots)break;let{maxImagePreview:o,maxSnippet:n,maxVideoPreview:a,noArchive:s,noFollow:c,noImageIndex:i,noIndex:u,noSnippet:p,noTranslate:y,unavailableAfter:g}=e.robots,m=[s&&"noarchive",i&&"noimageindex",p&&"nosnippet",y&&"notranslate",o&&`max-image-preview:${o}`,n&&`max-snippet:${n}`,a&&`max-video-preview:${a}`,g&&`unavailable_after:${g}`],d=(u?"noindex":"index")+","+(c?"nofollow":"follow");for(let l of m)l&&(d+=`,${l}`);t.push(L("meta",{name:"robots",content:d}));break}}return t.flat().sort((r,o)=>r.key.localeCompare(o.key))}function L(e,t,r){let o={tag:e,props:{},key:""};return e==="title"?(o.children=t.title,o.key=mr(o),o):e==="script"?(o.children=typeof t.children=="string"?t.children:"",o.key=mr(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=mr(o,r),o)}function mr(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 gr(e,t){if(t)return e?typeof e=="function"?e(t):e.replace("%s",t??""):t}function hr(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 se(e){return Array.isArray(e)?e:[e]}function Z(e,t){try{return e.validate(t)}catch(r){return console.warn(r.message),t}}function Ws(...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:se(o.jsonLd).concat(a)}:{...o,...n,jsonLd:[a]}:{...o,...n}},{})||{};for(let o of Object.keys(r))switch(o){case "title":{let n=Z(X.title,r.title),a=gr(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=Z(X.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=Z(X.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=Z(X.handle,r.handle);if(!n)break;t.push({property:"twitter:site",content:n},{property:"twitter:creator",content:n});break}case "media":{let n,a=se(r.media);for(let s of a)if(typeof s=="string"&&t.push({property:"og:image",content:s}),s&&typeof s=="object"){let c=s.type||"image",i=s?{url:s?.url,secure_url:s?.url,type:hr(s.url),width:s?.width,height:s?.height,alt:s?.altText}:{};for(let u of Object.keys(i))i[u]&&(n=i[u],t.push({property:`og:${c}:${u}`,content:n}));}break}case "jsonLd":{let n=se(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=se(r.alternates);for(let a of n){if(!a)continue;let{language:s,url:c,default:i}=a,u=s?`${s}${i?"-default":""}`:void 0;t.push({tagName:"link",rel:"alternate",hrefLang:u,href:c});}break}case "robots":{if(!r.robots)break;let{maxImagePreview:n,maxSnippet:a,maxVideoPreview:s,noArchive:c,noFollow:i,noImageIndex:u,noIndex:p,noSnippet:y,noTranslate:g,unavailableAfter:m}=r.robots,d=[c&&"noarchive",u&&"noimageindex",y&&"nosnippet",g&&"notranslate",n&&`max-image-preview:${n}`,a&&`max-snippet:${a}`,s&&`max-video-preview:${s}`,m&&`unavailable_after:${m}`],l=(p?"noindex":"index")+","+(i?"nofollow":"follow");for(let S of d)S&&(l+=`,${S}`);t.push({name:"robots",content:l});break}}return t}var ti=react.lazy(()=>Promise.resolve().then(()=>(Jo(),zo)));function ri({debug:e}){let t=reactRouter.useMatches(),r=reactRouter.useLocation();console.warn("[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\nSee: https://shopify.dev/docs/api/hydrogen/utilities/getseometa");let o=react.useMemo(()=>t.flatMap(s=>{let{handle:c,...i}=s,u={...i,...r},p=c?.seo,y=i?.data?.seo;return !p&&!y?[]:p?mt(p,u):[y]}).reduce((s,c)=>{Object.keys(c).forEach(u=>!c[u]&&delete c[u]);let{jsonLd:i}=c;return i?s?.jsonLd?Array.isArray(i)?{...s,...c,jsonLd:[...s.jsonLd,...i]}:{...s,...c,jsonLd:[...s.jsonLd,i]}:{...s,...c,jsonLd:[i]}:{...s,...c}},{}),[t,r]),{html:n,loggerMarkup:a}=react.useMemo(()=>{let s=jo(o),c=s.map(u=>u.tag==="script"?react.createElement(u.tag,{...u.props,key:u.key,dangerouslySetInnerHTML:{__html:u.children}}):react.createElement(u.tag,{...u.props,key:u.key},u.children)),i=react.createElement(react.Suspense,{fallback:null},react.createElement(ti,{headTags:s}));return {html:c,loggerMarkup:i}},[o]);return react.createElement(react.Fragment,null,n,e&&a)}function mt(e,...t){if(e instanceof Function)return mt(e(...t),...t);let r={};return Array.isArray(e)?(r=e.reduce((o,n)=>[...o,mt(n)],[]),r):e instanceof Object?(Object.entries(e).forEach(([n,a])=>{r[n]=mt(a,...t);}),r):e}function ni(e){return jsxRuntime.jsx(hydrogenReact.ShopPayButton,{channel:"hydrogen",...e})}var si=`<?xml version="1.0" encoding="UTF-8"?>
|
|
849
849
|
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
850
|
-
`,
|
|
851
|
-
</sitemapindex>`,
|
|
852
|
-
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">`,
|
|
850
|
+
`,ii=`
|
|
851
|
+
</sitemapindex>`,Zo=`<?xml version="1.0" encoding="UTF-8"?>
|
|
852
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">`,en="</urlset>";async function ci(e){let{storefront:t,request:r,types:o=["products","pages","collections","metaObjects","articles","blogs"],customChildSitemaps:n=[]}=e;if(!r||!r.url)throw new Error("A request object is required to generate a sitemap index");if(!t||!t.query)throw new Error("A storefront client is required to generate a sitemap index");let a=await t.query(Ai);if(!a)throw console.warn("[h2:sitemap:warning] Sitemap index is available in API version 2024-10 and later"),new Response("Sitemap index not found.",{status:404});let s=new URL(r.url).origin,c=si+o.map(i=>{if(!a[i])throw new Error(`[h2:sitemap:error] No data found for type ${i}. Check types passed to \`getSitemapIndex\``);return pi(i,a[i].pagesCount.count,s)}).join(`
|
|
853
853
|
`)+n.map(i=>" <sitemap><loc>"+(s+(i.startsWith("/")?i:"/"+i))+"</loc></sitemap>").join(`
|
|
854
|
-
`)+
|
|
855
|
-
`)+
|
|
856
|
-
<url><loc>${
|
|
857
|
-
`+
|
|
858
|
-
`;return o}function
|
|
854
|
+
`)+ii;return new Response(c,{headers:{"Content-Type":"application/xml","Cache-Control":`max-age=${3600*24}`}})}async function ui(e){let{storefront:t,request:r,params:o,getLink:n,locales:a=[],getChangeFreq:s,noItemsFallback:c="/"}=e;if(!o)throw new Error("[h2:sitemap:error] Remix params object is required to generate a sitemap");if(!r||!r.url)throw new Error("A request object is required to generate a sitemap");if(!t||!t.query)throw new Error("A storefront client is required to generate a index");if(!n)throw new Error("A `getLink` function to generate each resource is required to build a sitemap");if(!o.type||!o.page)throw new Response("No data found",{status:404});let i=o.type,u=Si[i];if(!u)throw new Response("Not found",{status:404});let p=await t.query(u,{variables:{page:parseInt(o.page,10)}});if(!p)throw console.warn("[h2:sitemap:warning] Sitemap is available in API version 2024-10 and later"),new Response("Sitemap not found.",{status:404});let y=new URL(r.url).origin,g="";return p?.sitemap?.resources?.items?.length?g=Zo+p.sitemap.resources.items.map(m=>di({getChangeFreq:s,url:n({type:m.type??i,baseUrl:y,handle:m.handle}),type:i,getLink:n,updatedAt:m.updatedAt,handle:m.handle,metaobjectType:m.type,locales:a,baseUrl:y})).join(`
|
|
855
|
+
`)+en:g=Zo+`
|
|
856
|
+
<url><loc>${y+c}</loc></url>
|
|
857
|
+
`+en,new Response(g,{headers:{"Content-Type":"application/xml","Cache-Control":`max-age=${3600*24}`}})}function pi(e,t,r){let o="";for(let n=1;n<=t;n++)o+=` <sitemap><loc>${r}/sitemap/${e}/${n}.xml</loc></sitemap>
|
|
858
|
+
`;return o}function di({url:e,updatedAt:t,locales:r,type:o,getLink:n,baseUrl:a,handle:s,getChangeFreq:c,metaobjectType:i}){return `<url>
|
|
859
859
|
<loc>${e}</loc>
|
|
860
860
|
<lastmod>${t}</lastmod>
|
|
861
861
|
<changefreq>${c?c({type:i??o,handle:s}):"weekly"}</changefreq>
|
|
862
|
-
${r.map(u=>
|
|
862
|
+
${r.map(u=>li(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
863
863
|
`)}
|
|
864
864
|
</url>
|
|
865
|
-
`.trim()}function
|
|
865
|
+
`.trim()}function li(e,t){return ` <xhtml:link rel="alternate" hreflang="${t}" href="${e}" />`}var yi=`#graphql
|
|
866
866
|
query SitemapProducts($page: Int!) {
|
|
867
867
|
sitemap(type: PRODUCT) {
|
|
868
868
|
resources(page: $page) {
|
|
@@ -873,7 +873,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
873
873
|
}
|
|
874
874
|
}
|
|
875
875
|
}
|
|
876
|
-
`,
|
|
876
|
+
`,fi=`#graphql
|
|
877
877
|
query SitemapCollections($page: Int!) {
|
|
878
878
|
sitemap(type: COLLECTION) {
|
|
879
879
|
resources(page: $page) {
|
|
@@ -884,7 +884,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
884
884
|
}
|
|
885
885
|
}
|
|
886
886
|
}
|
|
887
|
-
`,
|
|
887
|
+
`,mi=`#graphql
|
|
888
888
|
query SitemapArticles($page: Int!) {
|
|
889
889
|
sitemap(type: ARTICLE) {
|
|
890
890
|
resources(page: $page) {
|
|
@@ -895,7 +895,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
895
895
|
}
|
|
896
896
|
}
|
|
897
897
|
}
|
|
898
|
-
`,
|
|
898
|
+
`,gi=`#graphql
|
|
899
899
|
query SitemapPages($page: Int!) {
|
|
900
900
|
sitemap(type: PAGE) {
|
|
901
901
|
resources(page: $page) {
|
|
@@ -906,7 +906,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
906
906
|
}
|
|
907
907
|
}
|
|
908
908
|
}
|
|
909
|
-
`,
|
|
909
|
+
`,hi=`#graphql
|
|
910
910
|
query SitemapBlogs($page: Int!) {
|
|
911
911
|
sitemap(type: BLOG) {
|
|
912
912
|
resources(page: $page) {
|
|
@@ -917,7 +917,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
917
917
|
}
|
|
918
918
|
}
|
|
919
919
|
}
|
|
920
|
-
`,
|
|
920
|
+
`,Ci=`#graphql
|
|
921
921
|
query SitemapMetaobjects($page: Int!) {
|
|
922
922
|
sitemap(type: METAOBJECT) {
|
|
923
923
|
resources(page: $page) {
|
|
@@ -931,7 +931,7 @@ ${r.map(u=>ei(n({type:i??o,baseUrl:a,handle:s,locale:u}),u)).join(`
|
|
|
931
931
|
}
|
|
932
932
|
}
|
|
933
933
|
}
|
|
934
|
-
`,
|
|
934
|
+
`,Ai=`#graphql
|
|
935
935
|
query SitemapIndex {
|
|
936
936
|
products: sitemap(type: PRODUCT) {
|
|
937
937
|
pagesCount {
|
|
@@ -964,7 +964,7 @@ query SitemapIndex {
|
|
|
964
964
|
}
|
|
965
965
|
}
|
|
966
966
|
}
|
|
967
|
-
`,
|
|
967
|
+
`,Si={products:yi,articles:mi,collections:fi,pages:gi,blogs:hi,metaObjects:Ci};//! @see https://shopify.dev/docs/api/storefront/latest/queries/cart
|
|
968
968
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate
|
|
969
969
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesAdd
|
|
970
970
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesUpdate
|
|
@@ -980,5 +980,5 @@ query SitemapIndex {
|
|
|
980
980
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesAdd
|
|
981
981
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesRemove
|
|
982
982
|
//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesUpdate
|
|
983
|
-
Object.defineProperty(exports,"AnalyticsEventName",{enumerable:true,get:function(){return hydrogenReact.AnalyticsEventName}});Object.defineProperty(exports,"AnalyticsPageType",{enumerable:true,get:function(){return hydrogenReact.AnalyticsPageType}});Object.defineProperty(exports,"ExternalVideo",{enumerable:true,get:function(){return hydrogenReact.ExternalVideo}});Object.defineProperty(exports,"IMAGE_FRAGMENT",{enumerable:true,get:function(){return hydrogenReact.IMAGE_FRAGMENT}});Object.defineProperty(exports,"Image",{enumerable:true,get:function(){return hydrogenReact.Image}});Object.defineProperty(exports,"MediaFile",{enumerable:true,get:function(){return hydrogenReact.MediaFile}});Object.defineProperty(exports,"ModelViewer",{enumerable:true,get:function(){return hydrogenReact.ModelViewer}});Object.defineProperty(exports,"Money",{enumerable:true,get:function(){return hydrogenReact.Money}});Object.defineProperty(exports,"ShopifySalesChannel",{enumerable:true,get:function(){return hydrogenReact.ShopifySalesChannel}});Object.defineProperty(exports,"Video",{enumerable:true,get:function(){return hydrogenReact.Video}});Object.defineProperty(exports,"customerAccountApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.customerAccountApiCustomScalars}});Object.defineProperty(exports,"decodeEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.decodeEncodedVariant}});Object.defineProperty(exports,"flattenConnection",{enumerable:true,get:function(){return hydrogenReact.flattenConnection}});Object.defineProperty(exports,"getAdjacentAndFirstAvailableVariants",{enumerable:true,get:function(){return hydrogenReact.getAdjacentAndFirstAvailableVariants}});Object.defineProperty(exports,"getClientBrowserParameters",{enumerable:true,get:function(){return hydrogenReact.getClientBrowserParameters}});Object.defineProperty(exports,"getProductOptions",{enumerable:true,get:function(){return hydrogenReact.getProductOptions}});Object.defineProperty(exports,"getShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.getShopifyCookies}});Object.defineProperty(exports,"isOptionValueCombinationInEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.isOptionValueCombinationInEncodedVariant}});Object.defineProperty(exports,"mapSelectedProductOptionToObject",{enumerable:true,get:function(){return hydrogenReact.mapSelectedProductOptionToObject}});Object.defineProperty(exports,"parseGid",{enumerable:true,get:function(){return hydrogenReact.parseGid}});Object.defineProperty(exports,"parseMetafield",{enumerable:true,get:function(){return hydrogenReact.parseMetafield}});Object.defineProperty(exports,"sendShopifyAnalytics",{enumerable:true,get:function(){return hydrogenReact.sendShopifyAnalytics}});Object.defineProperty(exports,"storefrontApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.storefrontApiCustomScalars}});Object.defineProperty(exports,"useLoadScript",{enumerable:true,get:function(){return hydrogenReact.useLoadScript}});Object.defineProperty(exports,"useMoney",{enumerable:true,get:function(){return hydrogenReact.useMoney}});Object.defineProperty(exports,"useSelectedOptionInUrlParam",{enumerable:true,get:function(){return hydrogenReact.useSelectedOptionInUrlParam}});Object.defineProperty(exports,"useShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.useShopifyCookies}});exports.Analytics=
|
|
983
|
+
Object.defineProperty(exports,"AnalyticsEventName",{enumerable:true,get:function(){return hydrogenReact.AnalyticsEventName}});Object.defineProperty(exports,"AnalyticsPageType",{enumerable:true,get:function(){return hydrogenReact.AnalyticsPageType}});Object.defineProperty(exports,"ExternalVideo",{enumerable:true,get:function(){return hydrogenReact.ExternalVideo}});Object.defineProperty(exports,"IMAGE_FRAGMENT",{enumerable:true,get:function(){return hydrogenReact.IMAGE_FRAGMENT}});Object.defineProperty(exports,"Image",{enumerable:true,get:function(){return hydrogenReact.Image}});Object.defineProperty(exports,"MediaFile",{enumerable:true,get:function(){return hydrogenReact.MediaFile}});Object.defineProperty(exports,"ModelViewer",{enumerable:true,get:function(){return hydrogenReact.ModelViewer}});Object.defineProperty(exports,"Money",{enumerable:true,get:function(){return hydrogenReact.Money}});Object.defineProperty(exports,"ShopifySalesChannel",{enumerable:true,get:function(){return hydrogenReact.ShopifySalesChannel}});Object.defineProperty(exports,"Video",{enumerable:true,get:function(){return hydrogenReact.Video}});Object.defineProperty(exports,"customerAccountApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.customerAccountApiCustomScalars}});Object.defineProperty(exports,"decodeEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.decodeEncodedVariant}});Object.defineProperty(exports,"flattenConnection",{enumerable:true,get:function(){return hydrogenReact.flattenConnection}});Object.defineProperty(exports,"getAdjacentAndFirstAvailableVariants",{enumerable:true,get:function(){return hydrogenReact.getAdjacentAndFirstAvailableVariants}});Object.defineProperty(exports,"getClientBrowserParameters",{enumerable:true,get:function(){return hydrogenReact.getClientBrowserParameters}});Object.defineProperty(exports,"getProductOptions",{enumerable:true,get:function(){return hydrogenReact.getProductOptions}});Object.defineProperty(exports,"getShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.getShopifyCookies}});Object.defineProperty(exports,"getTrackingValues",{enumerable:true,get:function(){return hydrogenReact.getTrackingValues}});Object.defineProperty(exports,"isOptionValueCombinationInEncodedVariant",{enumerable:true,get:function(){return hydrogenReact.isOptionValueCombinationInEncodedVariant}});Object.defineProperty(exports,"mapSelectedProductOptionToObject",{enumerable:true,get:function(){return hydrogenReact.mapSelectedProductOptionToObject}});Object.defineProperty(exports,"parseGid",{enumerable:true,get:function(){return hydrogenReact.parseGid}});Object.defineProperty(exports,"parseMetafield",{enumerable:true,get:function(){return hydrogenReact.parseMetafield}});Object.defineProperty(exports,"sendShopifyAnalytics",{enumerable:true,get:function(){return hydrogenReact.sendShopifyAnalytics}});Object.defineProperty(exports,"storefrontApiCustomScalars",{enumerable:true,get:function(){return hydrogenReact.storefrontApiCustomScalars}});Object.defineProperty(exports,"useLoadScript",{enumerable:true,get:function(){return hydrogenReact.useLoadScript}});Object.defineProperty(exports,"useMoney",{enumerable:true,get:function(){return hydrogenReact.useMoney}});Object.defineProperty(exports,"useSelectedOptionInUrlParam",{enumerable:true,get:function(){return hydrogenReact.useSelectedOptionInUrlParam}});Object.defineProperty(exports,"useShopifyCookies",{enumerable:true,get:function(){return hydrogenReact.useShopifyCookies}});exports.Analytics=Wn;exports.AnalyticsEvent=F;exports.CacheCustom=Nt;exports.CacheLong=kt;exports.CacheNone=Ut;exports.CacheShort=ue;exports.CartForm=J;exports.InMemoryCache=Ht;exports.NonceProvider=_o;exports.OptimisticInput=hs;exports.Pagination=vs;exports.RichText=Fs;exports.Script=ds;exports.Seo=ri;exports.ShopPayButton=ni;exports.VariantSelector=Ls;exports.cartAttributesUpdateDefault=Jt;exports.cartBuyerIdentityUpdateDefault=Kt;exports.cartCreateDefault=Gt;exports.cartDiscountCodesUpdateDefault=jt;exports.cartGetDefault=$t;exports.cartGetIdDefault=Ft;exports.cartGiftCardCodesRemoveDefault=tr;exports.cartGiftCardCodesUpdateDefault=er;exports.cartLinesAddDefault=Bt;exports.cartLinesRemoveDefault=Wt;exports.cartLinesUpdateDefault=Qt;exports.cartMetafieldDeleteDefault=Zt;exports.cartMetafieldsSetDefault=Xt;exports.cartNoteUpdateDefault=Yt;exports.cartSelectedDeliveryOptionsUpdateDefault=zt;exports.cartSetIdDefault=qt;exports.changelogHandler=Va;exports.createCartHandler=rr;exports.createContentSecurityPolicy=ss;exports.createCustomerAccountClient=ur;exports.createHydrogenContext=Za;exports.createRequestHandler=ts;exports.createStorefrontClient=yo;exports.createWithCache=na;exports.formatAPIResult=E;exports.generateCacheControlHeader=De;exports.getPaginationVariables=Ts;exports.getSelectedProductOptions=ks;exports.getSeoMeta=Ws;exports.getShopAnalytics=Bn;exports.getSitemap=ui;exports.getSitemapIndex=ci;exports.graphiqlLoader=qs;exports.hydrogenContext=Ha;exports.hydrogenPreset=Ms;exports.hydrogenRoutes=fs;exports.storefrontRedirect=$s;exports.useAnalytics=Y;exports.useCustomerPrivacy=Rt;exports.useNonce=pr;exports.useOptimisticCart=Na;exports.useOptimisticData=gs;exports.useOptimisticVariant=ws;//# sourceMappingURL=index.cjs.map
|
|
984
984
|
//# sourceMappingURL=index.cjs.map
|