@shopify/hydrogen 2025.7.2 → 2025.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +27 -24
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +27 -24
- package/dist/development/index.js.map +1 -1
- package/dist/production/index.cjs +27 -27
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.d.cts +2 -0
- package/dist/production/index.d.ts +2 -0
- package/dist/production/index.js +27 -27
- package/dist/production/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/analytics-manager/AnalyticsView.tsx","../../src/analytics-manager/events.ts","../../src/constants.ts","../../src/utils/server-timing.ts","../../src/customer-privacy/ShopifyCustomerPrivacy.tsx","../../package.json","../../src/analytics-manager/ShopifyAnalytics.tsx","../../src/analytics-manager/CartAnalytics.tsx","../../src/analytics-manager/PerfKit.tsx","../../src/utils/warning.ts","../../src/analytics-manager/AnalyticsProvider.tsx","../../src/utils/request.ts","../../src/utils/callsites.ts","../../src/cache/strategies.ts","../../src/utils/parse-json.ts","../../src/cache/api.ts","../../src/cache/sub-request.ts","../../src/utils/hash.ts","../../src/cache/run-with-cache.ts","../../src/cache/server-fetch.ts","../../src/cache/create-with-cache.ts","../../src/cache/in-memory.ts","../../src/cart/CartForm.tsx","../../src/cart/cartGetIdDefault.ts","../../src/cart/cartSetIdDefault.ts","../../src/utils/uuid.ts","../../src/version.ts","../../src/utils/graphql.ts","../../src/storefront.ts","../../src/cart/queries/cartGetDefault.ts","../../src/cart/queries/cart-fragments.ts","../../src/cart/queries/cartCreateDefault.ts","../../src/cart/queries/cartLinesAddDefault.ts","../../src/cart/optimistic/optimistic-cart.helper.ts","../../src/cart/queries/cartLinesUpdateDefault.ts","../../src/cart/queries/cartLinesRemoveDefault.ts","../../src/cart/queries/cartDiscountCodesUpdateDefault.ts","../../src/cart/queries/cartBuyerIdentityUpdateDefault.ts","../../src/cart/queries/cartNoteUpdateDefault.ts","../../src/cart/queries/cartSelectedDeliveryOptionsUpdateDefault.ts","../../src/cart/queries/cartAttributesUpdateDefault.ts","../../src/cart/queries/cartMetafieldsSetDefault.ts","../../src/cart/queries/cartMetafieldDeleteDefault.ts","../../src/cart/queries/cartGiftCardCodeUpdateDefault.ts","../../src/cart/queries/cartGiftCardCodesRemoveDefault.ts","../../src/cart/queries/cartDeliveryAddressesAddDefault.tsx","../../src/cart/queries/cartDeliveryAddressesRemoveDefault.tsx","../../src/cart/queries/cartDeliveryAddressesUpdateDefault.tsx","../../src/cart/createCartHandler.ts","../../src/cart/optimistic/useOptimisticCart.tsx","../../src/changelogHandler.ts","../../src/context-keys.ts","../../src/customer/constants.ts","../../src/customer/BadRequest.ts","../../src/customer/auth.helpers.ts","../../src/csp/nonce.ts","../../src/utils/get-redirect-url.ts","../../src/customer/customer-account-helper.ts","../../src/customer/customer.ts","../../src/createHydrogenContext.ts","../../src/createRequestHandler.ts","../../src/csp/csp.ts","../../src/csp/Script.tsx","../../src/dev/hydrogen-routes.ts","../../src/optimistic-ui/optimistic-ui.tsx","../../src/pagination/Pagination.ts","../../src/product/useOptimisticVariant.ts","../../src/product/VariantSelector.ts","../../src/react-router-preset.ts","../../src/RichText.tsx","../../src/routing/graphiql.ts","../../src/routing/redirect.ts","../../src/seo/escape.ts","../../src/seo/generate-seo-tags.ts","../../src/seo/getSeoMeta.ts","../../src/seo/seo.ts","../../src/shop/ShopPayButton.tsx","../../src/sitemap/sitemap.ts"],"names":["publish","viewPayload","useLoadScript","config","useEffect","value","subscribe","register","useState","useRef","consent","useMemo","useShopifyCookies","logMissingConfig","cart","prevCart","jsx","isStale","logSubRequestEvent","result","debugInfo","url","response","data","errors","jsxs","createStorefrontUtilities","document","body","headers","options","buyerIdentity","createContext","refreshToken","query","createReactRouterRequestHandler","useContext","useFetchers","useLocation","forwardRef","NextLink","createElement","flattenConnection","params","useNavigation","Fragment","option","variant","selectedValue","OriginalRichText","Link","graphiqlLoader","schema","html","loggerMarkup","ShopPayButtonBase"],"mappings":"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","file":"index.js","sourcesContent":["import {useLocation} from 'react-router';\nimport {useEffect} from 'react';\nimport {\n type ShopAnalytics,\n type AnalyticsProviderProps,\n useAnalytics,\n} from './AnalyticsProvider';\nimport {CartReturn} from '../cart/queries/cart-types';\nimport {AnalyticsEvent} from './events';\nimport {\n CartLine,\n ComponentizableCartLine,\n Product,\n ProductVariant,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type OtherData = {\n /** Any other data that should be included in the event. */\n [key: string]: unknown;\n};\n\ntype BasePayload = {\n /** The shop data passed in from the `AnalyticsProvider`. */\n shop: ShopAnalytics | null;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: AnalyticsProviderProps['customData'];\n};\n\ntype UrlPayload = {\n /** The url location of when this event is collected. */\n url: string;\n};\n\ntype ProductPayload = {\n /** The product id. */\n id: Product['id'];\n /** The product title. */\n title: Product['title'];\n /** The displaying variant price. */\n price: ProductVariant['price']['amount'];\n /** The product vendor. */\n vendor: Product['vendor'];\n /** The displaying variant id. */\n variantId: ProductVariant['id'];\n /** The displaying variant title. */\n variantTitle: ProductVariant['title'];\n /** The quantity of product. */\n quantity: number;\n /** The product sku. */\n sku?: ProductVariant['sku'];\n /** The product type. */\n productType?: Product['productType'];\n};\n\ntype ProductsPayload = {\n /** The products associated with this event. */\n products: Array<ProductPayload & OtherData>;\n};\n\ntype CollectionPayloadDetails = {\n /** The collection id. */\n id: string;\n /** The collection handle. */\n handle: string;\n};\n\ntype CollectionPayload = {\n collection: CollectionPayloadDetails;\n};\n\ntype SearchPayload = {\n /** The search term used for the search results page */\n searchTerm: string;\n /** The search results */\n searchResults?: any;\n};\n\ntype CartPayload = {\n /** The current cart state. */\n cart: CartReturn | null;\n /** The previous cart state. */\n prevCart: CartReturn | null;\n};\n\ntype CartLinePayload = {\n /** The previous state of the cart line that got updated. */\n prevLine?: CartLine | ComponentizableCartLine;\n /** The current state of the cart line that got updated. */\n currentLine?: CartLine | ComponentizableCartLine;\n};\n\n// Event payloads\nexport type CollectionViewPayload = CollectionPayload &\n UrlPayload &\n BasePayload;\nexport type ProductViewPayload = ProductsPayload & UrlPayload & BasePayload;\nexport type CartViewPayload = CartPayload & UrlPayload & BasePayload;\nexport type PageViewPayload = UrlPayload & BasePayload;\nexport type SearchViewPayload = SearchPayload & UrlPayload & BasePayload;\n\ntype ViewPayload =\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | CartViewPayload\n | SearchViewPayload;\n\nexport type CartUpdatePayload = CartPayload & BasePayload & OtherData;\nexport type CartLineUpdatePayload = CartLinePayload &\n CartPayload &\n BasePayload &\n OtherData;\nexport type CustomEventPayload = BasePayload & OtherData;\n\nexport type EventPayloads =\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | CartViewPayload\n | SearchViewPayload\n | CartUpdatePayload\n | CartLineUpdatePayload\n | CustomEventPayload;\n\nexport type EventTypes = (typeof AnalyticsEvent)[keyof typeof AnalyticsEvent];\n\ntype BaseViewProps = {\n customData?: OtherData;\n};\n\nfunction AnalyticsView(\n props: BasicViewProps & {type: typeof AnalyticsEvent.PAGE_VIEWED},\n): null;\nfunction AnalyticsView(\n props: ProductViewProps & {type: typeof AnalyticsEvent.PRODUCT_VIEWED},\n): null;\nfunction AnalyticsView(\n props: CollectionViewProps & {type: typeof AnalyticsEvent.COLLECTION_VIEWED},\n): null;\nfunction AnalyticsView(\n props: BasicViewProps & {type: typeof AnalyticsEvent.CART_VIEWED},\n): null;\nfunction AnalyticsView(\n props: SearchViewProps & {type: typeof AnalyticsEvent.SEARCH_VIEWED},\n): null;\nfunction AnalyticsView(props: CustomViewProps): null;\nfunction AnalyticsView(props: any) {\n const {type, data = {}, customData} = props;\n const location = useLocation();\n const {\n publish,\n cart,\n prevCart,\n shop,\n customData: analyticProviderCustomData,\n } = useAnalytics();\n const url = location.pathname + location.search;\n\n let viewPayload: ViewPayload = {\n ...data,\n customData: {\n ...analyticProviderCustomData,\n ...customData,\n },\n cart,\n prevCart,\n shop,\n };\n\n // Publish page_viewed events when the URL changes\n useEffect(() => {\n // don't publish the event until we have the shop\n if (!shop?.shopId) return;\n\n viewPayload = {\n ...viewPayload,\n url: window.location.href,\n };\n\n publish(type, viewPayload);\n }, [publish, url, shop?.shopId]);\n\n return null;\n}\n\ntype BasicViewProps = {\n data?: OtherData;\n customData?: OtherData;\n};\n\ntype ProductViewProps = {\n data: ProductsPayload;\n customData?: OtherData;\n};\n\ntype CollectionViewProps = {\n data: CollectionPayload;\n customData?: OtherData;\n};\n\ntype SearchViewProps = {\n data?: SearchPayload;\n customData?: OtherData;\n};\n\ntype CustomViewProps = {\n type: typeof AnalyticsEvent.CUSTOM_EVENT;\n data?: OtherData;\n customData?: OtherData;\n};\n\nexport function AnalyticsPageView(props: BasicViewProps) {\n return <AnalyticsView {...props} type=\"page_viewed\" />;\n}\n\nexport function AnalyticsProductView(props: ProductViewProps) {\n return <AnalyticsView {...props} type=\"product_viewed\" />;\n}\n\nexport function AnalyticsCollectionView(props: CollectionViewProps) {\n return <AnalyticsView {...props} type=\"collection_viewed\" />;\n}\n\nexport function AnalyticsCartView(props: BasicViewProps) {\n return <AnalyticsView {...props} type=\"cart_viewed\" />;\n}\n\nexport function AnalyticsSearchView(props: SearchViewProps) {\n return <AnalyticsView {...props} type=\"search_viewed\" />;\n}\n\nexport function AnalyticsCustomView(props: CustomViewProps) {\n return <AnalyticsView {...props} />;\n}\n","export const AnalyticsEvent = {\n // Views\n PAGE_VIEWED: 'page_viewed' as const,\n PRODUCT_VIEWED: 'product_viewed' as const,\n COLLECTION_VIEWED: 'collection_viewed' as const,\n CART_VIEWED: 'cart_viewed' as const,\n SEARCH_VIEWED: 'search_viewed' as const,\n\n // Cart\n CART_UPDATED: 'cart_updated' as const,\n PRODUCT_ADD_TO_CART: 'product_added_to_cart' as const,\n PRODUCT_REMOVED_FROM_CART: 'product_removed_from_cart' as const,\n\n // Custom\n CUSTOM_EVENT: `custom_` as `custom_${string}`,\n};\n","export const STOREFRONT_REQUEST_GROUP_ID_HEADER =\n 'Custom-Storefront-Request-Group-ID';\nexport const STOREFRONT_ACCESS_TOKEN_HEADER =\n 'X-Shopify-Storefront-Access-Token';\nexport const SDK_VARIANT_HEADER = 'X-SDK-Variant';\nexport const SDK_VARIANT_SOURCE_HEADER = 'X-SDK-Variant-Source';\nexport const SDK_VERSION_HEADER = 'X-SDK-Version';\nexport const SHOPIFY_CLIENT_IP_HEADER = 'X-Shopify-Client-IP';\nexport const SHOPIFY_CLIENT_IP_SIG_HEADER = 'X-Shopify-Client-IP-Sig';\nexport const HYDROGEN_SFAPI_PROXY_KEY = '_sfapi_proxy';\nexport const HYDROGEN_SERVER_TRACKING_KEY = '_server_tracking';\n","import {\n HYDROGEN_SFAPI_PROXY_KEY,\n HYDROGEN_SERVER_TRACKING_KEY,\n} from '../constants';\n\nfunction buildServerTimingHeader(values: Record<string, string | undefined>) {\n return Object.entries(values)\n .map(([key, value]) => (value ? `${key};desc=${value}` : undefined))\n .filter(Boolean)\n .join(', ');\n}\n\n/**\n * Creates a Server-Timing header from the given values and appends it to the response.\n */\nexport function appendServerTimingHeader(\n response: {headers: Headers},\n values: string | Parameters<typeof buildServerTimingHeader>[0],\n) {\n const header =\n typeof values === 'string' ? values : buildServerTimingHeader(values);\n\n if (header) {\n response.headers.append('Server-Timing', header);\n }\n}\n\n// In order: unique token, visit token, and consent\nconst trackedTimings = ['_y', '_s', '_cmp'] as const;\n\ntype TrackedTimingKeys = (typeof trackedTimings)[number];\nexport type TrackedTimingsRecord = Partial<Record<TrackedTimingKeys, string>>;\n\nexport function extractServerTimingHeader(\n serverTimingHeader?: string,\n): TrackedTimingsRecord {\n const values: TrackedTimingsRecord = {};\n if (!serverTimingHeader) return values;\n\n const re = new RegExp(\n `\\\\b(${trackedTimings.join('|')});desc=\"?([^\",]+)\"?`,\n 'g',\n );\n\n let match;\n while ((match = re.exec(serverTimingHeader)) !== null) {\n values[match[1] as TrackedTimingKeys] = match[2];\n }\n\n return values;\n}\n\n/**\n * Checks if a specific server-timing header is present in the navigation entry.\n */\nfunction hasServerTimingInNavigationEntry(key: string): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const navigationEntry = window.performance.getEntriesByType(\n 'navigation',\n )[0] as PerformanceNavigationTiming;\n\n return !!navigationEntry?.serverTiming?.some((entry) => entry.name === key);\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Checks if the SFAPI proxy is enabled by looking for the\n * _sfapi_proxy server-timing header in the navigation entry.\n */\nexport function isSfapiProxyEnabled(): boolean {\n return hasServerTimingInNavigationEntry(HYDROGEN_SFAPI_PROXY_KEY);\n}\n\n/**\n * Checks if the backend already fetched tracking values by looking for\n * the _server_tracking server-timing header in the navigation entry.\n */\nexport function hasServerReturnedTrackingValues(): boolean {\n return hasServerTimingInNavigationEntry(HYDROGEN_SERVER_TRACKING_KEY);\n}\n","import {getTrackingValues, useShopifyCookies} from '@shopify/hydrogen-react';\nimport {\n CountryCode,\n LanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useRevalidator} from 'react-router';\nimport {useLoadScript} from '@shopify/hydrogen-react/load-script';\nimport {\n isSfapiProxyEnabled,\n hasServerReturnedTrackingValues,\n} from '../utils/server-timing';\n\nexport type ConsentStatus = boolean | undefined;\n\nexport type VisitorConsent = {\n marketing: ConsentStatus;\n analytics: ConsentStatus;\n preferences: ConsentStatus;\n sale_of_data: ConsentStatus;\n};\n\nexport type VisitorConsentCollected = {\n analyticsAllowed: boolean;\n firstPartyMarketingAllowed: boolean;\n marketingAllowed: boolean;\n preferencesAllowed: boolean;\n saleOfDataAllowed: boolean;\n thirdPartyMarketingAllowed: boolean;\n};\n\nexport type CustomerPrivacyApiLoaded = boolean;\n\nexport type CustomerPrivacyConsentConfig = {\n checkoutRootDomain: string;\n storefrontRootDomain?: string;\n storefrontAccessToken: string;\n country?: CountryCode;\n /** The privacyBanner refers to `language` as `locale` */\n locale?: LanguageCode;\n};\n\nexport type SetConsentHeadlessParams = VisitorConsent &\n CustomerPrivacyConsentConfig & {\n headlessStorefront?: boolean;\n };\n\n/**\n Ideally this type should come from the Custoemr Privacy API sdk\n analyticsProcessingAllowed -\n currentVisitorConsent\n doesMerchantSupportGranularConsent\n firstPartyMarketingAllowed\n getCCPAConsent\n getTrackingConsent\n marketingAllowed\n preferencesProcessingAllowed\n saleOfDataAllowed\n saleOfDataRegion\n setTrackingConsent\n shouldShowBanner\n shouldShowGDPRBanner\n thirdPartyMarketingAllowed\n**/\nexport type OriginalCustomerPrivacy = {\n currentVisitorConsent: () => VisitorConsent;\n preferencesProcessingAllowed: () => boolean;\n saleOfDataAllowed: () => boolean;\n marketingAllowed: () => boolean;\n analyticsProcessingAllowed: () => boolean;\n setTrackingConsent: (\n consent: SetConsentHeadlessParams,\n callback: (data: {error: string} | undefined) => void,\n ) => void;\n shouldShowBanner: () => boolean;\n};\n\nexport type CustomerPrivacy = Omit<\n OriginalCustomerPrivacy,\n 'setTrackingConsent'\n> & {\n setTrackingConsent: (\n consent: VisitorConsent, // we have already applied the headlessStorefront in the override\n callback: (data: {error: string} | undefined) => void,\n ) => void;\n};\n\n// NOTE: options is optional because we override these method(s) with pre-applied options\nexport type PrivacyBanner = {\n /* Display the privacy banner */\n loadBanner: (options?: Partial<CustomerPrivacyConsentConfig>) => void;\n /* Display the consent preferences banner */\n showPreferences: (options?: Partial<CustomerPrivacyConsentConfig>) => void;\n};\n\nexport interface CustomEventMap {\n visitorConsentCollected: CustomEvent<VisitorConsentCollected>;\n customerPrivacyApiLoaded: CustomEvent<CustomerPrivacyApiLoaded>;\n}\n\nexport type CustomerPrivacyApiProps = {\n /** The production shop checkout domain url. */\n checkoutDomain: string;\n /** The storefront access token for the shop. */\n storefrontAccessToken: string;\n /** Whether to load the Shopify privacy banner as configured in Shopify admin. Defaults to true. */\n withPrivacyBanner?: boolean;\n /** Country code for the shop. */\n country?: CountryCode;\n /** Language code for the shop. */\n locale?: LanguageCode;\n /** Callback to be called when visitor consent is collected. */\n onVisitorConsentCollected?: (consent: VisitorConsentCollected) => void;\n /** Callback to be call when customer privacy api is ready. */\n onReady?: () => void;\n /**\n * Whether consent libraries can use same-domain requests to the Storefront API.\n * Defaults to true if the standard route proxy is enabled in Hydrogen server.\n */\n sameDomainForStorefrontApi?: boolean;\n};\n\nexport const CONSENT_API =\n 'https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.2/consent-tracking-api.js';\nexport const CONSENT_API_WITH_BANNER =\n 'https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js';\n\nfunction logMissingConfig(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${fieldName} configuration.`,\n );\n}\n\nexport function useCustomerPrivacy(props: CustomerPrivacyApiProps) {\n const {\n withPrivacyBanner = false,\n onVisitorConsentCollected,\n onReady,\n checkoutDomain,\n storefrontAccessToken,\n country,\n locale,\n sameDomainForStorefrontApi,\n } = props;\n\n /** Determine if SF API proxy is enabled in Hydrogen server */\n const hasSfapiProxy = useMemo(\n () => sameDomainForStorefrontApi ?? isSfapiProxyEnabled(),\n [sameDomainForStorefrontApi],\n );\n\n /**\n * Determine if we need to fetch tracking values from the browser.\n * This can happen if the server did not collect this information already (e.g. subrequests were cached).\n */\n const fetchTrackingValuesFromBrowser = useMemo(\n () => hasSfapiProxy && !hasServerReturnedTrackingValues(),\n [hasSfapiProxy],\n );\n\n const cookiesReady = useShopifyCookies({\n fetchTrackingValues: fetchTrackingValuesFromBrowser,\n storefrontAccessToken,\n ignoreDeprecatedCookies: true,\n });\n\n // Store initial tracking values to compare later\n const initialTrackingValues = useMemo(getTrackingValues, [cookiesReady]);\n const {revalidate} = useRevalidator();\n\n // Load the Shopify customer privacy API with or without the privacy banner\n // NOTE: We no longer use the status because we need `ready` to be not when the script is loaded\n // but instead when both `privacyBanner` (optional) and customerPrivacy are loaded in the window\n useLoadScript(withPrivacyBanner ? CONSENT_API_WITH_BANNER : CONSENT_API, {\n attributes: {\n id: 'customer-privacy-api',\n },\n });\n\n const {observing, setLoaded, apisLoaded} = useApisLoaded({withPrivacyBanner});\n\n const config = useMemo(() => {\n if (!checkoutDomain) logMissingConfig('checkoutDomain');\n if (!storefrontAccessToken) logMissingConfig('storefrontAccessToken');\n\n // validate that the storefront access token is not a server API token\n if (\n storefrontAccessToken.startsWith('shpat_') ||\n storefrontAccessToken.length !== 32\n ) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token`,\n );\n }\n\n const commonAncestorDomain = parseStoreDomain(checkoutDomain);\n const sfapiDomain =\n // Check if standard route proxy is enabled in Hydrogen server\n // to use it instead of doing a cross-origin request to checkout.\n hasSfapiProxy && typeof window !== 'undefined'\n ? window.location.host\n : checkoutDomain;\n\n const config: CustomerPrivacyConsentConfig = {\n // This domain is used to send requests to SFAPI for setting and getting consent.\n checkoutRootDomain: sfapiDomain,\n // Prefix with a dot to ensure this domain is different from checkoutRootDomain.\n // This will ensure old cookies are set for a cross-subdomain checkout setup\n // so that we keep backward compatibility until new cookies are rolled out.\n // Once consent-tracking-api is updated to not rely on cookies anymore, we can remove this.\n storefrontRootDomain: commonAncestorDomain\n ? '.' + commonAncestorDomain\n : undefined,\n storefrontAccessToken,\n country,\n locale,\n };\n\n return config;\n }, [\n logMissingConfig,\n checkoutDomain,\n storefrontAccessToken,\n country,\n locale,\n ]);\n\n // settings event listeners for visitorConsentCollected\n useEffect(() => {\n const consentCollectedHandler = (\n event: CustomEvent<VisitorConsentCollected>,\n ) => {\n const latestTrackingValues = getTrackingValues();\n if (\n initialTrackingValues.visitToken !== latestTrackingValues.visitToken ||\n initialTrackingValues.uniqueToken !== latestTrackingValues.uniqueToken\n ) {\n // Tracking has changed: revalidate data to get updated cart.checkoutUrl with new params.\n revalidate().catch(() => {\n console.warn(\n '[h2:warn:useCustomerPrivacy] Revalidation failed after consent change.',\n );\n });\n }\n\n if (onVisitorConsentCollected) {\n const customerPrivacy = getCustomerPrivacy();\n if (customerPrivacy?.shouldShowBanner()) {\n // This type is plain wrong:\n const consentValues =\n customerPrivacy.currentVisitorConsent() as unknown as Record<\n keyof VisitorConsent,\n string\n >;\n\n if (consentValues) {\n // Mimic Privacy Banner SDK behavior to detect no-interaction:\n const NO_VALUE = '';\n const noInteraction =\n consentValues.marketing === NO_VALUE &&\n consentValues.analytics === NO_VALUE &&\n consentValues.preferences === NO_VALUE;\n\n if (noInteraction) {\n // The banner is being shown but the user has not interacted yet.\n // The fact that this event has been fired before interaction\n // is likely a bug in Privacy Banner SDK. We ignore this event for now.\n return;\n }\n }\n }\n\n onVisitorConsentCollected(event.detail);\n }\n };\n\n document.addEventListener(\n 'visitorConsentCollected',\n consentCollectedHandler,\n );\n\n return () => {\n document.removeEventListener(\n 'visitorConsentCollected',\n consentCollectedHandler,\n );\n };\n }, [onVisitorConsentCollected]);\n\n // monitor when the `privacyBanner` is in the window and override it's methods with config\n // pre-applied versions\n useEffect(() => {\n if (!withPrivacyBanner || observing.current.privacyBanner) return;\n observing.current.privacyBanner = true;\n\n let customPrivacyBanner: PrivacyBanner | undefined =\n window.privacyBanner || undefined;\n\n const privacyBannerWatcher = {\n configurable: true,\n get() {\n return customPrivacyBanner;\n },\n set(value: unknown) {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'showPreferences' in value &&\n 'loadBanner' in value\n ) {\n // overwrite the privacyBanner methods\n customPrivacyBanner = overridePrivacyBannerMethods({\n privacyBanner: value as PrivacyBanner,\n config,\n });\n\n // set the loaded state for the privacyBanner\n setLoaded.privacyBanner();\n }\n },\n };\n\n Object.defineProperty(window, 'privacyBanner', privacyBannerWatcher);\n }, [\n withPrivacyBanner,\n config,\n overridePrivacyBannerMethods,\n setLoaded.privacyBanner,\n ]);\n\n // monitor when the Shopify.customerPrivacy is added to the window and override the\n // setTracking consent method with the config pre-applied\n useEffect(() => {\n if (observing.current.customerPrivacy) return;\n observing.current.customerPrivacy = true;\n\n let customCustomerPrivacy: CustomerPrivacy | null = null;\n let customShopify: {customerPrivacy: CustomerPrivacy} | undefined | object =\n window.Shopify || undefined;\n\n // monitor for when window.Shopify = {} is first set\n Object.defineProperty(window, 'Shopify', {\n configurable: true,\n get() {\n return customShopify;\n },\n set(value: unknown) {\n // monitor for when window.Shopify = {} is first set\n if (\n typeof value === 'object' &&\n value !== null &&\n Object.keys(value).length === 0\n ) {\n customShopify = value as object;\n\n // monitor for when window.Shopify.customerPrivacy is set\n Object.defineProperty(window.Shopify, 'customerPrivacy', {\n configurable: true,\n get() {\n return customCustomerPrivacy;\n },\n set(value: unknown) {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'setTrackingConsent' in value\n ) {\n const customerPrivacy = value as CustomerPrivacy;\n\n // overwrite the tracking consent method\n customCustomerPrivacy = {\n ...customerPrivacy,\n // Note: this method is not used by the privacy-banner,\n // it bundles its own setTrackingConsent.\n setTrackingConsent: overrideCustomerPrivacySetTrackingConsent(\n {customerPrivacy, config},\n ),\n };\n\n customShopify = {\n ...customShopify,\n customerPrivacy: customCustomerPrivacy,\n };\n\n setLoaded.customerPrivacy();\n }\n },\n });\n }\n },\n });\n }, [\n config,\n overrideCustomerPrivacySetTrackingConsent,\n setLoaded.customerPrivacy,\n ]);\n\n useEffect(() => {\n if (!apisLoaded || !cookiesReady) return;\n\n const customerPrivacy = getCustomerPrivacy();\n // @ts-expect-error Internal property\n if (customerPrivacy && !customerPrivacy.cachedConsent) {\n // Consent-tracking-api assumes consent if it doesn't have anything to work with.\n // Since we have fetched the tracking values already, we set its cachedConsent here.\n // This is a workaround until consent-tracking-api knows how to read server-timing for us.\n const trackingValues = getTrackingValues();\n if (trackingValues.consent) {\n // @ts-expect-error Internal property\n customerPrivacy.cachedConsent = trackingValues.consent;\n }\n }\n\n if (withPrivacyBanner) {\n const privacyBanner = getPrivacyBanner();\n if (privacyBanner) {\n // auto load the banner if applicable\n privacyBanner.loadBanner(config);\n }\n }\n\n emitCustomerPrivacyApiLoaded();\n onReady?.();\n }, [apisLoaded, cookiesReady]);\n\n // return the customerPrivacy and privacyBanner (optional) modified APIs\n const result = {\n customerPrivacy: getCustomerPrivacy(),\n } as {\n customerPrivacy: CustomerPrivacy | null;\n privacyBanner?: PrivacyBanner | null;\n };\n\n if (withPrivacyBanner) {\n result.privacyBanner = getPrivacyBanner();\n }\n\n return result;\n}\n\nlet hasEmitted = false;\nfunction emitCustomerPrivacyApiLoaded() {\n if (hasEmitted) return;\n hasEmitted = true;\n const event = new CustomEvent('shopifyCustomerPrivacyApiLoaded');\n document.dispatchEvent(event);\n}\n\nfunction useApisLoaded({withPrivacyBanner}: {withPrivacyBanner: boolean}) {\n // used to help run the watchers only once\n const observing = useRef({customerPrivacy: false, privacyBanner: false});\n\n // [customerPrivacy, privacyBanner]\n const [apisLoadedArray, setApisLoaded] = useState(\n withPrivacyBanner ? [false, false] : [false],\n );\n\n // combined loaded state for both APIs\n const apisLoaded = apisLoadedArray.every(Boolean);\n\n const setLoaded = {\n customerPrivacy: () => {\n if (withPrivacyBanner) {\n setApisLoaded((prev) => [true, prev[1]]);\n } else {\n setApisLoaded(() => [true]);\n }\n },\n privacyBanner: () => {\n if (!withPrivacyBanner) {\n return;\n }\n setApisLoaded((prev) => [prev[0], true]);\n },\n };\n\n return {observing, setLoaded, apisLoaded};\n}\n\n/**\n * Extracts the root domain from the checkout domain otherwise returns the checkout domain.\n */\nfunction parseStoreDomain(checkoutDomain: string) {\n if (typeof window === 'undefined') return;\n\n const host = window.location.host;\n const checkoutDomainParts = checkoutDomain.split('.').reverse();\n const currentDomainParts = host.split('.').reverse();\n const sameDomainParts: Array<string> = [];\n checkoutDomainParts.forEach((part, index) => {\n if (part === currentDomainParts[index]) {\n sameDomainParts.push(part);\n }\n });\n\n return sameDomainParts.reverse().join('.') || undefined;\n}\n\n/**\n * Overrides the customerPrivacy.setTrackingConsent method to include the headless storefront configuration.\n */\nfunction overrideCustomerPrivacySetTrackingConsent({\n customerPrivacy,\n config,\n}: {\n customerPrivacy: OriginalCustomerPrivacy;\n config: CustomerPrivacyConsentConfig;\n}) {\n // Override the setTrackingConsent method to include the headless storefront configuration\n const original = customerPrivacy.setTrackingConsent;\n const {locale, country, ...rest} = config;\n\n function updatedSetTrackingConsent(\n consent: VisitorConsent,\n callback: (data: {error: string} | undefined) => void,\n ) {\n original(\n {\n ...rest,\n headlessStorefront: true,\n ...consent,\n },\n callback,\n );\n }\n return updatedSetTrackingConsent;\n}\n\n/**\n * Overrides the privacyBanner methods to include the config\n */\nfunction overridePrivacyBannerMethods({\n privacyBanner,\n config,\n}: {\n privacyBanner: PrivacyBanner;\n config: CustomerPrivacyConsentConfig;\n}) {\n const originalLoadBanner = privacyBanner.loadBanner;\n const originalShowPreferences = privacyBanner.showPreferences;\n\n function loadBanner(userConfig?: Partial<CustomerPrivacyConsentConfig>) {\n if (typeof userConfig === 'object') {\n originalLoadBanner({...config, ...userConfig});\n return;\n }\n originalLoadBanner(config);\n }\n\n function showPreferences(userConfig?: Partial<CustomerPrivacyConsentConfig>) {\n if (typeof userConfig === 'object') {\n originalShowPreferences({...config, ...userConfig});\n return;\n }\n originalShowPreferences(config);\n }\n return {loadBanner, showPreferences} as PrivacyBanner;\n}\n\n/*\n * Returns Shopify's customerPrivacy methods if loaded in the `window` object.\n * @returns CustomerPrivacy | null\n * @example\n * ```ts\n * const customerPrivacy = getCustomerPrivacy()\n *\n * if (customerPrivacy) {\n * // get the current visitor consent\n * const visitorConsent = customerPrivacy.currentVisitorConsent()\n *\n * // set the tracking consent\n * customerPrivacy.setTrackingConsent({marketing: true...}, () => {\n * // do something after the consent is set\n * })\n *\n * // check if marketing is allowed\n * const marketingAllowed = customerPrivacy.marketingAllowed()\n * console.log(marketingAllowed)\n *\n * // check if analytics is allowed\n * const analyticsAllowed = customerPrivacy.analyticsProcessingAllowed()\n * console.log(analyticsAllowed)\n *\n * // check if preferences are allowed\n * const preferencesAllowed = customerPrivacy.preferencesProcessingAllowed()\n * console.log(preferencesAllowed)\n *\n * // check if sale of data is allowed\n * const saleOfDataAllowed = customerPrivacy.saleOfDataAllowed()\n *\n * // check if third party marketing is allowed\n * const thirdPartyMarketingAllowed = customerPrivacy.thirdPartyMarketingAllowed()\n *\n * // check if first party marketing is allowed\n * const firstPartyMarketingAllowed = customerPrivacy.firstPartyMarketingAllowed()\n *\n * // check if the banner should be shown\n * const shouldShowBanner = customerPrivacy.shouldShowBanner()\n *\n * // check if the GDPR banner should be shown\n * const shouldShowGDPRBanner = customerPrivacy.shouldShowGDPRBanner()\n *\n * // check if the CCPA banner should be shown\n * const shouldShowCCPABanner = customerPrivacy.shouldShowCCPABanner()\n *\n * // check if the regulation is enforced\n * const isRegulationEnforced = customerPrivacy.isRegulationEnforced()\n *\n * // get the regulation\n * const regulation = customerPrivacy.getRegulation()\n *\n * // get the sale of data region\n * const saleOfDataRegion = customerPrivacy.saleOfDataRegion()\n *\n * // get the shop preferences\n * const shopPrefs = customerPrivacy.getShopPrefs()\n *\n * // get the tracking consent\n * const trackingConsent = customerPrivacy.getTrackingConsent()\n *\n * // get the CCPA consent\n * const ccpaConsent = customerPrivacy.getCCPAConsent()\n *\n * // check if the merchant supports granular consent\n * const doesMerchantSupportGranularConsent = customerPrivacy.doesMerchantSupportGranularConsent()\n * }\n * ```\n */\nexport function getCustomerPrivacy() {\n try {\n return window.Shopify && window.Shopify.customerPrivacy\n ? (window.Shopify?.customerPrivacy as CustomerPrivacy)\n : null;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Returns Shopify's privacyBanner methods if loaded in the `window` object.\n * @returns PrivacyBanner | null\n * @example\n * ```ts\n * const privacyBanner = getPrivacyBanner()\n *\n * if (privacyBanner) {\n * // show the banner\n * privacyBanner.loadBanner()\n *\n * // show the preferences\n * privacyBanner.showPreferences()\n * }\n * ```\n */\nexport function getPrivacyBanner() {\n try {\n return window && window?.privacyBanner\n ? (window.privacyBanner as PrivacyBanner)\n : null;\n } catch (e) {\n return null;\n }\n}\n","{\n \"name\": \"@shopify/hydrogen\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"@shopify:registry\": \"https://registry.npmjs.org\"\n },\n \"type\": \"module\",\n \"version\": \"2025.7.2\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.cjs\",\n \"module\": \"dist/production/index.js\",\n \"types\": \"dist/production/index.d.ts\",\n \"sideEffects\": false,\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Shopify/hydrogen.git\",\n \"directory\": \"packages/hydrogen\"\n },\n \"scripts\": {\n \"build\": \"tsup --clean\",\n \"dev\": \"tsup --watch ./src --watch ../../node_modules/@shopify/hydrogen-react/dist/browser-prod/index.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"prepack\": \"npm run build\",\n \"test:watch\": \"vitest\",\n \"build-docs\": \"sh ./docs/build-docs.sh && npm run format\",\n \"format\": \"prettier --write \\\"{src,docs}/**/*\\\" --ignore-unknown\",\n \"preview-docs\": \"npm run dev --prefix ../../docs/preview\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/production/index.d.ts\",\n \"module\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n },\n \"require\": \"./dist/index.cjs\",\n \"import\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n },\n \"default\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n }\n },\n \"./vite\": {\n \"types\": \"./dist/vite/plugin.d.ts\",\n \"default\": \"./dist/vite/plugin.js\"\n },\n \"./oxygen\": {\n \"types\": \"./dist/oxygen/index.d.ts\",\n \"default\": \"./dist/oxygen/index.js\"\n },\n \"./storefront-api-types\": \"./dist/storefront-api-types.d.ts\",\n \"./storefront.schema.json\": \"./dist/storefront.schema.json\",\n \"./customer-account-api-types\": \"./dist/customer-account-api-types.d.ts\",\n \"./customer-account.schema.json\": \"./dist/customer-account.schema.json\",\n \"./react-router-types\": {\n \"types\": \"./dist/react-router.d.ts\"\n },\n \"./react-router-preset\": {\n \"types\": \"./dist/production/react-router-preset.d.ts\",\n \"import\": {\n \"development\": \"./dist/development/react-router-preset.js\",\n \"default\": \"./dist/production/react-router-preset.js\"\n },\n \"default\": \"./dist/production/react-router-preset.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"typesVersions\": {\n \"*\": {\n \"storefront-api-types\": [\n \"./dist/storefront-api-types.d.ts\"\n ],\n \"customer-account-api-types\": [\n \"./dist/customer-account-api-types.d.ts\"\n ]\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@shopify/hydrogen-react\": \"2025.7.1\",\n \"content-security-policy-builder\": \"^2.2.0\",\n \"flame-chart-js\": \"2.3.1\",\n \"isbot\": \"^5.1.21\",\n \"source-map-support\": \"^0.5.21\",\n \"type-fest\": \"^4.33.0\",\n \"use-resize-observer\": \"^9.1.0\",\n \"worktop\": \"^0.7.3\",\n \"@shopify/graphql-client\": \"1.4.1\"\n },\n \"devDependencies\": {\n \"react-router\": \"7.12.0\",\n \"@react-router/dev\": \"7.12.0\",\n \"@shopify/generate-docs\": \"0.16.4\",\n \"@shopify/hydrogen-codegen\": \"*\",\n \"@testing-library/jest-dom\": \"^5.17.0\",\n \"@testing-library/react\": \"^14.0.0\",\n \"@types/source-map-support\": \"^0.5.10\",\n \"formdata-polyfill\": \"^4.0.10\",\n \"happy-dom\": \"^17.0.0\",\n \"react\": \"18.3.1\",\n \"schema-dts\": \"^1.1.2\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"react-router\": \"7.12.0\",\n \"@react-router/dev\": \"7.12.0\",\n \"react\": \"18.3.1\",\n \"vite\": \"^5.1.0 || ^6.2.1\"\n },\n \"peerDependenciesMeta\": {\n \"vite\": {\n \"optional\": true\n }\n }\n}\n","import {\n AnalyticsEventName,\n getClientBrowserParameters,\n sendShopifyAnalytics,\n useShopifyCookies,\n type ShopifyPageViewPayload,\n AnalyticsPageType,\n type ShopifyAnalyticsProduct,\n type ShopifyAddToCartPayload,\n} from '@shopify/hydrogen-react';\nimport {type CartReturn} from '../cart/queries/cart-types';\nimport {AnalyticsEvent} from './events';\nimport {useAnalytics, type AnalyticsProviderProps} from './AnalyticsProvider';\nimport {\n useCustomerPrivacy,\n getCustomerPrivacy,\n} from '../customer-privacy/ShopifyCustomerPrivacy';\nimport type {\n PageViewPayload,\n ProductViewPayload,\n CollectionViewPayload,\n CartUpdatePayload,\n CartLineUpdatePayload,\n SearchViewPayload,\n} from './AnalyticsView';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {\n CartLine,\n ComponentizableCartLine,\n Maybe,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {version} from '../../package.json';\n\nfunction getCustomerPrivacyRequired() {\n const customerPrivacy = getCustomerPrivacy();\n\n if (!customerPrivacy) {\n throw new Error(\n '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>.',\n );\n }\n\n return customerPrivacy;\n}\n\n/**\n * This component is responsible for sending analytics events to Shopify.\n * It emits the following events:\n * - page_viewed\n * - product_viewed\n * - collection_viewed\n * - search_viewed\n * - product_added_to_cart\n */\nexport function ShopifyAnalytics({\n consent,\n onReady,\n domain,\n}: {\n consent: AnalyticsProviderProps['consent'];\n onReady: () => void;\n domain?: string;\n}) {\n const {subscribe, register, canTrack} = useAnalytics();\n const [shopifyReady, setShopifyReady] = useState(false);\n const [privacyReady, setPrivacyReady] = useState(false);\n const [collectedConsent, setCollectedConsent] = useState('');\n const init = useRef(false);\n const {checkoutDomain, storefrontAccessToken, language} = consent;\n const {ready: shopifyAnalyticsReady} = register('Internal_Shopify_Analytics');\n\n // load customer privacy and (optionally) the privacy banner APIs\n useCustomerPrivacy({\n ...consent,\n locale: language,\n checkoutDomain: !checkoutDomain ? 'mock.shop' : checkoutDomain,\n storefrontAccessToken: !storefrontAccessToken\n ? 'abcdefghijklmnopqrstuvwxyz123456'\n : storefrontAccessToken,\n // If we use privacy banner, we should wait until consent is collected.\n // Otherwise, we can consider privacy ready immediately:\n onReady: () => !consent.withPrivacyBanner && setPrivacyReady(true),\n onVisitorConsentCollected: (consent) => {\n try {\n // Store consent to refresh local cookies after it changes\n setCollectedConsent(JSON.stringify(consent));\n } catch (e) {}\n\n setPrivacyReady(true);\n },\n });\n\n const hasUserConsent = useMemo(\n // must be initialized with true to avoid removing cookies too early\n () => (privacyReady ? canTrack() : true),\n // Make this value depend on collectedConsent to re-run `canTrack()` when consent changes\n [privacyReady, canTrack, collectedConsent],\n );\n\n // set up shopify_Y and shopify_S cookies\n useShopifyCookies({\n hasUserConsent,\n domain,\n checkoutDomain,\n // Already done inside useCustomerPrivacy\n fetchTrackingValues: false,\n // Avoid creating local cookies too early\n ignoreDeprecatedCookies: !privacyReady,\n });\n\n useEffect(() => {\n if (init.current) return;\n init.current = true;\n\n // Views\n subscribe(AnalyticsEvent.PAGE_VIEWED, pageViewHandler);\n subscribe(AnalyticsEvent.PRODUCT_VIEWED, productViewHandler);\n subscribe(AnalyticsEvent.COLLECTION_VIEWED, collectionViewHandler);\n subscribe(AnalyticsEvent.SEARCH_VIEWED, searchViewHandler);\n\n // Cart\n subscribe(AnalyticsEvent.PRODUCT_ADD_TO_CART, productAddedToCartHandler);\n\n setShopifyReady(true);\n }, [subscribe]);\n\n useEffect(() => {\n if (shopifyReady && privacyReady) {\n shopifyAnalyticsReady();\n onReady();\n }\n }, [shopifyReady, privacyReady, onReady]);\n\n return null;\n}\n\nfunction logMissingConfig(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${fieldName} configuration.`,\n );\n}\n\nfunction prepareBasePageViewPayload(\n payload:\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | SearchViewPayload\n | CartUpdatePayload,\n): ShopifyPageViewPayload | undefined {\n const customerPrivacy = getCustomerPrivacyRequired();\n const hasUserConsent = customerPrivacy.analyticsProcessingAllowed();\n\n if (!payload?.shop?.shopId) {\n logMissingConfig('shopId');\n return;\n }\n if (!payload?.shop?.acceptedLanguage) {\n logMissingConfig('acceptedLanguage');\n return;\n }\n if (!payload?.shop?.currency) {\n logMissingConfig('currency');\n return;\n }\n if (!payload?.shop?.hydrogenSubchannelId) {\n logMissingConfig('hydrogenSubchannelId');\n return;\n }\n\n const eventPayload = {\n shopifySalesChannel: 'hydrogen',\n assetVersionId: version,\n ...payload.shop,\n hasUserConsent,\n ...getClientBrowserParameters(),\n analyticsAllowed: customerPrivacy.analyticsProcessingAllowed(),\n marketingAllowed: customerPrivacy.marketingAllowed(),\n saleOfDataAllowed: customerPrivacy.saleOfDataAllowed(),\n ccpaEnforced: !customerPrivacy.saleOfDataAllowed(),\n gdprEnforced: !(\n customerPrivacy.marketingAllowed() &&\n customerPrivacy.analyticsProcessingAllowed()\n ),\n } as ShopifyPageViewPayload;\n\n return eventPayload;\n}\n\nfunction prepareBaseCartPayload(\n payload: CartUpdatePayload,\n cart: CartReturn | null,\n): ShopifyAddToCartPayload | undefined {\n if (cart === null) return;\n\n const pageViewPayload = prepareBasePageViewPayload(payload);\n\n if (!pageViewPayload) return;\n\n const eventPayload: ShopifyAddToCartPayload = {\n ...(pageViewPayload as ShopifyAddToCartPayload),\n cartId: cart.id,\n };\n\n return eventPayload;\n}\n\n// Forwarding view specific event payloads to page view handler\nlet viewPayload = {};\n\nfunction pageViewHandler(payload: PageViewPayload) {\n const eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.PAGE_VIEW_2,\n payload: {\n ...eventPayload,\n ...viewPayload,\n },\n });\n viewPayload = {};\n}\n\nfunction productViewHandler(payload: ProductViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (\n eventPayload &&\n validateProducts({\n type: 'product',\n products: payload.products,\n })\n ) {\n const formattedProducts = formatProduct(payload.products);\n viewPayload = {\n pageType: AnalyticsPageType.product,\n resourceId: formattedProducts[0].productGid,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n products: formatProduct(payload.products),\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.PRODUCT_VIEW,\n payload: eventPayload,\n });\n }\n}\n\nfunction collectionViewHandler(payload: CollectionViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n viewPayload = {\n pageType: AnalyticsPageType.collection,\n resourceId: payload.collection.id,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n collectionHandle: payload.collection.handle,\n collectionId: payload.collection.id,\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.COLLECTION_VIEW,\n payload: eventPayload,\n });\n}\n\nfunction searchViewHandler(payload: SearchViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n viewPayload = {\n pageType: AnalyticsPageType.search,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n searchString: payload.searchTerm,\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.SEARCH_VIEW,\n payload: eventPayload,\n });\n}\n\nfunction productAddedToCartHandler(payload: CartLineUpdatePayload) {\n const {cart, currentLine} = payload;\n const eventPayload = prepareBaseCartPayload(payload, cart);\n\n if (!eventPayload || !currentLine?.id) return;\n\n sendCartAnalytics({\n matchedLine: currentLine,\n eventPayload,\n });\n}\n\ntype AnalyticsProduct = {\n id: string;\n variantId: string;\n title: string;\n variantTitle: string;\n vendor: string;\n price: string;\n quantity: number;\n productType?: string;\n sku?: Maybe<string> | undefined;\n};\n\nfunction sendCartAnalytics({\n matchedLine,\n eventPayload,\n}: {\n matchedLine: CartLine | ComponentizableCartLine;\n eventPayload: ShopifyAddToCartPayload;\n}) {\n const product: AnalyticsProduct = {\n id: matchedLine.merchandise.product.id,\n variantId: matchedLine.merchandise.id,\n title: matchedLine.merchandise.product.title,\n variantTitle: matchedLine.merchandise.title,\n vendor: matchedLine.merchandise.product.vendor,\n price: matchedLine.merchandise.price.amount,\n quantity: matchedLine.quantity,\n productType: matchedLine.merchandise.product.productType,\n sku: matchedLine.merchandise.sku,\n };\n if (\n validateProducts({\n type: 'cart',\n products: [product],\n })\n ) {\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.ADD_TO_CART,\n payload: {\n ...eventPayload,\n products: formatProduct([product]),\n },\n });\n }\n}\n\nfunction missingErrorMessage(\n type: 'cart' | 'product',\n fieldName: string,\n isVariantField: boolean,\n viewKeyName?: string,\n) {\n if (type === 'cart') {\n const name = `${\n isVariantField ? 'merchandise' : 'merchandise.product'\n }.${fieldName}`;\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Can't set up cart analytics events because the \\`cart.lines[].${name}\\` value is missing from your GraphQL cart query. In your project, search for where \\`fragment CartLine on CartLine\\` is defined and make sure \\`${name}\\` 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.`,\n );\n } else {\n const name = `${viewKeyName || fieldName}`;\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Can't set up product view analytics events because the \\`${name}\\` is missing from your \\`<Analytics.ProductView>\\`. Make sure \\`${name}\\` 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.`,\n );\n }\n}\n\n// Product expected field and types:\n// variant_id: int, optional\n// product_id: int, optional\n// product_gid: string,\n// name: string,\n// price: float,\n// sku: string, optional\n// brand: string,\n// variant: string,\n// category: string, optional\n// quantity: float\nfunction validateProducts({\n type,\n products,\n}: {\n type: 'cart' | 'product';\n products: Array<Record<string, unknown>>;\n}) {\n if (!products || products.length === 0) {\n missingErrorMessage(type, '', false, 'data.products');\n return false;\n }\n\n products.forEach((product) => {\n if (!product.id) {\n missingErrorMessage(type, 'id', false);\n return false;\n }\n if (!product.title) {\n missingErrorMessage(type, 'title', false);\n return false;\n }\n if (!product.price) {\n missingErrorMessage(type, 'price.amount', true, 'price');\n return false;\n }\n if (!product.vendor) {\n missingErrorMessage(type, 'vendor', false);\n return false;\n }\n if (!product.variantId) {\n missingErrorMessage(type, 'id', true, 'variantId');\n return false;\n }\n if (!product.variantTitle) {\n missingErrorMessage(type, 'title', true, 'variantTitle');\n return false;\n }\n });\n return true;\n}\n\nfunction formatProduct(products: Array<AnalyticsProduct>) {\n return products.map((product) => {\n const formattedProduct = {\n productGid: product.id,\n variantGid: product.variantId,\n name: product.title,\n variantName: product.variantTitle,\n brand: product.vendor,\n price: product.price,\n quantity: product.quantity || 1,\n category: product.productType,\n } as ShopifyAnalyticsProduct;\n\n if (product.sku) formattedProduct.sku = product.sku;\n if (product.productType) formattedProduct.category = product.productType;\n\n return formattedProduct;\n });\n}\n","import {useEffect, useRef} from 'react';\nimport {\n useAnalytics,\n type AnalyticsProviderProps,\n type Carts,\n} from './AnalyticsProvider';\nimport {type CartUpdatePayload} from './AnalyticsView';\nimport {flattenConnection} from '@shopify/hydrogen-react';\n\nfunction logMissingField(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:CartAnalytics] Can't set up cart analytics events because the \\`cart.${fieldName}\\` value is missing from your GraphQL cart query. In your project, search for where \\`fragment CartApiQuery on Cart\\` is defined and make sure \\`${fieldName}\\` 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.`,\n );\n}\n\ntype CartStorage = {\n updatedAt: string;\n id: string;\n};\n\nexport function CartAnalytics({\n cart: currentCart,\n setCarts,\n}: {\n cart: AnalyticsProviderProps['cart'];\n setCarts: React.Dispatch<React.SetStateAction<Carts>>;\n}) {\n const {publish, shop, customData, canTrack, cart, prevCart} = useAnalytics();\n const lastEventId = useRef<string | null>(null);\n\n // resolve the cart that could have been deferred\n useEffect(() => {\n if (!currentCart) return;\n\n Promise.resolve(currentCart).then((updatedCart) => {\n if (updatedCart && updatedCart.lines) {\n if (!updatedCart.id) {\n logMissingField('id');\n return;\n }\n if (!updatedCart.updatedAt) {\n logMissingField('updatedAt');\n return;\n }\n }\n\n setCarts(({cart, prevCart}: Carts) => {\n return updatedCart?.updatedAt !== cart?.updatedAt\n ? {cart: updatedCart, prevCart: cart}\n : {cart, prevCart};\n });\n });\n return () => {};\n }, [setCarts, currentCart]);\n\n useEffect(() => {\n if (!cart || !cart?.updatedAt) return;\n if (cart?.updatedAt === prevCart?.updatedAt) return;\n\n let cartLastUpdatedAt: CartStorage | null;\n try {\n cartLastUpdatedAt = JSON.parse(\n localStorage.getItem('cartLastUpdatedAt') || '',\n );\n } catch (e) {\n cartLastUpdatedAt = null;\n }\n\n if (\n cart.id === cartLastUpdatedAt?.id &&\n cart.updatedAt === cartLastUpdatedAt?.updatedAt\n )\n return;\n\n const payload: CartUpdatePayload = {\n eventTimestamp: Date.now(),\n cart,\n prevCart,\n shop,\n customData,\n };\n\n // prevent duplicate events\n // TODO: add cart id check\n if (cart.updatedAt === lastEventId.current) return;\n lastEventId.current = cart.updatedAt;\n\n publish('cart_updated', payload);\n\n // We store the last cart update timestamp in localStorage to be able\n // to detect if the cart has been updated since the last page render\n // this prevents sending duplicate cart_updated events on first render\n localStorage.setItem(\n 'cartLastUpdatedAt',\n JSON.stringify({\n id: cart.id,\n updatedAt: cart.updatedAt,\n }),\n );\n\n const previousCartLines = prevCart?.lines\n ? flattenConnection(prevCart?.lines)\n : [];\n const currentCartLines = cart.lines ? flattenConnection(cart.lines) : [];\n\n // Detect quantity changes and missing cart lines\n previousCartLines?.forEach((prevLine) => {\n const matchedLineId = currentCartLines.filter(\n (line) => prevLine.id === line.id,\n );\n if (matchedLineId?.length === 1) {\n const matchedLine = matchedLineId[0];\n if (prevLine.quantity < matchedLine.quantity) {\n publish('product_added_to_cart', {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n } else if (prevLine.quantity > matchedLine.quantity) {\n publish('product_removed_from_cart', {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n }\n } else {\n publish('product_removed_from_cart', {\n ...payload,\n prevLine,\n });\n }\n });\n\n // Detect added to cart\n currentCartLines?.forEach((line) => {\n const matchedLineId = previousCartLines.filter(\n (previousLine) => line.id === previousLine.id,\n );\n if (!matchedLineId || matchedLineId.length === 0) {\n publish('product_added_to_cart', {\n ...payload,\n currentLine: line,\n });\n }\n });\n }, [cart, prevCart, publish, shop, customData, canTrack]);\n\n return null;\n}\n","import {parseGid, useLoadScript} from '@shopify/hydrogen-react';\nimport {ShopAnalytics, useAnalytics} from './AnalyticsProvider';\nimport {AnalyticsEvent} from './events';\nimport {useEffect, useRef} from 'react';\n\ndeclare global {\n interface Window {\n PerfKit: {\n navigate: () => void;\n setPageType: (pageType: string) => void;\n };\n }\n}\n\n// Pin to a version that have SPA support.\nconst PERF_KIT_URL =\n 'https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-spa.min.js';\n\nexport function PerfKit({shop}: {shop: ShopAnalytics}) {\n const loadedEvent = useRef(false);\n const {subscribe, register} = useAnalytics();\n const {ready} = register('Internal_Shopify_Perf_Kit');\n\n const scriptStatus = useLoadScript(PERF_KIT_URL, {\n attributes: {\n id: 'perfkit',\n 'data-application': 'hydrogen',\n 'data-shop-id': parseGid(shop.shopId).id.toString(),\n 'data-storefront-id': shop.hydrogenSubchannelId,\n 'data-monorail-region': 'global',\n 'data-spa-mode': 'true',\n 'data-resource-timing-sampling-rate': '100',\n },\n });\n\n useEffect(() => {\n if (scriptStatus !== 'done' || loadedEvent.current) return;\n loadedEvent.current = true;\n\n subscribe(AnalyticsEvent.PAGE_VIEWED, () => {\n window.PerfKit?.navigate();\n });\n subscribe(AnalyticsEvent.PRODUCT_VIEWED, () => {\n window.PerfKit?.setPageType('product');\n });\n subscribe(AnalyticsEvent.COLLECTION_VIEWED, () => {\n window.PerfKit?.setPageType('collection');\n });\n subscribe(AnalyticsEvent.SEARCH_VIEWED, () => {\n window.PerfKit?.setPageType('search');\n });\n subscribe(AnalyticsEvent.CART_VIEWED, () => {\n window.PerfKit?.setPageType('cart');\n });\n\n ready();\n }, [subscribe, ready, scriptStatus]);\n return null;\n}\n","const warnings = new Set<string>();\nexport const warnOnce = (string: string) => {\n if (!warnings.has(string)) {\n console.warn(string);\n warnings.add(string);\n }\n};\n\nconst errors = new Set<string>();\nexport const errorOnce = (string: string) => {\n if (!errors.has(string)) {\n console.error(new Error(string));\n errors.add(string);\n }\n};\n","import {\n type ReactNode,\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n} from 'react';\nimport {type CartReturn} from '../cart/queries/cart-types';\nimport {\n AnalyticsPageView,\n AnalyticsProductView,\n AnalyticsCollectionView,\n AnalyticsCartView,\n AnalyticsSearchView,\n AnalyticsCustomView,\n type PageViewPayload,\n type ProductViewPayload,\n type CollectionViewPayload,\n type CartViewPayload,\n type CartUpdatePayload,\n type CustomEventPayload,\n type OtherData,\n type EventPayloads,\n type CartLineUpdatePayload,\n type SearchViewPayload,\n} from './AnalyticsView';\nimport type {\n CurrencyCode,\n LanguageCode,\n Shop,\n Localization,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {AnalyticsEvent} from './events';\nimport {ShopifyAnalytics} from './ShopifyAnalytics';\nimport {CartAnalytics} from './CartAnalytics';\nimport {\n type PrivacyBanner,\n getCustomerPrivacy,\n getPrivacyBanner,\n type CustomerPrivacy,\n type CustomerPrivacyApiProps,\n} from '../customer-privacy/ShopifyCustomerPrivacy';\nimport type {Storefront} from '../storefront';\nimport {PerfKit} from './PerfKit';\nimport {errorOnce, warnOnce} from '../utils/warning';\n\nexport type ShopAnalytics = {\n /** The shop ID. */\n shopId: string;\n /** The language code that is being displayed to user. */\n acceptedLanguage: LanguageCode;\n /** The currency code that is being displayed to user. */\n currency: CurrencyCode;\n /** The Hydrogen subchannel ID generated by Oxygen in the environment variable. */\n hydrogenSubchannelId: string | '0';\n};\n\nexport type Consent = Partial<\n Pick<\n CustomerPrivacyApiProps,\n | 'checkoutDomain'\n | 'sameDomainForStorefrontApi'\n | 'storefrontAccessToken'\n | 'withPrivacyBanner'\n | 'country'\n >\n> & {language?: LanguageCode}; // the privacyBanner SDKs refers to \"language\" as \"locale\" :(\n\nexport type AnalyticsProviderProps = {\n /** React children to render. */\n children?: ReactNode;\n /** The cart or cart promise to track for cart analytics. When there is a difference between the state of the cart, `AnalyticsProvider` will trigger a `cart_updated` event. It will also produce `product_added_to_cart` and `product_removed_from_cart` based on cart line quantity and cart line id changes. */\n cart: Promise<CartReturn | null> | CartReturn | null;\n /** An optional function to set wether the user can be tracked. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack?: () => boolean;\n /** An optional custom payload to pass to all events. e.g language/locale/currency. */\n customData?: Record<string, unknown>;\n /** The shop configuration required to publish analytics events to Shopify. Use [`getShopAnalytics`](/docs/api/hydrogen/utilities/getshopanalytics). */\n shop: Promise<ShopAnalytics | null> | ShopAnalytics | null;\n /** The customer privacy consent configuration and options. */\n consent: Consent;\n /** @deprecated Disable throwing errors when required props are missing. */\n disableThrowOnError?: boolean;\n /** The domain scope of the cookie set with `useShopifyCookies`. **/\n cookieDomain?: string;\n};\n\nexport type Carts = {\n cart: Awaited<AnalyticsProviderProps['cart']>;\n prevCart: Awaited<AnalyticsProviderProps['cart']>;\n};\n\nexport type AnalyticsContextValue = {\n /** A function to tell you the current state of if the user can be tracked by analytics. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack: NonNullable<AnalyticsProviderProps['canTrack']>;\n /** The current cart state. */\n cart: Awaited<AnalyticsProviderProps['cart']>;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: AnalyticsProviderProps['customData'];\n /** The previous cart state. */\n prevCart: Awaited<AnalyticsProviderProps['cart']>;\n /** A function to publish an analytics event. */\n publish: typeof publish;\n /** A function to register with the analytics provider. */\n register: (key: string) => {ready: () => void};\n /** The shop configuration required to publish events to Shopify. */\n shop: Awaited<AnalyticsProviderProps['shop']>;\n /** A function to subscribe to analytics events. */\n subscribe: typeof subscribe;\n /** The privacy banner SDK methods with the config applied */\n privacyBanner: PrivacyBanner | null;\n /** The customer privacy SDK methods with the config applied */\n customerPrivacy: CustomerPrivacy | null;\n};\n\nexport const defaultAnalyticsContext: AnalyticsContextValue = {\n canTrack: () => false,\n cart: null,\n customData: {},\n prevCart: null,\n publish: () => {},\n shop: null,\n subscribe: () => {},\n register: () => ({ready: () => {}}),\n customerPrivacy: null,\n privacyBanner: null,\n};\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>(\n defaultAnalyticsContext,\n);\n\nconst subscribers = new Map<\n string,\n Map<string, (payload: EventPayloads) => void>\n>();\nconst registers: Record<string, boolean> = {};\n\nfunction areRegistersReady() {\n return Object.values(registers).every(Boolean);\n}\n\n// Overload functions for each subscribe event\nfunction subscribe(\n event: typeof AnalyticsEvent.PAGE_VIEWED,\n callback: (payload: PageViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_VIEWED,\n callback: (payload: ProductViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.COLLECTION_VIEWED,\n callback: (payload: CollectionViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CART_VIEWED,\n callback: (payload: CartViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.SEARCH_VIEWED,\n callback: (payload: SearchViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CART_UPDATED,\n callback: (payload: CartUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_ADD_TO_CART,\n callback: (payload: CartLineUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_REMOVED_FROM_CART,\n callback: (payload: CartLineUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CUSTOM_EVENT,\n callback: (payload: CustomEventPayload) => void,\n): void;\n\nfunction subscribe(event: any, callback: any) {\n if (!subscribers.has(event)) {\n subscribers.set(event, new Map());\n }\n subscribers.get(event)?.set(callback.toString(), callback);\n}\n\nconst waitForReadyQueue = new Map<any, any>();\n\nfunction publish(\n event: typeof AnalyticsEvent.PAGE_VIEWED,\n payload: PageViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_VIEWED,\n payload: ProductViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.COLLECTION_VIEWED,\n payload: CollectionViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CART_VIEWED,\n payload: CartViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CART_UPDATED,\n payload: CartUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_ADD_TO_CART,\n payload: CartLineUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_REMOVED_FROM_CART,\n payload: CartLineUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CUSTOM_EVENT,\n payload: OtherData,\n): void;\nfunction publish(event: any, payload: any): void {\n if (!areRegistersReady()) {\n waitForReadyQueue.set(event, payload);\n return;\n }\n\n publishEvent(event, payload);\n}\n\nfunction publishEvent(event: any, payload: any): void {\n (subscribers.get(event) ?? new Map()).forEach((callback, subscriber) => {\n try {\n callback(payload);\n } catch (error) {\n if (typeof error === 'object' && error instanceof Error) {\n console.error(\n 'Analytics publish error',\n error.message,\n subscriber,\n error.stack,\n );\n } else {\n console.error('Analytics publish error', error, subscriber);\n }\n }\n });\n}\n\nfunction register(key: string) {\n if (!registers.hasOwnProperty(key)) {\n registers[key] = false;\n }\n\n return {\n ready: () => {\n registers[key] = true;\n\n if (areRegistersReady() && waitForReadyQueue.size > 0) {\n waitForReadyQueue.forEach((queuePayload, queueEvent) => {\n publishEvent(queueEvent, queuePayload);\n });\n waitForReadyQueue.clear();\n }\n },\n };\n}\n\n/**\n * This functions attempts to automatically determine if the user can be tracked if the\n * customer privacy API is available. If not, it will default to false.\n */\nfunction shopifyCanTrack(): boolean {\n try {\n return window.Shopify.customerPrivacy.analyticsProcessingAllowed();\n } catch (e) {}\n return false;\n}\n\nfunction messageOnError(field: string, envVar: string) {\n return `[h2:error:Analytics.Provider] - ${field} is required. Make sure ${envVar} is defined in your environment variables. See https://h2o.fyi/analytics/consent to learn how to setup environment variables in the Shopify admin.`;\n}\n\nfunction AnalyticsProvider({\n canTrack: customCanTrack,\n cart: currentCart,\n children,\n consent,\n customData = {},\n shop: shopProp = null,\n cookieDomain,\n}: AnalyticsProviderProps): JSX.Element {\n const {shop} = useShopAnalytics(shopProp);\n const [analyticsLoaded, setAnalyticsLoaded] = useState(\n customCanTrack ? true : false,\n );\n const [consentCollected, setConsentCollected] = useState(false);\n const [carts, setCarts] = useState<Carts>({cart: null, prevCart: null});\n const [canTrack, setCanTrack] = useState<() => boolean>(\n customCanTrack ? () => customCanTrack : () => shopifyCanTrack,\n );\n\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!shop) {\n // If mock shop is used, log error instead of throwing\n if (/\\/68817551382$/.test(shop.shopId)) {\n warnOnce(\n '[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.',\n );\n } else {\n // TODO: we likely don't need checkout domain if SFAPI proxy is enabled\n // but keep it for backward compatibility for now until we have checkout URL params.\n if (!consent.checkoutDomain) {\n const errorMsg = messageOnError(\n 'consent.checkoutDomain',\n 'PUBLIC_CHECKOUT_DOMAIN',\n );\n errorOnce(errorMsg);\n }\n\n if (!consent.storefrontAccessToken) {\n const errorMsg = messageOnError(\n 'consent.storefrontAccessToken',\n 'PUBLIC_STOREFRONT_API_TOKEN',\n );\n errorOnce(errorMsg);\n }\n\n if (!consent?.country) {\n consent.country = 'US';\n }\n\n if (!consent?.language) {\n consent.language = 'EN';\n }\n\n if (consent.withPrivacyBanner === undefined) {\n consent.withPrivacyBanner = false;\n }\n }\n }\n\n const value = useMemo<AnalyticsContextValue>(() => {\n return {\n canTrack,\n ...carts,\n customData,\n publish: canTrack() ? publish : () => {},\n shop,\n subscribe,\n register,\n customerPrivacy: getCustomerPrivacy(),\n privacyBanner: getPrivacyBanner(),\n };\n }, [\n analyticsLoaded,\n canTrack,\n carts,\n carts.cart?.updatedAt,\n carts.prevCart,\n publish,\n subscribe,\n customData,\n shop,\n register,\n JSON.stringify(registers),\n getCustomerPrivacy,\n getPrivacyBanner,\n ]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n {!!shop && <AnalyticsPageView />}\n {!!shop && !!currentCart && (\n <CartAnalytics cart={currentCart} setCarts={setCarts} />\n )}\n {!!shop && (\n <ShopifyAnalytics\n consent={consent}\n onReady={() => {\n setAnalyticsLoaded(true);\n setCanTrack(\n customCanTrack ? () => customCanTrack : () => shopifyCanTrack,\n );\n\n // Delay loading PerfKit until consent is collected\n // so that it reads updated tracking values from old cookies.\n setConsentCollected(true);\n }}\n domain={cookieDomain}\n />\n )}\n {!!shop && consentCollected && <PerfKit shop={shop} />}\n </AnalyticsContext.Provider>\n );\n}\n\nexport function useAnalytics(): AnalyticsContextValue {\n const analyticsContext = useContext(AnalyticsContext);\n if (!analyticsContext) {\n throw new Error(\n `[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>`,\n );\n }\n return analyticsContext;\n}\n\n/**\n * A hook that resolves the shop analytics that could have been deferred\n * and returns the shop analytics.\n */\nfunction useShopAnalytics(shopProp: AnalyticsProviderProps['shop']): {\n shop: ShopAnalytics | null;\n} {\n const [shop, setShop] =\n useState<Awaited<AnalyticsProviderProps['shop']>>(null);\n\n // resolve the shop analytics that could have been deferred\n useEffect(() => {\n Promise.resolve(shopProp).then(setShop);\n return () => {};\n }, [setShop, shopProp]);\n\n return {shop};\n}\n\ntype ShopAnalyticsProps = {\n /**\n * The storefront client instance created by [`createStorefrontClient`](docs/api/hydrogen/utilities/createstorefrontclient).\n */\n storefront: Storefront;\n /**\n * The `PUBLIC_STOREFRONT_ID` generated by Oxygen in the environment variable.\n */\n publicStorefrontId: string;\n};\n\nexport async function getShopAnalytics({\n storefront,\n publicStorefrontId = '0',\n}: ShopAnalyticsProps): Promise<ShopAnalytics | null> {\n return storefront\n .query(SHOP_QUERY, {\n cache: storefront.CacheLong(),\n })\n .then(({shop, localization}: {shop: Shop; localization: Localization}) => {\n return {\n shopId: shop.id,\n acceptedLanguage: localization.language.isoCode,\n currency: localization.country.currency.isoCode,\n hydrogenSubchannelId: publicStorefrontId,\n };\n });\n}\n\nconst SHOP_QUERY = `#graphql\n query ShopData(\n $country: CountryCode\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n shop {\n id\n }\n localization {\n country {\n currency {\n isoCode\n }\n }\n language {\n isoCode\n }\n }\n }\n` as const;\n\nexport const Analytics = {\n CartView: AnalyticsCartView,\n CollectionView: AnalyticsCollectionView,\n CustomView: AnalyticsCustomView,\n ProductView: AnalyticsProductView,\n Provider: AnalyticsProvider,\n SearchView: AnalyticsSearchView,\n};\n\ntype DefaultCart = Promise<CartReturn | null> | CartReturn | null;\n\nexport type AnalyticsContextValueForDoc<UserCart> = {\n /** A function to tell you the current state of if the user can be tracked by analytics. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack?: () => boolean;\n /** The current cart state. You can overwrite the type by passing a generic */\n cart?: UserCart | DefaultCart;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: Record<string, unknown>;\n /** The previous cart state. You can overwrite the type by passing a generic */\n prevCart?: UserCart | DefaultCart;\n /** A function to publish an analytics event. */\n publish?: AnalyticsContextPublishForDoc;\n /** A function to register with the analytics provider. It holds the first browser load events until all registered key has executed the supplied `ready` function. [See example register usage](/docs/api/hydrogen/hooks/useanalytics#example-useanalytics.register). */\n register?: (key: string) => {ready: () => void};\n /** The shop configuration required to publish events to Shopify. */\n shop?: Promise<ShopAnalytics | null> | ShopAnalytics | null;\n /** A function to subscribe to analytics events. */\n subscribe?: AnalyticsContextSubscribeForDoc;\n};\n\ntype PublishPageView = (event: 'page_viewed', payload: PageViewPayload) => void;\ntype PublishProductView = (\n event: 'product_viewed',\n payload: ProductViewPayload,\n) => void;\ntype PublishCollectionView = (\n event: 'collection_viewed',\n payload: CollectionViewPayload,\n) => void;\ntype PublishCartView = (event: 'cart_viewed', payload: CartViewPayload) => void;\ntype PublishSearchView = (\n event: 'search_viewed',\n payload: SearchViewPayload,\n) => void;\ntype PublishCartUpdated = (\n event: 'cart_updated',\n payload: CartUpdatePayload,\n) => void;\ntype PublishProductAddedToCart = (\n event: 'product_added_to_cart',\n payload: CartLineUpdatePayload,\n) => void;\ntype PublishProductRemovedFromCart = (\n event: 'product_removed_from_cart',\n payload: CartLineUpdatePayload,\n) => void;\ntype PublishCustomEvent = (\n event: `custom_${string}`,\n payload: OtherData,\n) => void;\n\nexport type AnalyticsContextPublishForDoc =\n | PublishPageView\n | PublishProductView\n | PublishCollectionView\n | PublishCartView\n | PublishSearchView\n | PublishCartUpdated\n | PublishProductAddedToCart\n | PublishProductRemovedFromCart\n | PublishCustomEvent;\n\ntype SubscribePageView = (\n event: 'page_viewed',\n callback: (payload: PageViewPayload) => void,\n) => void;\ntype SubscribeProductView = (\n event: 'product_viewed',\n callback: (payload: ProductViewPayload) => void,\n) => void;\ntype SubscribeCollectionView = (\n event: 'collection_viewed',\n callback: (payload: CollectionViewPayload) => void,\n) => void;\ntype SubscribeCartView = (\n event: 'cart_viewed',\n callback: (payload: CartViewPayload) => void,\n) => void;\ntype SubscribeSearchView = (\n event: 'search_viewed',\n callback: (payload: SearchViewPayload) => void,\n) => void;\ntype SubscribeCartUpdated = (\n event: 'cart_updated',\n callback: (payload: CartUpdatePayload) => void,\n) => void;\ntype SubscribeProductAddedToCart = (\n event: 'product_added_to_cart',\n callback: (payload: CartLineUpdatePayload) => void,\n) => void;\ntype SubscribeProductRemovedFromCart = (\n event: 'product_removed_from_cart',\n callback: (payload: CartLineUpdatePayload) => void,\n) => void;\ntype SubscribeCustomEvent = (\n event: `custom_${string}`,\n callback: (payload: OtherData) => void,\n) => void;\n\nexport type AnalyticsContextSubscribeForDoc =\n | SubscribePageView\n | SubscribeProductView\n | SubscribeCollectionView\n | SubscribeCartView\n | SubscribeSearchView\n | SubscribeCartUpdated\n | SubscribeProductAddedToCart\n | SubscribeProductRemovedFromCart\n | SubscribeCustomEvent;\n","import {SHOPIFY_CLIENT_IP_SIG_HEADER} from '../constants';\nimport type {StorefrontHeaders} from '../types';\n\nexport type CrossRuntimeRequest = {\n url?: string;\n method?: string;\n headers: {\n get?: (key: string) => string | null | undefined;\n [key: string]: any;\n };\n};\n\nexport function getHeader(request: CrossRuntimeRequest, key: string) {\n return getHeaderValue(request.headers, key);\n}\n\nexport function getHeaderValue(\n headers: CrossRuntimeRequest['headers'],\n key: string,\n) {\n const value = headers?.get?.(key) ?? headers?.[key];\n return typeof value === 'string' ? value : null;\n}\n\nexport function getDebugHeaders(request?: CrossRuntimeRequest) {\n return {\n requestId: request ? getHeader(request, 'request-id') : undefined,\n purpose: request ? getHeader(request, 'purpose') : undefined,\n };\n}\n\n/**\n * Extracts relevant Storefront headers from the given Oxygen request.\n */\nexport function getStorefrontHeaders(\n request: CrossRuntimeRequest,\n): StorefrontHeaders {\n return {\n requestGroupId: getHeader(request, 'request-id'),\n buyerIp: getHeader(request, 'oxygen-buyer-ip'),\n buyerIpSig: getHeader(request, SHOPIFY_CLIENT_IP_SIG_HEADER),\n cookie: getHeader(request, 'cookie'),\n // sec-purpose is added by browsers automatically when using link/prefetch or Speculation Rules\n purpose: getHeader(request, 'sec-purpose') || getHeader(request, 'purpose'),\n };\n}\n\n/** Regular expression to match Storefront API GraphQL endpoint paths */\nexport const SFAPI_RE = /^\\/api\\/(unstable|2\\d{3}-\\d{2})\\/graphql\\.json$/;\n\nexport const getSafePathname = (url: string) => {\n try {\n return new URL(url, 'http://e.c').pathname;\n } catch {\n return '/';\n }\n};\n\nexport function extractHeaders(\n extract: (key: string) => string | undefined | null,\n keys: string[],\n) {\n return keys.reduce<[string, string][]>((acc, key) => {\n const forwardedValue = extract(key);\n if (forwardedValue) acc.push([key, forwardedValue]);\n return acc;\n }, []);\n}\n","/**\n * Ensures that the error of an async rejected promise\n * contains the entire synchronous stack trace.\n */\nexport function withSyncStack<T>(\n promise: Promise<T>,\n options: {\n stackOffset?: number;\n logErrors?: boolean | ((error?: Error) => boolean);\n } = {},\n): Promise<T> {\n const syncError = new Error();\n const getSyncStack = (message: string, name = 'Error') => {\n // Remove error message, caller function and current function from the stack.\n const syncStack = (syncError.stack ?? '')\n .split('\\n')\n .slice(3 + (options.stackOffset ?? 0))\n .join('\\n')\n // Sometimes stack traces show loaders with a number suffix due to ESBuild.\n .replace(/ at loader(\\d+) \\(/, (all, m1) => all.replace(m1, ''));\n\n return `${name}: ${message}\\n` + syncStack;\n };\n\n return promise\n .then((result: any) => {\n if (result?.errors && Array.isArray(result.errors)) {\n const logErrors =\n typeof options.logErrors === 'function'\n ? options.logErrors\n : () => options.logErrors ?? false;\n\n result.errors.forEach((error: Error) => {\n if (error) {\n error.stack = getSyncStack(error.message, error.name);\n if (logErrors(error)) console.error(error);\n }\n });\n }\n\n return result;\n })\n .catch((error: Error) => {\n if (error) error.stack = getSyncStack(error.message, error.name);\n throw error;\n });\n}\n\nexport type StackInfo = {\n file?: string;\n func?: string;\n line?: number;\n column?: number;\n};\n\n/**\n * Finds the stack line of a caller function without using sourcemaps.\n * @param {number} stackOffset - The number of stack frames to skip.\n * @returns {StackInfo | undefined}\n */\nexport const getCallerStackLine =\n process.env.NODE_ENV === 'development'\n ? (stackOffset = 0) => {\n let stackInfo: StackInfo | undefined = undefined;\n const original = Error.prepareStackTrace;\n\n // Accessing sourcemaps slows down execution time significantly.\n // Overwrite the prepareStackTrace function to avoid accessing\n // sourcemaps and just store what we need.\n Error.prepareStackTrace = (_, callsites) => {\n // The first callsite is `getCallerStackLine` itself.\n // The second one is the immediate caller function (e.g. `withCache`).\n // Skip both and find the first ancestor.\n const cs = callsites[2 + stackOffset];\n\n stackInfo = cs && {\n file: cs.getFileName() ?? undefined,\n func: cs.getFunctionName() ?? undefined,\n line: cs.getLineNumber() ?? undefined,\n column: cs.getColumnNumber() ?? undefined,\n };\n\n return '';\n };\n\n // Create and access stack to run the previous function\n const err = {stack: ''};\n Error.captureStackTrace(err);\n err.stack;\n\n Error.prepareStackTrace = original;\n\n return stackInfo as StackInfo | undefined;\n }\n : undefined;\n","/**\n * Override options for a cache strategy.\n */\nexport interface AllCacheOptions {\n /**\n * The caching mode, generally `public`, `private`, or `no-store`.\n */\n mode?: string;\n /**\n * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage).\n */\n maxAge?: number;\n /**\n * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate).\n */\n staleWhileRevalidate?: number;\n /**\n * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage).\n */\n sMaxAge?: number;\n /**\n * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error).\n */\n staleIfError?: number;\n}\n\n/**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data. Or use one of the pre-defined caching strategies: CacheNone, CacheShort, CacheLong.\n */\nexport type CachingStrategy = AllCacheOptions;\n\nexport type NoStoreStrategy = {\n mode: string;\n};\n\nconst PUBLIC = 'public';\nconst PRIVATE = 'private';\nexport const NO_STORE = 'no-store';\n\nconst optionMapping: {\n [key: string]: string;\n} = {\n maxAge: 'max-age',\n staleWhileRevalidate: 'stale-while-revalidate',\n sMaxAge: 's-maxage',\n staleIfError: 'stale-if-error',\n};\n\nexport function generateCacheControlHeader(\n cacheOptions: CachingStrategy,\n): string {\n const cacheControl: string[] = [];\n Object.keys(cacheOptions).forEach((key: string) => {\n if (key === 'mode') {\n cacheControl.push(cacheOptions[key] as string);\n } else if (optionMapping[key]) {\n cacheControl.push(\n `${optionMapping[key]}=${cacheOptions[key as keyof CachingStrategy]}`,\n );\n }\n });\n return cacheControl.join(', ');\n}\n\n/**\n *\n * @public\n */\nexport function CacheNone(): NoStoreStrategy {\n return {\n mode: NO_STORE,\n };\n}\n\nfunction guardExpirableModeType(overrideOptions?: CachingStrategy) {\n if (\n overrideOptions?.mode &&\n overrideOptions?.mode !== PUBLIC &&\n overrideOptions?.mode !== PRIVATE\n ) {\n throw Error(\"'mode' must be either 'public' or 'private'\");\n }\n}\n\n/**\n *\n * @public\n */\nexport function CacheShort(overrideOptions?: CachingStrategy): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 1,\n staleWhileRevalidate: 9,\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @public\n */\nexport function CacheLong(overrideOptions?: CachingStrategy): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 3600, // 1 hour\n staleWhileRevalidate: 82800, // 23 Hours\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @private\n */\nexport function CacheDefault(\n overrideOptions?: CachingStrategy,\n): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 1,\n staleWhileRevalidate: 86399, // 1 second less than 24 hours\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @public\n */\nexport function CacheCustom(overrideOptions: CachingStrategy): AllCacheOptions {\n return overrideOptions as AllCacheOptions;\n}\n","export function parseJSON(json: any) {\n if (String(json).includes('__proto__')) return JSON.parse(json, noproto);\n return JSON.parse(json);\n}\nfunction noproto(k: string, v: string) {\n if (k !== '__proto__') return v;\n}\n","import type {CachingStrategy} from './strategies';\nimport {CacheDefault, generateCacheControlHeader} from './strategies';\n\nfunction logCacheApiStatus(\n status: string | null,\n request: Request,\n response?: Response,\n) {\n // const url = request.url;\n // if (!/Product\\(/.test(url)) return;\n // // eslint-disable-next-line no-console\n // console.log(status, 'cacheKey', url.substring(0, 50));\n // if (response) {\n // let headersJson: Record<string, string> = {};\n // response.headers.forEach((value, key) => {\n // headersJson[key] = value;\n // });\n // const responseDate = response.headers.get('cache-put-date');\n // if (responseDate) {\n // const [age] = calculateAge(response, responseDate);\n // headersJson['age'] = age.toString();\n // }\n // // eslint-disable-next-line no-console\n // console.log(`${status} response headers: `, headersJson);\n // }\n}\n\nfunction getCacheControlSetting(\n userCacheOptions?: CachingStrategy,\n options?: CachingStrategy,\n): CachingStrategy {\n if (userCacheOptions && options) {\n return {\n ...userCacheOptions,\n ...options,\n };\n } else {\n return userCacheOptions || CacheDefault();\n }\n}\n\nfunction generateDefaultCacheControlHeader(\n userCacheOptions?: CachingStrategy,\n): string {\n return generateCacheControlHeader(getCacheControlSetting(userCacheOptions));\n}\n\n/**\n * Get an item from the cache. If a match is found, returns a tuple\n * containing the `JSON.parse` version of the response as well\n * as the response itself so it can be checked for staleness.\n */\nasync function getItem(\n cache: Cache,\n request: Request,\n): Promise<Response | undefined> {\n if (!cache) return;\n\n const response = await cache.match(request);\n if (!response) {\n logCacheApiStatus('MISS', request);\n return;\n }\n\n logCacheApiStatus('HIT', request, response);\n\n return response;\n}\n\n/**\n * Put an item into the cache.\n */\nasync function setItem(\n cache: Cache,\n request: Request,\n response: Response,\n userCacheOptions: CachingStrategy,\n) {\n if (!cache) return;\n\n /**\n * We are manually managing staled request by adding this workaround.\n * Why? cache control header support is dependent on hosting platform\n *\n * For example:\n *\n * Cloudflare's Cache API does not support `stale-while-revalidate`.\n * Cloudflare cache control header has a very odd behaviour.\n * Say we have the following cache control header on a request:\n *\n * public, max-age=15, stale-while-revalidate=30\n *\n * When there is a cache.match HIT, the cache control header would become\n *\n * public, max-age=14400, stale-while-revalidate=30\n *\n * == `stale-while-revalidate` workaround ==\n * Update response max-age so that:\n *\n * max-age = max-age + stale-while-revalidate\n *\n * For example:\n *\n * public, max-age=1, stale-while-revalidate=9\n * |\n * V\n * public, max-age=10, stale-while-revalidate=9\n *\n * Store the following information in the response header:\n *\n * cache-put-date - Timestamp string of when this request is PUT into cache\n *\n * `isStale` function will use the above information to test for stale-ness of a cached response\n */\n\n const cacheControl = getCacheControlSetting(userCacheOptions);\n\n // The padded cache-control to mimic stale-while-revalidate\n const paddedCacheControlString = generateDefaultCacheControlHeader(\n getCacheControlSetting(cacheControl, {\n maxAge:\n (cacheControl.maxAge || 0) + (cacheControl.staleWhileRevalidate || 0),\n }),\n );\n // The cache-control we want to set on response\n const cacheControlString = generateDefaultCacheControlHeader(\n getCacheControlSetting(cacheControl),\n );\n\n // CF will override cache-control, so we need to keep a non-modified real-cache-control\n // cache-control is still necessary for mini-oxygen\n response.headers.set('cache-control', paddedCacheControlString);\n response.headers.set('real-cache-control', cacheControlString);\n response.headers.set('cache-put-date', String(Date.now()));\n\n logCacheApiStatus('PUT', request, response);\n await cache.put(request, response);\n}\n\nasync function deleteItem(cache: Cache, request: Request) {\n if (!cache) return;\n\n logCacheApiStatus('DELETE', request);\n await cache.delete(request);\n}\n\nfunction calculateAge(response: Response, responseDate: string) {\n const cacheControl = response.headers.get('real-cache-control');\n let responseMaxAge = 0;\n\n if (cacheControl) {\n const maxAgeMatch = cacheControl.match(/max-age=(\\d*)/);\n if (maxAgeMatch && maxAgeMatch.length > 1) {\n responseMaxAge = parseFloat(maxAgeMatch[1]);\n }\n }\n\n const ageInMs = Date.now() - Number(responseDate as string);\n return [ageInMs / 1000, responseMaxAge];\n}\n\n/**\n * Manually check the response to see if it's stale.\n */\nfunction isStale(request: Request, response: Response) {\n const responseDate = response.headers.get('cache-put-date');\n\n if (!responseDate) {\n return false;\n }\n\n const [age, responseMaxAge] = calculateAge(response, responseDate);\n const result = age > responseMaxAge;\n\n if (result) {\n logCacheApiStatus('STALE', request, response);\n }\n\n return result;\n}\n\n/**\n *\n * @private\n */\nexport const CacheAPI = {\n get: getItem,\n set: setItem,\n delete: deleteItem,\n generateDefaultCacheControlHeader,\n isStale,\n};\n","import {parseJSON} from '../utils/parse-json';\nimport {CacheAPI} from './api';\nimport {\n CacheDefault,\n type CachingStrategy,\n type AllCacheOptions,\n} from './strategies.js';\n\n/**\n * Wrapper Cache functions for sub queries\n */\n\n/**\n * Cache API is weird. We just need a full URL, so we make one up.\n */\nexport function getKeyUrl(key: string) {\n return `https://shopify.dev/?${key}`;\n}\n\nfunction getCacheOption(userCacheOptions?: CachingStrategy): AllCacheOptions {\n return userCacheOptions || CacheDefault();\n}\n\nexport function generateSubRequestCacheControlHeader(\n userCacheOptions?: CachingStrategy,\n): string {\n return CacheAPI.generateDefaultCacheControlHeader(\n getCacheOption(userCacheOptions),\n );\n}\n\n/**\n * Get an item from the cache. If a match is found, returns a tuple\n * containing the `JSON.parse` version of the response as well\n * as the response itself so it can be checked for staleness.\n * @private\n */\nexport async function getItemFromCache<T = any>(\n cache: Cache,\n key: string,\n): Promise<undefined | [T | string, Response]> {\n if (!cache) return;\n const url = getKeyUrl(key);\n const request = new Request(url);\n\n const response = await CacheAPI.get(cache, request);\n\n if (!response) {\n return;\n }\n\n const text = await response.text();\n try {\n return [parseJSON(text), response];\n } catch {\n return [text, response];\n }\n}\n\n/**\n * Put an item into the cache.\n * @private\n */\nexport async function setItemInCache(\n cache: Cache,\n key: string,\n value: any,\n userCacheOptions?: CachingStrategy,\n) {\n if (!cache) return;\n\n const url = getKeyUrl(key);\n const request = new Request(url);\n const response = new Response(JSON.stringify(value));\n\n await CacheAPI.set(\n cache,\n request,\n response,\n getCacheOption(userCacheOptions),\n );\n}\n\n/**\n *\n * @private\n */\nexport async function deleteItemFromCache(cache: Cache, key: string) {\n if (!cache) return;\n\n const url = getKeyUrl(key);\n const request = new Request(url);\n\n await CacheAPI.delete(cache, request);\n}\n\n/**\n * Manually check the response to see if it's stale.\n * @private\n */\nexport function isStale(key: string, response: Response) {\n return CacheAPI.isStale(new Request(getKeyUrl(key)), response);\n}\n","type QueryKey = string | readonly unknown[];\n\nexport function hashKey(queryKey: QueryKey): string {\n const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];\n let hash = '';\n\n // Keys could be in the following shape:\n //\n // From `storefront.query`:\n // ['api-endpoint', 'method', 'headers', 'query']\n //\n // From `createWithCache`:\n // ['string', {}, 1, []]\n for (const key of rawKeys) {\n if (key != null) {\n if (typeof key === 'object') {\n hash += JSON.stringify(key);\n } else {\n hash += key.toString();\n }\n }\n }\n\n return encodeURIComponent(hash);\n}\n","import {\n NO_STORE,\n CacheShort,\n generateCacheControlHeader,\n type CachingStrategy,\n} from './strategies';\nimport {\n getItemFromCache,\n getKeyUrl,\n isStale,\n setItemInCache,\n} from './sub-request';\nimport {type StackInfo} from '../utils/callsites';\nimport {hashKey} from '../utils/hash';\nimport type {WaitUntil} from '../types';\n\n/**\n * The cache key is used to uniquely identify a value in the cache.\n */\nexport type CacheKey = string | readonly unknown[];\n\nexport type DebugOptions = {\n url?: string;\n requestId?: string | null;\n graphql?: string | null;\n purpose?: string | null;\n stackInfo?: StackInfo;\n displayName?: string;\n};\n\ntype CachedDebugInfo = {\n displayName?: string;\n url?: string;\n responseInit?: {\n status: number;\n statusText: string;\n headers?: [string, string][];\n };\n};\n\nexport type AddDebugDataParam = {\n displayName?: string;\n response?: Pick<Response, 'url' | 'status' | 'statusText' | 'headers'>;\n};\n\nexport type CacheActionFunctionParam = {\n addDebugData: (info: AddDebugDataParam) => void;\n};\n\ntype WithCacheOptions<T = unknown> = {\n strategy?: CachingStrategy | null;\n cacheInstance?: Cache;\n shouldCacheResult: (value: T) => boolean;\n waitUntil?: WaitUntil;\n debugInfo?: DebugOptions;\n};\n\n// Lock to prevent revalidating the same sub-request\n// in the same isolate. Note that different isolates\n// in the same colo could duplicate the revalidation\n// since this is only an in-memory lock.\n// https://github.com/Shopify/oxygen-platform/issues/625\nconst swrLock = new Set<string>();\n\n/**\n * Implementation of withCache.\n * @private\n */\nexport async function runWithCache<T = unknown>(\n cacheKey: CacheKey,\n actionFn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n {\n strategy = CacheShort(),\n cacheInstance,\n shouldCacheResult = () => true,\n waitUntil,\n debugInfo,\n }: WithCacheOptions<T>,\n): Promise<T> {\n const startTime = Date.now();\n const key = hashKey([\n // '__HYDROGEN_CACHE_ID__', // TODO purgeQueryCacheOnBuild\n ...(typeof cacheKey === 'string' ? [cacheKey] : cacheKey),\n ]);\n\n let cachedDebugInfo: CachedDebugInfo | undefined;\n let userDebugInfo: CachedDebugInfo | undefined;\n\n const addDebugData = (info: AddDebugDataParam) => {\n userDebugInfo = {\n displayName: info.displayName,\n url: info.response?.url,\n responseInit: {\n status: info.response?.status || 0,\n statusText: info.response?.statusText || '',\n headers: Array.from(info.response?.headers.entries() || []),\n },\n };\n };\n\n const mergeDebugInfo = () => ({\n ...cachedDebugInfo,\n ...debugInfo,\n url:\n userDebugInfo?.url ||\n debugInfo?.url ||\n cachedDebugInfo?.url ||\n getKeyUrl(key),\n displayName:\n debugInfo?.displayName ||\n userDebugInfo?.displayName ||\n cachedDebugInfo?.displayName,\n });\n\n const logSubRequestEvent =\n process.env.NODE_ENV === 'development'\n ? ({\n result,\n cacheStatus,\n overrideStartTime,\n }: {\n result?: any;\n cacheStatus?: 'MISS' | 'HIT' | 'STALE' | 'PUT';\n overrideStartTime?: number;\n }) => {\n globalThis.__H2O_LOG_EVENT?.({\n ...mergeDebugInfo(),\n eventType: 'subrequest',\n startTime: overrideStartTime || startTime,\n endTime: Date.now(),\n cacheStatus,\n responsePayload: (result && result[0]) || result,\n responseInit: (result && result[1]) || userDebugInfo?.responseInit,\n cache: {\n status: cacheStatus,\n strategy: generateCacheControlHeader(strategy || {}),\n key,\n },\n waitUntil,\n });\n }\n : undefined;\n\n if (!cacheInstance || !strategy || strategy.mode === NO_STORE) {\n const result = await actionFn({addDebugData});\n // Log non-cached requests\n logSubRequestEvent?.({result});\n return result;\n }\n\n type CachedItem = {\n value: Awaited<T>;\n debugInfo?: CachedDebugInfo;\n };\n\n const storeInCache = (value: CachedItem['value']) =>\n setItemInCache(\n cacheInstance,\n key,\n {\n value,\n debugInfo:\n process.env.NODE_ENV === 'development' ? mergeDebugInfo() : undefined,\n } satisfies CachedItem,\n strategy,\n );\n\n const cachedItem = await getItemFromCache<CachedItem>(cacheInstance, key);\n // console.log('--- Cache', cachedItem ? 'HIT' : 'MISS');\n\n if (cachedItem && typeof cachedItem[0] !== 'string') {\n const [{value: cachedResult, debugInfo}, cacheInfo] = cachedItem;\n cachedDebugInfo = debugInfo;\n\n const cacheStatus = isStale(key, cacheInfo) ? 'STALE' : 'HIT';\n\n if (!swrLock.has(key) && cacheStatus === 'STALE') {\n swrLock.add(key);\n\n // Important: Run revalidation asynchronously.\n const revalidatingPromise = Promise.resolve().then(async () => {\n const revalidateStartTime = Date.now();\n try {\n const result = await actionFn({addDebugData});\n\n if (shouldCacheResult(result)) {\n await storeInCache(result);\n\n // Log PUT requests with the revalidate start time\n logSubRequestEvent?.({\n result,\n cacheStatus: 'PUT',\n overrideStartTime: revalidateStartTime,\n });\n }\n } catch (error: any) {\n if (error.message) {\n error.message = 'SWR in sub-request failed: ' + error.message;\n }\n\n console.error(error);\n } finally {\n swrLock.delete(key);\n }\n });\n\n // Asynchronously wait for it in workers\n waitUntil?.(revalidatingPromise);\n }\n\n // Log HIT/STALE requests\n logSubRequestEvent?.({\n result: cachedResult,\n cacheStatus,\n });\n\n return cachedResult;\n }\n\n const result = await actionFn({addDebugData});\n\n // Log MISS requests\n logSubRequestEvent?.({\n result,\n cacheStatus: 'MISS',\n });\n\n /**\n * Important: Do this async\n */\n if (shouldCacheResult(result)) {\n const cacheStoringPromise = Promise.resolve().then(async () => {\n const putStartTime = Date.now();\n await storeInCache(result);\n logSubRequestEvent?.({\n result,\n cacheStatus: 'PUT',\n overrideStartTime: putStartTime,\n });\n });\n\n waitUntil?.(cacheStoringPromise);\n }\n\n return result;\n}\n","import {CacheShort, CachingStrategy} from './strategies.js';\nimport {\n type CacheKey,\n runWithCache,\n type DebugOptions,\n} from './run-with-cache.js';\nimport type {WaitUntil} from '../types.js';\nimport {parseJSON} from '../utils/parse-json.js';\nimport {createGraphQLClient} from '@shopify/graphql-client';\n\nexport type FetchCacheOptions<T = any> = {\n cache?: CachingStrategy;\n cacheInstance?: Cache;\n cacheKey?: CacheKey;\n shouldCacheResponse: (body: T, response: Response) => boolean;\n waitUntil?: WaitUntil;\n debugInfo?: DebugOptions;\n streamConfig?: {\n query: string;\n variables: Record<string, unknown>;\n };\n /** Called when fresh raw headers are received (skipped on cache hits) */\n onRawHeaders?: (headers: Headers) => void;\n};\n\ntype SerializableResponse = [any, ResponseInit];\n\n// Exclude headers that are not safe or useful to cache\n// since they are individual to each user session/request.\nconst excludedHeaders = ['set-cookie', 'server-timing'];\n\nfunction toSerializableResponse(\n body: any,\n response: Response,\n): SerializableResponse {\n return [\n body,\n {\n status: response.status,\n statusText: response.statusText,\n headers: [...response.headers].filter(\n ([key]) => !excludedHeaders.includes(key.toLowerCase()),\n ),\n },\n ];\n}\n\nfunction fromSerializableResponse([body, init]: SerializableResponse) {\n return [body, new Response(body, init)] as const;\n}\n\n/**\n * `fetch` equivalent that stores responses in cache.\n * Useful for calling third-party APIs that need to be cached.\n * @private\n */\nexport async function fetchWithServerCache<T = unknown>(\n url: string,\n requestInit: Request | RequestInit,\n {\n cacheInstance,\n cache: cacheOptions,\n cacheKey = [url, requestInit],\n shouldCacheResponse,\n waitUntil,\n debugInfo,\n streamConfig,\n onRawHeaders,\n }: FetchCacheOptions,\n): Promise<readonly [T, Response]> {\n if (!cacheOptions && (!requestInit.method || requestInit.method === 'GET')) {\n cacheOptions = CacheShort();\n }\n\n return runWithCache(\n cacheKey,\n async () => {\n if (streamConfig) {\n let rawResponse: Response | null = null;\n const client = createGraphQLClient({\n url,\n customFetchApi: async (\n url: string,\n options: RequestInit | undefined,\n ) => {\n rawResponse = await fetch(url, options);\n onRawHeaders?.(rawResponse.headers);\n return rawResponse;\n },\n headers: requestInit.headers as Record<string, string>,\n });\n\n const responseStream = await client.requestStream(streamConfig.query, {\n variables: streamConfig.variables,\n });\n\n let allData: unknown;\n let allErrors: unknown;\n\n for await (const response of responseStream) {\n const {data, errors} = response;\n allData = data;\n allErrors = errors?.graphQLErrors ?? errors;\n }\n\n if (!rawResponse!?.ok) {\n // Skip caching and consuming the response body\n return rawResponse!;\n }\n\n return toSerializableResponse(\n {data: allData, errors: allErrors},\n rawResponse!,\n );\n }\n\n const response = await fetch(url, requestInit);\n onRawHeaders?.(response.headers);\n\n if (!response.ok) {\n // Skip caching and consuming the response body\n return response;\n }\n\n let data: any = await response.text().catch(() => '');\n\n try {\n if (data) data = parseJSON(data);\n } catch {}\n\n return toSerializableResponse(data, response);\n },\n {\n cacheInstance,\n waitUntil,\n strategy: cacheOptions ?? null,\n debugInfo,\n shouldCacheResult: (payload) => {\n return 'ok' in payload\n ? false\n : shouldCacheResponse(...fromSerializableResponse(payload));\n },\n },\n ).then((payload) => {\n return 'ok' in payload\n ? ([null, payload] as const)\n : fromSerializableResponse(payload);\n });\n}\n","import {type CachingStrategy} from './strategies';\nimport {type CrossRuntimeRequest, getDebugHeaders} from '../utils/request';\nimport {getCallerStackLine} from '../utils/callsites';\nimport {\n CacheActionFunctionParam,\n CacheKey,\n runWithCache,\n} from './run-with-cache';\nimport {fetchWithServerCache} from './server-fetch';\nimport type {WaitUntil} from '../types';\n\ntype CreateWithCacheOptions = {\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil: WaitUntil;\n /** The `request` object is used by the Subrequest profiler, and to access certain headers for debugging */\n request: CrossRuntimeRequest;\n};\n\ntype WithCacheRunOptions<T> = {\n /** The cache key for this run */\n cacheKey: CacheKey;\n /**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data.\n * Or use one of the pre-defined caching strategies: [`CacheNone`](/docs/api/hydrogen/utilities/cachenone), [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort), [`CacheLong`](/docs/api/hydrogen/utilities/cachelong).\n */\n cacheStrategy: CachingStrategy;\n /** Useful to avoid accidentally caching bad results */\n shouldCacheResult: (value: T) => boolean;\n};\n\ntype WithCacheFetchOptions<T> = {\n displayName?: string;\n /**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data.\n * Or use one of the pre-defined caching strategies: [`CacheNone`](/docs/api/hydrogen/utilities/cachenone), [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort), [`CacheLong`](/docs/api/hydrogen/utilities/cachelong).\n */\n cacheStrategy?: CachingStrategy;\n /** The cache key for this fetch */\n cacheKey?: CacheKey;\n /** Useful to avoid e.g. caching a successful response that contains an error in the body */\n shouldCacheResponse: (body: T, response: Response) => boolean;\n};\n\nexport type WithCache = {\n run: <T>(\n options: WithCacheRunOptions<T>,\n fn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n ) => Promise<T>;\n fetch: <T>(\n url: string,\n requestInit: RequestInit,\n options: WithCacheFetchOptions<T>,\n ) => Promise<{data: T | null; response: Response}>;\n};\n\nexport function createWithCache(\n cacheOptions: CreateWithCacheOptions,\n): WithCache {\n const {cache, waitUntil, request} = cacheOptions;\n\n return {\n run: <T>(\n {cacheKey, cacheStrategy, shouldCacheResult}: WithCacheRunOptions<T>,\n fn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n ): Promise<T> => {\n return runWithCache(cacheKey, fn, {\n shouldCacheResult,\n strategy: cacheStrategy,\n cacheInstance: cache,\n waitUntil,\n debugInfo: {\n ...getDebugHeaders(request),\n stackInfo: getCallerStackLine?.(),\n },\n });\n },\n\n fetch: <T>(\n url: string,\n requestInit: RequestInit,\n options: WithCacheFetchOptions<T>,\n ): Promise<{data: T | null; response: Response}> => {\n return fetchWithServerCache<T | null>(url, requestInit ?? {}, {\n waitUntil,\n cacheKey: [url, requestInit],\n cacheInstance: cache,\n debugInfo: {\n url,\n ...getDebugHeaders(request),\n stackInfo: getCallerStackLine?.(),\n displayName: options?.displayName,\n },\n cache: options.cacheStrategy,\n ...options,\n }).then(([data, response]) => ({data, response}));\n },\n };\n}\n","type CacheMatch = {\n body: Uint8Array;\n timestamp: number;\n status: number;\n headers: [string, string][];\n};\n\n/**\n * This is a limited implementation of an in-memory cache.\n * It only supports the `cache-control` header.\n * It does NOT support `age` or `expires` headers.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Cache\n */\nexport class InMemoryCache implements Cache {\n #store: Map<string, CacheMatch>;\n\n constructor() {\n this.#store = new Map();\n }\n\n add(request: RequestInfo): Promise<void> {\n throw new Error('Method not implemented. Use `put` instead.');\n }\n\n addAll(requests: RequestInfo[]): Promise<void> {\n throw new Error('Method not implemented. Use `put` instead.');\n }\n\n matchAll(\n request?: RequestInfo,\n options?: CacheQueryOptions,\n ): Promise<readonly Response[]> {\n throw new Error('Method not implemented. Use `match` instead.');\n }\n\n async put(request: Request, response: Response) {\n if (request.method !== 'GET') {\n throw new TypeError('Cannot cache response to non-GET request.');\n }\n\n if (response.status === 206) {\n throw new TypeError(\n 'Cannot cache response to a range request (206 Partial Content).',\n );\n }\n\n if (response.headers.get('vary')?.includes('*')) {\n throw new TypeError(\"Cannot cache response with 'Vary: *' header.\");\n }\n\n this.#store.set(request.url, {\n body: new Uint8Array(await response.arrayBuffer()),\n status: response.status,\n headers: [...response.headers],\n timestamp: Date.now(),\n });\n }\n\n async match(request: Request) {\n if (request.method !== 'GET') return;\n\n const match = this.#store.get(request.url);\n\n if (!match) {\n return;\n }\n\n const {body, timestamp, ...metadata} = match;\n\n const headers = new Headers(metadata.headers);\n const cacheControl =\n headers.get('cache-control') || headers.get('real-cache-control') || '';\n const maxAge = parseInt(\n cacheControl.match(/max-age=(\\d+)/)?.[1] || '0',\n 10,\n );\n const swr = parseInt(\n cacheControl.match(/stale-while-revalidate=(\\d+)/)?.[1] || '0',\n 10,\n );\n const age = (Date.now() - timestamp) / 1000;\n\n const isMiss = age > maxAge + swr;\n\n if (isMiss) {\n this.#store.delete(request.url);\n return;\n }\n\n const isStale = age > maxAge;\n\n headers.set('cache', isStale ? 'STALE' : 'HIT');\n headers.set('date', new Date(timestamp).toUTCString());\n\n return new Response(body as BodyInit, {\n status: metadata.status ?? 200,\n headers,\n });\n }\n\n async delete(request: Request) {\n if (this.#store.has(request.url)) {\n this.#store.delete(request.url);\n return true;\n }\n return false;\n }\n\n keys(request?: Request) {\n const cacheKeys = [] as Request[];\n\n for (const url of this.#store.keys()) {\n if (!request || request.url === url) {\n cacheKeys.push(new Request(url));\n }\n }\n\n return Promise.resolve(cacheKeys);\n }\n}\n","import {type FetcherWithComponents, useFetcher} from 'react-router';\nimport {type MetafieldWithoutOwnerId} from './queries/cart-types';\nimport type {ReactNode} from 'react';\nimport type {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CartSelectedDeliveryOptionInput,\n Scalars,\n CartSelectableAddressInput,\n CartSelectableAddressUpdateInput,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\ntype OtherFormData = {\n [key: string]: unknown;\n};\n\ntype CartAttributesUpdateProps = {\n action: 'AttributesUpdateInput';\n inputs?: {\n attributes: AttributeInput[];\n } & OtherFormData;\n};\n\ntype CartAttributesUpdateRequire = {\n action: 'AttributesUpdateInput';\n inputs: {\n attributes: AttributeInput[];\n } & OtherFormData;\n};\n\ntype CartBuyerIdentityUpdateProps = {\n action: 'BuyerIdentityUpdate';\n inputs?: {\n buyerIdentity: CartBuyerIdentityInput;\n } & OtherFormData;\n};\n\ntype CartBuyerIdentityUpdateRequire = {\n action: 'BuyerIdentityUpdate';\n inputs: {\n buyerIdentity: CartBuyerIdentityInput;\n } & OtherFormData;\n};\n\ntype CartCreateProps = {\n action: 'Create';\n inputs?: {\n input: CartInput;\n } & OtherFormData;\n};\n\ntype CartCreateRequire = {\n action: 'Create';\n inputs: {\n input: CartInput;\n } & OtherFormData;\n};\n\ntype CartDiscountCodesUpdateProps = {\n action: 'DiscountCodesUpdate';\n inputs?: {\n discountCodes: string[];\n } & OtherFormData;\n};\n\ntype CartDiscountCodesUpdateRequire = {\n action: 'DiscountCodesUpdate';\n inputs: {\n discountCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesUpdateProps = {\n action: 'GiftCardCodesUpdate';\n inputs?: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesUpdateRequire = {\n action: 'GiftCardCodesUpdate';\n inputs: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesRemoveProps = {\n action: 'GiftCardCodesRemove';\n inputs?: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesRemoveRequire = {\n action: 'GiftCardCodesRemove';\n inputs: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\nexport type OptimisticCartLineInput = CartLineInput & {\n selectedVariant?: unknown;\n};\n\ntype CartLinesAddProps = {\n action: 'LinesAdd';\n inputs?: {\n lines: Array<OptimisticCartLineInput>;\n } & OtherFormData;\n};\n\ntype CartLinesAddRequire = {\n action: 'LinesAdd';\n inputs: {\n lines: Array<OptimisticCartLineInput>;\n } & OtherFormData;\n};\n\ntype CartLinesUpdateProps = {\n action: 'LinesUpdate';\n inputs?: {\n lines: CartLineUpdateInput[];\n } & OtherFormData;\n};\n\ntype CartLinesUpdateRequire = {\n action: 'LinesUpdate';\n inputs: {\n lines: CartLineUpdateInput[];\n } & OtherFormData;\n};\n\ntype CartLinesRemoveProps = {\n action: 'LinesRemove';\n inputs?: {\n lineIds: string[];\n } & OtherFormData;\n};\n\ntype CartLinesRemoveRequire = {\n action: 'LinesRemove';\n inputs: {\n lineIds: string[];\n } & OtherFormData;\n};\n\ntype CartNoteUpdateProps = {\n action: 'NoteUpdate';\n inputs?: {\n note: string;\n } & OtherFormData;\n};\n\ntype CartNoteUpdateRequire = {\n action: 'NoteUpdate';\n inputs: {\n note: string;\n } & OtherFormData;\n};\n\ntype CartSelectedDeliveryOptionsUpdateProps = {\n action: 'SelectedDeliveryOptionsUpdate';\n inputs?: {\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[];\n } & OtherFormData;\n};\n\ntype CartSelectedDeliveryOptionsUpdateRequire = {\n action: 'SelectedDeliveryOptionsUpdate';\n inputs: {\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[];\n } & OtherFormData;\n};\n\ntype CartMetafieldsSetProps = {\n action: 'MetafieldsSet';\n inputs?: {\n metafields: MetafieldWithoutOwnerId[];\n } & OtherFormData;\n};\n\ntype CartMetafieldsSetRequire = {\n action: 'MetafieldsSet';\n inputs: {\n metafields: MetafieldWithoutOwnerId[];\n } & OtherFormData;\n};\n\ntype CartMetafieldDeleteProps = {\n action: 'MetafieldsDelete';\n inputs?: {\n key: Scalars['String']['input'];\n } & OtherFormData;\n};\n\ntype CartMetafieldDeleteRequire = {\n action: 'MetafieldsDelete';\n inputs: {\n key: Scalars['String']['input'];\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesAddProps = {\n action: 'DeliveryAddressesAdd';\n inputs?: {\n addresses: Array<CartSelectableAddressInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesAddRequire = {\n action: 'DeliveryAddressesAdd';\n inputs: {\n addresses: Array<CartSelectableAddressInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesRemoveProps = {\n action: 'DeliveryAddressesRemove';\n inputs?: {\n addressIds: Array<string> | Array<Scalars['ID']['input']>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesRemoveRequire = {\n action: 'DeliveryAddressesRemove';\n inputs: {\n addressIds: Array<string> | Array<Scalars['ID']['input']>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesUpdateProps = {\n action: 'DeliveryAddressesUpdate';\n inputs?: {\n addresses: Array<CartSelectableAddressUpdateInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesUpdateRequire = {\n action: 'DeliveryAddressesUpdate';\n inputs: {\n addresses: Array<CartSelectableAddressUpdateInput>;\n } & OtherFormData;\n};\n\ntype CartCustomProps = {\n action: `Custom${string}`;\n inputs?: Record<string, unknown>;\n};\n\ntype CartCustomRequire = {\n action: `Custom${string}`;\n inputs: Record<string, unknown>;\n};\n\ntype CartFormCommonProps = {\n /**\n * Children nodes of CartForm.\n * Children can be a render prop that receives the fetcher.\n */\n children: ReactNode | ((fetcher: FetcherWithComponents<any>) => ReactNode);\n /**\n * The route to submit the form to. Defaults to the current route.\n */\n route?: string;\n /**\n * Optional key to use for the fetcher.\n * @see https://remix.run/hooks/use-fetcher#key\n */\n fetcherKey?: string;\n};\n\ntype CartActionInputProps =\n | CartAttributesUpdateProps\n | CartBuyerIdentityUpdateProps\n | CartCreateProps\n | CartDiscountCodesUpdateProps\n | CartGiftCardCodesUpdateProps\n | CartGiftCardCodesRemoveProps\n | CartLinesAddProps\n | CartLinesUpdateProps\n | CartLinesRemoveProps\n | CartNoteUpdateProps\n | CartSelectedDeliveryOptionsUpdateProps\n | CartMetafieldsSetProps\n | CartMetafieldDeleteProps\n | CartDeliveryAddressesAddProps\n | CartDeliveryAddressesRemoveProps\n | CartDeliveryAddressesUpdateProps\n | CartCustomProps;\n\nexport type CartActionInput =\n | CartAttributesUpdateRequire\n | CartBuyerIdentityUpdateRequire\n | CartCreateRequire\n | CartDiscountCodesUpdateRequire\n | CartGiftCardCodesUpdateRequire\n | CartGiftCardCodesRemoveRequire\n | CartLinesAddRequire\n | CartLinesUpdateRequire\n | CartLinesRemoveRequire\n | CartNoteUpdateRequire\n | CartSelectedDeliveryOptionsUpdateRequire\n | CartMetafieldsSetRequire\n | CartMetafieldDeleteRequire\n | CartDeliveryAddressesAddRequire\n | CartDeliveryAddressesRemoveRequire\n | CartDeliveryAddressesUpdateRequire\n | CartCustomRequire;\n\ntype CartFormProps = CartActionInputProps & CartFormCommonProps;\n\nconst INPUT_NAME = 'cartFormInput';\n\nexport function CartForm({\n children,\n action,\n inputs,\n route,\n fetcherKey,\n}: CartFormProps): JSX.Element {\n const fetcher = useFetcher({key: fetcherKey});\n\n return (\n <fetcher.Form action={route || ''} method=\"post\">\n {(action || inputs) && (\n <input\n type=\"hidden\"\n name={INPUT_NAME}\n value={JSON.stringify({action, inputs})}\n />\n )}\n {typeof children === 'function' ? children(fetcher) : children}\n </fetcher.Form>\n );\n}\n\nCartForm.INPUT_NAME = INPUT_NAME;\n\nCartForm.ACTIONS = {\n AttributesUpdateInput: 'AttributesUpdateInput',\n BuyerIdentityUpdate: 'BuyerIdentityUpdate',\n Create: 'Create',\n DiscountCodesUpdate: 'DiscountCodesUpdate',\n GiftCardCodesUpdate: 'GiftCardCodesUpdate',\n GiftCardCodesRemove: 'GiftCardCodesRemove',\n LinesAdd: 'LinesAdd',\n LinesRemove: 'LinesRemove',\n LinesUpdate: 'LinesUpdate',\n NoteUpdate: 'NoteUpdate',\n SelectedDeliveryOptionsUpdate: 'SelectedDeliveryOptionsUpdate',\n MetafieldsSet: 'MetafieldsSet',\n MetafieldDelete: 'MetafieldDelete',\n DeliveryAddressesAdd: 'DeliveryAddressesAdd',\n DeliveryAddressesUpdate: 'DeliveryAddressesUpdate',\n DeliveryAddressesRemove: 'DeliveryAddressesRemove',\n} as const;\n\nfunction getFormInput(formData: FormData): CartActionInput {\n // Get all form data\n const data: Record<string, unknown> = {};\n for (const pair of formData.entries()) {\n const key = pair[0];\n const values = formData.getAll(key);\n\n data[key] = values.length > 1 ? values : pair[1];\n\n // Convert checkbox string values to boolean\n if (data[key] === 'on') {\n data[key] = true;\n } else if (data[key] === 'off') {\n data[key] = false;\n }\n }\n\n // Parse cartFormInput\n const {cartFormInput, ...otherData} = data;\n const {action, inputs}: CartActionInput = cartFormInput\n ? JSON.parse(String(cartFormInput))\n : {};\n\n return {\n action,\n inputs: {\n ...inputs,\n ...otherData,\n },\n } as unknown as CartActionInput;\n}\n\n/**\n * Converts form data into a CartActionInput object.\n *\n * This function takes a FormData object, extracts its entries, and constructs a CartActionInput object.\n * It parses the `cartFormInput` field if present and merges it with other form data.\n *\n * @param {FormData} formData - The form data to convert.\n * @returns {CartActionInput} - The resulting CartActionInput object.\n *\n * @example\n * const formData = new FormData();\n * formData.append('cartFormInput', JSON.stringify({ action: 'add', inputs: { productId: '123' } }));\n * formData.append('quantity', '2');\n * const cartActionInput = getFormInput(formData);\n * console.log(cartActionInput);\n * // Output: { action: 'add', inputs: { productId: '123', quantity: '2' } }\n */\nCartForm.getFormInput = getFormInput;\n","// @ts-ignore - worktop/cookie types not properly exported\nimport {parse} from 'worktop/cookie';\nimport {type CrossRuntimeRequest, getHeaderValue} from '../utils/request';\n\nexport const cartGetIdDefault = (\n requestHeaders: CrossRuntimeRequest['headers'],\n) => {\n const cookies = parse(getHeaderValue(requestHeaders, 'Cookie') || '');\n return () => {\n return cookies.cart ? `gid://shopify/Cart/${cookies.cart}` : undefined;\n };\n};\n","// @ts-ignore - worktop/cookie types not properly exported\nimport {stringify} from 'worktop/cookie';\n\nexport type CookieOptions = {\n maxage?: number;\n expires?: Date | number | string;\n samesite?: 'Lax' | 'Strict' | 'None';\n secure?: boolean;\n httponly?: boolean;\n domain?: string;\n path?: string;\n};\n\nexport const cartSetIdDefault = (cookieOptions?: CookieOptions) => {\n return (cartId: string) => {\n const headers = new Headers();\n headers.append(\n 'Set-Cookie',\n stringify('cart', cartId.split('/').pop() || '', {\n path: '/',\n ...cookieOptions,\n }),\n );\n return headers;\n };\n};\n","/*\n * Generate a UUID using crypto and fallback to Math.random if crypto is not available.\n */\nexport function generateUUID() {\n if (typeof crypto !== 'undefined' && !!crypto.randomUUID) {\n return crypto.randomUUID();\n } else {\n return `weak-${Math.random().toString(16).substring(2)}`;\n }\n}\n","export const LIB_VERSION = '2025.7.2';\n","import type {StorefrontApiResponseOk} from '@shopify/hydrogen-react';\nimport type {GenericVariables} from '@shopify/hydrogen-codegen';\n\nexport function extractQueryName(query: string) {\n return query.match(/(query|mutation)\\s+([^({]*)/)?.[0]?.trim();\n}\n\nexport function minifyQuery<T extends string>(string: T) {\n return string\n .replace(/\\s*#.*$/gm, '') // Remove GQL comments\n .replace(/\\s+/gm, ' ') // Minify spaces\n .trim() as T;\n}\n\nconst IS_QUERY_RE = /(^|}\\s)query[\\s({]/im;\nconst IS_MUTATION_RE = /(^|}\\s)mutation[\\s({]/im;\n\nexport function assertQuery(query: string, callerName: string) {\n if (!IS_QUERY_RE.test(query)) {\n throw new Error(`[h2:error:${callerName}] Can only execute queries`);\n }\n}\n\nexport function assertMutation(query: string, callerName: string) {\n if (!IS_MUTATION_RE.test(query)) {\n throw new Error(`[h2:error:${callerName}] Can only execute mutations`);\n }\n}\n\nexport type GraphQLApiResponse<T> = StorefrontApiResponseOk<T>;\n\nexport type GraphQLErrorOptions<T> = {\n url: string;\n response: Response;\n errors: GraphQLApiResponse<T>['errors'];\n type: 'query' | 'mutation';\n query: string;\n queryVariables: GenericVariables;\n ErrorConstructor?: ErrorConstructor;\n client?: string;\n};\n\n// Reference: https://github.com/graphql/graphql-js/blob/main/src/error/GraphQLError.ts#L218-L242\nexport class GraphQLError extends Error {\n /**\n * If an error can be associated to a particular point in the requested\n * GraphQL document, it should contain a list of locations.\n */\n locations?: Array<{line: number; column: number}>;\n /**\n * If an error can be associated to a particular field in the GraphQL result,\n * it _must_ contain an entry with the key `path` that details the path of\n * the response field which experienced the error. This allows clients to\n * identify whether a null result is intentional or caused by a runtime error.\n */\n path?: Array<string | number>;\n /**\n * Reserved for implementors to extend the protocol however they see fit,\n * and hence there are no additional restrictions on its contents.\n */\n extensions?: {[key: string]: unknown};\n\n constructor(\n message?: string,\n options: Pick<\n GraphQLError,\n 'locations' | 'path' | 'extensions' | 'stack' | 'cause'\n > & {\n query?: string;\n queryVariables?: GenericVariables;\n requestId?: string | null;\n clientOperation?: string;\n } = {},\n ) {\n const h2Prefix = options.clientOperation\n ? `[h2:error:${options.clientOperation}] `\n : '';\n\n const enhancedMessage =\n h2Prefix +\n message +\n (options.requestId ? ` - Request ID: ${options.requestId}` : '');\n\n super(enhancedMessage);\n this.name = 'GraphQLError';\n this.extensions = options.extensions;\n this.locations = options.locations;\n this.path = options.path;\n this.stack = options.stack || undefined;\n\n try {\n this.cause = JSON.stringify({\n ...(typeof options.cause === 'object' ? options.cause : {}),\n requestId: options.requestId,\n ...(process.env.NODE_ENV === 'development' && {\n path: options.path,\n extensions: options.extensions,\n graphql: h2Prefix &&\n options.query && {\n query: options.query,\n variables: JSON.stringify(options.queryVariables),\n },\n }),\n });\n } catch {\n if (options.cause) this.cause = options.cause;\n }\n }\n\n get [Symbol.toStringTag]() {\n return this.name;\n }\n\n /**\n * Note: `toString()` is internally used by `console.log(...)` / `console.error(...)`\n * when ingesting logs in Oxygen production. Therefore, we want to make sure that\n * the error message is as informative as possible instead of `[object Object]`.\n */\n override toString() {\n let result = `${this.name}: ${this.message}`;\n\n if (this.path) {\n try {\n result += ` | path: ${JSON.stringify(this.path)}`;\n } catch {}\n }\n\n if (this.extensions) {\n try {\n result += ` | extensions: ${JSON.stringify(this.extensions)}`;\n } catch {}\n }\n\n result += '\\n';\n\n if (this.stack) {\n // Remove the message line from the stack.\n result += `${this.stack.slice(this.stack.indexOf('\\n') + 1)}\\n`;\n }\n\n return result;\n }\n\n /**\n * Note: toJSON` is internally used by `JSON.stringify(...)`.\n * The most common scenario when this error instance is going to be stringified is\n * when it's passed to Remix' `json` and `defer` functions: e.g. `{promise: storefront.query(...)}`.\n * In this situation, we don't want to expose private error information to the browser so we only\n * do it in development.\n */\n toJSON() {\n const formatted: Pick<\n GraphQLError,\n 'name' | 'message' | 'path' | 'extensions' | 'locations' | 'stack'\n > = {name: 'Error', message: ''};\n\n if (process.env.NODE_ENV === 'development') {\n formatted.name = this.name;\n formatted.message = 'Development: ' + this.message;\n if (this.path) formatted.path = this.path;\n if (this.locations) formatted.locations = this.locations;\n if (this.extensions) formatted.extensions = this.extensions;\n // Skip stack on purpose because we don't want to expose it to the browser.\n }\n\n return formatted;\n }\n}\n\nexport function throwErrorWithGqlLink<T>({\n url,\n response,\n errors,\n type,\n query,\n queryVariables,\n ErrorConstructor = Error,\n client = 'storefront',\n}: GraphQLErrorOptions<T>): never {\n const errorMessage =\n (typeof errors === 'string'\n ? errors\n : errors?.map?.((error) => error.message).join('\\n')) ||\n `URL: ${url}\\nAPI response error: ${response.status}`;\n\n const gqlError = new GraphQLError(errorMessage, {\n query,\n queryVariables,\n cause: {errors},\n clientOperation: `${client}.${type}`,\n requestId: response.headers.get('x-request-id'),\n });\n\n throw new ErrorConstructor(gqlError.message, {cause: gqlError.cause});\n}\n","import {\n createStorefrontClient as createStorefrontUtilities,\n SHOPIFY_STOREFRONT_ID_HEADER,\n SHOPIFY_STOREFRONT_Y_HEADER,\n SHOPIFY_STOREFRONT_S_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n type StorefrontClientProps,\n} from '@shopify/hydrogen-react';\nimport type {WritableDeep} from 'type-fest';\nimport {fetchWithServerCache} from './cache/server-fetch';\nimport {\n SDK_VARIANT_HEADER,\n SDK_VARIANT_SOURCE_HEADER,\n SDK_VERSION_HEADER,\n STOREFRONT_ACCESS_TOKEN_HEADER,\n STOREFRONT_REQUEST_GROUP_ID_HEADER,\n SHOPIFY_CLIENT_IP_HEADER,\n SHOPIFY_CLIENT_IP_SIG_HEADER,\n HYDROGEN_SERVER_TRACKING_KEY,\n} from './constants';\nimport {\n CacheNone,\n CacheLong,\n CacheShort,\n CacheDefault,\n CacheCustom,\n generateCacheControlHeader,\n type CachingStrategy,\n} from './cache/strategies';\nimport {generateUUID} from './utils/uuid';\nimport {parseJSON} from './utils/parse-json';\nimport {\n CountryCode,\n LanguageCode as StorefrontLanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {LanguageCode as CustomerLanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\nimport type {\n ClientReturn,\n ClientVariablesInRestParams,\n GenericVariables,\n} from '@shopify/hydrogen-codegen';\nimport {warnOnce} from './utils/warning';\nimport {LIB_VERSION} from './version';\nimport {\n minifyQuery,\n assertQuery,\n assertMutation,\n throwErrorWithGqlLink,\n GraphQLError,\n type GraphQLApiResponse,\n type GraphQLErrorOptions,\n} from './utils/graphql';\nimport {\n getCallerStackLine,\n withSyncStack,\n type StackInfo,\n} from './utils/callsites';\nimport type {WaitUntil, StorefrontHeaders} from './types';\nimport {extractHeaders, getSafePathname, SFAPI_RE} from './utils/request';\nimport {\n appendServerTimingHeader,\n extractServerTimingHeader,\n TrackedTimingsRecord,\n} from './utils/server-timing';\n\nexport type I18nBase = {\n language: StorefrontLanguageCode | CustomerLanguageCode;\n country: CountryCode;\n};\n\n// When passing GraphQLError through Remix' `json` or `defer`,\n// the class instance is lost and it becomes a plain JSON object.\n// Therefore, we need make TS think this is a plain object instead of\n// a class to make it work in server and client.\n// Also, Remix' `Jsonify` type is broken and can't infer types of classes properly.\ntype JsonGraphQLError = ReturnType<GraphQLError['toJSON']>; // Equivalent to `Jsonify<GraphQLError>[]`\nexport type StorefrontApiErrors = JsonGraphQLError[] | undefined;\n\ntype StorefrontError = {\n errors?: StorefrontApiErrors;\n};\n\n/**\n * Wraps all the returned utilities from `createStorefrontClient`.\n */\nexport type StorefrontClient<TI18n extends I18nBase> = {\n storefront: Storefront<TI18n>;\n};\n\n/**\n * Maps all the queries found in the project to variables and return types.\n */\nexport interface StorefrontQueries {\n // Example of how a generated query type looks like:\n // '#graphql query q1 {...}': {return: Q1Query; variables: Q1QueryVariables};\n}\n\n/**\n * Maps all the mutations found in the project to variables and return types.\n */\nexport interface StorefrontMutations {\n // Example of how a generated mutation type looks like:\n // '#graphql mutation m1 {...}': {return: M1Mutation; variables: M1MutationVariables};\n}\n\n// These are the variables that are automatically added to the storefront API.\n// We use this type to make parameters optional in storefront client\n// when these are the only variables that can be passed.\ntype AutoAddedVariableNames = 'country' | 'language';\n\ntype StorefrontCommonExtraParams = {\n headers?: HeadersInit;\n storefrontApiVersion?: string;\n displayName?: string;\n};\n\n/**\n * Interface to interact with the Storefront API.\n */\nexport type Storefront<TI18n extends I18nBase = I18nBase> = {\n query: <\n OverrideReturnType extends any = never,\n RawGqlString extends string = string,\n >(\n query: RawGqlString,\n ...options: ClientVariablesInRestParams<\n StorefrontQueries,\n RawGqlString,\n StorefrontCommonExtraParams & Pick<StorefrontQueryOptions, 'cache'>,\n AutoAddedVariableNames\n >\n ) => Promise<\n ClientReturn<StorefrontQueries, RawGqlString, OverrideReturnType> &\n StorefrontError\n >;\n mutate: <\n OverrideReturnType extends any = never,\n RawGqlString extends string = string,\n >(\n mutation: RawGqlString,\n ...options: ClientVariablesInRestParams<\n StorefrontMutations,\n RawGqlString,\n StorefrontCommonExtraParams,\n AutoAddedVariableNames\n >\n ) => Promise<\n ClientReturn<StorefrontMutations, RawGqlString, OverrideReturnType> &\n StorefrontError\n >;\n cache?: Cache;\n CacheNone: typeof CacheNone;\n CacheLong: typeof CacheLong;\n CacheShort: typeof CacheShort;\n CacheCustom: typeof CacheCustom;\n generateCacheControlHeader: typeof generateCacheControlHeader;\n getPublicTokenHeaders: ReturnType<\n typeof createStorefrontUtilities\n >['getPublicTokenHeaders'];\n getPrivateTokenHeaders: ReturnType<\n typeof createStorefrontUtilities\n >['getPrivateTokenHeaders'];\n getShopifyDomain: ReturnType<\n typeof createStorefrontUtilities\n >['getShopifyDomain'];\n getApiUrl: ReturnType<\n typeof createStorefrontUtilities\n >['getStorefrontApiUrl'];\n i18n: TI18n;\n getHeaders: () => Record<string, string>;\n /**\n * Checks if the request URL matches the Storefront API GraphQL endpoint.\n */\n isStorefrontApiUrl: (request: {url?: string}) => boolean;\n /**\n * Forwards the request to the Storefront API.\n * It reads the API version from the request URL.\n */\n forward: (\n request: Request,\n options?: Pick<StorefrontCommonExtraParams, 'storefrontApiVersion'>,\n ) => Promise<Response>;\n /**\n * Sets the collected subrequest headers in the response.\n * Useful to forward the cookies and server-timing headers\n * from server subrequests to the browser.\n */\n setCollectedSubrequestHeaders: (response: {headers: Headers}) => void;\n};\n\ntype HydrogenClientProps<TI18n> = {\n /** Storefront API headers. If on Oxygen, use `getStorefrontHeaders()` */\n storefrontHeaders?: StorefrontHeaders;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The globally unique identifier for the Shop */\n storefrontId?: string;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n};\n\nexport type CreateStorefrontClientOptions<TI18n extends I18nBase> =\n HydrogenClientProps<TI18n> & StorefrontClientProps;\n\ntype StorefrontQueryOptions = StorefrontCommonExtraParams & {\n query: string;\n mutation?: never;\n cache?: CachingStrategy;\n};\n\ntype StorefrontMutationOptions = StorefrontCommonExtraParams & {\n query?: never;\n mutation: string;\n cache?: never;\n};\n\nconst defaultI18n: I18nBase = {\n language: 'EN' as StorefrontLanguageCode,\n country: 'US' as CountryCode,\n};\n\n/**\n * This function extends `createStorefrontClient` from [Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient). The additional arguments enable internationalization (i18n), caching, and other features particular to Remix and Oxygen.\n *\n * Learn more about [data fetching in Hydrogen](/docs/custom-storefronts/hydrogen/data-fetching/fetch-data).\n */\nexport function createStorefrontClient<TI18n extends I18nBase>(\n options: CreateStorefrontClientOptions<TI18n>,\n): StorefrontClient<TI18n> {\n const {\n storefrontHeaders,\n cache,\n waitUntil,\n i18n,\n storefrontId,\n logErrors = true,\n ...clientOptions\n } = options;\n const H2_PREFIX_WARN = '[h2:warn:createStorefrontClient] ';\n\n if (process.env.NODE_ENV === 'development' && !cache) {\n warnOnce(\n H2_PREFIX_WARN +\n 'Storefront API client created without a cache instance. This may slow down your sub-requests.',\n );\n }\n\n const {\n getPublicTokenHeaders,\n getPrivateTokenHeaders,\n getStorefrontApiUrl,\n getShopifyDomain,\n } = createStorefrontUtilities(clientOptions);\n\n const getHeaders = clientOptions.privateStorefrontToken\n ? getPrivateTokenHeaders\n : getPublicTokenHeaders;\n\n const defaultHeaders = getHeaders({\n contentType: 'json',\n buyerIp: storefrontHeaders?.buyerIp || '',\n });\n\n if (storefrontHeaders?.buyerIp) {\n defaultHeaders[SHOPIFY_CLIENT_IP_HEADER] = storefrontHeaders.buyerIp;\n }\n\n if (storefrontHeaders?.buyerIpSig) {\n defaultHeaders[SHOPIFY_CLIENT_IP_SIG_HEADER] = storefrontHeaders.buyerIpSig;\n }\n\n defaultHeaders[STOREFRONT_REQUEST_GROUP_ID_HEADER] =\n storefrontHeaders?.requestGroupId || generateUUID();\n\n if (storefrontId) defaultHeaders[SHOPIFY_STOREFRONT_ID_HEADER] = storefrontId;\n if (LIB_VERSION) defaultHeaders['user-agent'] = `Hydrogen ${LIB_VERSION}`;\n\n const requestCookie = storefrontHeaders?.cookie ?? '';\n if (requestCookie) defaultHeaders['cookie'] = requestCookie;\n\n let uniqueToken: string | undefined;\n let visitToken: string | undefined;\n\n // If new cookies are not present, we need to check legacy cookies\n // or generate new tokens, which we pass in the headers. This ensures\n // we track the current session and SFAPI creates new cookies with\n // the given tokens for subsequent requests.\n if (!/\\b_shopify_(analytics|marketing)=/.test(requestCookie)) {\n const legacyUniqueToken = requestCookie.match(/\\b_shopify_y=([^;]+)/)?.[1];\n const legacyVisitToken = requestCookie.match(/\\b_shopify_s=([^;]+)/)?.[1];\n\n // These legacy headers might not be needed since they are already\n // passed via cookies, but it's better to be explicit just in case.\n if (legacyUniqueToken) {\n defaultHeaders[SHOPIFY_STOREFRONT_Y_HEADER] = legacyUniqueToken;\n }\n if (legacyVisitToken) {\n defaultHeaders[SHOPIFY_STOREFRONT_S_HEADER] = legacyVisitToken;\n }\n\n // Use legacy tokens if available for session migration, or generate\n // new ones and set them in the new headers to let SFAPI create\n // cookies and track the subrequests made in this session.\n uniqueToken = legacyUniqueToken ?? generateUUID();\n visitToken = legacyVisitToken ?? generateUUID();\n\n defaultHeaders[SHOPIFY_UNIQUE_TOKEN_HEADER] = uniqueToken;\n defaultHeaders[SHOPIFY_VISIT_TOKEN_HEADER] = visitToken;\n }\n\n let collectedSubrequestHeaders:\n | undefined\n | {\n serverTiming: string;\n setCookie: string[];\n };\n\n // Remove any headers that are identifiable to the user or request\n const cacheKeyHeader = JSON.stringify({\n 'content-type': defaultHeaders['content-type'],\n 'user-agent': defaultHeaders['user-agent'],\n [SDK_VARIANT_HEADER]: defaultHeaders[SDK_VARIANT_HEADER],\n [SDK_VARIANT_SOURCE_HEADER]: defaultHeaders[SDK_VARIANT_SOURCE_HEADER],\n [SDK_VERSION_HEADER]: defaultHeaders[SDK_VERSION_HEADER],\n [STOREFRONT_ACCESS_TOKEN_HEADER]:\n defaultHeaders[STOREFRONT_ACCESS_TOKEN_HEADER],\n });\n\n async function fetchStorefrontApi<T = any>({\n query,\n mutation,\n variables,\n cache: cacheOptions,\n headers = [],\n storefrontApiVersion,\n displayName,\n stackInfo,\n }: {variables?: GenericVariables; stackInfo?: StackInfo} & (\n | StorefrontQueryOptions\n | StorefrontMutationOptions\n )): Promise<T & StorefrontError> {\n const userHeaders =\n headers instanceof Headers\n ? Object.fromEntries(headers.entries())\n : Array.isArray(headers)\n ? Object.fromEntries(headers)\n : headers;\n\n const document = query ?? mutation;\n const queryVariables = {...variables};\n\n if (i18n) {\n if (!variables?.country && /\\$country/.test(document)) {\n queryVariables.country = i18n.country;\n }\n\n if (!variables?.language && /\\$language/.test(document)) {\n queryVariables.language = i18n.language;\n }\n }\n\n const url = getStorefrontApiUrl({storefrontApiVersion});\n const graphqlData = JSON.stringify({\n query: document,\n variables: queryVariables,\n });\n const requestInit = {\n method: 'POST',\n headers: {...defaultHeaders, ...userHeaders},\n body: graphqlData,\n } satisfies RequestInit;\n\n const cacheKey = [\n url,\n requestInit.method,\n cacheKeyHeader,\n requestInit.body,\n ];\n\n const streamConfig = document.includes('@defer')\n ? {\n query: document,\n variables: queryVariables,\n }\n : undefined;\n\n const [body, response] = await fetchWithServerCache(url, requestInit, {\n cacheInstance: mutation ? undefined : cache,\n cache: cacheOptions || CacheDefault(),\n cacheKey,\n waitUntil,\n // Check if the response body has GraphQL errors:\n // https://spec.graphql.org/June2018/#sec-Response-Format\n shouldCacheResponse: (body: any) => !body?.errors,\n // Optional information for the subrequest profiler:\n debugInfo: {\n requestId: requestInit.headers[STOREFRONT_REQUEST_GROUP_ID_HEADER],\n displayName,\n url,\n stackInfo,\n graphql: graphqlData,\n purpose: storefrontHeaders?.purpose,\n },\n streamConfig,\n onRawHeaders: (headers) => {\n // Set this the first time we get a fresh response (cache miss)\n // to increase the chance of returning it from the main server response.\n // Note: a server response needs its headers set at the time of sending,\n // while the body can be streamed later. Therefore, this value here\n // might not be used if subrequests are not over before the main response is sent.\n collectedSubrequestHeaders ??= {\n setCookie: headers.getSetCookie(),\n serverTiming: headers.get('server-timing') ?? '',\n };\n },\n });\n\n const errorOptions: GraphQLErrorOptions<T> = {\n url,\n response,\n type: mutation ? 'mutation' : 'query',\n query: document,\n queryVariables,\n errors: undefined,\n };\n\n if (!response.ok) {\n /**\n * The Storefront API might return a string error, or a JSON-formatted {error: string}.\n * We try both and conform them to a single {errors} format.\n */\n let errors;\n let bodyText = body;\n try {\n bodyText ??= await response.text();\n errors = parseJSON(bodyText);\n } catch (_e) {\n errors = [\n {message: bodyText ?? 'Could not parse Storefront API response'},\n ];\n }\n\n throwErrorWithGqlLink({...errorOptions, errors});\n }\n\n let {data, errors} = body as\n | GraphQLApiResponse<T>\n | {\n data: T;\n errors: NonNullable<GraphQLApiResponse<T>['errors']>[number];\n };\n\n errors = errors ? (Array.isArray(errors) ? errors : [errors]) : undefined;\n\n const gqlErrors = errors?.map(\n ({message, ...rest}) =>\n new GraphQLError(message, {\n ...(rest as WritableDeep<typeof rest>),\n clientOperation: `storefront.${errorOptions.type}`,\n requestId: response.headers.get('x-request-id'),\n queryVariables,\n query: document,\n }),\n );\n\n return formatAPIResult(data, gqlErrors);\n }\n\n return {\n storefront: {\n /**\n * Sends a GraphQL query to the Storefront API.\n *\n * Example:\n *\n * ```js\n * async function loader ({context: {storefront}}) {\n * const data = await storefront.query('query { ... }', {\n * variables: {},\n * cache: storefront.CacheLong()\n * });\n * }\n * ```\n */\n query(query, options?) {\n query = minifyQuery(query);\n assertQuery(query, 'storefront.query');\n\n const stackOffset = getStackOffset?.(query);\n\n return withSyncStack(\n fetchStorefrontApi({\n ...options,\n query,\n stackInfo: getCallerStackLine?.(stackOffset),\n }),\n {stackOffset, logErrors},\n );\n },\n /**\n * Sends a GraphQL mutation to the Storefront API.\n *\n * Example:\n *\n * ```js\n * async function loader ({context: {storefront}}) {\n * await storefront.mutate('mutation { ... }', {\n * variables: {},\n * });\n * }\n * ```\n */\n mutate(mutation, options?) {\n mutation = minifyQuery(mutation);\n assertMutation(mutation, 'storefront.mutate');\n\n const stackOffset = getStackOffset?.(mutation);\n\n return withSyncStack(\n fetchStorefrontApi({\n ...options,\n mutation,\n stackInfo: getCallerStackLine?.(stackOffset),\n }),\n {stackOffset, logErrors},\n );\n },\n cache,\n CacheNone,\n CacheLong,\n CacheShort,\n CacheCustom,\n generateCacheControlHeader,\n getPublicTokenHeaders,\n getPrivateTokenHeaders,\n getHeaders: () => ({...defaultHeaders}),\n getShopifyDomain,\n getApiUrl: getStorefrontApiUrl,\n i18n: (i18n ?? defaultI18n) as TI18n,\n\n /**\n * Checks if the request is targeting the Storefront API endpoint.\n */\n isStorefrontApiUrl(request) {\n return SFAPI_RE.test(getSafePathname(request.url ?? ''));\n },\n /**\n * Forwards the request to the Storefront API.\n */\n async forward(request, options) {\n const forwardedHeaders = new Headers([\n // Forward only a selected set of headers to the Storefront API\n // to avoid getting 403 errors due to unexpected headers.\n ...extractHeaders(\n (key) => request.headers.get(key),\n [\n 'accept',\n 'accept-encoding',\n 'accept-language',\n // Access-Control headers are used for CORS preflight requests.\n 'access-control-request-headers',\n 'access-control-request-method',\n 'content-type',\n 'content-length',\n 'cookie',\n 'origin',\n 'referer',\n 'user-agent',\n STOREFRONT_ACCESS_TOKEN_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n ],\n ),\n // Add some headers to help with geolocalization and debugging\n ...extractHeaders(\n (key) => defaultHeaders[key],\n [\n SHOPIFY_CLIENT_IP_HEADER,\n SHOPIFY_CLIENT_IP_SIG_HEADER,\n SHOPIFY_STOREFRONT_ID_HEADER,\n STOREFRONT_REQUEST_GROUP_ID_HEADER,\n ],\n ),\n ]);\n\n if (storefrontHeaders?.buyerIp) {\n // Good for proxies to inform about the original client IP\n forwardedHeaders.set('x-forwarded-for', storefrontHeaders.buyerIp);\n }\n\n const storefrontApiVersion =\n options?.storefrontApiVersion ??\n getSafePathname(request.url).match(SFAPI_RE)?.[1];\n\n const sfapiResponse = await fetch(\n getStorefrontApiUrl({storefrontApiVersion}),\n {\n method: request.method,\n body: request.body,\n headers: forwardedHeaders,\n },\n );\n\n // Create a new response to allow modifying headers\n return new Response(sfapiResponse.body, sfapiResponse);\n },\n\n setCollectedSubrequestHeaders: (response: {headers: Headers}) => {\n // Forward cookies\n if (collectedSubrequestHeaders) {\n for (const value of collectedSubrequestHeaders.setCookie) {\n response.headers.append('Set-Cookie', value);\n }\n }\n\n const serverTiming = extractServerTimingHeader(\n collectedSubrequestHeaders?.serverTiming,\n );\n\n const isDocumentResponse = response.headers\n .get('content-type')\n ?.startsWith('text/html');\n\n // Only fallback to generated tokens for HTML responses.\n // This ensures that non-HTML responses (e.g. JSON, React Router streaming)\n // don't get unexpected _y/_s values. These values might be used by the\n // browser to set cookies and track the user session if consent is allowed\n // by default in their store settings (otherwise these values are dropped).\n const fallbackValues = isDocumentResponse\n ? ({_y: uniqueToken, _s: visitToken} satisfies TrackedTimingsRecord)\n : undefined;\n\n // Forward tracking values via server-timing from subrequests,\n // and fallback to the ones generated in the current request.\n appendServerTimingHeader(response, {\n ...fallbackValues,\n ...serverTiming,\n } satisfies TrackedTimingsRecord);\n\n // Optimization: We set this flag to indicate that the tracking work was done\n // in the server to skip an extra request from the browser. Conditions:\n // If any of these conditions are not met, the browser will perform\n // a request to the SFAPI proxy to get all the necessary cookies and values.\n if (\n isDocumentResponse &&\n collectedSubrequestHeaders &&\n // _shopify_essential cookie is always set, but we need more than that\n collectedSubrequestHeaders.setCookie.length > 1 &&\n serverTiming?._y &&\n serverTiming?._s &&\n serverTiming?._cmp\n ) {\n // For all SF API requests (that aren't from cache), we expect _y and _s values, as well as the\n // _shopify_essential cookie to be returned. Even if we get responses from SF API requests that\n // are cache misses, we still may not get the _cmp value and the _shopify_marketing and _shopify_analytics cookies.\n // Therefore, even if we had >=1 non-cache hit SF API request, we may still need to make the browser\n // SF API request to the `consentManagement` endpoint in the SF API, which will give us the _cmp value\n // and set the _shopify_marketing and _shopify_analytics cookies if they are missing.\n appendServerTimingHeader(response, {\n [HYDROGEN_SERVER_TRACKING_KEY]: '1',\n });\n }\n },\n },\n };\n}\n\nconst getStackOffset =\n process.env.NODE_ENV === 'development'\n ? (query: string) => {\n let stackOffset = 0;\n if (/fragment CartApi(Query|Mutation) on Cart/.test(query)) {\n // The cart handler is wrapping storefront.query/mutate,\n // so we need to go up one more stack frame to show\n // the caller in /subrequest-profiler\n stackOffset = 1;\n }\n\n return stackOffset;\n }\n : undefined;\n\nexport function formatAPIResult<T>(\n data: T,\n errors: StorefrontApiErrors,\n): T & StorefrontError {\n return {\n ...data,\n ...(errors && {errors}),\n };\n}\n\nexport type CreateStorefrontClientForDocs<TI18n extends I18nBase> = {\n storefront?: StorefrontForDoc<TI18n>;\n};\n\nexport type StorefrontForDoc<TI18n extends I18nBase = I18nBase> = {\n /** The function to run a query on Storefront API. */\n query?: <TData = any>(\n query: string,\n options: StorefrontQueryOptionsForDocs,\n ) => Promise<TData & StorefrontError>;\n /** The function to run a mutation on Storefront API. */\n mutate?: <TData = any>(\n mutation: string,\n options: StorefrontMutationOptionsForDocs,\n ) => Promise<TData & StorefrontError>;\n /** The cache instance passed in from the `createStorefrontClient` argument. */\n cache?: Cache;\n /** Re-export of [`CacheNone`](/docs/api/hydrogen/utilities/cachenone). */\n CacheNone?: typeof CacheNone;\n /** Re-export of [`CacheLong`](/docs/api/hydrogen/utilities/cachelong). */\n CacheLong?: typeof CacheLong;\n /** Re-export of [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort). */\n CacheShort?: typeof CacheShort;\n /** Re-export of [`CacheCustom`](/docs/api/hydrogen/utilities/cachecustom). */\n CacheCustom?: typeof CacheCustom;\n /** Re-export of [`generateCacheControlHeader`](/docs/api/hydrogen/utilities/generatecachecontrolheader). */\n generateCacheControlHeader?: typeof generateCacheControlHeader;\n /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */\n getPublicTokenHeaders?: ReturnType<\n typeof createStorefrontUtilities\n >['getPublicTokenHeaders'];\n /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/\n getPrivateTokenHeaders?: ReturnType<\n typeof createStorefrontUtilities\n >['getPrivateTokenHeaders'];\n /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */\n getShopifyDomain?: ReturnType<\n typeof createStorefrontUtilities\n >['getShopifyDomain'];\n /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/\n getApiUrl?: ReturnType<\n typeof createStorefrontUtilities\n >['getStorefrontApiUrl'];\n /** The `i18n` object passed in from the `createStorefrontClient` argument. */\n i18n?: TI18n;\n};\n\nexport type StorefrontQueryOptionsForDocs = {\n /** The variables for the GraphQL query statement. */\n variables?: Record<string, unknown>;\n /** The cache strategy for this query. Default to max-age=1, stale-while-revalidate=86399. */\n cache?: CachingStrategy;\n /** Additional headers for this query. */\n headers?: HeadersInit;\n /** Override the Storefront API version for this query. */\n storefrontApiVersion?: string;\n /** The name of the query for debugging in the Subrequest Profiler. */\n displayName?: string;\n};\n\nexport type StorefrontMutationOptionsForDocs = {\n /** The variables for the GraphQL mutation statement. */\n variables?: Record<string, unknown>;\n /** Additional headers for this query. */\n headers?: HeadersInit;\n /** Override the Storefront API version for this query. */\n storefrontApiVersion?: string;\n /** The name of the query for debugging in the Subrequest Profiler. */\n displayName?: string;\n};\n","import {formatAPIResult} from '../../storefront';\nimport type {CustomerAccount} from '../../customer/types';\nimport type {CartQueryOptions, CartReturn} from './cart-types';\nimport type {\n Cart,\n CountryCode,\n LanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\ntype CartGetProps = {\n /**\n * The cart ID.\n * @default cart.getCartId();\n */\n cartId?: string;\n /**\n * The country code.\n * @default storefront.i18n.country\n */\n country?: CountryCode;\n /**\n * The language code.\n * @default storefront.i18n.language\n */\n language?: LanguageCode;\n /**\n * The number of cart lines to be returned.\n * @default 100\n */\n numCartLines?: number;\n};\n\nexport type CartGetFunction = (\n cartInput?: CartGetProps,\n) => Promise<CartReturn | null>;\n\ntype CartGetOptions = CartQueryOptions & {\n /**\n * The customer account client instance created by [`createCustomerAccountClient`](docs/api/hydrogen/latest/utilities/createcustomeraccountclient).\n */\n customerAccount?: CustomerAccount;\n};\n\nexport function cartGetDefault({\n storefront,\n customerAccount,\n getCartId,\n cartFragment,\n}: CartGetOptions): CartGetFunction {\n return async (cartInput?: CartGetProps) => {\n const cartId = getCartId();\n\n if (!cartId) return null;\n\n const [isCustomerLoggedIn, {cart, errors}] = await Promise.all([\n customerAccount ? customerAccount.isLoggedIn() : false,\n storefront.query<{cart: Cart | null}>(CART_QUERY(cartFragment), {\n variables: {cartId, ...cartInput},\n cache: storefront.CacheNone(),\n }),\n ]);\n\n if (isCustomerLoggedIn && cart?.checkoutUrl) {\n const finalCheckoutUrl = new URL(cart.checkoutUrl);\n finalCheckoutUrl.searchParams.set('logged_in', 'true');\n cart.checkoutUrl = finalCheckoutUrl.toString();\n }\n\n return cart || errors ? formatAPIResult(cart, errors) : null;\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/queries/cart\nconst CART_QUERY = (cartFragment = DEFAULT_CART_FRAGMENT) => `#graphql\n query CartQuery(\n $cartId: ID!\n $numCartLines: Int = 100\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cart(id: $cartId) {\n ...CartApiQuery\n }\n }\n\n ${cartFragment}\n`;\n\nexport const DEFAULT_CART_FRAGMENT = `#graphql\n fragment CartApiQuery on Cart {\n updatedAt\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPrice {\n ...CartApiMoney\n }\n price {\n ...CartApiMoney\n }\n requiresShipping\n title\n image {\n ...CartApiImage\n }\n product {\n handle\n title\n id\n vendor\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...CartApiMoney\n }\n totalAmount {\n ...CartApiMoney\n }\n totalDutyAmount {\n ...CartApiMoney\n }\n totalTaxAmount {\n ...CartApiMoney\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n applicable\n code\n }\n appliedGiftCards {\n id\n lastCharacters\n amountUsed {\n ...CartApiMoney\n }\n }\n }\n\n fragment CartApiMoney on MoneyV2 {\n currencyCode\n amount\n }\n\n fragment CartApiImage on Image {\n id\n url\n altText\n width\n height\n }\n`;\n","export const USER_ERROR_FRAGMENT = `#graphql\n fragment CartApiError on CartUserError {\n message\n field\n code\n }\n`;\n\nexport const MINIMAL_CART_FRAGMENT = `#graphql\n fragment CartApiMutation on Cart {\n id\n totalQuantity\n checkoutUrl\n }\n`;\n\nexport const CART_WARNING_FRAGMENT = `#graphql\n fragment CartApiWarning on CartWarning {\n code\n message\n target\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartQueryData,\n CartQueryOptions,\n CartOptionalInput,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {CartInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartCreateFunction = (\n input: CartInput,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartCreateDefault(\n options: CartQueryOptions,\n): CartCreateFunction {\n return async (input, optionalParams) => {\n const buyer = options.customerAccount\n ? await options.customerAccount.getBuyer()\n : undefined;\n const {cartId, ...restOfOptionalParams} = optionalParams || {};\n const {buyerIdentity, ...restOfInput} = input;\n const {cartCreate, errors} = await options.storefront.mutate<{\n cartCreate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_CREATE_MUTATION(options.cartFragment), {\n variables: {\n input: {\n ...restOfInput,\n buyerIdentity: {\n ...buyer,\n ...buyerIdentity,\n },\n },\n ...restOfOptionalParams,\n },\n });\n return formatAPIResult(cartCreate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate\nexport const CART_CREATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartCreate(\n $input: CartInput!\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartCreate(input: $input) {\n cart {\n ...CartApiMutation\n checkoutUrl\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import type {CartLineInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartLinesAddFunction = (\n lines: Array<CartLineInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesAddDefault(\n options: CartQueryOptions,\n): CartLinesAddFunction {\n return async (lines, optionalParams) => {\n const {cartLinesAdd, errors} = await options.storefront.mutate<{\n cartLinesAdd: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_ADD_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lines,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartLinesAdd, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesAdd\nexport const CART_LINES_ADD_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesAdd(\n $cartId: ID!\n $lines: [CartLineInput!]!\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import type {CartLineUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nconst PENDING_PREFIX = '__h_pending_';\n\nexport function getOptimisticLineId(variantId: string) {\n return PENDING_PREFIX + variantId;\n}\n\nexport function isOptimisticLineId(lineId: string) {\n return lineId.startsWith(PENDING_PREFIX);\n}\n\nexport function throwIfLinesAreOptimistic(\n type: string,\n lines: CartLineUpdateInput[] | string[],\n) {\n if (\n lines.some((line) =>\n isOptimisticLineId(typeof line === 'string' ? line : line.id),\n )\n ) {\n throw new Error(\n `Tried to perform an action on an optimistic line. Make sure to disable your \"${type}\" CartForm action when the line is optimistic.`,\n );\n }\n}\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {throwIfLinesAreOptimistic} from '../optimistic/optimistic-cart.helper';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartLineUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartLinesUpdateFunction = (\n lines: CartLineUpdateInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesUpdateDefault(\n options: CartQueryOptions,\n): CartLinesUpdateFunction {\n return async (lines, optionalParams) => {\n throwIfLinesAreOptimistic('updateLines', lines);\n\n const {cartLinesUpdate, errors} = await options.storefront.mutate<{\n cartLinesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lines,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartLinesUpdate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesUpdate\nexport const CART_LINES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesUpdate(\n $cartId: ID!\n $lines: [CartLineUpdateInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {throwIfLinesAreOptimistic} from '../optimistic/optimistic-cart.helper';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartLinesRemoveFunction = (\n lineIds: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesRemoveDefault(\n options: CartQueryOptions,\n): CartLinesRemoveFunction {\n return async (lineIds, optionalParams) => {\n throwIfLinesAreOptimistic('removeLines', lineIds);\n\n const {cartLinesRemove, errors} = await options.storefront.mutate<{\n cartLinesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lineIds,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartLinesRemove, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesRemove\nexport const CART_LINES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesRemove(\n $cartId: ID!\n $lineIds: [ID!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDiscountCodesUpdateFunction = (\n discountCodes: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartDiscountCodesUpdateDefault(\n options: CartQueryOptions,\n): CartDiscountCodesUpdateFunction {\n return async (discountCodes, optionalParams) => {\n // Ensure the discount codes are unique\n const uniqueCodes = discountCodes.filter((value, index, array) => {\n return array.indexOf(value) === index;\n });\n\n const {cartDiscountCodesUpdate, errors} = await options.storefront.mutate<{\n cartDiscountCodesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DISCOUNT_CODE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n discountCodes: uniqueCodes,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartDiscountCodesUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartDiscountCodesUpdate\nexport const CART_DISCOUNT_CODE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDiscountCodesUpdate(\n $cartId: ID!\n $discountCodes: [String!]\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n ... @defer {\n cart {\n ...CartApiMutation\n }\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartBuyerIdentityUpdateFunction = (\n buyerIdentity: CartBuyerIdentityInput,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartBuyerIdentityUpdateDefault(\n options: CartQueryOptions,\n): CartBuyerIdentityUpdateFunction {\n return async (buyerIdentity, optionalParams) => {\n if (buyerIdentity.companyLocationId && options.customerAccount) {\n options.customerAccount.setBuyer({\n companyLocationId: buyerIdentity.companyLocationId,\n });\n }\n\n const buyer = options.customerAccount\n ? await options.customerAccount.getBuyer()\n : undefined;\n\n const {cartBuyerIdentityUpdate, errors} = await options.storefront.mutate<{\n cartBuyerIdentityUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_BUYER_IDENTITY_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n buyerIdentity: {\n ...buyer,\n ...buyerIdentity,\n },\n ...optionalParams,\n },\n });\n return formatAPIResult(cartBuyerIdentityUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartBuyerIdentityUpdate\nexport const CART_BUYER_IDENTITY_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartBuyerIdentityUpdate(\n $cartId: ID!\n $buyerIdentity: CartBuyerIdentityInput!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartNoteUpdateFunction = (\n note: string,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartNoteUpdateDefault(\n options: CartQueryOptions,\n): CartNoteUpdateFunction {\n return async (note, optionalParams) => {\n const {cartNoteUpdate, errors} = await options.storefront.mutate<{\n cartNoteUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_NOTE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n note,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartNoteUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartNoteUpdate\nexport const CART_NOTE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartNoteUpdate(\n $cartId: ID!\n $note: String!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartSelectedDeliveryOptionInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartSelectedDeliveryOptionsUpdateFunction = (\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartSelectedDeliveryOptionsUpdateDefault(\n options: CartQueryOptions,\n): CartSelectedDeliveryOptionsUpdateFunction {\n return async (selectedDeliveryOptions, optionalParams) => {\n const {cartSelectedDeliveryOptionsUpdate, errors} =\n await options.storefront.mutate<{\n cartSelectedDeliveryOptionsUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_SELECTED_DELIVERY_OPTIONS_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n selectedDeliveryOptions,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartSelectedDeliveryOptionsUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartSelectedDeliveryOptionsUpdate\nexport const CART_SELECTED_DELIVERY_OPTIONS_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartSelectedDeliveryOptionsUpdate(\n $cartId: ID!\n $selectedDeliveryOptions: [CartSelectedDeliveryOptionInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartSelectedDeliveryOptionsUpdate(cartId: $cartId, selectedDeliveryOptions: $selectedDeliveryOptions) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {AttributeInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartAttributesUpdateFunction = (\n attributes: AttributeInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartAttributesUpdateDefault(\n options: CartQueryOptions,\n): CartAttributesUpdateFunction {\n return async (attributes, optionalParams) => {\n const {cartAttributesUpdate, errors} = await options.storefront.mutate<{\n cartAttributesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_ATTRIBUTES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: optionalParams?.cartId || options.getCartId(),\n attributes,\n },\n });\n return formatAPIResult(cartAttributesUpdate, errors);\n };\n}\n\nexport const CART_ATTRIBUTES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartAttributesUpdate(\n $cartId: ID!\n $attributes: [AttributeInput!]!\n ) {\n cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {\n CartOptionalInput,\n CartQueryOptions,\n MetafieldWithoutOwnerId,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {\n Cart,\n MetafieldsSetUserError,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartMetafieldsSetFunction = (\n metafields: MetafieldWithoutOwnerId[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartMetafieldsSetDefault(\n options: CartQueryOptions,\n): CartMetafieldsSetFunction {\n return async (metafields, optionalParams) => {\n const ownerId = optionalParams?.cartId || options.getCartId();\n const metafieldsWithOwnerId = metafields.map(\n (metafield: MetafieldWithoutOwnerId) => ({\n ...metafield,\n ownerId,\n }),\n );\n const {cartMetafieldsSet, errors} = await options.storefront.mutate<{\n cartMetafieldsSet: {\n userErrors: MetafieldsSetUserError[];\n };\n errors: StorefrontApiErrors;\n }>(CART_METAFIELD_SET_MUTATION(), {\n variables: {metafields: metafieldsWithOwnerId},\n });\n\n return formatAPIResult(\n {\n cart: {\n id: ownerId,\n } as Cart,\n ...cartMetafieldsSet,\n },\n errors,\n );\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartMetafieldsSet\nexport const CART_METAFIELD_SET_MUTATION = () => `#graphql\n mutation cartMetafieldsSet(\n $metafields: [CartMetafieldsSetInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartMetafieldsSet(metafields: $metafields) {\n userErrors {\n code\n elementIndex\n field\n message\n }\n }\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {\n CartQueryOptions,\n CartOptionalInput,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {\n Cart,\n MetafieldDeleteUserError,\n Scalars,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartMetafieldDeleteFunction = (\n key: Scalars['String']['input'],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartMetafieldDeleteDefault(\n options: CartQueryOptions,\n): CartMetafieldDeleteFunction {\n return async (key, optionalParams) => {\n const ownerId = optionalParams?.cartId || options.getCartId();\n const {cartMetafieldDelete, errors} = await options.storefront.mutate<{\n cartMetafieldDelete: {\n userErrors: MetafieldDeleteUserError[];\n };\n errors: StorefrontApiErrors;\n }>(CART_METAFIELD_DELETE_MUTATION(), {\n variables: {\n input: {\n ownerId,\n key,\n },\n },\n });\n return formatAPIResult(\n {\n cart: {\n id: ownerId,\n } as Cart,\n ...cartMetafieldDelete,\n },\n errors,\n );\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/2025-07/mutations/cartMetafieldDelete\nexport const CART_METAFIELD_DELETE_MUTATION = () => `#graphql\n mutation cartMetafieldDelete(\n $input: CartMetafieldDeleteInput!\n ) {\n cartMetafieldDelete(input: $input) {\n userErrors {\n code\n field\n message\n }\n }\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartGiftCardCodesUpdateFunction = (\n giftCardCodes: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartGiftCardCodesUpdateDefault(\n options: CartQueryOptions,\n): CartGiftCardCodesUpdateFunction {\n return async (giftCardCodes, optionalParams) => {\n // Ensure the gift card codes are unique\n const uniqueCodes = giftCardCodes.filter((value, index, array) => {\n return array.indexOf(value) === index;\n });\n\n const {cartGiftCardCodesUpdate, errors} = await options.storefront.mutate<{\n cartGiftCardCodesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_GIFT_CARD_CODE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n giftCardCodes: uniqueCodes,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartGiftCardCodesUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesUpdate\nexport const CART_GIFT_CARD_CODE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartGiftCardCodesUpdate(\n $cartId: ID!\n $giftCardCodes: [String!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartGiftCardCodesUpdate(cartId: $cartId, giftCardCodes: $giftCardCodes) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartGiftCardCodesRemoveFunction = (\n appliedGiftCardIds: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartGiftCardCodesRemoveDefault(\n options: CartQueryOptions,\n): CartGiftCardCodesRemoveFunction {\n return async (appliedGiftCardIds, optionalParams) => {\n const {cartGiftCardCodesRemove, errors} = await options.storefront.mutate<{\n cartGiftCardCodesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_GIFT_CARD_CODES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n appliedGiftCardIds,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartGiftCardCodesRemove, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesRemove\nexport const CART_GIFT_CARD_CODES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartGiftCardCodesRemove(\n $cartId: ID!\n $appliedGiftCardIds: [ID!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartGiftCardCodesRemove(cartId: $cartId, appliedGiftCardIds: $appliedGiftCardIds) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {CartSelectableAddressInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesAddFunction = (\n addresses: Array<CartSelectableAddressInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Adds delivery addresses to the cart.\n *\n * This function sends a mutation to the storefront API to add one or more delivery addresses to the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressAddFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const addDeliveryAddresses = cartDeliveryAddressesAddDefault({ storefront, getCartId });\n * const result = await addDeliveryAddresses([\n * {\n * address1: '123 Main St',\n * city: 'Anytown',\n * countryCode: 'US'\n * // other address fields...\n * }\n * ], { someOptionalParam: 'value' }\n * );\n */\nexport function cartDeliveryAddressesAddDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesAddFunction {\n return async (\n addresses: Array<CartSelectableAddressInput>,\n optionalParams,\n ) => {\n const {cartDeliveryAddressesAdd, errors} = await options.storefront.mutate<{\n cartDeliveryAddressesAdd: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_ADD_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addresses,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesAdd, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesAdd\nexport const CART_DELIVERY_ADDRESSES_ADD_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesAdd(\n $cartId: ID!\n $addresses: [CartSelectableAddressInput!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesAdd(addresses: $addresses, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {Scalars} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesRemoveFunction = (\n addressIds: Array<Scalars['ID']['input']> | Array<string>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Removes delivery addresses from the cart.\n *\n * This function sends a mutation to the storefront API to remove one or more delivery addresses from the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressRemoveFunction} - A function that takes an array of address IDs and optional parameters, and returns the result of the API call.\n *\n * @example\n * const removeDeliveryAddresses = cartDeliveryAddressesRemoveDefault({ storefront, getCartId });\n * const result = await removeDeliveryAddresses([\n * \"gid://shopify/<objectName>/10079785100\"\n * ],\n * { someOptionalParam: 'value' });\n */\nexport function cartDeliveryAddressesRemoveDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesRemoveFunction {\n return async (\n addressIds: Array<Scalars['ID']['input']> | string[],\n optionalParams,\n ) => {\n const {cartDeliveryAddressesRemove, errors} =\n await options.storefront.mutate<{\n cartDeliveryAddressesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addressIds,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesRemove, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesRemove\nexport const CART_DELIVERY_ADDRESSES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesRemove(\n $cartId: ID!\n $addressIds: [ID!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesRemove(addressIds: $addressIds, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {CartSelectableAddressUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesUpdateFunction = (\n addresses: Array<CartSelectableAddressUpdateInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Updates delivery addresses in the cart.\n *\n * This function sends a mutation to the storefront API to update one or more delivery addresses in the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressUpdateFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const updateAddresses = cartDeliveryAddressesUpdateDefault(cartQueryOptions);\n * const result = await updateAddresses([\n {\n \"address\": {\n \"copyFromCustomerAddressId\": \"gid://shopify/<objectName>/10079785100\",\n \"deliveryAddress\": {\n \"address1\": \"<your-address1>\",\n \"address2\": \"<your-address2>\",\n \"city\": \"<your-city>\",\n \"company\": \"<your-company>\",\n \"countryCode\": \"AC\",\n \"firstName\": \"<your-firstName>\",\n \"lastName\": \"<your-lastName>\",\n \"phone\": \"<your-phone>\",\n \"provinceCode\": \"<your-provinceCode>\",\n \"zip\": \"<your-zip>\"\n }\n },\n \"id\": \"gid://shopify/<objectName>/10079785100\",\n \"oneTimeUse\": true,\n \"selected\": true,\n \"validationStrategy\": \"COUNTRY_CODE_ONLY\"\n }\n ],{ someOptionalParam: 'value' });\n */\nexport function cartDeliveryAddressesUpdateDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesUpdateFunction {\n return async (\n addresses: Array<CartSelectableAddressUpdateInput>,\n optionalParams,\n ) => {\n const {cartDeliveryAddressesUpdate, errors} =\n await options.storefront.mutate<{\n cartDeliveryAddressesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addresses,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesUpdate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesUpdate\nexport const CART_DELIVERY_ADDRESSES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesUpdate(\n $cartId: ID!\n $addresses: [CartSelectableAddressUpdateInput!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesUpdate(addresses: $addresses, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {Storefront} from '../storefront';\nimport type {CustomerAccount} from '../customer/types';\nimport {type CartGetFunction, cartGetDefault} from './queries/cartGetDefault';\nimport {\n type CartCreateFunction,\n cartCreateDefault,\n} from './queries/cartCreateDefault';\nimport {\n type CartLinesAddFunction,\n cartLinesAddDefault,\n} from './queries/cartLinesAddDefault';\nimport {\n type CartLinesUpdateFunction,\n cartLinesUpdateDefault,\n} from './queries/cartLinesUpdateDefault';\nimport {\n type CartLinesRemoveFunction,\n cartLinesRemoveDefault,\n} from './queries/cartLinesRemoveDefault';\nimport {\n type CartDiscountCodesUpdateFunction,\n cartDiscountCodesUpdateDefault,\n} from './queries/cartDiscountCodesUpdateDefault';\nimport {\n type CartBuyerIdentityUpdateFunction,\n cartBuyerIdentityUpdateDefault,\n} from './queries/cartBuyerIdentityUpdateDefault';\nimport {\n type CartNoteUpdateFunction,\n cartNoteUpdateDefault,\n} from './queries/cartNoteUpdateDefault';\nimport {\n type CartSelectedDeliveryOptionsUpdateFunction,\n cartSelectedDeliveryOptionsUpdateDefault,\n} from './queries/cartSelectedDeliveryOptionsUpdateDefault';\nimport {\n type CartAttributesUpdateFunction,\n cartAttributesUpdateDefault,\n} from './queries/cartAttributesUpdateDefault';\nimport {\n type CartMetafieldsSetFunction,\n cartMetafieldsSetDefault,\n} from './queries/cartMetafieldsSetDefault';\nimport {\n type CartMetafieldDeleteFunction,\n cartMetafieldDeleteDefault,\n} from './queries/cartMetafieldDeleteDefault';\nimport {\n type CartGiftCardCodesUpdateFunction,\n cartGiftCardCodesUpdateDefault,\n} from './queries/cartGiftCardCodeUpdateDefault';\nimport {\n type CartGiftCardCodesRemoveFunction,\n cartGiftCardCodesRemoveDefault,\n} from './queries/cartGiftCardCodesRemoveDefault';\nimport {\n type CartDeliveryAddressesAddFunction,\n cartDeliveryAddressesAddDefault,\n} from './queries/cartDeliveryAddressesAddDefault';\nimport {\n type CartDeliveryAddressesRemoveFunction,\n cartDeliveryAddressesRemoveDefault,\n} from './queries/cartDeliveryAddressesRemoveDefault';\nimport {\n type CartDeliveryAddressesUpdateFunction,\n cartDeliveryAddressesUpdateDefault,\n} from './queries/cartDeliveryAddressesUpdateDefault';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartHandlerOptions = {\n storefront: Storefront;\n customerAccount?: CustomerAccount;\n getCartId: () => string | undefined;\n setCartId: (cartId: string) => Headers;\n cartQueryFragment?: string;\n cartMutateFragment?: string;\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport type CustomMethodsBase = Record<string, Function>;\nexport type CartHandlerOptionsWithCustom<\n TCustomMethods extends CustomMethodsBase,\n> = CartHandlerOptions & {\n customMethods?: TCustomMethods;\n};\n\nexport type HydrogenCart = {\n get: ReturnType<typeof cartGetDefault>;\n getCartId: () => string | undefined;\n setCartId: (cartId: string) => Headers;\n create: ReturnType<typeof cartCreateDefault>;\n addLines: ReturnType<typeof cartLinesAddDefault>;\n updateLines: ReturnType<typeof cartLinesUpdateDefault>;\n removeLines: ReturnType<typeof cartLinesRemoveDefault>;\n updateDiscountCodes: ReturnType<typeof cartDiscountCodesUpdateDefault>;\n updateGiftCardCodes: ReturnType<typeof cartGiftCardCodesUpdateDefault>;\n removeGiftCardCodes: ReturnType<typeof cartGiftCardCodesRemoveDefault>;\n updateBuyerIdentity: ReturnType<typeof cartBuyerIdentityUpdateDefault>;\n updateNote: ReturnType<typeof cartNoteUpdateDefault>;\n updateSelectedDeliveryOption: ReturnType<\n typeof cartSelectedDeliveryOptionsUpdateDefault\n >;\n updateAttributes: ReturnType<typeof cartAttributesUpdateDefault>;\n setMetafields: ReturnType<typeof cartMetafieldsSetDefault>;\n deleteMetafield: ReturnType<typeof cartMetafieldDeleteDefault>;\n /**\n * Adds delivery addresses to the cart.\n *\n * This function sends a mutation to the storefront API to add one or more delivery addresses to the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {ReturnType<typeof cartDeliveryAddressesAddDefault>} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const result = await cart.addDeliveryAddresses(\n * [\n * {\n * address1: '123 Main St',\n * city: 'Anytown',\n * countryCode: 'US'\n * }\n * ],\n * { someOptionalParam: 'value' }\n * );\n */\n addDeliveryAddresses: ReturnType<typeof cartDeliveryAddressesAddDefault>;\n /**\n * Removes delivery addresses from the cart.\n *\n * This function sends a mutation to the storefront API to remove one or more delivery addresses from the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressRemoveFunction} - A function that takes an array of address IDs and optional parameters, and returns the result of the API call.\n *\n * @example\n * const result = await cart.removeDeliveryAddresses([\n * \"gid://shopify/<objectName>/10079785100\"\n * ],\n * { someOptionalParam: 'value' });\n */\n\n removeDeliveryAddresses: ReturnType<\n typeof cartDeliveryAddressesRemoveDefault\n >;\n /**\n * Updates delivery addresses in the cart.\n *\n * This function sends a mutation to the storefront API to update one or more delivery addresses in the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressUpdateFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * const result = await cart.updateDeliveryAddresses([\n {\n \"address\": {\n \"copyFromCustomerAddressId\": \"gid://shopify/<objectName>/10079785100\",\n \"deliveryAddress\": {\n \"address1\": \"<your-address1>\",\n \"address2\": \"<your-address2>\",\n \"city\": \"<your-city>\",\n \"company\": \"<your-company>\",\n \"countryCode\": \"AC\",\n \"firstName\": \"<your-firstName>\",\n \"lastName\": \"<your-lastName>\",\n \"phone\": \"<your-phone>\",\n \"provinceCode\": \"<your-provinceCode>\",\n \"zip\": \"<your-zip>\"\n }\n },\n \"id\": \"gid://shopify/<objectName>/10079785100\",\n \"oneTimeUse\": true,\n \"selected\": true,\n \"validationStrategy\": \"COUNTRY_CODE_ONLY\"\n }\n ],{ someOptionalParam: 'value' });\n */\n updateDeliveryAddresses: ReturnType<\n typeof cartDeliveryAddressesUpdateDefault\n >;\n};\n\nexport type HydrogenCartCustom<\n TCustomMethods extends Partial<HydrogenCart> & CustomMethodsBase,\n> = Omit<HydrogenCart, keyof TCustomMethods> & TCustomMethods;\nexport type CartHandlerReturn<TCustomMethods extends CustomMethodsBase> =\n | HydrogenCartCustom<TCustomMethods>\n | HydrogenCart;\n\nexport function createCartHandler(options: CartHandlerOptions): HydrogenCart;\nexport function createCartHandler<TCustomMethods extends CustomMethodsBase>(\n options: CartHandlerOptionsWithCustom<TCustomMethods>,\n): HydrogenCartCustom<TCustomMethods>;\nexport function createCartHandler<TCustomMethods extends CustomMethodsBase>(\n options: CartHandlerOptions | CartHandlerOptionsWithCustom<TCustomMethods>,\n): CartHandlerReturn<TCustomMethods> {\n const {\n getCartId: _getCartId,\n setCartId,\n storefront,\n customerAccount,\n cartQueryFragment,\n cartMutateFragment,\n buyerIdentity,\n } = options;\n\n let cartId = _getCartId();\n\n const getCartId = () => cartId || _getCartId();\n\n const mutateOptions = {\n storefront,\n getCartId,\n cartFragment: cartMutateFragment,\n customerAccount,\n };\n\n const _cartCreate = cartCreateDefault(mutateOptions);\n\n const cartCreate: CartCreateFunction = async function (...args) {\n // Default buyerIdentity to what is passed into the handler\n // Only override if buyerIdentity is passed directly to the method\n args[0].buyerIdentity = {\n ...buyerIdentity,\n ...args[0].buyerIdentity,\n };\n\n const result = await _cartCreate(...args);\n cartId = result?.cart?.id;\n return result;\n };\n\n const methods: HydrogenCart = {\n get: cartGetDefault({\n storefront,\n customerAccount,\n getCartId,\n cartFragment: cartQueryFragment,\n }),\n getCartId,\n setCartId,\n create: cartCreate,\n addLines: async (linesWithOptimisticData, optionalParams) => {\n const lines = linesWithOptimisticData.map((line) => {\n return {\n attributes: line.attributes,\n quantity: line.quantity,\n merchandiseId: line.merchandiseId,\n sellingPlanId: line.sellingPlanId,\n };\n });\n\n return cartId || optionalParams?.cartId\n ? await cartLinesAddDefault(mutateOptions)(lines, optionalParams)\n : await cartCreate({lines, buyerIdentity}, optionalParams);\n },\n updateLines: cartLinesUpdateDefault(mutateOptions),\n removeLines: cartLinesRemoveDefault(mutateOptions),\n updateDiscountCodes: async (discountCodes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartDiscountCodesUpdateDefault(mutateOptions)(\n discountCodes,\n optionalParams,\n )\n : await cartCreate({discountCodes}, optionalParams);\n },\n updateGiftCardCodes: async (giftCardCodes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartGiftCardCodesUpdateDefault(mutateOptions)(\n giftCardCodes,\n optionalParams,\n )\n : await cartCreate({giftCardCodes}, optionalParams);\n },\n removeGiftCardCodes: cartGiftCardCodesRemoveDefault(mutateOptions),\n updateBuyerIdentity: async (buyerIdentity, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartBuyerIdentityUpdateDefault(mutateOptions)(\n buyerIdentity,\n optionalParams,\n )\n : await cartCreate({buyerIdentity}, optionalParams);\n },\n updateNote: async (note, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartNoteUpdateDefault(mutateOptions)(note, optionalParams)\n : await cartCreate({note}, optionalParams);\n },\n updateSelectedDeliveryOption:\n cartSelectedDeliveryOptionsUpdateDefault(mutateOptions),\n updateAttributes: async (attributes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartAttributesUpdateDefault(mutateOptions)(\n attributes,\n optionalParams,\n )\n : await cartCreate({attributes}, optionalParams);\n },\n setMetafields: async (metafields, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartMetafieldsSetDefault(mutateOptions)(\n metafields,\n optionalParams,\n )\n : await cartCreate({metafields}, optionalParams);\n },\n deleteMetafield: cartMetafieldDeleteDefault(mutateOptions),\n addDeliveryAddresses: cartDeliveryAddressesAddDefault(mutateOptions),\n removeDeliveryAddresses: cartDeliveryAddressesRemoveDefault(mutateOptions),\n updateDeliveryAddresses: cartDeliveryAddressesUpdateDefault(mutateOptions),\n };\n\n if ('customMethods' in options) {\n return {\n ...methods,\n ...(options.customMethods ?? {}),\n };\n } else {\n return methods;\n }\n}\n\nexport type CartHandlerOptionsForDocs<\n TCustomMethods extends CustomMethodsBase,\n> = {\n /**\n * A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`.\n */\n getCartId: () => string | undefined;\n /**\n * A function that sets the cart ID.\n */\n setCartId: (cartId: string) => Headers;\n /**\n * The storefront client instance created by [`createStorefrontClient`](docs/api/hydrogen/utilities/createstorefrontclient).\n */\n storefront: Storefront;\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n cartMutateFragment?: string;\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n cartQueryFragment?: string;\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: TCustomMethods;\n\n /**\n * Buyer identity. Default buyer identity is passed to cartCreate.\n */\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport type HydrogenCartForDocs = {\n /**\n * Adds items to the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n addLines?: CartLinesAddFunction;\n /**\n * Adds a delivery address to the cart.\n */\n addDeliveryAddresses?: CartDeliveryAddressesAddFunction;\n /**\n * Creates a new cart.\n */\n create?: CartCreateFunction;\n /**\n * Removes a custom field (metafield) from the cart.\n */\n deleteMetafield?: CartMetafieldDeleteFunction;\n /**\n * Retrieves the cart information.\n */\n get?: CartGetFunction;\n /**\n * Retrieves the unique identifier of the cart.\n * By default, it gets the ID from the request cookie.\n */\n getCartId?: () => string | undefined;\n /**\n * Removes a delivery address from the cart\n */\n removeDeliveryAddresses?: CartDeliveryAddressesRemoveFunction;\n /**\n * Removes items from the cart.\n */\n removeLines?: CartLinesRemoveFunction;\n /**\n * Sets the unique identifier of the cart.\n * By default, it sets the ID in the header cookie.\n */\n setCartId?: (cartId: string) => Headers;\n /**\n * Adds extra information (metafields) to the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n setMetafields?: CartMetafieldsSetFunction;\n /**\n * Update cart delivery addresses.\n */\n updateDeliveryAddresses?: CartDeliveryAddressesUpdateFunction;\n /**\n * Updates additional information (attributes) in the cart.\n */\n updateAttributes?: CartAttributesUpdateFunction;\n /**\n * Updates the buyer's information in the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n updateBuyerIdentity?: CartBuyerIdentityUpdateFunction;\n /**\n * Updates discount codes in the cart.\n */\n updateDiscountCodes?: CartDiscountCodesUpdateFunction;\n /**\n * Updates gift card codes in the cart.\n */\n updateGiftCardCodes?: CartGiftCardCodesUpdateFunction;\n /**\n * Removes gift card codes from the cart.\n */\n removeGiftCardCodes?: CartGiftCardCodesRemoveFunction;\n /**\n * Updates items in the cart.\n */\n updateLines?: CartLinesUpdateFunction;\n /**\n * Updates the note in the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n updateNote?: CartNoteUpdateFunction;\n /**\n * Updates the selected delivery options in the cart.\n * Only available for carts associated with a customer access token.\n */\n updateSelectedDeliveryOption?: CartSelectedDeliveryOptionsUpdateFunction;\n};\n","import {useFetchers} from 'react-router';\nimport {CartForm} from '../CartForm';\nimport type {\n CartLine,\n ProductVariant,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n getOptimisticLineId,\n isOptimisticLineId,\n} from './optimistic-cart.helper';\nimport type {PartialDeep} from 'type-fest';\nimport type {CartReturn} from '../queries/cart-types';\n\ntype LikeACart = {\n lines: {\n nodes: Array<unknown>;\n };\n};\n\nexport type OptimisticCartLine<T = CartLine | CartReturn> = T extends LikeACart\n ? T['lines']['nodes'][number] & {isOptimistic?: boolean}\n : T & {isOptimistic?: boolean};\n\nexport type OptimisticCart<T = CartReturn> = T extends undefined | null\n ? // This is the null/undefined case, where the cart has yet to be created.\n // But we still need to provide an optimistic cart object.\n {\n isOptimistic?: boolean;\n lines: {\n nodes: Array<OptimisticCartLine>;\n };\n totalQuantity?: number;\n } & Omit<PartialDeep<CartReturn>, 'lines'>\n : Omit<T, 'lines'> & {\n isOptimistic?: boolean;\n lines: {\n nodes: Array<OptimisticCartLine<T>>;\n };\n totalQuantity?: number;\n };\n\n/**\n * @param cart The cart object from `context.cart.get()` returned by a server loader.\n *\n * @returns A new cart object augmented with optimistic state for `lines` and `totalQuantity`. Each cart line item that is optimistically added includes an `isOptimistic` property. Also if the cart has _any_ optimistic state, a root property `isOptimistic` will be set to `true`.\n */\nexport function useOptimisticCart<\n DefaultCart = {\n lines?: {\n nodes: Array<{id: string; quantity: number; merchandise: {is: string}}>;\n };\n },\n>(cart?: DefaultCart): OptimisticCart<DefaultCart> {\n const fetchers = useFetchers();\n\n if (!fetchers || !fetchers.length) return cart as OptimisticCart<DefaultCart>;\n\n const optimisticCart = (cart as CartReturn)?.lines\n ? (structuredClone(cart) as OptimisticCart<DefaultCart>)\n : ({lines: {nodes: []}} as unknown as OptimisticCart<DefaultCart>);\n\n const cartLines = optimisticCart.lines.nodes as OptimisticCartLine[];\n\n let isOptimistic = false;\n\n for (const {formData} of fetchers) {\n if (!formData) continue;\n\n const cartFormData = CartForm.getFormInput(formData);\n\n if (cartFormData.action === CartForm.ACTIONS.LinesAdd) {\n for (const input of cartFormData.inputs.lines) {\n if (!input.selectedVariant) {\n console.error(\n '[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',\n );\n continue;\n }\n\n const existingLine = cartLines.find(\n (line) =>\n line.merchandise.id ===\n (input.selectedVariant as ProductVariant)?.id,\n );\n\n isOptimistic = true;\n\n if (existingLine) {\n existingLine.quantity =\n (existingLine.quantity || 1) + (input.quantity || 1);\n existingLine.isOptimistic = true;\n } else {\n cartLines.unshift({\n id: getOptimisticLineId((input.selectedVariant as any).id),\n merchandise: input.selectedVariant,\n isOptimistic: true,\n quantity: input.quantity || 1,\n } as CartLine & {isOptimistic?: boolean});\n }\n }\n } else if (cartFormData.action === CartForm.ACTIONS.LinesRemove) {\n for (const lineId of cartFormData.inputs.lineIds) {\n const index = cartLines.findIndex((line) => line.id === lineId);\n\n if (index !== -1) {\n if (isOptimisticLineId(cartLines[index].id)) {\n console.error(\n '[h2:error:useOptimisticCart] Tried to remove an optimistic line that has not been added to the cart yet',\n );\n continue;\n }\n\n cartLines.splice(index, 1);\n isOptimistic = true;\n } else {\n console.warn(\n `[h2:warn:useOptimisticCart] Tried to remove line '${lineId}' but it doesn't exist in the cart`,\n );\n }\n }\n } else if (cartFormData.action === CartForm.ACTIONS.LinesUpdate) {\n for (const line of cartFormData.inputs.lines) {\n const index = cartLines.findIndex(\n (optimisticLine) => line.id === optimisticLine.id,\n );\n\n if (index > -1) {\n if (isOptimisticLineId(cartLines[index].id)) {\n console.error(\n '[h2:error:useOptimisticCart] Tried to update an optimistic line that has not been added to the cart yet',\n );\n continue;\n }\n\n cartLines[index].quantity = line.quantity as number;\n\n if (cartLines[index].quantity === 0) {\n cartLines.splice(index, 1);\n }\n\n isOptimistic = true;\n } else {\n console.warn(\n `[h2:warn:useOptimisticCart] Tried to update line '${line.id}' but it doesn't exist in the cart`,\n );\n }\n }\n }\n }\n\n if (isOptimistic) {\n optimisticCart.isOptimistic = isOptimistic;\n }\n\n // Calculate the total quantity of the optimistic cart\n optimisticCart.totalQuantity = cartLines.reduce(\n (sum, line) => sum + line.quantity,\n 0,\n );\n\n return optimisticCart;\n}\n","const DEFAULT_GITHUB_CHANGELOG_URL =\n 'https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json';\n\n/**\n * A custom Remix loader handler that fetches the changelog.json from GitHub.\n * It is used by the `upgrade` command inside the route `https://hydrogen.shopify.dev/changelog.json`\n */\nexport async function changelogHandler({\n request,\n changelogUrl,\n}: {\n request: Request;\n changelogUrl?: string;\n}) {\n const searchParams = new URL(request.url).searchParams;\n const GITHUB_CHANGELOG_URL = changelogUrl || DEFAULT_GITHUB_CHANGELOG_URL;\n return fetch(GITHUB_CHANGELOG_URL);\n}\n","import {createContext} from 'react-router';\nimport type {StorefrontClient, I18nBase} from './storefront';\nimport type {CustomerAccount} from './customer/types';\nimport type {\n HydrogenCart,\n HydrogenCartCustom,\n CustomMethodsBase,\n} from './cart/createCartHandler';\nimport type {HydrogenEnv, HydrogenSession, WaitUntil} from './types';\n\n// Internal context keys - not exported from package, only used internally\nexport const storefrontContext =\n createContext<StorefrontClient<I18nBase>['storefront']>();\nexport const cartContext = createContext<\n HydrogenCart | HydrogenCartCustom<CustomMethodsBase>\n>();\nexport const customerAccountContext = createContext<CustomerAccount>();\nexport const envContext = createContext<HydrogenEnv>();\nexport const sessionContext = createContext<HydrogenSession>();\nexport const waitUntilContext = createContext<WaitUntil>();\n\n/**\n * Grouped export of all Hydrogen context keys for convenient access.\n * Use with React Router's context.get() pattern:\n *\n * @example\n * ```ts\n * import { hydrogenContext } from '@shopify/hydrogen';\n *\n * export async function loader({ context }) {\n * const storefront = context.get(hydrogenContext.storefront);\n * const cart = context.get(hydrogenContext.cart);\n * }\n * ```\n */\nexport const hydrogenContext = {\n storefront: storefrontContext,\n cart: cartContext,\n customerAccount: customerAccountContext,\n env: envContext,\n session: sessionContext,\n waitUntil: waitUntilContext,\n} as const;\n","import {LIB_VERSION} from '../version';\n\nexport const DEFAULT_CUSTOMER_API_VERSION = '2025-07';\nexport const USER_AGENT = `Shopify Hydrogen ${LIB_VERSION}`;\n// This is a static api client id: https://shopify.dev/docs/api/customer#useaccesstoken-propertydetail-audience\nexport const CUSTOMER_API_CLIENT_ID = '30243aa5-17c1-465a-8493-944bcc4e88aa';\nexport const CUSTOMER_ACCOUNT_SESSION_KEY = 'customerAccount';\nexport const BUYER_SESSION_KEY = 'buyer';\n","export class BadRequest extends Response {\n constructor(message?: string, helpMessage?: string, headers?: HeadersInit) {\n // A lot of things can go wrong when configuring the customer account api\n // oauth flow. In dev mode, log a helper message.\n if (helpMessage && process.env.NODE_ENV === 'development') {\n console.error('Customer Account API Error: ' + helpMessage);\n }\n\n super(`Bad request: ${message}`, {status: 400, headers});\n }\n}\n","import type {HydrogenSession} from '../types';\nimport {BadRequest} from './BadRequest';\nimport {\n USER_AGENT,\n CUSTOMER_API_CLIENT_ID,\n CUSTOMER_ACCOUNT_SESSION_KEY,\n BUYER_SESSION_KEY,\n} from './constants';\n\ntype H2OEvent = Parameters<NonNullable<typeof __H2O_LOG_EVENT>>[0];\n\nexport interface Locks {\n refresh?: Promise<any>;\n}\n\nexport const logSubRequestEvent =\n process.env.NODE_ENV === 'development'\n ? ({\n url,\n response,\n startTime,\n query,\n variables,\n ...debugInfo\n }: {\n url: H2OEvent['url'];\n response: Response;\n startTime: H2OEvent['startTime'];\n query?: string;\n variables?: Record<string, any> | null;\n } & Partial<H2OEvent>) => {\n globalThis.__H2O_LOG_EVENT?.({\n ...debugInfo,\n eventType: 'subrequest',\n url,\n startTime,\n graphql: query\n ? JSON.stringify({query, variables, schema: 'customer-account'})\n : undefined,\n responseInit: {\n status: response.status || 0,\n statusText: response.statusText || '',\n headers: Array.from(response.headers.entries() || []),\n },\n });\n }\n : undefined;\n\nexport function redirect(\n path: string,\n options: {status?: number; headers?: {}} = {},\n) {\n const headers = options.headers\n ? new Headers(options.headers)\n : new Headers({});\n headers.set('location', path);\n\n return new Response(null, {status: options.status || 302, headers});\n}\n\nexport interface AccessTokenResponse {\n access_token: string;\n expires_in: number;\n id_token: string;\n refresh_token: string;\n error?: string;\n error_description?: string;\n}\n\nexport async function refreshToken({\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n}: {\n session: HydrogenSession;\n customerAccountId: string;\n customerAccountTokenExchangeUrl: string;\n httpsOrigin: string;\n debugInfo?: Partial<H2OEvent>;\n}) {\n const newBody = new URLSearchParams();\n\n const customerAccount = session.get(CUSTOMER_ACCOUNT_SESSION_KEY);\n const refreshToken = customerAccount?.refreshToken;\n const idToken = customerAccount?.idToken;\n\n if (!refreshToken)\n throw new BadRequest(\n 'Unauthorized',\n 'No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n\n newBody.append('grant_type', 'refresh_token');\n newBody.append('refresh_token', refreshToken);\n newBody.append('client_id', customerAccountId);\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const startTime = new Date().getTime();\n const url = customerAccountTokenExchangeUrl;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: newBody,\n });\n\n logSubRequestEvent?.({\n displayName: 'Customer Account API: access token refresh',\n url,\n startTime,\n response,\n ...debugInfo,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Response(text, {\n status: response.status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n });\n }\n\n const {\n access_token,\n expires_in,\n refresh_token,\n }: Omit<AccessTokenResponse, 'id_token'> = await response.json();\n\n if (!access_token || access_token.length === 0) {\n throw new BadRequest('Unauthorized', 'Invalid access token received.');\n }\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n accessToken: access_token,\n // Store the date in future the token expires, separated by two minutes\n expiresAt:\n new Date(new Date().getTime() + (expires_in - 120) * 1000).getTime() + '',\n refreshToken: refresh_token,\n idToken,\n });\n}\n\nexport function clearSession(session: HydrogenSession): void {\n session.unset(CUSTOMER_ACCOUNT_SESSION_KEY);\n session.unset(BUYER_SESSION_KEY);\n}\n\nexport async function checkExpires({\n locks,\n expiresAt,\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n}: {\n locks: Locks;\n expiresAt: string;\n session: HydrogenSession;\n customerAccountId: string;\n customerAccountTokenExchangeUrl: string;\n httpsOrigin: string;\n debugInfo?: Partial<H2OEvent>;\n}) {\n if (parseInt(expiresAt, 10) - 1000 < new Date().getTime()) {\n try {\n // Makes sure that only one refresh request is sent at a time\n if (!locks.refresh)\n locks.refresh = refreshToken({\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n });\n\n await locks.refresh;\n delete locks.refresh;\n } catch (error) {\n clearSession(session);\n\n if (error && (error as Response).status !== 401) {\n throw error;\n } else {\n throw new BadRequest(\n 'Unauthorized',\n 'Login before querying the Customer Account API.',\n );\n }\n }\n }\n}\n\nexport function generateCodeVerifier() {\n const rando = generateRandomCode();\n return base64UrlEncode(rando);\n}\n\nexport async function generateCodeChallenge(codeVerifier: string) {\n const digestOp = await crypto.subtle.digest(\n {name: 'SHA-256'},\n new TextEncoder().encode(codeVerifier),\n );\n const hash = convertBufferToString(digestOp);\n return base64UrlEncode(hash);\n}\n\nexport function generateRandomCode() {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return String.fromCharCode.apply(null, Array.from(array));\n}\n\nfunction base64UrlEncode(str: string) {\n const base64 = btoa(str);\n // This is to ensure that the encoding does not have +, /, or = characters in it.\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction convertBufferToString(hash: ArrayBuffer) {\n const uintArray = new Uint8Array(hash);\n const numberArray = Array.from(uintArray);\n return String.fromCharCode(...numberArray);\n}\n\nexport function generateState() {\n const timestamp = Date.now().toString();\n const randomString = Math.random().toString(36).substring(2);\n return timestamp + randomString;\n}\n\nexport async function exchangeAccessToken(\n authAccessToken: string | undefined,\n customerAccountId: string,\n customerAccountTokenExchangeUrl: string,\n httpsOrigin: string,\n debugInfo?: Partial<H2OEvent>,\n) {\n const clientId = customerAccountId;\n\n if (!authAccessToken)\n throw new BadRequest(\n 'Unauthorized',\n 'oAuth access token was not provided during token exchange.',\n );\n\n const body = new URLSearchParams();\n\n body.append('grant_type', 'urn:ietf:params:oauth:grant-type:token-exchange');\n body.append('client_id', clientId);\n body.append('audience', CUSTOMER_API_CLIENT_ID);\n body.append('subject_token', authAccessToken);\n body.append(\n 'subject_token_type',\n 'urn:ietf:params:oauth:token-type:access_token',\n );\n body.append('scopes', 'https://api.customers.com/auth/customer.graphql');\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const startTime = new Date().getTime();\n const url = customerAccountTokenExchangeUrl;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n logSubRequestEvent?.({\n displayName: 'Customer Account API: access token exchange',\n url,\n startTime,\n response,\n ...debugInfo,\n });\n\n const data: AccessTokenResponse = await response.json();\n\n if (data.error) {\n throw new BadRequest(data.error_description);\n }\n\n return data.access_token;\n}\n\nexport function getNonce(token: string) {\n return decodeJwt(token).payload.nonce;\n}\n\nfunction decodeJwt(token: string) {\n const [header, payload, signature] = token.split('.');\n\n const decodedHeader = JSON.parse(atob(header));\n const decodedPayload = JSON.parse(atob(payload));\n\n return {\n header: decodedHeader,\n payload: decodedPayload,\n signature,\n };\n}\n","export function generateNonce(): string {\n return toHexString(randomUint8Array());\n}\n\nfunction randomUint8Array() {\n try {\n return crypto.getRandomValues(new Uint8Array(16));\n } catch (e) {\n return new Uint8Array(16).map(() => (Math.random() * 255) | 0);\n }\n}\n\nfunction toHexString(byteArray: Uint8Array) {\n return Array.from(byteArray, function (byte) {\n return ('0' + (byte & 0xff).toString(16)).slice(-2);\n }).join('');\n}\n","export function getRedirectUrl(requestUrl?: string): string | undefined {\n if (!requestUrl) return;\n\n const {pathname, search} = new URL(requestUrl);\n const redirectFrom = pathname + search;\n\n const searchParams = new URLSearchParams(search);\n const redirectTo =\n searchParams.get('return_to') || searchParams.get('redirect');\n\n if (redirectTo) {\n if (isLocalPath(requestUrl, redirectTo)) {\n return redirectTo;\n } else {\n console.warn(\n `Cross-domain redirects are not supported. Tried to redirect from ${redirectFrom} to ${redirectTo}`,\n );\n }\n }\n}\n\nfunction isLocalPath(requestUrl: string, redirectUrl: string) {\n // We don't want to redirect cross domain,\n // doing so could create phishing vulnerability\n // Test for protocols, e.g. https://, http://, //\n // and uris: mailto:, tel:, javascript:, etc.\n try {\n return (\n new URL(requestUrl).origin === new URL(redirectUrl, requestUrl).origin\n );\n } catch (e) {\n return false;\n }\n}\n\n/** Ensure redirect url are always using request origin so we never redirect cross domain. Return the full url with request origin.\n *\n * @param requestUrl - Use to find app origin\n * @param defaultUrl - The default URL to redirect to.\n * @param redirectUrl - Relative or absolute URL of redirect. If the absolute URL is cross domain return undefined.\n * */\nexport function ensureLocalRedirectUrl({\n requestUrl,\n defaultUrl,\n redirectUrl,\n}: {\n requestUrl: string;\n defaultUrl: string;\n redirectUrl?: string;\n}): string {\n const fromUrl = requestUrl;\n const defautlUrl = buildURLObject(requestUrl, defaultUrl);\n const toUrl = redirectUrl\n ? buildURLObject(requestUrl, redirectUrl)\n : defautlUrl;\n\n if (isLocalPath(requestUrl, toUrl.toString())) {\n return toUrl.toString();\n } else {\n console.warn(\n `Cross-domain redirects are not supported. Tried to redirect from ${fromUrl} to ${toUrl}. Default url ${defautlUrl} is used instead.`,\n );\n return defautlUrl.toString();\n }\n}\n\nfunction buildURLObject(\n requestUrl: string,\n relativeOrAbsoluteUrl: string,\n): URL {\n return isAbsoluteUrl(relativeOrAbsoluteUrl)\n ? new URL(relativeOrAbsoluteUrl)\n : new URL(relativeOrAbsoluteUrl, new URL(requestUrl).origin);\n}\n\nfunction isAbsoluteUrl(url: string) {\n try {\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n","export enum URL_TYPE {\n CA_BASE_URL = 'CA_BASE_URL',\n CA_BASE_AUTH_URL = 'CA_BASE_AUTH_URL',\n GRAPHQL = 'GRAPHQL',\n AUTH = 'AUTH',\n LOGIN_SCOPE = 'LOGIN_SCOPE',\n TOKEN_EXCHANGE = 'TOKEN_EXCHANGE',\n LOGOUT = 'LOGOUT',\n}\n\nexport function createCustomerAccountHelper(\n customerApiVersion: string,\n shopId: string,\n) {\n const customerAccountUrl = `https://shopify.com/${shopId}`;\n const customerAccountAuthUrl = `https://shopify.com/authentication/${shopId}`;\n\n return function getCustomerAccountUrl(urlType: URL_TYPE): string {\n switch (urlType) {\n case URL_TYPE.CA_BASE_URL:\n return customerAccountUrl;\n case URL_TYPE.CA_BASE_AUTH_URL:\n return customerAccountAuthUrl;\n case URL_TYPE.GRAPHQL:\n return `${customerAccountUrl}/account/customer/api/${customerApiVersion}/graphql`;\n case URL_TYPE.AUTH:\n return `${customerAccountAuthUrl}/oauth/authorize`;\n case URL_TYPE.LOGIN_SCOPE:\n return shopId\n ? 'openid email customer-account-api:full'\n : 'openid email https://api.customers.com/auth/customer.graphql';\n case URL_TYPE.TOKEN_EXCHANGE:\n return `${customerAccountAuthUrl}/oauth/token`;\n case URL_TYPE.LOGOUT:\n return `${customerAccountAuthUrl}/logout`;\n }\n };\n}\n","import type {GenericVariables} from '@shopify/hydrogen-codegen';\nimport type {WritableDeep} from 'type-fest';\nimport {\n DEFAULT_CUSTOMER_API_VERSION,\n CUSTOMER_ACCOUNT_SESSION_KEY,\n BUYER_SESSION_KEY,\n USER_AGENT,\n} from './constants';\nimport {\n clearSession,\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n checkExpires,\n exchangeAccessToken,\n AccessTokenResponse,\n getNonce,\n redirect,\n Locks,\n logSubRequestEvent,\n} from './auth.helpers';\nimport {BadRequest} from './BadRequest';\nimport {generateNonce} from '../csp/nonce';\nimport {\n minifyQuery,\n assertQuery,\n assertMutation,\n throwErrorWithGqlLink,\n type GraphQLErrorOptions,\n GraphQLError,\n} from '../utils/graphql';\nimport {parseJSON} from '../utils/parse-json';\nimport {\n CrossRuntimeRequest,\n getHeader,\n getDebugHeaders,\n} from '../utils/request';\nimport {getCallerStackLine, withSyncStack} from '../utils/callsites';\nimport {\n getRedirectUrl,\n ensureLocalRedirectUrl,\n} from '../utils/get-redirect-url';\nimport type {\n CustomerAccountOptions,\n CustomerAccount,\n CustomerAPIResponse,\n LoginOptions,\n LogoutOptions,\n Buyer,\n} from './types';\nimport {createCustomerAccountHelper, URL_TYPE} from './customer-account-helper';\nimport {warnOnce} from '../utils/warning';\nimport {LanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\n\nfunction defaultAuthStatusHandler(\n request: CrossRuntimeRequest,\n defaultLoginUrl: string,\n) {\n if (!request.url) return defaultLoginUrl;\n\n const {pathname} = new URL(request.url);\n\n /**\n * Remix (single-fetch) request objects have different url\n * paths when soft navigating. Examples:\n *\n * /_root.data - home page\n * /collections.data - collections page\n *\n * These url annotations needs to be cleaned up before constructing urls to be passed as\n * GET parameters for customer login url\n */\n const cleanedPathname = pathname\n .replace(/\\.data$/, '')\n .replace(/\\/_root$/, '/')\n .replace(/(.+)\\/$/, '$1');\n\n const redirectTo =\n defaultLoginUrl +\n `?${new URLSearchParams({return_to: cleanedPathname}).toString()}`;\n\n return redirect(redirectTo);\n}\n\nexport function createCustomerAccountClient({\n session,\n customerAccountId,\n shopId,\n customerApiVersion = DEFAULT_CUSTOMER_API_VERSION,\n request,\n waitUntil,\n authUrl,\n customAuthStatusHandler,\n logErrors = true,\n loginPath = '/account/login',\n authorizePath = '/account/authorize',\n defaultRedirectPath = '/account',\n language,\n}: CustomerAccountOptions): CustomerAccount {\n if (customerApiVersion !== DEFAULT_CUSTOMER_API_VERSION) {\n console.warn(\n `[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${customerApiVersion} when this version of Hydrogen was built for ${DEFAULT_CUSTOMER_API_VERSION}.`,\n );\n }\n\n if (!session) {\n console.warn(\n `[h2:warn:createCustomerAccountClient] session is required to use Customer Account API. Ensure the session object passed in exist.`,\n );\n }\n\n if (!request?.url) {\n throw new Error(\n '[h2:error:createCustomerAccountClient] The request object does not contain a URL.',\n );\n }\n\n const authStatusHandler = customAuthStatusHandler\n ? customAuthStatusHandler\n : () => defaultAuthStatusHandler(request, loginPath);\n\n const requestUrl = new URL(request.url);\n const httpsOrigin =\n requestUrl.protocol === 'http:'\n ? requestUrl.origin.replace('http', 'https')\n : requestUrl.origin;\n const redirectUri = ensureLocalRedirectUrl({\n requestUrl: httpsOrigin,\n defaultUrl: authorizePath,\n redirectUrl: authUrl,\n });\n\n const getCustomerAccountUrl = createCustomerAccountHelper(\n customerApiVersion,\n shopId,\n );\n\n const ifInvalidCredentialThrowError = createIfInvalidCredentialThrowError(\n getCustomerAccountUrl,\n customerAccountId,\n );\n\n const customerAccountApiUrl = getCustomerAccountUrl(URL_TYPE.GRAPHQL);\n const locks: Locks = {};\n\n async function fetchCustomerAPI<T>({\n query,\n type,\n variables = {},\n }: {\n query: string;\n type: 'query' | 'mutation';\n variables?: GenericVariables;\n }) {\n const accessToken = await getAccessToken();\n if (!accessToken) {\n throw authStatusHandler();\n }\n\n // Get stack trace before losing it with any async operation.\n // Since this is an internal function that is always called from\n // the public query/mutate wrappers, add 1 to the stack offset.\n const stackInfo = getCallerStackLine?.();\n\n const startTime = new Date().getTime();\n\n const response = await fetch(customerAccountApiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n Authorization: accessToken,\n },\n body: JSON.stringify({query, variables}),\n });\n\n logSubRequestEvent?.({\n url: customerAccountApiUrl,\n startTime,\n response,\n waitUntil,\n stackInfo,\n query,\n variables,\n ...getDebugHeaders(request),\n });\n\n const body = await response.text();\n\n const errorOptions: GraphQLErrorOptions<T> = {\n url: customerAccountApiUrl,\n response,\n type,\n query,\n queryVariables: variables,\n errors: undefined,\n client: 'customer',\n };\n\n if (!response.ok) {\n if (response.status === 401) {\n // clear session because current access token is invalid\n clearSession(session);\n\n const authFailResponse = authStatusHandler();\n throw authFailResponse;\n }\n\n /**\n * The Customer API might return a string error, or a JSON-formatted {error: string}.\n * We try both and conform them to a single {errors} format.\n */\n let errors;\n try {\n errors = parseJSON(body);\n } catch (_e) {\n errors = [{message: body}];\n }\n\n throwErrorWithGqlLink({...errorOptions, errors});\n }\n\n try {\n const APIresponse = parseJSON(body) as CustomerAPIResponse<T>;\n const {errors} = APIresponse;\n\n const gqlErrors = errors?.map(\n ({message, ...rest}) =>\n new GraphQLError(message, {\n ...(rest as WritableDeep<typeof rest>),\n clientOperation: `customerAccount.${errorOptions.type}`,\n requestId: response.headers.get('x-request-id'),\n queryVariables: variables,\n query,\n }),\n );\n\n return {...APIresponse, ...(errors && {errors: gqlErrors})};\n } catch (e) {\n throwErrorWithGqlLink({...errorOptions, errors: [{message: body}]});\n }\n }\n\n async function isLoggedIn() {\n if (!shopId) return false;\n\n const customerAccount = session.get(CUSTOMER_ACCOUNT_SESSION_KEY);\n const accessToken = customerAccount?.accessToken;\n const expiresAt = customerAccount?.expiresAt;\n\n if (!accessToken || !expiresAt) return false;\n\n // Get stack trace before losing it with any async operation.\n const stackInfo = getCallerStackLine?.();\n\n try {\n await checkExpires({\n locks,\n expiresAt,\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl: getCustomerAccountUrl(\n URL_TYPE.TOKEN_EXCHANGE,\n ),\n httpsOrigin,\n debugInfo: {\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n },\n });\n } catch {\n return false;\n }\n\n return true;\n }\n\n async function handleAuthStatus() {\n if (!(await isLoggedIn())) {\n throw authStatusHandler();\n }\n }\n\n async function getAccessToken() {\n const hasAccessToken = await isLoggedIn();\n\n if (hasAccessToken)\n return session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.accessToken;\n }\n\n async function mutate(\n mutation: Parameters<CustomerAccount['mutate']>[0],\n options?: Parameters<CustomerAccount['mutate']>[1],\n ) {\n ifInvalidCredentialThrowError();\n\n mutation = minifyQuery(mutation);\n assertMutation(mutation, 'customer.mutate');\n\n return withSyncStack(\n fetchCustomerAPI({query: mutation, type: 'mutation', ...options}),\n {logErrors},\n );\n }\n\n async function query(\n query: Parameters<CustomerAccount['query']>[0],\n options?: Parameters<CustomerAccount['query']>[1],\n ) {\n ifInvalidCredentialThrowError();\n\n query = minifyQuery(query);\n assertQuery(query, 'customer.query');\n\n return withSyncStack(fetchCustomerAPI({query, type: 'query', ...options}), {\n logErrors,\n });\n }\n\n function setBuyer(buyer: Buyer) {\n session.set(BUYER_SESSION_KEY, {\n ...session.get(BUYER_SESSION_KEY),\n ...buyer,\n });\n }\n\n async function getBuyer() {\n // get access token and trigger refresh if expire\n const customerAccessToken = await getAccessToken();\n\n if (!customerAccessToken) {\n return;\n }\n\n return {...session.get(BUYER_SESSION_KEY), customerAccessToken};\n }\n\n return {\n i18n: {language: language ?? ('EN' as LanguageCode)},\n login: async (options?: LoginOptions) => {\n ifInvalidCredentialThrowError();\n const loginUrl = new URL(getCustomerAccountUrl(URL_TYPE.AUTH));\n\n const state = generateState();\n const nonce = generateNonce();\n\n loginUrl.searchParams.set('client_id', customerAccountId);\n loginUrl.searchParams.set('scope', 'openid email');\n loginUrl.searchParams.append('response_type', 'code');\n loginUrl.searchParams.append('redirect_uri', redirectUri);\n loginUrl.searchParams.set(\n 'scope',\n getCustomerAccountUrl(URL_TYPE.LOGIN_SCOPE),\n );\n loginUrl.searchParams.append('state', state);\n loginUrl.searchParams.append('nonce', nonce);\n\n const uiLocales = getMaybeUILocales({\n contextLanguage: language ?? null,\n uiLocalesOverride: options?.uiLocales ?? null,\n });\n if (uiLocales != null) {\n loginUrl.searchParams.append('ui_locales', uiLocales);\n }\n\n if (options?.countryCode) {\n loginUrl.searchParams.append('region_country', options.countryCode);\n }\n\n if (options?.acrValues) {\n loginUrl.searchParams.append('acr_values', options.acrValues);\n }\n\n if (options?.loginHint) {\n loginUrl.searchParams.append('login_hint', options.loginHint);\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n ...session.get(CUSTOMER_ACCOUNT_SESSION_KEY),\n codeVerifier: verifier,\n state,\n nonce,\n redirectPath:\n getRedirectUrl(request.url) ||\n getHeader(request, 'Referer') ||\n defaultRedirectPath,\n });\n\n loginUrl.searchParams.append('code_challenge', challenge);\n loginUrl.searchParams.append('code_challenge_method', 'S256');\n\n return redirect(loginUrl.toString());\n },\n\n logout: async (options?: LogoutOptions) => {\n ifInvalidCredentialThrowError();\n\n const idToken = session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.idToken;\n const postLogoutRedirectUri = ensureLocalRedirectUrl({\n requestUrl: httpsOrigin,\n defaultUrl: httpsOrigin,\n redirectUrl: options?.postLogoutRedirectUri,\n });\n\n const logoutUrl = idToken\n ? new URL(\n `${getCustomerAccountUrl(URL_TYPE.LOGOUT)}?${new URLSearchParams([\n ['id_token_hint', idToken],\n ['post_logout_redirect_uri', postLogoutRedirectUri],\n ]).toString()}`,\n ).toString()\n : postLogoutRedirectUri;\n\n clearSession(session);\n\n const headers =\n options?.headers instanceof Headers\n ? options?.headers\n : new Headers(options?.headers);\n\n if (!options?.keepSession) {\n if (session.destroy) {\n headers.set('Set-Cookie', await session.destroy());\n } else {\n console.warn(\n '[h2:warn:customerAccount] session.destroy is not available on your session implementation. All session data might not be cleared on logout.',\n );\n }\n\n session.isPending = false;\n }\n\n return redirect(logoutUrl, {headers});\n },\n isLoggedIn,\n handleAuthStatus,\n getAccessToken,\n getApiUrl: () => customerAccountApiUrl,\n mutate: mutate as CustomerAccount['mutate'],\n query: query as CustomerAccount['query'],\n authorize: async () => {\n ifInvalidCredentialThrowError();\n\n const code = requestUrl.searchParams.get('code');\n const state = requestUrl.searchParams.get('state');\n\n if (!code || !state) {\n clearSession(session);\n\n throw new BadRequest(\n 'Unauthorized',\n 'No code or state parameter found in the redirect URL.',\n );\n }\n\n if (session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.state !== state) {\n clearSession(session);\n\n throw new BadRequest(\n 'Unauthorized',\n 'The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n }\n\n const clientId = customerAccountId;\n const body = new URLSearchParams();\n\n body.append('grant_type', 'authorization_code');\n body.append('client_id', clientId);\n body.append('redirect_uri', redirectUri);\n body.append('code', code);\n\n // Public Client\n const codeVerifier = session.get(\n CUSTOMER_ACCOUNT_SESSION_KEY,\n )?.codeVerifier;\n\n if (!codeVerifier)\n throw new BadRequest(\n 'Unauthorized',\n 'No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n\n body.append('code_verifier', codeVerifier);\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const stackInfo = getCallerStackLine?.();\n const startTime = new Date().getTime();\n const url = getCustomerAccountUrl(URL_TYPE.TOKEN_EXCHANGE);\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n logSubRequestEvent?.({\n url,\n displayName: 'Customer Account API: authorize',\n startTime,\n response,\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n });\n\n if (!response.ok) {\n throw new Response(await response.text(), {\n status: response.status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n });\n }\n\n const {\n access_token,\n expires_in,\n id_token,\n refresh_token,\n }: AccessTokenResponse = await response.json();\n\n const sessionNonce = session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.nonce;\n const responseNonce = await getNonce(id_token);\n\n if (sessionNonce !== responseNonce) {\n throw new BadRequest(\n 'Unauthorized',\n `Returned nonce does not match: ${sessionNonce} !== ${responseNonce}`,\n );\n }\n\n let customerAccessToken = access_token;\n\n if (!shopId) {\n customerAccessToken = await exchangeAccessToken(\n access_token,\n customerAccountId,\n getCustomerAccountUrl(URL_TYPE.TOKEN_EXCHANGE),\n httpsOrigin,\n {\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n },\n );\n }\n\n const redirectPath = session.get(\n CUSTOMER_ACCOUNT_SESSION_KEY,\n )?.redirectPath;\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n accessToken: customerAccessToken,\n expiresAt:\n new Date(new Date().getTime() + (expires_in - 120) * 1000).getTime() +\n '',\n refreshToken: refresh_token,\n idToken: id_token,\n });\n\n return redirect(redirectPath || defaultRedirectPath);\n },\n setBuyer,\n getBuyer,\n UNSTABLE_setBuyer: (buyer: Buyer) => {\n warnOnce(\n '[h2:warn:customerAccount] `customerAccount.UNSTABLE_setBuyer` is deprecated. Please use `customerAccount.setBuyer`.',\n );\n\n setBuyer(buyer);\n },\n UNSTABLE_getBuyer: () => {\n warnOnce(\n '[h2:warn:customerAccount] `customerAccount.UNSTABLE_getBuyer` is deprecated. Please use `customerAccount.getBuyer`.',\n );\n\n return getBuyer();\n },\n };\n}\n\nfunction createIfInvalidCredentialThrowError(\n getCustomerAccountUrl: (urlType: URL_TYPE) => string,\n customerAccountId?: string,\n) {\n return function ifInvalidCredentialThrowError() {\n try {\n if (!customerAccountId) throw Error();\n\n new URL(getCustomerAccountUrl(URL_TYPE.CA_BASE_URL));\n new URL(getCustomerAccountUrl(URL_TYPE.CA_BASE_AUTH_URL));\n } catch {\n console.error(\n new Error(\n '[h2:error:customerAccount] You do not have the valid credential to use Customer Account API.\\nRun `h2 env pull` to link your store credentials.',\n ),\n );\n\n const publicMessage =\n process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : 'You do not have the valid credential to use Customer Account API (/account).';\n\n throw new Response(publicMessage, {status: 500});\n }\n };\n}\n\n/**\n * This function returns a locale string in the form <language>[-<COUNTRY_CODE>], based on the provided input params.\n * If both the i18n and the uiLocalesOverride are provided, the uiLocalesOverride will be used.\n * If none of the params are provided, it returns null.\n */\nexport function getMaybeUILocales(params: {\n contextLanguage: LanguageCode | null;\n uiLocalesOverride: LanguageCode | null; // this will override contextLanguage if both are provided\n}): string | null {\n const contextLocale = toMaybeLocaleString(params.contextLanguage ?? null);\n const optionsLocale = toMaybeLocaleString(params.uiLocalesOverride);\n\n return optionsLocale ?? contextLocale ?? null;\n}\n\nfunction toMaybeLocaleString(language: LanguageCode | null): string | null {\n if (language == null) {\n return null;\n }\n\n const normalizedLanguage = maybeEnforceRegionalVariant(language);\n\n const base = normalizedLanguage.toLowerCase().replaceAll('_', '-');\n const tokens = base.split('-');\n const langToken = tokens.at(0) ?? null;\n const regionToken = tokens.at(1) ?? null;\n\n if (regionToken) {\n return `${langToken}-${regionToken.toUpperCase()}`;\n }\n\n return langToken;\n}\n\n// See https://shopify.dev/docs/api/customer#authorization-propertydetail-uilocales\nconst regionalLanguageOverrides: Partial<Record<LanguageCode, LanguageCode>> = {\n PT: 'PT_PT',\n ZH: 'ZH_CN',\n};\n\nfunction maybeEnforceRegionalVariant(language: LanguageCode): LanguageCode {\n return regionalLanguageOverrides[language] ?? language;\n}\n","import {\n createStorefrontClient,\n type CreateStorefrontClientOptions,\n type StorefrontClient,\n type I18nBase,\n} from './storefront';\nimport {createCustomerAccountClient} from './customer/customer';\nimport {\n type CustomerAccountOptions,\n type CustomerAccount,\n} from './customer/types';\nimport {LanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\nimport {\n createCartHandler,\n type CartHandlerOptions,\n type CustomMethodsBase,\n type HydrogenCart,\n type HydrogenCartCustom,\n} from './cart/createCartHandler';\nimport {cartGetIdDefault} from './cart/cartGetIdDefault';\nimport {cartSetIdDefault} from './cart/cartSetIdDefault';\nimport type {\n HydrogenEnv,\n WaitUntil,\n HydrogenSession,\n StorefrontHeaders,\n HydrogenRouterContextProvider,\n} from './types';\nimport {type CrossRuntimeRequest, getStorefrontHeaders} from './utils/request';\nimport {warnOnce} from './utils/warning';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {RouterContextProvider} from 'react-router';\nimport {\n storefrontContext,\n cartContext,\n customerAccountContext,\n envContext,\n sessionContext,\n waitUntilContext,\n} from './context-keys';\n\nexport type HydrogenContextOptions<\n TSession extends HydrogenSession = HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> = {\n /* Environment variables from the fetch function */\n env: TEnv;\n /* Request object from the fetch function */\n request: CrossRuntimeRequest;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n /** Storefront client overwrite options. See documentation for createStorefrontClient for more information. */\n storefront?: {\n /** Storefront API headers. Default values set from request header. */\n headers?: CreateStorefrontClientOptions<TI18n>['storefrontHeaders'];\n /** Override the Storefront API version for this query. */\n apiVersion?: CreateStorefrontClientOptions<TI18n>['storefrontApiVersion'];\n };\n /** Customer Account client overwrite options. See documentation for createCustomerAccountClient for more information. */\n customerAccount?: {\n /** Override the version of the API */\n apiVersion?: CustomerAccountOptions['customerApiVersion'];\n /** This is the route in your app that authorizes the customer after logging in. Make sure to call `customer.authorize()` within the loader on this route. It defaults to `/account/authorize`. */\n authUrl?: CustomerAccountOptions['authUrl'];\n /** Use this method to overwrite the default logged-out redirect behavior. The default handler [throws a redirect](https://remix.run/docs/en/main/utils/redirect#:~:text=!session) to `/account/login` with current path as `return_to` query param. */\n customAuthStatusHandler?: CustomerAccountOptions['customAuthStatusHandler'];\n /** Deprecated. `unstableB2b` is now stable. Please remove. */\n unstableB2b?: CustomerAccountOptions['unstableB2b'];\n };\n /** Cart handler overwrite options. See documentation for createCartHandler for more information. */\n cart?: {\n /** A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`. */\n getId?: CartHandlerOptions['getCartId'];\n /** A function that sets the cart ID. */\n setId?: CartHandlerOptions['setCartId'];\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n queryFragment?: CartHandlerOptions['cartQueryFragment'];\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n mutateFragment?: CartHandlerOptions['cartMutateFragment'];\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: TCustomMethods;\n };\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport interface HydrogenContext<\n TSession extends HydrogenSession = HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> {\n /** A GraphQL client for querying the [Storefront API](https://shopify.dev/docs/api/storefront). */\n storefront: StorefrontClient<TI18n>['storefront'];\n /** A GraphQL client for querying the [Customer Account API](https://shopify.dev/docs/api/customer). It also provides methods to authenticate and check if the user is logged in. */\n customerAccount: CustomerAccount;\n /** A collection of utilities used to interact with the cart. */\n cart: TCustomMethods extends CustomMethodsBase\n ? HydrogenCartCustom<TCustomMethods>\n : HydrogenCart;\n /* Request object from the fetch function */\n env: TEnv;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n}\n\nexport interface HydrogenContextOverloads<\n TSession extends HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> {\n storefront: StorefrontClient<TI18n>['storefront'];\n customerAccount: CustomerAccount;\n cart: TCustomMethods extends CustomMethodsBase\n ? HydrogenCartCustom<TCustomMethods>\n : HydrogenCart;\n env: TEnv;\n waitUntil?: WaitUntil;\n session: TSession;\n}\n\nexport function createHydrogenContext<\n TSession extends HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n TAdditionalContext extends Record<string, any> = {},\n>(\n options: HydrogenContextOptions<TSession, TCustomMethods, TI18n, TEnv>,\n additionalContext?: TAdditionalContext,\n): HydrogenRouterContextProvider<TSession, TCustomMethods, TI18n, TEnv> &\n TAdditionalContext {\n const {\n env,\n request,\n cache,\n waitUntil,\n i18n,\n session,\n logErrors,\n storefront: storefrontOptions = {},\n customerAccount: customerAccountOptions,\n cart: cartOptions = {},\n buyerIdentity,\n } = options;\n\n if (!session) {\n console.warn(\n `[h2:warn:createHydrogenContext] A session object is required to create hydrogen context.`,\n );\n }\n\n if (customerAccountOptions?.unstableB2b) {\n warnOnce(\n '[h2:warn:createHydrogenContext] `customerAccount.unstableB2b` is now stable. Please remove the `unstableB2b` option.',\n );\n }\n\n /**\n * Create Hydrogen's Storefront client.\n */\n const {storefront} = createStorefrontClient<TI18n>({\n // share options\n cache,\n waitUntil,\n i18n,\n logErrors,\n\n // storefrontOptions\n storefrontHeaders:\n storefrontOptions.headers || getStorefrontHeaders(request),\n storefrontApiVersion: storefrontOptions.apiVersion,\n\n // defaults\n storefrontId: env.PUBLIC_STOREFRONT_ID,\n storeDomain: env.PUBLIC_STORE_DOMAIN,\n privateStorefrontToken: env.PRIVATE_STOREFRONT_API_TOKEN,\n publicStorefrontToken: env.PUBLIC_STOREFRONT_API_TOKEN,\n });\n\n const customerAccount = createCustomerAccountClient({\n // share options\n session,\n request,\n waitUntil,\n logErrors,\n\n // customerAccountOptions\n customerApiVersion: customerAccountOptions?.apiVersion,\n authUrl: customerAccountOptions?.authUrl,\n customAuthStatusHandler: customerAccountOptions?.customAuthStatusHandler,\n\n // locale - i18n.language is a union of StorefrontLanguageCode | CustomerLanguageCode\n // We cast here because createCustomerAccountClient expects CustomerLanguageCode specifically,\n // but the union type is compatible since most language codes overlap between the two APIs\n language: i18n?.language as LanguageCode | undefined,\n\n // defaults\n customerAccountId: env.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,\n shopId: env.SHOP_ID,\n });\n\n /*\n * Create a cart handler that will be used to\n * create and update the cart in the session.\n */\n const cart = createCartHandler({\n // cartOptions\n getCartId: cartOptions.getId || cartGetIdDefault(request.headers),\n setCartId: cartOptions.setId || cartSetIdDefault(),\n cartQueryFragment: cartOptions.queryFragment,\n cartMutateFragment: cartOptions.mutateFragment,\n customMethods: cartOptions.customMethods,\n buyerIdentity,\n\n // defaults\n storefront,\n customerAccount,\n });\n\n // Create React Router context provider\n const routerProvider = new RouterContextProvider();\n\n // Set React Router context keys (enables context.get(storefrontContext))\n routerProvider.set(storefrontContext, storefront);\n routerProvider.set(cartContext, cart);\n routerProvider.set(customerAccountContext, customerAccount);\n routerProvider.set(envContext, env);\n routerProvider.set(sessionContext, session);\n if (waitUntil) {\n routerProvider.set(waitUntilContext, waitUntil);\n }\n\n // Create Hydrogen services map for direct property access\n const services = {\n storefront,\n cart,\n customerAccount,\n env,\n session,\n waitUntil,\n // Merge additional context properties (CMS clients, 3P SDKs, etc.)\n ...(additionalContext || {}),\n };\n\n // Create Proxy for hybrid access pattern - cleanest approach\n const hybridProvider = new Proxy(routerProvider, {\n get(target, prop, receiver) {\n // If it's a React Router method or property, use the target\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n // Bind methods to preserve 'this' context\n return typeof value === 'function' ? value.bind(target) : value;\n }\n\n // If it's a Hydrogen service property, return from services\n if (prop in services) {\n return services[prop as keyof typeof services];\n }\n\n // Default behavior for other properties\n return Reflect.get(target, prop, receiver);\n },\n\n has(target, prop) {\n // Property exists if it's in target OR services\n return prop in target || prop in services;\n },\n\n ownKeys(target) {\n // Return all keys from both target and services\n return [...Reflect.ownKeys(target), ...Object.keys(services)];\n },\n\n getOwnPropertyDescriptor(target, prop) {\n // If property exists on target, return its descriptor\n if (prop in target) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n }\n\n // If property exists in services, return a descriptor that makes it enumerable\n if (prop in services) {\n return {\n enumerable: true,\n configurable: true,\n writable: false,\n value: services[prop as keyof typeof services],\n };\n }\n\n // Property doesn't exist\n return undefined;\n },\n });\n\n return hybridProvider as HydrogenRouterContextProvider<\n TSession,\n TCustomMethods,\n TI18n,\n TEnv\n > &\n TAdditionalContext;\n}\n\nexport type HydrogenContextOptionsForDocs<\n TSession extends HydrogenSession = HydrogenSession,\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> = {\n /* Environment variables from the fetch function */\n env: TEnv;\n /* Request object from the fetch function */\n request: CrossRuntimeRequest;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n /** Storefront client overwrite options. See documentation for createStorefrontClient for more information. */\n storefront?: {\n /** Storefront API headers. Default values set from request header. */\n headers?: StorefrontHeaders;\n /** Override the Storefront API version for this query. */\n apiVersion?: string;\n };\n /** Customer Account client overwrite options. See documentation for createCustomerAccountClient for more information. */\n customerAccount?: {\n /** Override the version of the API */\n apiVersion?: string;\n /** This is the route in your app that authorizes the customer after logging in. Make sure to call `customer.authorize()` within the loader on this route. It defaults to `/account/authorize`. */\n authUrl?: string;\n /** Use this method to overwrite the default logged-out redirect behavior. The default handler [throws a redirect](https://remix.run/docs/en/main/utils/redirect#:~:text=!session) to `/account/login` with current path as `return_to` query param. */\n customAuthStatusHandler?: () => Response | NonNullable<unknown> | null;\n /** Deprecated. `unstableB2b` is now stable. Please remove. */\n unstableB2b?: boolean;\n };\n /** Cart handler overwrite options. See documentation for createCartHandler for more information. */\n cart?: {\n /** A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`. */\n getId?: () => string | undefined;\n /** A function that sets the cart ID. */\n setId?: (cartId: string) => Headers;\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n queryFragment?: string;\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n mutateFragment?: string;\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: Record<string, Function>;\n };\n /**\n * Buyer identity. Default buyer identity is passed to cartCreate.\n */\n buyerIdentity?: CartBuyerIdentityInput;\n};\n","import {\n createRequestHandler as createReactRouterRequestHandler,\n type AppLoadContext,\n type RouterContextProvider,\n type ServerBuild,\n} from 'react-router';\nimport {storefrontContext} from './context-keys';\nimport {HYDROGEN_SFAPI_PROXY_KEY} from './constants';\nimport {appendServerTimingHeader} from './utils/server-timing';\nimport {warnOnce} from './utils/warning';\n\ntype CreateRequestHandlerOptions<Context = unknown> = {\n /** React Router's server build */\n build: ServerBuild;\n /** React Router's mode */\n mode?: string;\n /**\n * Function to provide the load context for each request.\n * It must contain Hydrogen's storefront client instance\n * for other Hydrogen utilities to work properly.\n */\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * Whether to include the `powered-by` header in responses\n * @default true\n */\n poweredByHeader?: boolean;\n /**\n * Collect tracking information from subrequests such as cookies\n * and forward them to the browser. Disable this if you are not\n * using Hydrogen's built-in analytics.\n * @default true\n */\n collectTrackingInformation?: boolean;\n /**\n * Whether to proxy standard routes such as `/api/.../graphql.json` (Storefront API).\n * You can disable this if you are handling these routes yourself. Ensure that\n * the proxy works if you rely on Hydrogen's built-in behaviors such as analytics.\n * @default true\n */\n proxyStandardRoutes?: boolean;\n};\n\n/**\n * Creates a request handler for Hydrogen apps using React Router.\n */\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n poweredByHeader = true,\n getLoadContext,\n collectTrackingInformation = true,\n proxyStandardRoutes = true,\n}: CreateRequestHandlerOptions<Context>) {\n const handleRequest = createReactRouterRequestHandler(build, mode);\n\n const appendPoweredByHeader = poweredByHeader\n ? (response: Response) =>\n response.headers.append('powered-by', 'Shopify, Hydrogen')\n : undefined;\n\n return async (request: Request) => {\n const method = request.method;\n\n if ((method === 'GET' || method === 'HEAD') && request.body) {\n return new Response(`${method} requests cannot have a body`, {\n status: 400,\n });\n }\n\n const url = new URL(request.url);\n\n if (url.pathname.includes('//')) {\n return new Response(null, {\n status: 301,\n headers: {\n location: url.pathname.replace(/\\/+/g, '/'),\n },\n });\n }\n\n const context = (await getLoadContext?.(request)) as\n | undefined\n | (RouterContextProvider & AppLoadContext);\n\n const storefront = context?.storefront || context?.get?.(storefrontContext);\n\n if (proxyStandardRoutes) {\n if (!storefront) {\n // TODO: this should throw error in future major version\n warnOnce(\n '[h2:createRequestHandler] Storefront instance is required to proxy standard routes.',\n );\n }\n\n if (storefront?.isStorefrontApiUrl(request)) {\n const response = await storefront.forward(request);\n appendPoweredByHeader?.(response);\n return response;\n }\n }\n\n const response = await handleRequest(request, context);\n\n if (storefront && proxyStandardRoutes) {\n if (collectTrackingInformation) {\n storefront.setCollectedSubrequestHeaders(response);\n }\n\n // TODO: assume SFAPI proxy is available in future major version\n // Signal that SFAPI proxy is enabled for document requests.\n // Note: sec-fetch-dest is automatically added by modern browsers,\n // but we also check the Accept header for other clients.\n const fetchDest = request.headers.get('sec-fetch-dest');\n if (\n (fetchDest && fetchDest === 'document') ||\n request.headers.get('accept')?.includes('text/html')\n ) {\n appendServerTimingHeader(response, {[HYDROGEN_SFAPI_PROXY_KEY]: '1'});\n }\n }\n\n appendPoweredByHeader?.(response);\n\n return response;\n };\n}\n\nexport type CreateRequestHandlerOptionsForDocs = {\n /** React Router's server build */\n build: ServerBuild;\n /** React Router's mode */\n mode?: string;\n /**\n * Function to provide the load context for each request.\n * It must contain Hydrogen's storefront client instance\n * for other Hydrogen utilities to work properly.\n */\n getLoadContext?: (request: Request) => Promise<unknown> | unknown;\n /**\n * Whether to include the `powered-by` header in responses.\n * @default true\n */\n poweredByHeader?: boolean;\n /**\n * Collect tracking information from subrequests such as cookies\n * and forward them to the browser. Disable this if you are not\n * using Hydrogen's built-in analytics.\n * @default true\n */\n collectTrackingInformation?: boolean;\n /**\n * Whether to proxy standard routes such as `/api/.../graphql.json` (Storefront API).\n * You can disable this if you are handling these routes yourself. Ensure that\n * the proxy works if you rely on Hydrogen's built-in behaviors such as analytics.\n * @default true\n */\n proxyStandardRoutes?: boolean;\n};\n","import {\n type ComponentType,\n createContext,\n createElement,\n type ReactNode,\n useContext,\n} from 'react';\nimport cspBuilder from 'content-security-policy-builder';\nimport {generateNonce} from './nonce';\n\nexport const NonceContext = createContext<string | undefined>(undefined);\nexport const NonceProvider = NonceContext.Provider;\n\nexport const useNonce = () => useContext(NonceContext);\n\ntype ContentSecurityPolicy = {\n /** A randomly generated nonce string that should be passed to any custom `script` element */\n nonce: string;\n /** The content security policy header */\n header: string;\n NonceProvider: ComponentType<{children: ReactNode}>;\n};\n\ntype DirectiveValues = string[] | string | boolean;\n\ntype CreateContentSecurityPolicy = {\n defaultSrc?: DirectiveValues;\n scriptSrc?: DirectiveValues;\n scriptSrcElem?: DirectiveValues;\n styleSrc?: DirectiveValues;\n imgSrc?: DirectiveValues;\n connectSrc?: DirectiveValues;\n fontSrc?: DirectiveValues;\n objectSrc?: DirectiveValues;\n mediaSrc?: DirectiveValues;\n frameSrc?: DirectiveValues;\n sandbox?: DirectiveValues;\n reportUri?: DirectiveValues;\n childSrc?: DirectiveValues;\n formAction?: DirectiveValues;\n frameAncestors?: DirectiveValues;\n pluginTypes?: DirectiveValues;\n baseUri?: DirectiveValues;\n reportTo?: DirectiveValues;\n workerSrc?: DirectiveValues;\n manifestSrc?: DirectiveValues;\n prefetchSrc?: DirectiveValues;\n navigateTo?: DirectiveValues;\n upgradeInsecureRequests?: boolean;\n blockAllMixedContent?: boolean;\n};\n\ntype ShopifyDomains = {\n /** The production shop checkout domain url. */\n checkoutDomain?: string;\n /** The production shop domain url. */\n storeDomain?: string;\n};\n\ntype ShopProp = {\n /** Shop specific configurations */\n shop?: ShopifyDomains;\n};\n\n/**\n * @param directives - Pass custom [content security policy directives](https://content-security-policy.com/). This is important if you load content in your app from third-party domains.\n */\nexport function createContentSecurityPolicy(\n props?: CreateContentSecurityPolicy & ShopProp,\n): ContentSecurityPolicy {\n const nonce = generateNonce();\n const header = createCSPHeader(nonce, props);\n\n const Provider = ({children}: {children: ReactNode}) => {\n return createElement(NonceProvider, {value: nonce}, children);\n };\n\n return {\n nonce,\n header,\n NonceProvider: Provider,\n };\n}\n\nfunction createCSPHeader(\n nonce: string,\n props?: CreateContentSecurityPolicy & ShopProp,\n): string {\n const {shop, ...directives} = props ?? {};\n const nonceString = `'nonce-${nonce}'`;\n const styleSrc = [\"'self'\", \"'unsafe-inline'\", 'https://cdn.shopify.com'];\n const connectSrc = [\n \"'self'\",\n 'https://cdn.shopify.com/',\n 'https://monorail-edge.shopifysvc.com',\n ];\n if (shop && shop.checkoutDomain) {\n connectSrc.push(`https://${shop.checkoutDomain}`);\n }\n\n if (shop && shop.storeDomain) {\n connectSrc.push(`https://${shop.storeDomain}`);\n }\n\n const defaultSrc = [\n \"'self'\",\n nonceString,\n 'https://cdn.shopify.com',\n // Used for the Customer Account API\n 'https://shopify.com',\n ];\n\n const defaultDirectives: Record<string, string[] | string | boolean> = {\n baseUri: [\"'self'\"],\n defaultSrc,\n frameAncestors: [\"'none'\"],\n styleSrc,\n connectSrc,\n };\n\n // Support localhost in development\n if (process.env.NODE_ENV === 'development') {\n defaultDirectives.styleSrc = [...styleSrc, 'http://localhost:*'];\n defaultDirectives.defaultSrc = [...defaultSrc, 'http://localhost:*'];\n defaultDirectives.connectSrc = [\n ...connectSrc,\n 'http://localhost:*',\n // For HMR:\n 'ws://localhost:*',\n 'ws://127.0.0.1:*',\n 'ws://*.tryhydrogen.dev:*',\n ];\n }\n\n const combinedDirectives = Object.assign({}, defaultDirectives, directives);\n\n //add defaults if it was override\n for (const key in defaultDirectives) {\n const directive = directives[key as keyof CreateContentSecurityPolicy];\n if (key && directive) {\n combinedDirectives[key] = addCspDirective(\n directive,\n defaultDirectives[key],\n );\n }\n }\n\n // Make sure that at least script-src includes a nonce directive.\n // If someone doesn't want a nonce in their CSP, they probably\n // shouldn't use our utilities and just manually create their CSP.\n if (combinedDirectives.scriptSrc instanceof Array) {\n combinedDirectives.scriptSrc = [\n ...combinedDirectives.scriptSrc.filter((ss) => !ss.startsWith(`'nonce`)),\n nonceString,\n ];\n } else if (combinedDirectives.defaultSrc instanceof Array) {\n combinedDirectives.defaultSrc = [\n ...combinedDirectives.defaultSrc.filter((ss) => !ss.startsWith(`'nonce`)),\n nonceString,\n ];\n }\n\n return cspBuilder({\n directives: combinedDirectives,\n });\n}\n\nfunction addCspDirective(\n currentValue: string[] | string | boolean,\n value: string[] | string | boolean,\n): boolean | string[] {\n const normalizedValue = typeof value === 'string' ? [value] : value;\n const normalizedCurrentValue = Array.isArray(currentValue)\n ? currentValue\n : [String(currentValue)];\n\n const newValue = Array.isArray(normalizedValue)\n ? // If the default directive is `none`, don't\n // merge the override with the default value.\n normalizedValue.every((a) => a === `'none'`)\n ? normalizedCurrentValue\n : [...normalizedCurrentValue, ...normalizedValue]\n : normalizedValue;\n\n return newValue;\n}\n","import {forwardRef, ScriptHTMLAttributes, HTMLAttributes} from 'react';\nimport {useNonce} from './csp';\nimport {useLoadScript} from '@shopify/hydrogen-react';\n\ntype ScriptProps = HydrogenScriptProps & ScriptAttributes;\n\ninterface HydrogenScriptProps {\n /** Wait to load the script until after the page hydrates. This prevents hydration errors for scripts that modify the DOM. Note: For security, `nonce` is not supported when using `waitForHydration`. Instead you need to add the domain of the script directly to your [Content Securitiy Policy directives](https://shopify.dev/docs/storefronts/headless/hydrogen/content-security-policy#step-3-customize-the-content-security-policy).*/\n waitForHydration?: boolean;\n}\n\ninterface ScriptAttributes extends ScriptHTMLAttributes<HTMLScriptElement> {}\n\nexport const Script = forwardRef<HTMLScriptElement, ScriptProps>(\n (props, ref) => {\n const {waitForHydration, src, ...rest} = props;\n\n const nonce = useNonce();\n\n if (waitForHydration) return <LazyScript src={src} options={rest} />;\n\n return (\n <script\n suppressHydrationWarning\n {...rest}\n src={src}\n nonce={nonce}\n ref={ref}\n />\n );\n },\n);\n\nfunction LazyScript({\n src,\n options,\n}: {\n src?: string;\n options: JSX.IntrinsicElements['script'];\n}) {\n if (!src)\n throw new Error(\n '`waitForHydration` with the Script component requires a `src` prop',\n );\n\n useLoadScript(src, {\n attributes: options as Record<string, string>,\n });\n\n return null;\n}\n","import type {RouteConfigEntry} from '@react-router/dev/routes';\n\n// Make this transform the existing routes instead.\nexport async function hydrogenRoutes(\n currentRoutes: Array<RouteConfigEntry>,\n): Promise<Array<RouteConfigEntry>> {\n // Only run this in development and test environments.\n const env = process.env.NODE_ENV;\n if (env === 'production') {\n return currentRoutes;\n }\n\n // Dynamic import to avoid loading Node.js modules in worker environment\n const {getVirtualRoutesV3} = await import('../vite/get-virtual-routes');\n const {layout, routes: virtualRoutes} = await getVirtualRoutesV3();\n\n const childVirtualRoutes = virtualRoutes.map(({path, file, index, id}) => {\n return {\n file,\n id,\n index,\n path,\n };\n });\n\n const virtualLayout = {\n file: layout.file,\n children: childVirtualRoutes,\n };\n\n // The virtual root should land after any existing routes because of the root path\n // handling.\n return [...currentRoutes, virtualLayout];\n}\n","import {useFetchers} from 'react-router';\n\nexport function useOptimisticData<T>(identifier: string) {\n const fetchers = useFetchers();\n const data: Record<string, unknown> = {};\n\n for (const {formData} of fetchers) {\n if (formData?.get('optimistic-identifier') === identifier) {\n try {\n if (formData.has('optimistic-data')) {\n const dataInForm: unknown = JSON.parse(\n String(formData.get('optimistic-data')),\n );\n Object.assign(data, dataInForm);\n }\n } catch {\n // do nothing\n }\n }\n }\n return data as T;\n}\n\nexport type OptimisticInputProps = {\n /**\n * A unique identifier for the optimistic input. Use the same identifier in `useOptimisticData`\n * to retrieve the optimistic data from actions.\n */\n id: string;\n /**\n * The data to be stored in the optimistic input. Use for creating an optimistic successful state\n * of this form action.\n */\n data: Record<string, unknown>;\n};\n\nexport function OptimisticInput({id, data}: OptimisticInputProps) {\n return (\n <>\n <input type=\"hidden\" name=\"optimistic-identifier\" value={id} />\n <input\n type=\"hidden\"\n name=\"optimistic-data\"\n value={JSON.stringify(data)}\n />\n </>\n );\n}\n","import {\n createElement,\n useEffect,\n useMemo,\n useRef,\n forwardRef,\n useState,\n type Ref,\n type FC,\n type ForwardRefExoticComponent,\n type RefAttributes,\n} from 'react';\nimport type {\n Maybe,\n PageInfo,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {flattenConnection} from '@shopify/hydrogen-react';\nimport {\n Link,\n type LinkProps,\n useNavigation,\n useLocation,\n useNavigate,\n} from 'react-router';\n\ndeclare global {\n interface Window {\n // Use a global variable to keep track\n // of when the page finishes hydrating\n __hydrogenHydrated?: boolean;\n }\n}\n\ntype Connection<NodesType> =\n | {\n nodes: Array<NodesType>;\n pageInfo: PageInfo;\n }\n | {\n edges: Array<{\n node: NodesType;\n }>;\n pageInfo: PageInfo;\n };\n\ntype PaginationState<NodesType> = {\n pagination?: {\n [key: string]: {\n nodes: Array<NodesType>;\n pageInfo?: PageInfo | null;\n };\n };\n};\n\ninterface PaginationInfo<NodesType> {\n /** The paginated array of nodes. You should map over and render this array. */\n nodes: Array<NodesType>;\n /** The `<NextLink>` is a helper component that makes it easy to navigate to the next page of paginated data. Alternatively you can build your own `<Link>` component: `<Link to={nextPageUrl} state={state} preventScrollReset />` */\n NextLink: ForwardRefExoticComponent<\n Omit<LinkProps, 'to'> & RefAttributes<HTMLAnchorElement>\n >;\n /** The `<PreviousLink>` is a helper component that makes it easy to navigate to the previous page of paginated data. Alternatively you can build your own `<Link>` component: `<Link to={previousPageUrl} state={state} preventScrollReset />` */\n PreviousLink: ForwardRefExoticComponent<\n Omit<LinkProps, 'to'> & RefAttributes<HTMLAnchorElement>\n >;\n /** The URL to the previous page of paginated data. Use this prop to build your own `<Link>` component. */\n previousPageUrl: string;\n /** The URL to the next page of paginated data. Use this prop to build your own `<Link>` component. */\n nextPageUrl: string;\n /** True if the cursor has next paginated data */\n hasNextPage: boolean;\n /** True if the cursor has previous paginated data */\n hasPreviousPage: boolean;\n /** True if we are in the process of fetching another page of data */\n isLoading: boolean;\n /** The `state` property is important to use when building your own `<Link>` component if you want paginated data to continuously append to the page. This means that every time the user clicks \"Next page\", the next page of data will be apppended inline with the previous page. If you want the whole page to re-render with only the next page results, do not pass the `state` prop to the Remix `<Link>` component. */\n state: {\n nodes: Array<NodesType>;\n pageInfo: {\n endCursor: Maybe<string> | undefined;\n startCursor: Maybe<string> | undefined;\n hasPreviousPage: boolean;\n };\n };\n}\n\ntype PaginationProps<NodesType> = {\n /** The response from `storefront.query` for a paginated request. Make sure the query is passed pagination variables and that the query has `pageInfo` with `hasPreviousPage`, `hasNextpage`, `startCursor`, and `endCursor` defined. */\n connection: Connection<NodesType>;\n /** A render prop that includes pagination data and helpers. */\n children: PaginationRenderProp<NodesType>;\n /** A namespace for the pagination component to avoid URL param conflicts when using multiple `Pagination` components on a single page. */\n namespace?: string;\n};\n\ntype PaginationRenderProp<NodesType> = FC<PaginationInfo<NodesType>>;\n\n/**\n *\n * The [Storefront API uses cursors](https://shopify.dev/docs/api/usage/pagination-graphql) to paginate through lists of data\n * and the \\`<Pagination />\\` component makes it easy to paginate data from the Storefront API.\n *\n * @prop connection The response from `storefront.query` for a paginated request. Make sure the query is passed pagination variables and that the query has `pageInfo` with `hasPreviousPage`, `hasNextpage`, `startCursor`, and `endCursor` defined.\n * @prop children A render prop that includes pagination data and helpers.\n */\nexport function Pagination<NodesType>({\n connection,\n children = () => {\n console.warn('<Pagination> requires children to work properly');\n return null;\n },\n namespace = '',\n}: PaginationProps<NodesType>): ReturnType<FC> {\n const [isLoading, setIsLoading] = useState(false);\n const transition = useNavigation();\n const location = useLocation();\n const navigate = useNavigate();\n\n // Reset loading state once the transition state is idle\n useEffect(() => {\n if (transition.state === 'idle') {\n setIsLoading(false);\n }\n }, [transition.state]);\n\n const {\n endCursor,\n hasNextPage,\n hasPreviousPage,\n nextPageUrl,\n nodes,\n previousPageUrl,\n startCursor,\n } = usePagination<NodesType>(connection, namespace);\n\n const state = useMemo(\n () => ({\n ...location.state,\n pagination: {\n ...(location.state?.pagination || {}),\n [namespace]: {\n pageInfo: {\n endCursor,\n hasPreviousPage,\n hasNextPage,\n startCursor,\n },\n nodes,\n },\n },\n }),\n [\n endCursor,\n hasNextPage,\n hasPreviousPage,\n startCursor,\n nodes,\n namespace,\n location.state,\n ],\n );\n\n const NextLink = useMemo(\n () =>\n forwardRef<HTMLAnchorElement, Omit<LinkProps, 'to'>>(\n function NextLink(props, ref) {\n return hasNextPage\n ? createElement(Link, {\n preventScrollReset: true,\n ...props,\n to: nextPageUrl,\n state,\n replace: true,\n ref,\n onClick: () => setIsLoading(true),\n })\n : null;\n },\n ),\n [hasNextPage, nextPageUrl, state],\n );\n\n const PreviousLink = useMemo(\n () =>\n forwardRef<HTMLAnchorElement, Omit<LinkProps, 'to'>>(\n function PrevLink(props, ref) {\n return hasPreviousPage\n ? createElement(Link, {\n preventScrollReset: true,\n ...props,\n to: previousPageUrl,\n state,\n replace: true,\n ref,\n onClick: () => setIsLoading(true),\n })\n : null;\n },\n ),\n [hasPreviousPage, previousPageUrl, state],\n );\n\n return children({\n state,\n hasNextPage,\n hasPreviousPage,\n isLoading,\n nextPageUrl,\n nodes,\n previousPageUrl,\n NextLink,\n PreviousLink,\n });\n}\n\nfunction getParamsWithoutPagination(\n paramsString?: string,\n state?: PaginationState<any>,\n) {\n const params = new URLSearchParams(paramsString);\n\n // Get all namespaces from state\n const activeNamespaces = Object.keys(state?.pagination || {});\n\n activeNamespaces.forEach((namespace) => {\n // Clean up cursor and direction params for both namespaced and non-namespaced pagination\n const namespacePrefix = namespace === '' ? '' : `${namespace}_`;\n const cursorParam = `${namespacePrefix}cursor`;\n const directionParam = `${namespacePrefix}direction`;\n params.delete(cursorParam);\n params.delete(directionParam);\n });\n\n return params.toString();\n}\n\nfunction makeError(prop: string) {\n throw new Error(\n `The Pagination component requires ${\n '`' + prop + '`'\n } to be a part of your query. See the guide on how to setup your query to include ${\n '`' + prop + '`'\n }: https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/pagination#setup-the-paginated-query`,\n );\n}\n\n/**\n * Get cumulative pagination logic for a given connection\n */\nexport function usePagination<NodesType>(\n connection: Connection<NodesType>,\n namespace: string = '',\n): Omit<\n PaginationInfo<NodesType>,\n 'isLoading' | 'state' | 'NextLink' | 'PreviousLink'\n> & {\n startCursor: Maybe<string> | undefined;\n endCursor: Maybe<string> | undefined;\n} {\n if (!connection.pageInfo) {\n makeError('pageInfo');\n }\n\n if (typeof connection.pageInfo.startCursor === 'undefined') {\n makeError('pageInfo.startCursor');\n }\n\n if (typeof connection.pageInfo.endCursor === 'undefined') {\n makeError('pageInfo.endCursor');\n }\n\n if (typeof connection.pageInfo.hasNextPage === 'undefined') {\n makeError('pageInfo.hasNextPage');\n }\n\n if (typeof connection.pageInfo.hasPreviousPage === 'undefined') {\n makeError('pageInfo.hasPreviousPage');\n }\n\n const transition = useNavigation();\n const navigate = useNavigate();\n const {state, search, pathname} = useLocation() as {\n state?: PaginationState<NodesType>;\n search?: string;\n pathname?: string;\n };\n\n const cursorParam = namespace ? `${namespace}_cursor` : 'cursor';\n const directionParam = namespace ? `${namespace}_direction` : 'direction';\n\n const params = new URLSearchParams(search);\n const direction = params.get(directionParam);\n const isPrevious = direction === 'previous';\n\n const nodes = useMemo(() => {\n if (\n !globalThis?.window?.__hydrogenHydrated ||\n !state?.pagination?.[namespace]?.nodes\n ) {\n return flattenConnection(connection);\n }\n\n if (isPrevious) {\n return [\n ...flattenConnection(connection),\n ...(state.pagination[namespace].nodes || []),\n ];\n } else {\n return [\n ...(state.pagination[namespace].nodes || []),\n ...flattenConnection(connection),\n ];\n }\n }, [state, connection, namespace]);\n\n const currentPageInfo = useMemo(() => {\n const hydrogenHydrated = globalThis?.window?.__hydrogenHydrated;\n const stateInfo = state?.pagination?.[namespace]?.pageInfo;\n\n let pageStartCursor =\n !hydrogenHydrated || stateInfo?.startCursor === undefined\n ? connection.pageInfo.startCursor\n : stateInfo.startCursor;\n\n let pageEndCursor =\n !hydrogenHydrated || stateInfo?.endCursor === undefined\n ? connection.pageInfo.endCursor\n : stateInfo.endCursor;\n\n let previousPageExists =\n !hydrogenHydrated || stateInfo?.hasPreviousPage === undefined\n ? connection.pageInfo.hasPreviousPage\n : stateInfo.hasPreviousPage;\n\n let nextPageExists =\n !hydrogenHydrated || stateInfo?.hasNextPage === undefined\n ? connection.pageInfo.hasNextPage\n : stateInfo.hasNextPage;\n\n // Update page info based on current connection\n if (state?.pagination?.[namespace]?.nodes) {\n if (isPrevious) {\n pageStartCursor = connection.pageInfo.startCursor;\n previousPageExists = connection.pageInfo.hasPreviousPage;\n } else {\n pageEndCursor = connection.pageInfo.endCursor;\n nextPageExists = connection.pageInfo.hasNextPage;\n }\n }\n\n return {\n startCursor: pageStartCursor,\n endCursor: pageEndCursor,\n hasPreviousPage: previousPageExists,\n hasNextPage: nextPageExists,\n };\n }, [\n isPrevious,\n state,\n namespace,\n connection.pageInfo.hasNextPage,\n connection.pageInfo.hasPreviousPage,\n connection.pageInfo.startCursor,\n connection.pageInfo.endCursor,\n ]);\n\n // Keep track of the current URL state, to compare whenever the URL changes\n const urlRef = useRef({\n params: getParamsWithoutPagination(search, state),\n pathname,\n });\n\n useEffect(() => {\n // Set a global variable to keep track of when the page finishes hydrating.\n // We can't use local state or a ref because it will be reset on soft navigations\n // to the page. This variable allows us to use the SSR'd data on the first render,\n // preventing hydration errors. On soft navigations, like browser back/forward\n // navigation, instead of using the SSR'd data, we use the data from location state.\n window.__hydrogenHydrated = true;\n }, []);\n\n useEffect(() => {\n const currentParams = getParamsWithoutPagination(search, state);\n const previousParams = urlRef.current.params;\n const pathChanged = pathname !== urlRef.current.pathname;\n const nonPaginationParamsChanged = currentParams !== previousParams;\n\n if (\n // Only clean up if the base URL or non-pagination params change\n (pathChanged || nonPaginationParamsChanged) &&\n // And we're not on the initial load\n !(transition.state === 'idle' && !transition.location)\n ) {\n urlRef.current = {\n pathname,\n params: getParamsWithoutPagination(search, state),\n };\n navigate(`${pathname}?${getParamsWithoutPagination(search, state)}`, {\n replace: true,\n preventScrollReset: true,\n state: {nodes: undefined, pageInfo: undefined},\n });\n }\n }, [pathname, search, state]);\n\n const previousPageUrl = useMemo(() => {\n const params = new URLSearchParams(search);\n params.set(directionParam, 'previous');\n currentPageInfo.startCursor &&\n params.set(cursorParam, currentPageInfo.startCursor);\n return `?${params.toString()}`;\n }, [search, currentPageInfo.startCursor]);\n\n const nextPageUrl = useMemo(() => {\n const params = new URLSearchParams(search);\n params.set(directionParam, 'next');\n currentPageInfo.endCursor &&\n params.set(cursorParam, currentPageInfo.endCursor);\n return `?${params.toString()}`;\n }, [search, currentPageInfo.endCursor]);\n\n return {...currentPageInfo, previousPageUrl, nextPageUrl, nodes};\n}\n\n/**\n * @param request The request object passed to your Remix loader function.\n * @param options Options for how to configure the pagination variables. Includes the ability to change how many nodes are within each page as well as a namespace to avoid URL param conflicts when using multiple `Pagination` components on a single page.\n *\n * @returns Variables to be used with the `storefront.query` function\n */\nexport function getPaginationVariables(\n request: Request,\n options: {pageBy: number; namespace?: string} = {pageBy: 20},\n) {\n if (typeof request?.url === 'undefined') {\n throw new Error(\n 'getPaginationVariables must be called with the Request object passed to your loader function',\n );\n }\n\n const {pageBy, namespace = ''} = options;\n const searchParams = new URLSearchParams(new URL(request.url).search);\n\n const cursorParam = namespace ? `${namespace}_cursor` : 'cursor';\n const directionParam = namespace ? `${namespace}_direction` : 'direction';\n\n const cursor = searchParams.get(cursorParam) ?? undefined;\n const direction =\n searchParams.get(directionParam) === 'previous' ? 'previous' : 'next';\n const isPrevious = direction === 'previous';\n\n const prevPage = {\n last: pageBy,\n startCursor: cursor ?? null,\n };\n\n const nextPage = {\n first: pageBy,\n endCursor: cursor ?? null,\n };\n\n const variables = isPrevious ? prevPage : nextPage;\n\n return variables;\n}\n","import {useNavigation} from 'react-router';\nimport {ProductVariant} from '@shopify/hydrogen-react/storefront-api-types';\nimport {useEffect, useState} from 'react';\nimport type {PartialDeep} from 'type-fest';\n\ntype OptimisticVariant<T> = T & {\n isOptimistic?: boolean;\n};\n\ntype OptimisticVariantInput = PartialDeep<ProductVariant>;\n\ntype OptimisticProductVariants =\n | Array<PartialDeep<ProductVariant>>\n | Promise<Array<PartialDeep<ProductVariant>>>\n | PartialDeep<ProductVariant>\n | Promise<PartialDeep<ProductVariant>>;\n\n/**\n * @param selectedVariant The `selectedVariant` field queried with `variantBySelectedOptions`.\n * @param variants The available product variants for the product. This can be an array of variants, a promise that resolves to an array of variants, or an object with a `product` key that contains the variants.\n * @returns A new product object where the `selectedVariant` property is set to the variant that matches the current URL search params. If no variant is found, the original product object is returned. The `isOptimistic` property is set to `true` if the `selectedVariant` has been optimistically changed.\n */\nexport function useOptimisticVariant<\n SelectedVariant = OptimisticVariantInput,\n Variants = OptimisticProductVariants,\n>(\n selectedVariant: SelectedVariant,\n variants: Variants,\n): OptimisticVariant<SelectedVariant> {\n const navigation = useNavigation();\n const [resolvedVariants, setResolvedVariants] = useState<\n Array<PartialDeep<ProductVariant>>\n >([]);\n\n useEffect(() => {\n Promise.resolve(variants)\n .then((productWithVariants) => {\n if (productWithVariants) {\n setResolvedVariants(\n productWithVariants instanceof Array\n ? productWithVariants\n : (productWithVariants as PartialDeep<ProductVariant>).product\n ?.variants?.nodes || [],\n );\n }\n })\n .catch((error) => {\n reportError(\n new Error(\n '[h2:error:useOptimisticVariant] An error occurred while resolving the variants for the optimistic product hook.',\n {\n cause: error,\n },\n ),\n );\n });\n }, [JSON.stringify(variants)]);\n\n if (navigation.state === 'loading') {\n const queryParams = new URLSearchParams(navigation.location.search);\n let reportedError = false;\n\n // Find matching variant\n const matchingVariant = resolvedVariants.find((variant) => {\n if (!variant.selectedOptions) {\n if (!reportedError) {\n reportedError = true;\n reportError(\n new Error(\n '[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field.',\n ),\n );\n }\n return false;\n }\n\n return variant.selectedOptions.every((option) => {\n return queryParams.get(option.name) === option.value;\n });\n });\n\n if (matchingVariant) {\n return {\n ...matchingVariant,\n isOptimistic: true,\n } as OptimisticVariant<SelectedVariant>;\n }\n }\n\n return selectedVariant as OptimisticVariant<SelectedVariant>;\n}\n","import {useLocation, useNavigation} from 'react-router';\nimport {flattenConnection} from '@shopify/hydrogen-react';\nimport type {\n ProductOption,\n ProductOptionValue,\n ProductVariant,\n ProductVariantConnection,\n SelectedOptionInput,\n Maybe,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {type ReactNode, useMemo, createElement, Fragment} from 'react';\nimport type {PartialDeep} from 'type-fest';\nimport {warnOnce} from '../utils/warning';\n\nexport type VariantOption = {\n name: string;\n value?: string;\n values: Array<VariantOptionValue>;\n};\n\ntype PartialProductOptionValues = PartialDeep<ProductOptionValue>;\ntype PartialProductOption = PartialDeep<\n Omit<ProductOption, 'optionValues'> & {\n optionValues: Array<PartialProductOptionValues>;\n }\n>;\n\nexport type VariantOptionValue = {\n value: string;\n isAvailable: boolean;\n to: string;\n search: string;\n isActive: boolean;\n variant?: PartialDeep<ProductVariant, {recurseIntoArrays: true}>;\n optionValue: PartialProductOptionValues;\n};\n\n/**\n * @deprecated VariantSelector will be deprecated and removed in the next major version 2025-07\n * Please use [getProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getproductoptions),\n * [getSelectedProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getselectedproductoptions),\n * [getAdjacentAndFirstAvailableVariants](https://shopify.dev/docs/api/hydrogen/latest/utilities/getadjacentandfirstavailablevariants) utils instead.\n * and [useSelectedOptionInUrlParam](https://shopify.dev/docs/api/hydrogen/latest/utilities/useselectedoptioninurlparam)\n * For a full implementation see the Skeleton template [routes/product.$handle.tsx](https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx).\n */\ntype VariantSelectorProps = {\n /** The product handle for all of the variants */\n handle: string;\n /** Product options from the [Storefront API](/docs/api/storefront/2025-07/objects/ProductOption). Make sure both `name` and `values` are a part of your query. */\n options: Array<PartialProductOption> | undefined;\n /** Product variants from the [Storefront API](/docs/api/storefront/2025-07/objects/ProductVariant). You only need to pass this prop if you want to show product availability. If a product option combination is not found within `variants`, it is assumed to be available. Make sure to include `availableForSale` and `selectedOptions.name` and `selectedOptions.value`. */\n variants?:\n | PartialDeep<ProductVariantConnection>\n | Array<PartialDeep<ProductVariant>>;\n /** By default all products are under /products. Use this prop to provide a custom path. */\n productPath?: string;\n /** Should the VariantSelector wait to update until after the browser navigates to a variant. */\n waitForNavigation?: boolean;\n /** An optional selected variant to use for the initial state if no URL parameters are set */\n selectedVariant?: Maybe<PartialDeep<ProductVariant>>;\n children: ({option}: {option: VariantOption}) => ReactNode;\n};\n\n/**\n * @deprecated VariantSelector will be deprecated and removed in the next major version 2025-07\n * Please use [getProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getproductoptions),\n * [getSelectedProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getselectedproductoptions),\n * [getAdjacentAndFirstAvailableVariants](https://shopify.dev/docs/api/hydrogen/latest/utilities/getadjacentandfirstavailablevariants) utils instead.\n * and [useSelectedOptionInUrlParam](https://shopify.dev/docs/api/hydrogen/latest/utilities/useselectedoptioninurlparam)\n * For a full implementation see the Skeleton template [routes/product.$handle.tsx](https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx).\n */\nexport function VariantSelector({\n handle,\n options: _options = [],\n variants: _variants = [],\n productPath = 'products',\n waitForNavigation = false,\n selectedVariant,\n children,\n}: VariantSelectorProps) {\n // Deprecation notice for product.options.values\n // TODO: Remove this after product.options.values is removed from the Storefront API\n let options = _options;\n if (options[0]?.values) {\n warnOnce(\n '[h2:warn:VariantSelector] product.options.values is deprecated. Use product.options.optionValues instead.',\n );\n\n if (!!options[0] && !options[0].optionValues) {\n // Convert the old values format to the new optionValues format\n options = _options.map((option) => ({\n ...option,\n optionValues: option.values?.map((value) => ({name: value})) || [],\n }));\n }\n }\n\n const variants =\n _variants instanceof Array ? _variants : flattenConnection(_variants);\n\n const {searchParams, path, alreadyOnProductPage} = useVariantPath(\n handle,\n productPath,\n waitForNavigation,\n );\n\n // If an option only has one value, it doesn't need a UI to select it\n // But instead it always needs to be added to the product options so\n // the SFAPI properly finds the variant\n const optionsWithOnlyOneValue = options.filter(\n (option) => option?.optionValues?.length === 1,\n );\n\n // If a selected variant is provided, create a map of selected values\n const selectedVariantOptions = selectedVariant\n ? selectedVariant?.selectedOptions?.reduce<Record<string, string>>(\n (selectedValues, item) => {\n selectedValues[item.name] = item.value;\n return selectedValues;\n },\n {},\n )\n : {};\n\n return createElement(\n Fragment,\n null,\n ...useMemo(() => {\n return options.map((option) => {\n let activeValue;\n let availableValues: VariantOptionValue[] = [];\n\n for (let value of option.optionValues!) {\n // The clone the search params for each value, so we can calculate\n // a new URL for each option value pair\n const clonedSearchParams = new URLSearchParams(\n alreadyOnProductPage ? searchParams : undefined,\n );\n clonedSearchParams.set(option.name!, value.name!);\n\n // Because we hide options with only one value, they aren't selectable,\n // but they still need to get into the URL\n optionsWithOnlyOneValue.forEach((option) => {\n if (option.optionValues![0]!.name)\n clonedSearchParams.set(\n option.name!,\n option.optionValues![0]!.name,\n );\n });\n\n const variant = variants.find((variant) => {\n return variant?.selectedOptions?.every((selectedOption) => {\n // Get the selected value from the URL (default) or the selected variant\n const selectedValue =\n clonedSearchParams.get(selectedOption?.name!) ||\n selectedVariantOptions?.[selectedOption?.name!];\n\n return selectedValue === selectedOption?.value;\n });\n });\n\n let selectedValue = searchParams.get(option.name!);\n\n if (!selectedValue && selectedVariant) {\n // If there's no value set via a URL parameter, default\n // to the value from the first available variant\n selectedValue = selectedVariantOptions?.[option.name!] || null;\n }\n\n const calculatedActiveValue = selectedValue\n ? // If a URL parameter exists for the current option, check if it equals the current value\n selectedValue === value.name\n : false;\n\n if (calculatedActiveValue) {\n // Save out the current value if it's active. This should only ever happen once.\n // Should we throw if it happens a second time?\n activeValue = value.name!;\n }\n\n const searchString = '?' + clonedSearchParams.toString();\n\n availableValues.push({\n value: value.name!,\n optionValue: value,\n isAvailable: variant ? variant.availableForSale! : true,\n to: path + searchString,\n search: searchString,\n isActive: calculatedActiveValue,\n variant,\n });\n }\n\n return children({\n option: {\n name: option.name!,\n value: activeValue,\n values: availableValues,\n },\n });\n });\n }, [options, variants, children]),\n );\n}\n\ntype GetSelectedProductOptions = (request: Request) => SelectedOptionInput[];\n\n/**\n * Extract searchParams from a Request instance and return an array of selected options.\n * @param request - The Request instance to extract searchParams from.\n * @returns An array of selected options.\n * @example Basic usage:\n * ```tsx\n *\n * import {getSelectedProductOptions} from '@shopify/hydrogen';\n *\n * // Given a request url of `/products/product-handle?color=red&size=large`\n *\n * const selectedOptions = getSelectedProductOptions(request);\n *\n * // selectedOptions will equal:\n * // [\n * // {name: 'color', value: 'red'},\n * // {name: 'size', value: 'large'}\n * // ]\n * ```\n **/\nexport const getSelectedProductOptions: GetSelectedProductOptions = (\n request,\n) => {\n if (typeof request?.url === 'undefined')\n throw new TypeError(`Expected a Request instance, got ${typeof request}`);\n\n const searchParams = new URL(request.url).searchParams;\n\n const selectedOptions: SelectedOptionInput[] = [];\n\n searchParams.forEach((value, name) => {\n selectedOptions.push({name, value});\n });\n\n return selectedOptions;\n};\n\nfunction useVariantPath(\n handle: string,\n productPath: string,\n waitForNavigation: boolean,\n) {\n const {pathname, search} = useLocation();\n const navigation = useNavigation();\n\n return useMemo(() => {\n const match = /(\\/[a-zA-Z]{2}-[a-zA-Z]{2}\\/)/g.exec(pathname);\n const isLocalePathname = match && match.length > 0;\n productPath = productPath.startsWith('/')\n ? productPath.substring(1)\n : productPath;\n\n const path = isLocalePathname\n ? `${match![0]}${productPath}/${handle}`\n : `/${productPath}/${handle}`;\n\n const searchParams = new URLSearchParams(\n // Remix doesn't update the location until pending loaders complete.\n // By default we use the destination search params to make selecting a variant\n // instant, but `waitForNavigation` makes the UI wait to update by only using\n // the active browser search params.\n waitForNavigation || navigation.state !== 'loading'\n ? search\n : navigation.location.search,\n );\n\n return {\n searchParams,\n // If the current pathname matches the product page, we need to make sure\n // that we append to the current search params. Otherwise all the search\n // params can be generated new.\n alreadyOnProductPage: path === pathname,\n path,\n };\n }, [pathname, search, waitForNavigation, handle, productPath, navigation]);\n}\n","import type {Preset} from '@react-router/dev/config';\n\n/**\n * Official Hydrogen Preset for React Router 7.12.x\n *\n * Provides optimal React Router configuration for Hydrogen applications on Oxygen.\n * Enables validated performance optimizations while ensuring CLI compatibility.\n *\n * React Router 7.12.x Feature Support Matrix for Hydrogen 2025.7.0\n *\n * +----------------------------------+----------+----------------------------------+\n * | Feature | Status | Notes |\n * +----------------------------------+----------+----------------------------------+\n * | CORE CONFIGURATION |\n * +----------------------------------+----------+----------------------------------+\n * | appDirectory: 'app' | Enabled | Core application structure |\n * | buildDirectory: 'dist' | Enabled | Build output configuration |\n * | ssr: true | Enabled | Server-side rendering |\n * +----------------------------------+----------+----------------------------------+\n * | PERFORMANCE FLAGS |\n * +----------------------------------+----------+----------------------------------+\n * | v8_middleware | Enabled | Required for Hydrogen context |\n * | v8_splitRouteModules | Enabled | Route code splitting |\n * | unstable_optimizeDeps | Enabled | Build performance optimization |\n * +----------------------------------+----------+----------------------------------+\n * | ROUTE DISCOVERY |\n * +----------------------------------+----------+----------------------------------+\n * | routeDiscovery: { mode: 'lazy' } | Default | Lazy route loading |\n * | routeDiscovery: { mode: 'init' } | Allowed | Eager route loading |\n * +----------------------------------+----------+----------------------------------+\n * | UNSUPPORTED FEATURES |\n * +----------------------------------+----------+----------------------------------+\n * | basename: '/path' | Blocked | CLI infrastructure limitation |\n * | prerender: ['/routes'] | Blocked | Plugin incompatibility |\n * | serverBundles: () => {} | Blocked | Manifest incompatibility |\n * | buildEnd: () => {} | Blocked | CLI bypasses hook execution |\n * | unstable_subResourceIntegrity | Blocked | CSP nonce/hash conflict |\n * | v8_viteEnvironmentApi | Blocked | CLI fallback detection used |\n * +----------------------------------+----------+----------------------------------+\n *\n * @version 2025.7.0\n */\nexport function hydrogenPreset(): Preset {\n return {\n name: 'hydrogen-2025.7.0',\n\n reactRouterConfig: () => ({\n appDirectory: 'app',\n buildDirectory: 'dist',\n ssr: true,\n\n future: {\n v8_middleware: true,\n v8_splitRouteModules: true,\n v8_viteEnvironmentApi: false,\n unstable_optimizeDeps: true,\n unstable_subResourceIntegrity: false,\n },\n }),\n\n reactRouterConfigResolved: ({reactRouterConfig}) => {\n if (reactRouterConfig.basename && reactRouterConfig.basename !== '/') {\n throw new Error(\n '[Hydrogen Preset] basename is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: Requires major CLI infrastructure modernization.\\n' +\n 'Workaround: Use reverse proxy or CDN path rewriting for subdirectory hosting.',\n );\n }\n\n if (reactRouterConfig.prerender) {\n throw new Error(\n '[Hydrogen Preset] prerender is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: React Router plugin incompatibility with Hydrogen CLI build pipeline.\\n' +\n 'Workaround: Use external static generation tools or server-side caching.',\n );\n }\n\n if (reactRouterConfig.serverBundles) {\n throw new Error(\n '[Hydrogen Preset] serverBundles is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: React Router plugin manifest incompatibility with Hydrogen CLI.\\n' +\n 'Alternative: Route-level code splitting via v8_splitRouteModules is enabled.',\n );\n }\n\n if (reactRouterConfig.buildEnd) {\n throw new Error(\n '[Hydrogen Preset] buildEnd is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: Hydrogen CLI bypasses React Router buildEnd hook execution.\\n' +\n 'Workaround: Use external build scripts or package.json post-build hooks.',\n );\n }\n\n if (reactRouterConfig.future?.unstable_subResourceIntegrity === true) {\n throw new Error(\n '[Hydrogen Preset] unstable_subResourceIntegrity cannot be enabled.\\n' +\n 'Reason: Conflicts with Hydrogen CSP nonce-based authentication.\\n' +\n 'Impact: Would break Content Security Policy and cause script execution failures.',\n );\n }\n },\n };\n}\n","import {Link} from 'react-router';\nimport {RichText as OriginalRichText} from '@shopify/hydrogen-react';\n\nexport const RichText: typeof OriginalRichText = function (props) {\n return (\n <OriginalRichText\n {...props}\n components={{\n link: ({node}) => (\n <Link\n to={node.url}\n title={node.title}\n target={node.target}\n prefetch=\"intent\"\n >\n {node.children}\n </Link>\n ),\n ...props.components,\n }}\n />\n );\n};\n","import type {LoaderFunctionArgs} from 'react-router';\nimport type {Storefront} from '../storefront';\nimport type {CustomerAccount} from '../customer/types';\n\ntype GraphiQLLoader = (args: LoaderFunctionArgs) => Promise<Response>;\n\nexport const graphiqlLoader: GraphiQLLoader = async function graphiqlLoader({\n request,\n context,\n}: LoaderFunctionArgs) {\n // For some reason, types are properly recognized by the editor,\n // but not at build time on CI. Cast types here to ensure it builds.\n const storefront = context.storefront as undefined | Storefront;\n const customerAccount = context.customerAccount as\n | undefined\n | CustomerAccount;\n\n const url = new URL(request.url);\n\n if (!storefront) {\n throw new Error(\n `GraphiQL: Hydrogen's storefront client must be injected in the loader context.`,\n );\n }\n\n const schemas: {\n [key: string]: {\n name: string;\n value?: object;\n accessToken?: string;\n authHeader: string;\n apiUrl: string;\n icon: string;\n };\n } = {};\n\n if (storefront) {\n const authHeader = 'X-Shopify-Storefront-Access-Token';\n schemas.storefront = {\n name: 'Storefront API',\n authHeader,\n accessToken: storefront.getPublicTokenHeaders()[authHeader],\n apiUrl: storefront.getApiUrl(),\n icon: 'SF',\n };\n }\n\n // In order to authenticate the CAAPI requests the user must be logged in via the CAAPI.\n // The graphiql request will then use the correct\n if (customerAccount) {\n // CustomerAccount API does not support introspection to the same URL.\n // Read it from a file using the asset server:\n const customerAccountSchema = await (\n await fetch(url.origin + '/graphiql/customer-account.schema.json')\n ).json();\n\n const accessToken = await customerAccount.getAccessToken();\n\n if (customerAccountSchema) {\n schemas['customer-account'] = {\n name: 'Customer Account API',\n value: customerAccountSchema,\n authHeader: 'Authorization',\n accessToken,\n apiUrl: customerAccount.getApiUrl(),\n icon: 'CA',\n };\n }\n }\n\n // GraphiQL icon from their GitHub repo\n const favicon = `https://avatars.githubusercontent.com/u/12972006?s=48&v=4`;\n\n // Add code highlighting to the HTML template\n const html = String.raw;\n\n // NOTE: based on https://github.com/graphql/graphiql/blob/main/examples/graphiql-cdn/index.html\n return new Response(\n html`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>GraphiQL</title>\n <link rel=\"icon\" type=\"image/x-icon\" href=\"${favicon}\" />\n <meta charset=\"utf-8\" />\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n background-color: hsl(219, 29%, 18%);\n }\n\n #graphiql {\n height: 100vh;\n }\n\n #graphiql > .placeholder {\n color: slategray;\n width: fit-content;\n margin: 40px auto;\n font-family: Arial;\n }\n\n .graphiql-api-toolbar-label {\n position: absolute;\n bottom: -6px;\n right: -4px;\n font-size: 8px;\n }\n </style>\n\n <link\n rel=\"stylesheet\"\n href=\"https://esm.sh/graphiql/dist/style.css\"\n />\n\n <link\n rel=\"stylesheet\"\n href=\"https://esm.sh/@graphiql/plugin-explorer/dist/style.css\"\n />\n <script type=\"importmap\">\n {\n \"imports\": {\n \"react\": \"https://esm.sh/react@19.1.0\",\n \"react/jsx-runtime\": \"https://esm.sh/react@19.1.0/jsx-runtime\",\n \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n \"react-dom/client\": \"https://esm.sh/react-dom@19.1.0/client\",\n\n \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n\n \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n \"@graphiql/plugin-explorer\": \"https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql\",\n \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql\",\n \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\"\n }\n }\n </script>\n <script type=\"module\">\n // Import React and ReactDOM\n import React from 'react';\n import ReactDOM from 'react-dom/client';\n\n // Import GraphiQL and the Explorer plugin\n import {GraphiQL, HISTORY_PLUGIN} from 'graphiql';\n import {createGraphiQLFetcher} from '@graphiql/toolkit';\n import {explorerPlugin} from '@graphiql/plugin-explorer';\n import {ToolbarButton} from '@graphiql/react';\n\n import createJSONWorker from 'https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker';\n import createGraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker';\n import createEditorWorker from 'https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker';\n import {parse, print} from 'graphql';\n\n globalThis.MonacoEnvironment = {\n getWorker(_workerId, label) {\n switch (label) {\n case 'json':\n return createJSONWorker();\n case 'graphql':\n return createGraphQLWorker();\n }\n return createEditorWorker();\n },\n };\n\n const windowUrl = new URL(document.URL);\n const startingSchemaKey =\n windowUrl.searchParams.get('schema') || 'storefront';\n\n let initialQuery = '{ shop { name } }';\n if (windowUrl.searchParams.has('query')) {\n initialQuery = decodeURIComponent(\n windowUrl.searchParams.get('query') ?? query,\n );\n }\n\n // Prettify query\n initialQuery = print(parse(initialQuery));\n\n let variables;\n if (windowUrl.searchParams.has('variables')) {\n variables = decodeURIComponent(\n windowUrl.searchParams.get('variables') ?? '',\n );\n }\n\n // Prettify variables\n if (variables) {\n variables = JSON.stringify(JSON.parse(variables), null, 2);\n }\n\n const schemas = ${JSON.stringify(schemas)};\n\n let lastActiveTabIndex = -1;\n let lastTabAmount = -1;\n\n const TAB_STATE_KEY = 'graphiql:tabState';\n const storage = {\n getTabState: () =>\n JSON.parse(localStorage.getItem(TAB_STATE_KEY)),\n setTabState: (state) =>\n localStorage.setItem(TAB_STATE_KEY, JSON.stringify(state)),\n };\n\n let nextSchemaKey;\n\n function App() {\n const [activeSchema, setActiveSchema] =\n React.useState(startingSchemaKey);\n\n const schema = schemas[activeSchema];\n\n if (!schema) {\n throw new Error('No schema found for ' + activeSchema);\n }\n\n const fetcher = createGraphiQLFetcher({\n url: schema.apiUrl,\n headers: {[schema.authHeader]: schema.accessToken},\n enableIncrementalDelivery: false,\n });\n\n // We create a custom fetcher because createGraphiQLFetcher attempts to introspect the schema\n // and the Customer Account API does not support introspection.\n // We override the fetcher to return the schema directly only for the CAAPI introspection query.\n function createJsonFetcher(options, httpFetch) {\n if (activeSchema === 'storefront') {\n return fetcher(options, httpFetch);\n } else {\n // CAAPI requires a custom fetcher\n if (options.operationName === 'IntrospectionQuery') {\n return {data: schema.value};\n } else {\n return fetcher(options, httpFetch);\n }\n }\n }\n\n const keys = Object.keys(schemas);\n\n function onTabChange(state) {\n const {activeTabIndex, tabs} = state;\n const activeTab = tabs[activeTabIndex];\n\n if (\n activeTabIndex === lastActiveTabIndex &&\n lastTabAmount === tabs.length\n ) {\n if (\n nextSchemaKey &&\n activeTab &&\n activeTab.schemaKey !== nextSchemaKey\n ) {\n activeTab.schemaKey = nextSchemaKey;\n nextSchemaKey = undefined;\n\n // Sync state to localStorage. GraphiQL resets the state\n // asynchronously, so we need to do it in a timeout.\n storage.setTabState(state);\n setTimeout(() => storage.setTabState(state), 500);\n }\n\n // React rerrendering, skip\n return;\n }\n\n if (activeTab) {\n if (!activeTab.schemaKey) {\n // Creating a new tab\n if (lastTabAmount < tabs.length) {\n activeTab.schemaKey = activeSchema;\n storage.setTabState(state);\n }\n }\n\n const nextSchema = activeTab.schemaKey || 'storefront';\n\n if (nextSchema !== activeSchema) {\n setActiveSchema(nextSchema);\n }\n }\n\n lastActiveTabIndex = activeTabIndex;\n lastTabAmount = tabs.length;\n }\n\n const plugins = [HISTORY_PLUGIN, explorerPlugin()];\n\n const props = {\n fetcher: createJsonFetcher,\n defaultEditorToolsVisibility: true,\n initialQuery,\n variables,\n schema: schema.value,\n plugins,\n onTabChange,\n };\n\n function toggleSelectedApi() {\n const activeKeyIndex = keys.indexOf(activeSchema);\n nextSchemaKey = keys[(activeKeyIndex + 1) % keys.length];\n\n // This triggers onTabChange\n if (nextSchemaKey) setActiveSchema(nextSchemaKey);\n }\n\n const CustomToolbar = React.createElement(\n GraphiQL.Toolbar,\n {\n key: 'Custom Toolbar',\n },\n [\n React.createElement(\n ToolbarButton,\n {\n key: 'api-wrapper',\n onClick: toggleSelectedApi,\n label: 'Toggle between different API schemas',\n },\n [\n React.createElement(\n 'div',\n {\n key: 'icon',\n style: {\n textAlign: 'center',\n },\n },\n [\n schema.icon,\n React.createElement(\n 'div',\n {\n key: 'icon-label',\n className: 'graphiql-api-toolbar-label',\n },\n 'API',\n ),\n ],\n ),\n ],\n ),\n ],\n );\n\n const CustomLogo = React.createElement(\n GraphiQL.Logo,\n {\n key: 'Logo replacement',\n },\n [\n React.createElement(\n 'div',\n {\n key: 'Logo wrapper',\n style: {display: 'flex', alignItems: 'center'},\n },\n [\n React.createElement(\n 'div',\n {\n key: 'api',\n className: 'graphiql-logo',\n style: {\n paddingRight: 0,\n whiteSpace: 'nowrap',\n },\n },\n [schema.name],\n ),\n React.createElement(GraphiQL.Logo, {key: 'logo'}),\n ],\n ),\n ],\n );\n\n const children = [CustomToolbar, CustomLogo];\n\n return React.createElement(GraphiQL, props, children);\n }\n\n const container = document.getElementById('graphiql');\n\n const root = ReactDOM.createRoot(container);\n\n root.render(React.createElement(App));\n </script>\n </head>\n\n <body>\n <div id=\"graphiql\">\n <div class=\"placeholder\">Loading GraphiQL...</div>\n </div>\n </body>\n </html>\n `,\n {status: 200, headers: {'content-type': 'text/html'}},\n );\n};\n","import type {UrlRedirectConnection} from '@shopify/hydrogen-react/storefront-api-types';\nimport type {I18nBase, Storefront} from '../storefront';\nimport {getRedirectUrl} from '../utils/get-redirect-url';\n\ntype StorefrontRedirect = {\n /** The [Storefront client](/docs/api/hydrogen/utilities/createstorefrontclient) instance */\n storefront: Storefront<I18nBase>;\n /** The [MDN Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object that was passed to the `server.ts` request handler. */\n request: Request;\n /** The [MDN Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object created by `handleRequest` */\n response?: Response;\n /** By default the `/admin` route is redirected to the Shopify Admin page for the current storefront. Disable this redirect by passing `true`. */\n noAdminRedirect?: boolean;\n /** By default, query parameters are not used to match redirects. Set this to `true` if you'd like redirects to be query parameter sensitive */\n matchQueryParams?: boolean;\n};\n\n/**\n * Queries the Storefront API to see if there is any redirect\n * created for the current route and performs it. Otherwise,\n * it returns the response passed in the parameters. Useful for\n * conditionally redirecting after a 404 response.\n *\n * @see {@link https://help.shopify.com/en/manual/online-store/menus-and-links/url-redirect Creating URL redirects in Shopify}\n */\nexport async function storefrontRedirect(\n options: StorefrontRedirect,\n): Promise<Response> {\n const {\n storefront,\n request,\n noAdminRedirect,\n matchQueryParams,\n response = new Response('Not Found', {status: 404}),\n } = options;\n\n const url = new URL(request.url);\n const {pathname, searchParams} = url;\n const isSoftNavigation = searchParams.has('_data');\n\n searchParams.delete('redirect');\n searchParams.delete('return_to');\n searchParams.delete('_data');\n\n const redirectFrom = (\n matchQueryParams ? url.toString().replace(url.origin, '') : pathname\n ).toLowerCase();\n\n if (url.pathname === '/admin' && !noAdminRedirect) {\n return createRedirectResponse(\n `${storefront.getShopifyDomain()}/admin`,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n\n try {\n const {urlRedirects} = await storefront.query<{\n urlRedirects: UrlRedirectConnection;\n }>(REDIRECT_QUERY, {\n // The admin doesn't allow redirects to have a\n // trailing slash, so strip them all off\n variables: {query: 'path:' + redirectFrom.replace(/\\/+$/, '')},\n });\n\n const location = urlRedirects?.edges?.[0]?.node?.target;\n\n if (location) {\n return createRedirectResponse(\n location,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n\n const redirectTo = getRedirectUrl(request.url);\n\n if (redirectTo) {\n return createRedirectResponse(\n redirectTo,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n } catch (error) {\n console.error(\n `Failed to fetch redirects from Storefront API for route ${redirectFrom}`,\n error,\n );\n }\n\n return response;\n}\n\nconst TEMP_DOMAIN = 'https://example.com';\n\nfunction createRedirectResponse(\n location: string,\n isSoftNavigation: boolean,\n searchParams: URLSearchParams,\n matchQueryParams?: boolean,\n) {\n const url = new URL(location, TEMP_DOMAIN);\n\n if (!matchQueryParams) {\n for (const [key, value] of searchParams) {\n // The redirect destination might include query params, so merge the\n // original query params with the redirect destination query params\n url.searchParams.append(key, value);\n }\n }\n\n if (isSoftNavigation) {\n return new Response(null, {\n status: 200,\n headers: {\n 'X-Remix-Redirect': url.toString().replace(TEMP_DOMAIN, ''),\n 'X-Remix-Status': '301',\n },\n });\n } else {\n return new Response(null, {\n status: 301,\n headers: {location: url.toString().replace(TEMP_DOMAIN, '')},\n });\n }\n}\n\nconst REDIRECT_QUERY = `#graphql\n query redirects($query: String) {\n urlRedirects(first: 1, query: $query) {\n edges {\n node {\n target\n }\n }\n }\n }\n`;\n","// This is taken from remix: https://github.com/remix-run/remix/blob/main/packages/remix-server-runtime/markup.ts\n\nconst ESCAPE_LOOKUP: {[match: string]: string} = {\n '&': '\\\\u0026',\n '>': '\\\\u003e',\n '<': '\\\\u003c',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n};\n\nconst ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\n\nexport function escapeHtml(html: string) {\n return html.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n","import type {ComponentPropsWithoutRef} from 'react';\nimport type {Maybe} from '@shopify/hydrogen-react/storefront-api-types';\nimport type {Thing, WithContext} from 'schema-dts';\nimport {escapeHtml} from './escape';\n\nconst ERROR_PREFIX = 'Error in SEO input: ';\n\n// TODO: Refactor this into more reusable validators or use a library like zod to do this if we decide to use it in\n// other places. @cartogram\nexport const schema = {\n title: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`title` should be a string'));\n }\n\n if (typeof value === 'string' && value.length > 70) {\n throw new Error(\n ERROR_PREFIX.concat(\n '`title` should not be longer than 70 characters',\n ),\n );\n }\n\n return value;\n },\n },\n description: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(\n ERROR_PREFIX.concat('`description` should be a string'),\n );\n }\n\n if (typeof value === 'string' && value.length > 155) {\n throw new Error(\n ERROR_PREFIX.concat(\n '`description` should not be longer than 160 characters',\n ),\n );\n }\n\n return value;\n },\n },\n url: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`url` should be a string'));\n }\n\n if (typeof value === 'string' && !value.startsWith('http')) {\n throw new Error(ERROR_PREFIX.concat('`url` should be a valid URL'));\n }\n\n return value;\n },\n },\n handle: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`handle` should be a string'));\n }\n\n if (typeof value === 'string' && !value.startsWith('@')) {\n throw new Error(ERROR_PREFIX.concat('`handle` should start with `@`'));\n }\n\n return value;\n },\n },\n};\n\nexport interface SeoConfig {\n /**\n * The `title` HTML element defines the document's title that is shown in a browser's title bar or a page's tab. It\n * only contains text; tags within the element are ignored.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\n */\n title?: Maybe<string>;\n /**\n * Generate the title from a template that includes a `%s` placeholder for the title.\n *\n * @example\n * ```js\n * {\n * title: 'My Page',\n * titleTemplate: 'My Site - %s',\n * }\n * ```\n */\n titleTemplate?: Maybe<string> | null;\n /**\n * The media associated with the given page (images, videos, etc). If you pass a string, it will be used as the\n * `og:image` meta tag. If you pass an object or an array of objects, that will be used to generate `og:<type of\n * media>` meta tags. The `url` property should be the URL of the media. The `height` and `width` properties are\n * optional and should be the height and width of the media. The `altText` property is optional and should be a\n * description of the media.\n *\n * @example\n * ```js\n * {\n * media: [\n * {\n * url: 'https://example.com/image.jpg',\n * type: 'image',\n * height: '400',\n * width: '400',\n * altText: 'A custom snowboard with an alpine color pallet.',\n * }\n * ]\n * }\n * ```\n *\n */\n media?:\n | Maybe<string>\n | Partial<SeoMedia>\n | (Partial<SeoMedia> | Maybe<string>)[];\n /**\n * The description of the page. This is used in the `name=\"description\"` meta tag as well as the `og:description` meta\n * tag.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta\n */\n description?: Maybe<string>;\n /**\n * The canonical URL of the page. This is used to tell search engines which URL is the canonical version of a page.\n * This is useful when you have multiple URLs that point to the same page. The value here will be used in the\n * `rel=\"canonical\"` link tag as well as the `og:url` meta tag.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\n */\n url?: Maybe<string>;\n /**\n * The handle is used to generate the `twitter:site` and `twitter:creator` meta tags. Include the `@` symbol in the\n * handle.\n *\n * @example\n * ```js\n * {\n * handle: '@shopify'\n * }\n * ```\n */\n handle?: Maybe<string>;\n /**\n * The `jsonLd` property is used to generate the `application/ld+json` script tag. This is used to provide structured\n * data to search engines. The value should be an object that conforms to the schema.org spec. The `type` property\n * should be the type of schema you are using. The `type` property is required and should be one of the following:\n *\n * - `Product`\n * - `ItemList`\n * - `Organization`\n * - `WebSite`\n * - `WebPage`\n * - `BlogPosting`\n * - `Thing`\n *\n * The value is validated via [schema-dts](https://www.npmjs.com/package/schema-dts)\n *\n * @example\n * ```js\n * {\n * jsonLd: {\n * '@context': 'https://schema.org',\n * '@type': 'Product',\n * name: 'My Product',\n * image: 'https://hydrogen.shop/image.jpg',\n * description: 'A product that is great',\n * sku: '12345',\n * mpn: '12345',\n * brand: {\n * '@type': 'Thing',\n * name: 'My Brand',\n * },\n * aggregateRating: {\n * '@type': 'AggregateRating',\n * ratingValue: '4.5',\n * reviewCount: '100',\n * },\n * offers: {\n * '@type': 'Offer',\n * priceCurrency: 'USD',\n * price: '100',\n * priceValidUntil: '2020-11-05',\n * itemCondition: 'https://schema.org/NewCondition',\n * availability: 'https://schema.org/InStock',\n * seller: {\n * '@type': 'Organization',\n * name: 'My Brand',\n * },\n * },\n * }\n * }\n * ```\n *\n * @see https://schema.org/docs/schemas.html\n * @see https://developers.google.com/search/docs/guides/intro-structured-data\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n *\n */\n jsonLd?: WithContext<Thing> | WithContext<Thing>[];\n /**\n * The `alternates` property is used to specify the language and geographical targeting when you have multiple\n * versions of the same page in different languages. The `url` property tells search engines about these variations\n * and helps them to serve the correct version to their users.\n *\n * @example\n * ```js\n * {\n * alternates: [\n * {\n * language: 'en-US',\n * url: 'https://hydrogen.shop/en-us',\n * default: true,\n * },\n * {\n * language: 'fr-CA',\n * url: 'https://hydrogen.shop/fr-ca',\n * },\n * ]\n * }\n * ```\n *\n * @see https://support.google.com/webmasters/answer/189077?hl=en\n */\n alternates?: LanguageAlternate | LanguageAlternate[];\n /**\n * The `robots` property is used to specify the robots meta tag. This is used to tell search engines which pages\n * should be indexed and which should not.\n *\n * @see https://developers.google.com/search/reference/robots_meta_tag\n */\n robots?: RobotsOptions;\n}\n\n/**\n * @see https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag\n */\nexport interface RobotsOptions {\n /**\n * Set the maximum size of an image preview for this page in a search results Can be one of the following:\n *\n * - `none` - No image preview is to be shown.\n * - `standard` - A default image preview may be shown.\n * - `large` - A larger image preview, up to the width of the viewport, may be shown.\n *\n * If no value is specified a default image preview size is used.\n */\n maxImagePreview?: 'none' | 'standard' | 'large';\n /**\n * A number representing the maximum of amount characters to use as a textual snippet for a search result. This value\n * can also be set to one of the following special values:\n *\n * - 0 - No snippet is to be shown. Equivalent to nosnippet.\n * - 1 - The Search engine will choose the snippet length that it believes is most effective to help users discover\n * your content and direct users to your site\n * - -1 - No limit on the number of characters that can be shown in the snippet.\n */\n maxSnippet?: number;\n /**\n * The maximum number of seconds for videos on this page to show in search results. This value can also be set to one\n * of the following special values:\n *\n * - 0 - A static image may be used with the `maxImagePreview` setting.\n * - 1 - There is no limit to the size of the video preview.\n *\n * This applies to all forms of search results (at Google: web search, Google Images, Google Videos, Discover,\n * Assistant).\n */\n maxVideoPreview?: number;\n /**\n * Do not show a cached link in search results.\n */\n noArchive?: boolean;\n /**\n * Do not follow the links on this page.\n *\n * @see https://developers.google.com/search/docs/advanced/guidelines/qualify-outbound-links\n */\n noFollow?: boolean;\n /**\n * Do not index images on this page.\n */\n noImageIndex?: boolean;\n /**\n * Do not show this page, media, or resource in search results.\n */\n noIndex?: boolean;\n /**\n * Do not show a text snippet or video preview in the search results for this page.\n */\n noSnippet?: boolean;\n /**\n * Do not offer translation of this page in search results.\n */\n noTranslate?: boolean;\n /**\n * Do not show this page in search results after the specified date/time.\n */\n unavailableAfter?: string;\n}\n\nexport interface LanguageAlternate {\n /**\n * Language code for the alternate page. This is used to generate the hreflang meta tag property.\n */\n language: string;\n /**\n * Whether the alternate page is the default page. This will add the `x-default` attribution to the language code.\n */\n default?: boolean;\n /**\n * The url of the alternate page. This is used to generate the hreflang meta tag property.\n */\n url: string;\n}\n\nexport type SeoMedia = {\n /**\n * Used to generate og:<type of media> meta tag\n */\n type: 'image' | 'video' | 'audio';\n /**\n * The url value populates both url and secure_url and is used to infer the og:<type of media>:type meta tag.\n */\n url: Maybe<string> | undefined;\n /**\n * The height in pixels of the media. This is used to generate the og:<type of media>:height meta tag.\n */\n height: Maybe<number> | undefined;\n /**\n * The width in pixels of the media. This is used to generate the og:<type of media>:width meta tag.\n */\n width: Maybe<number> | undefined;\n /**\n * The alt text for the media. This is used to generate the og:<type of media>:alt meta tag.\n */\n altText: Maybe<string> | undefined;\n};\n\ntype TagKey = 'title' | 'base' | 'meta' | 'link' | 'script';\n\nexport interface CustomHeadTagObject {\n tag: TagKey;\n props: Record<string, unknown>;\n children?: string;\n key: string;\n}\n\n/**\n * The `generateSeoTags` function generates the SEO title, meta, link and script (JSON Linking Data) tags for a page. It\n * pairs well with the SEO component in `@shopify/hydrogen` when building a Hydrogen Remix app, but can be used on its\n * own if you want to generate the tags yourself.\n */\nexport function generateSeoTags(seoInput: SeoConfig): CustomHeadTagObject[] {\n const tagResults: CustomHeadTagObject[] = [];\n\n for (const seoKey of Object.keys(seoInput)) {\n switch (seoKey) {\n case 'title': {\n const content = validate(schema.title, seoInput.title);\n const title = renderTitle(seoInput?.titleTemplate, content);\n\n if (!title) {\n break;\n }\n\n tagResults.push(\n generateTag('title', {title}),\n generateTag('meta', {property: 'og:title', content: title}),\n generateTag('meta', {name: 'twitter:title', content: title}),\n );\n\n break;\n }\n\n case 'description': {\n const content = validate(schema.description, seoInput.description);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n generateTag('meta', {\n name: 'description',\n content,\n }),\n generateTag('meta', {\n property: 'og:description',\n content,\n }),\n generateTag('meta', {\n name: 'twitter:description',\n content,\n }),\n );\n\n break;\n }\n\n case 'url': {\n const content = validate(schema.url, seoInput.url);\n\n if (!content) {\n break;\n }\n\n const urlWithoutParams = content.split('?')[0];\n const urlWithoutTrailingSlash = urlWithoutParams.replace(/\\/$/, '');\n\n tagResults.push(\n generateTag('link', {\n rel: 'canonical',\n href: urlWithoutTrailingSlash,\n }),\n generateTag('meta', {\n property: 'og:url',\n content: urlWithoutTrailingSlash,\n }),\n );\n\n break;\n }\n\n case 'handle': {\n const content = validate(schema.handle, seoInput.handle);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n generateTag('meta', {name: 'twitter:site', content}),\n generateTag('meta', {name: 'twitter:creator', content}),\n );\n\n break;\n }\n\n case 'media': {\n let content;\n const values = ensureArray(seoInput.media);\n\n for (const media of values) {\n if (typeof media === 'string') {\n tagResults.push(\n generateTag('meta', {name: 'og:image', content: media}),\n );\n }\n\n if (media && typeof media === 'object') {\n const type = media.type || 'image';\n\n // Order matters here when adding multiple media tags @see https://ogp.me/#array\n const normalizedMedia = media\n ? {\n url: media?.url,\n secure_url: media?.url,\n type: inferMimeType(media.url),\n width: media?.width,\n height: media?.height,\n alt: media?.altText,\n }\n : {};\n\n for (const key of Object.keys(normalizedMedia)) {\n if (normalizedMedia[key as keyof typeof normalizedMedia]) {\n content = normalizedMedia[\n key as keyof typeof normalizedMedia\n ] as string;\n\n tagResults.push(\n generateTag(\n 'meta',\n {\n property: `og:${type}:${key}`,\n content,\n },\n normalizedMedia.url as string,\n ),\n );\n }\n }\n }\n }\n break;\n }\n\n case 'jsonLd': {\n const jsonLdBlocks = ensureArray(seoInput.jsonLd);\n let index = 0;\n for (const block of jsonLdBlocks) {\n if (typeof block !== 'object') {\n continue;\n }\n\n const tag = generateTag(\n 'script',\n {\n type: 'application/ld+json',\n children: JSON.stringify(block, (k, value) => {\n return typeof value === 'string' ? escapeHtml(value) : value;\n }),\n },\n // @ts-expect-error\n `json-ld-${block?.['@type'] || block?.name || index++}`,\n );\n\n tagResults.push(tag);\n }\n\n break;\n }\n\n case 'alternates': {\n const alternates = ensureArray(seoInput.alternates);\n\n for (const alternate of alternates) {\n if (!alternate) {\n continue;\n }\n\n const {language, url, default: defaultLang} = alternate;\n\n const hrefLang = language\n ? `${language}${defaultLang ? '-default' : ''}`\n : undefined;\n\n tagResults.push(\n generateTag('link', {\n rel: 'alternate',\n hrefLang,\n href: url,\n }),\n );\n }\n\n break;\n }\n\n case 'robots': {\n if (!seoInput.robots) {\n break;\n }\n\n const {\n maxImagePreview,\n maxSnippet,\n maxVideoPreview,\n noArchive,\n noFollow,\n noImageIndex,\n noIndex,\n noSnippet,\n noTranslate,\n unavailableAfter,\n } = seoInput.robots;\n\n const robotsParams = [\n noArchive && 'noarchive',\n noImageIndex && 'noimageindex',\n noSnippet && 'nosnippet',\n noTranslate && `notranslate`,\n maxImagePreview && `max-image-preview:${maxImagePreview}`,\n maxSnippet && `max-snippet:${maxSnippet}`,\n maxVideoPreview && `max-video-preview:${maxVideoPreview}`,\n unavailableAfter && `unavailable_after:${unavailableAfter}`,\n ];\n\n let robotsParam =\n (noIndex ? 'noindex' : 'index') +\n ',' +\n (noFollow ? 'nofollow' : 'follow');\n\n for (let param of robotsParams) {\n if (param) {\n robotsParam += `,${param}`;\n }\n }\n\n tagResults.push(\n generateTag('meta', {name: 'robots', content: robotsParam}),\n );\n\n break;\n }\n\n default: {\n // TODO: We should be able to catch unaccounted for keys at compile time\n // let exhaustiveCheck: never = seoKey;\n\n break;\n }\n }\n }\n\n return tagResults.flat().sort((a, b) => a.key.localeCompare(b.key));\n}\n\nexport function generateTag<T extends TagKey>(\n tagName: T,\n input: ComponentPropsWithoutRef<T>,\n group?: string,\n): CustomHeadTagObject {\n const tag: CustomHeadTagObject = {tag: tagName, props: {}, key: ''};\n\n // title tags don't have props so move to children\n if (tagName === 'title') {\n tag.children = input.title as string;\n tag.key = generateKey(tag);\n\n return tag;\n }\n\n // also move the input children to children and delete it\n if (tagName === 'script') {\n tag.children = typeof input.children === 'string' ? input.children : '';\n tag.key = generateKey(tag, group);\n delete input.children;\n tag.props = input;\n return tag;\n }\n\n // the rest goes on props\n tag.props = input;\n\n // remove empty props\n Object.keys(tag.props).forEach(\n (key) => !tag.props[key] && delete tag.props[key],\n );\n\n tag.key = generateKey(tag, group);\n\n return tag;\n}\n\n//**\n// * Generate a unique key for a tag\n// * @param tag - a generated tag object\n// * @param group? - the group the tag belongs to\n// * @returns - a unique key to be used for react\n// */\nexport function generateKey(tag: CustomHeadTagObject, group?: string) {\n const {tag: tagName, props} = tag;\n\n if (tagName === 'title') {\n // leading 0 moves title to the top when sorting\n return '0-title';\n }\n\n if (tagName === 'meta') {\n // leading 0 moves meta to the top when sorting exclude secure_url from the logic because the content is the same as\n // url\n const priority =\n props.content === group &&\n typeof props.property === 'string' &&\n !props.property.endsWith('secure_url') &&\n '0';\n const groupName = [group, priority];\n\n return [tagName, ...groupName, props.property || props.name]\n .filter((x) => x)\n .join('-');\n }\n\n if (tagName === 'link') {\n const key = [tagName, props.rel, props.hrefLang || props.media]\n .filter((x) => x)\n .join('-');\n\n // replace spaces with dashes, needed for media prop\n return key.replace(/\\s+/g, '-');\n }\n\n if (tagName === 'script') {\n return `${tagName}-${group}`;\n }\n\n return `${tagName}-${props.type}`;\n}\n\nexport function renderTitle<T extends CustomHeadTagObject['children']>(\n template?:\n | string\n | ((title: string) => string | undefined)\n | undefined\n | null,\n title?: T | null,\n): string | undefined {\n if (!title) {\n return undefined;\n }\n\n if (!template) {\n return title;\n }\n\n if (typeof template === 'function') {\n return template(title);\n }\n\n return template.replace('%s', title ?? '');\n}\n\nexport function inferMimeType(url: Maybe<string> | undefined) {\n const ext = url && url.split('.').pop();\n\n switch (ext) {\n case 'svg':\n return 'image/svg+xml';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'swf':\n return 'application/x-shockwave-flash';\n case 'mp3':\n return 'audio/mpeg';\n case 'jpg':\n case 'jpeg':\n default:\n return 'image/jpeg';\n }\n}\n\nexport type SchemaType =\n | 'Product'\n | 'ItemList'\n | 'Organization'\n | 'WebSite'\n | 'WebPage'\n | 'BlogPosting'\n | 'Thing';\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function validate<T>(\n schema: {validate: <T>(data: T) => NonNullable<T>},\n data: T,\n): T {\n try {\n return schema.validate<T>(data);\n } catch (error: unknown) {\n console.warn((error as Error).message);\n return data;\n }\n}\n","import {\n ensureArray,\n inferMimeType,\n renderTitle,\n schema,\n validate,\n type SeoConfig,\n} from './generate-seo-tags';\nimport {MetaFunction} from 'react-router';\n\nexport type GetSeoMetaReturn = ReturnType<MetaFunction>;\n\ntype GetSeoMetaTypeForDocs = {\n /** `getSeoMeta` takes an arbitrary number of configuration object parameters. Values in each object are overwritten based on the object order. \\`jsonLd\\` properties are preserved between each configuration object. */\n seoInputs: SeoConfig[];\n};\n\ntype SeoKey = keyof SeoConfig;\n\ntype Optional<T> = T | null | undefined;\n\n/**\n * Generate a Remix meta array from one or more SEO configuration objects. This is useful to pass SEO configuration for the parent route(s) and the current route. Similar to `Object.assign()`, each property is overwritten based on the object order. The exception is `jsonLd`, which is preserved so that each route has it's own independent jsonLd meta data.\n */\nexport function getSeoMeta(\n ...seoInputs: Optional<SeoConfig>[]\n): GetSeoMetaReturn {\n let tagResults: GetSeoMetaReturn = [];\n\n const dedupedSeoInput =\n seoInputs.reduce((acc, current) => {\n if (!current) return acc as SeoConfig;\n\n // remove seo properties with falsy values\n Object.keys(current).forEach(\n (key) => !current[key as SeoKey] && delete current[key as SeoKey],\n );\n\n const {jsonLd} = current;\n\n if (!jsonLd) {\n return {...acc, ...current} as SeoConfig;\n }\n\n // concatenate jsonLds if present\n if (!acc?.jsonLd) {\n return {...acc, ...current, jsonLd: [jsonLd]} as SeoConfig;\n } else {\n return {\n ...acc,\n ...current,\n jsonLd: ensureArray(acc.jsonLd).concat(jsonLd),\n };\n }\n }, {}) || ({} as SeoConfig);\n\n for (const seoKey of Object.keys(dedupedSeoInput)) {\n switch (seoKey) {\n case 'title': {\n const content = validate(schema.title, dedupedSeoInput.title);\n const title = renderTitle(dedupedSeoInput?.titleTemplate, content);\n\n if (!title) {\n break;\n }\n\n tagResults.push(\n {title},\n {property: 'og:title', content: title},\n {property: 'twitter:title', content: title},\n );\n\n break;\n }\n\n case 'description': {\n const content = validate(\n schema.description,\n dedupedSeoInput.description,\n );\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n {\n name: 'description',\n content,\n },\n {\n property: 'og:description',\n content,\n },\n {\n property: 'twitter:description',\n content,\n },\n );\n\n break;\n }\n\n case 'url': {\n const content = validate(schema.url, dedupedSeoInput.url);\n\n if (!content) {\n break;\n }\n\n const urlWithoutParams = content.split('?')[0];\n const urlWithoutTrailingSlash = urlWithoutParams.replace(/\\/$/, '');\n\n tagResults.push(\n {\n tagName: 'link',\n rel: 'canonical',\n href: urlWithoutTrailingSlash,\n },\n {\n property: 'og:url',\n content: urlWithoutTrailingSlash,\n },\n );\n\n break;\n }\n\n case 'handle': {\n const content = validate(schema.handle, dedupedSeoInput.handle);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n {property: 'twitter:site', content},\n {property: 'twitter:creator', content},\n );\n\n break;\n }\n\n case 'media': {\n let content;\n const values = ensureArray(dedupedSeoInput.media);\n\n for (const media of values) {\n if (typeof media === 'string') {\n tagResults.push({property: 'og:image', content: media});\n }\n\n if (media && typeof media === 'object') {\n const type = media.type || 'image';\n\n // Order matters here when adding multiple media tags @see https://ogp.me/#array\n const normalizedMedia = media\n ? {\n url: media?.url,\n secure_url: media?.url,\n type: inferMimeType(media.url),\n width: media?.width,\n height: media?.height,\n alt: media?.altText,\n }\n : {};\n\n for (const key of Object.keys(normalizedMedia)) {\n if (normalizedMedia[key as keyof typeof normalizedMedia]) {\n content = normalizedMedia[\n key as keyof typeof normalizedMedia\n ] as string;\n\n tagResults.push({\n property: `og:${type}:${key}`,\n content,\n });\n }\n }\n }\n }\n break;\n }\n\n case 'jsonLd': {\n const jsonLdBlocks = ensureArray(dedupedSeoInput.jsonLd);\n let index = 0;\n for (const block of jsonLdBlocks) {\n if (typeof block !== 'object' || Object.keys(block).length === 0) {\n continue;\n }\n\n tagResults.push({\n 'script:ld+json': block,\n });\n }\n\n break;\n }\n\n case 'alternates': {\n const alternates = ensureArray(dedupedSeoInput.alternates);\n\n for (const alternate of alternates) {\n if (!alternate) {\n continue;\n }\n\n const {language, url, default: defaultLang} = alternate;\n\n const hrefLang = language\n ? `${language}${defaultLang ? '-default' : ''}`\n : undefined;\n\n tagResults.push({\n tagName: 'link',\n rel: 'alternate',\n hrefLang,\n href: url,\n });\n }\n\n break;\n }\n\n case 'robots': {\n if (!dedupedSeoInput.robots) {\n break;\n }\n\n const {\n maxImagePreview,\n maxSnippet,\n maxVideoPreview,\n noArchive,\n noFollow,\n noImageIndex,\n noIndex,\n noSnippet,\n noTranslate,\n unavailableAfter,\n } = dedupedSeoInput.robots;\n\n const robotsParams = [\n noArchive && 'noarchive',\n noImageIndex && 'noimageindex',\n noSnippet && 'nosnippet',\n noTranslate && `notranslate`,\n maxImagePreview && `max-image-preview:${maxImagePreview}`,\n maxSnippet && `max-snippet:${maxSnippet}`,\n maxVideoPreview && `max-video-preview:${maxVideoPreview}`,\n unavailableAfter && `unavailable_after:${unavailableAfter}`,\n ];\n\n let robotsParam =\n (noIndex ? 'noindex' : 'index') +\n ',' +\n (noFollow ? 'nofollow' : 'follow');\n\n for (let param of robotsParams) {\n if (param) {\n robotsParam += `,${param}`;\n }\n }\n\n tagResults.push({name: 'robots', content: robotsParam});\n\n break;\n }\n\n default: {\n // TODO: We should be able to catch unaccounted for keys at compile time\n // let exhaustiveCheck: never = seoKey;\n\n break;\n }\n }\n }\n\n return tagResults;\n}\n","import {createElement, Fragment, lazy, Suspense, useMemo} from 'react';\nimport {\n type Location,\n type LoaderFunction,\n type Params,\n useLocation,\n useMatches,\n} from 'react-router';\nimport {generateSeoTags, type SeoConfig} from './generate-seo-tags';\n\nconst SeoLogger = lazy(() => import('./log-seo-tags'));\n\nexport interface SeoHandleFunction<\n Loader extends LoaderFunction | unknown = unknown,\n> {\n (args: {\n data: Loader extends LoaderFunction ? Awaited<ReturnType<Loader>> : unknown;\n id: string;\n params: Params;\n pathname: Location['pathname'];\n search: Location['search'];\n hash: Location['hash'];\n key: string;\n }): Partial<SeoConfig>;\n}\n\ninterface SeoProps {\n /** Enable debug mode that prints SEO properties for route in the console */\n debug?: boolean;\n}\n\ntype SeoWrapper = undefined | {seo: any};\n\n/**\n * @deprecated - use `getSeoMeta` instead\n */\nexport function Seo({debug}: SeoProps) {\n const matches = useMatches();\n const location = useLocation();\n\n console.warn(\n '[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\\nSee: https://shopify.dev/docs/api/hydrogen/utilities/getseometa',\n );\n\n // Capture the seo and jsonLd configs from the route matches\n const seoConfig = useMemo(() => {\n return (\n matches\n .flatMap((match) => {\n const {handle, ...routeMatch} = match;\n const routeData = {...routeMatch, ...location};\n const handleSeo = (handle as SeoWrapper)?.seo;\n const loaderSeo = (routeMatch?.data as SeoWrapper)?.seo;\n\n if (!handleSeo && !loaderSeo) {\n return [];\n }\n\n // if seo is defined in the handle, invoke it with the route data\n if (handleSeo) {\n return recursivelyInvokeOrReturn(handleSeo, routeData);\n } else {\n return [loaderSeo];\n }\n })\n // merge route seo (priority) with the root seo if both are present\n // jsonLd definitions are instead concatenated because there can be\n // multiple jsonLd tags on any given root+route. e.g root renders Organization\n // schema and a product page renders Product schema\n .reduce((acc, current) => {\n // remove seo properties with falsy values\n Object.keys(current).forEach(\n (key) => !current[key] && delete current[key],\n );\n\n const {jsonLd} = current;\n\n if (!jsonLd) {\n return {...acc, ...current};\n }\n\n // concatenate jsonLds if present\n if (!acc?.jsonLd) {\n return {...acc, ...current, jsonLd: [jsonLd]};\n } else {\n if (Array.isArray(jsonLd)) {\n return {\n ...acc,\n ...current,\n jsonLd: [...acc.jsonLd, ...jsonLd],\n };\n } else {\n return {\n ...acc,\n ...current,\n jsonLd: [...acc.jsonLd, jsonLd],\n };\n }\n }\n }, {} as SeoConfig)\n );\n }, [matches, location]);\n\n // Generate seo and jsonLd tags from the route seo configs\n // and return the jsx elements as html\n const {html, loggerMarkup} = useMemo(() => {\n const headTags = generateSeoTags(seoConfig);\n const html = headTags.map((tag) => {\n if (tag.tag === 'script') {\n return createElement(tag.tag, {\n ...tag.props,\n key: tag.key,\n dangerouslySetInnerHTML: {__html: tag.children},\n });\n }\n\n return createElement(tag.tag, {...tag.props, key: tag.key}, tag.children);\n });\n\n const loggerMarkup = createElement(\n Suspense,\n {fallback: null},\n createElement(SeoLogger, {headTags}),\n );\n\n return {html, loggerMarkup};\n }, [seoConfig]);\n\n return createElement(Fragment, null, html, debug && loggerMarkup);\n}\n\n/**\n * Recursively invoke a function or return the value\n * @param value\n * @param rest\n * @returns\n */\nexport function recursivelyInvokeOrReturn<T, R extends any[]>(\n value: T | ((...rest: R) => T),\n ...rest: R\n): T | Record<string, T> {\n if (value instanceof Function) {\n return recursivelyInvokeOrReturn<T, R>(value(...rest), ...rest);\n }\n\n let result: Record<string, T> = {};\n\n if (Array.isArray(value)) {\n result = value.reduce((acc, item) => {\n return [...acc, recursivelyInvokeOrReturn(item)];\n }, []);\n\n return result;\n }\n\n if (value instanceof Object) {\n const entries = Object.entries(value);\n\n entries.forEach(([key, val]) => {\n // @ts-expect-error\n result[key] = recursivelyInvokeOrReturn<T, R>(val, ...rest);\n });\n\n return result;\n }\n\n return value;\n}\n","import {ShopPayButton as ShopPayButtonBase} from '@shopify/hydrogen-react';\nimport {ComponentProps} from 'react';\n\nexport function ShopPayButton(props: ComponentProps<typeof ShopPayButtonBase>) {\n return <ShopPayButtonBase channel=\"hydrogen\" {...props} />;\n}\n","import type {LoaderFunctionArgs} from 'react-router';\nimport type {Storefront} from '../storefront';\n\nconst SITEMAP_INDEX_PREFIX = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n`;\nconst SITEMAP_INDEX_SUFFIX = `\\n</sitemapindex>`;\n\nconst SITEMAP_PREFIX = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">`;\nconst SITEMAP_SUFFIX = `</urlset>`;\n\ntype SITEMAP_INDEX_TYPE =\n | 'pages'\n | 'products'\n | 'collections'\n | 'blogs'\n | 'articles'\n | 'metaObjects';\n\ninterface SitemapIndexOptions {\n /** The Storefront API Client from Hydrogen */\n storefront: Storefront;\n /** A Remix Request object */\n request: Request;\n /** The types of pages to include in the sitemap index. */\n types?: SITEMAP_INDEX_TYPE[];\n /** Add a URL to a custom child sitemap */\n customChildSitemaps?: string[];\n}\n\n/**\n * Generate a sitemap index that links to separate sitemaps for each resource type. Returns a standard Response object.\n */\nexport async function getSitemapIndex(\n options: SitemapIndexOptions,\n): Promise<Response> {\n const {\n storefront,\n request,\n types = [\n 'products',\n 'pages',\n 'collections',\n 'metaObjects',\n 'articles',\n 'blogs',\n ],\n customChildSitemaps = [],\n } = options;\n\n if (!request || !request.url)\n throw new Error('A request object is required to generate a sitemap index');\n\n if (!storefront || !storefront.query)\n throw new Error(\n 'A storefront client is required to generate a sitemap index',\n );\n\n const data = await storefront.query(SITEMAP_INDEX_QUERY);\n\n if (!data) {\n console.warn(\n '[h2:sitemap:warning] Sitemap index is available in API version 2024-10 and later',\n );\n throw new Response('Sitemap index not found.', {status: 404});\n }\n\n const baseUrl = new URL(request.url).origin;\n\n const body =\n SITEMAP_INDEX_PREFIX +\n types\n .map((type) => {\n if (!data[type]) {\n throw new Error(\n `[h2:sitemap:error] No data found for type ${type}. Check types passed to \\`getSitemapIndex\\``,\n );\n }\n return getSiteMapLinks(type, data[type].pagesCount.count, baseUrl);\n })\n .join('\\n') +\n customChildSitemaps\n .map(\n (url) =>\n ' <sitemap><loc>' +\n (baseUrl + (url.startsWith('/') ? url : '/' + url)) +\n '</loc></sitemap>',\n )\n .join('\\n') +\n SITEMAP_INDEX_SUFFIX;\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': `max-age=${60 * 60 * 24}`,\n },\n });\n}\n\ninterface GetSiteMapOptions {\n /** The params object from Remix */\n params: LoaderFunctionArgs['params'];\n /** The Storefront API Client from Hydrogen */\n storefront: Storefront;\n /** A Remix Request object */\n request: Request;\n /** A function that produces a canonical url for a resource. It is called multiple times for each locale supported by the app. */\n getLink: (options: {\n type: string | SITEMAP_INDEX_TYPE;\n baseUrl: string;\n handle?: string;\n locale?: string;\n }) => string;\n /** An array of locales to generate alternate tags */\n locales?: string[];\n /** Optionally customize the changefreq property for each URL */\n getChangeFreq?: (options: {\n type: string | SITEMAP_INDEX_TYPE;\n handle: string;\n }) => string;\n /** If the sitemap has no links, fallback to rendering a link to the homepage. This prevents errors in Google's search console. Defaults to `/`. */\n noItemsFallback?: string;\n}\n\n/**\n * Generate a sitemap for a specific resource type.\n */\nexport async function getSitemap(\n options: GetSiteMapOptions,\n): Promise<Response> {\n const {\n storefront,\n request,\n params,\n getLink,\n locales = [],\n getChangeFreq,\n noItemsFallback = '/',\n } = options;\n\n if (!params)\n throw new Error(\n '[h2:sitemap:error] Remix params object is required to generate a sitemap',\n );\n\n if (!request || !request.url)\n throw new Error('A request object is required to generate a sitemap');\n\n if (!storefront || !storefront.query)\n throw new Error('A storefront client is required to generate a index');\n\n if (!getLink)\n throw new Error(\n 'A `getLink` function to generate each resource is required to build a sitemap',\n );\n\n if (!params.type || !params.page)\n throw new Response('No data found', {status: 404});\n\n const type = params.type as keyof typeof QUERIES;\n\n const query = QUERIES[type];\n\n if (!query) throw new Response('Not found', {status: 404});\n\n const data = await storefront.query(query, {\n variables: {\n page: parseInt(params.page, 10),\n },\n });\n\n if (!data) {\n console.warn(\n '[h2:sitemap:warning] Sitemap is available in API version 2024-10 and later',\n );\n throw new Response('Sitemap not found.', {status: 404});\n }\n\n const baseUrl = new URL(request.url).origin;\n let body: string = '';\n\n if (!data?.sitemap?.resources?.items?.length) {\n body =\n SITEMAP_PREFIX +\n `\\n <url><loc>${baseUrl + noItemsFallback}</loc></url>\\n` +\n SITEMAP_SUFFIX;\n } else {\n body =\n SITEMAP_PREFIX +\n data.sitemap.resources.items\n .map((item: {handle: string; updatedAt: string; type?: string}) => {\n return renderUrlTag({\n getChangeFreq,\n url: getLink({\n type: item.type ?? type,\n baseUrl,\n handle: item.handle,\n }),\n type,\n getLink,\n updatedAt: item.updatedAt,\n handle: item.handle,\n metaobjectType: item.type,\n locales,\n baseUrl,\n });\n })\n .join('\\n') +\n SITEMAP_SUFFIX;\n }\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': `max-age=${60 * 60 * 24}`,\n },\n });\n}\n\nfunction getSiteMapLinks(resource: string, count: number, baseUrl: string) {\n let links = ``;\n\n for (let i = 1; i <= count; i++) {\n links += ` <sitemap><loc>${baseUrl}/sitemap/${resource}/${i}.xml</loc></sitemap>\\n`;\n }\n return links;\n}\n\nfunction renderUrlTag({\n url,\n updatedAt,\n locales,\n type,\n getLink,\n baseUrl,\n handle,\n getChangeFreq,\n metaobjectType,\n}: {\n type: SITEMAP_INDEX_TYPE;\n baseUrl: string;\n handle: string;\n metaobjectType?: string;\n getLink: (options: {\n type: string;\n baseUrl: string;\n handle?: string;\n locale?: string;\n }) => string;\n url: string;\n updatedAt: string;\n locales: string[];\n getChangeFreq?: (options: {type: string; handle: string}) => string;\n}) {\n return `<url>\n <loc>${url}</loc>\n <lastmod>${updatedAt}</lastmod>\n <changefreq>${\n getChangeFreq\n ? getChangeFreq({type: metaobjectType ?? type, handle})\n : 'weekly'\n }</changefreq>\n${locales\n .map((locale) =>\n renderAlternateTag(\n getLink({type: metaobjectType ?? type, baseUrl, handle, locale}),\n locale,\n ),\n )\n .join('\\n')}\n</url>\n `.trim();\n}\n\nfunction renderAlternateTag(url: string, locale: string) {\n return ` <xhtml:link rel=\"alternate\" hreflang=\"${locale}\" href=\"${url}\" />`;\n}\n\nconst PRODUCT_SITEMAP_QUERY = `#graphql\n query SitemapProducts($page: Int!) {\n sitemap(type: PRODUCT) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst COLLECTION_SITEMAP_QUERY = `#graphql\n query SitemapCollections($page: Int!) {\n sitemap(type: COLLECTION) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst ARTICLE_SITEMAP_QUERY = `#graphql\n query SitemapArticles($page: Int!) {\n sitemap(type: ARTICLE) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst PAGE_SITEMAP_QUERY = `#graphql\n query SitemapPages($page: Int!) {\n sitemap(type: PAGE) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst BLOG_SITEMAP_QUERY = `#graphql\n query SitemapBlogs($page: Int!) {\n sitemap(type: BLOG) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst METAOBJECT_SITEMAP_QUERY = `#graphql\n query SitemapMetaobjects($page: Int!) {\n sitemap(type: METAOBJECT) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n ... on SitemapResourceMetaobject {\n type\n }\n }\n }\n }\n }\n` as const;\n\nconst SITEMAP_INDEX_QUERY = `#graphql\nquery SitemapIndex {\n products: sitemap(type: PRODUCT) {\n pagesCount {\n count\n }\n }\n collections: sitemap(type: COLLECTION) {\n pagesCount {\n count\n }\n }\n articles: sitemap(type: ARTICLE) {\n pagesCount {\n count\n }\n }\n pages: sitemap(type: PAGE) {\n pagesCount {\n count\n }\n }\n blogs: sitemap(type: BLOG) {\n pagesCount {\n count\n }\n }\n metaObjects: sitemap(type: METAOBJECT) {\n pagesCount {\n count\n }\n }\n}\n` as const;\n\nconst QUERIES = {\n products: PRODUCT_SITEMAP_QUERY,\n articles: ARTICLE_SITEMAP_QUERY,\n collections: COLLECTION_SITEMAP_QUERY,\n pages: PAGE_SITEMAP_QUERY,\n blogs: BLOG_SITEMAP_QUERY,\n metaObjects: METAOBJECT_SITEMAP_QUERY,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/analytics-manager/AnalyticsView.tsx","../../src/analytics-manager/events.ts","../../src/constants.ts","../../src/utils/server-timing.ts","../../src/customer-privacy/ShopifyCustomerPrivacy.tsx","../../package.json","../../src/analytics-manager/ShopifyAnalytics.tsx","../../src/analytics-manager/CartAnalytics.tsx","../../src/analytics-manager/PerfKit.tsx","../../src/utils/warning.ts","../../src/analytics-manager/AnalyticsProvider.tsx","../../src/utils/request.ts","../../src/utils/callsites.ts","../../src/cache/strategies.ts","../../src/utils/parse-json.ts","../../src/cache/api.ts","../../src/cache/sub-request.ts","../../src/utils/hash.ts","../../src/cache/run-with-cache.ts","../../src/cache/server-fetch.ts","../../src/cache/create-with-cache.ts","../../src/cache/in-memory.ts","../../src/cart/CartForm.tsx","../../src/cart/cartGetIdDefault.ts","../../src/cart/cartSetIdDefault.ts","../../src/utils/uuid.ts","../../src/version.ts","../../src/utils/graphql.ts","../../src/storefront.ts","../../src/cart/queries/cartGetDefault.ts","../../src/cart/queries/cart-fragments.ts","../../src/cart/queries/cartCreateDefault.ts","../../src/cart/queries/cartLinesAddDefault.ts","../../src/cart/optimistic/optimistic-cart.helper.ts","../../src/cart/queries/cartLinesUpdateDefault.ts","../../src/cart/queries/cartLinesRemoveDefault.ts","../../src/cart/queries/cartDiscountCodesUpdateDefault.ts","../../src/cart/queries/cartBuyerIdentityUpdateDefault.ts","../../src/cart/queries/cartNoteUpdateDefault.ts","../../src/cart/queries/cartSelectedDeliveryOptionsUpdateDefault.ts","../../src/cart/queries/cartAttributesUpdateDefault.ts","../../src/cart/queries/cartMetafieldsSetDefault.ts","../../src/cart/queries/cartMetafieldDeleteDefault.ts","../../src/cart/queries/cartGiftCardCodeUpdateDefault.ts","../../src/cart/queries/cartGiftCardCodesRemoveDefault.ts","../../src/cart/queries/cartDeliveryAddressesAddDefault.tsx","../../src/cart/queries/cartDeliveryAddressesRemoveDefault.tsx","../../src/cart/queries/cartDeliveryAddressesUpdateDefault.tsx","../../src/cart/createCartHandler.ts","../../src/cart/optimistic/useOptimisticCart.tsx","../../src/changelogHandler.ts","../../src/context-keys.ts","../../src/customer/constants.ts","../../src/customer/BadRequest.ts","../../src/customer/auth.helpers.ts","../../src/csp/nonce.ts","../../src/utils/get-redirect-url.ts","../../src/customer/customer-account-helper.ts","../../src/customer/customer.ts","../../src/createHydrogenContext.ts","../../src/createRequestHandler.ts","../../src/csp/csp.ts","../../src/csp/Script.tsx","../../src/dev/hydrogen-routes.ts","../../src/optimistic-ui/optimistic-ui.tsx","../../src/pagination/Pagination.ts","../../src/product/useOptimisticVariant.ts","../../src/product/VariantSelector.ts","../../src/react-router-preset.ts","../../src/RichText.tsx","../../src/routing/graphiql.ts","../../src/routing/redirect.ts","../../src/seo/escape.ts","../../src/seo/generate-seo-tags.ts","../../src/seo/getSeoMeta.ts","../../src/seo/seo.ts","../../src/shop/ShopPayButton.tsx","../../src/sitemap/sitemap.ts"],"names":["publish","viewPayload","useLoadScript","config","useEffect","value","subscribe","register","useState","useRef","consent","useMemo","useShopifyCookies","logMissingConfig","cart","prevCart","jsx","isStale","logSubRequestEvent","result","debugInfo","url","response","data","errors","jsxs","createStorefrontUtilities","document","body","headers","options","buyerIdentity","createContext","refreshToken","query","createReactRouterRequestHandler","useContext","useFetchers","useLocation","forwardRef","NextLink","createElement","flattenConnection","params","useNavigation","Fragment","option","variant","selectedValue","OriginalRichText","Link","graphiqlLoader","schema","html","loggerMarkup","ShopPayButtonBase"],"mappings":"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","file":"index.js","sourcesContent":["import {useLocation} from 'react-router';\nimport {useEffect} from 'react';\nimport {\n type ShopAnalytics,\n type AnalyticsProviderProps,\n useAnalytics,\n} from './AnalyticsProvider';\nimport {CartReturn} from '../cart/queries/cart-types';\nimport {AnalyticsEvent} from './events';\nimport {\n CartLine,\n ComponentizableCartLine,\n Product,\n ProductVariant,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type OtherData = {\n /** Any other data that should be included in the event. */\n [key: string]: unknown;\n};\n\ntype BasePayload = {\n /** The shop data passed in from the `AnalyticsProvider`. */\n shop: ShopAnalytics | null;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: AnalyticsProviderProps['customData'];\n};\n\ntype UrlPayload = {\n /** The url location of when this event is collected. */\n url: string;\n};\n\ntype ProductPayload = {\n /** The product id. */\n id: Product['id'];\n /** The product title. */\n title: Product['title'];\n /** The displaying variant price. */\n price: ProductVariant['price']['amount'];\n /** The product vendor. */\n vendor: Product['vendor'];\n /** The displaying variant id. */\n variantId: ProductVariant['id'];\n /** The displaying variant title. */\n variantTitle: ProductVariant['title'];\n /** The quantity of product. */\n quantity: number;\n /** The product sku. */\n sku?: ProductVariant['sku'];\n /** The product type. */\n productType?: Product['productType'];\n};\n\ntype ProductsPayload = {\n /** The products associated with this event. */\n products: Array<ProductPayload & OtherData>;\n};\n\ntype CollectionPayloadDetails = {\n /** The collection id. */\n id: string;\n /** The collection handle. */\n handle: string;\n};\n\ntype CollectionPayload = {\n collection: CollectionPayloadDetails;\n};\n\ntype SearchPayload = {\n /** The search term used for the search results page */\n searchTerm: string;\n /** The search results */\n searchResults?: any;\n};\n\ntype CartPayload = {\n /** The current cart state. */\n cart: CartReturn | null;\n /** The previous cart state. */\n prevCart: CartReturn | null;\n};\n\ntype CartLinePayload = {\n /** The previous state of the cart line that got updated. */\n prevLine?: CartLine | ComponentizableCartLine;\n /** The current state of the cart line that got updated. */\n currentLine?: CartLine | ComponentizableCartLine;\n};\n\n// Event payloads\nexport type CollectionViewPayload = CollectionPayload &\n UrlPayload &\n BasePayload;\nexport type ProductViewPayload = ProductsPayload & UrlPayload & BasePayload;\nexport type CartViewPayload = CartPayload & UrlPayload & BasePayload;\nexport type PageViewPayload = UrlPayload & BasePayload;\nexport type SearchViewPayload = SearchPayload & UrlPayload & BasePayload;\n\ntype ViewPayload =\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | CartViewPayload\n | SearchViewPayload;\n\nexport type CartUpdatePayload = CartPayload & BasePayload & OtherData;\nexport type CartLineUpdatePayload = CartLinePayload &\n CartPayload &\n BasePayload &\n OtherData;\nexport type CustomEventPayload = BasePayload & OtherData;\n\nexport type EventPayloads =\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | CartViewPayload\n | SearchViewPayload\n | CartUpdatePayload\n | CartLineUpdatePayload\n | CustomEventPayload;\n\nexport type EventTypes = (typeof AnalyticsEvent)[keyof typeof AnalyticsEvent];\n\ntype BaseViewProps = {\n customData?: OtherData;\n};\n\nfunction AnalyticsView(\n props: BasicViewProps & {type: typeof AnalyticsEvent.PAGE_VIEWED},\n): null;\nfunction AnalyticsView(\n props: ProductViewProps & {type: typeof AnalyticsEvent.PRODUCT_VIEWED},\n): null;\nfunction AnalyticsView(\n props: CollectionViewProps & {type: typeof AnalyticsEvent.COLLECTION_VIEWED},\n): null;\nfunction AnalyticsView(\n props: BasicViewProps & {type: typeof AnalyticsEvent.CART_VIEWED},\n): null;\nfunction AnalyticsView(\n props: SearchViewProps & {type: typeof AnalyticsEvent.SEARCH_VIEWED},\n): null;\nfunction AnalyticsView(props: CustomViewProps): null;\nfunction AnalyticsView(props: any) {\n const {type, data = {}, customData} = props;\n const location = useLocation();\n const {\n publish,\n cart,\n prevCart,\n shop,\n customData: analyticProviderCustomData,\n } = useAnalytics();\n const url = location.pathname + location.search;\n\n let viewPayload: ViewPayload = {\n ...data,\n customData: {\n ...analyticProviderCustomData,\n ...customData,\n },\n cart,\n prevCart,\n shop,\n };\n\n // Publish page_viewed events when the URL changes\n useEffect(() => {\n // don't publish the event until we have the shop\n if (!shop?.shopId) return;\n\n viewPayload = {\n ...viewPayload,\n url: window.location.href,\n };\n\n publish(type, viewPayload);\n }, [publish, url, shop?.shopId]);\n\n return null;\n}\n\ntype BasicViewProps = {\n data?: OtherData;\n customData?: OtherData;\n};\n\ntype ProductViewProps = {\n data: ProductsPayload;\n customData?: OtherData;\n};\n\ntype CollectionViewProps = {\n data: CollectionPayload;\n customData?: OtherData;\n};\n\ntype SearchViewProps = {\n data?: SearchPayload;\n customData?: OtherData;\n};\n\ntype CustomViewProps = {\n type: typeof AnalyticsEvent.CUSTOM_EVENT;\n data?: OtherData;\n customData?: OtherData;\n};\n\nexport function AnalyticsPageView(props: BasicViewProps) {\n return <AnalyticsView {...props} type=\"page_viewed\" />;\n}\n\nexport function AnalyticsProductView(props: ProductViewProps) {\n return <AnalyticsView {...props} type=\"product_viewed\" />;\n}\n\nexport function AnalyticsCollectionView(props: CollectionViewProps) {\n return <AnalyticsView {...props} type=\"collection_viewed\" />;\n}\n\nexport function AnalyticsCartView(props: BasicViewProps) {\n return <AnalyticsView {...props} type=\"cart_viewed\" />;\n}\n\nexport function AnalyticsSearchView(props: SearchViewProps) {\n return <AnalyticsView {...props} type=\"search_viewed\" />;\n}\n\nexport function AnalyticsCustomView(props: CustomViewProps) {\n return <AnalyticsView {...props} />;\n}\n","export const AnalyticsEvent = {\n // Views\n PAGE_VIEWED: 'page_viewed' as const,\n PRODUCT_VIEWED: 'product_viewed' as const,\n COLLECTION_VIEWED: 'collection_viewed' as const,\n CART_VIEWED: 'cart_viewed' as const,\n SEARCH_VIEWED: 'search_viewed' as const,\n\n // Cart\n CART_UPDATED: 'cart_updated' as const,\n PRODUCT_ADD_TO_CART: 'product_added_to_cart' as const,\n PRODUCT_REMOVED_FROM_CART: 'product_removed_from_cart' as const,\n\n // Custom\n CUSTOM_EVENT: `custom_` as `custom_${string}`,\n};\n","export const STOREFRONT_REQUEST_GROUP_ID_HEADER =\n 'Custom-Storefront-Request-Group-ID';\nexport const STOREFRONT_ACCESS_TOKEN_HEADER =\n 'X-Shopify-Storefront-Access-Token';\nexport const SDK_VARIANT_HEADER = 'X-SDK-Variant';\nexport const SDK_VARIANT_SOURCE_HEADER = 'X-SDK-Variant-Source';\nexport const SDK_VERSION_HEADER = 'X-SDK-Version';\nexport const SHOPIFY_CLIENT_IP_HEADER = 'X-Shopify-Client-IP';\nexport const SHOPIFY_CLIENT_IP_SIG_HEADER = 'X-Shopify-Client-IP-Sig';\nexport const HYDROGEN_SFAPI_PROXY_KEY = '_sfapi_proxy';\nexport const HYDROGEN_SERVER_TRACKING_KEY = '_server_tracking';\n","import {\n HYDROGEN_SFAPI_PROXY_KEY,\n HYDROGEN_SERVER_TRACKING_KEY,\n} from '../constants';\n\nfunction buildServerTimingHeader(values: Record<string, string | undefined>) {\n return Object.entries(values)\n .map(([key, value]) => (value ? `${key};desc=${value}` : undefined))\n .filter(Boolean)\n .join(', ');\n}\n\n/**\n * Creates a Server-Timing header from the given values and appends it to the response.\n */\nexport function appendServerTimingHeader(\n response: {headers: Headers},\n values: string | Parameters<typeof buildServerTimingHeader>[0],\n) {\n const header =\n typeof values === 'string' ? values : buildServerTimingHeader(values);\n\n if (header) {\n response.headers.append('Server-Timing', header);\n }\n}\n\n// In order: unique token, visit token, and consent\nconst trackedTimings = ['_y', '_s', '_cmp'] as const;\n\ntype TrackedTimingKeys = (typeof trackedTimings)[number];\nexport type TrackedTimingsRecord = Partial<Record<TrackedTimingKeys, string>>;\n\nexport function extractServerTimingHeader(\n serverTimingHeader?: string,\n): TrackedTimingsRecord {\n const values: TrackedTimingsRecord = {};\n if (!serverTimingHeader) return values;\n\n const re = new RegExp(\n `\\\\b(${trackedTimings.join('|')});desc=\"?([^\",]+)\"?`,\n 'g',\n );\n\n let match;\n while ((match = re.exec(serverTimingHeader)) !== null) {\n values[match[1] as TrackedTimingKeys] = match[2];\n }\n\n return values;\n}\n\n/**\n * Checks if a specific server-timing header is present in the navigation entry.\n */\nfunction hasServerTimingInNavigationEntry(key: string): boolean {\n if (typeof window === 'undefined') return false;\n\n try {\n const navigationEntry = window.performance.getEntriesByType(\n 'navigation',\n )[0] as PerformanceNavigationTiming;\n\n return !!navigationEntry?.serverTiming?.some((entry) => entry.name === key);\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Checks if the SFAPI proxy is enabled by looking for the\n * _sfapi_proxy server-timing header in the navigation entry.\n */\nexport function isSfapiProxyEnabled(): boolean {\n return hasServerTimingInNavigationEntry(HYDROGEN_SFAPI_PROXY_KEY);\n}\n\n/**\n * Checks if the backend already fetched tracking values by looking for\n * the _server_tracking server-timing header in the navigation entry.\n */\nexport function hasServerReturnedTrackingValues(): boolean {\n return hasServerTimingInNavigationEntry(HYDROGEN_SERVER_TRACKING_KEY);\n}\n","import {getTrackingValues, useShopifyCookies} from '@shopify/hydrogen-react';\nimport {\n CountryCode,\n LanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {useRevalidator} from 'react-router';\nimport {useLoadScript} from '@shopify/hydrogen-react/load-script';\nimport {\n isSfapiProxyEnabled,\n hasServerReturnedTrackingValues,\n} from '../utils/server-timing';\n\nexport type ConsentStatus = boolean | undefined;\n\nexport type VisitorConsent = {\n marketing: ConsentStatus;\n analytics: ConsentStatus;\n preferences: ConsentStatus;\n sale_of_data: ConsentStatus;\n};\n\nexport type VisitorConsentCollected = {\n analyticsAllowed: boolean;\n firstPartyMarketingAllowed: boolean;\n marketingAllowed: boolean;\n preferencesAllowed: boolean;\n saleOfDataAllowed: boolean;\n thirdPartyMarketingAllowed: boolean;\n};\n\nexport type CustomerPrivacyApiLoaded = boolean;\n\nexport type CustomerPrivacyConsentConfig = {\n checkoutRootDomain: string;\n storefrontRootDomain?: string;\n storefrontAccessToken: string;\n country?: CountryCode;\n /** The privacyBanner refers to `language` as `locale` */\n locale?: LanguageCode;\n};\n\nexport type SetConsentHeadlessParams = VisitorConsent &\n CustomerPrivacyConsentConfig & {\n headlessStorefront?: boolean;\n };\n\n/**\n Ideally this type should come from the Custoemr Privacy API sdk\n analyticsProcessingAllowed -\n currentVisitorConsent\n doesMerchantSupportGranularConsent\n firstPartyMarketingAllowed\n getCCPAConsent\n getTrackingConsent\n marketingAllowed\n preferencesProcessingAllowed\n saleOfDataAllowed\n saleOfDataRegion\n setTrackingConsent\n shouldShowBanner\n shouldShowGDPRBanner\n thirdPartyMarketingAllowed\n**/\nexport type OriginalCustomerPrivacy = {\n currentVisitorConsent: () => VisitorConsent;\n preferencesProcessingAllowed: () => boolean;\n saleOfDataAllowed: () => boolean;\n marketingAllowed: () => boolean;\n analyticsProcessingAllowed: () => boolean;\n setTrackingConsent: (\n consent: SetConsentHeadlessParams,\n callback: (data: {error: string} | undefined) => void,\n ) => void;\n shouldShowBanner: () => boolean;\n};\n\nexport type CustomerPrivacy = Omit<\n OriginalCustomerPrivacy,\n 'setTrackingConsent'\n> & {\n setTrackingConsent: (\n consent: VisitorConsent, // we have already applied the headlessStorefront in the override\n callback: (data: {error: string} | undefined) => void,\n ) => void;\n};\n\n// NOTE: options is optional because we override these method(s) with pre-applied options\nexport type PrivacyBanner = {\n /* Display the privacy banner */\n loadBanner: (options?: Partial<CustomerPrivacyConsentConfig>) => void;\n /* Display the consent preferences banner */\n showPreferences: (options?: Partial<CustomerPrivacyConsentConfig>) => void;\n};\n\nexport interface CustomEventMap {\n visitorConsentCollected: CustomEvent<VisitorConsentCollected>;\n customerPrivacyApiLoaded: CustomEvent<CustomerPrivacyApiLoaded>;\n}\n\nexport type CustomerPrivacyApiProps = {\n /** The production shop checkout domain url. */\n checkoutDomain: string;\n /** The storefront access token for the shop. */\n storefrontAccessToken: string;\n /** Whether to load the Shopify privacy banner as configured in Shopify admin. Defaults to true. */\n withPrivacyBanner?: boolean;\n /** Country code for the shop. */\n country?: CountryCode;\n /** Language code for the shop. */\n locale?: LanguageCode;\n /** Callback to be called when visitor consent is collected. */\n onVisitorConsentCollected?: (consent: VisitorConsentCollected) => void;\n /** Callback to be call when customer privacy api is ready. */\n onReady?: () => void;\n /**\n * Whether consent libraries can use same-domain requests to the Storefront API.\n * Defaults to true if the standard route proxy is enabled in Hydrogen server.\n */\n sameDomainForStorefrontApi?: boolean;\n};\n\nexport const CONSENT_API =\n 'https://cdn.shopify.com/shopifycloud/consent-tracking-api/v0.2/consent-tracking-api.js';\nexport const CONSENT_API_WITH_BANNER =\n 'https://cdn.shopify.com/shopifycloud/privacy-banner/storefront-banner.js';\n\nfunction logMissingConfig(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:useCustomerPrivacy] Unable to setup Customer Privacy API: Missing consent.${fieldName} configuration.`,\n );\n}\n\nexport function useCustomerPrivacy(props: CustomerPrivacyApiProps) {\n const {\n withPrivacyBanner = false,\n onVisitorConsentCollected,\n onReady,\n checkoutDomain,\n storefrontAccessToken,\n country,\n locale,\n sameDomainForStorefrontApi,\n } = props;\n\n /** Determine if SF API proxy is enabled in Hydrogen server */\n const hasSfapiProxy = useMemo(\n () => sameDomainForStorefrontApi ?? isSfapiProxyEnabled(),\n [sameDomainForStorefrontApi],\n );\n\n /**\n * Determine if we need to fetch tracking values from the browser.\n * This can happen if the server did not collect this information already (e.g. subrequests were cached).\n */\n const fetchTrackingValuesFromBrowser = useMemo(\n () => hasSfapiProxy && !hasServerReturnedTrackingValues(),\n [hasSfapiProxy],\n );\n\n const cookiesReady = useShopifyCookies({\n fetchTrackingValues: fetchTrackingValuesFromBrowser,\n storefrontAccessToken,\n ignoreDeprecatedCookies: true,\n });\n\n // Store initial tracking values to compare later\n const initialTrackingValues = useMemo(getTrackingValues, [cookiesReady]);\n const {revalidate} = useRevalidator();\n\n // Load the Shopify customer privacy API with or without the privacy banner\n // NOTE: We no longer use the status because we need `ready` to be not when the script is loaded\n // but instead when both `privacyBanner` (optional) and customerPrivacy are loaded in the window\n useLoadScript(withPrivacyBanner ? CONSENT_API_WITH_BANNER : CONSENT_API, {\n attributes: {\n id: 'customer-privacy-api',\n },\n });\n\n const {observing, setLoaded, apisLoaded} = useApisLoaded({withPrivacyBanner});\n\n const config = useMemo(() => {\n if (!checkoutDomain) logMissingConfig('checkoutDomain');\n if (!storefrontAccessToken) logMissingConfig('storefrontAccessToken');\n\n // validate that the storefront access token is not a server API token\n if (\n storefrontAccessToken.startsWith('shpat_') ||\n storefrontAccessToken.length !== 32\n ) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:useCustomerPrivacy] It looks like you passed a private access token, make sure to use the public token`,\n );\n }\n\n const commonAncestorDomain = parseStoreDomain(checkoutDomain);\n const sfapiDomain =\n // Check if standard route proxy is enabled in Hydrogen server\n // to use it instead of doing a cross-origin request to checkout.\n hasSfapiProxy && typeof window !== 'undefined'\n ? window.location.host\n : checkoutDomain;\n\n const config: CustomerPrivacyConsentConfig = {\n // This domain is used to send requests to SFAPI for setting and getting consent.\n checkoutRootDomain: sfapiDomain,\n // Prefix with a dot to ensure this domain is different from checkoutRootDomain.\n // This will ensure old cookies are set for a cross-subdomain checkout setup\n // so that we keep backward compatibility until new cookies are rolled out.\n // Once consent-tracking-api is updated to not rely on cookies anymore, we can remove this.\n storefrontRootDomain: commonAncestorDomain\n ? '.' + commonAncestorDomain\n : undefined,\n storefrontAccessToken,\n country,\n locale,\n };\n\n return config;\n }, [\n logMissingConfig,\n checkoutDomain,\n storefrontAccessToken,\n country,\n locale,\n ]);\n\n // settings event listeners for visitorConsentCollected\n useEffect(() => {\n const consentCollectedHandler = (\n event: CustomEvent<VisitorConsentCollected>,\n ) => {\n const latestTrackingValues = getTrackingValues();\n if (\n initialTrackingValues.visitToken !== latestTrackingValues.visitToken ||\n initialTrackingValues.uniqueToken !== latestTrackingValues.uniqueToken\n ) {\n // Tracking has changed: revalidate data to get updated cart.checkoutUrl with new params.\n revalidate().catch(() => {\n console.warn(\n '[h2:warn:useCustomerPrivacy] Revalidation failed after consent change.',\n );\n });\n }\n\n if (onVisitorConsentCollected) {\n const customerPrivacy = getCustomerPrivacy();\n if (customerPrivacy?.shouldShowBanner()) {\n // This type is plain wrong:\n const consentValues =\n customerPrivacy.currentVisitorConsent() as unknown as Record<\n keyof VisitorConsent,\n string\n >;\n\n if (consentValues) {\n // Mimic Privacy Banner SDK behavior to detect no-interaction:\n const NO_VALUE = '';\n const noInteraction =\n consentValues.marketing === NO_VALUE &&\n consentValues.analytics === NO_VALUE &&\n consentValues.preferences === NO_VALUE;\n\n if (noInteraction) {\n // The banner is being shown but the user has not interacted yet.\n // The fact that this event has been fired before interaction\n // is likely a bug in Privacy Banner SDK. We ignore this event for now.\n return;\n }\n }\n }\n\n onVisitorConsentCollected(event.detail);\n }\n };\n\n document.addEventListener(\n 'visitorConsentCollected',\n consentCollectedHandler,\n );\n\n return () => {\n document.removeEventListener(\n 'visitorConsentCollected',\n consentCollectedHandler,\n );\n };\n }, [onVisitorConsentCollected]);\n\n // monitor when the `privacyBanner` is in the window and override it's methods with config\n // pre-applied versions\n useEffect(() => {\n if (!withPrivacyBanner || observing.current.privacyBanner) return;\n observing.current.privacyBanner = true;\n\n let customPrivacyBanner: PrivacyBanner | undefined =\n window.privacyBanner || undefined;\n\n const privacyBannerWatcher = {\n configurable: true,\n get() {\n return customPrivacyBanner;\n },\n set(value: unknown) {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'showPreferences' in value &&\n 'loadBanner' in value\n ) {\n // overwrite the privacyBanner methods\n customPrivacyBanner = overridePrivacyBannerMethods({\n privacyBanner: value as PrivacyBanner,\n config,\n });\n\n // set the loaded state for the privacyBanner\n setLoaded.privacyBanner();\n }\n },\n };\n\n Object.defineProperty(window, 'privacyBanner', privacyBannerWatcher);\n }, [\n withPrivacyBanner,\n config,\n overridePrivacyBannerMethods,\n setLoaded.privacyBanner,\n ]);\n\n // monitor when the Shopify.customerPrivacy is added to the window and override the\n // setTracking consent method with the config pre-applied\n useEffect(() => {\n if (observing.current.customerPrivacy) return;\n observing.current.customerPrivacy = true;\n\n let customCustomerPrivacy: CustomerPrivacy | null = null;\n let customShopify: {customerPrivacy: CustomerPrivacy} | undefined | object =\n window.Shopify || undefined;\n\n // monitor for when window.Shopify = {} is first set\n Object.defineProperty(window, 'Shopify', {\n configurable: true,\n get() {\n return customShopify;\n },\n set(value: unknown) {\n // monitor for when window.Shopify = {} is first set\n if (\n typeof value === 'object' &&\n value !== null &&\n Object.keys(value).length === 0\n ) {\n customShopify = value as object;\n\n // monitor for when window.Shopify.customerPrivacy is set\n Object.defineProperty(window.Shopify, 'customerPrivacy', {\n configurable: true,\n get() {\n return customCustomerPrivacy;\n },\n set(value: unknown) {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'setTrackingConsent' in value\n ) {\n const customerPrivacy = value as CustomerPrivacy;\n\n // overwrite the tracking consent method\n customCustomerPrivacy = {\n ...customerPrivacy,\n // Note: this method is not used by the privacy-banner,\n // it bundles its own setTrackingConsent.\n setTrackingConsent: overrideCustomerPrivacySetTrackingConsent(\n {customerPrivacy, config},\n ),\n };\n\n customShopify = {\n ...customShopify,\n customerPrivacy: customCustomerPrivacy,\n };\n\n setLoaded.customerPrivacy();\n }\n },\n });\n }\n },\n });\n }, [\n config,\n overrideCustomerPrivacySetTrackingConsent,\n setLoaded.customerPrivacy,\n ]);\n\n useEffect(() => {\n if (!apisLoaded || !cookiesReady) return;\n\n const customerPrivacy = getCustomerPrivacy();\n // @ts-expect-error Internal property\n if (customerPrivacy && !customerPrivacy.cachedConsent) {\n // Consent-tracking-api assumes consent if it doesn't have anything to work with.\n // Since we have fetched the tracking values already, we set its cachedConsent here.\n // This is a workaround until consent-tracking-api knows how to read server-timing for us.\n const trackingValues = getTrackingValues();\n if (trackingValues.consent) {\n // @ts-expect-error Internal property\n customerPrivacy.cachedConsent = trackingValues.consent;\n }\n }\n\n if (withPrivacyBanner) {\n const privacyBanner = getPrivacyBanner();\n if (privacyBanner) {\n // auto load the banner if applicable\n privacyBanner.loadBanner(config);\n }\n }\n\n emitCustomerPrivacyApiLoaded();\n onReady?.();\n }, [apisLoaded, cookiesReady]);\n\n // return the customerPrivacy and privacyBanner (optional) modified APIs\n const result = {\n customerPrivacy: getCustomerPrivacy(),\n } as {\n customerPrivacy: CustomerPrivacy | null;\n privacyBanner?: PrivacyBanner | null;\n };\n\n if (withPrivacyBanner) {\n result.privacyBanner = getPrivacyBanner();\n }\n\n return result;\n}\n\nlet hasEmitted = false;\nfunction emitCustomerPrivacyApiLoaded() {\n if (hasEmitted) return;\n hasEmitted = true;\n const event = new CustomEvent('shopifyCustomerPrivacyApiLoaded');\n document.dispatchEvent(event);\n}\n\nfunction useApisLoaded({withPrivacyBanner}: {withPrivacyBanner: boolean}) {\n // used to help run the watchers only once\n const observing = useRef({customerPrivacy: false, privacyBanner: false});\n\n // [customerPrivacy, privacyBanner]\n const [apisLoadedArray, setApisLoaded] = useState(\n withPrivacyBanner ? [false, false] : [false],\n );\n\n // combined loaded state for both APIs\n const apisLoaded = apisLoadedArray.every(Boolean);\n\n const setLoaded = {\n customerPrivacy: () => {\n if (withPrivacyBanner) {\n setApisLoaded((prev) => [true, prev[1]]);\n } else {\n setApisLoaded(() => [true]);\n }\n },\n privacyBanner: () => {\n if (!withPrivacyBanner) {\n return;\n }\n setApisLoaded((prev) => [prev[0], true]);\n },\n };\n\n return {observing, setLoaded, apisLoaded};\n}\n\n/**\n * Extracts the root domain from the checkout domain otherwise returns the checkout domain.\n */\nfunction parseStoreDomain(checkoutDomain: string) {\n if (typeof window === 'undefined') return;\n\n const host = window.location.host;\n const checkoutDomainParts = checkoutDomain.split('.').reverse();\n const currentDomainParts = host.split('.').reverse();\n const sameDomainParts: Array<string> = [];\n checkoutDomainParts.forEach((part, index) => {\n if (part === currentDomainParts[index]) {\n sameDomainParts.push(part);\n }\n });\n\n return sameDomainParts.reverse().join('.') || undefined;\n}\n\n/**\n * Overrides the customerPrivacy.setTrackingConsent method to include the headless storefront configuration.\n */\nfunction overrideCustomerPrivacySetTrackingConsent({\n customerPrivacy,\n config,\n}: {\n customerPrivacy: OriginalCustomerPrivacy;\n config: CustomerPrivacyConsentConfig;\n}) {\n // Override the setTrackingConsent method to include the headless storefront configuration\n const original = customerPrivacy.setTrackingConsent;\n const {locale, country, ...rest} = config;\n\n function updatedSetTrackingConsent(\n consent: VisitorConsent,\n callback: (data: {error: string} | undefined) => void,\n ) {\n original(\n {\n ...rest,\n headlessStorefront: true,\n ...consent,\n },\n callback,\n );\n }\n return updatedSetTrackingConsent;\n}\n\n/**\n * Overrides the privacyBanner methods to include the config\n */\nfunction overridePrivacyBannerMethods({\n privacyBanner,\n config,\n}: {\n privacyBanner: PrivacyBanner;\n config: CustomerPrivacyConsentConfig;\n}) {\n const originalLoadBanner = privacyBanner.loadBanner;\n const originalShowPreferences = privacyBanner.showPreferences;\n\n function loadBanner(userConfig?: Partial<CustomerPrivacyConsentConfig>) {\n if (typeof userConfig === 'object') {\n originalLoadBanner({...config, ...userConfig});\n return;\n }\n originalLoadBanner(config);\n }\n\n function showPreferences(userConfig?: Partial<CustomerPrivacyConsentConfig>) {\n if (typeof userConfig === 'object') {\n originalShowPreferences({...config, ...userConfig});\n return;\n }\n originalShowPreferences(config);\n }\n return {loadBanner, showPreferences} as PrivacyBanner;\n}\n\n/*\n * Returns Shopify's customerPrivacy methods if loaded in the `window` object.\n * @returns CustomerPrivacy | null\n * @example\n * ```ts\n * const customerPrivacy = getCustomerPrivacy()\n *\n * if (customerPrivacy) {\n * // get the current visitor consent\n * const visitorConsent = customerPrivacy.currentVisitorConsent()\n *\n * // set the tracking consent\n * customerPrivacy.setTrackingConsent({marketing: true...}, () => {\n * // do something after the consent is set\n * })\n *\n * // check if marketing is allowed\n * const marketingAllowed = customerPrivacy.marketingAllowed()\n * console.log(marketingAllowed)\n *\n * // check if analytics is allowed\n * const analyticsAllowed = customerPrivacy.analyticsProcessingAllowed()\n * console.log(analyticsAllowed)\n *\n * // check if preferences are allowed\n * const preferencesAllowed = customerPrivacy.preferencesProcessingAllowed()\n * console.log(preferencesAllowed)\n *\n * // check if sale of data is allowed\n * const saleOfDataAllowed = customerPrivacy.saleOfDataAllowed()\n *\n * // check if third party marketing is allowed\n * const thirdPartyMarketingAllowed = customerPrivacy.thirdPartyMarketingAllowed()\n *\n * // check if first party marketing is allowed\n * const firstPartyMarketingAllowed = customerPrivacy.firstPartyMarketingAllowed()\n *\n * // check if the banner should be shown\n * const shouldShowBanner = customerPrivacy.shouldShowBanner()\n *\n * // check if the GDPR banner should be shown\n * const shouldShowGDPRBanner = customerPrivacy.shouldShowGDPRBanner()\n *\n * // check if the CCPA banner should be shown\n * const shouldShowCCPABanner = customerPrivacy.shouldShowCCPABanner()\n *\n * // check if the regulation is enforced\n * const isRegulationEnforced = customerPrivacy.isRegulationEnforced()\n *\n * // get the regulation\n * const regulation = customerPrivacy.getRegulation()\n *\n * // get the sale of data region\n * const saleOfDataRegion = customerPrivacy.saleOfDataRegion()\n *\n * // get the shop preferences\n * const shopPrefs = customerPrivacy.getShopPrefs()\n *\n * // get the tracking consent\n * const trackingConsent = customerPrivacy.getTrackingConsent()\n *\n * // get the CCPA consent\n * const ccpaConsent = customerPrivacy.getCCPAConsent()\n *\n * // check if the merchant supports granular consent\n * const doesMerchantSupportGranularConsent = customerPrivacy.doesMerchantSupportGranularConsent()\n * }\n * ```\n */\nexport function getCustomerPrivacy() {\n try {\n return window.Shopify && window.Shopify.customerPrivacy\n ? (window.Shopify?.customerPrivacy as CustomerPrivacy)\n : null;\n } catch (e) {\n return null;\n }\n}\n\n/**\n * Returns Shopify's privacyBanner methods if loaded in the `window` object.\n * @returns PrivacyBanner | null\n * @example\n * ```ts\n * const privacyBanner = getPrivacyBanner()\n *\n * if (privacyBanner) {\n * // show the banner\n * privacyBanner.loadBanner()\n *\n * // show the preferences\n * privacyBanner.showPreferences()\n * }\n * ```\n */\nexport function getPrivacyBanner() {\n try {\n return window && window?.privacyBanner\n ? (window.privacyBanner as PrivacyBanner)\n : null;\n } catch (e) {\n return null;\n }\n}\n","{\n \"name\": \"@shopify/hydrogen\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"@shopify:registry\": \"https://registry.npmjs.org\"\n },\n \"type\": \"module\",\n \"version\": \"2025.7.3\",\n \"license\": \"MIT\",\n \"main\": \"dist/index.cjs\",\n \"module\": \"dist/production/index.js\",\n \"types\": \"dist/production/index.d.ts\",\n \"sideEffects\": false,\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Shopify/hydrogen.git\",\n \"directory\": \"packages/hydrogen\"\n },\n \"scripts\": {\n \"build\": \"tsup --clean\",\n \"dev\": \"tsup --watch ./src --watch ../../node_modules/@shopify/hydrogen-react/dist/browser-prod/index.mjs\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"prepack\": \"npm run build\",\n \"test:watch\": \"vitest\",\n \"build-docs\": \"sh ./docs/build-docs.sh && npm run format\",\n \"format\": \"prettier --write \\\"{src,docs}/**/*\\\" --ignore-unknown\",\n \"preview-docs\": \"npm run dev --prefix ../../docs/preview\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/production/index.d.ts\",\n \"module\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n },\n \"require\": \"./dist/index.cjs\",\n \"import\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n },\n \"default\": {\n \"development\": \"./dist/development/index.js\",\n \"default\": \"./dist/production/index.js\"\n }\n },\n \"./vite\": {\n \"types\": \"./dist/vite/plugin.d.ts\",\n \"default\": \"./dist/vite/plugin.js\"\n },\n \"./oxygen\": {\n \"types\": \"./dist/oxygen/index.d.ts\",\n \"default\": \"./dist/oxygen/index.js\"\n },\n \"./storefront-api-types\": \"./dist/storefront-api-types.d.ts\",\n \"./storefront.schema.json\": \"./dist/storefront.schema.json\",\n \"./customer-account-api-types\": \"./dist/customer-account-api-types.d.ts\",\n \"./customer-account.schema.json\": \"./dist/customer-account.schema.json\",\n \"./react-router-types\": {\n \"types\": \"./dist/react-router.d.ts\"\n },\n \"./react-router-preset\": {\n \"types\": \"./dist/production/react-router-preset.d.ts\",\n \"import\": {\n \"development\": \"./dist/development/react-router-preset.js\",\n \"default\": \"./dist/production/react-router-preset.js\"\n },\n \"default\": \"./dist/production/react-router-preset.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"typesVersions\": {\n \"*\": {\n \"storefront-api-types\": [\n \"./dist/storefront-api-types.d.ts\"\n ],\n \"customer-account-api-types\": [\n \"./dist/customer-account-api-types.d.ts\"\n ]\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"dependencies\": {\n \"@shopify/hydrogen-react\": \"2025.7.2\",\n \"content-security-policy-builder\": \"^2.2.0\",\n \"flame-chart-js\": \"2.3.1\",\n \"isbot\": \"^5.1.21\",\n \"source-map-support\": \"^0.5.21\",\n \"type-fest\": \"^4.33.0\",\n \"use-resize-observer\": \"^9.1.0\",\n \"worktop\": \"^0.7.3\",\n \"@shopify/graphql-client\": \"1.4.1\"\n },\n \"devDependencies\": {\n \"react-router\": \"7.12.0\",\n \"@react-router/dev\": \"7.12.0\",\n \"@shopify/generate-docs\": \"0.16.4\",\n \"@shopify/hydrogen-codegen\": \"*\",\n \"@testing-library/jest-dom\": \"^5.17.0\",\n \"@testing-library/react\": \"^14.0.0\",\n \"@types/source-map-support\": \"^0.5.10\",\n \"formdata-polyfill\": \"^4.0.10\",\n \"happy-dom\": \"^17.0.0\",\n \"react\": \"18.3.1\",\n \"schema-dts\": \"^1.1.2\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"react-router\": \"7.12.0\",\n \"@react-router/dev\": \"7.12.0\",\n \"react\": \"^18.3.1 || ~19.0.3 || ~19.1.4 || ^19.2.3\",\n \"vite\": \"^5.1.0 || ^6.2.1\"\n },\n \"peerDependenciesMeta\": {\n \"vite\": {\n \"optional\": true\n }\n }\n}\n","import {\n AnalyticsEventName,\n getClientBrowserParameters,\n sendShopifyAnalytics,\n useShopifyCookies,\n type ShopifyPageViewPayload,\n AnalyticsPageType,\n type ShopifyAnalyticsProduct,\n type ShopifyAddToCartPayload,\n} from '@shopify/hydrogen-react';\nimport {type CartReturn} from '../cart/queries/cart-types';\nimport {AnalyticsEvent} from './events';\nimport {useAnalytics, type AnalyticsProviderProps} from './AnalyticsProvider';\nimport {\n useCustomerPrivacy,\n getCustomerPrivacy,\n} from '../customer-privacy/ShopifyCustomerPrivacy';\nimport type {\n PageViewPayload,\n ProductViewPayload,\n CollectionViewPayload,\n CartUpdatePayload,\n CartLineUpdatePayload,\n SearchViewPayload,\n} from './AnalyticsView';\nimport {useEffect, useMemo, useRef, useState} from 'react';\nimport {\n CartLine,\n ComponentizableCartLine,\n Maybe,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {version} from '../../package.json';\n\nfunction getCustomerPrivacyRequired() {\n const customerPrivacy = getCustomerPrivacy();\n\n if (!customerPrivacy) {\n throw new Error(\n '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>.',\n );\n }\n\n return customerPrivacy;\n}\n\n/**\n * This component is responsible for sending analytics events to Shopify.\n * It emits the following events:\n * - page_viewed\n * - product_viewed\n * - collection_viewed\n * - search_viewed\n * - product_added_to_cart\n */\nexport function ShopifyAnalytics({\n consent,\n onReady,\n domain,\n}: {\n consent: AnalyticsProviderProps['consent'];\n onReady: () => void;\n domain?: string;\n}) {\n const {subscribe, register, canTrack} = useAnalytics();\n const [shopifyReady, setShopifyReady] = useState(false);\n const [privacyReady, setPrivacyReady] = useState(false);\n const [collectedConsent, setCollectedConsent] = useState('');\n const init = useRef(false);\n const {checkoutDomain, storefrontAccessToken, language} = consent;\n const {ready: shopifyAnalyticsReady} = register('Internal_Shopify_Analytics');\n\n // load customer privacy and (optionally) the privacy banner APIs\n useCustomerPrivacy({\n ...consent,\n locale: language,\n checkoutDomain: !checkoutDomain ? 'mock.shop' : checkoutDomain,\n storefrontAccessToken: !storefrontAccessToken\n ? 'abcdefghijklmnopqrstuvwxyz123456'\n : storefrontAccessToken,\n // If we use privacy banner, we should wait until consent is collected.\n // Otherwise, we can consider privacy ready immediately:\n onReady: () => !consent.withPrivacyBanner && setPrivacyReady(true),\n onVisitorConsentCollected: (consent) => {\n try {\n // Store consent to refresh local cookies after it changes\n setCollectedConsent(JSON.stringify(consent));\n } catch (e) {}\n\n setPrivacyReady(true);\n },\n });\n\n const hasUserConsent = useMemo(\n // must be initialized with true to avoid removing cookies too early\n () => (privacyReady ? canTrack() : true),\n // Make this value depend on collectedConsent to re-run `canTrack()` when consent changes\n [privacyReady, canTrack, collectedConsent],\n );\n\n // set up shopify_Y and shopify_S cookies\n useShopifyCookies({\n hasUserConsent,\n domain,\n checkoutDomain,\n // Already done inside useCustomerPrivacy\n fetchTrackingValues: false,\n // Avoid creating local cookies too early\n ignoreDeprecatedCookies: !privacyReady,\n });\n\n useEffect(() => {\n if (init.current) return;\n init.current = true;\n\n // Views\n subscribe(AnalyticsEvent.PAGE_VIEWED, pageViewHandler);\n subscribe(AnalyticsEvent.PRODUCT_VIEWED, productViewHandler);\n subscribe(AnalyticsEvent.COLLECTION_VIEWED, collectionViewHandler);\n subscribe(AnalyticsEvent.SEARCH_VIEWED, searchViewHandler);\n\n // Cart\n subscribe(AnalyticsEvent.PRODUCT_ADD_TO_CART, productAddedToCartHandler);\n\n setShopifyReady(true);\n }, [subscribe]);\n\n useEffect(() => {\n if (shopifyReady && privacyReady) {\n shopifyAnalyticsReady();\n onReady();\n }\n }, [shopifyReady, privacyReady, onReady]);\n\n return null;\n}\n\nfunction logMissingConfig(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Unable to send Shopify analytics: Missing shop.${fieldName} configuration.`,\n );\n}\n\nfunction prepareBasePageViewPayload(\n payload:\n | PageViewPayload\n | ProductViewPayload\n | CollectionViewPayload\n | SearchViewPayload\n | CartUpdatePayload,\n): ShopifyPageViewPayload | undefined {\n const customerPrivacy = getCustomerPrivacyRequired();\n const hasUserConsent = customerPrivacy.analyticsProcessingAllowed();\n\n if (!payload?.shop?.shopId) {\n logMissingConfig('shopId');\n return;\n }\n if (!payload?.shop?.acceptedLanguage) {\n logMissingConfig('acceptedLanguage');\n return;\n }\n if (!payload?.shop?.currency) {\n logMissingConfig('currency');\n return;\n }\n if (!payload?.shop?.hydrogenSubchannelId) {\n logMissingConfig('hydrogenSubchannelId');\n return;\n }\n\n const eventPayload = {\n shopifySalesChannel: 'hydrogen',\n assetVersionId: version,\n ...payload.shop,\n hasUserConsent,\n ...getClientBrowserParameters(),\n analyticsAllowed: customerPrivacy.analyticsProcessingAllowed(),\n marketingAllowed: customerPrivacy.marketingAllowed(),\n saleOfDataAllowed: customerPrivacy.saleOfDataAllowed(),\n ccpaEnforced: !customerPrivacy.saleOfDataAllowed(),\n gdprEnforced: !(\n customerPrivacy.marketingAllowed() &&\n customerPrivacy.analyticsProcessingAllowed()\n ),\n } as ShopifyPageViewPayload;\n\n return eventPayload;\n}\n\nfunction prepareBaseCartPayload(\n payload: CartUpdatePayload,\n cart: CartReturn | null,\n): ShopifyAddToCartPayload | undefined {\n if (cart === null) return;\n\n const pageViewPayload = prepareBasePageViewPayload(payload);\n\n if (!pageViewPayload) return;\n\n const eventPayload: ShopifyAddToCartPayload = {\n ...(pageViewPayload as ShopifyAddToCartPayload),\n cartId: cart.id,\n };\n\n return eventPayload;\n}\n\n// Forwarding view specific event payloads to page view handler\nlet viewPayload = {};\n\nfunction pageViewHandler(payload: PageViewPayload) {\n const eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.PAGE_VIEW_2,\n payload: {\n ...eventPayload,\n ...viewPayload,\n },\n });\n viewPayload = {};\n}\n\nfunction productViewHandler(payload: ProductViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (\n eventPayload &&\n validateProducts({\n type: 'product',\n products: payload.products,\n })\n ) {\n const formattedProducts = formatProduct(payload.products);\n viewPayload = {\n pageType: AnalyticsPageType.product,\n resourceId: formattedProducts[0].productGid,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n products: formatProduct(payload.products),\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.PRODUCT_VIEW,\n payload: eventPayload,\n });\n }\n}\n\nfunction collectionViewHandler(payload: CollectionViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n viewPayload = {\n pageType: AnalyticsPageType.collection,\n resourceId: payload.collection.id,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n collectionHandle: payload.collection.handle,\n collectionId: payload.collection.id,\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.COLLECTION_VIEW,\n payload: eventPayload,\n });\n}\n\nfunction searchViewHandler(payload: SearchViewPayload) {\n let eventPayload = prepareBasePageViewPayload(payload);\n\n if (!eventPayload) return;\n\n viewPayload = {\n pageType: AnalyticsPageType.search,\n };\n eventPayload = {\n ...eventPayload,\n ...viewPayload,\n searchString: payload.searchTerm,\n };\n\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.SEARCH_VIEW,\n payload: eventPayload,\n });\n}\n\nfunction productAddedToCartHandler(payload: CartLineUpdatePayload) {\n const {cart, currentLine} = payload;\n const eventPayload = prepareBaseCartPayload(payload, cart);\n\n if (!eventPayload || !currentLine?.id) return;\n\n sendCartAnalytics({\n matchedLine: currentLine,\n eventPayload,\n });\n}\n\ntype AnalyticsProduct = {\n id: string;\n variantId: string;\n title: string;\n variantTitle: string;\n vendor: string;\n price: string;\n quantity: number;\n productType?: string;\n sku?: Maybe<string> | undefined;\n};\n\nfunction sendCartAnalytics({\n matchedLine,\n eventPayload,\n}: {\n matchedLine: CartLine | ComponentizableCartLine;\n eventPayload: ShopifyAddToCartPayload;\n}) {\n const product: AnalyticsProduct = {\n id: matchedLine.merchandise.product.id,\n variantId: matchedLine.merchandise.id,\n title: matchedLine.merchandise.product.title,\n variantTitle: matchedLine.merchandise.title,\n vendor: matchedLine.merchandise.product.vendor,\n price: matchedLine.merchandise.price.amount,\n quantity: matchedLine.quantity,\n productType: matchedLine.merchandise.product.productType,\n sku: matchedLine.merchandise.sku,\n };\n if (\n validateProducts({\n type: 'cart',\n products: [product],\n })\n ) {\n sendShopifyAnalytics({\n eventName: AnalyticsEventName.ADD_TO_CART,\n payload: {\n ...eventPayload,\n products: formatProduct([product]),\n },\n });\n }\n}\n\nfunction missingErrorMessage(\n type: 'cart' | 'product',\n fieldName: string,\n isVariantField: boolean,\n viewKeyName?: string,\n) {\n if (type === 'cart') {\n const name = `${\n isVariantField ? 'merchandise' : 'merchandise.product'\n }.${fieldName}`;\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Can't set up cart analytics events because the \\`cart.lines[].${name}\\` value is missing from your GraphQL cart query. In your project, search for where \\`fragment CartLine on CartLine\\` is defined and make sure \\`${name}\\` 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.`,\n );\n } else {\n const name = `${viewKeyName || fieldName}`;\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:ShopifyAnalytics] Can't set up product view analytics events because the \\`${name}\\` is missing from your \\`<Analytics.ProductView>\\`. Make sure \\`${name}\\` 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.`,\n );\n }\n}\n\n// Product expected field and types:\n// variant_id: int, optional\n// product_id: int, optional\n// product_gid: string,\n// name: string,\n// price: float,\n// sku: string, optional\n// brand: string,\n// variant: string,\n// category: string, optional\n// quantity: float\nfunction validateProducts({\n type,\n products,\n}: {\n type: 'cart' | 'product';\n products: Array<Record<string, unknown>>;\n}) {\n if (!products || products.length === 0) {\n missingErrorMessage(type, '', false, 'data.products');\n return false;\n }\n\n products.forEach((product) => {\n if (!product.id) {\n missingErrorMessage(type, 'id', false);\n return false;\n }\n if (!product.title) {\n missingErrorMessage(type, 'title', false);\n return false;\n }\n if (!product.price) {\n missingErrorMessage(type, 'price.amount', true, 'price');\n return false;\n }\n if (!product.vendor) {\n missingErrorMessage(type, 'vendor', false);\n return false;\n }\n if (!product.variantId) {\n missingErrorMessage(type, 'id', true, 'variantId');\n return false;\n }\n if (!product.variantTitle) {\n missingErrorMessage(type, 'title', true, 'variantTitle');\n return false;\n }\n });\n return true;\n}\n\nfunction formatProduct(products: Array<AnalyticsProduct>) {\n return products.map((product) => {\n const formattedProduct = {\n productGid: product.id,\n variantGid: product.variantId,\n name: product.title,\n variantName: product.variantTitle,\n brand: product.vendor,\n price: product.price,\n quantity: product.quantity || 1,\n category: product.productType,\n } as ShopifyAnalyticsProduct;\n\n if (product.sku) formattedProduct.sku = product.sku;\n if (product.productType) formattedProduct.category = product.productType;\n\n return formattedProduct;\n });\n}\n","import {useEffect, useRef} from 'react';\nimport {\n useAnalytics,\n type AnalyticsProviderProps,\n type Carts,\n} from './AnalyticsProvider';\nimport {type CartUpdatePayload} from './AnalyticsView';\nimport {flattenConnection} from '@shopify/hydrogen-react';\n\nfunction logMissingField(fieldName: string) {\n // eslint-disable-next-line no-console\n console.error(\n `[h2:error:CartAnalytics] Can't set up cart analytics events because the \\`cart.${fieldName}\\` value is missing from your GraphQL cart query. In your project, search for where \\`fragment CartApiQuery on Cart\\` is defined and make sure \\`${fieldName}\\` 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.`,\n );\n}\n\ntype CartStorage = {\n updatedAt: string;\n id: string;\n};\n\nexport function CartAnalytics({\n cart: currentCart,\n setCarts,\n}: {\n cart: AnalyticsProviderProps['cart'];\n setCarts: React.Dispatch<React.SetStateAction<Carts>>;\n}) {\n const {publish, shop, customData, canTrack, cart, prevCart} = useAnalytics();\n const lastEventId = useRef<string | null>(null);\n\n // resolve the cart that could have been deferred\n useEffect(() => {\n if (!currentCart) return;\n\n Promise.resolve(currentCart).then((updatedCart) => {\n if (updatedCart && updatedCart.lines) {\n if (!updatedCart.id) {\n logMissingField('id');\n return;\n }\n if (!updatedCart.updatedAt) {\n logMissingField('updatedAt');\n return;\n }\n }\n\n setCarts(({cart, prevCart}: Carts) => {\n return updatedCart?.updatedAt !== cart?.updatedAt\n ? {cart: updatedCart, prevCart: cart}\n : {cart, prevCart};\n });\n });\n return () => {};\n }, [setCarts, currentCart]);\n\n useEffect(() => {\n if (!cart || !cart?.updatedAt) return;\n if (cart?.updatedAt === prevCart?.updatedAt) return;\n\n let cartLastUpdatedAt: CartStorage | null;\n try {\n cartLastUpdatedAt = JSON.parse(\n localStorage.getItem('cartLastUpdatedAt') || '',\n );\n } catch (e) {\n cartLastUpdatedAt = null;\n }\n\n if (\n cart.id === cartLastUpdatedAt?.id &&\n cart.updatedAt === cartLastUpdatedAt?.updatedAt\n )\n return;\n\n const payload: CartUpdatePayload = {\n eventTimestamp: Date.now(),\n cart,\n prevCart,\n shop,\n customData,\n };\n\n // prevent duplicate events\n // TODO: add cart id check\n if (cart.updatedAt === lastEventId.current) return;\n lastEventId.current = cart.updatedAt;\n\n publish('cart_updated', payload);\n\n // We store the last cart update timestamp in localStorage to be able\n // to detect if the cart has been updated since the last page render\n // this prevents sending duplicate cart_updated events on first render\n localStorage.setItem(\n 'cartLastUpdatedAt',\n JSON.stringify({\n id: cart.id,\n updatedAt: cart.updatedAt,\n }),\n );\n\n const previousCartLines = prevCart?.lines\n ? flattenConnection(prevCart?.lines)\n : [];\n const currentCartLines = cart.lines ? flattenConnection(cart.lines) : [];\n\n // Detect quantity changes and missing cart lines\n previousCartLines?.forEach((prevLine) => {\n const matchedLineId = currentCartLines.filter(\n (line) => prevLine.id === line.id,\n );\n if (matchedLineId?.length === 1) {\n const matchedLine = matchedLineId[0];\n if (prevLine.quantity < matchedLine.quantity) {\n publish('product_added_to_cart', {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n } else if (prevLine.quantity > matchedLine.quantity) {\n publish('product_removed_from_cart', {\n ...payload,\n prevLine,\n currentLine: matchedLine,\n });\n }\n } else {\n publish('product_removed_from_cart', {\n ...payload,\n prevLine,\n });\n }\n });\n\n // Detect added to cart\n currentCartLines?.forEach((line) => {\n const matchedLineId = previousCartLines.filter(\n (previousLine) => line.id === previousLine.id,\n );\n if (!matchedLineId || matchedLineId.length === 0) {\n publish('product_added_to_cart', {\n ...payload,\n currentLine: line,\n });\n }\n });\n }, [cart, prevCart, publish, shop, customData, canTrack]);\n\n return null;\n}\n","import {parseGid, useLoadScript} from '@shopify/hydrogen-react';\nimport {ShopAnalytics, useAnalytics} from './AnalyticsProvider';\nimport {AnalyticsEvent} from './events';\nimport {useEffect, useRef} from 'react';\n\ndeclare global {\n interface Window {\n PerfKit: {\n navigate: () => void;\n setPageType: (pageType: string) => void;\n };\n }\n}\n\n// Pin to a version that have SPA support.\nconst PERF_KIT_URL =\n 'https://cdn.shopify.com/shopifycloud/perf-kit/shopify-perf-kit-spa.min.js';\n\nexport function PerfKit({shop}: {shop: ShopAnalytics}) {\n const loadedEvent = useRef(false);\n const {subscribe, register} = useAnalytics();\n const {ready} = register('Internal_Shopify_Perf_Kit');\n\n const scriptStatus = useLoadScript(PERF_KIT_URL, {\n attributes: {\n id: 'perfkit',\n 'data-application': 'hydrogen',\n 'data-shop-id': parseGid(shop.shopId).id.toString(),\n 'data-storefront-id': shop.hydrogenSubchannelId,\n 'data-monorail-region': 'global',\n 'data-spa-mode': 'true',\n 'data-resource-timing-sampling-rate': '100',\n },\n });\n\n useEffect(() => {\n if (scriptStatus !== 'done' || loadedEvent.current) return;\n loadedEvent.current = true;\n\n subscribe(AnalyticsEvent.PAGE_VIEWED, () => {\n window.PerfKit?.navigate();\n });\n subscribe(AnalyticsEvent.PRODUCT_VIEWED, () => {\n window.PerfKit?.setPageType('product');\n });\n subscribe(AnalyticsEvent.COLLECTION_VIEWED, () => {\n window.PerfKit?.setPageType('collection');\n });\n subscribe(AnalyticsEvent.SEARCH_VIEWED, () => {\n window.PerfKit?.setPageType('search');\n });\n subscribe(AnalyticsEvent.CART_VIEWED, () => {\n window.PerfKit?.setPageType('cart');\n });\n\n ready();\n }, [subscribe, ready, scriptStatus]);\n return null;\n}\n","const warnings = new Set<string>();\nexport const warnOnce = (string: string) => {\n if (!warnings.has(string)) {\n console.warn(string);\n warnings.add(string);\n }\n};\n\nconst errors = new Set<string>();\nexport const errorOnce = (string: string) => {\n if (!errors.has(string)) {\n console.error(new Error(string));\n errors.add(string);\n }\n};\n","import {\n type ReactNode,\n useEffect,\n useState,\n useMemo,\n createContext,\n useContext,\n} from 'react';\nimport {type CartReturn} from '../cart/queries/cart-types';\nimport {\n AnalyticsPageView,\n AnalyticsProductView,\n AnalyticsCollectionView,\n AnalyticsCartView,\n AnalyticsSearchView,\n AnalyticsCustomView,\n type PageViewPayload,\n type ProductViewPayload,\n type CollectionViewPayload,\n type CartViewPayload,\n type CartUpdatePayload,\n type CustomEventPayload,\n type OtherData,\n type EventPayloads,\n type CartLineUpdatePayload,\n type SearchViewPayload,\n} from './AnalyticsView';\nimport type {\n CurrencyCode,\n LanguageCode,\n Shop,\n Localization,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {AnalyticsEvent} from './events';\nimport {ShopifyAnalytics} from './ShopifyAnalytics';\nimport {CartAnalytics} from './CartAnalytics';\nimport {\n type PrivacyBanner,\n getCustomerPrivacy,\n getPrivacyBanner,\n type CustomerPrivacy,\n type CustomerPrivacyApiProps,\n} from '../customer-privacy/ShopifyCustomerPrivacy';\nimport type {Storefront} from '../storefront';\nimport {PerfKit} from './PerfKit';\nimport {errorOnce, warnOnce} from '../utils/warning';\n\nexport type ShopAnalytics = {\n /** The shop ID. */\n shopId: string;\n /** The language code that is being displayed to user. */\n acceptedLanguage: LanguageCode;\n /** The currency code that is being displayed to user. */\n currency: CurrencyCode;\n /** The Hydrogen subchannel ID generated by Oxygen in the environment variable. */\n hydrogenSubchannelId: string | '0';\n};\n\nexport type Consent = Partial<\n Pick<\n CustomerPrivacyApiProps,\n | 'checkoutDomain'\n | 'sameDomainForStorefrontApi'\n | 'storefrontAccessToken'\n | 'withPrivacyBanner'\n | 'country'\n >\n> & {language?: LanguageCode}; // the privacyBanner SDKs refers to \"language\" as \"locale\" :(\n\nexport type AnalyticsProviderProps = {\n /** React children to render. */\n children?: ReactNode;\n /** The cart or cart promise to track for cart analytics. When there is a difference between the state of the cart, `AnalyticsProvider` will trigger a `cart_updated` event. It will also produce `product_added_to_cart` and `product_removed_from_cart` based on cart line quantity and cart line id changes. */\n cart: Promise<CartReturn | null> | CartReturn | null;\n /** An optional function to set wether the user can be tracked. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack?: () => boolean;\n /** An optional custom payload to pass to all events. e.g language/locale/currency. */\n customData?: Record<string, unknown>;\n /** The shop configuration required to publish analytics events to Shopify. Use [`getShopAnalytics`](/docs/api/hydrogen/utilities/getshopanalytics). */\n shop: Promise<ShopAnalytics | null> | ShopAnalytics | null;\n /** The customer privacy consent configuration and options. */\n consent: Consent;\n /** @deprecated Disable throwing errors when required props are missing. */\n disableThrowOnError?: boolean;\n /** The domain scope of the cookie set with `useShopifyCookies`. **/\n cookieDomain?: string;\n};\n\nexport type Carts = {\n cart: Awaited<AnalyticsProviderProps['cart']>;\n prevCart: Awaited<AnalyticsProviderProps['cart']>;\n};\n\nexport type AnalyticsContextValue = {\n /** A function to tell you the current state of if the user can be tracked by analytics. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack: NonNullable<AnalyticsProviderProps['canTrack']>;\n /** The current cart state. */\n cart: Awaited<AnalyticsProviderProps['cart']>;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: AnalyticsProviderProps['customData'];\n /** The previous cart state. */\n prevCart: Awaited<AnalyticsProviderProps['cart']>;\n /** A function to publish an analytics event. */\n publish: typeof publish;\n /** A function to register with the analytics provider. */\n register: (key: string) => {ready: () => void};\n /** The shop configuration required to publish events to Shopify. */\n shop: Awaited<AnalyticsProviderProps['shop']>;\n /** A function to subscribe to analytics events. */\n subscribe: typeof subscribe;\n /** The privacy banner SDK methods with the config applied */\n privacyBanner: PrivacyBanner | null;\n /** The customer privacy SDK methods with the config applied */\n customerPrivacy: CustomerPrivacy | null;\n};\n\nexport const defaultAnalyticsContext: AnalyticsContextValue = {\n canTrack: () => false,\n cart: null,\n customData: {},\n prevCart: null,\n publish: () => {},\n shop: null,\n subscribe: () => {},\n register: () => ({ready: () => {}}),\n customerPrivacy: null,\n privacyBanner: null,\n};\n\nconst AnalyticsContext = createContext<AnalyticsContextValue>(\n defaultAnalyticsContext,\n);\n\nconst subscribers = new Map<\n string,\n Map<string, (payload: EventPayloads) => void>\n>();\nconst registers: Record<string, boolean> = {};\n\nfunction areRegistersReady() {\n return Object.values(registers).every(Boolean);\n}\n\n// Overload functions for each subscribe event\nfunction subscribe(\n event: typeof AnalyticsEvent.PAGE_VIEWED,\n callback: (payload: PageViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_VIEWED,\n callback: (payload: ProductViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.COLLECTION_VIEWED,\n callback: (payload: CollectionViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CART_VIEWED,\n callback: (payload: CartViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.SEARCH_VIEWED,\n callback: (payload: SearchViewPayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CART_UPDATED,\n callback: (payload: CartUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_ADD_TO_CART,\n callback: (payload: CartLineUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.PRODUCT_REMOVED_FROM_CART,\n callback: (payload: CartLineUpdatePayload) => void,\n): void;\n\nfunction subscribe(\n event: typeof AnalyticsEvent.CUSTOM_EVENT,\n callback: (payload: CustomEventPayload) => void,\n): void;\n\nfunction subscribe(event: any, callback: any) {\n if (!subscribers.has(event)) {\n subscribers.set(event, new Map());\n }\n subscribers.get(event)?.set(callback.toString(), callback);\n}\n\nconst waitForReadyQueue = new Map<any, any>();\n\nfunction publish(\n event: typeof AnalyticsEvent.PAGE_VIEWED,\n payload: PageViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_VIEWED,\n payload: ProductViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.COLLECTION_VIEWED,\n payload: CollectionViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CART_VIEWED,\n payload: CartViewPayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CART_UPDATED,\n payload: CartUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_ADD_TO_CART,\n payload: CartLineUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.PRODUCT_REMOVED_FROM_CART,\n payload: CartLineUpdatePayload,\n): void;\nfunction publish(\n event: typeof AnalyticsEvent.CUSTOM_EVENT,\n payload: OtherData,\n): void;\nfunction publish(event: any, payload: any): void {\n if (!areRegistersReady()) {\n waitForReadyQueue.set(event, payload);\n return;\n }\n\n publishEvent(event, payload);\n}\n\nfunction publishEvent(event: any, payload: any): void {\n (subscribers.get(event) ?? new Map()).forEach((callback, subscriber) => {\n try {\n callback(payload);\n } catch (error) {\n if (typeof error === 'object' && error instanceof Error) {\n console.error(\n 'Analytics publish error',\n error.message,\n subscriber,\n error.stack,\n );\n } else {\n console.error('Analytics publish error', error, subscriber);\n }\n }\n });\n}\n\nfunction register(key: string) {\n if (!registers.hasOwnProperty(key)) {\n registers[key] = false;\n }\n\n return {\n ready: () => {\n registers[key] = true;\n\n if (areRegistersReady() && waitForReadyQueue.size > 0) {\n waitForReadyQueue.forEach((queuePayload, queueEvent) => {\n publishEvent(queueEvent, queuePayload);\n });\n waitForReadyQueue.clear();\n }\n },\n };\n}\n\n/**\n * This functions attempts to automatically determine if the user can be tracked if the\n * customer privacy API is available. If not, it will default to false.\n */\nfunction shopifyCanTrack(): boolean {\n try {\n return window.Shopify.customerPrivacy.analyticsProcessingAllowed();\n } catch (e) {}\n return false;\n}\n\nfunction messageOnError(field: string, envVar: string) {\n return `[h2:error:Analytics.Provider] - ${field} is required. Make sure ${envVar} is defined in your environment variables. See https://h2o.fyi/analytics/consent to learn how to setup environment variables in the Shopify admin.`;\n}\n\nfunction AnalyticsProvider({\n canTrack: customCanTrack,\n cart: currentCart,\n children,\n consent,\n customData = {},\n shop: shopProp = null,\n cookieDomain,\n}: AnalyticsProviderProps): JSX.Element {\n const {shop} = useShopAnalytics(shopProp);\n const [analyticsLoaded, setAnalyticsLoaded] = useState(\n customCanTrack ? true : false,\n );\n const [consentCollected, setConsentCollected] = useState(false);\n const [carts, setCarts] = useState<Carts>({cart: null, prevCart: null});\n const [canTrack, setCanTrack] = useState<() => boolean>(\n customCanTrack ? () => customCanTrack : () => shopifyCanTrack,\n );\n\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!shop) {\n // If mock shop is used, log error instead of throwing\n if (/\\/68817551382$/.test(shop.shopId)) {\n warnOnce(\n '[h2:error:Analytics.Provider] - Mock shop is used. Analytics will not work properly.',\n );\n } else {\n // TODO: we likely don't need checkout domain if SFAPI proxy is enabled\n // but keep it for backward compatibility for now until we have checkout URL params.\n if (!consent.checkoutDomain) {\n const errorMsg = messageOnError(\n 'consent.checkoutDomain',\n 'PUBLIC_CHECKOUT_DOMAIN',\n );\n errorOnce(errorMsg);\n }\n\n if (!consent.storefrontAccessToken) {\n const errorMsg = messageOnError(\n 'consent.storefrontAccessToken',\n 'PUBLIC_STOREFRONT_API_TOKEN',\n );\n errorOnce(errorMsg);\n }\n\n if (!consent?.country) {\n consent.country = 'US';\n }\n\n if (!consent?.language) {\n consent.language = 'EN';\n }\n\n if (consent.withPrivacyBanner === undefined) {\n consent.withPrivacyBanner = false;\n }\n }\n }\n\n const value = useMemo<AnalyticsContextValue>(() => {\n return {\n canTrack,\n ...carts,\n customData,\n publish: canTrack() ? publish : () => {},\n shop,\n subscribe,\n register,\n customerPrivacy: getCustomerPrivacy(),\n privacyBanner: getPrivacyBanner(),\n };\n }, [\n analyticsLoaded,\n canTrack,\n carts,\n carts.cart?.updatedAt,\n carts.prevCart,\n publish,\n subscribe,\n customData,\n shop,\n register,\n JSON.stringify(registers),\n getCustomerPrivacy,\n getPrivacyBanner,\n ]);\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n {!!shop && <AnalyticsPageView />}\n {!!shop && !!currentCart && (\n <CartAnalytics cart={currentCart} setCarts={setCarts} />\n )}\n {!!shop && (\n <ShopifyAnalytics\n consent={consent}\n onReady={() => {\n setAnalyticsLoaded(true);\n setCanTrack(\n customCanTrack ? () => customCanTrack : () => shopifyCanTrack,\n );\n\n // Delay loading PerfKit until consent is collected\n // so that it reads updated tracking values from old cookies.\n setConsentCollected(true);\n }}\n domain={cookieDomain}\n />\n )}\n {!!shop && consentCollected && <PerfKit shop={shop} />}\n </AnalyticsContext.Provider>\n );\n}\n\nexport function useAnalytics(): AnalyticsContextValue {\n const analyticsContext = useContext(AnalyticsContext);\n if (!analyticsContext) {\n throw new Error(\n `[h2:error:useAnalytics] 'useAnalytics()' must be a descendent of <AnalyticsProvider/>`,\n );\n }\n return analyticsContext;\n}\n\n/**\n * A hook that resolves the shop analytics that could have been deferred\n * and returns the shop analytics.\n */\nfunction useShopAnalytics(shopProp: AnalyticsProviderProps['shop']): {\n shop: ShopAnalytics | null;\n} {\n const [shop, setShop] =\n useState<Awaited<AnalyticsProviderProps['shop']>>(null);\n\n // resolve the shop analytics that could have been deferred\n useEffect(() => {\n Promise.resolve(shopProp).then(setShop);\n return () => {};\n }, [setShop, shopProp]);\n\n return {shop};\n}\n\ntype ShopAnalyticsProps = {\n /**\n * The storefront client instance created by [`createStorefrontClient`](docs/api/hydrogen/utilities/createstorefrontclient).\n */\n storefront: Storefront;\n /**\n * The `PUBLIC_STOREFRONT_ID` generated by Oxygen in the environment variable.\n */\n publicStorefrontId: string;\n};\n\nexport async function getShopAnalytics({\n storefront,\n publicStorefrontId = '0',\n}: ShopAnalyticsProps): Promise<ShopAnalytics | null> {\n return storefront\n .query(SHOP_QUERY, {\n cache: storefront.CacheLong(),\n })\n .then(({shop, localization}: {shop: Shop; localization: Localization}) => {\n return {\n shopId: shop.id,\n acceptedLanguage: localization.language.isoCode,\n currency: localization.country.currency.isoCode,\n hydrogenSubchannelId: publicStorefrontId,\n };\n });\n}\n\nconst SHOP_QUERY = `#graphql\n query ShopData(\n $country: CountryCode\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n shop {\n id\n }\n localization {\n country {\n currency {\n isoCode\n }\n }\n language {\n isoCode\n }\n }\n }\n` as const;\n\nexport const Analytics = {\n CartView: AnalyticsCartView,\n CollectionView: AnalyticsCollectionView,\n CustomView: AnalyticsCustomView,\n ProductView: AnalyticsProductView,\n Provider: AnalyticsProvider,\n SearchView: AnalyticsSearchView,\n};\n\ntype DefaultCart = Promise<CartReturn | null> | CartReturn | null;\n\nexport type AnalyticsContextValueForDoc<UserCart> = {\n /** A function to tell you the current state of if the user can be tracked by analytics. Defaults to Customer Privacy API's `window.Shopify.customerPrivacy.analyticsProcessingAllowed()`. */\n canTrack?: () => boolean;\n /** The current cart state. You can overwrite the type by passing a generic */\n cart?: UserCart | DefaultCart;\n /** The custom data passed in from the `AnalyticsProvider`. */\n customData?: Record<string, unknown>;\n /** The previous cart state. You can overwrite the type by passing a generic */\n prevCart?: UserCart | DefaultCart;\n /** A function to publish an analytics event. */\n publish?: AnalyticsContextPublishForDoc;\n /** A function to register with the analytics provider. It holds the first browser load events until all registered key has executed the supplied `ready` function. [See example register usage](/docs/api/hydrogen/hooks/useanalytics#example-useanalytics.register). */\n register?: (key: string) => {ready: () => void};\n /** The shop configuration required to publish events to Shopify. */\n shop?: Promise<ShopAnalytics | null> | ShopAnalytics | null;\n /** A function to subscribe to analytics events. */\n subscribe?: AnalyticsContextSubscribeForDoc;\n};\n\ntype PublishPageView = (event: 'page_viewed', payload: PageViewPayload) => void;\ntype PublishProductView = (\n event: 'product_viewed',\n payload: ProductViewPayload,\n) => void;\ntype PublishCollectionView = (\n event: 'collection_viewed',\n payload: CollectionViewPayload,\n) => void;\ntype PublishCartView = (event: 'cart_viewed', payload: CartViewPayload) => void;\ntype PublishSearchView = (\n event: 'search_viewed',\n payload: SearchViewPayload,\n) => void;\ntype PublishCartUpdated = (\n event: 'cart_updated',\n payload: CartUpdatePayload,\n) => void;\ntype PublishProductAddedToCart = (\n event: 'product_added_to_cart',\n payload: CartLineUpdatePayload,\n) => void;\ntype PublishProductRemovedFromCart = (\n event: 'product_removed_from_cart',\n payload: CartLineUpdatePayload,\n) => void;\ntype PublishCustomEvent = (\n event: `custom_${string}`,\n payload: OtherData,\n) => void;\n\nexport type AnalyticsContextPublishForDoc =\n | PublishPageView\n | PublishProductView\n | PublishCollectionView\n | PublishCartView\n | PublishSearchView\n | PublishCartUpdated\n | PublishProductAddedToCart\n | PublishProductRemovedFromCart\n | PublishCustomEvent;\n\ntype SubscribePageView = (\n event: 'page_viewed',\n callback: (payload: PageViewPayload) => void,\n) => void;\ntype SubscribeProductView = (\n event: 'product_viewed',\n callback: (payload: ProductViewPayload) => void,\n) => void;\ntype SubscribeCollectionView = (\n event: 'collection_viewed',\n callback: (payload: CollectionViewPayload) => void,\n) => void;\ntype SubscribeCartView = (\n event: 'cart_viewed',\n callback: (payload: CartViewPayload) => void,\n) => void;\ntype SubscribeSearchView = (\n event: 'search_viewed',\n callback: (payload: SearchViewPayload) => void,\n) => void;\ntype SubscribeCartUpdated = (\n event: 'cart_updated',\n callback: (payload: CartUpdatePayload) => void,\n) => void;\ntype SubscribeProductAddedToCart = (\n event: 'product_added_to_cart',\n callback: (payload: CartLineUpdatePayload) => void,\n) => void;\ntype SubscribeProductRemovedFromCart = (\n event: 'product_removed_from_cart',\n callback: (payload: CartLineUpdatePayload) => void,\n) => void;\ntype SubscribeCustomEvent = (\n event: `custom_${string}`,\n callback: (payload: OtherData) => void,\n) => void;\n\nexport type AnalyticsContextSubscribeForDoc =\n | SubscribePageView\n | SubscribeProductView\n | SubscribeCollectionView\n | SubscribeCartView\n | SubscribeSearchView\n | SubscribeCartUpdated\n | SubscribeProductAddedToCart\n | SubscribeProductRemovedFromCart\n | SubscribeCustomEvent;\n","import {SHOPIFY_CLIENT_IP_SIG_HEADER} from '../constants';\nimport type {StorefrontHeaders} from '../types';\n\nexport type CrossRuntimeRequest = {\n url?: string;\n method?: string;\n headers: {\n get?: (key: string) => string | null | undefined;\n [key: string]: any;\n };\n};\n\nexport function getHeader(request: CrossRuntimeRequest, key: string) {\n return getHeaderValue(request.headers, key);\n}\n\nexport function getHeaderValue(\n headers: CrossRuntimeRequest['headers'],\n key: string,\n) {\n const value = headers?.get?.(key) ?? headers?.[key];\n return typeof value === 'string' ? value : null;\n}\n\nexport function getDebugHeaders(request?: CrossRuntimeRequest) {\n return {\n requestId: request ? getHeader(request, 'request-id') : undefined,\n purpose: request ? getHeader(request, 'purpose') : undefined,\n };\n}\n\n/**\n * Extracts relevant Storefront headers from the given Oxygen request.\n */\nexport function getStorefrontHeaders(\n request: CrossRuntimeRequest,\n): StorefrontHeaders {\n return {\n requestGroupId: getHeader(request, 'request-id'),\n buyerIp: getHeader(request, 'oxygen-buyer-ip'),\n buyerIpSig: getHeader(request, SHOPIFY_CLIENT_IP_SIG_HEADER),\n cookie: getHeader(request, 'cookie'),\n // sec-purpose is added by browsers automatically when using link/prefetch or Speculation Rules\n purpose: getHeader(request, 'sec-purpose') || getHeader(request, 'purpose'),\n };\n}\n\n/** Regular expression to match Storefront API GraphQL endpoint paths */\nexport const SFAPI_RE = /^\\/api\\/(unstable|2\\d{3}-\\d{2})\\/graphql\\.json$/;\n\nexport const getSafePathname = (url: string) => {\n try {\n return new URL(url, 'http://e.c').pathname;\n } catch {\n return '/';\n }\n};\n\nexport function extractHeaders(\n extract: (key: string) => string | undefined | null,\n keys: string[],\n) {\n return keys.reduce<[string, string][]>((acc, key) => {\n const forwardedValue = extract(key);\n if (forwardedValue) acc.push([key, forwardedValue]);\n return acc;\n }, []);\n}\n","/**\n * Ensures that the error of an async rejected promise\n * contains the entire synchronous stack trace.\n */\nexport function withSyncStack<T>(\n promise: Promise<T>,\n options: {\n stackOffset?: number;\n logErrors?: boolean | ((error?: Error) => boolean);\n } = {},\n): Promise<T> {\n const syncError = new Error();\n const getSyncStack = (message: string, name = 'Error') => {\n // Remove error message, caller function and current function from the stack.\n const syncStack = (syncError.stack ?? '')\n .split('\\n')\n .slice(3 + (options.stackOffset ?? 0))\n .join('\\n')\n // Sometimes stack traces show loaders with a number suffix due to ESBuild.\n .replace(/ at loader(\\d+) \\(/, (all, m1) => all.replace(m1, ''));\n\n return `${name}: ${message}\\n` + syncStack;\n };\n\n return promise\n .then((result: any) => {\n if (result?.errors && Array.isArray(result.errors)) {\n const logErrors =\n typeof options.logErrors === 'function'\n ? options.logErrors\n : () => options.logErrors ?? false;\n\n result.errors.forEach((error: Error) => {\n if (error) {\n error.stack = getSyncStack(error.message, error.name);\n if (logErrors(error)) console.error(error);\n }\n });\n }\n\n return result;\n })\n .catch((error: Error) => {\n if (error) error.stack = getSyncStack(error.message, error.name);\n throw error;\n });\n}\n\nexport type StackInfo = {\n file?: string;\n func?: string;\n line?: number;\n column?: number;\n};\n\n/**\n * Finds the stack line of a caller function without using sourcemaps.\n * @param {number} stackOffset - The number of stack frames to skip.\n * @returns {StackInfo | undefined}\n */\nexport const getCallerStackLine =\n process.env.NODE_ENV === 'development'\n ? (stackOffset = 0) => {\n let stackInfo: StackInfo | undefined = undefined;\n const original = Error.prepareStackTrace;\n\n // Accessing sourcemaps slows down execution time significantly.\n // Overwrite the prepareStackTrace function to avoid accessing\n // sourcemaps and just store what we need.\n Error.prepareStackTrace = (_, callsites) => {\n // The first callsite is `getCallerStackLine` itself.\n // The second one is the immediate caller function (e.g. `withCache`).\n // Skip both and find the first ancestor.\n const cs = callsites[2 + stackOffset];\n\n stackInfo = cs && {\n file: cs.getFileName() ?? undefined,\n func: cs.getFunctionName() ?? undefined,\n line: cs.getLineNumber() ?? undefined,\n column: cs.getColumnNumber() ?? undefined,\n };\n\n return '';\n };\n\n // Create and access stack to run the previous function\n const err = {stack: ''};\n Error.captureStackTrace(err);\n err.stack;\n\n Error.prepareStackTrace = original;\n\n return stackInfo as StackInfo | undefined;\n }\n : undefined;\n","/**\n * Override options for a cache strategy.\n */\nexport interface AllCacheOptions {\n /**\n * The caching mode, generally `public`, `private`, or `no-store`.\n */\n mode?: string;\n /**\n * The maximum amount of time in seconds that a resource will be considered fresh. See `max-age` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#:~:text=Response%20Directives-,max%2Dage,-The%20max%2Dage).\n */\n maxAge?: number;\n /**\n * Indicate that the cache should serve the stale response in the background while revalidating the cache. See `stale-while-revalidate` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-while-revalidate).\n */\n staleWhileRevalidate?: number;\n /**\n * Similar to `maxAge` but specific to shared caches. See `s-maxage` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#s-maxage).\n */\n sMaxAge?: number;\n /**\n * Indicate that the cache should serve the stale response if an error occurs while revalidating the cache. See `stale-if-error` in the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#stale-if-error).\n */\n staleIfError?: number;\n}\n\n/**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data. Or use one of the pre-defined caching strategies: CacheNone, CacheShort, CacheLong.\n */\nexport type CachingStrategy = AllCacheOptions;\n\nexport type NoStoreStrategy = {\n mode: string;\n};\n\nconst PUBLIC = 'public';\nconst PRIVATE = 'private';\nexport const NO_STORE = 'no-store';\n\nconst optionMapping: {\n [key: string]: string;\n} = {\n maxAge: 'max-age',\n staleWhileRevalidate: 'stale-while-revalidate',\n sMaxAge: 's-maxage',\n staleIfError: 'stale-if-error',\n};\n\nexport function generateCacheControlHeader(\n cacheOptions: CachingStrategy,\n): string {\n const cacheControl: string[] = [];\n Object.keys(cacheOptions).forEach((key: string) => {\n if (key === 'mode') {\n cacheControl.push(cacheOptions[key] as string);\n } else if (optionMapping[key]) {\n cacheControl.push(\n `${optionMapping[key]}=${cacheOptions[key as keyof CachingStrategy]}`,\n );\n }\n });\n return cacheControl.join(', ');\n}\n\n/**\n *\n * @public\n */\nexport function CacheNone(): NoStoreStrategy {\n return {\n mode: NO_STORE,\n };\n}\n\nfunction guardExpirableModeType(overrideOptions?: CachingStrategy) {\n if (\n overrideOptions?.mode &&\n overrideOptions?.mode !== PUBLIC &&\n overrideOptions?.mode !== PRIVATE\n ) {\n throw Error(\"'mode' must be either 'public' or 'private'\");\n }\n}\n\n/**\n *\n * @public\n */\nexport function CacheShort(overrideOptions?: CachingStrategy): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 1,\n staleWhileRevalidate: 9,\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @public\n */\nexport function CacheLong(overrideOptions?: CachingStrategy): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 3600, // 1 hour\n staleWhileRevalidate: 82800, // 23 Hours\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @private\n */\nexport function CacheDefault(\n overrideOptions?: CachingStrategy,\n): AllCacheOptions {\n guardExpirableModeType(overrideOptions);\n return {\n mode: PUBLIC,\n maxAge: 1,\n staleWhileRevalidate: 86399, // 1 second less than 24 hours\n ...overrideOptions,\n };\n}\n\n/**\n *\n * @public\n */\nexport function CacheCustom(overrideOptions: CachingStrategy): AllCacheOptions {\n return overrideOptions as AllCacheOptions;\n}\n","export function parseJSON(json: any) {\n if (String(json).includes('__proto__')) return JSON.parse(json, noproto);\n return JSON.parse(json);\n}\nfunction noproto(k: string, v: string) {\n if (k !== '__proto__') return v;\n}\n","import type {CachingStrategy} from './strategies';\nimport {CacheDefault, generateCacheControlHeader} from './strategies';\n\nfunction logCacheApiStatus(\n status: string | null,\n request: Request,\n response?: Response,\n) {\n // const url = request.url;\n // if (!/Product\\(/.test(url)) return;\n // // eslint-disable-next-line no-console\n // console.log(status, 'cacheKey', url.substring(0, 50));\n // if (response) {\n // let headersJson: Record<string, string> = {};\n // response.headers.forEach((value, key) => {\n // headersJson[key] = value;\n // });\n // const responseDate = response.headers.get('cache-put-date');\n // if (responseDate) {\n // const [age] = calculateAge(response, responseDate);\n // headersJson['age'] = age.toString();\n // }\n // // eslint-disable-next-line no-console\n // console.log(`${status} response headers: `, headersJson);\n // }\n}\n\nfunction getCacheControlSetting(\n userCacheOptions?: CachingStrategy,\n options?: CachingStrategy,\n): CachingStrategy {\n if (userCacheOptions && options) {\n return {\n ...userCacheOptions,\n ...options,\n };\n } else {\n return userCacheOptions || CacheDefault();\n }\n}\n\nfunction generateDefaultCacheControlHeader(\n userCacheOptions?: CachingStrategy,\n): string {\n return generateCacheControlHeader(getCacheControlSetting(userCacheOptions));\n}\n\n/**\n * Get an item from the cache. If a match is found, returns a tuple\n * containing the `JSON.parse` version of the response as well\n * as the response itself so it can be checked for staleness.\n */\nasync function getItem(\n cache: Cache,\n request: Request,\n): Promise<Response | undefined> {\n if (!cache) return;\n\n const response = await cache.match(request);\n if (!response) {\n logCacheApiStatus('MISS', request);\n return;\n }\n\n logCacheApiStatus('HIT', request, response);\n\n return response;\n}\n\n/**\n * Put an item into the cache.\n */\nasync function setItem(\n cache: Cache,\n request: Request,\n response: Response,\n userCacheOptions: CachingStrategy,\n) {\n if (!cache) return;\n\n /**\n * We are manually managing staled request by adding this workaround.\n * Why? cache control header support is dependent on hosting platform\n *\n * For example:\n *\n * Cloudflare's Cache API does not support `stale-while-revalidate`.\n * Cloudflare cache control header has a very odd behaviour.\n * Say we have the following cache control header on a request:\n *\n * public, max-age=15, stale-while-revalidate=30\n *\n * When there is a cache.match HIT, the cache control header would become\n *\n * public, max-age=14400, stale-while-revalidate=30\n *\n * == `stale-while-revalidate` workaround ==\n * Update response max-age so that:\n *\n * max-age = max-age + stale-while-revalidate\n *\n * For example:\n *\n * public, max-age=1, stale-while-revalidate=9\n * |\n * V\n * public, max-age=10, stale-while-revalidate=9\n *\n * Store the following information in the response header:\n *\n * cache-put-date - Timestamp string of when this request is PUT into cache\n *\n * `isStale` function will use the above information to test for stale-ness of a cached response\n */\n\n const cacheControl = getCacheControlSetting(userCacheOptions);\n\n // The padded cache-control to mimic stale-while-revalidate\n const paddedCacheControlString = generateDefaultCacheControlHeader(\n getCacheControlSetting(cacheControl, {\n maxAge:\n (cacheControl.maxAge || 0) + (cacheControl.staleWhileRevalidate || 0),\n }),\n );\n // The cache-control we want to set on response\n const cacheControlString = generateDefaultCacheControlHeader(\n getCacheControlSetting(cacheControl),\n );\n\n // CF will override cache-control, so we need to keep a non-modified real-cache-control\n // cache-control is still necessary for mini-oxygen\n response.headers.set('cache-control', paddedCacheControlString);\n response.headers.set('real-cache-control', cacheControlString);\n response.headers.set('cache-put-date', String(Date.now()));\n\n logCacheApiStatus('PUT', request, response);\n await cache.put(request, response);\n}\n\nasync function deleteItem(cache: Cache, request: Request) {\n if (!cache) return;\n\n logCacheApiStatus('DELETE', request);\n await cache.delete(request);\n}\n\nfunction calculateAge(response: Response, responseDate: string) {\n const cacheControl = response.headers.get('real-cache-control');\n let responseMaxAge = 0;\n\n if (cacheControl) {\n const maxAgeMatch = cacheControl.match(/max-age=(\\d*)/);\n if (maxAgeMatch && maxAgeMatch.length > 1) {\n responseMaxAge = parseFloat(maxAgeMatch[1]);\n }\n }\n\n const ageInMs = Date.now() - Number(responseDate as string);\n return [ageInMs / 1000, responseMaxAge];\n}\n\n/**\n * Manually check the response to see if it's stale.\n */\nfunction isStale(request: Request, response: Response) {\n const responseDate = response.headers.get('cache-put-date');\n\n if (!responseDate) {\n return false;\n }\n\n const [age, responseMaxAge] = calculateAge(response, responseDate);\n const result = age > responseMaxAge;\n\n if (result) {\n logCacheApiStatus('STALE', request, response);\n }\n\n return result;\n}\n\n/**\n *\n * @private\n */\nexport const CacheAPI = {\n get: getItem,\n set: setItem,\n delete: deleteItem,\n generateDefaultCacheControlHeader,\n isStale,\n};\n","import {parseJSON} from '../utils/parse-json';\nimport {CacheAPI} from './api';\nimport {\n CacheDefault,\n type CachingStrategy,\n type AllCacheOptions,\n} from './strategies.js';\n\n/**\n * Wrapper Cache functions for sub queries\n */\n\n/**\n * Cache API is weird. We just need a full URL, so we make one up.\n */\nexport function getKeyUrl(key: string) {\n return `https://shopify.dev/?${key}`;\n}\n\nfunction getCacheOption(userCacheOptions?: CachingStrategy): AllCacheOptions {\n return userCacheOptions || CacheDefault();\n}\n\nexport function generateSubRequestCacheControlHeader(\n userCacheOptions?: CachingStrategy,\n): string {\n return CacheAPI.generateDefaultCacheControlHeader(\n getCacheOption(userCacheOptions),\n );\n}\n\n/**\n * Get an item from the cache. If a match is found, returns a tuple\n * containing the `JSON.parse` version of the response as well\n * as the response itself so it can be checked for staleness.\n * @private\n */\nexport async function getItemFromCache<T = any>(\n cache: Cache,\n key: string,\n): Promise<undefined | [T | string, Response]> {\n if (!cache) return;\n const url = getKeyUrl(key);\n const request = new Request(url);\n\n const response = await CacheAPI.get(cache, request);\n\n if (!response) {\n return;\n }\n\n const text = await response.text();\n try {\n return [parseJSON(text), response];\n } catch {\n return [text, response];\n }\n}\n\n/**\n * Put an item into the cache.\n * @private\n */\nexport async function setItemInCache(\n cache: Cache,\n key: string,\n value: any,\n userCacheOptions?: CachingStrategy,\n) {\n if (!cache) return;\n\n const url = getKeyUrl(key);\n const request = new Request(url);\n const response = new Response(JSON.stringify(value));\n\n await CacheAPI.set(\n cache,\n request,\n response,\n getCacheOption(userCacheOptions),\n );\n}\n\n/**\n *\n * @private\n */\nexport async function deleteItemFromCache(cache: Cache, key: string) {\n if (!cache) return;\n\n const url = getKeyUrl(key);\n const request = new Request(url);\n\n await CacheAPI.delete(cache, request);\n}\n\n/**\n * Manually check the response to see if it's stale.\n * @private\n */\nexport function isStale(key: string, response: Response) {\n return CacheAPI.isStale(new Request(getKeyUrl(key)), response);\n}\n","type QueryKey = string | readonly unknown[];\n\nexport function hashKey(queryKey: QueryKey): string {\n const rawKeys = Array.isArray(queryKey) ? queryKey : [queryKey];\n let hash = '';\n\n // Keys could be in the following shape:\n //\n // From `storefront.query`:\n // ['api-endpoint', 'method', 'headers', 'query']\n //\n // From `createWithCache`:\n // ['string', {}, 1, []]\n for (const key of rawKeys) {\n if (key != null) {\n if (typeof key === 'object') {\n hash += JSON.stringify(key);\n } else {\n hash += key.toString();\n }\n }\n }\n\n return encodeURIComponent(hash);\n}\n","import {\n NO_STORE,\n CacheShort,\n generateCacheControlHeader,\n type CachingStrategy,\n} from './strategies';\nimport {\n getItemFromCache,\n getKeyUrl,\n isStale,\n setItemInCache,\n} from './sub-request';\nimport {type StackInfo} from '../utils/callsites';\nimport {hashKey} from '../utils/hash';\nimport type {WaitUntil} from '../types';\n\n/**\n * The cache key is used to uniquely identify a value in the cache.\n */\nexport type CacheKey = string | readonly unknown[];\n\nexport type DebugOptions = {\n url?: string;\n requestId?: string | null;\n graphql?: string | null;\n purpose?: string | null;\n stackInfo?: StackInfo;\n displayName?: string;\n};\n\ntype CachedDebugInfo = {\n displayName?: string;\n url?: string;\n responseInit?: {\n status: number;\n statusText: string;\n headers?: [string, string][];\n };\n};\n\nexport type AddDebugDataParam = {\n displayName?: string;\n response?: Pick<Response, 'url' | 'status' | 'statusText' | 'headers'>;\n};\n\nexport type CacheActionFunctionParam = {\n addDebugData: (info: AddDebugDataParam) => void;\n};\n\ntype WithCacheOptions<T = unknown> = {\n strategy?: CachingStrategy | null;\n cacheInstance?: Cache;\n shouldCacheResult: (value: T) => boolean;\n waitUntil?: WaitUntil;\n debugInfo?: DebugOptions;\n};\n\n// Lock to prevent revalidating the same sub-request\n// in the same isolate. Note that different isolates\n// in the same colo could duplicate the revalidation\n// since this is only an in-memory lock.\n// https://github.com/Shopify/oxygen-platform/issues/625\nconst swrLock = new Set<string>();\n\n/**\n * Implementation of withCache.\n * @private\n */\nexport async function runWithCache<T = unknown>(\n cacheKey: CacheKey,\n actionFn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n {\n strategy = CacheShort(),\n cacheInstance,\n shouldCacheResult = () => true,\n waitUntil,\n debugInfo,\n }: WithCacheOptions<T>,\n): Promise<T> {\n const startTime = Date.now();\n const key = hashKey([\n // '__HYDROGEN_CACHE_ID__', // TODO purgeQueryCacheOnBuild\n ...(typeof cacheKey === 'string' ? [cacheKey] : cacheKey),\n ]);\n\n let cachedDebugInfo: CachedDebugInfo | undefined;\n let userDebugInfo: CachedDebugInfo | undefined;\n\n const addDebugData = (info: AddDebugDataParam) => {\n userDebugInfo = {\n displayName: info.displayName,\n url: info.response?.url,\n responseInit: {\n status: info.response?.status || 0,\n statusText: info.response?.statusText || '',\n headers: Array.from(info.response?.headers.entries() || []),\n },\n };\n };\n\n const mergeDebugInfo = () => ({\n ...cachedDebugInfo,\n ...debugInfo,\n url:\n userDebugInfo?.url ||\n debugInfo?.url ||\n cachedDebugInfo?.url ||\n getKeyUrl(key),\n displayName:\n debugInfo?.displayName ||\n userDebugInfo?.displayName ||\n cachedDebugInfo?.displayName,\n });\n\n const logSubRequestEvent =\n process.env.NODE_ENV === 'development'\n ? ({\n result,\n cacheStatus,\n overrideStartTime,\n }: {\n result?: any;\n cacheStatus?: 'MISS' | 'HIT' | 'STALE' | 'PUT';\n overrideStartTime?: number;\n }) => {\n globalThis.__H2O_LOG_EVENT?.({\n ...mergeDebugInfo(),\n eventType: 'subrequest',\n startTime: overrideStartTime || startTime,\n endTime: Date.now(),\n cacheStatus,\n responsePayload: (result && result[0]) || result,\n responseInit: (result && result[1]) || userDebugInfo?.responseInit,\n cache: {\n status: cacheStatus,\n strategy: generateCacheControlHeader(strategy || {}),\n key,\n },\n waitUntil,\n });\n }\n : undefined;\n\n if (!cacheInstance || !strategy || strategy.mode === NO_STORE) {\n const result = await actionFn({addDebugData});\n // Log non-cached requests\n logSubRequestEvent?.({result});\n return result;\n }\n\n type CachedItem = {\n value: Awaited<T>;\n debugInfo?: CachedDebugInfo;\n };\n\n const storeInCache = (value: CachedItem['value']) =>\n setItemInCache(\n cacheInstance,\n key,\n {\n value,\n debugInfo:\n process.env.NODE_ENV === 'development' ? mergeDebugInfo() : undefined,\n } satisfies CachedItem,\n strategy,\n );\n\n const cachedItem = await getItemFromCache<CachedItem>(cacheInstance, key);\n // console.log('--- Cache', cachedItem ? 'HIT' : 'MISS');\n\n if (cachedItem && typeof cachedItem[0] !== 'string') {\n const [{value: cachedResult, debugInfo}, cacheInfo] = cachedItem;\n cachedDebugInfo = debugInfo;\n\n const cacheStatus = isStale(key, cacheInfo) ? 'STALE' : 'HIT';\n\n if (!swrLock.has(key) && cacheStatus === 'STALE') {\n swrLock.add(key);\n\n // Important: Run revalidation asynchronously.\n const revalidatingPromise = Promise.resolve().then(async () => {\n const revalidateStartTime = Date.now();\n try {\n const result = await actionFn({addDebugData});\n\n if (shouldCacheResult(result)) {\n await storeInCache(result);\n\n // Log PUT requests with the revalidate start time\n logSubRequestEvent?.({\n result,\n cacheStatus: 'PUT',\n overrideStartTime: revalidateStartTime,\n });\n }\n } catch (error: any) {\n if (error.message) {\n error.message = 'SWR in sub-request failed: ' + error.message;\n }\n\n console.error(error);\n } finally {\n swrLock.delete(key);\n }\n });\n\n // Asynchronously wait for it in workers\n waitUntil?.(revalidatingPromise);\n }\n\n // Log HIT/STALE requests\n logSubRequestEvent?.({\n result: cachedResult,\n cacheStatus,\n });\n\n return cachedResult;\n }\n\n const result = await actionFn({addDebugData});\n\n // Log MISS requests\n logSubRequestEvent?.({\n result,\n cacheStatus: 'MISS',\n });\n\n /**\n * Important: Do this async\n */\n if (shouldCacheResult(result)) {\n const cacheStoringPromise = Promise.resolve().then(async () => {\n const putStartTime = Date.now();\n await storeInCache(result);\n logSubRequestEvent?.({\n result,\n cacheStatus: 'PUT',\n overrideStartTime: putStartTime,\n });\n });\n\n waitUntil?.(cacheStoringPromise);\n }\n\n return result;\n}\n","import {CacheShort, CachingStrategy} from './strategies.js';\nimport {\n type CacheKey,\n runWithCache,\n type DebugOptions,\n} from './run-with-cache.js';\nimport type {WaitUntil} from '../types.js';\nimport {parseJSON} from '../utils/parse-json.js';\nimport {createGraphQLClient} from '@shopify/graphql-client';\n\nexport type FetchCacheOptions<T = any> = {\n cache?: CachingStrategy;\n cacheInstance?: Cache;\n cacheKey?: CacheKey;\n shouldCacheResponse: (body: T, response: Response) => boolean;\n waitUntil?: WaitUntil;\n debugInfo?: DebugOptions;\n streamConfig?: {\n query: string;\n variables: Record<string, unknown>;\n };\n /** Called when fresh raw headers are received (skipped on cache hits) */\n onRawHeaders?: (headers: Headers) => void;\n};\n\ntype SerializableResponse = [any, ResponseInit];\n\n// Exclude headers that are not safe or useful to cache\n// since they are individual to each user session/request.\nconst excludedHeaders = ['set-cookie', 'server-timing'];\n\nfunction toSerializableResponse(\n body: any,\n response: Response,\n): SerializableResponse {\n return [\n body,\n {\n status: response.status,\n statusText: response.statusText,\n headers: [...response.headers].filter(\n ([key]) => !excludedHeaders.includes(key.toLowerCase()),\n ),\n },\n ];\n}\n\nfunction fromSerializableResponse([body, init]: SerializableResponse) {\n return [body, new Response(body, init)] as const;\n}\n\n/**\n * `fetch` equivalent that stores responses in cache.\n * Useful for calling third-party APIs that need to be cached.\n * @private\n */\nexport async function fetchWithServerCache<T = unknown>(\n url: string,\n requestInit: Request | RequestInit,\n {\n cacheInstance,\n cache: cacheOptions,\n cacheKey = [url, requestInit],\n shouldCacheResponse,\n waitUntil,\n debugInfo,\n streamConfig,\n onRawHeaders,\n }: FetchCacheOptions,\n): Promise<readonly [T, Response]> {\n if (!cacheOptions && (!requestInit.method || requestInit.method === 'GET')) {\n cacheOptions = CacheShort();\n }\n\n return runWithCache(\n cacheKey,\n async () => {\n if (streamConfig) {\n let rawResponse: Response | null = null;\n const client = createGraphQLClient({\n url,\n customFetchApi: async (\n url: string,\n options: RequestInit | undefined,\n ) => {\n rawResponse = await fetch(url, options);\n onRawHeaders?.(rawResponse.headers);\n return rawResponse;\n },\n headers: requestInit.headers as Record<string, string>,\n });\n\n const responseStream = await client.requestStream(streamConfig.query, {\n variables: streamConfig.variables,\n });\n\n let allData: unknown;\n let allErrors: unknown;\n\n for await (const response of responseStream) {\n const {data, errors} = response;\n allData = data;\n allErrors = errors?.graphQLErrors ?? errors;\n }\n\n if (!rawResponse!?.ok) {\n // Skip caching and consuming the response body\n return rawResponse!;\n }\n\n return toSerializableResponse(\n {data: allData, errors: allErrors},\n rawResponse!,\n );\n }\n\n const response = await fetch(url, requestInit);\n onRawHeaders?.(response.headers);\n\n if (!response.ok) {\n // Skip caching and consuming the response body\n return response;\n }\n\n let data: any = await response.text().catch(() => '');\n\n try {\n if (data) data = parseJSON(data);\n } catch {}\n\n return toSerializableResponse(data, response);\n },\n {\n cacheInstance,\n waitUntil,\n strategy: cacheOptions ?? null,\n debugInfo,\n shouldCacheResult: (payload) => {\n return 'ok' in payload\n ? false\n : shouldCacheResponse(...fromSerializableResponse(payload));\n },\n },\n ).then((payload) => {\n return 'ok' in payload\n ? ([null, payload] as const)\n : fromSerializableResponse(payload);\n });\n}\n","import {type CachingStrategy} from './strategies';\nimport {type CrossRuntimeRequest, getDebugHeaders} from '../utils/request';\nimport {getCallerStackLine} from '../utils/callsites';\nimport {\n CacheActionFunctionParam,\n CacheKey,\n runWithCache,\n} from './run-with-cache';\nimport {fetchWithServerCache} from './server-fetch';\nimport type {WaitUntil} from '../types';\n\ntype CreateWithCacheOptions = {\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil: WaitUntil;\n /** The `request` object is used by the Subrequest profiler, and to access certain headers for debugging */\n request: CrossRuntimeRequest;\n};\n\ntype WithCacheRunOptions<T> = {\n /** The cache key for this run */\n cacheKey: CacheKey;\n /**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data.\n * Or use one of the pre-defined caching strategies: [`CacheNone`](/docs/api/hydrogen/utilities/cachenone), [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort), [`CacheLong`](/docs/api/hydrogen/utilities/cachelong).\n */\n cacheStrategy: CachingStrategy;\n /** Useful to avoid accidentally caching bad results */\n shouldCacheResult: (value: T) => boolean;\n};\n\ntype WithCacheFetchOptions<T> = {\n displayName?: string;\n /**\n * Use the `CachingStrategy` to define a custom caching mechanism for your data.\n * Or use one of the pre-defined caching strategies: [`CacheNone`](/docs/api/hydrogen/utilities/cachenone), [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort), [`CacheLong`](/docs/api/hydrogen/utilities/cachelong).\n */\n cacheStrategy?: CachingStrategy;\n /** The cache key for this fetch */\n cacheKey?: CacheKey;\n /** Useful to avoid e.g. caching a successful response that contains an error in the body */\n shouldCacheResponse: (body: T, response: Response) => boolean;\n};\n\nexport type WithCache = {\n run: <T>(\n options: WithCacheRunOptions<T>,\n fn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n ) => Promise<T>;\n fetch: <T>(\n url: string,\n requestInit: RequestInit,\n options: WithCacheFetchOptions<T>,\n ) => Promise<{data: T | null; response: Response}>;\n};\n\nexport function createWithCache(\n cacheOptions: CreateWithCacheOptions,\n): WithCache {\n const {cache, waitUntil, request} = cacheOptions;\n\n return {\n run: <T>(\n {cacheKey, cacheStrategy, shouldCacheResult}: WithCacheRunOptions<T>,\n fn: ({addDebugData}: CacheActionFunctionParam) => T | Promise<T>,\n ): Promise<T> => {\n return runWithCache(cacheKey, fn, {\n shouldCacheResult,\n strategy: cacheStrategy,\n cacheInstance: cache,\n waitUntil,\n debugInfo: {\n ...getDebugHeaders(request),\n stackInfo: getCallerStackLine?.(),\n },\n });\n },\n\n fetch: <T>(\n url: string,\n requestInit: RequestInit,\n options: WithCacheFetchOptions<T>,\n ): Promise<{data: T | null; response: Response}> => {\n return fetchWithServerCache<T | null>(url, requestInit ?? {}, {\n waitUntil,\n cacheKey: [url, requestInit],\n cacheInstance: cache,\n debugInfo: {\n url,\n ...getDebugHeaders(request),\n stackInfo: getCallerStackLine?.(),\n displayName: options?.displayName,\n },\n cache: options.cacheStrategy,\n ...options,\n }).then(([data, response]) => ({data, response}));\n },\n };\n}\n","type CacheMatch = {\n body: Uint8Array;\n timestamp: number;\n status: number;\n headers: [string, string][];\n};\n\n/**\n * This is a limited implementation of an in-memory cache.\n * It only supports the `cache-control` header.\n * It does NOT support `age` or `expires` headers.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Cache\n */\nexport class InMemoryCache implements Cache {\n #store: Map<string, CacheMatch>;\n\n constructor() {\n this.#store = new Map();\n }\n\n add(request: RequestInfo): Promise<void> {\n throw new Error('Method not implemented. Use `put` instead.');\n }\n\n addAll(requests: RequestInfo[]): Promise<void> {\n throw new Error('Method not implemented. Use `put` instead.');\n }\n\n matchAll(\n request?: RequestInfo,\n options?: CacheQueryOptions,\n ): Promise<readonly Response[]> {\n throw new Error('Method not implemented. Use `match` instead.');\n }\n\n async put(request: Request, response: Response) {\n if (request.method !== 'GET') {\n throw new TypeError('Cannot cache response to non-GET request.');\n }\n\n if (response.status === 206) {\n throw new TypeError(\n 'Cannot cache response to a range request (206 Partial Content).',\n );\n }\n\n if (response.headers.get('vary')?.includes('*')) {\n throw new TypeError(\"Cannot cache response with 'Vary: *' header.\");\n }\n\n this.#store.set(request.url, {\n body: new Uint8Array(await response.arrayBuffer()),\n status: response.status,\n headers: [...response.headers],\n timestamp: Date.now(),\n });\n }\n\n async match(request: Request) {\n if (request.method !== 'GET') return;\n\n const match = this.#store.get(request.url);\n\n if (!match) {\n return;\n }\n\n const {body, timestamp, ...metadata} = match;\n\n const headers = new Headers(metadata.headers);\n const cacheControl =\n headers.get('cache-control') || headers.get('real-cache-control') || '';\n const maxAge = parseInt(\n cacheControl.match(/max-age=(\\d+)/)?.[1] || '0',\n 10,\n );\n const swr = parseInt(\n cacheControl.match(/stale-while-revalidate=(\\d+)/)?.[1] || '0',\n 10,\n );\n const age = (Date.now() - timestamp) / 1000;\n\n const isMiss = age > maxAge + swr;\n\n if (isMiss) {\n this.#store.delete(request.url);\n return;\n }\n\n const isStale = age > maxAge;\n\n headers.set('cache', isStale ? 'STALE' : 'HIT');\n headers.set('date', new Date(timestamp).toUTCString());\n\n return new Response(body as BodyInit, {\n status: metadata.status ?? 200,\n headers,\n });\n }\n\n async delete(request: Request) {\n if (this.#store.has(request.url)) {\n this.#store.delete(request.url);\n return true;\n }\n return false;\n }\n\n keys(request?: Request) {\n const cacheKeys = [] as Request[];\n\n for (const url of this.#store.keys()) {\n if (!request || request.url === url) {\n cacheKeys.push(new Request(url));\n }\n }\n\n return Promise.resolve(cacheKeys);\n }\n}\n","import {type FetcherWithComponents, useFetcher} from 'react-router';\nimport {type MetafieldWithoutOwnerId} from './queries/cart-types';\nimport type {ReactNode} from 'react';\nimport type {\n AttributeInput,\n CartBuyerIdentityInput,\n CartInput,\n CartLineInput,\n CartLineUpdateInput,\n CartSelectedDeliveryOptionInput,\n Scalars,\n CartSelectableAddressInput,\n CartSelectableAddressUpdateInput,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\ntype OtherFormData = {\n [key: string]: unknown;\n};\n\ntype CartAttributesUpdateProps = {\n action: 'AttributesUpdateInput';\n inputs?: {\n attributes: AttributeInput[];\n } & OtherFormData;\n};\n\ntype CartAttributesUpdateRequire = {\n action: 'AttributesUpdateInput';\n inputs: {\n attributes: AttributeInput[];\n } & OtherFormData;\n};\n\ntype CartBuyerIdentityUpdateProps = {\n action: 'BuyerIdentityUpdate';\n inputs?: {\n buyerIdentity: CartBuyerIdentityInput;\n } & OtherFormData;\n};\n\ntype CartBuyerIdentityUpdateRequire = {\n action: 'BuyerIdentityUpdate';\n inputs: {\n buyerIdentity: CartBuyerIdentityInput;\n } & OtherFormData;\n};\n\ntype CartCreateProps = {\n action: 'Create';\n inputs?: {\n input: CartInput;\n } & OtherFormData;\n};\n\ntype CartCreateRequire = {\n action: 'Create';\n inputs: {\n input: CartInput;\n } & OtherFormData;\n};\n\ntype CartDiscountCodesUpdateProps = {\n action: 'DiscountCodesUpdate';\n inputs?: {\n discountCodes: string[];\n } & OtherFormData;\n};\n\ntype CartDiscountCodesUpdateRequire = {\n action: 'DiscountCodesUpdate';\n inputs: {\n discountCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesUpdateProps = {\n action: 'GiftCardCodesUpdate';\n inputs?: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesUpdateRequire = {\n action: 'GiftCardCodesUpdate';\n inputs: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesRemoveProps = {\n action: 'GiftCardCodesRemove';\n inputs?: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\ntype CartGiftCardCodesRemoveRequire = {\n action: 'GiftCardCodesRemove';\n inputs: {\n giftCardCodes: string[];\n } & OtherFormData;\n};\n\nexport type OptimisticCartLineInput = CartLineInput & {\n selectedVariant?: unknown;\n};\n\ntype CartLinesAddProps = {\n action: 'LinesAdd';\n inputs?: {\n lines: Array<OptimisticCartLineInput>;\n } & OtherFormData;\n};\n\ntype CartLinesAddRequire = {\n action: 'LinesAdd';\n inputs: {\n lines: Array<OptimisticCartLineInput>;\n } & OtherFormData;\n};\n\ntype CartLinesUpdateProps = {\n action: 'LinesUpdate';\n inputs?: {\n lines: CartLineUpdateInput[];\n } & OtherFormData;\n};\n\ntype CartLinesUpdateRequire = {\n action: 'LinesUpdate';\n inputs: {\n lines: CartLineUpdateInput[];\n } & OtherFormData;\n};\n\ntype CartLinesRemoveProps = {\n action: 'LinesRemove';\n inputs?: {\n lineIds: string[];\n } & OtherFormData;\n};\n\ntype CartLinesRemoveRequire = {\n action: 'LinesRemove';\n inputs: {\n lineIds: string[];\n } & OtherFormData;\n};\n\ntype CartNoteUpdateProps = {\n action: 'NoteUpdate';\n inputs?: {\n note: string;\n } & OtherFormData;\n};\n\ntype CartNoteUpdateRequire = {\n action: 'NoteUpdate';\n inputs: {\n note: string;\n } & OtherFormData;\n};\n\ntype CartSelectedDeliveryOptionsUpdateProps = {\n action: 'SelectedDeliveryOptionsUpdate';\n inputs?: {\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[];\n } & OtherFormData;\n};\n\ntype CartSelectedDeliveryOptionsUpdateRequire = {\n action: 'SelectedDeliveryOptionsUpdate';\n inputs: {\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[];\n } & OtherFormData;\n};\n\ntype CartMetafieldsSetProps = {\n action: 'MetafieldsSet';\n inputs?: {\n metafields: MetafieldWithoutOwnerId[];\n } & OtherFormData;\n};\n\ntype CartMetafieldsSetRequire = {\n action: 'MetafieldsSet';\n inputs: {\n metafields: MetafieldWithoutOwnerId[];\n } & OtherFormData;\n};\n\ntype CartMetafieldDeleteProps = {\n action: 'MetafieldsDelete';\n inputs?: {\n key: Scalars['String']['input'];\n } & OtherFormData;\n};\n\ntype CartMetafieldDeleteRequire = {\n action: 'MetafieldsDelete';\n inputs: {\n key: Scalars['String']['input'];\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesAddProps = {\n action: 'DeliveryAddressesAdd';\n inputs?: {\n addresses: Array<CartSelectableAddressInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesAddRequire = {\n action: 'DeliveryAddressesAdd';\n inputs: {\n addresses: Array<CartSelectableAddressInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesRemoveProps = {\n action: 'DeliveryAddressesRemove';\n inputs?: {\n addressIds: Array<string> | Array<Scalars['ID']['input']>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesRemoveRequire = {\n action: 'DeliveryAddressesRemove';\n inputs: {\n addressIds: Array<string> | Array<Scalars['ID']['input']>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesUpdateProps = {\n action: 'DeliveryAddressesUpdate';\n inputs?: {\n addresses: Array<CartSelectableAddressUpdateInput>;\n } & OtherFormData;\n};\n\ntype CartDeliveryAddressesUpdateRequire = {\n action: 'DeliveryAddressesUpdate';\n inputs: {\n addresses: Array<CartSelectableAddressUpdateInput>;\n } & OtherFormData;\n};\n\ntype CartCustomProps = {\n action: `Custom${string}`;\n inputs?: Record<string, unknown>;\n};\n\ntype CartCustomRequire = {\n action: `Custom${string}`;\n inputs: Record<string, unknown>;\n};\n\ntype CartFormCommonProps = {\n /**\n * Children nodes of CartForm.\n * Children can be a render prop that receives the fetcher.\n */\n children: ReactNode | ((fetcher: FetcherWithComponents<any>) => ReactNode);\n /**\n * The route to submit the form to. Defaults to the current route.\n */\n route?: string;\n /**\n * Optional key to use for the fetcher.\n * @see https://remix.run/hooks/use-fetcher#key\n */\n fetcherKey?: string;\n};\n\ntype CartActionInputProps =\n | CartAttributesUpdateProps\n | CartBuyerIdentityUpdateProps\n | CartCreateProps\n | CartDiscountCodesUpdateProps\n | CartGiftCardCodesUpdateProps\n | CartGiftCardCodesRemoveProps\n | CartLinesAddProps\n | CartLinesUpdateProps\n | CartLinesRemoveProps\n | CartNoteUpdateProps\n | CartSelectedDeliveryOptionsUpdateProps\n | CartMetafieldsSetProps\n | CartMetafieldDeleteProps\n | CartDeliveryAddressesAddProps\n | CartDeliveryAddressesRemoveProps\n | CartDeliveryAddressesUpdateProps\n | CartCustomProps;\n\nexport type CartActionInput =\n | CartAttributesUpdateRequire\n | CartBuyerIdentityUpdateRequire\n | CartCreateRequire\n | CartDiscountCodesUpdateRequire\n | CartGiftCardCodesUpdateRequire\n | CartGiftCardCodesRemoveRequire\n | CartLinesAddRequire\n | CartLinesUpdateRequire\n | CartLinesRemoveRequire\n | CartNoteUpdateRequire\n | CartSelectedDeliveryOptionsUpdateRequire\n | CartMetafieldsSetRequire\n | CartMetafieldDeleteRequire\n | CartDeliveryAddressesAddRequire\n | CartDeliveryAddressesRemoveRequire\n | CartDeliveryAddressesUpdateRequire\n | CartCustomRequire;\n\ntype CartFormProps = CartActionInputProps & CartFormCommonProps;\n\nconst INPUT_NAME = 'cartFormInput';\n\nexport function CartForm({\n children,\n action,\n inputs,\n route,\n fetcherKey,\n}: CartFormProps): JSX.Element {\n const fetcher = useFetcher({key: fetcherKey});\n\n return (\n <fetcher.Form action={route || ''} method=\"post\">\n {(action || inputs) && (\n <input\n type=\"hidden\"\n name={INPUT_NAME}\n value={JSON.stringify({action, inputs})}\n />\n )}\n {typeof children === 'function' ? children(fetcher) : children}\n </fetcher.Form>\n );\n}\n\nCartForm.INPUT_NAME = INPUT_NAME;\n\nCartForm.ACTIONS = {\n AttributesUpdateInput: 'AttributesUpdateInput',\n BuyerIdentityUpdate: 'BuyerIdentityUpdate',\n Create: 'Create',\n DiscountCodesUpdate: 'DiscountCodesUpdate',\n GiftCardCodesUpdate: 'GiftCardCodesUpdate',\n GiftCardCodesRemove: 'GiftCardCodesRemove',\n LinesAdd: 'LinesAdd',\n LinesRemove: 'LinesRemove',\n LinesUpdate: 'LinesUpdate',\n NoteUpdate: 'NoteUpdate',\n SelectedDeliveryOptionsUpdate: 'SelectedDeliveryOptionsUpdate',\n MetafieldsSet: 'MetafieldsSet',\n MetafieldDelete: 'MetafieldDelete',\n DeliveryAddressesAdd: 'DeliveryAddressesAdd',\n DeliveryAddressesUpdate: 'DeliveryAddressesUpdate',\n DeliveryAddressesRemove: 'DeliveryAddressesRemove',\n} as const;\n\nfunction getFormInput(formData: FormData): CartActionInput {\n // Get all form data\n const data: Record<string, unknown> = {};\n for (const pair of formData.entries()) {\n const key = pair[0];\n const values = formData.getAll(key);\n\n data[key] = values.length > 1 ? values : pair[1];\n\n // Convert checkbox string values to boolean\n if (data[key] === 'on') {\n data[key] = true;\n } else if (data[key] === 'off') {\n data[key] = false;\n }\n }\n\n // Parse cartFormInput\n const {cartFormInput, ...otherData} = data;\n const {action, inputs}: CartActionInput = cartFormInput\n ? JSON.parse(String(cartFormInput))\n : {};\n\n return {\n action,\n inputs: {\n ...inputs,\n ...otherData,\n },\n } as unknown as CartActionInput;\n}\n\n/**\n * Converts form data into a CartActionInput object.\n *\n * This function takes a FormData object, extracts its entries, and constructs a CartActionInput object.\n * It parses the `cartFormInput` field if present and merges it with other form data.\n *\n * @param {FormData} formData - The form data to convert.\n * @returns {CartActionInput} - The resulting CartActionInput object.\n *\n * @example\n * const formData = new FormData();\n * formData.append('cartFormInput', JSON.stringify({ action: 'add', inputs: { productId: '123' } }));\n * formData.append('quantity', '2');\n * const cartActionInput = getFormInput(formData);\n * console.log(cartActionInput);\n * // Output: { action: 'add', inputs: { productId: '123', quantity: '2' } }\n */\nCartForm.getFormInput = getFormInput;\n","// @ts-ignore - worktop/cookie types not properly exported\nimport {parse} from 'worktop/cookie';\nimport {type CrossRuntimeRequest, getHeaderValue} from '../utils/request';\n\nexport const cartGetIdDefault = (\n requestHeaders: CrossRuntimeRequest['headers'],\n) => {\n const cookies = parse(getHeaderValue(requestHeaders, 'Cookie') || '');\n return () => {\n return cookies.cart ? `gid://shopify/Cart/${cookies.cart}` : undefined;\n };\n};\n","// @ts-ignore - worktop/cookie types not properly exported\nimport {stringify} from 'worktop/cookie';\n\nexport type CookieOptions = {\n maxage?: number;\n expires?: Date | number | string;\n samesite?: 'Lax' | 'Strict' | 'None';\n secure?: boolean;\n httponly?: boolean;\n domain?: string;\n path?: string;\n};\n\nexport const cartSetIdDefault = (cookieOptions?: CookieOptions) => {\n return (cartId: string) => {\n const headers = new Headers();\n headers.append(\n 'Set-Cookie',\n stringify('cart', cartId.split('/').pop() || '', {\n path: '/',\n ...cookieOptions,\n }),\n );\n return headers;\n };\n};\n","/*\n * Generate a UUID using crypto and fallback to Math.random if crypto is not available.\n */\nexport function generateUUID() {\n if (typeof crypto !== 'undefined' && !!crypto.randomUUID) {\n return crypto.randomUUID();\n } else {\n return `weak-${Math.random().toString(16).substring(2)}`;\n }\n}\n","export const LIB_VERSION = '2025.7.3';\n","import type {StorefrontApiResponseOk} from '@shopify/hydrogen-react';\nimport type {GenericVariables} from '@shopify/hydrogen-codegen';\n\nexport function extractQueryName(query: string) {\n return query.match(/(query|mutation)\\s+([^({]*)/)?.[0]?.trim();\n}\n\nexport function minifyQuery<T extends string>(string: T) {\n return string\n .replace(/\\s*#.*$/gm, '') // Remove GQL comments\n .replace(/\\s+/gm, ' ') // Minify spaces\n .trim() as T;\n}\n\nconst IS_QUERY_RE = /(^|}\\s)query[\\s({]/im;\nconst IS_MUTATION_RE = /(^|}\\s)mutation[\\s({]/im;\n\nexport function assertQuery(query: string, callerName: string) {\n if (!IS_QUERY_RE.test(query)) {\n throw new Error(`[h2:error:${callerName}] Can only execute queries`);\n }\n}\n\nexport function assertMutation(query: string, callerName: string) {\n if (!IS_MUTATION_RE.test(query)) {\n throw new Error(`[h2:error:${callerName}] Can only execute mutations`);\n }\n}\n\nexport type GraphQLApiResponse<T> = StorefrontApiResponseOk<T>;\n\nexport type GraphQLErrorOptions<T> = {\n url: string;\n response: Response;\n errors: GraphQLApiResponse<T>['errors'];\n type: 'query' | 'mutation';\n query: string;\n queryVariables: GenericVariables;\n ErrorConstructor?: ErrorConstructor;\n client?: string;\n};\n\n// Reference: https://github.com/graphql/graphql-js/blob/main/src/error/GraphQLError.ts#L218-L242\nexport class GraphQLError extends Error {\n /**\n * If an error can be associated to a particular point in the requested\n * GraphQL document, it should contain a list of locations.\n */\n locations?: Array<{line: number; column: number}>;\n /**\n * If an error can be associated to a particular field in the GraphQL result,\n * it _must_ contain an entry with the key `path` that details the path of\n * the response field which experienced the error. This allows clients to\n * identify whether a null result is intentional or caused by a runtime error.\n */\n path?: Array<string | number>;\n /**\n * Reserved for implementors to extend the protocol however they see fit,\n * and hence there are no additional restrictions on its contents.\n */\n extensions?: {[key: string]: unknown};\n\n constructor(\n message?: string,\n options: Pick<\n GraphQLError,\n 'locations' | 'path' | 'extensions' | 'stack' | 'cause'\n > & {\n query?: string;\n queryVariables?: GenericVariables;\n requestId?: string | null;\n clientOperation?: string;\n } = {},\n ) {\n const h2Prefix = options.clientOperation\n ? `[h2:error:${options.clientOperation}] `\n : '';\n\n const enhancedMessage =\n h2Prefix +\n message +\n (options.requestId ? ` - Request ID: ${options.requestId}` : '');\n\n super(enhancedMessage);\n this.name = 'GraphQLError';\n this.extensions = options.extensions;\n this.locations = options.locations;\n this.path = options.path;\n this.stack = options.stack || undefined;\n\n try {\n this.cause = JSON.stringify({\n ...(typeof options.cause === 'object' ? options.cause : {}),\n requestId: options.requestId,\n ...(process.env.NODE_ENV === 'development' && {\n path: options.path,\n extensions: options.extensions,\n graphql: h2Prefix &&\n options.query && {\n query: options.query,\n variables: JSON.stringify(options.queryVariables),\n },\n }),\n });\n } catch {\n if (options.cause) this.cause = options.cause;\n }\n }\n\n get [Symbol.toStringTag]() {\n return this.name;\n }\n\n /**\n * Note: `toString()` is internally used by `console.log(...)` / `console.error(...)`\n * when ingesting logs in Oxygen production. Therefore, we want to make sure that\n * the error message is as informative as possible instead of `[object Object]`.\n */\n override toString() {\n let result = `${this.name}: ${this.message}`;\n\n if (this.path) {\n try {\n result += ` | path: ${JSON.stringify(this.path)}`;\n } catch {}\n }\n\n if (this.extensions) {\n try {\n result += ` | extensions: ${JSON.stringify(this.extensions)}`;\n } catch {}\n }\n\n result += '\\n';\n\n if (this.stack) {\n // Remove the message line from the stack.\n result += `${this.stack.slice(this.stack.indexOf('\\n') + 1)}\\n`;\n }\n\n return result;\n }\n\n /**\n * Note: toJSON` is internally used by `JSON.stringify(...)`.\n * The most common scenario when this error instance is going to be stringified is\n * when it's passed to Remix' `json` and `defer` functions: e.g. `{promise: storefront.query(...)}`.\n * In this situation, we don't want to expose private error information to the browser so we only\n * do it in development.\n */\n toJSON() {\n const formatted: Pick<\n GraphQLError,\n 'name' | 'message' | 'path' | 'extensions' | 'locations' | 'stack'\n > = {name: 'Error', message: ''};\n\n if (process.env.NODE_ENV === 'development') {\n formatted.name = this.name;\n formatted.message = 'Development: ' + this.message;\n if (this.path) formatted.path = this.path;\n if (this.locations) formatted.locations = this.locations;\n if (this.extensions) formatted.extensions = this.extensions;\n // Skip stack on purpose because we don't want to expose it to the browser.\n }\n\n return formatted;\n }\n}\n\nexport function throwErrorWithGqlLink<T>({\n url,\n response,\n errors,\n type,\n query,\n queryVariables,\n ErrorConstructor = Error,\n client = 'storefront',\n}: GraphQLErrorOptions<T>): never {\n const errorMessage =\n (typeof errors === 'string'\n ? errors\n : errors?.map?.((error) => error.message).join('\\n')) ||\n `URL: ${url}\\nAPI response error: ${response.status}`;\n\n const gqlError = new GraphQLError(errorMessage, {\n query,\n queryVariables,\n cause: {errors},\n clientOperation: `${client}.${type}`,\n requestId: response.headers.get('x-request-id'),\n });\n\n throw new ErrorConstructor(gqlError.message, {cause: gqlError.cause});\n}\n","import {\n createStorefrontClient as createStorefrontUtilities,\n SHOPIFY_STOREFRONT_ID_HEADER,\n SHOPIFY_STOREFRONT_Y_HEADER,\n SHOPIFY_STOREFRONT_S_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n type StorefrontClientProps,\n} from '@shopify/hydrogen-react';\nimport type {WritableDeep} from 'type-fest';\nimport {fetchWithServerCache} from './cache/server-fetch';\nimport {\n SDK_VARIANT_HEADER,\n SDK_VARIANT_SOURCE_HEADER,\n SDK_VERSION_HEADER,\n STOREFRONT_ACCESS_TOKEN_HEADER,\n STOREFRONT_REQUEST_GROUP_ID_HEADER,\n SHOPIFY_CLIENT_IP_HEADER,\n SHOPIFY_CLIENT_IP_SIG_HEADER,\n HYDROGEN_SERVER_TRACKING_KEY,\n} from './constants';\nimport {\n CacheNone,\n CacheLong,\n CacheShort,\n CacheDefault,\n CacheCustom,\n generateCacheControlHeader,\n type CachingStrategy,\n} from './cache/strategies';\nimport {generateUUID} from './utils/uuid';\nimport {parseJSON} from './utils/parse-json';\nimport {\n CountryCode,\n LanguageCode as StorefrontLanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {LanguageCode as CustomerLanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\nimport type {\n ClientReturn,\n ClientVariablesInRestParams,\n GenericVariables,\n} from '@shopify/hydrogen-codegen';\nimport {warnOnce} from './utils/warning';\nimport {LIB_VERSION} from './version';\nimport {\n minifyQuery,\n assertQuery,\n assertMutation,\n throwErrorWithGqlLink,\n GraphQLError,\n type GraphQLApiResponse,\n type GraphQLErrorOptions,\n} from './utils/graphql';\nimport {\n getCallerStackLine,\n withSyncStack,\n type StackInfo,\n} from './utils/callsites';\nimport type {WaitUntil, StorefrontHeaders} from './types';\nimport {extractHeaders, getSafePathname, SFAPI_RE} from './utils/request';\nimport {\n appendServerTimingHeader,\n extractServerTimingHeader,\n TrackedTimingsRecord,\n} from './utils/server-timing';\n\nexport type I18nBase = {\n language: StorefrontLanguageCode | CustomerLanguageCode;\n country: CountryCode;\n};\n\n// When passing GraphQLError through Remix' `json` or `defer`,\n// the class instance is lost and it becomes a plain JSON object.\n// Therefore, we need make TS think this is a plain object instead of\n// a class to make it work in server and client.\n// Also, Remix' `Jsonify` type is broken and can't infer types of classes properly.\ntype JsonGraphQLError = ReturnType<GraphQLError['toJSON']>; // Equivalent to `Jsonify<GraphQLError>[]`\nexport type StorefrontApiErrors = JsonGraphQLError[] | undefined;\n\ntype StorefrontError = {\n errors?: StorefrontApiErrors;\n};\n\n/**\n * Wraps all the returned utilities from `createStorefrontClient`.\n */\nexport type StorefrontClient<TI18n extends I18nBase> = {\n storefront: Storefront<TI18n>;\n};\n\n/**\n * Maps all the queries found in the project to variables and return types.\n */\nexport interface StorefrontQueries {\n // Example of how a generated query type looks like:\n // '#graphql query q1 {...}': {return: Q1Query; variables: Q1QueryVariables};\n}\n\n/**\n * Maps all the mutations found in the project to variables and return types.\n */\nexport interface StorefrontMutations {\n // Example of how a generated mutation type looks like:\n // '#graphql mutation m1 {...}': {return: M1Mutation; variables: M1MutationVariables};\n}\n\n// These are the variables that are automatically added to the storefront API.\n// We use this type to make parameters optional in storefront client\n// when these are the only variables that can be passed.\ntype AutoAddedVariableNames = 'country' | 'language';\n\ntype StorefrontCommonExtraParams = {\n headers?: HeadersInit;\n storefrontApiVersion?: string;\n displayName?: string;\n};\n\n/**\n * Interface to interact with the Storefront API.\n */\nexport type Storefront<TI18n extends I18nBase = I18nBase> = {\n query: <\n OverrideReturnType extends any = never,\n RawGqlString extends string = string,\n >(\n query: RawGqlString,\n ...options: ClientVariablesInRestParams<\n StorefrontQueries,\n RawGqlString,\n StorefrontCommonExtraParams & Pick<StorefrontQueryOptions, 'cache'>,\n AutoAddedVariableNames\n >\n ) => Promise<\n ClientReturn<StorefrontQueries, RawGqlString, OverrideReturnType> &\n StorefrontError\n >;\n mutate: <\n OverrideReturnType extends any = never,\n RawGqlString extends string = string,\n >(\n mutation: RawGqlString,\n ...options: ClientVariablesInRestParams<\n StorefrontMutations,\n RawGqlString,\n StorefrontCommonExtraParams,\n AutoAddedVariableNames\n >\n ) => Promise<\n ClientReturn<StorefrontMutations, RawGqlString, OverrideReturnType> &\n StorefrontError\n >;\n cache?: Cache;\n CacheNone: typeof CacheNone;\n CacheLong: typeof CacheLong;\n CacheShort: typeof CacheShort;\n CacheCustom: typeof CacheCustom;\n generateCacheControlHeader: typeof generateCacheControlHeader;\n getPublicTokenHeaders: ReturnType<\n typeof createStorefrontUtilities\n >['getPublicTokenHeaders'];\n getPrivateTokenHeaders: ReturnType<\n typeof createStorefrontUtilities\n >['getPrivateTokenHeaders'];\n getShopifyDomain: ReturnType<\n typeof createStorefrontUtilities\n >['getShopifyDomain'];\n getApiUrl: ReturnType<\n typeof createStorefrontUtilities\n >['getStorefrontApiUrl'];\n i18n: TI18n;\n getHeaders: () => Record<string, string>;\n /**\n * Checks if the request URL matches the Storefront API GraphQL endpoint.\n */\n isStorefrontApiUrl: (request: {url?: string}) => boolean;\n /**\n * Forwards the request to the Storefront API.\n * It reads the API version from the request URL.\n */\n forward: (\n request: Request,\n options?: Pick<StorefrontCommonExtraParams, 'storefrontApiVersion'>,\n ) => Promise<Response>;\n /**\n * Sets the collected subrequest headers in the response.\n * Useful to forward the cookies and server-timing headers\n * from server subrequests to the browser.\n */\n setCollectedSubrequestHeaders: (response: {headers: Headers}) => void;\n};\n\ntype HydrogenClientProps<TI18n> = {\n /** Storefront API headers. If on Oxygen, use `getStorefrontHeaders()` */\n storefrontHeaders?: StorefrontHeaders;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The globally unique identifier for the Shop */\n storefrontId?: string;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n};\n\nexport type CreateStorefrontClientOptions<TI18n extends I18nBase> =\n HydrogenClientProps<TI18n> & StorefrontClientProps;\n\ntype StorefrontQueryOptions = StorefrontCommonExtraParams & {\n query: string;\n mutation?: never;\n cache?: CachingStrategy;\n};\n\ntype StorefrontMutationOptions = StorefrontCommonExtraParams & {\n query?: never;\n mutation: string;\n cache?: never;\n};\n\nconst defaultI18n: I18nBase = {\n language: 'EN' as StorefrontLanguageCode,\n country: 'US' as CountryCode,\n};\n\n/**\n * This function extends `createStorefrontClient` from [Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient). The additional arguments enable internationalization (i18n), caching, and other features particular to Remix and Oxygen.\n *\n * Learn more about [data fetching in Hydrogen](/docs/custom-storefronts/hydrogen/data-fetching/fetch-data).\n */\nexport function createStorefrontClient<TI18n extends I18nBase>(\n options: CreateStorefrontClientOptions<TI18n>,\n): StorefrontClient<TI18n> {\n const {\n storefrontHeaders,\n cache,\n waitUntil,\n i18n,\n storefrontId,\n logErrors = true,\n ...clientOptions\n } = options;\n const H2_PREFIX_WARN = '[h2:warn:createStorefrontClient] ';\n\n if (process.env.NODE_ENV === 'development' && !cache) {\n warnOnce(\n H2_PREFIX_WARN +\n 'Storefront API client created without a cache instance. This may slow down your sub-requests.',\n );\n }\n\n const {\n getPublicTokenHeaders,\n getPrivateTokenHeaders,\n getStorefrontApiUrl,\n getShopifyDomain,\n } = createStorefrontUtilities(clientOptions);\n\n const getHeaders = clientOptions.privateStorefrontToken\n ? getPrivateTokenHeaders\n : getPublicTokenHeaders;\n\n const defaultHeaders = getHeaders({\n contentType: 'json',\n buyerIp: storefrontHeaders?.buyerIp || '',\n });\n\n if (storefrontHeaders?.buyerIp) {\n defaultHeaders[SHOPIFY_CLIENT_IP_HEADER] = storefrontHeaders.buyerIp;\n }\n\n if (storefrontHeaders?.buyerIpSig) {\n defaultHeaders[SHOPIFY_CLIENT_IP_SIG_HEADER] = storefrontHeaders.buyerIpSig;\n }\n\n defaultHeaders[STOREFRONT_REQUEST_GROUP_ID_HEADER] =\n storefrontHeaders?.requestGroupId || generateUUID();\n\n if (storefrontId) defaultHeaders[SHOPIFY_STOREFRONT_ID_HEADER] = storefrontId;\n if (LIB_VERSION) defaultHeaders['user-agent'] = `Hydrogen ${LIB_VERSION}`;\n\n const requestCookie = storefrontHeaders?.cookie ?? '';\n if (requestCookie) defaultHeaders['cookie'] = requestCookie;\n\n let uniqueToken: string | undefined;\n let visitToken: string | undefined;\n\n // If new cookies are not present, we need to check legacy cookies\n // or generate new tokens, which we pass in the headers. This ensures\n // we track the current session and SFAPI creates new cookies with\n // the given tokens for subsequent requests.\n if (!/\\b_shopify_(analytics|marketing)=/.test(requestCookie)) {\n const legacyUniqueToken = requestCookie.match(/\\b_shopify_y=([^;]+)/)?.[1];\n const legacyVisitToken = requestCookie.match(/\\b_shopify_s=([^;]+)/)?.[1];\n\n // These legacy headers might not be needed since they are already\n // passed via cookies, but it's better to be explicit just in case.\n if (legacyUniqueToken) {\n defaultHeaders[SHOPIFY_STOREFRONT_Y_HEADER] = legacyUniqueToken;\n }\n if (legacyVisitToken) {\n defaultHeaders[SHOPIFY_STOREFRONT_S_HEADER] = legacyVisitToken;\n }\n\n // Use legacy tokens if available for session migration, or generate\n // new ones and set them in the new headers to let SFAPI create\n // cookies and track the subrequests made in this session.\n uniqueToken = legacyUniqueToken ?? generateUUID();\n visitToken = legacyVisitToken ?? generateUUID();\n\n defaultHeaders[SHOPIFY_UNIQUE_TOKEN_HEADER] = uniqueToken;\n defaultHeaders[SHOPIFY_VISIT_TOKEN_HEADER] = visitToken;\n }\n\n let collectedSubrequestHeaders:\n | undefined\n | {\n serverTiming: string;\n setCookie: string[];\n };\n\n // Remove any headers that are identifiable to the user or request\n const cacheKeyHeader = JSON.stringify({\n 'content-type': defaultHeaders['content-type'],\n 'user-agent': defaultHeaders['user-agent'],\n [SDK_VARIANT_HEADER]: defaultHeaders[SDK_VARIANT_HEADER],\n [SDK_VARIANT_SOURCE_HEADER]: defaultHeaders[SDK_VARIANT_SOURCE_HEADER],\n [SDK_VERSION_HEADER]: defaultHeaders[SDK_VERSION_HEADER],\n [STOREFRONT_ACCESS_TOKEN_HEADER]:\n defaultHeaders[STOREFRONT_ACCESS_TOKEN_HEADER],\n });\n\n async function fetchStorefrontApi<T = any>({\n query,\n mutation,\n variables,\n cache: cacheOptions,\n headers = [],\n storefrontApiVersion,\n displayName,\n stackInfo,\n }: {variables?: GenericVariables; stackInfo?: StackInfo} & (\n | StorefrontQueryOptions\n | StorefrontMutationOptions\n )): Promise<T & StorefrontError> {\n const userHeaders =\n headers instanceof Headers\n ? Object.fromEntries(headers.entries())\n : Array.isArray(headers)\n ? Object.fromEntries(headers)\n : headers;\n\n const document = query ?? mutation;\n const queryVariables = {...variables};\n\n if (i18n) {\n if (!variables?.country && /\\$country/.test(document)) {\n queryVariables.country = i18n.country;\n }\n\n if (!variables?.language && /\\$language/.test(document)) {\n queryVariables.language = i18n.language;\n }\n }\n\n const url = getStorefrontApiUrl({storefrontApiVersion});\n const graphqlData = JSON.stringify({\n query: document,\n variables: queryVariables,\n });\n const requestInit = {\n method: 'POST',\n headers: {...defaultHeaders, ...userHeaders},\n body: graphqlData,\n } satisfies RequestInit;\n\n const cacheKey = [\n url,\n requestInit.method,\n cacheKeyHeader,\n requestInit.body,\n ];\n\n const streamConfig = document.includes('@defer')\n ? {\n query: document,\n variables: queryVariables,\n }\n : undefined;\n\n const [body, response] = await fetchWithServerCache(url, requestInit, {\n cacheInstance: mutation ? undefined : cache,\n cache: cacheOptions || CacheDefault(),\n cacheKey,\n waitUntil,\n // Check if the response body has GraphQL errors:\n // https://spec.graphql.org/June2018/#sec-Response-Format\n shouldCacheResponse: (body: any) => !body?.errors,\n // Optional information for the subrequest profiler:\n debugInfo: {\n requestId: requestInit.headers[STOREFRONT_REQUEST_GROUP_ID_HEADER],\n displayName,\n url,\n stackInfo,\n graphql: graphqlData,\n purpose: storefrontHeaders?.purpose,\n },\n streamConfig,\n onRawHeaders: (headers) => {\n // Set this the first time we get a fresh response (cache miss)\n // to increase the chance of returning it from the main server response.\n // Note: a server response needs its headers set at the time of sending,\n // while the body can be streamed later. Therefore, this value here\n // might not be used if subrequests are not over before the main response is sent.\n collectedSubrequestHeaders ??= {\n setCookie: headers.getSetCookie(),\n serverTiming: headers.get('server-timing') ?? '',\n };\n },\n });\n\n const errorOptions: GraphQLErrorOptions<T> = {\n url,\n response,\n type: mutation ? 'mutation' : 'query',\n query: document,\n queryVariables,\n errors: undefined,\n };\n\n if (!response.ok) {\n /**\n * The Storefront API might return a string error, or a JSON-formatted {error: string}.\n * We try both and conform them to a single {errors} format.\n */\n let errors;\n let bodyText = body;\n try {\n bodyText ??= await response.text();\n errors = parseJSON(bodyText);\n } catch (_e) {\n errors = [\n {message: bodyText ?? 'Could not parse Storefront API response'},\n ];\n }\n\n throwErrorWithGqlLink({...errorOptions, errors});\n }\n\n let {data, errors} = body as\n | GraphQLApiResponse<T>\n | {\n data: T;\n errors: NonNullable<GraphQLApiResponse<T>['errors']>[number];\n };\n\n errors = errors ? (Array.isArray(errors) ? errors : [errors]) : undefined;\n\n const gqlErrors = errors?.map(\n ({message, ...rest}) =>\n new GraphQLError(message, {\n ...(rest as WritableDeep<typeof rest>),\n clientOperation: `storefront.${errorOptions.type}`,\n requestId: response.headers.get('x-request-id'),\n queryVariables,\n query: document,\n }),\n );\n\n return formatAPIResult(data, gqlErrors);\n }\n\n return {\n storefront: {\n /**\n * Sends a GraphQL query to the Storefront API.\n *\n * Example:\n *\n * ```js\n * async function loader ({context: {storefront}}) {\n * const data = await storefront.query('query { ... }', {\n * variables: {},\n * cache: storefront.CacheLong()\n * });\n * }\n * ```\n */\n query(query, options?) {\n query = minifyQuery(query);\n assertQuery(query, 'storefront.query');\n\n const stackOffset = getStackOffset?.(query);\n\n return withSyncStack(\n fetchStorefrontApi({\n ...options,\n query,\n stackInfo: getCallerStackLine?.(stackOffset),\n }),\n {stackOffset, logErrors},\n );\n },\n /**\n * Sends a GraphQL mutation to the Storefront API.\n *\n * Example:\n *\n * ```js\n * async function loader ({context: {storefront}}) {\n * await storefront.mutate('mutation { ... }', {\n * variables: {},\n * });\n * }\n * ```\n */\n mutate(mutation, options?) {\n mutation = minifyQuery(mutation);\n assertMutation(mutation, 'storefront.mutate');\n\n const stackOffset = getStackOffset?.(mutation);\n\n return withSyncStack(\n fetchStorefrontApi({\n ...options,\n mutation,\n stackInfo: getCallerStackLine?.(stackOffset),\n }),\n {stackOffset, logErrors},\n );\n },\n cache,\n CacheNone,\n CacheLong,\n CacheShort,\n CacheCustom,\n generateCacheControlHeader,\n getPublicTokenHeaders,\n getPrivateTokenHeaders,\n getHeaders: () => ({...defaultHeaders}),\n getShopifyDomain,\n getApiUrl: getStorefrontApiUrl,\n i18n: (i18n ?? defaultI18n) as TI18n,\n\n /**\n * Checks if the request is targeting the Storefront API endpoint.\n */\n isStorefrontApiUrl(request) {\n return SFAPI_RE.test(getSafePathname(request.url ?? ''));\n },\n /**\n * Forwards the request to the Storefront API.\n */\n async forward(request, options) {\n const forwardedHeaders = new Headers([\n // Forward only a selected set of headers to the Storefront API\n // to avoid getting 403 errors due to unexpected headers.\n ...extractHeaders(\n (key) => request.headers.get(key),\n [\n 'accept',\n 'accept-encoding',\n 'accept-language',\n // Access-Control headers are used for CORS preflight requests.\n 'access-control-request-headers',\n 'access-control-request-method',\n 'content-type',\n 'content-length',\n 'cookie',\n 'origin',\n 'referer',\n 'user-agent',\n STOREFRONT_ACCESS_TOKEN_HEADER,\n SHOPIFY_UNIQUE_TOKEN_HEADER,\n SHOPIFY_VISIT_TOKEN_HEADER,\n ],\n ),\n // Add some headers to help with geolocalization and debugging\n ...extractHeaders(\n (key) => defaultHeaders[key],\n [\n SHOPIFY_CLIENT_IP_HEADER,\n SHOPIFY_CLIENT_IP_SIG_HEADER,\n SHOPIFY_STOREFRONT_ID_HEADER,\n STOREFRONT_REQUEST_GROUP_ID_HEADER,\n ],\n ),\n ]);\n\n if (storefrontHeaders?.buyerIp) {\n // Good for proxies to inform about the original client IP\n forwardedHeaders.set('x-forwarded-for', storefrontHeaders.buyerIp);\n }\n\n const storefrontApiVersion =\n options?.storefrontApiVersion ??\n getSafePathname(request.url).match(SFAPI_RE)?.[1];\n\n const sfapiResponse = await fetch(\n getStorefrontApiUrl({storefrontApiVersion}),\n {\n method: request.method,\n body: request.body,\n headers: forwardedHeaders,\n },\n );\n\n // Create a new response to allow modifying headers\n return new Response(sfapiResponse.body, sfapiResponse);\n },\n\n setCollectedSubrequestHeaders: (response: {headers: Headers}) => {\n // Forward cookies\n if (collectedSubrequestHeaders) {\n for (const value of collectedSubrequestHeaders.setCookie) {\n response.headers.append('Set-Cookie', value);\n }\n }\n\n const serverTiming = extractServerTimingHeader(\n collectedSubrequestHeaders?.serverTiming,\n );\n\n const isDocumentResponse = response.headers\n .get('content-type')\n ?.startsWith('text/html');\n\n // Only fallback to generated tokens for HTML responses.\n // This ensures that non-HTML responses (e.g. JSON, React Router streaming)\n // don't get unexpected _y/_s values. These values might be used by the\n // browser to set cookies and track the user session if consent is allowed\n // by default in their store settings (otherwise these values are dropped).\n const fallbackValues = isDocumentResponse\n ? ({_y: uniqueToken, _s: visitToken} satisfies TrackedTimingsRecord)\n : undefined;\n\n // Forward tracking values via server-timing from subrequests,\n // and fallback to the ones generated in the current request.\n appendServerTimingHeader(response, {\n ...fallbackValues,\n ...serverTiming,\n } satisfies TrackedTimingsRecord);\n\n // Optimization: We set this flag to indicate that the tracking work was done\n // in the server to skip an extra request from the browser. Conditions:\n // If any of these conditions are not met, the browser will perform\n // a request to the SFAPI proxy to get all the necessary cookies and values.\n if (\n isDocumentResponse &&\n collectedSubrequestHeaders &&\n // _shopify_essential cookie is always set, but we need more than that\n collectedSubrequestHeaders.setCookie.length > 1 &&\n serverTiming?._y &&\n serverTiming?._s &&\n serverTiming?._cmp\n ) {\n // For all SF API requests (that aren't from cache), we expect _y and _s values, as well as the\n // _shopify_essential cookie to be returned. Even if we get responses from SF API requests that\n // are cache misses, we still may not get the _cmp value and the _shopify_marketing and _shopify_analytics cookies.\n // Therefore, even if we had >=1 non-cache hit SF API request, we may still need to make the browser\n // SF API request to the `consentManagement` endpoint in the SF API, which will give us the _cmp value\n // and set the _shopify_marketing and _shopify_analytics cookies if they are missing.\n appendServerTimingHeader(response, {\n [HYDROGEN_SERVER_TRACKING_KEY]: '1',\n });\n }\n },\n },\n };\n}\n\nconst getStackOffset =\n process.env.NODE_ENV === 'development'\n ? (query: string) => {\n let stackOffset = 0;\n if (/fragment CartApi(Query|Mutation) on Cart/.test(query)) {\n // The cart handler is wrapping storefront.query/mutate,\n // so we need to go up one more stack frame to show\n // the caller in /subrequest-profiler\n stackOffset = 1;\n }\n\n return stackOffset;\n }\n : undefined;\n\nexport function formatAPIResult<T>(\n data: T,\n errors: StorefrontApiErrors,\n): T & StorefrontError {\n return {\n ...data,\n ...(errors && {errors}),\n };\n}\n\nexport type CreateStorefrontClientForDocs<TI18n extends I18nBase> = {\n storefront?: StorefrontForDoc<TI18n>;\n};\n\nexport type StorefrontForDoc<TI18n extends I18nBase = I18nBase> = {\n /** The function to run a query on Storefront API. */\n query?: <TData = any>(\n query: string,\n options: StorefrontQueryOptionsForDocs,\n ) => Promise<TData & StorefrontError>;\n /** The function to run a mutation on Storefront API. */\n mutate?: <TData = any>(\n mutation: string,\n options: StorefrontMutationOptionsForDocs,\n ) => Promise<TData & StorefrontError>;\n /** The cache instance passed in from the `createStorefrontClient` argument. */\n cache?: Cache;\n /** Re-export of [`CacheNone`](/docs/api/hydrogen/utilities/cachenone). */\n CacheNone?: typeof CacheNone;\n /** Re-export of [`CacheLong`](/docs/api/hydrogen/utilities/cachelong). */\n CacheLong?: typeof CacheLong;\n /** Re-export of [`CacheShort`](/docs/api/hydrogen/utilities/cacheshort). */\n CacheShort?: typeof CacheShort;\n /** Re-export of [`CacheCustom`](/docs/api/hydrogen/utilities/cachecustom). */\n CacheCustom?: typeof CacheCustom;\n /** Re-export of [`generateCacheControlHeader`](/docs/api/hydrogen/utilities/generatecachecontrolheader). */\n generateCacheControlHeader?: typeof generateCacheControlHeader;\n /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint. See [`getPublicTokenHeaders` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=%27graphql%27.-,getPublicTokenHeaders,-(props%3F%3A) for more details. */\n getPublicTokenHeaders?: ReturnType<\n typeof createStorefrontUtilities\n >['getPublicTokenHeaders'];\n /** Returns an object that contains headers that are needed for each query to Storefront API GraphQL endpoint for API calls made from a server. See [`getPrivateTokenHeaders` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=storefrontApiVersion-,getPrivateTokenHeaders,-(props%3F%3A) for more details.*/\n getPrivateTokenHeaders?: ReturnType<\n typeof createStorefrontUtilities\n >['getPrivateTokenHeaders'];\n /** Creates the fully-qualified URL to your myshopify.com domain. See [`getShopifyDomain` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=StorefrontClientReturn-,getShopifyDomain,-(props%3F%3A) for more details. */\n getShopifyDomain?: ReturnType<\n typeof createStorefrontUtilities\n >['getShopifyDomain'];\n /** Creates the fully-qualified URL to your store's GraphQL endpoint. See [`getStorefrontApiUrl` in Hydrogen React](/docs/api/hydrogen-react/2025-07/utilities/createstorefrontclient#:~:text=storeDomain-,getStorefrontApiUrl,-(props%3F%3A) for more details.*/\n getApiUrl?: ReturnType<\n typeof createStorefrontUtilities\n >['getStorefrontApiUrl'];\n /** The `i18n` object passed in from the `createStorefrontClient` argument. */\n i18n?: TI18n;\n};\n\nexport type StorefrontQueryOptionsForDocs = {\n /** The variables for the GraphQL query statement. */\n variables?: Record<string, unknown>;\n /** The cache strategy for this query. Default to max-age=1, stale-while-revalidate=86399. */\n cache?: CachingStrategy;\n /** Additional headers for this query. */\n headers?: HeadersInit;\n /** Override the Storefront API version for this query. */\n storefrontApiVersion?: string;\n /** The name of the query for debugging in the Subrequest Profiler. */\n displayName?: string;\n};\n\nexport type StorefrontMutationOptionsForDocs = {\n /** The variables for the GraphQL mutation statement. */\n variables?: Record<string, unknown>;\n /** Additional headers for this query. */\n headers?: HeadersInit;\n /** Override the Storefront API version for this query. */\n storefrontApiVersion?: string;\n /** The name of the query for debugging in the Subrequest Profiler. */\n displayName?: string;\n};\n","import {formatAPIResult} from '../../storefront';\nimport type {CustomerAccount} from '../../customer/types';\nimport type {CartQueryOptions, CartReturn} from './cart-types';\nimport type {\n Cart,\n CountryCode,\n LanguageCode,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\ntype CartGetProps = {\n /**\n * The cart ID.\n * @default cart.getCartId();\n */\n cartId?: string;\n /**\n * The country code.\n * @default storefront.i18n.country\n */\n country?: CountryCode;\n /**\n * The language code.\n * @default storefront.i18n.language\n */\n language?: LanguageCode;\n /**\n * The number of cart lines to be returned.\n * @default 100\n */\n numCartLines?: number;\n};\n\nexport type CartGetFunction = (\n cartInput?: CartGetProps,\n) => Promise<CartReturn | null>;\n\ntype CartGetOptions = CartQueryOptions & {\n /**\n * The customer account client instance created by [`createCustomerAccountClient`](docs/api/hydrogen/latest/utilities/createcustomeraccountclient).\n */\n customerAccount?: CustomerAccount;\n};\n\nexport function cartGetDefault({\n storefront,\n customerAccount,\n getCartId,\n cartFragment,\n}: CartGetOptions): CartGetFunction {\n return async (cartInput?: CartGetProps) => {\n const cartId = getCartId();\n\n if (!cartId) return null;\n\n const [isCustomerLoggedIn, {cart, errors}] = await Promise.all([\n customerAccount ? customerAccount.isLoggedIn() : false,\n storefront.query<{cart: Cart | null}>(CART_QUERY(cartFragment), {\n variables: {cartId, ...cartInput},\n cache: storefront.CacheNone(),\n }),\n ]);\n\n if (isCustomerLoggedIn && cart?.checkoutUrl) {\n const finalCheckoutUrl = new URL(cart.checkoutUrl);\n finalCheckoutUrl.searchParams.set('logged_in', 'true');\n cart.checkoutUrl = finalCheckoutUrl.toString();\n }\n\n return cart || errors ? formatAPIResult(cart, errors) : null;\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/queries/cart\nconst CART_QUERY = (cartFragment = DEFAULT_CART_FRAGMENT) => `#graphql\n query CartQuery(\n $cartId: ID!\n $numCartLines: Int = 100\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cart(id: $cartId) {\n ...CartApiQuery\n }\n }\n\n ${cartFragment}\n`;\n\nexport const DEFAULT_CART_FRAGMENT = `#graphql\n fragment CartApiQuery on Cart {\n updatedAt\n id\n checkoutUrl\n totalQuantity\n buyerIdentity {\n countryCode\n customer {\n id\n email\n firstName\n lastName\n displayName\n }\n email\n phone\n }\n lines(first: $numCartLines) {\n edges {\n node {\n id\n quantity\n attributes {\n key\n value\n }\n cost {\n totalAmount {\n amount\n currencyCode\n }\n amountPerQuantity {\n amount\n currencyCode\n }\n compareAtAmountPerQuantity {\n amount\n currencyCode\n }\n }\n merchandise {\n ... on ProductVariant {\n id\n availableForSale\n compareAtPrice {\n ...CartApiMoney\n }\n price {\n ...CartApiMoney\n }\n requiresShipping\n title\n image {\n ...CartApiImage\n }\n product {\n handle\n title\n id\n vendor\n }\n selectedOptions {\n name\n value\n }\n }\n }\n }\n }\n }\n cost {\n subtotalAmount {\n ...CartApiMoney\n }\n totalAmount {\n ...CartApiMoney\n }\n totalDutyAmount {\n ...CartApiMoney\n }\n totalTaxAmount {\n ...CartApiMoney\n }\n }\n note\n attributes {\n key\n value\n }\n discountCodes {\n applicable\n code\n }\n appliedGiftCards {\n id\n lastCharacters\n amountUsed {\n ...CartApiMoney\n }\n }\n }\n\n fragment CartApiMoney on MoneyV2 {\n currencyCode\n amount\n }\n\n fragment CartApiImage on Image {\n id\n url\n altText\n width\n height\n }\n`;\n","export const USER_ERROR_FRAGMENT = `#graphql\n fragment CartApiError on CartUserError {\n message\n field\n code\n }\n`;\n\nexport const MINIMAL_CART_FRAGMENT = `#graphql\n fragment CartApiMutation on Cart {\n id\n totalQuantity\n checkoutUrl\n }\n`;\n\nexport const CART_WARNING_FRAGMENT = `#graphql\n fragment CartApiWarning on CartWarning {\n code\n message\n target\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartQueryData,\n CartQueryOptions,\n CartOptionalInput,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {CartInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartCreateFunction = (\n input: CartInput,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartCreateDefault(\n options: CartQueryOptions,\n): CartCreateFunction {\n return async (input, optionalParams) => {\n const buyer = options.customerAccount\n ? await options.customerAccount.getBuyer()\n : undefined;\n const {cartId, ...restOfOptionalParams} = optionalParams || {};\n const {buyerIdentity, ...restOfInput} = input;\n const {cartCreate, errors} = await options.storefront.mutate<{\n cartCreate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_CREATE_MUTATION(options.cartFragment), {\n variables: {\n input: {\n ...restOfInput,\n buyerIdentity: {\n ...buyer,\n ...buyerIdentity,\n },\n },\n ...restOfOptionalParams,\n },\n });\n return formatAPIResult(cartCreate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartCreate\nexport const CART_CREATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartCreate(\n $input: CartInput!\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartCreate(input: $input) {\n cart {\n ...CartApiMutation\n checkoutUrl\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import type {CartLineInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartLinesAddFunction = (\n lines: Array<CartLineInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesAddDefault(\n options: CartQueryOptions,\n): CartLinesAddFunction {\n return async (lines, optionalParams) => {\n const {cartLinesAdd, errors} = await options.storefront.mutate<{\n cartLinesAdd: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_ADD_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lines,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartLinesAdd, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesAdd\nexport const CART_LINES_ADD_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesAdd(\n $cartId: ID!\n $lines: [CartLineInput!]!\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartLinesAdd(cartId: $cartId, lines: $lines) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import type {CartLineUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nconst PENDING_PREFIX = '__h_pending_';\n\nexport function getOptimisticLineId(variantId: string) {\n return PENDING_PREFIX + variantId;\n}\n\nexport function isOptimisticLineId(lineId: string) {\n return lineId.startsWith(PENDING_PREFIX);\n}\n\nexport function throwIfLinesAreOptimistic(\n type: string,\n lines: CartLineUpdateInput[] | string[],\n) {\n if (\n lines.some((line) =>\n isOptimisticLineId(typeof line === 'string' ? line : line.id),\n )\n ) {\n throw new Error(\n `Tried to perform an action on an optimistic line. Make sure to disable your \"${type}\" CartForm action when the line is optimistic.`,\n );\n }\n}\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {throwIfLinesAreOptimistic} from '../optimistic/optimistic-cart.helper';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartLineUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartLinesUpdateFunction = (\n lines: CartLineUpdateInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesUpdateDefault(\n options: CartQueryOptions,\n): CartLinesUpdateFunction {\n return async (lines, optionalParams) => {\n throwIfLinesAreOptimistic('updateLines', lines);\n\n const {cartLinesUpdate, errors} = await options.storefront.mutate<{\n cartLinesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lines,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartLinesUpdate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesUpdate\nexport const CART_LINES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesUpdate(\n $cartId: ID!\n $lines: [CartLineUpdateInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartLinesUpdate(cartId: $cartId, lines: $lines) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {throwIfLinesAreOptimistic} from '../optimistic/optimistic-cart.helper';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartLinesRemoveFunction = (\n lineIds: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartLinesRemoveDefault(\n options: CartQueryOptions,\n): CartLinesRemoveFunction {\n return async (lineIds, optionalParams) => {\n throwIfLinesAreOptimistic('removeLines', lineIds);\n\n const {cartLinesRemove, errors} = await options.storefront.mutate<{\n cartLinesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_LINES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n lineIds,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartLinesRemove, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartLinesRemove\nexport const CART_LINES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartLinesRemove(\n $cartId: ID!\n $lineIds: [ID!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartLinesRemove(cartId: $cartId, lineIds: $lineIds) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDiscountCodesUpdateFunction = (\n discountCodes: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartDiscountCodesUpdateDefault(\n options: CartQueryOptions,\n): CartDiscountCodesUpdateFunction {\n return async (discountCodes, optionalParams) => {\n // Ensure the discount codes are unique\n const uniqueCodes = discountCodes.filter((value, index, array) => {\n return array.indexOf(value) === index;\n });\n\n const {cartDiscountCodesUpdate, errors} = await options.storefront.mutate<{\n cartDiscountCodesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DISCOUNT_CODE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n discountCodes: uniqueCodes,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartDiscountCodesUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartDiscountCodesUpdate\nexport const CART_DISCOUNT_CODE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDiscountCodesUpdate(\n $cartId: ID!\n $discountCodes: [String!]\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartDiscountCodesUpdate(cartId: $cartId, discountCodes: $discountCodes) {\n ... @defer {\n cart {\n ...CartApiMutation\n }\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartBuyerIdentityUpdateFunction = (\n buyerIdentity: CartBuyerIdentityInput,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartBuyerIdentityUpdateDefault(\n options: CartQueryOptions,\n): CartBuyerIdentityUpdateFunction {\n return async (buyerIdentity, optionalParams) => {\n if (buyerIdentity.companyLocationId && options.customerAccount) {\n options.customerAccount.setBuyer({\n companyLocationId: buyerIdentity.companyLocationId,\n });\n }\n\n const buyer = options.customerAccount\n ? await options.customerAccount.getBuyer()\n : undefined;\n\n const {cartBuyerIdentityUpdate, errors} = await options.storefront.mutate<{\n cartBuyerIdentityUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_BUYER_IDENTITY_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n buyerIdentity: {\n ...buyer,\n ...buyerIdentity,\n },\n ...optionalParams,\n },\n });\n return formatAPIResult(cartBuyerIdentityUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartBuyerIdentityUpdate\nexport const CART_BUYER_IDENTITY_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartBuyerIdentityUpdate(\n $cartId: ID!\n $buyerIdentity: CartBuyerIdentityInput!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartBuyerIdentityUpdate(cartId: $cartId, buyerIdentity: $buyerIdentity) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartNoteUpdateFunction = (\n note: string,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartNoteUpdateDefault(\n options: CartQueryOptions,\n): CartNoteUpdateFunction {\n return async (note, optionalParams) => {\n const {cartNoteUpdate, errors} = await options.storefront.mutate<{\n cartNoteUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_NOTE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n note,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartNoteUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartNoteUpdate\nexport const CART_NOTE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartNoteUpdate(\n $cartId: ID!\n $note: String!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartNoteUpdate(cartId: $cartId, note: $note) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {CartSelectedDeliveryOptionInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartSelectedDeliveryOptionsUpdateFunction = (\n selectedDeliveryOptions: CartSelectedDeliveryOptionInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartSelectedDeliveryOptionsUpdateDefault(\n options: CartQueryOptions,\n): CartSelectedDeliveryOptionsUpdateFunction {\n return async (selectedDeliveryOptions, optionalParams) => {\n const {cartSelectedDeliveryOptionsUpdate, errors} =\n await options.storefront.mutate<{\n cartSelectedDeliveryOptionsUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_SELECTED_DELIVERY_OPTIONS_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n selectedDeliveryOptions,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartSelectedDeliveryOptionsUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartSelectedDeliveryOptionsUpdate\nexport const CART_SELECTED_DELIVERY_OPTIONS_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartSelectedDeliveryOptionsUpdate(\n $cartId: ID!\n $selectedDeliveryOptions: [CartSelectedDeliveryOptionInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartSelectedDeliveryOptionsUpdate(cartId: $cartId, selectedDeliveryOptions: $selectedDeliveryOptions) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\nimport type {AttributeInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartAttributesUpdateFunction = (\n attributes: AttributeInput[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartAttributesUpdateDefault(\n options: CartQueryOptions,\n): CartAttributesUpdateFunction {\n return async (attributes, optionalParams) => {\n const {cartAttributesUpdate, errors} = await options.storefront.mutate<{\n cartAttributesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_ATTRIBUTES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: optionalParams?.cartId || options.getCartId(),\n attributes,\n },\n });\n return formatAPIResult(cartAttributesUpdate, errors);\n };\n}\n\nexport const CART_ATTRIBUTES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartAttributesUpdate(\n $cartId: ID!\n $attributes: [AttributeInput!]!\n ) {\n cartAttributesUpdate(cartId: $cartId, attributes: $attributes) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {\n CartOptionalInput,\n CartQueryOptions,\n MetafieldWithoutOwnerId,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {\n Cart,\n MetafieldsSetUserError,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartMetafieldsSetFunction = (\n metafields: MetafieldWithoutOwnerId[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartMetafieldsSetDefault(\n options: CartQueryOptions,\n): CartMetafieldsSetFunction {\n return async (metafields, optionalParams) => {\n const ownerId = optionalParams?.cartId || options.getCartId();\n const metafieldsWithOwnerId = metafields.map(\n (metafield: MetafieldWithoutOwnerId) => ({\n ...metafield,\n ownerId,\n }),\n );\n const {cartMetafieldsSet, errors} = await options.storefront.mutate<{\n cartMetafieldsSet: {\n userErrors: MetafieldsSetUserError[];\n };\n errors: StorefrontApiErrors;\n }>(CART_METAFIELD_SET_MUTATION(), {\n variables: {metafields: metafieldsWithOwnerId},\n });\n\n return formatAPIResult(\n {\n cart: {\n id: ownerId,\n } as Cart,\n ...cartMetafieldsSet,\n },\n errors,\n );\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartMetafieldsSet\nexport const CART_METAFIELD_SET_MUTATION = () => `#graphql\n mutation cartMetafieldsSet(\n $metafields: [CartMetafieldsSetInput!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartMetafieldsSet(metafields: $metafields) {\n userErrors {\n code\n elementIndex\n field\n message\n }\n }\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {\n CartQueryOptions,\n CartOptionalInput,\n CartQueryDataReturn,\n} from './cart-types';\nimport type {\n Cart,\n MetafieldDeleteUserError,\n Scalars,\n} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartMetafieldDeleteFunction = (\n key: Scalars['String']['input'],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartMetafieldDeleteDefault(\n options: CartQueryOptions,\n): CartMetafieldDeleteFunction {\n return async (key, optionalParams) => {\n const ownerId = optionalParams?.cartId || options.getCartId();\n const {cartMetafieldDelete, errors} = await options.storefront.mutate<{\n cartMetafieldDelete: {\n userErrors: MetafieldDeleteUserError[];\n };\n errors: StorefrontApiErrors;\n }>(CART_METAFIELD_DELETE_MUTATION(), {\n variables: {\n input: {\n ownerId,\n key,\n },\n },\n });\n return formatAPIResult(\n {\n cart: {\n id: ownerId,\n } as Cart,\n ...cartMetafieldDelete,\n },\n errors,\n );\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/2025-07/mutations/cartMetafieldDelete\nexport const CART_METAFIELD_DELETE_MUTATION = () => `#graphql\n mutation cartMetafieldDelete(\n $input: CartMetafieldDeleteInput!\n ) {\n cartMetafieldDelete(input: $input) {\n userErrors {\n code\n field\n message\n }\n }\n }\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartGiftCardCodesUpdateFunction = (\n giftCardCodes: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartGiftCardCodesUpdateDefault(\n options: CartQueryOptions,\n): CartGiftCardCodesUpdateFunction {\n return async (giftCardCodes, optionalParams) => {\n // Ensure the gift card codes are unique\n const uniqueCodes = giftCardCodes.filter((value, index, array) => {\n return array.indexOf(value) === index;\n });\n\n const {cartGiftCardCodesUpdate, errors} = await options.storefront.mutate<{\n cartGiftCardCodesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_GIFT_CARD_CODE_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n giftCardCodes: uniqueCodes,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartGiftCardCodesUpdate, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesUpdate\nexport const CART_GIFT_CARD_CODE_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartGiftCardCodesUpdate(\n $cartId: ID!\n $giftCardCodes: [String!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartGiftCardCodesUpdate(cartId: $cartId, giftCardCodes: $giftCardCodes) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartGiftCardCodesRemoveFunction = (\n appliedGiftCardIds: string[],\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\nexport function cartGiftCardCodesRemoveDefault(\n options: CartQueryOptions,\n): CartGiftCardCodesRemoveFunction {\n return async (appliedGiftCardIds, optionalParams) => {\n const {cartGiftCardCodesRemove, errors} = await options.storefront.mutate<{\n cartGiftCardCodesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_GIFT_CARD_CODES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n appliedGiftCardIds,\n ...optionalParams,\n },\n });\n return formatAPIResult(cartGiftCardCodesRemove, errors);\n };\n}\n\n//! @see https://shopify.dev/docs/api/storefront/latest/mutations/cartGiftCardCodesRemove\nexport const CART_GIFT_CARD_CODES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartGiftCardCodesRemove(\n $cartId: ID!\n $appliedGiftCardIds: [ID!]!\n $language: LanguageCode\n $country: CountryCode\n ) @inContext(country: $country, language: $language) {\n cartGiftCardCodesRemove(cartId: $cartId, appliedGiftCardIds: $appliedGiftCardIds) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {CartSelectableAddressInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesAddFunction = (\n addresses: Array<CartSelectableAddressInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Adds delivery addresses to the cart.\n *\n * This function sends a mutation to the storefront API to add one or more delivery addresses to the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressAddFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const addDeliveryAddresses = cartDeliveryAddressesAddDefault({ storefront, getCartId });\n * const result = await addDeliveryAddresses([\n * {\n * address1: '123 Main St',\n * city: 'Anytown',\n * countryCode: 'US'\n * // other address fields...\n * }\n * ], { someOptionalParam: 'value' }\n * );\n */\nexport function cartDeliveryAddressesAddDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesAddFunction {\n return async (\n addresses: Array<CartSelectableAddressInput>,\n optionalParams,\n ) => {\n const {cartDeliveryAddressesAdd, errors} = await options.storefront.mutate<{\n cartDeliveryAddressesAdd: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_ADD_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addresses,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesAdd, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesAdd\nexport const CART_DELIVERY_ADDRESSES_ADD_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesAdd(\n $cartId: ID!\n $addresses: [CartSelectableAddressInput!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesAdd(addresses: $addresses, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {Scalars} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesRemoveFunction = (\n addressIds: Array<Scalars['ID']['input']> | Array<string>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Removes delivery addresses from the cart.\n *\n * This function sends a mutation to the storefront API to remove one or more delivery addresses from the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressRemoveFunction} - A function that takes an array of address IDs and optional parameters, and returns the result of the API call.\n *\n * @example\n * const removeDeliveryAddresses = cartDeliveryAddressesRemoveDefault({ storefront, getCartId });\n * const result = await removeDeliveryAddresses([\n * \"gid://shopify/<objectName>/10079785100\"\n * ],\n * { someOptionalParam: 'value' });\n */\nexport function cartDeliveryAddressesRemoveDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesRemoveFunction {\n return async (\n addressIds: Array<Scalars['ID']['input']> | string[],\n optionalParams,\n ) => {\n const {cartDeliveryAddressesRemove, errors} =\n await options.storefront.mutate<{\n cartDeliveryAddressesRemove: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_REMOVE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addressIds,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesRemove, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesRemove\nexport const CART_DELIVERY_ADDRESSES_REMOVE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesRemove(\n $cartId: ID!\n $addressIds: [ID!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesRemove(addressIds: $addressIds, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {StorefrontApiErrors, formatAPIResult} from '../../storefront';\nimport type {CartSelectableAddressUpdateInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n CART_WARNING_FRAGMENT,\n MINIMAL_CART_FRAGMENT,\n USER_ERROR_FRAGMENT,\n} from './cart-fragments';\nimport type {\n CartOptionalInput,\n CartQueryData,\n CartQueryDataReturn,\n CartQueryOptions,\n} from './cart-types';\n\nexport type CartDeliveryAddressesUpdateFunction = (\n addresses: Array<CartSelectableAddressUpdateInput>,\n optionalParams?: CartOptionalInput,\n) => Promise<CartQueryDataReturn>;\n\n/**\n * Updates delivery addresses in the cart.\n *\n * This function sends a mutation to the storefront API to update one or more delivery addresses in the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressUpdateFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const updateAddresses = cartDeliveryAddressesUpdateDefault(cartQueryOptions);\n * const result = await updateAddresses([\n {\n \"address\": {\n \"copyFromCustomerAddressId\": \"gid://shopify/<objectName>/10079785100\",\n \"deliveryAddress\": {\n \"address1\": \"<your-address1>\",\n \"address2\": \"<your-address2>\",\n \"city\": \"<your-city>\",\n \"company\": \"<your-company>\",\n \"countryCode\": \"AC\",\n \"firstName\": \"<your-firstName>\",\n \"lastName\": \"<your-lastName>\",\n \"phone\": \"<your-phone>\",\n \"provinceCode\": \"<your-provinceCode>\",\n \"zip\": \"<your-zip>\"\n }\n },\n \"id\": \"gid://shopify/<objectName>/10079785100\",\n \"oneTimeUse\": true,\n \"selected\": true,\n \"validationStrategy\": \"COUNTRY_CODE_ONLY\"\n }\n ],{ someOptionalParam: 'value' });\n */\nexport function cartDeliveryAddressesUpdateDefault(\n options: CartQueryOptions,\n): CartDeliveryAddressesUpdateFunction {\n return async (\n addresses: Array<CartSelectableAddressUpdateInput>,\n optionalParams,\n ) => {\n const {cartDeliveryAddressesUpdate, errors} =\n await options.storefront.mutate<{\n cartDeliveryAddressesUpdate: CartQueryData;\n errors: StorefrontApiErrors;\n }>(CART_DELIVERY_ADDRESSES_UPDATE_MUTATION(options.cartFragment), {\n variables: {\n cartId: options.getCartId(),\n addresses,\n ...optionalParams,\n },\n });\n\n return formatAPIResult(cartDeliveryAddressesUpdate, errors);\n };\n}\n\n//! @see: https://shopify.dev/docs/api/storefront/latest/mutations/cartDeliveryAddressesUpdate\nexport const CART_DELIVERY_ADDRESSES_UPDATE_MUTATION = (\n cartFragment = MINIMAL_CART_FRAGMENT,\n) => `#graphql\n mutation cartDeliveryAddressesUpdate(\n $cartId: ID!\n $addresses: [CartSelectableAddressUpdateInput!]!,\n $country: CountryCode = ZZ\n $language: LanguageCode\n ) @inContext(country: $country, language: $language) {\n cartDeliveryAddressesUpdate(addresses: $addresses, cartId: $cartId) {\n cart {\n ...CartApiMutation\n }\n userErrors {\n ...CartApiError\n }\n warnings {\n ...CartApiWarning\n }\n }\n }\n ${cartFragment}\n ${USER_ERROR_FRAGMENT}\n ${CART_WARNING_FRAGMENT}\n`;\n","import {Storefront} from '../storefront';\nimport type {CustomerAccount} from '../customer/types';\nimport {type CartGetFunction, cartGetDefault} from './queries/cartGetDefault';\nimport {\n type CartCreateFunction,\n cartCreateDefault,\n} from './queries/cartCreateDefault';\nimport {\n type CartLinesAddFunction,\n cartLinesAddDefault,\n} from './queries/cartLinesAddDefault';\nimport {\n type CartLinesUpdateFunction,\n cartLinesUpdateDefault,\n} from './queries/cartLinesUpdateDefault';\nimport {\n type CartLinesRemoveFunction,\n cartLinesRemoveDefault,\n} from './queries/cartLinesRemoveDefault';\nimport {\n type CartDiscountCodesUpdateFunction,\n cartDiscountCodesUpdateDefault,\n} from './queries/cartDiscountCodesUpdateDefault';\nimport {\n type CartBuyerIdentityUpdateFunction,\n cartBuyerIdentityUpdateDefault,\n} from './queries/cartBuyerIdentityUpdateDefault';\nimport {\n type CartNoteUpdateFunction,\n cartNoteUpdateDefault,\n} from './queries/cartNoteUpdateDefault';\nimport {\n type CartSelectedDeliveryOptionsUpdateFunction,\n cartSelectedDeliveryOptionsUpdateDefault,\n} from './queries/cartSelectedDeliveryOptionsUpdateDefault';\nimport {\n type CartAttributesUpdateFunction,\n cartAttributesUpdateDefault,\n} from './queries/cartAttributesUpdateDefault';\nimport {\n type CartMetafieldsSetFunction,\n cartMetafieldsSetDefault,\n} from './queries/cartMetafieldsSetDefault';\nimport {\n type CartMetafieldDeleteFunction,\n cartMetafieldDeleteDefault,\n} from './queries/cartMetafieldDeleteDefault';\nimport {\n type CartGiftCardCodesUpdateFunction,\n cartGiftCardCodesUpdateDefault,\n} from './queries/cartGiftCardCodeUpdateDefault';\nimport {\n type CartGiftCardCodesRemoveFunction,\n cartGiftCardCodesRemoveDefault,\n} from './queries/cartGiftCardCodesRemoveDefault';\nimport {\n type CartDeliveryAddressesAddFunction,\n cartDeliveryAddressesAddDefault,\n} from './queries/cartDeliveryAddressesAddDefault';\nimport {\n type CartDeliveryAddressesRemoveFunction,\n cartDeliveryAddressesRemoveDefault,\n} from './queries/cartDeliveryAddressesRemoveDefault';\nimport {\n type CartDeliveryAddressesUpdateFunction,\n cartDeliveryAddressesUpdateDefault,\n} from './queries/cartDeliveryAddressesUpdateDefault';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\n\nexport type CartHandlerOptions = {\n storefront: Storefront;\n customerAccount?: CustomerAccount;\n getCartId: () => string | undefined;\n setCartId: (cartId: string) => Headers;\n cartQueryFragment?: string;\n cartMutateFragment?: string;\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport type CustomMethodsBase = Record<string, Function>;\nexport type CartHandlerOptionsWithCustom<\n TCustomMethods extends CustomMethodsBase,\n> = CartHandlerOptions & {\n customMethods?: TCustomMethods;\n};\n\nexport type HydrogenCart = {\n get: ReturnType<typeof cartGetDefault>;\n getCartId: () => string | undefined;\n setCartId: (cartId: string) => Headers;\n create: ReturnType<typeof cartCreateDefault>;\n addLines: ReturnType<typeof cartLinesAddDefault>;\n updateLines: ReturnType<typeof cartLinesUpdateDefault>;\n removeLines: ReturnType<typeof cartLinesRemoveDefault>;\n updateDiscountCodes: ReturnType<typeof cartDiscountCodesUpdateDefault>;\n updateGiftCardCodes: ReturnType<typeof cartGiftCardCodesUpdateDefault>;\n removeGiftCardCodes: ReturnType<typeof cartGiftCardCodesRemoveDefault>;\n updateBuyerIdentity: ReturnType<typeof cartBuyerIdentityUpdateDefault>;\n updateNote: ReturnType<typeof cartNoteUpdateDefault>;\n updateSelectedDeliveryOption: ReturnType<\n typeof cartSelectedDeliveryOptionsUpdateDefault\n >;\n updateAttributes: ReturnType<typeof cartAttributesUpdateDefault>;\n setMetafields: ReturnType<typeof cartMetafieldsSetDefault>;\n deleteMetafield: ReturnType<typeof cartMetafieldDeleteDefault>;\n /**\n * Adds delivery addresses to the cart.\n *\n * This function sends a mutation to the storefront API to add one or more delivery addresses to the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {ReturnType<typeof cartDeliveryAddressesAddDefault>} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * @example\n * const result = await cart.addDeliveryAddresses(\n * [\n * {\n * address1: '123 Main St',\n * city: 'Anytown',\n * countryCode: 'US'\n * }\n * ],\n * { someOptionalParam: 'value' }\n * );\n */\n addDeliveryAddresses: ReturnType<typeof cartDeliveryAddressesAddDefault>;\n /**\n * Removes delivery addresses from the cart.\n *\n * This function sends a mutation to the storefront API to remove one or more delivery addresses from the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressRemoveFunction} - A function that takes an array of address IDs and optional parameters, and returns the result of the API call.\n *\n * @example\n * const result = await cart.removeDeliveryAddresses([\n * \"gid://shopify/<objectName>/10079785100\"\n * ],\n * { someOptionalParam: 'value' });\n */\n\n removeDeliveryAddresses: ReturnType<\n typeof cartDeliveryAddressesRemoveDefault\n >;\n /**\n * Updates delivery addresses in the cart.\n *\n * This function sends a mutation to the storefront API to update one or more delivery addresses in the cart.\n * It returns the result of the mutation, including any errors that occurred.\n *\n * @param {CartQueryOptions} options - The options for the cart query, including the storefront API client and cart fragment.\n * @returns {CartDeliveryAddressUpdateFunction} - A function that takes an array of addresses and optional parameters, and returns the result of the API call.\n *\n * const result = await cart.updateDeliveryAddresses([\n {\n \"address\": {\n \"copyFromCustomerAddressId\": \"gid://shopify/<objectName>/10079785100\",\n \"deliveryAddress\": {\n \"address1\": \"<your-address1>\",\n \"address2\": \"<your-address2>\",\n \"city\": \"<your-city>\",\n \"company\": \"<your-company>\",\n \"countryCode\": \"AC\",\n \"firstName\": \"<your-firstName>\",\n \"lastName\": \"<your-lastName>\",\n \"phone\": \"<your-phone>\",\n \"provinceCode\": \"<your-provinceCode>\",\n \"zip\": \"<your-zip>\"\n }\n },\n \"id\": \"gid://shopify/<objectName>/10079785100\",\n \"oneTimeUse\": true,\n \"selected\": true,\n \"validationStrategy\": \"COUNTRY_CODE_ONLY\"\n }\n ],{ someOptionalParam: 'value' });\n */\n updateDeliveryAddresses: ReturnType<\n typeof cartDeliveryAddressesUpdateDefault\n >;\n};\n\nexport type HydrogenCartCustom<\n TCustomMethods extends Partial<HydrogenCart> & CustomMethodsBase,\n> = Omit<HydrogenCart, keyof TCustomMethods> & TCustomMethods;\nexport type CartHandlerReturn<TCustomMethods extends CustomMethodsBase> =\n | HydrogenCartCustom<TCustomMethods>\n | HydrogenCart;\n\nexport function createCartHandler(options: CartHandlerOptions): HydrogenCart;\nexport function createCartHandler<TCustomMethods extends CustomMethodsBase>(\n options: CartHandlerOptionsWithCustom<TCustomMethods>,\n): HydrogenCartCustom<TCustomMethods>;\nexport function createCartHandler<TCustomMethods extends CustomMethodsBase>(\n options: CartHandlerOptions | CartHandlerOptionsWithCustom<TCustomMethods>,\n): CartHandlerReturn<TCustomMethods> {\n const {\n getCartId: _getCartId,\n setCartId,\n storefront,\n customerAccount,\n cartQueryFragment,\n cartMutateFragment,\n buyerIdentity,\n } = options;\n\n let cartId = _getCartId();\n\n const getCartId = () => cartId || _getCartId();\n\n const mutateOptions = {\n storefront,\n getCartId,\n cartFragment: cartMutateFragment,\n customerAccount,\n };\n\n const _cartCreate = cartCreateDefault(mutateOptions);\n\n const cartCreate: CartCreateFunction = async function (...args) {\n // Default buyerIdentity to what is passed into the handler\n // Only override if buyerIdentity is passed directly to the method\n args[0].buyerIdentity = {\n ...buyerIdentity,\n ...args[0].buyerIdentity,\n };\n\n const result = await _cartCreate(...args);\n cartId = result?.cart?.id;\n return result;\n };\n\n const methods: HydrogenCart = {\n get: cartGetDefault({\n storefront,\n customerAccount,\n getCartId,\n cartFragment: cartQueryFragment,\n }),\n getCartId,\n setCartId,\n create: cartCreate,\n addLines: async (linesWithOptimisticData, optionalParams) => {\n const lines = linesWithOptimisticData.map((line) => {\n return {\n attributes: line.attributes,\n quantity: line.quantity,\n merchandiseId: line.merchandiseId,\n sellingPlanId: line.sellingPlanId,\n };\n });\n\n return cartId || optionalParams?.cartId\n ? await cartLinesAddDefault(mutateOptions)(lines, optionalParams)\n : await cartCreate({lines, buyerIdentity}, optionalParams);\n },\n updateLines: cartLinesUpdateDefault(mutateOptions),\n removeLines: cartLinesRemoveDefault(mutateOptions),\n updateDiscountCodes: async (discountCodes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartDiscountCodesUpdateDefault(mutateOptions)(\n discountCodes,\n optionalParams,\n )\n : await cartCreate({discountCodes}, optionalParams);\n },\n updateGiftCardCodes: async (giftCardCodes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartGiftCardCodesUpdateDefault(mutateOptions)(\n giftCardCodes,\n optionalParams,\n )\n : await cartCreate({giftCardCodes}, optionalParams);\n },\n removeGiftCardCodes: cartGiftCardCodesRemoveDefault(mutateOptions),\n updateBuyerIdentity: async (buyerIdentity, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartBuyerIdentityUpdateDefault(mutateOptions)(\n buyerIdentity,\n optionalParams,\n )\n : await cartCreate({buyerIdentity}, optionalParams);\n },\n updateNote: async (note, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartNoteUpdateDefault(mutateOptions)(note, optionalParams)\n : await cartCreate({note}, optionalParams);\n },\n updateSelectedDeliveryOption:\n cartSelectedDeliveryOptionsUpdateDefault(mutateOptions),\n updateAttributes: async (attributes, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartAttributesUpdateDefault(mutateOptions)(\n attributes,\n optionalParams,\n )\n : await cartCreate({attributes}, optionalParams);\n },\n setMetafields: async (metafields, optionalParams) => {\n return cartId || optionalParams?.cartId\n ? await cartMetafieldsSetDefault(mutateOptions)(\n metafields,\n optionalParams,\n )\n : await cartCreate({metafields}, optionalParams);\n },\n deleteMetafield: cartMetafieldDeleteDefault(mutateOptions),\n addDeliveryAddresses: cartDeliveryAddressesAddDefault(mutateOptions),\n removeDeliveryAddresses: cartDeliveryAddressesRemoveDefault(mutateOptions),\n updateDeliveryAddresses: cartDeliveryAddressesUpdateDefault(mutateOptions),\n };\n\n if ('customMethods' in options) {\n return {\n ...methods,\n ...(options.customMethods ?? {}),\n };\n } else {\n return methods;\n }\n}\n\nexport type CartHandlerOptionsForDocs<\n TCustomMethods extends CustomMethodsBase,\n> = {\n /**\n * A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`.\n */\n getCartId: () => string | undefined;\n /**\n * A function that sets the cart ID.\n */\n setCartId: (cartId: string) => Headers;\n /**\n * The storefront client instance created by [`createStorefrontClient`](docs/api/hydrogen/utilities/createstorefrontclient).\n */\n storefront: Storefront;\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n cartMutateFragment?: string;\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n cartQueryFragment?: string;\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: TCustomMethods;\n\n /**\n * Buyer identity. Default buyer identity is passed to cartCreate.\n */\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport type HydrogenCartForDocs = {\n /**\n * Adds items to the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n addLines?: CartLinesAddFunction;\n /**\n * Adds a delivery address to the cart.\n */\n addDeliveryAddresses?: CartDeliveryAddressesAddFunction;\n /**\n * Creates a new cart.\n */\n create?: CartCreateFunction;\n /**\n * Removes a custom field (metafield) from the cart.\n */\n deleteMetafield?: CartMetafieldDeleteFunction;\n /**\n * Retrieves the cart information.\n */\n get?: CartGetFunction;\n /**\n * Retrieves the unique identifier of the cart.\n * By default, it gets the ID from the request cookie.\n */\n getCartId?: () => string | undefined;\n /**\n * Removes a delivery address from the cart\n */\n removeDeliveryAddresses?: CartDeliveryAddressesRemoveFunction;\n /**\n * Removes items from the cart.\n */\n removeLines?: CartLinesRemoveFunction;\n /**\n * Sets the unique identifier of the cart.\n * By default, it sets the ID in the header cookie.\n */\n setCartId?: (cartId: string) => Headers;\n /**\n * Adds extra information (metafields) to the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n setMetafields?: CartMetafieldsSetFunction;\n /**\n * Update cart delivery addresses.\n */\n updateDeliveryAddresses?: CartDeliveryAddressesUpdateFunction;\n /**\n * Updates additional information (attributes) in the cart.\n */\n updateAttributes?: CartAttributesUpdateFunction;\n /**\n * Updates the buyer's information in the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n updateBuyerIdentity?: CartBuyerIdentityUpdateFunction;\n /**\n * Updates discount codes in the cart.\n */\n updateDiscountCodes?: CartDiscountCodesUpdateFunction;\n /**\n * Updates gift card codes in the cart.\n */\n updateGiftCardCodes?: CartGiftCardCodesUpdateFunction;\n /**\n * Removes gift card codes from the cart.\n */\n removeGiftCardCodes?: CartGiftCardCodesRemoveFunction;\n /**\n * Updates items in the cart.\n */\n updateLines?: CartLinesUpdateFunction;\n /**\n * Updates the note in the cart.\n * If the cart doesn't exist, a new one will be created.\n */\n updateNote?: CartNoteUpdateFunction;\n /**\n * Updates the selected delivery options in the cart.\n * Only available for carts associated with a customer access token.\n */\n updateSelectedDeliveryOption?: CartSelectedDeliveryOptionsUpdateFunction;\n};\n","import {useFetchers} from 'react-router';\nimport {CartForm} from '../CartForm';\nimport type {\n CartLine,\n ProductVariant,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {\n getOptimisticLineId,\n isOptimisticLineId,\n} from './optimistic-cart.helper';\nimport type {PartialDeep} from 'type-fest';\nimport type {CartReturn} from '../queries/cart-types';\n\ntype LikeACart = {\n lines: {\n nodes: Array<unknown>;\n };\n};\n\nexport type OptimisticCartLine<T = CartLine | CartReturn> = T extends LikeACart\n ? T['lines']['nodes'][number] & {isOptimistic?: boolean}\n : T & {isOptimistic?: boolean};\n\nexport type OptimisticCart<T = CartReturn> = T extends undefined | null\n ? // This is the null/undefined case, where the cart has yet to be created.\n // But we still need to provide an optimistic cart object.\n {\n isOptimistic?: boolean;\n lines: {\n nodes: Array<OptimisticCartLine>;\n };\n totalQuantity?: number;\n } & Omit<PartialDeep<CartReturn>, 'lines'>\n : Omit<T, 'lines'> & {\n isOptimistic?: boolean;\n lines: {\n nodes: Array<OptimisticCartLine<T>>;\n };\n totalQuantity?: number;\n };\n\n/**\n * @param cart The cart object from `context.cart.get()` returned by a server loader.\n *\n * @returns A new cart object augmented with optimistic state for `lines` and `totalQuantity`. Each cart line item that is optimistically added includes an `isOptimistic` property. Also if the cart has _any_ optimistic state, a root property `isOptimistic` will be set to `true`.\n */\nexport function useOptimisticCart<\n DefaultCart = {\n lines?: {\n nodes: Array<{id: string; quantity: number; merchandise: {is: string}}>;\n };\n },\n>(cart?: DefaultCart): OptimisticCart<DefaultCart> {\n const fetchers = useFetchers();\n\n if (!fetchers || !fetchers.length) return cart as OptimisticCart<DefaultCart>;\n\n const optimisticCart = (cart as CartReturn)?.lines\n ? (structuredClone(cart) as OptimisticCart<DefaultCart>)\n : ({lines: {nodes: []}} as unknown as OptimisticCart<DefaultCart>);\n\n const cartLines = optimisticCart.lines.nodes as OptimisticCartLine[];\n\n let isOptimistic = false;\n\n for (const {formData} of fetchers) {\n if (!formData) continue;\n\n const cartFormData = CartForm.getFormInput(formData);\n\n if (cartFormData.action === CartForm.ACTIONS.LinesAdd) {\n for (const input of cartFormData.inputs.lines) {\n if (!input.selectedVariant) {\n console.error(\n '[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',\n );\n continue;\n }\n\n const existingLine = cartLines.find(\n (line) =>\n line.merchandise.id ===\n (input.selectedVariant as ProductVariant)?.id,\n );\n\n isOptimistic = true;\n\n if (existingLine) {\n existingLine.quantity =\n (existingLine.quantity || 1) + (input.quantity || 1);\n existingLine.isOptimistic = true;\n } else {\n cartLines.unshift({\n id: getOptimisticLineId((input.selectedVariant as any).id),\n merchandise: input.selectedVariant,\n isOptimistic: true,\n quantity: input.quantity || 1,\n } as CartLine & {isOptimistic?: boolean});\n }\n }\n } else if (cartFormData.action === CartForm.ACTIONS.LinesRemove) {\n for (const lineId of cartFormData.inputs.lineIds) {\n const index = cartLines.findIndex((line) => line.id === lineId);\n\n if (index !== -1) {\n if (isOptimisticLineId(cartLines[index].id)) {\n console.error(\n '[h2:error:useOptimisticCart] Tried to remove an optimistic line that has not been added to the cart yet',\n );\n continue;\n }\n\n cartLines.splice(index, 1);\n isOptimistic = true;\n } else {\n console.warn(\n `[h2:warn:useOptimisticCart] Tried to remove line '${lineId}' but it doesn't exist in the cart`,\n );\n }\n }\n } else if (cartFormData.action === CartForm.ACTIONS.LinesUpdate) {\n for (const line of cartFormData.inputs.lines) {\n const index = cartLines.findIndex(\n (optimisticLine) => line.id === optimisticLine.id,\n );\n\n if (index > -1) {\n if (isOptimisticLineId(cartLines[index].id)) {\n console.error(\n '[h2:error:useOptimisticCart] Tried to update an optimistic line that has not been added to the cart yet',\n );\n continue;\n }\n\n cartLines[index].quantity = line.quantity as number;\n\n if (cartLines[index].quantity === 0) {\n cartLines.splice(index, 1);\n }\n\n isOptimistic = true;\n } else {\n console.warn(\n `[h2:warn:useOptimisticCart] Tried to update line '${line.id}' but it doesn't exist in the cart`,\n );\n }\n }\n }\n }\n\n if (isOptimistic) {\n optimisticCart.isOptimistic = isOptimistic;\n }\n\n // Calculate the total quantity of the optimistic cart\n optimisticCart.totalQuantity = cartLines.reduce(\n (sum, line) => sum + line.quantity,\n 0,\n );\n\n return optimisticCart;\n}\n","const DEFAULT_GITHUB_CHANGELOG_URL =\n 'https://raw.githubusercontent.com/Shopify/hydrogen/main/docs/changelog.json';\n\n/**\n * A custom Remix loader handler that fetches the changelog.json from GitHub.\n * It is used by the `upgrade` command inside the route `https://hydrogen.shopify.dev/changelog.json`\n */\nexport async function changelogHandler({\n request,\n changelogUrl,\n}: {\n request: Request;\n changelogUrl?: string;\n}) {\n const searchParams = new URL(request.url).searchParams;\n const GITHUB_CHANGELOG_URL = changelogUrl || DEFAULT_GITHUB_CHANGELOG_URL;\n return fetch(GITHUB_CHANGELOG_URL);\n}\n","import {createContext} from 'react-router';\nimport type {StorefrontClient, I18nBase} from './storefront';\nimport type {CustomerAccount} from './customer/types';\nimport type {\n HydrogenCart,\n HydrogenCartCustom,\n CustomMethodsBase,\n} from './cart/createCartHandler';\nimport type {HydrogenEnv, HydrogenSession, WaitUntil} from './types';\n\n// Internal context keys - not exported from package, only used internally\nexport const storefrontContext =\n createContext<StorefrontClient<I18nBase>['storefront']>();\nexport const cartContext = createContext<\n HydrogenCart | HydrogenCartCustom<CustomMethodsBase>\n>();\nexport const customerAccountContext = createContext<CustomerAccount>();\nexport const envContext = createContext<HydrogenEnv>();\nexport const sessionContext = createContext<HydrogenSession>();\nexport const waitUntilContext = createContext<WaitUntil>();\n\n/**\n * Grouped export of all Hydrogen context keys for convenient access.\n * Use with React Router's context.get() pattern:\n *\n * @example\n * ```ts\n * import { hydrogenContext } from '@shopify/hydrogen';\n *\n * export async function loader({ context }) {\n * const storefront = context.get(hydrogenContext.storefront);\n * const cart = context.get(hydrogenContext.cart);\n * }\n * ```\n */\nexport const hydrogenContext = {\n storefront: storefrontContext,\n cart: cartContext,\n customerAccount: customerAccountContext,\n env: envContext,\n session: sessionContext,\n waitUntil: waitUntilContext,\n} as const;\n","import {LIB_VERSION} from '../version';\n\nexport const DEFAULT_CUSTOMER_API_VERSION = '2025-07';\nexport const USER_AGENT = `Shopify Hydrogen ${LIB_VERSION}`;\n// This is a static api client id: https://shopify.dev/docs/api/customer#useaccesstoken-propertydetail-audience\nexport const CUSTOMER_API_CLIENT_ID = '30243aa5-17c1-465a-8493-944bcc4e88aa';\nexport const CUSTOMER_ACCOUNT_SESSION_KEY = 'customerAccount';\nexport const BUYER_SESSION_KEY = 'buyer';\n","export class BadRequest extends Response {\n constructor(message?: string, helpMessage?: string, headers?: HeadersInit) {\n // A lot of things can go wrong when configuring the customer account api\n // oauth flow. In dev mode, log a helper message.\n if (helpMessage && process.env.NODE_ENV === 'development') {\n console.error('Customer Account API Error: ' + helpMessage);\n }\n\n super(`Bad request: ${message}`, {status: 400, headers});\n }\n}\n","import type {HydrogenSession} from '../types';\nimport {BadRequest} from './BadRequest';\nimport {\n USER_AGENT,\n CUSTOMER_API_CLIENT_ID,\n CUSTOMER_ACCOUNT_SESSION_KEY,\n BUYER_SESSION_KEY,\n} from './constants';\n\ntype H2OEvent = Parameters<NonNullable<typeof __H2O_LOG_EVENT>>[0];\n\nexport interface Locks {\n refresh?: Promise<any>;\n}\n\nexport const logSubRequestEvent =\n process.env.NODE_ENV === 'development'\n ? ({\n url,\n response,\n startTime,\n query,\n variables,\n ...debugInfo\n }: {\n url: H2OEvent['url'];\n response: Response;\n startTime: H2OEvent['startTime'];\n query?: string;\n variables?: Record<string, any> | null;\n } & Partial<H2OEvent>) => {\n globalThis.__H2O_LOG_EVENT?.({\n ...debugInfo,\n eventType: 'subrequest',\n url,\n startTime,\n graphql: query\n ? JSON.stringify({query, variables, schema: 'customer-account'})\n : undefined,\n responseInit: {\n status: response.status || 0,\n statusText: response.statusText || '',\n headers: Array.from(response.headers.entries() || []),\n },\n });\n }\n : undefined;\n\nexport function redirect(\n path: string,\n options: {status?: number; headers?: {}} = {},\n) {\n const headers = options.headers\n ? new Headers(options.headers)\n : new Headers({});\n headers.set('location', path);\n\n return new Response(null, {status: options.status || 302, headers});\n}\n\nexport interface AccessTokenResponse {\n access_token: string;\n expires_in: number;\n id_token: string;\n refresh_token: string;\n error?: string;\n error_description?: string;\n}\n\nexport async function refreshToken({\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n}: {\n session: HydrogenSession;\n customerAccountId: string;\n customerAccountTokenExchangeUrl: string;\n httpsOrigin: string;\n debugInfo?: Partial<H2OEvent>;\n}) {\n const newBody = new URLSearchParams();\n\n const customerAccount = session.get(CUSTOMER_ACCOUNT_SESSION_KEY);\n const refreshToken = customerAccount?.refreshToken;\n const idToken = customerAccount?.idToken;\n\n if (!refreshToken)\n throw new BadRequest(\n 'Unauthorized',\n 'No refreshToken found in the session. Make sure your session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n\n newBody.append('grant_type', 'refresh_token');\n newBody.append('refresh_token', refreshToken);\n newBody.append('client_id', customerAccountId);\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const startTime = new Date().getTime();\n const url = customerAccountTokenExchangeUrl;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: newBody,\n });\n\n logSubRequestEvent?.({\n displayName: 'Customer Account API: access token refresh',\n url,\n startTime,\n response,\n ...debugInfo,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Response(text, {\n status: response.status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n });\n }\n\n const {\n access_token,\n expires_in,\n refresh_token,\n }: Omit<AccessTokenResponse, 'id_token'> = await response.json();\n\n if (!access_token || access_token.length === 0) {\n throw new BadRequest('Unauthorized', 'Invalid access token received.');\n }\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n accessToken: access_token,\n // Store the date in future the token expires, separated by two minutes\n expiresAt:\n new Date(new Date().getTime() + (expires_in - 120) * 1000).getTime() + '',\n refreshToken: refresh_token,\n idToken,\n });\n}\n\nexport function clearSession(session: HydrogenSession): void {\n session.unset(CUSTOMER_ACCOUNT_SESSION_KEY);\n session.unset(BUYER_SESSION_KEY);\n}\n\nexport async function checkExpires({\n locks,\n expiresAt,\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n}: {\n locks: Locks;\n expiresAt: string;\n session: HydrogenSession;\n customerAccountId: string;\n customerAccountTokenExchangeUrl: string;\n httpsOrigin: string;\n debugInfo?: Partial<H2OEvent>;\n}) {\n if (parseInt(expiresAt, 10) - 1000 < new Date().getTime()) {\n try {\n // Makes sure that only one refresh request is sent at a time\n if (!locks.refresh)\n locks.refresh = refreshToken({\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl,\n httpsOrigin,\n debugInfo,\n });\n\n await locks.refresh;\n delete locks.refresh;\n } catch (error) {\n clearSession(session);\n\n if (error && (error as Response).status !== 401) {\n throw error;\n } else {\n throw new BadRequest(\n 'Unauthorized',\n 'Login before querying the Customer Account API.',\n );\n }\n }\n }\n}\n\nexport function generateCodeVerifier() {\n const rando = generateRandomCode();\n return base64UrlEncode(rando);\n}\n\nexport async function generateCodeChallenge(codeVerifier: string) {\n const digestOp = await crypto.subtle.digest(\n {name: 'SHA-256'},\n new TextEncoder().encode(codeVerifier),\n );\n const hash = convertBufferToString(digestOp);\n return base64UrlEncode(hash);\n}\n\nexport function generateRandomCode() {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return String.fromCharCode.apply(null, Array.from(array));\n}\n\nfunction base64UrlEncode(str: string) {\n const base64 = btoa(str);\n // This is to ensure that the encoding does not have +, /, or = characters in it.\n return base64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n}\n\nfunction convertBufferToString(hash: ArrayBuffer) {\n const uintArray = new Uint8Array(hash);\n const numberArray = Array.from(uintArray);\n return String.fromCharCode(...numberArray);\n}\n\nexport function generateState() {\n const timestamp = Date.now().toString();\n const randomString = Math.random().toString(36).substring(2);\n return timestamp + randomString;\n}\n\nexport async function exchangeAccessToken(\n authAccessToken: string | undefined,\n customerAccountId: string,\n customerAccountTokenExchangeUrl: string,\n httpsOrigin: string,\n debugInfo?: Partial<H2OEvent>,\n) {\n const clientId = customerAccountId;\n\n if (!authAccessToken)\n throw new BadRequest(\n 'Unauthorized',\n 'oAuth access token was not provided during token exchange.',\n );\n\n const body = new URLSearchParams();\n\n body.append('grant_type', 'urn:ietf:params:oauth:grant-type:token-exchange');\n body.append('client_id', clientId);\n body.append('audience', CUSTOMER_API_CLIENT_ID);\n body.append('subject_token', authAccessToken);\n body.append(\n 'subject_token_type',\n 'urn:ietf:params:oauth:token-type:access_token',\n );\n body.append('scopes', 'https://api.customers.com/auth/customer.graphql');\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const startTime = new Date().getTime();\n const url = customerAccountTokenExchangeUrl;\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n logSubRequestEvent?.({\n displayName: 'Customer Account API: access token exchange',\n url,\n startTime,\n response,\n ...debugInfo,\n });\n\n const data: AccessTokenResponse = await response.json();\n\n if (data.error) {\n throw new BadRequest(data.error_description);\n }\n\n return data.access_token;\n}\n\nexport function getNonce(token: string) {\n return decodeJwt(token).payload.nonce;\n}\n\nfunction decodeJwt(token: string) {\n const [header, payload, signature] = token.split('.');\n\n const decodedHeader = JSON.parse(atob(header));\n const decodedPayload = JSON.parse(atob(payload));\n\n return {\n header: decodedHeader,\n payload: decodedPayload,\n signature,\n };\n}\n","export function generateNonce(): string {\n return toHexString(randomUint8Array());\n}\n\nfunction randomUint8Array() {\n try {\n return crypto.getRandomValues(new Uint8Array(16));\n } catch (e) {\n return new Uint8Array(16).map(() => (Math.random() * 255) | 0);\n }\n}\n\nfunction toHexString(byteArray: Uint8Array) {\n return Array.from(byteArray, function (byte) {\n return ('0' + (byte & 0xff).toString(16)).slice(-2);\n }).join('');\n}\n","export function getRedirectUrl(requestUrl?: string): string | undefined {\n if (!requestUrl) return;\n\n const {pathname, search} = new URL(requestUrl);\n const redirectFrom = pathname + search;\n\n const searchParams = new URLSearchParams(search);\n const redirectTo =\n searchParams.get('return_to') || searchParams.get('redirect');\n\n if (redirectTo) {\n if (isLocalPath(requestUrl, redirectTo)) {\n return redirectTo;\n } else {\n console.warn(\n `Cross-domain redirects are not supported. Tried to redirect from ${redirectFrom} to ${redirectTo}`,\n );\n }\n }\n}\n\nfunction isLocalPath(requestUrl: string, redirectUrl: string) {\n // We don't want to redirect cross domain,\n // doing so could create phishing vulnerability\n // Test for protocols, e.g. https://, http://, //\n // and uris: mailto:, tel:, javascript:, etc.\n try {\n return (\n new URL(requestUrl).origin === new URL(redirectUrl, requestUrl).origin\n );\n } catch (e) {\n return false;\n }\n}\n\n/** Ensure redirect url are always using request origin so we never redirect cross domain. Return the full url with request origin.\n *\n * @param requestUrl - Use to find app origin\n * @param defaultUrl - The default URL to redirect to.\n * @param redirectUrl - Relative or absolute URL of redirect. If the absolute URL is cross domain return undefined.\n * */\nexport function ensureLocalRedirectUrl({\n requestUrl,\n defaultUrl,\n redirectUrl,\n}: {\n requestUrl: string;\n defaultUrl: string;\n redirectUrl?: string;\n}): string {\n const fromUrl = requestUrl;\n const defautlUrl = buildURLObject(requestUrl, defaultUrl);\n const toUrl = redirectUrl\n ? buildURLObject(requestUrl, redirectUrl)\n : defautlUrl;\n\n if (isLocalPath(requestUrl, toUrl.toString())) {\n return toUrl.toString();\n } else {\n console.warn(\n `Cross-domain redirects are not supported. Tried to redirect from ${fromUrl} to ${toUrl}. Default url ${defautlUrl} is used instead.`,\n );\n return defautlUrl.toString();\n }\n}\n\nfunction buildURLObject(\n requestUrl: string,\n relativeOrAbsoluteUrl: string,\n): URL {\n return isAbsoluteUrl(relativeOrAbsoluteUrl)\n ? new URL(relativeOrAbsoluteUrl)\n : new URL(relativeOrAbsoluteUrl, new URL(requestUrl).origin);\n}\n\nfunction isAbsoluteUrl(url: string) {\n try {\n new URL(url);\n return true;\n } catch (e) {\n return false;\n }\n}\n","export enum URL_TYPE {\n CA_BASE_URL = 'CA_BASE_URL',\n CA_BASE_AUTH_URL = 'CA_BASE_AUTH_URL',\n GRAPHQL = 'GRAPHQL',\n AUTH = 'AUTH',\n LOGIN_SCOPE = 'LOGIN_SCOPE',\n TOKEN_EXCHANGE = 'TOKEN_EXCHANGE',\n LOGOUT = 'LOGOUT',\n}\n\nexport function createCustomerAccountHelper(\n customerApiVersion: string,\n shopId: string,\n) {\n const customerAccountUrl = `https://shopify.com/${shopId}`;\n const customerAccountAuthUrl = `https://shopify.com/authentication/${shopId}`;\n\n return function getCustomerAccountUrl(urlType: URL_TYPE): string {\n switch (urlType) {\n case URL_TYPE.CA_BASE_URL:\n return customerAccountUrl;\n case URL_TYPE.CA_BASE_AUTH_URL:\n return customerAccountAuthUrl;\n case URL_TYPE.GRAPHQL:\n return `${customerAccountUrl}/account/customer/api/${customerApiVersion}/graphql`;\n case URL_TYPE.AUTH:\n return `${customerAccountAuthUrl}/oauth/authorize`;\n case URL_TYPE.LOGIN_SCOPE:\n return shopId\n ? 'openid email customer-account-api:full'\n : 'openid email https://api.customers.com/auth/customer.graphql';\n case URL_TYPE.TOKEN_EXCHANGE:\n return `${customerAccountAuthUrl}/oauth/token`;\n case URL_TYPE.LOGOUT:\n return `${customerAccountAuthUrl}/logout`;\n }\n };\n}\n","import type {GenericVariables} from '@shopify/hydrogen-codegen';\nimport type {WritableDeep} from 'type-fest';\nimport {\n DEFAULT_CUSTOMER_API_VERSION,\n CUSTOMER_ACCOUNT_SESSION_KEY,\n BUYER_SESSION_KEY,\n USER_AGENT,\n} from './constants';\nimport {\n clearSession,\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n checkExpires,\n exchangeAccessToken,\n AccessTokenResponse,\n getNonce,\n redirect,\n Locks,\n logSubRequestEvent,\n} from './auth.helpers';\nimport {BadRequest} from './BadRequest';\nimport {generateNonce} from '../csp/nonce';\nimport {\n minifyQuery,\n assertQuery,\n assertMutation,\n throwErrorWithGqlLink,\n type GraphQLErrorOptions,\n GraphQLError,\n} from '../utils/graphql';\nimport {parseJSON} from '../utils/parse-json';\nimport {\n CrossRuntimeRequest,\n getHeader,\n getDebugHeaders,\n} from '../utils/request';\nimport {getCallerStackLine, withSyncStack} from '../utils/callsites';\nimport {\n getRedirectUrl,\n ensureLocalRedirectUrl,\n} from '../utils/get-redirect-url';\nimport type {\n CustomerAccountOptions,\n CustomerAccount,\n CustomerAPIResponse,\n LoginOptions,\n LogoutOptions,\n Buyer,\n} from './types';\nimport {createCustomerAccountHelper, URL_TYPE} from './customer-account-helper';\nimport {warnOnce} from '../utils/warning';\nimport {LanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\n\nfunction defaultAuthStatusHandler(\n request: CrossRuntimeRequest,\n defaultLoginUrl: string,\n) {\n if (!request.url) return defaultLoginUrl;\n\n const {pathname} = new URL(request.url);\n\n /**\n * Remix (single-fetch) request objects have different url\n * paths when soft navigating. Examples:\n *\n * /_root.data - home page\n * /collections.data - collections page\n *\n * These url annotations needs to be cleaned up before constructing urls to be passed as\n * GET parameters for customer login url\n */\n const cleanedPathname = pathname\n .replace(/\\.data$/, '')\n .replace(/\\/_root$/, '/')\n .replace(/(.+)\\/$/, '$1');\n\n const redirectTo =\n defaultLoginUrl +\n `?${new URLSearchParams({return_to: cleanedPathname}).toString()}`;\n\n return redirect(redirectTo);\n}\n\nexport function createCustomerAccountClient({\n session,\n customerAccountId,\n shopId,\n customerApiVersion = DEFAULT_CUSTOMER_API_VERSION,\n request,\n waitUntil,\n authUrl,\n customAuthStatusHandler,\n logErrors = true,\n loginPath = '/account/login',\n authorizePath = '/account/authorize',\n defaultRedirectPath = '/account',\n language,\n}: CustomerAccountOptions): CustomerAccount {\n if (customerApiVersion !== DEFAULT_CUSTOMER_API_VERSION) {\n console.warn(\n `[h2:warn:createCustomerAccountClient] You are using Customer Account API version ${customerApiVersion} when this version of Hydrogen was built for ${DEFAULT_CUSTOMER_API_VERSION}.`,\n );\n }\n\n if (!session) {\n console.warn(\n `[h2:warn:createCustomerAccountClient] session is required to use Customer Account API. Ensure the session object passed in exist.`,\n );\n }\n\n if (!request?.url) {\n throw new Error(\n '[h2:error:createCustomerAccountClient] The request object does not contain a URL.',\n );\n }\n\n const authStatusHandler = customAuthStatusHandler\n ? customAuthStatusHandler\n : () => defaultAuthStatusHandler(request, loginPath);\n\n const requestUrl = new URL(request.url);\n const httpsOrigin =\n requestUrl.protocol === 'http:'\n ? requestUrl.origin.replace('http', 'https')\n : requestUrl.origin;\n const redirectUri = ensureLocalRedirectUrl({\n requestUrl: httpsOrigin,\n defaultUrl: authorizePath,\n redirectUrl: authUrl,\n });\n\n const getCustomerAccountUrl = createCustomerAccountHelper(\n customerApiVersion,\n shopId,\n );\n\n const ifInvalidCredentialThrowError = createIfInvalidCredentialThrowError(\n getCustomerAccountUrl,\n customerAccountId,\n );\n\n const customerAccountApiUrl = getCustomerAccountUrl(URL_TYPE.GRAPHQL);\n const locks: Locks = {};\n\n async function fetchCustomerAPI<T>({\n query,\n type,\n variables = {},\n }: {\n query: string;\n type: 'query' | 'mutation';\n variables?: GenericVariables;\n }) {\n const accessToken = await getAccessToken();\n if (!accessToken) {\n throw authStatusHandler();\n }\n\n // Get stack trace before losing it with any async operation.\n // Since this is an internal function that is always called from\n // the public query/mutate wrappers, add 1 to the stack offset.\n const stackInfo = getCallerStackLine?.();\n\n const startTime = new Date().getTime();\n\n const response = await fetch(customerAccountApiUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n Authorization: accessToken,\n },\n body: JSON.stringify({query, variables}),\n });\n\n logSubRequestEvent?.({\n url: customerAccountApiUrl,\n startTime,\n response,\n waitUntil,\n stackInfo,\n query,\n variables,\n ...getDebugHeaders(request),\n });\n\n const body = await response.text();\n\n const errorOptions: GraphQLErrorOptions<T> = {\n url: customerAccountApiUrl,\n response,\n type,\n query,\n queryVariables: variables,\n errors: undefined,\n client: 'customer',\n };\n\n if (!response.ok) {\n if (response.status === 401) {\n // clear session because current access token is invalid\n clearSession(session);\n\n const authFailResponse = authStatusHandler();\n throw authFailResponse;\n }\n\n /**\n * The Customer API might return a string error, or a JSON-formatted {error: string}.\n * We try both and conform them to a single {errors} format.\n */\n let errors;\n try {\n errors = parseJSON(body);\n } catch (_e) {\n errors = [{message: body}];\n }\n\n throwErrorWithGqlLink({...errorOptions, errors});\n }\n\n try {\n const APIresponse = parseJSON(body) as CustomerAPIResponse<T>;\n const {errors} = APIresponse;\n\n const gqlErrors = errors?.map(\n ({message, ...rest}) =>\n new GraphQLError(message, {\n ...(rest as WritableDeep<typeof rest>),\n clientOperation: `customerAccount.${errorOptions.type}`,\n requestId: response.headers.get('x-request-id'),\n queryVariables: variables,\n query,\n }),\n );\n\n return {...APIresponse, ...(errors && {errors: gqlErrors})};\n } catch (e) {\n throwErrorWithGqlLink({...errorOptions, errors: [{message: body}]});\n }\n }\n\n async function isLoggedIn() {\n if (!shopId) return false;\n\n const customerAccount = session.get(CUSTOMER_ACCOUNT_SESSION_KEY);\n const accessToken = customerAccount?.accessToken;\n const expiresAt = customerAccount?.expiresAt;\n\n if (!accessToken || !expiresAt) return false;\n\n // Get stack trace before losing it with any async operation.\n const stackInfo = getCallerStackLine?.();\n\n try {\n await checkExpires({\n locks,\n expiresAt,\n session,\n customerAccountId,\n customerAccountTokenExchangeUrl: getCustomerAccountUrl(\n URL_TYPE.TOKEN_EXCHANGE,\n ),\n httpsOrigin,\n debugInfo: {\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n },\n });\n } catch {\n return false;\n }\n\n return true;\n }\n\n async function handleAuthStatus() {\n if (!(await isLoggedIn())) {\n throw authStatusHandler();\n }\n }\n\n async function getAccessToken() {\n const hasAccessToken = await isLoggedIn();\n\n if (hasAccessToken)\n return session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.accessToken;\n }\n\n async function mutate(\n mutation: Parameters<CustomerAccount['mutate']>[0],\n options?: Parameters<CustomerAccount['mutate']>[1],\n ) {\n ifInvalidCredentialThrowError();\n\n mutation = minifyQuery(mutation);\n assertMutation(mutation, 'customer.mutate');\n\n return withSyncStack(\n fetchCustomerAPI({query: mutation, type: 'mutation', ...options}),\n {logErrors},\n );\n }\n\n async function query(\n query: Parameters<CustomerAccount['query']>[0],\n options?: Parameters<CustomerAccount['query']>[1],\n ) {\n ifInvalidCredentialThrowError();\n\n query = minifyQuery(query);\n assertQuery(query, 'customer.query');\n\n return withSyncStack(fetchCustomerAPI({query, type: 'query', ...options}), {\n logErrors,\n });\n }\n\n function setBuyer(buyer: Buyer) {\n session.set(BUYER_SESSION_KEY, {\n ...session.get(BUYER_SESSION_KEY),\n ...buyer,\n });\n }\n\n async function getBuyer() {\n // get access token and trigger refresh if expire\n const customerAccessToken = await getAccessToken();\n\n if (!customerAccessToken) {\n return;\n }\n\n return {...session.get(BUYER_SESSION_KEY), customerAccessToken};\n }\n\n return {\n i18n: {language: language ?? ('EN' as LanguageCode)},\n login: async (options?: LoginOptions) => {\n ifInvalidCredentialThrowError();\n const loginUrl = new URL(getCustomerAccountUrl(URL_TYPE.AUTH));\n\n const state = generateState();\n const nonce = generateNonce();\n\n loginUrl.searchParams.set('client_id', customerAccountId);\n loginUrl.searchParams.set('scope', 'openid email');\n loginUrl.searchParams.append('response_type', 'code');\n loginUrl.searchParams.append('redirect_uri', redirectUri);\n loginUrl.searchParams.set(\n 'scope',\n getCustomerAccountUrl(URL_TYPE.LOGIN_SCOPE),\n );\n loginUrl.searchParams.append('state', state);\n loginUrl.searchParams.append('nonce', nonce);\n\n const locale = getMaybeLocale({\n contextLanguage: language ?? null,\n localeOverride: options?.locale ?? null,\n uiLocalesOverride: options?.uiLocales ?? null,\n });\n\n if (locale != null) {\n loginUrl.searchParams.append('locale', locale);\n }\n\n if (options?.countryCode) {\n loginUrl.searchParams.append('region_country', options.countryCode);\n }\n\n if (options?.acrValues) {\n loginUrl.searchParams.append('acr_values', options.acrValues);\n }\n\n if (options?.loginHint) {\n loginUrl.searchParams.append('login_hint', options.loginHint);\n\n if (options?.loginHintMode) {\n loginUrl.searchParams.append(\n 'login_hint_mode',\n options.loginHintMode,\n );\n }\n }\n\n const verifier = generateCodeVerifier();\n const challenge = await generateCodeChallenge(verifier);\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n ...session.get(CUSTOMER_ACCOUNT_SESSION_KEY),\n codeVerifier: verifier,\n state,\n nonce,\n redirectPath:\n getRedirectUrl(request.url) ||\n getHeader(request, 'Referer') ||\n defaultRedirectPath,\n });\n\n loginUrl.searchParams.append('code_challenge', challenge);\n loginUrl.searchParams.append('code_challenge_method', 'S256');\n\n return redirect(loginUrl.toString());\n },\n\n logout: async (options?: LogoutOptions) => {\n ifInvalidCredentialThrowError();\n\n const idToken = session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.idToken;\n const postLogoutRedirectUri = ensureLocalRedirectUrl({\n requestUrl: httpsOrigin,\n defaultUrl: httpsOrigin,\n redirectUrl: options?.postLogoutRedirectUri,\n });\n\n const logoutUrl = idToken\n ? new URL(\n `${getCustomerAccountUrl(URL_TYPE.LOGOUT)}?${new URLSearchParams([\n ['id_token_hint', idToken],\n ['post_logout_redirect_uri', postLogoutRedirectUri],\n ]).toString()}`,\n ).toString()\n : postLogoutRedirectUri;\n\n clearSession(session);\n\n const headers =\n options?.headers instanceof Headers\n ? options?.headers\n : new Headers(options?.headers);\n\n if (!options?.keepSession) {\n if (session.destroy) {\n headers.set('Set-Cookie', await session.destroy());\n } else {\n console.warn(\n '[h2:warn:customerAccount] session.destroy is not available on your session implementation. All session data might not be cleared on logout.',\n );\n }\n\n session.isPending = false;\n }\n\n return redirect(logoutUrl, {headers});\n },\n isLoggedIn,\n handleAuthStatus,\n getAccessToken,\n getApiUrl: () => customerAccountApiUrl,\n mutate: mutate as CustomerAccount['mutate'],\n query: query as CustomerAccount['query'],\n authorize: async () => {\n ifInvalidCredentialThrowError();\n\n const code = requestUrl.searchParams.get('code');\n const state = requestUrl.searchParams.get('state');\n\n if (!code || !state) {\n clearSession(session);\n\n throw new BadRequest(\n 'Unauthorized',\n 'No code or state parameter found in the redirect URL.',\n );\n }\n\n if (session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.state !== state) {\n clearSession(session);\n\n throw new BadRequest(\n 'Unauthorized',\n 'The session state does not match the state parameter. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n }\n\n const clientId = customerAccountId;\n const body = new URLSearchParams();\n\n body.append('grant_type', 'authorization_code');\n body.append('client_id', clientId);\n body.append('redirect_uri', redirectUri);\n body.append('code', code);\n\n // Public Client\n const codeVerifier = session.get(\n CUSTOMER_ACCOUNT_SESSION_KEY,\n )?.codeVerifier;\n\n if (!codeVerifier)\n throw new BadRequest(\n 'Unauthorized',\n 'No code verifier found in the session. Make sure that the session is configured correctly and passed to `createCustomerAccountClient`.',\n );\n\n body.append('code_verifier', codeVerifier);\n\n const headers = {\n 'content-type': 'application/x-www-form-urlencoded',\n 'User-Agent': USER_AGENT,\n Origin: httpsOrigin,\n };\n\n const stackInfo = getCallerStackLine?.();\n const startTime = new Date().getTime();\n const url = getCustomerAccountUrl(URL_TYPE.TOKEN_EXCHANGE);\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n logSubRequestEvent?.({\n url,\n displayName: 'Customer Account API: authorize',\n startTime,\n response,\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n });\n\n if (!response.ok) {\n throw new Response(await response.text(), {\n status: response.status,\n headers: {\n 'Content-Type': 'text/html; charset=utf-8',\n },\n });\n }\n\n const {\n access_token,\n expires_in,\n id_token,\n refresh_token,\n }: AccessTokenResponse = await response.json();\n\n const sessionNonce = session.get(CUSTOMER_ACCOUNT_SESSION_KEY)?.nonce;\n const responseNonce = await getNonce(id_token);\n\n if (sessionNonce !== responseNonce) {\n throw new BadRequest(\n 'Unauthorized',\n `Returned nonce does not match: ${sessionNonce} !== ${responseNonce}`,\n );\n }\n\n let customerAccessToken = access_token;\n\n if (!shopId) {\n customerAccessToken = await exchangeAccessToken(\n access_token,\n customerAccountId,\n getCustomerAccountUrl(URL_TYPE.TOKEN_EXCHANGE),\n httpsOrigin,\n {\n waitUntil,\n stackInfo,\n ...getDebugHeaders(request),\n },\n );\n }\n\n const redirectPath = session.get(\n CUSTOMER_ACCOUNT_SESSION_KEY,\n )?.redirectPath;\n\n session.set(CUSTOMER_ACCOUNT_SESSION_KEY, {\n accessToken: customerAccessToken,\n expiresAt:\n new Date(new Date().getTime() + (expires_in - 120) * 1000).getTime() +\n '',\n refreshToken: refresh_token,\n idToken: id_token,\n });\n\n return redirect(redirectPath || defaultRedirectPath);\n },\n setBuyer,\n getBuyer,\n UNSTABLE_setBuyer: (buyer: Buyer) => {\n warnOnce(\n '[h2:warn:customerAccount] `customerAccount.UNSTABLE_setBuyer` is deprecated. Please use `customerAccount.setBuyer`.',\n );\n\n setBuyer(buyer);\n },\n UNSTABLE_getBuyer: () => {\n warnOnce(\n '[h2:warn:customerAccount] `customerAccount.UNSTABLE_getBuyer` is deprecated. Please use `customerAccount.getBuyer`.',\n );\n\n return getBuyer();\n },\n };\n}\n\nfunction createIfInvalidCredentialThrowError(\n getCustomerAccountUrl: (urlType: URL_TYPE) => string,\n customerAccountId?: string,\n) {\n return function ifInvalidCredentialThrowError() {\n try {\n if (!customerAccountId) throw Error();\n\n new URL(getCustomerAccountUrl(URL_TYPE.CA_BASE_URL));\n new URL(getCustomerAccountUrl(URL_TYPE.CA_BASE_AUTH_URL));\n } catch {\n console.error(\n new Error(\n '[h2:error:customerAccount] You do not have the valid credential to use Customer Account API.\\nRun `h2 env pull` to link your store credentials.',\n ),\n );\n\n const publicMessage =\n process.env.NODE_ENV === 'production'\n ? 'Internal Server Error'\n : 'You do not have the valid credential to use Customer Account API (/account).';\n\n throw new Response(publicMessage, {status: 500});\n }\n };\n}\n\n/**\n * This function returns a locale string in the form <language>[-<COUNTRY_CODE>], based on the provided input params.\n * If both the i18n and the uiLocalesOverride are provided, the uiLocalesOverride will be used.\n * If none of the params are provided, it returns null.\n */\nexport function getMaybeUILocales(params: {\n contextLanguage: LanguageCode | null;\n uiLocalesOverride: LanguageCode | null; // this will override contextLanguage if both are provided\n}): string | null {\n const contextLocale = toMaybeLocaleString(params.contextLanguage ?? null);\n const optionsLocale = toMaybeLocaleString(params.uiLocalesOverride);\n\n return optionsLocale ?? contextLocale ?? null;\n}\n\nfunction toMaybeLocaleString(language: LanguageCode | null): string | null {\n if (language == null) {\n return null;\n }\n\n const normalizedLanguage = maybeEnforceRegionalVariant(language);\n\n const base = normalizedLanguage.toLowerCase().replaceAll('_', '-');\n const tokens = base.split('-');\n const langToken = tokens.at(0) ?? null;\n const regionToken = tokens.at(1) ?? null;\n\n if (regionToken) {\n return `${langToken}-${regionToken.toUpperCase()}`;\n }\n\n return langToken;\n}\n\n// See https://shopify.dev/docs/api/customer#authorization-propertydetail-uilocales\nconst regionalLanguageOverrides: Partial<Record<LanguageCode, LanguageCode>> = {\n PT: 'PT_PT',\n ZH: 'ZH_CN',\n};\n\nfunction maybeEnforceRegionalVariant(language: LanguageCode): LanguageCode {\n return regionalLanguageOverrides[language] ?? language;\n}\n\n/**\n * This function returns a locale string for the login URL.\n * Supported locales: en, fr, cs, da, de, el, es, fi, hi, hr, hu, id, it, ja, ko, lt, ms, nb, nl, pl,\n * pt-BR, pt-PT, ro, ru, sk, sl, sv, th, tr, vi, zh-CN, zh-TW\n *\n * Priority order: localeOverride > uiLocalesOverride > contextLanguage\n * If none are provided, returns null.\n */\nexport function getMaybeLocale(params: {\n contextLanguage: LanguageCode | null;\n localeOverride: string | null;\n uiLocalesOverride: LanguageCode | null;\n}): string | null {\n // localeOverride takes highest precedence\n if (params.localeOverride != null) {\n return toLocaleString(params.localeOverride);\n }\n\n // uiLocalesOverride takes second precedence\n if (params.uiLocalesOverride != null) {\n return toLocaleString(params.uiLocalesOverride);\n }\n\n // contextLanguage is the fallback\n if (params.contextLanguage != null) {\n return toLocaleString(params.contextLanguage);\n }\n\n return null;\n}\n\nfunction toLocaleString(language: string): string {\n // Convert to lowercase and replace underscore with hyphen\n // e.g., PT_BR -> pt-br, ZH_CN -> zh-cn, EN -> en, pt-BR -> pt-br\n const base = language.toLowerCase().replaceAll('_', '-');\n const tokens = base.split('-');\n const langToken = tokens[0];\n const regionToken = tokens[1];\n\n if (regionToken) {\n // Has region: PT_BR -> pt-BR, zh-cn -> zh-CN, pt-BR -> pt-BR, etc.\n return `${langToken}-${regionToken.toUpperCase()}`;\n }\n\n // No region: EN -> en, FR -> fr, DE -> de\n return langToken;\n}\n","import {\n createStorefrontClient,\n type CreateStorefrontClientOptions,\n type StorefrontClient,\n type I18nBase,\n} from './storefront';\nimport {createCustomerAccountClient} from './customer/customer';\nimport {\n type CustomerAccountOptions,\n type CustomerAccount,\n} from './customer/types';\nimport {LanguageCode} from '@shopify/hydrogen-react/customer-account-api-types';\nimport {\n createCartHandler,\n type CartHandlerOptions,\n type CustomMethodsBase,\n type HydrogenCart,\n type HydrogenCartCustom,\n} from './cart/createCartHandler';\nimport {cartGetIdDefault} from './cart/cartGetIdDefault';\nimport {cartSetIdDefault} from './cart/cartSetIdDefault';\nimport type {\n HydrogenEnv,\n WaitUntil,\n HydrogenSession,\n StorefrontHeaders,\n HydrogenRouterContextProvider,\n} from './types';\nimport {type CrossRuntimeRequest, getStorefrontHeaders} from './utils/request';\nimport {warnOnce} from './utils/warning';\nimport type {CartBuyerIdentityInput} from '@shopify/hydrogen-react/storefront-api-types';\nimport {RouterContextProvider} from 'react-router';\nimport {\n storefrontContext,\n cartContext,\n customerAccountContext,\n envContext,\n sessionContext,\n waitUntilContext,\n} from './context-keys';\n\nexport type HydrogenContextOptions<\n TSession extends HydrogenSession = HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> = {\n /* Environment variables from the fetch function */\n env: TEnv;\n /* Request object from the fetch function */\n request: CrossRuntimeRequest;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n /** Storefront client overwrite options. See documentation for createStorefrontClient for more information. */\n storefront?: {\n /** Storefront API headers. Default values set from request header. */\n headers?: CreateStorefrontClientOptions<TI18n>['storefrontHeaders'];\n /** Override the Storefront API version for this query. */\n apiVersion?: CreateStorefrontClientOptions<TI18n>['storefrontApiVersion'];\n };\n /** Customer Account client overwrite options. See documentation for createCustomerAccountClient for more information. */\n customerAccount?: {\n /** Override the version of the API */\n apiVersion?: CustomerAccountOptions['customerApiVersion'];\n /** This is the route in your app that authorizes the customer after logging in. Make sure to call `customer.authorize()` within the loader on this route. It defaults to `/account/authorize`. */\n authUrl?: CustomerAccountOptions['authUrl'];\n /** Use this method to overwrite the default logged-out redirect behavior. The default handler [throws a redirect](https://remix.run/docs/en/main/utils/redirect#:~:text=!session) to `/account/login` with current path as `return_to` query param. */\n customAuthStatusHandler?: CustomerAccountOptions['customAuthStatusHandler'];\n /** Deprecated. `unstableB2b` is now stable. Please remove. */\n unstableB2b?: CustomerAccountOptions['unstableB2b'];\n };\n /** Cart handler overwrite options. See documentation for createCartHandler for more information. */\n cart?: {\n /** A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`. */\n getId?: CartHandlerOptions['getCartId'];\n /** A function that sets the cart ID. */\n setId?: CartHandlerOptions['setCartId'];\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n queryFragment?: CartHandlerOptions['cartQueryFragment'];\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n mutateFragment?: CartHandlerOptions['cartMutateFragment'];\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: TCustomMethods;\n };\n buyerIdentity?: CartBuyerIdentityInput;\n};\n\nexport interface HydrogenContext<\n TSession extends HydrogenSession = HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> {\n /** A GraphQL client for querying the [Storefront API](https://shopify.dev/docs/api/storefront). */\n storefront: StorefrontClient<TI18n>['storefront'];\n /** A GraphQL client for querying the [Customer Account API](https://shopify.dev/docs/api/customer). It also provides methods to authenticate and check if the user is logged in. */\n customerAccount: CustomerAccount;\n /** A collection of utilities used to interact with the cart. */\n cart: TCustomMethods extends CustomMethodsBase\n ? HydrogenCartCustom<TCustomMethods>\n : HydrogenCart;\n /* Request object from the fetch function */\n env: TEnv;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n}\n\nexport interface HydrogenContextOverloads<\n TSession extends HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> {\n storefront: StorefrontClient<TI18n>['storefront'];\n customerAccount: CustomerAccount;\n cart: TCustomMethods extends CustomMethodsBase\n ? HydrogenCartCustom<TCustomMethods>\n : HydrogenCart;\n env: TEnv;\n waitUntil?: WaitUntil;\n session: TSession;\n}\n\nexport function createHydrogenContext<\n TSession extends HydrogenSession,\n TCustomMethods extends CustomMethodsBase | undefined = {},\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n TAdditionalContext extends Record<string, any> = {},\n>(\n options: HydrogenContextOptions<TSession, TCustomMethods, TI18n, TEnv>,\n additionalContext?: TAdditionalContext,\n): HydrogenRouterContextProvider<TSession, TCustomMethods, TI18n, TEnv> &\n TAdditionalContext {\n const {\n env,\n request,\n cache,\n waitUntil,\n i18n,\n session,\n logErrors,\n storefront: storefrontOptions = {},\n customerAccount: customerAccountOptions,\n cart: cartOptions = {},\n buyerIdentity,\n } = options;\n\n if (!session) {\n console.warn(\n `[h2:warn:createHydrogenContext] A session object is required to create hydrogen context.`,\n );\n }\n\n if (customerAccountOptions?.unstableB2b) {\n warnOnce(\n '[h2:warn:createHydrogenContext] `customerAccount.unstableB2b` is now stable. Please remove the `unstableB2b` option.',\n );\n }\n\n /**\n * Create Hydrogen's Storefront client.\n */\n const {storefront} = createStorefrontClient<TI18n>({\n // share options\n cache,\n waitUntil,\n i18n,\n logErrors,\n\n // storefrontOptions\n storefrontHeaders:\n storefrontOptions.headers || getStorefrontHeaders(request),\n storefrontApiVersion: storefrontOptions.apiVersion,\n\n // defaults\n storefrontId: env.PUBLIC_STOREFRONT_ID,\n storeDomain: env.PUBLIC_STORE_DOMAIN,\n privateStorefrontToken: env.PRIVATE_STOREFRONT_API_TOKEN,\n publicStorefrontToken: env.PUBLIC_STOREFRONT_API_TOKEN,\n });\n\n const customerAccount = createCustomerAccountClient({\n // share options\n session,\n request,\n waitUntil,\n logErrors,\n\n // customerAccountOptions\n customerApiVersion: customerAccountOptions?.apiVersion,\n authUrl: customerAccountOptions?.authUrl,\n customAuthStatusHandler: customerAccountOptions?.customAuthStatusHandler,\n\n // locale - i18n.language is a union of StorefrontLanguageCode | CustomerLanguageCode\n // We cast here because createCustomerAccountClient expects CustomerLanguageCode specifically,\n // but the union type is compatible since most language codes overlap between the two APIs\n language: i18n?.language as LanguageCode | undefined,\n\n // defaults\n customerAccountId: env.PUBLIC_CUSTOMER_ACCOUNT_API_CLIENT_ID,\n shopId: env.SHOP_ID,\n });\n\n /*\n * Create a cart handler that will be used to\n * create and update the cart in the session.\n */\n const cart = createCartHandler({\n // cartOptions\n getCartId: cartOptions.getId || cartGetIdDefault(request.headers),\n setCartId: cartOptions.setId || cartSetIdDefault(),\n cartQueryFragment: cartOptions.queryFragment,\n cartMutateFragment: cartOptions.mutateFragment,\n customMethods: cartOptions.customMethods,\n buyerIdentity,\n\n // defaults\n storefront,\n customerAccount,\n });\n\n // Create React Router context provider\n const routerProvider = new RouterContextProvider();\n\n // Set React Router context keys (enables context.get(storefrontContext))\n routerProvider.set(storefrontContext, storefront);\n routerProvider.set(cartContext, cart);\n routerProvider.set(customerAccountContext, customerAccount);\n routerProvider.set(envContext, env);\n routerProvider.set(sessionContext, session);\n if (waitUntil) {\n routerProvider.set(waitUntilContext, waitUntil);\n }\n\n // Create Hydrogen services map for direct property access\n const services = {\n storefront,\n cart,\n customerAccount,\n env,\n session,\n waitUntil,\n // Merge additional context properties (CMS clients, 3P SDKs, etc.)\n ...(additionalContext || {}),\n };\n\n // Create Proxy for hybrid access pattern - cleanest approach\n const hybridProvider = new Proxy(routerProvider, {\n get(target, prop, receiver) {\n // If it's a React Router method or property, use the target\n if (prop in target) {\n const value = target[prop as keyof typeof target];\n // Bind methods to preserve 'this' context\n return typeof value === 'function' ? value.bind(target) : value;\n }\n\n // If it's a Hydrogen service property, return from services\n if (prop in services) {\n return services[prop as keyof typeof services];\n }\n\n // Default behavior for other properties\n return Reflect.get(target, prop, receiver);\n },\n\n has(target, prop) {\n // Property exists if it's in target OR services\n return prop in target || prop in services;\n },\n\n ownKeys(target) {\n // Return all keys from both target and services\n return [...Reflect.ownKeys(target), ...Object.keys(services)];\n },\n\n getOwnPropertyDescriptor(target, prop) {\n // If property exists on target, return its descriptor\n if (prop in target) {\n return Reflect.getOwnPropertyDescriptor(target, prop);\n }\n\n // If property exists in services, return a descriptor that makes it enumerable\n if (prop in services) {\n return {\n enumerable: true,\n configurable: true,\n writable: false,\n value: services[prop as keyof typeof services],\n };\n }\n\n // Property doesn't exist\n return undefined;\n },\n });\n\n return hybridProvider as HydrogenRouterContextProvider<\n TSession,\n TCustomMethods,\n TI18n,\n TEnv\n > &\n TAdditionalContext;\n}\n\nexport type HydrogenContextOptionsForDocs<\n TSession extends HydrogenSession = HydrogenSession,\n TI18n extends I18nBase = I18nBase,\n TEnv extends HydrogenEnv = Env,\n> = {\n /* Environment variables from the fetch function */\n env: TEnv;\n /* Request object from the fetch function */\n request: CrossRuntimeRequest;\n /** An instance that implements the [Cache API](https://developer.mozilla.org/en-US/docs/Web/API/Cache) */\n cache?: Cache;\n /** The `waitUntil` function is used to keep the current request/response lifecycle alive even after a response has been sent. It should be provided by your platform. */\n waitUntil?: WaitUntil;\n /** Any cookie implementation. By default Hydrogen ships with cookie session storage, but you can use [another session storage](https://remix.run/docs/en/main/utils/sessions) implementation. */\n session: TSession;\n /** An object containing a country code and language code */\n i18n?: TI18n;\n /** Whether it should print GraphQL errors automatically. Defaults to true */\n logErrors?: boolean | ((error?: Error) => boolean);\n /** Storefront client overwrite options. See documentation for createStorefrontClient for more information. */\n storefront?: {\n /** Storefront API headers. Default values set from request header. */\n headers?: StorefrontHeaders;\n /** Override the Storefront API version for this query. */\n apiVersion?: string;\n };\n /** Customer Account client overwrite options. See documentation for createCustomerAccountClient for more information. */\n customerAccount?: {\n /** Override the version of the API */\n apiVersion?: string;\n /** This is the route in your app that authorizes the customer after logging in. Make sure to call `customer.authorize()` within the loader on this route. It defaults to `/account/authorize`. */\n authUrl?: string;\n /** Use this method to overwrite the default logged-out redirect behavior. The default handler [throws a redirect](https://remix.run/docs/en/main/utils/redirect#:~:text=!session) to `/account/login` with current path as `return_to` query param. */\n customAuthStatusHandler?: () => Response | NonNullable<unknown> | null;\n /** Deprecated. `unstableB2b` is now stable. Please remove. */\n unstableB2b?: boolean;\n };\n /** Cart handler overwrite options. See documentation for createCartHandler for more information. */\n cart?: {\n /** A function that returns the cart id in the form of `gid://shopify/Cart/c1-123`. */\n getId?: () => string | undefined;\n /** A function that sets the cart ID. */\n setId?: (cartId: string) => Headers;\n /**\n * The cart query fragment used by `cart.get()`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n queryFragment?: string;\n /**\n * The cart mutation fragment used in most mutation requests, except for `setMetafields` and `deleteMetafield`.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-cart-fragments) in the documentation.\n */\n mutateFragment?: string;\n /**\n * Define custom methods or override existing methods for your cart API instance.\n * See the [example usage](/docs/api/hydrogen/utilities/createcarthandler#example-custom-methods) in the documentation.\n */\n customMethods?: Record<string, Function>;\n };\n /**\n * Buyer identity. Default buyer identity is passed to cartCreate.\n */\n buyerIdentity?: CartBuyerIdentityInput;\n};\n","import {\n createRequestHandler as createReactRouterRequestHandler,\n type AppLoadContext,\n type RouterContextProvider,\n type ServerBuild,\n} from 'react-router';\nimport {storefrontContext} from './context-keys';\nimport {HYDROGEN_SFAPI_PROXY_KEY} from './constants';\nimport {appendServerTimingHeader} from './utils/server-timing';\nimport {warnOnce} from './utils/warning';\n\ntype CreateRequestHandlerOptions<Context = unknown> = {\n /** React Router's server build */\n build: ServerBuild;\n /** React Router's mode */\n mode?: string;\n /**\n * Function to provide the load context for each request.\n * It must contain Hydrogen's storefront client instance\n * for other Hydrogen utilities to work properly.\n */\n getLoadContext?: (request: Request) => Promise<Context> | Context;\n /**\n * Whether to include the `powered-by` header in responses\n * @default true\n */\n poweredByHeader?: boolean;\n /**\n * Collect tracking information from subrequests such as cookies\n * and forward them to the browser. Disable this if you are not\n * using Hydrogen's built-in analytics.\n * @default true\n */\n collectTrackingInformation?: boolean;\n /**\n * Whether to proxy standard routes such as `/api/.../graphql.json` (Storefront API).\n * You can disable this if you are handling these routes yourself. Ensure that\n * the proxy works if you rely on Hydrogen's built-in behaviors such as analytics.\n * @default true\n */\n proxyStandardRoutes?: boolean;\n};\n\n/**\n * Creates a request handler for Hydrogen apps using React Router.\n */\nexport function createRequestHandler<Context = unknown>({\n build,\n mode,\n poweredByHeader = true,\n getLoadContext,\n collectTrackingInformation = true,\n proxyStandardRoutes = true,\n}: CreateRequestHandlerOptions<Context>) {\n const handleRequest = createReactRouterRequestHandler(build, mode);\n\n const appendPoweredByHeader = poweredByHeader\n ? (response: Response) =>\n response.headers.append('powered-by', 'Shopify, Hydrogen')\n : undefined;\n\n return async (request: Request) => {\n const method = request.method;\n\n if ((method === 'GET' || method === 'HEAD') && request.body) {\n return new Response(`${method} requests cannot have a body`, {\n status: 400,\n });\n }\n\n const url = new URL(request.url);\n\n if (url.pathname.includes('//')) {\n return new Response(null, {\n status: 301,\n headers: {\n location: url.pathname.replace(/\\/+/g, '/'),\n },\n });\n }\n\n const context = (await getLoadContext?.(request)) as\n | undefined\n | (RouterContextProvider & AppLoadContext);\n\n const storefront = context?.storefront || context?.get?.(storefrontContext);\n\n if (proxyStandardRoutes) {\n if (!storefront) {\n // TODO: this should throw error in future major version\n warnOnce(\n '[h2:createRequestHandler] Storefront instance is required to proxy standard routes.',\n );\n }\n\n if (storefront?.isStorefrontApiUrl(request)) {\n const response = await storefront.forward(request);\n appendPoweredByHeader?.(response);\n return response;\n }\n }\n\n const response = await handleRequest(request, context);\n\n if (storefront && proxyStandardRoutes) {\n if (collectTrackingInformation) {\n storefront.setCollectedSubrequestHeaders(response);\n }\n\n // TODO: assume SFAPI proxy is available in future major version\n // Signal that SFAPI proxy is enabled for document requests.\n // Note: sec-fetch-dest is automatically added by modern browsers,\n // but we also check the Accept header for other clients.\n const fetchDest = request.headers.get('sec-fetch-dest');\n if (\n (fetchDest && fetchDest === 'document') ||\n request.headers.get('accept')?.includes('text/html')\n ) {\n appendServerTimingHeader(response, {[HYDROGEN_SFAPI_PROXY_KEY]: '1'});\n }\n }\n\n appendPoweredByHeader?.(response);\n\n return response;\n };\n}\n\nexport type CreateRequestHandlerOptionsForDocs = {\n /** React Router's server build */\n build: ServerBuild;\n /** React Router's mode */\n mode?: string;\n /**\n * Function to provide the load context for each request.\n * It must contain Hydrogen's storefront client instance\n * for other Hydrogen utilities to work properly.\n */\n getLoadContext?: (request: Request) => Promise<unknown> | unknown;\n /**\n * Whether to include the `powered-by` header in responses.\n * @default true\n */\n poweredByHeader?: boolean;\n /**\n * Collect tracking information from subrequests such as cookies\n * and forward them to the browser. Disable this if you are not\n * using Hydrogen's built-in analytics.\n * @default true\n */\n collectTrackingInformation?: boolean;\n /**\n * Whether to proxy standard routes such as `/api/.../graphql.json` (Storefront API).\n * You can disable this if you are handling these routes yourself. Ensure that\n * the proxy works if you rely on Hydrogen's built-in behaviors such as analytics.\n * @default true\n */\n proxyStandardRoutes?: boolean;\n};\n","import {\n type ComponentType,\n createContext,\n createElement,\n type ReactNode,\n useContext,\n} from 'react';\nimport cspBuilder from 'content-security-policy-builder';\nimport {generateNonce} from './nonce';\n\nexport const NonceContext = createContext<string | undefined>(undefined);\nexport const NonceProvider = NonceContext.Provider;\n\nexport const useNonce = () => useContext(NonceContext);\n\ntype ContentSecurityPolicy = {\n /** A randomly generated nonce string that should be passed to any custom `script` element */\n nonce: string;\n /** The content security policy header */\n header: string;\n NonceProvider: ComponentType<{children: ReactNode}>;\n};\n\ntype DirectiveValues = string[] | string | boolean;\n\ntype CreateContentSecurityPolicy = {\n defaultSrc?: DirectiveValues;\n scriptSrc?: DirectiveValues;\n scriptSrcElem?: DirectiveValues;\n styleSrc?: DirectiveValues;\n imgSrc?: DirectiveValues;\n connectSrc?: DirectiveValues;\n fontSrc?: DirectiveValues;\n objectSrc?: DirectiveValues;\n mediaSrc?: DirectiveValues;\n frameSrc?: DirectiveValues;\n sandbox?: DirectiveValues;\n reportUri?: DirectiveValues;\n childSrc?: DirectiveValues;\n formAction?: DirectiveValues;\n frameAncestors?: DirectiveValues;\n pluginTypes?: DirectiveValues;\n baseUri?: DirectiveValues;\n reportTo?: DirectiveValues;\n workerSrc?: DirectiveValues;\n manifestSrc?: DirectiveValues;\n prefetchSrc?: DirectiveValues;\n navigateTo?: DirectiveValues;\n upgradeInsecureRequests?: boolean;\n blockAllMixedContent?: boolean;\n};\n\ntype ShopifyDomains = {\n /** The production shop checkout domain url. */\n checkoutDomain?: string;\n /** The production shop domain url. */\n storeDomain?: string;\n};\n\ntype ShopProp = {\n /** Shop specific configurations */\n shop?: ShopifyDomains;\n};\n\n/**\n * @param directives - Pass custom [content security policy directives](https://content-security-policy.com/). This is important if you load content in your app from third-party domains.\n */\nexport function createContentSecurityPolicy(\n props?: CreateContentSecurityPolicy & ShopProp,\n): ContentSecurityPolicy {\n const nonce = generateNonce();\n const header = createCSPHeader(nonce, props);\n\n const Provider = ({children}: {children: ReactNode}) => {\n return createElement(NonceProvider, {value: nonce}, children);\n };\n\n return {\n nonce,\n header,\n NonceProvider: Provider,\n };\n}\n\nfunction createCSPHeader(\n nonce: string,\n props?: CreateContentSecurityPolicy & ShopProp,\n): string {\n const {shop, ...directives} = props ?? {};\n const nonceString = `'nonce-${nonce}'`;\n const styleSrc = [\"'self'\", \"'unsafe-inline'\", 'https://cdn.shopify.com'];\n const connectSrc = [\n \"'self'\",\n 'https://cdn.shopify.com/',\n 'https://monorail-edge.shopifysvc.com',\n ];\n if (shop && shop.checkoutDomain) {\n connectSrc.push(`https://${shop.checkoutDomain}`);\n }\n\n if (shop && shop.storeDomain) {\n connectSrc.push(`https://${shop.storeDomain}`);\n }\n\n const defaultSrc = [\n \"'self'\",\n nonceString,\n 'https://cdn.shopify.com',\n // Used for the Customer Account API\n 'https://shopify.com',\n ];\n\n const defaultDirectives: Record<string, string[] | string | boolean> = {\n baseUri: [\"'self'\"],\n defaultSrc,\n frameAncestors: [\"'none'\"],\n styleSrc,\n connectSrc,\n };\n\n // Support localhost in development\n if (process.env.NODE_ENV === 'development') {\n defaultDirectives.styleSrc = [...styleSrc, 'http://localhost:*'];\n defaultDirectives.defaultSrc = [...defaultSrc, 'http://localhost:*'];\n defaultDirectives.connectSrc = [\n ...connectSrc,\n 'http://localhost:*',\n // For HMR:\n 'ws://localhost:*',\n 'ws://127.0.0.1:*',\n 'ws://*.tryhydrogen.dev:*',\n ];\n }\n\n const combinedDirectives = Object.assign({}, defaultDirectives, directives);\n\n //add defaults if it was override\n for (const key in defaultDirectives) {\n const directive = directives[key as keyof CreateContentSecurityPolicy];\n if (key && directive) {\n combinedDirectives[key] = addCspDirective(\n directive,\n defaultDirectives[key],\n );\n }\n }\n\n // Make sure that at least script-src includes a nonce directive.\n // If someone doesn't want a nonce in their CSP, they probably\n // shouldn't use our utilities and just manually create their CSP.\n if (combinedDirectives.scriptSrc instanceof Array) {\n combinedDirectives.scriptSrc = [\n ...combinedDirectives.scriptSrc.filter((ss) => !ss.startsWith(`'nonce`)),\n nonceString,\n ];\n } else if (combinedDirectives.defaultSrc instanceof Array) {\n combinedDirectives.defaultSrc = [\n ...combinedDirectives.defaultSrc.filter((ss) => !ss.startsWith(`'nonce`)),\n nonceString,\n ];\n }\n\n return cspBuilder({\n directives: combinedDirectives,\n });\n}\n\nfunction addCspDirective(\n currentValue: string[] | string | boolean,\n value: string[] | string | boolean,\n): boolean | string[] {\n const normalizedValue = typeof value === 'string' ? [value] : value;\n const normalizedCurrentValue = Array.isArray(currentValue)\n ? currentValue\n : [String(currentValue)];\n\n const newValue = Array.isArray(normalizedValue)\n ? // If the default directive is `none`, don't\n // merge the override with the default value.\n normalizedValue.every((a) => a === `'none'`)\n ? normalizedCurrentValue\n : [...normalizedCurrentValue, ...normalizedValue]\n : normalizedValue;\n\n return newValue;\n}\n","import {forwardRef, ScriptHTMLAttributes, HTMLAttributes} from 'react';\nimport {useNonce} from './csp';\nimport {useLoadScript} from '@shopify/hydrogen-react';\n\ntype ScriptProps = HydrogenScriptProps & ScriptAttributes;\n\ninterface HydrogenScriptProps {\n /** Wait to load the script until after the page hydrates. This prevents hydration errors for scripts that modify the DOM. Note: For security, `nonce` is not supported when using `waitForHydration`. Instead you need to add the domain of the script directly to your [Content Securitiy Policy directives](https://shopify.dev/docs/storefronts/headless/hydrogen/content-security-policy#step-3-customize-the-content-security-policy).*/\n waitForHydration?: boolean;\n}\n\ninterface ScriptAttributes extends ScriptHTMLAttributes<HTMLScriptElement> {}\n\nexport const Script = forwardRef<HTMLScriptElement, ScriptProps>(\n (props, ref) => {\n const {waitForHydration, src, ...rest} = props;\n\n const nonce = useNonce();\n\n if (waitForHydration) return <LazyScript src={src} options={rest} />;\n\n return (\n <script\n suppressHydrationWarning\n {...rest}\n src={src}\n nonce={nonce}\n ref={ref}\n />\n );\n },\n);\n\nfunction LazyScript({\n src,\n options,\n}: {\n src?: string;\n options: JSX.IntrinsicElements['script'];\n}) {\n if (!src)\n throw new Error(\n '`waitForHydration` with the Script component requires a `src` prop',\n );\n\n useLoadScript(src, {\n attributes: options as Record<string, string>,\n });\n\n return null;\n}\n","import type {RouteConfigEntry} from '@react-router/dev/routes';\n\n// Make this transform the existing routes instead.\nexport async function hydrogenRoutes(\n currentRoutes: Array<RouteConfigEntry>,\n): Promise<Array<RouteConfigEntry>> {\n // Only run this in development and test environments.\n const env = process.env.NODE_ENV;\n if (env === 'production') {\n return currentRoutes;\n }\n\n // Dynamic import to avoid loading Node.js modules in worker environment\n const {getVirtualRoutesV3} = await import('../vite/get-virtual-routes');\n const {layout, routes: virtualRoutes} = await getVirtualRoutesV3();\n\n const childVirtualRoutes = virtualRoutes.map(({path, file, index, id}) => {\n return {\n file,\n id,\n index,\n path,\n };\n });\n\n const virtualLayout = {\n file: layout.file,\n children: childVirtualRoutes,\n };\n\n // The virtual root should land after any existing routes because of the root path\n // handling.\n return [...currentRoutes, virtualLayout];\n}\n","import {useFetchers} from 'react-router';\n\nexport function useOptimisticData<T>(identifier: string) {\n const fetchers = useFetchers();\n const data: Record<string, unknown> = {};\n\n for (const {formData} of fetchers) {\n if (formData?.get('optimistic-identifier') === identifier) {\n try {\n if (formData.has('optimistic-data')) {\n const dataInForm: unknown = JSON.parse(\n String(formData.get('optimistic-data')),\n );\n Object.assign(data, dataInForm);\n }\n } catch {\n // do nothing\n }\n }\n }\n return data as T;\n}\n\nexport type OptimisticInputProps = {\n /**\n * A unique identifier for the optimistic input. Use the same identifier in `useOptimisticData`\n * to retrieve the optimistic data from actions.\n */\n id: string;\n /**\n * The data to be stored in the optimistic input. Use for creating an optimistic successful state\n * of this form action.\n */\n data: Record<string, unknown>;\n};\n\nexport function OptimisticInput({id, data}: OptimisticInputProps) {\n return (\n <>\n <input type=\"hidden\" name=\"optimistic-identifier\" value={id} />\n <input\n type=\"hidden\"\n name=\"optimistic-data\"\n value={JSON.stringify(data)}\n />\n </>\n );\n}\n","import {\n createElement,\n useEffect,\n useMemo,\n useRef,\n forwardRef,\n useState,\n type Ref,\n type FC,\n type ForwardRefExoticComponent,\n type RefAttributes,\n} from 'react';\nimport type {\n Maybe,\n PageInfo,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {flattenConnection} from '@shopify/hydrogen-react';\nimport {\n Link,\n type LinkProps,\n useNavigation,\n useLocation,\n useNavigate,\n} from 'react-router';\n\ndeclare global {\n interface Window {\n // Use a global variable to keep track\n // of when the page finishes hydrating\n __hydrogenHydrated?: boolean;\n }\n}\n\ntype Connection<NodesType> =\n | {\n nodes: Array<NodesType>;\n pageInfo: PageInfo;\n }\n | {\n edges: Array<{\n node: NodesType;\n }>;\n pageInfo: PageInfo;\n };\n\ntype PaginationState<NodesType> = {\n pagination?: {\n [key: string]: {\n nodes: Array<NodesType>;\n pageInfo?: PageInfo | null;\n };\n };\n};\n\ninterface PaginationInfo<NodesType> {\n /** The paginated array of nodes. You should map over and render this array. */\n nodes: Array<NodesType>;\n /** The `<NextLink>` is a helper component that makes it easy to navigate to the next page of paginated data. Alternatively you can build your own `<Link>` component: `<Link to={nextPageUrl} state={state} preventScrollReset />` */\n NextLink: ForwardRefExoticComponent<\n Omit<LinkProps, 'to'> & RefAttributes<HTMLAnchorElement>\n >;\n /** The `<PreviousLink>` is a helper component that makes it easy to navigate to the previous page of paginated data. Alternatively you can build your own `<Link>` component: `<Link to={previousPageUrl} state={state} preventScrollReset />` */\n PreviousLink: ForwardRefExoticComponent<\n Omit<LinkProps, 'to'> & RefAttributes<HTMLAnchorElement>\n >;\n /** The URL to the previous page of paginated data. Use this prop to build your own `<Link>` component. */\n previousPageUrl: string;\n /** The URL to the next page of paginated data. Use this prop to build your own `<Link>` component. */\n nextPageUrl: string;\n /** True if the cursor has next paginated data */\n hasNextPage: boolean;\n /** True if the cursor has previous paginated data */\n hasPreviousPage: boolean;\n /** True if we are in the process of fetching another page of data */\n isLoading: boolean;\n /** The `state` property is important to use when building your own `<Link>` component if you want paginated data to continuously append to the page. This means that every time the user clicks \"Next page\", the next page of data will be apppended inline with the previous page. If you want the whole page to re-render with only the next page results, do not pass the `state` prop to the Remix `<Link>` component. */\n state: {\n nodes: Array<NodesType>;\n pageInfo: {\n endCursor: Maybe<string> | undefined;\n startCursor: Maybe<string> | undefined;\n hasPreviousPage: boolean;\n };\n };\n}\n\ntype PaginationProps<NodesType> = {\n /** The response from `storefront.query` for a paginated request. Make sure the query is passed pagination variables and that the query has `pageInfo` with `hasPreviousPage`, `hasNextpage`, `startCursor`, and `endCursor` defined. */\n connection: Connection<NodesType>;\n /** A render prop that includes pagination data and helpers. */\n children: PaginationRenderProp<NodesType>;\n /** A namespace for the pagination component to avoid URL param conflicts when using multiple `Pagination` components on a single page. */\n namespace?: string;\n};\n\ntype PaginationRenderProp<NodesType> = FC<PaginationInfo<NodesType>>;\n\n/**\n *\n * The [Storefront API uses cursors](https://shopify.dev/docs/api/usage/pagination-graphql) to paginate through lists of data\n * and the \\`<Pagination />\\` component makes it easy to paginate data from the Storefront API.\n *\n * @prop connection The response from `storefront.query` for a paginated request. Make sure the query is passed pagination variables and that the query has `pageInfo` with `hasPreviousPage`, `hasNextpage`, `startCursor`, and `endCursor` defined.\n * @prop children A render prop that includes pagination data and helpers.\n */\nexport function Pagination<NodesType>({\n connection,\n children = () => {\n console.warn('<Pagination> requires children to work properly');\n return null;\n },\n namespace = '',\n}: PaginationProps<NodesType>): ReturnType<FC> {\n const [isLoading, setIsLoading] = useState(false);\n const transition = useNavigation();\n const location = useLocation();\n const navigate = useNavigate();\n\n // Reset loading state once the transition state is idle\n useEffect(() => {\n if (transition.state === 'idle') {\n setIsLoading(false);\n }\n }, [transition.state]);\n\n const {\n endCursor,\n hasNextPage,\n hasPreviousPage,\n nextPageUrl,\n nodes,\n previousPageUrl,\n startCursor,\n } = usePagination<NodesType>(connection, namespace);\n\n const state = useMemo(\n () => ({\n ...location.state,\n pagination: {\n ...(location.state?.pagination || {}),\n [namespace]: {\n pageInfo: {\n endCursor,\n hasPreviousPage,\n hasNextPage,\n startCursor,\n },\n nodes,\n },\n },\n }),\n [\n endCursor,\n hasNextPage,\n hasPreviousPage,\n startCursor,\n nodes,\n namespace,\n location.state,\n ],\n );\n\n const NextLink = useMemo(\n () =>\n forwardRef<HTMLAnchorElement, Omit<LinkProps, 'to'>>(\n function NextLink(props, ref) {\n return hasNextPage\n ? createElement(Link, {\n preventScrollReset: true,\n ...props,\n to: nextPageUrl,\n state,\n replace: true,\n ref,\n onClick: () => setIsLoading(true),\n })\n : null;\n },\n ),\n [hasNextPage, nextPageUrl, state],\n );\n\n const PreviousLink = useMemo(\n () =>\n forwardRef<HTMLAnchorElement, Omit<LinkProps, 'to'>>(\n function PrevLink(props, ref) {\n return hasPreviousPage\n ? createElement(Link, {\n preventScrollReset: true,\n ...props,\n to: previousPageUrl,\n state,\n replace: true,\n ref,\n onClick: () => setIsLoading(true),\n })\n : null;\n },\n ),\n [hasPreviousPage, previousPageUrl, state],\n );\n\n return children({\n state,\n hasNextPage,\n hasPreviousPage,\n isLoading,\n nextPageUrl,\n nodes,\n previousPageUrl,\n NextLink,\n PreviousLink,\n });\n}\n\nfunction getParamsWithoutPagination(\n paramsString?: string,\n state?: PaginationState<any>,\n) {\n const params = new URLSearchParams(paramsString);\n\n // Get all namespaces from state\n const activeNamespaces = Object.keys(state?.pagination || {});\n\n activeNamespaces.forEach((namespace) => {\n // Clean up cursor and direction params for both namespaced and non-namespaced pagination\n const namespacePrefix = namespace === '' ? '' : `${namespace}_`;\n const cursorParam = `${namespacePrefix}cursor`;\n const directionParam = `${namespacePrefix}direction`;\n params.delete(cursorParam);\n params.delete(directionParam);\n });\n\n return params.toString();\n}\n\nfunction makeError(prop: string) {\n throw new Error(\n `The Pagination component requires ${\n '`' + prop + '`'\n } to be a part of your query. See the guide on how to setup your query to include ${\n '`' + prop + '`'\n }: https://shopify.dev/docs/custom-storefronts/hydrogen/data-fetching/pagination#setup-the-paginated-query`,\n );\n}\n\n/**\n * Get cumulative pagination logic for a given connection\n */\nexport function usePagination<NodesType>(\n connection: Connection<NodesType>,\n namespace: string = '',\n): Omit<\n PaginationInfo<NodesType>,\n 'isLoading' | 'state' | 'NextLink' | 'PreviousLink'\n> & {\n startCursor: Maybe<string> | undefined;\n endCursor: Maybe<string> | undefined;\n} {\n if (!connection.pageInfo) {\n makeError('pageInfo');\n }\n\n if (typeof connection.pageInfo.startCursor === 'undefined') {\n makeError('pageInfo.startCursor');\n }\n\n if (typeof connection.pageInfo.endCursor === 'undefined') {\n makeError('pageInfo.endCursor');\n }\n\n if (typeof connection.pageInfo.hasNextPage === 'undefined') {\n makeError('pageInfo.hasNextPage');\n }\n\n if (typeof connection.pageInfo.hasPreviousPage === 'undefined') {\n makeError('pageInfo.hasPreviousPage');\n }\n\n const transition = useNavigation();\n const navigate = useNavigate();\n const {state, search, pathname} = useLocation() as {\n state?: PaginationState<NodesType>;\n search?: string;\n pathname?: string;\n };\n\n const cursorParam = namespace ? `${namespace}_cursor` : 'cursor';\n const directionParam = namespace ? `${namespace}_direction` : 'direction';\n\n const params = new URLSearchParams(search);\n const direction = params.get(directionParam);\n const isPrevious = direction === 'previous';\n\n const nodes = useMemo(() => {\n if (\n !globalThis?.window?.__hydrogenHydrated ||\n !state?.pagination?.[namespace]?.nodes\n ) {\n return flattenConnection(connection);\n }\n\n if (isPrevious) {\n return [\n ...flattenConnection(connection),\n ...(state.pagination[namespace].nodes || []),\n ];\n } else {\n return [\n ...(state.pagination[namespace].nodes || []),\n ...flattenConnection(connection),\n ];\n }\n }, [state, connection, namespace]);\n\n const currentPageInfo = useMemo(() => {\n const hydrogenHydrated = globalThis?.window?.__hydrogenHydrated;\n const stateInfo = state?.pagination?.[namespace]?.pageInfo;\n\n let pageStartCursor =\n !hydrogenHydrated || stateInfo?.startCursor === undefined\n ? connection.pageInfo.startCursor\n : stateInfo.startCursor;\n\n let pageEndCursor =\n !hydrogenHydrated || stateInfo?.endCursor === undefined\n ? connection.pageInfo.endCursor\n : stateInfo.endCursor;\n\n let previousPageExists =\n !hydrogenHydrated || stateInfo?.hasPreviousPage === undefined\n ? connection.pageInfo.hasPreviousPage\n : stateInfo.hasPreviousPage;\n\n let nextPageExists =\n !hydrogenHydrated || stateInfo?.hasNextPage === undefined\n ? connection.pageInfo.hasNextPage\n : stateInfo.hasNextPage;\n\n // Update page info based on current connection\n if (state?.pagination?.[namespace]?.nodes) {\n if (isPrevious) {\n pageStartCursor = connection.pageInfo.startCursor;\n previousPageExists = connection.pageInfo.hasPreviousPage;\n } else {\n pageEndCursor = connection.pageInfo.endCursor;\n nextPageExists = connection.pageInfo.hasNextPage;\n }\n }\n\n return {\n startCursor: pageStartCursor,\n endCursor: pageEndCursor,\n hasPreviousPage: previousPageExists,\n hasNextPage: nextPageExists,\n };\n }, [\n isPrevious,\n state,\n namespace,\n connection.pageInfo.hasNextPage,\n connection.pageInfo.hasPreviousPage,\n connection.pageInfo.startCursor,\n connection.pageInfo.endCursor,\n ]);\n\n // Keep track of the current URL state, to compare whenever the URL changes\n const urlRef = useRef({\n params: getParamsWithoutPagination(search, state),\n pathname,\n });\n\n useEffect(() => {\n // Set a global variable to keep track of when the page finishes hydrating.\n // We can't use local state or a ref because it will be reset on soft navigations\n // to the page. This variable allows us to use the SSR'd data on the first render,\n // preventing hydration errors. On soft navigations, like browser back/forward\n // navigation, instead of using the SSR'd data, we use the data from location state.\n window.__hydrogenHydrated = true;\n }, []);\n\n useEffect(() => {\n const currentParams = getParamsWithoutPagination(search, state);\n const previousParams = urlRef.current.params;\n const pathChanged = pathname !== urlRef.current.pathname;\n const nonPaginationParamsChanged = currentParams !== previousParams;\n\n if (\n // Only clean up if the base URL or non-pagination params change\n (pathChanged || nonPaginationParamsChanged) &&\n // And we're not on the initial load\n !(transition.state === 'idle' && !transition.location)\n ) {\n urlRef.current = {\n pathname,\n params: getParamsWithoutPagination(search, state),\n };\n navigate(`${pathname}?${getParamsWithoutPagination(search, state)}`, {\n replace: true,\n preventScrollReset: true,\n state: {nodes: undefined, pageInfo: undefined},\n });\n }\n }, [pathname, search, state]);\n\n const previousPageUrl = useMemo(() => {\n const params = new URLSearchParams(search);\n params.set(directionParam, 'previous');\n currentPageInfo.startCursor &&\n params.set(cursorParam, currentPageInfo.startCursor);\n return `?${params.toString()}`;\n }, [search, currentPageInfo.startCursor]);\n\n const nextPageUrl = useMemo(() => {\n const params = new URLSearchParams(search);\n params.set(directionParam, 'next');\n currentPageInfo.endCursor &&\n params.set(cursorParam, currentPageInfo.endCursor);\n return `?${params.toString()}`;\n }, [search, currentPageInfo.endCursor]);\n\n return {...currentPageInfo, previousPageUrl, nextPageUrl, nodes};\n}\n\n/**\n * @param request The request object passed to your Remix loader function.\n * @param options Options for how to configure the pagination variables. Includes the ability to change how many nodes are within each page as well as a namespace to avoid URL param conflicts when using multiple `Pagination` components on a single page.\n *\n * @returns Variables to be used with the `storefront.query` function\n */\nexport function getPaginationVariables(\n request: Request,\n options: {pageBy: number; namespace?: string} = {pageBy: 20},\n) {\n if (typeof request?.url === 'undefined') {\n throw new Error(\n 'getPaginationVariables must be called with the Request object passed to your loader function',\n );\n }\n\n const {pageBy, namespace = ''} = options;\n const searchParams = new URLSearchParams(new URL(request.url).search);\n\n const cursorParam = namespace ? `${namespace}_cursor` : 'cursor';\n const directionParam = namespace ? `${namespace}_direction` : 'direction';\n\n const cursor = searchParams.get(cursorParam) ?? undefined;\n const direction =\n searchParams.get(directionParam) === 'previous' ? 'previous' : 'next';\n const isPrevious = direction === 'previous';\n\n const prevPage = {\n last: pageBy,\n startCursor: cursor ?? null,\n };\n\n const nextPage = {\n first: pageBy,\n endCursor: cursor ?? null,\n };\n\n const variables = isPrevious ? prevPage : nextPage;\n\n return variables;\n}\n","import {useNavigation} from 'react-router';\nimport {ProductVariant} from '@shopify/hydrogen-react/storefront-api-types';\nimport {useEffect, useState} from 'react';\nimport type {PartialDeep} from 'type-fest';\n\ntype OptimisticVariant<T> = T & {\n isOptimistic?: boolean;\n};\n\ntype OptimisticVariantInput = PartialDeep<ProductVariant>;\n\ntype OptimisticProductVariants =\n | Array<PartialDeep<ProductVariant>>\n | Promise<Array<PartialDeep<ProductVariant>>>\n | PartialDeep<ProductVariant>\n | Promise<PartialDeep<ProductVariant>>;\n\n/**\n * @param selectedVariant The `selectedVariant` field queried with `variantBySelectedOptions`.\n * @param variants The available product variants for the product. This can be an array of variants, a promise that resolves to an array of variants, or an object with a `product` key that contains the variants.\n * @returns A new product object where the `selectedVariant` property is set to the variant that matches the current URL search params. If no variant is found, the original product object is returned. The `isOptimistic` property is set to `true` if the `selectedVariant` has been optimistically changed.\n */\nexport function useOptimisticVariant<\n SelectedVariant = OptimisticVariantInput,\n Variants = OptimisticProductVariants,\n>(\n selectedVariant: SelectedVariant,\n variants: Variants,\n): OptimisticVariant<SelectedVariant> {\n const navigation = useNavigation();\n const [resolvedVariants, setResolvedVariants] = useState<\n Array<PartialDeep<ProductVariant>>\n >([]);\n\n useEffect(() => {\n Promise.resolve(variants)\n .then((productWithVariants) => {\n if (productWithVariants) {\n setResolvedVariants(\n productWithVariants instanceof Array\n ? productWithVariants\n : (productWithVariants as PartialDeep<ProductVariant>).product\n ?.variants?.nodes || [],\n );\n }\n })\n .catch((error) => {\n reportError(\n new Error(\n '[h2:error:useOptimisticVariant] An error occurred while resolving the variants for the optimistic product hook.',\n {\n cause: error,\n },\n ),\n );\n });\n }, [JSON.stringify(variants)]);\n\n if (navigation.state === 'loading') {\n const queryParams = new URLSearchParams(navigation.location.search);\n let reportedError = false;\n\n // Find matching variant\n const matchingVariant = resolvedVariants.find((variant) => {\n if (!variant.selectedOptions) {\n if (!reportedError) {\n reportedError = true;\n reportError(\n new Error(\n '[h2:error:useOptimisticVariant] The optimistic product hook requires your product query to include variants with the selectedOptions field.',\n ),\n );\n }\n return false;\n }\n\n return variant.selectedOptions.every((option) => {\n return queryParams.get(option.name) === option.value;\n });\n });\n\n if (matchingVariant) {\n return {\n ...matchingVariant,\n isOptimistic: true,\n } as OptimisticVariant<SelectedVariant>;\n }\n }\n\n return selectedVariant as OptimisticVariant<SelectedVariant>;\n}\n","import {useLocation, useNavigation} from 'react-router';\nimport {flattenConnection} from '@shopify/hydrogen-react';\nimport type {\n ProductOption,\n ProductOptionValue,\n ProductVariant,\n ProductVariantConnection,\n SelectedOptionInput,\n Maybe,\n} from '@shopify/hydrogen-react/storefront-api-types';\nimport {type ReactNode, useMemo, createElement, Fragment} from 'react';\nimport type {PartialDeep} from 'type-fest';\nimport {warnOnce} from '../utils/warning';\n\nexport type VariantOption = {\n name: string;\n value?: string;\n values: Array<VariantOptionValue>;\n};\n\ntype PartialProductOptionValues = PartialDeep<ProductOptionValue>;\ntype PartialProductOption = PartialDeep<\n Omit<ProductOption, 'optionValues'> & {\n optionValues: Array<PartialProductOptionValues>;\n }\n>;\n\nexport type VariantOptionValue = {\n value: string;\n isAvailable: boolean;\n to: string;\n search: string;\n isActive: boolean;\n variant?: PartialDeep<ProductVariant, {recurseIntoArrays: true}>;\n optionValue: PartialProductOptionValues;\n};\n\n/**\n * @deprecated VariantSelector will be deprecated and removed in the next major version 2025-07\n * Please use [getProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getproductoptions),\n * [getSelectedProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getselectedproductoptions),\n * [getAdjacentAndFirstAvailableVariants](https://shopify.dev/docs/api/hydrogen/latest/utilities/getadjacentandfirstavailablevariants) utils instead.\n * and [useSelectedOptionInUrlParam](https://shopify.dev/docs/api/hydrogen/latest/utilities/useselectedoptioninurlparam)\n * For a full implementation see the Skeleton template [routes/product.$handle.tsx](https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx).\n */\ntype VariantSelectorProps = {\n /** The product handle for all of the variants */\n handle: string;\n /** Product options from the [Storefront API](/docs/api/storefront/2025-07/objects/ProductOption). Make sure both `name` and `values` are a part of your query. */\n options: Array<PartialProductOption> | undefined;\n /** Product variants from the [Storefront API](/docs/api/storefront/2025-07/objects/ProductVariant). You only need to pass this prop if you want to show product availability. If a product option combination is not found within `variants`, it is assumed to be available. Make sure to include `availableForSale` and `selectedOptions.name` and `selectedOptions.value`. */\n variants?:\n | PartialDeep<ProductVariantConnection>\n | Array<PartialDeep<ProductVariant>>;\n /** By default all products are under /products. Use this prop to provide a custom path. */\n productPath?: string;\n /** Should the VariantSelector wait to update until after the browser navigates to a variant. */\n waitForNavigation?: boolean;\n /** An optional selected variant to use for the initial state if no URL parameters are set */\n selectedVariant?: Maybe<PartialDeep<ProductVariant>>;\n children: ({option}: {option: VariantOption}) => ReactNode;\n};\n\n/**\n * @deprecated VariantSelector will be deprecated and removed in the next major version 2025-07\n * Please use [getProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getproductoptions),\n * [getSelectedProductOptions](https://shopify.dev/docs/api/hydrogen/latest/utilities/getselectedproductoptions),\n * [getAdjacentAndFirstAvailableVariants](https://shopify.dev/docs/api/hydrogen/latest/utilities/getadjacentandfirstavailablevariants) utils instead.\n * and [useSelectedOptionInUrlParam](https://shopify.dev/docs/api/hydrogen/latest/utilities/useselectedoptioninurlparam)\n * For a full implementation see the Skeleton template [routes/product.$handle.tsx](https://github.com/Shopify/hydrogen/blob/main/templates/skeleton/app/routes/products.%24handle.tsx).\n */\nexport function VariantSelector({\n handle,\n options: _options = [],\n variants: _variants = [],\n productPath = 'products',\n waitForNavigation = false,\n selectedVariant,\n children,\n}: VariantSelectorProps) {\n // Deprecation notice for product.options.values\n // TODO: Remove this after product.options.values is removed from the Storefront API\n let options = _options;\n if (options[0]?.values) {\n warnOnce(\n '[h2:warn:VariantSelector] product.options.values is deprecated. Use product.options.optionValues instead.',\n );\n\n if (!!options[0] && !options[0].optionValues) {\n // Convert the old values format to the new optionValues format\n options = _options.map((option) => ({\n ...option,\n optionValues: option.values?.map((value) => ({name: value})) || [],\n }));\n }\n }\n\n const variants =\n _variants instanceof Array ? _variants : flattenConnection(_variants);\n\n const {searchParams, path, alreadyOnProductPage} = useVariantPath(\n handle,\n productPath,\n waitForNavigation,\n );\n\n // If an option only has one value, it doesn't need a UI to select it\n // But instead it always needs to be added to the product options so\n // the SFAPI properly finds the variant\n const optionsWithOnlyOneValue = options.filter(\n (option) => option?.optionValues?.length === 1,\n );\n\n // If a selected variant is provided, create a map of selected values\n const selectedVariantOptions = selectedVariant\n ? selectedVariant?.selectedOptions?.reduce<Record<string, string>>(\n (selectedValues, item) => {\n selectedValues[item.name] = item.value;\n return selectedValues;\n },\n {},\n )\n : {};\n\n return createElement(\n Fragment,\n null,\n ...useMemo(() => {\n return options.map((option) => {\n let activeValue;\n let availableValues: VariantOptionValue[] = [];\n\n for (let value of option.optionValues!) {\n // The clone the search params for each value, so we can calculate\n // a new URL for each option value pair\n const clonedSearchParams = new URLSearchParams(\n alreadyOnProductPage ? searchParams : undefined,\n );\n clonedSearchParams.set(option.name!, value.name!);\n\n // Because we hide options with only one value, they aren't selectable,\n // but they still need to get into the URL\n optionsWithOnlyOneValue.forEach((option) => {\n if (option.optionValues![0]!.name)\n clonedSearchParams.set(\n option.name!,\n option.optionValues![0]!.name,\n );\n });\n\n const variant = variants.find((variant) => {\n return variant?.selectedOptions?.every((selectedOption) => {\n // Get the selected value from the URL (default) or the selected variant\n const selectedValue =\n clonedSearchParams.get(selectedOption?.name!) ||\n selectedVariantOptions?.[selectedOption?.name!];\n\n return selectedValue === selectedOption?.value;\n });\n });\n\n let selectedValue = searchParams.get(option.name!);\n\n if (!selectedValue && selectedVariant) {\n // If there's no value set via a URL parameter, default\n // to the value from the first available variant\n selectedValue = selectedVariantOptions?.[option.name!] || null;\n }\n\n const calculatedActiveValue = selectedValue\n ? // If a URL parameter exists for the current option, check if it equals the current value\n selectedValue === value.name\n : false;\n\n if (calculatedActiveValue) {\n // Save out the current value if it's active. This should only ever happen once.\n // Should we throw if it happens a second time?\n activeValue = value.name!;\n }\n\n const searchString = '?' + clonedSearchParams.toString();\n\n availableValues.push({\n value: value.name!,\n optionValue: value,\n isAvailable: variant ? variant.availableForSale! : true,\n to: path + searchString,\n search: searchString,\n isActive: calculatedActiveValue,\n variant,\n });\n }\n\n return children({\n option: {\n name: option.name!,\n value: activeValue,\n values: availableValues,\n },\n });\n });\n }, [options, variants, children]),\n );\n}\n\ntype GetSelectedProductOptions = (request: Request) => SelectedOptionInput[];\n\n/**\n * Extract searchParams from a Request instance and return an array of selected options.\n * @param request - The Request instance to extract searchParams from.\n * @returns An array of selected options.\n * @example Basic usage:\n * ```tsx\n *\n * import {getSelectedProductOptions} from '@shopify/hydrogen';\n *\n * // Given a request url of `/products/product-handle?color=red&size=large`\n *\n * const selectedOptions = getSelectedProductOptions(request);\n *\n * // selectedOptions will equal:\n * // [\n * // {name: 'color', value: 'red'},\n * // {name: 'size', value: 'large'}\n * // ]\n * ```\n **/\nexport const getSelectedProductOptions: GetSelectedProductOptions = (\n request,\n) => {\n if (typeof request?.url === 'undefined')\n throw new TypeError(`Expected a Request instance, got ${typeof request}`);\n\n const searchParams = new URL(request.url).searchParams;\n\n const selectedOptions: SelectedOptionInput[] = [];\n\n searchParams.forEach((value, name) => {\n selectedOptions.push({name, value});\n });\n\n return selectedOptions;\n};\n\nfunction useVariantPath(\n handle: string,\n productPath: string,\n waitForNavigation: boolean,\n) {\n const {pathname, search} = useLocation();\n const navigation = useNavigation();\n\n return useMemo(() => {\n const match = /(\\/[a-zA-Z]{2}-[a-zA-Z]{2}\\/)/g.exec(pathname);\n const isLocalePathname = match && match.length > 0;\n productPath = productPath.startsWith('/')\n ? productPath.substring(1)\n : productPath;\n\n const path = isLocalePathname\n ? `${match![0]}${productPath}/${handle}`\n : `/${productPath}/${handle}`;\n\n const searchParams = new URLSearchParams(\n // Remix doesn't update the location until pending loaders complete.\n // By default we use the destination search params to make selecting a variant\n // instant, but `waitForNavigation` makes the UI wait to update by only using\n // the active browser search params.\n waitForNavigation || navigation.state !== 'loading'\n ? search\n : navigation.location.search,\n );\n\n return {\n searchParams,\n // If the current pathname matches the product page, we need to make sure\n // that we append to the current search params. Otherwise all the search\n // params can be generated new.\n alreadyOnProductPage: path === pathname,\n path,\n };\n }, [pathname, search, waitForNavigation, handle, productPath, navigation]);\n}\n","import type {Preset} from '@react-router/dev/config';\n\n/**\n * Official Hydrogen Preset for React Router 7.12.x\n *\n * Provides optimal React Router configuration for Hydrogen applications on Oxygen.\n * Enables validated performance optimizations while ensuring CLI compatibility.\n *\n * React Router 7.12.x Feature Support Matrix for Hydrogen 2025.7.0\n *\n * +----------------------------------+----------+----------------------------------+\n * | Feature | Status | Notes |\n * +----------------------------------+----------+----------------------------------+\n * | CORE CONFIGURATION |\n * +----------------------------------+----------+----------------------------------+\n * | appDirectory: 'app' | Enabled | Core application structure |\n * | buildDirectory: 'dist' | Enabled | Build output configuration |\n * | ssr: true | Enabled | Server-side rendering |\n * +----------------------------------+----------+----------------------------------+\n * | PERFORMANCE FLAGS |\n * +----------------------------------+----------+----------------------------------+\n * | v8_middleware | Enabled | Required for Hydrogen context |\n * | v8_splitRouteModules | Enabled | Route code splitting |\n * | unstable_optimizeDeps | Enabled | Build performance optimization |\n * +----------------------------------+----------+----------------------------------+\n * | ROUTE DISCOVERY |\n * +----------------------------------+----------+----------------------------------+\n * | routeDiscovery: { mode: 'lazy' } | Default | Lazy route loading |\n * | routeDiscovery: { mode: 'init' } | Allowed | Eager route loading |\n * +----------------------------------+----------+----------------------------------+\n * | UNSUPPORTED FEATURES |\n * +----------------------------------+----------+----------------------------------+\n * | basename: '/path' | Blocked | CLI infrastructure limitation |\n * | prerender: ['/routes'] | Blocked | Plugin incompatibility |\n * | serverBundles: () => {} | Blocked | Manifest incompatibility |\n * | buildEnd: () => {} | Blocked | CLI bypasses hook execution |\n * | unstable_subResourceIntegrity | Blocked | CSP nonce/hash conflict |\n * | v8_viteEnvironmentApi | Blocked | CLI fallback detection used |\n * +----------------------------------+----------+----------------------------------+\n *\n * @version 2025.7.0\n */\nexport function hydrogenPreset(): Preset {\n return {\n name: 'hydrogen-2025.7.0',\n\n reactRouterConfig: () => ({\n appDirectory: 'app',\n buildDirectory: 'dist',\n ssr: true,\n\n future: {\n v8_middleware: true,\n v8_splitRouteModules: true,\n v8_viteEnvironmentApi: false,\n unstable_optimizeDeps: true,\n unstable_subResourceIntegrity: false,\n },\n }),\n\n reactRouterConfigResolved: ({reactRouterConfig}) => {\n if (reactRouterConfig.basename && reactRouterConfig.basename !== '/') {\n throw new Error(\n '[Hydrogen Preset] basename is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: Requires major CLI infrastructure modernization.\\n' +\n 'Workaround: Use reverse proxy or CDN path rewriting for subdirectory hosting.',\n );\n }\n\n if (reactRouterConfig.prerender) {\n throw new Error(\n '[Hydrogen Preset] prerender is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: React Router plugin incompatibility with Hydrogen CLI build pipeline.\\n' +\n 'Workaround: Use external static generation tools or server-side caching.',\n );\n }\n\n if (reactRouterConfig.serverBundles) {\n throw new Error(\n '[Hydrogen Preset] serverBundles is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: React Router plugin manifest incompatibility with Hydrogen CLI.\\n' +\n 'Alternative: Route-level code splitting via v8_splitRouteModules is enabled.',\n );\n }\n\n if (reactRouterConfig.buildEnd) {\n throw new Error(\n '[Hydrogen Preset] buildEnd is not supported in Hydrogen 2025.7.0.\\n' +\n 'Reason: Hydrogen CLI bypasses React Router buildEnd hook execution.\\n' +\n 'Workaround: Use external build scripts or package.json post-build hooks.',\n );\n }\n\n if (reactRouterConfig.future?.unstable_subResourceIntegrity === true) {\n throw new Error(\n '[Hydrogen Preset] unstable_subResourceIntegrity cannot be enabled.\\n' +\n 'Reason: Conflicts with Hydrogen CSP nonce-based authentication.\\n' +\n 'Impact: Would break Content Security Policy and cause script execution failures.',\n );\n }\n },\n };\n}\n","import {Link} from 'react-router';\nimport {RichText as OriginalRichText} from '@shopify/hydrogen-react';\n\nexport const RichText: typeof OriginalRichText = function (props) {\n return (\n <OriginalRichText\n {...props}\n components={{\n link: ({node}) => (\n <Link\n to={node.url}\n title={node.title}\n target={node.target}\n prefetch=\"intent\"\n >\n {node.children}\n </Link>\n ),\n ...props.components,\n }}\n />\n );\n};\n","import type {LoaderFunctionArgs} from 'react-router';\nimport type {Storefront} from '../storefront';\nimport type {CustomerAccount} from '../customer/types';\n\ntype GraphiQLLoader = (args: LoaderFunctionArgs) => Promise<Response>;\n\nexport const graphiqlLoader: GraphiQLLoader = async function graphiqlLoader({\n request,\n context,\n}: LoaderFunctionArgs) {\n // For some reason, types are properly recognized by the editor,\n // but not at build time on CI. Cast types here to ensure it builds.\n const storefront = context.storefront as undefined | Storefront;\n const customerAccount = context.customerAccount as\n | undefined\n | CustomerAccount;\n\n const url = new URL(request.url);\n\n if (!storefront) {\n throw new Error(\n `GraphiQL: Hydrogen's storefront client must be injected in the loader context.`,\n );\n }\n\n const schemas: {\n [key: string]: {\n name: string;\n value?: object;\n accessToken?: string;\n authHeader: string;\n apiUrl: string;\n icon: string;\n };\n } = {};\n\n if (storefront) {\n const authHeader = 'X-Shopify-Storefront-Access-Token';\n schemas.storefront = {\n name: 'Storefront API',\n authHeader,\n accessToken: storefront.getPublicTokenHeaders()[authHeader],\n apiUrl: storefront.getApiUrl(),\n icon: 'SF',\n };\n }\n\n // In order to authenticate the CAAPI requests the user must be logged in via the CAAPI.\n // The graphiql request will then use the correct\n if (customerAccount) {\n // CustomerAccount API does not support introspection to the same URL.\n // Read it from a file using the asset server:\n const customerAccountSchema = await (\n await fetch(url.origin + '/graphiql/customer-account.schema.json')\n ).json();\n\n const accessToken = await customerAccount.getAccessToken();\n\n if (customerAccountSchema) {\n schemas['customer-account'] = {\n name: 'Customer Account API',\n value: customerAccountSchema,\n authHeader: 'Authorization',\n accessToken,\n apiUrl: customerAccount.getApiUrl(),\n icon: 'CA',\n };\n }\n }\n\n // GraphiQL icon from their GitHub repo\n const favicon = `https://avatars.githubusercontent.com/u/12972006?s=48&v=4`;\n\n // Add code highlighting to the HTML template\n const html = String.raw;\n\n // NOTE: based on https://github.com/graphql/graphiql/blob/main/examples/graphiql-cdn/index.html\n return new Response(\n html`\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>GraphiQL</title>\n <link rel=\"icon\" type=\"image/x-icon\" href=\"${favicon}\" />\n <meta charset=\"utf-8\" />\n <style>\n body {\n height: 100%;\n margin: 0;\n width: 100%;\n overflow: hidden;\n background-color: hsl(219, 29%, 18%);\n }\n\n #graphiql {\n height: 100vh;\n }\n\n #graphiql > .placeholder {\n color: slategray;\n width: fit-content;\n margin: 40px auto;\n font-family: Arial;\n }\n\n .graphiql-api-toolbar-label {\n position: absolute;\n bottom: -6px;\n right: -4px;\n font-size: 8px;\n }\n </style>\n\n <link\n rel=\"stylesheet\"\n href=\"https://esm.sh/graphiql/dist/style.css\"\n />\n\n <link\n rel=\"stylesheet\"\n href=\"https://esm.sh/@graphiql/plugin-explorer/dist/style.css\"\n />\n <script type=\"importmap\">\n {\n \"imports\": {\n \"react\": \"https://esm.sh/react@19.1.0\",\n \"react/jsx-runtime\": \"https://esm.sh/react@19.1.0/jsx-runtime\",\n \"react-dom\": \"https://esm.sh/react-dom@19.1.0\",\n \"react-dom/client\": \"https://esm.sh/react-dom@19.1.0/client\",\n\n \"graphql\": \"https://esm.sh/graphql@16.11.0\",\n\n \"graphiql\": \"https://esm.sh/graphiql?standalone&external=react,react-dom,@graphiql/react,graphql\",\n \"@graphiql/plugin-explorer\": \"https://esm.sh/@graphiql/plugin-explorer?standalone&external=react,@graphiql/react,graphql\",\n \"@graphiql/react\": \"https://esm.sh/@graphiql/react?standalone&external=react,react-dom,graphql\",\n \"@graphiql/toolkit\": \"https://esm.sh/@graphiql/toolkit?standalone&external=graphql\"\n }\n }\n </script>\n <script type=\"module\">\n // Import React and ReactDOM\n import React from 'react';\n import ReactDOM from 'react-dom/client';\n\n // Import GraphiQL and the Explorer plugin\n import {GraphiQL, HISTORY_PLUGIN} from 'graphiql';\n import {createGraphiQLFetcher} from '@graphiql/toolkit';\n import {explorerPlugin} from '@graphiql/plugin-explorer';\n import {ToolbarButton} from '@graphiql/react';\n\n import createJSONWorker from 'https://esm.sh/monaco-editor/esm/vs/language/json/json.worker.js?worker';\n import createGraphQLWorker from 'https://esm.sh/monaco-graphql/esm/graphql.worker.js?worker';\n import createEditorWorker from 'https://esm.sh/monaco-editor/esm/vs/editor/editor.worker.js?worker';\n import {parse, print} from 'graphql';\n\n globalThis.MonacoEnvironment = {\n getWorker(_workerId, label) {\n switch (label) {\n case 'json':\n return createJSONWorker();\n case 'graphql':\n return createGraphQLWorker();\n }\n return createEditorWorker();\n },\n };\n\n const windowUrl = new URL(document.URL);\n const startingSchemaKey =\n windowUrl.searchParams.get('schema') || 'storefront';\n\n let initialQuery = '{ shop { name } }';\n if (windowUrl.searchParams.has('query')) {\n initialQuery = decodeURIComponent(\n windowUrl.searchParams.get('query') ?? query,\n );\n }\n\n // Prettify query\n initialQuery = print(parse(initialQuery));\n\n let variables;\n if (windowUrl.searchParams.has('variables')) {\n variables = decodeURIComponent(\n windowUrl.searchParams.get('variables') ?? '',\n );\n }\n\n // Prettify variables\n if (variables) {\n variables = JSON.stringify(JSON.parse(variables), null, 2);\n }\n\n const schemas = ${JSON.stringify(schemas)};\n\n let lastActiveTabIndex = -1;\n let lastTabAmount = -1;\n\n const TAB_STATE_KEY = 'graphiql:tabState';\n const storage = {\n getTabState: () =>\n JSON.parse(localStorage.getItem(TAB_STATE_KEY)),\n setTabState: (state) =>\n localStorage.setItem(TAB_STATE_KEY, JSON.stringify(state)),\n };\n\n let nextSchemaKey;\n\n function App() {\n const [activeSchema, setActiveSchema] =\n React.useState(startingSchemaKey);\n\n const schema = schemas[activeSchema];\n\n if (!schema) {\n throw new Error('No schema found for ' + activeSchema);\n }\n\n const fetcher = createGraphiQLFetcher({\n url: schema.apiUrl,\n headers: {[schema.authHeader]: schema.accessToken},\n enableIncrementalDelivery: false,\n });\n\n // We create a custom fetcher because createGraphiQLFetcher attempts to introspect the schema\n // and the Customer Account API does not support introspection.\n // We override the fetcher to return the schema directly only for the CAAPI introspection query.\n function createJsonFetcher(options, httpFetch) {\n if (activeSchema === 'storefront') {\n return fetcher(options, httpFetch);\n } else {\n // CAAPI requires a custom fetcher\n if (options.operationName === 'IntrospectionQuery') {\n return {data: schema.value};\n } else {\n return fetcher(options, httpFetch);\n }\n }\n }\n\n const keys = Object.keys(schemas);\n\n function onTabChange(state) {\n const {activeTabIndex, tabs} = state;\n const activeTab = tabs[activeTabIndex];\n\n if (\n activeTabIndex === lastActiveTabIndex &&\n lastTabAmount === tabs.length\n ) {\n if (\n nextSchemaKey &&\n activeTab &&\n activeTab.schemaKey !== nextSchemaKey\n ) {\n activeTab.schemaKey = nextSchemaKey;\n nextSchemaKey = undefined;\n\n // Sync state to localStorage. GraphiQL resets the state\n // asynchronously, so we need to do it in a timeout.\n storage.setTabState(state);\n setTimeout(() => storage.setTabState(state), 500);\n }\n\n // React rerrendering, skip\n return;\n }\n\n if (activeTab) {\n if (!activeTab.schemaKey) {\n // Creating a new tab\n if (lastTabAmount < tabs.length) {\n activeTab.schemaKey = activeSchema;\n storage.setTabState(state);\n }\n }\n\n const nextSchema = activeTab.schemaKey || 'storefront';\n\n if (nextSchema !== activeSchema) {\n setActiveSchema(nextSchema);\n }\n }\n\n lastActiveTabIndex = activeTabIndex;\n lastTabAmount = tabs.length;\n }\n\n const plugins = [HISTORY_PLUGIN, explorerPlugin()];\n\n const props = {\n fetcher: createJsonFetcher,\n defaultEditorToolsVisibility: true,\n initialQuery,\n variables,\n schema: schema.value,\n plugins,\n onTabChange,\n };\n\n function toggleSelectedApi() {\n const activeKeyIndex = keys.indexOf(activeSchema);\n nextSchemaKey = keys[(activeKeyIndex + 1) % keys.length];\n\n // This triggers onTabChange\n if (nextSchemaKey) setActiveSchema(nextSchemaKey);\n }\n\n const CustomToolbar = React.createElement(\n GraphiQL.Toolbar,\n {\n key: 'Custom Toolbar',\n },\n [\n React.createElement(\n ToolbarButton,\n {\n key: 'api-wrapper',\n onClick: toggleSelectedApi,\n label: 'Toggle between different API schemas',\n },\n [\n React.createElement(\n 'div',\n {\n key: 'icon',\n style: {\n textAlign: 'center',\n },\n },\n [\n schema.icon,\n React.createElement(\n 'div',\n {\n key: 'icon-label',\n className: 'graphiql-api-toolbar-label',\n },\n 'API',\n ),\n ],\n ),\n ],\n ),\n ],\n );\n\n const CustomLogo = React.createElement(\n GraphiQL.Logo,\n {\n key: 'Logo replacement',\n },\n [\n React.createElement(\n 'div',\n {\n key: 'Logo wrapper',\n style: {display: 'flex', alignItems: 'center'},\n },\n [\n React.createElement(\n 'div',\n {\n key: 'api',\n className: 'graphiql-logo',\n style: {\n paddingRight: 0,\n whiteSpace: 'nowrap',\n },\n },\n [schema.name],\n ),\n React.createElement(GraphiQL.Logo, {key: 'logo'}),\n ],\n ),\n ],\n );\n\n const children = [CustomToolbar, CustomLogo];\n\n return React.createElement(GraphiQL, props, children);\n }\n\n const container = document.getElementById('graphiql');\n\n const root = ReactDOM.createRoot(container);\n\n root.render(React.createElement(App));\n </script>\n </head>\n\n <body>\n <div id=\"graphiql\">\n <div class=\"placeholder\">Loading GraphiQL...</div>\n </div>\n </body>\n </html>\n `,\n {status: 200, headers: {'content-type': 'text/html'}},\n );\n};\n","import type {UrlRedirectConnection} from '@shopify/hydrogen-react/storefront-api-types';\nimport type {I18nBase, Storefront} from '../storefront';\nimport {getRedirectUrl} from '../utils/get-redirect-url';\n\ntype StorefrontRedirect = {\n /** The [Storefront client](/docs/api/hydrogen/utilities/createstorefrontclient) instance */\n storefront: Storefront<I18nBase>;\n /** The [MDN Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object that was passed to the `server.ts` request handler. */\n request: Request;\n /** The [MDN Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) object created by `handleRequest` */\n response?: Response;\n /** By default the `/admin` route is redirected to the Shopify Admin page for the current storefront. Disable this redirect by passing `true`. */\n noAdminRedirect?: boolean;\n /** By default, query parameters are not used to match redirects. Set this to `true` if you'd like redirects to be query parameter sensitive */\n matchQueryParams?: boolean;\n};\n\n/**\n * Queries the Storefront API to see if there is any redirect\n * created for the current route and performs it. Otherwise,\n * it returns the response passed in the parameters. Useful for\n * conditionally redirecting after a 404 response.\n *\n * @see {@link https://help.shopify.com/en/manual/online-store/menus-and-links/url-redirect Creating URL redirects in Shopify}\n */\nexport async function storefrontRedirect(\n options: StorefrontRedirect,\n): Promise<Response> {\n const {\n storefront,\n request,\n noAdminRedirect,\n matchQueryParams,\n response = new Response('Not Found', {status: 404}),\n } = options;\n\n const url = new URL(request.url);\n const {pathname, searchParams} = url;\n const isSoftNavigation = searchParams.has('_data');\n\n searchParams.delete('redirect');\n searchParams.delete('return_to');\n searchParams.delete('_data');\n\n const redirectFrom = (\n matchQueryParams ? url.toString().replace(url.origin, '') : pathname\n ).toLowerCase();\n\n if (url.pathname === '/admin' && !noAdminRedirect) {\n return createRedirectResponse(\n `${storefront.getShopifyDomain()}/admin`,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n\n try {\n const {urlRedirects} = await storefront.query<{\n urlRedirects: UrlRedirectConnection;\n }>(REDIRECT_QUERY, {\n // The admin doesn't allow redirects to have a\n // trailing slash, so strip them all off\n variables: {query: 'path:' + redirectFrom.replace(/\\/+$/, '')},\n });\n\n const location = urlRedirects?.edges?.[0]?.node?.target;\n\n if (location) {\n return createRedirectResponse(\n location,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n\n const redirectTo = getRedirectUrl(request.url);\n\n if (redirectTo) {\n return createRedirectResponse(\n redirectTo,\n isSoftNavigation,\n searchParams,\n matchQueryParams,\n );\n }\n } catch (error) {\n console.error(\n `Failed to fetch redirects from Storefront API for route ${redirectFrom}`,\n error,\n );\n }\n\n return response;\n}\n\nconst TEMP_DOMAIN = 'https://example.com';\n\nfunction createRedirectResponse(\n location: string,\n isSoftNavigation: boolean,\n searchParams: URLSearchParams,\n matchQueryParams?: boolean,\n) {\n const url = new URL(location, TEMP_DOMAIN);\n\n if (!matchQueryParams) {\n for (const [key, value] of searchParams) {\n // The redirect destination might include query params, so merge the\n // original query params with the redirect destination query params\n url.searchParams.append(key, value);\n }\n }\n\n if (isSoftNavigation) {\n return new Response(null, {\n status: 200,\n headers: {\n 'X-Remix-Redirect': url.toString().replace(TEMP_DOMAIN, ''),\n 'X-Remix-Status': '301',\n },\n });\n } else {\n return new Response(null, {\n status: 301,\n headers: {location: url.toString().replace(TEMP_DOMAIN, '')},\n });\n }\n}\n\nconst REDIRECT_QUERY = `#graphql\n query redirects($query: String) {\n urlRedirects(first: 1, query: $query) {\n edges {\n node {\n target\n }\n }\n }\n }\n`;\n","// This is taken from remix: https://github.com/remix-run/remix/blob/main/packages/remix-server-runtime/markup.ts\n\nconst ESCAPE_LOOKUP: {[match: string]: string} = {\n '&': '\\\\u0026',\n '>': '\\\\u003e',\n '<': '\\\\u003c',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n};\n\nconst ESCAPE_REGEX = /[&><\\u2028\\u2029]/g;\n\nexport function escapeHtml(html: string) {\n return html.replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n","import type {ComponentPropsWithoutRef} from 'react';\nimport type {Maybe} from '@shopify/hydrogen-react/storefront-api-types';\nimport type {Thing, WithContext} from 'schema-dts';\nimport {escapeHtml} from './escape';\n\nconst ERROR_PREFIX = 'Error in SEO input: ';\n\n// TODO: Refactor this into more reusable validators or use a library like zod to do this if we decide to use it in\n// other places. @cartogram\nexport const schema = {\n title: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`title` should be a string'));\n }\n\n if (typeof value === 'string' && value.length > 70) {\n throw new Error(\n ERROR_PREFIX.concat(\n '`title` should not be longer than 70 characters',\n ),\n );\n }\n\n return value;\n },\n },\n description: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(\n ERROR_PREFIX.concat('`description` should be a string'),\n );\n }\n\n if (typeof value === 'string' && value.length > 155) {\n throw new Error(\n ERROR_PREFIX.concat(\n '`description` should not be longer than 160 characters',\n ),\n );\n }\n\n return value;\n },\n },\n url: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`url` should be a string'));\n }\n\n if (typeof value === 'string' && !value.startsWith('http')) {\n throw new Error(ERROR_PREFIX.concat('`url` should be a valid URL'));\n }\n\n return value;\n },\n },\n handle: {\n validate: <T>(value: Maybe<T>): NonNullable<T> => {\n if (typeof value !== 'string') {\n throw new Error(ERROR_PREFIX.concat('`handle` should be a string'));\n }\n\n if (typeof value === 'string' && !value.startsWith('@')) {\n throw new Error(ERROR_PREFIX.concat('`handle` should start with `@`'));\n }\n\n return value;\n },\n },\n};\n\nexport interface SeoConfig {\n /**\n * The `title` HTML element defines the document's title that is shown in a browser's title bar or a page's tab. It\n * only contains text; tags within the element are ignored.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title\n */\n title?: Maybe<string>;\n /**\n * Generate the title from a template that includes a `%s` placeholder for the title.\n *\n * @example\n * ```js\n * {\n * title: 'My Page',\n * titleTemplate: 'My Site - %s',\n * }\n * ```\n */\n titleTemplate?: Maybe<string> | null;\n /**\n * The media associated with the given page (images, videos, etc). If you pass a string, it will be used as the\n * `og:image` meta tag. If you pass an object or an array of objects, that will be used to generate `og:<type of\n * media>` meta tags. The `url` property should be the URL of the media. The `height` and `width` properties are\n * optional and should be the height and width of the media. The `altText` property is optional and should be a\n * description of the media.\n *\n * @example\n * ```js\n * {\n * media: [\n * {\n * url: 'https://example.com/image.jpg',\n * type: 'image',\n * height: '400',\n * width: '400',\n * altText: 'A custom snowboard with an alpine color pallet.',\n * }\n * ]\n * }\n * ```\n *\n */\n media?:\n | Maybe<string>\n | Partial<SeoMedia>\n | (Partial<SeoMedia> | Maybe<string>)[];\n /**\n * The description of the page. This is used in the `name=\"description\"` meta tag as well as the `og:description` meta\n * tag.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta\n */\n description?: Maybe<string>;\n /**\n * The canonical URL of the page. This is used to tell search engines which URL is the canonical version of a page.\n * This is useful when you have multiple URLs that point to the same page. The value here will be used in the\n * `rel=\"canonical\"` link tag as well as the `og:url` meta tag.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link\n */\n url?: Maybe<string>;\n /**\n * The handle is used to generate the `twitter:site` and `twitter:creator` meta tags. Include the `@` symbol in the\n * handle.\n *\n * @example\n * ```js\n * {\n * handle: '@shopify'\n * }\n * ```\n */\n handle?: Maybe<string>;\n /**\n * The `jsonLd` property is used to generate the `application/ld+json` script tag. This is used to provide structured\n * data to search engines. The value should be an object that conforms to the schema.org spec. The `type` property\n * should be the type of schema you are using. The `type` property is required and should be one of the following:\n *\n * - `Product`\n * - `ItemList`\n * - `Organization`\n * - `WebSite`\n * - `WebPage`\n * - `BlogPosting`\n * - `Thing`\n *\n * The value is validated via [schema-dts](https://www.npmjs.com/package/schema-dts)\n *\n * @example\n * ```js\n * {\n * jsonLd: {\n * '@context': 'https://schema.org',\n * '@type': 'Product',\n * name: 'My Product',\n * image: 'https://hydrogen.shop/image.jpg',\n * description: 'A product that is great',\n * sku: '12345',\n * mpn: '12345',\n * brand: {\n * '@type': 'Thing',\n * name: 'My Brand',\n * },\n * aggregateRating: {\n * '@type': 'AggregateRating',\n * ratingValue: '4.5',\n * reviewCount: '100',\n * },\n * offers: {\n * '@type': 'Offer',\n * priceCurrency: 'USD',\n * price: '100',\n * priceValidUntil: '2020-11-05',\n * itemCondition: 'https://schema.org/NewCondition',\n * availability: 'https://schema.org/InStock',\n * seller: {\n * '@type': 'Organization',\n * name: 'My Brand',\n * },\n * },\n * }\n * }\n * ```\n *\n * @see https://schema.org/docs/schemas.html\n * @see https://developers.google.com/search/docs/guides/intro-structured-data\n * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n *\n */\n jsonLd?: WithContext<Thing> | WithContext<Thing>[];\n /**\n * The `alternates` property is used to specify the language and geographical targeting when you have multiple\n * versions of the same page in different languages. The `url` property tells search engines about these variations\n * and helps them to serve the correct version to their users.\n *\n * @example\n * ```js\n * {\n * alternates: [\n * {\n * language: 'en-US',\n * url: 'https://hydrogen.shop/en-us',\n * default: true,\n * },\n * {\n * language: 'fr-CA',\n * url: 'https://hydrogen.shop/fr-ca',\n * },\n * ]\n * }\n * ```\n *\n * @see https://support.google.com/webmasters/answer/189077?hl=en\n */\n alternates?: LanguageAlternate | LanguageAlternate[];\n /**\n * The `robots` property is used to specify the robots meta tag. This is used to tell search engines which pages\n * should be indexed and which should not.\n *\n * @see https://developers.google.com/search/reference/robots_meta_tag\n */\n robots?: RobotsOptions;\n}\n\n/**\n * @see https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag\n */\nexport interface RobotsOptions {\n /**\n * Set the maximum size of an image preview for this page in a search results Can be one of the following:\n *\n * - `none` - No image preview is to be shown.\n * - `standard` - A default image preview may be shown.\n * - `large` - A larger image preview, up to the width of the viewport, may be shown.\n *\n * If no value is specified a default image preview size is used.\n */\n maxImagePreview?: 'none' | 'standard' | 'large';\n /**\n * A number representing the maximum of amount characters to use as a textual snippet for a search result. This value\n * can also be set to one of the following special values:\n *\n * - 0 - No snippet is to be shown. Equivalent to nosnippet.\n * - 1 - The Search engine will choose the snippet length that it believes is most effective to help users discover\n * your content and direct users to your site\n * - -1 - No limit on the number of characters that can be shown in the snippet.\n */\n maxSnippet?: number;\n /**\n * The maximum number of seconds for videos on this page to show in search results. This value can also be set to one\n * of the following special values:\n *\n * - 0 - A static image may be used with the `maxImagePreview` setting.\n * - 1 - There is no limit to the size of the video preview.\n *\n * This applies to all forms of search results (at Google: web search, Google Images, Google Videos, Discover,\n * Assistant).\n */\n maxVideoPreview?: number;\n /**\n * Do not show a cached link in search results.\n */\n noArchive?: boolean;\n /**\n * Do not follow the links on this page.\n *\n * @see https://developers.google.com/search/docs/advanced/guidelines/qualify-outbound-links\n */\n noFollow?: boolean;\n /**\n * Do not index images on this page.\n */\n noImageIndex?: boolean;\n /**\n * Do not show this page, media, or resource in search results.\n */\n noIndex?: boolean;\n /**\n * Do not show a text snippet or video preview in the search results for this page.\n */\n noSnippet?: boolean;\n /**\n * Do not offer translation of this page in search results.\n */\n noTranslate?: boolean;\n /**\n * Do not show this page in search results after the specified date/time.\n */\n unavailableAfter?: string;\n}\n\nexport interface LanguageAlternate {\n /**\n * Language code for the alternate page. This is used to generate the hreflang meta tag property.\n */\n language: string;\n /**\n * Whether the alternate page is the default page. This will add the `x-default` attribution to the language code.\n */\n default?: boolean;\n /**\n * The url of the alternate page. This is used to generate the hreflang meta tag property.\n */\n url: string;\n}\n\nexport type SeoMedia = {\n /**\n * Used to generate og:<type of media> meta tag\n */\n type: 'image' | 'video' | 'audio';\n /**\n * The url value populates both url and secure_url and is used to infer the og:<type of media>:type meta tag.\n */\n url: Maybe<string> | undefined;\n /**\n * The height in pixels of the media. This is used to generate the og:<type of media>:height meta tag.\n */\n height: Maybe<number> | undefined;\n /**\n * The width in pixels of the media. This is used to generate the og:<type of media>:width meta tag.\n */\n width: Maybe<number> | undefined;\n /**\n * The alt text for the media. This is used to generate the og:<type of media>:alt meta tag.\n */\n altText: Maybe<string> | undefined;\n};\n\ntype TagKey = 'title' | 'base' | 'meta' | 'link' | 'script';\n\nexport interface CustomHeadTagObject {\n tag: TagKey;\n props: Record<string, unknown>;\n children?: string;\n key: string;\n}\n\n/**\n * The `generateSeoTags` function generates the SEO title, meta, link and script (JSON Linking Data) tags for a page. It\n * pairs well with the SEO component in `@shopify/hydrogen` when building a Hydrogen Remix app, but can be used on its\n * own if you want to generate the tags yourself.\n */\nexport function generateSeoTags(seoInput: SeoConfig): CustomHeadTagObject[] {\n const tagResults: CustomHeadTagObject[] = [];\n\n for (const seoKey of Object.keys(seoInput)) {\n switch (seoKey) {\n case 'title': {\n const content = validate(schema.title, seoInput.title);\n const title = renderTitle(seoInput?.titleTemplate, content);\n\n if (!title) {\n break;\n }\n\n tagResults.push(\n generateTag('title', {title}),\n generateTag('meta', {property: 'og:title', content: title}),\n generateTag('meta', {name: 'twitter:title', content: title}),\n );\n\n break;\n }\n\n case 'description': {\n const content = validate(schema.description, seoInput.description);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n generateTag('meta', {\n name: 'description',\n content,\n }),\n generateTag('meta', {\n property: 'og:description',\n content,\n }),\n generateTag('meta', {\n name: 'twitter:description',\n content,\n }),\n );\n\n break;\n }\n\n case 'url': {\n const content = validate(schema.url, seoInput.url);\n\n if (!content) {\n break;\n }\n\n const urlWithoutParams = content.split('?')[0];\n const urlWithoutTrailingSlash = urlWithoutParams.replace(/\\/$/, '');\n\n tagResults.push(\n generateTag('link', {\n rel: 'canonical',\n href: urlWithoutTrailingSlash,\n }),\n generateTag('meta', {\n property: 'og:url',\n content: urlWithoutTrailingSlash,\n }),\n );\n\n break;\n }\n\n case 'handle': {\n const content = validate(schema.handle, seoInput.handle);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n generateTag('meta', {name: 'twitter:site', content}),\n generateTag('meta', {name: 'twitter:creator', content}),\n );\n\n break;\n }\n\n case 'media': {\n let content;\n const values = ensureArray(seoInput.media);\n\n for (const media of values) {\n if (typeof media === 'string') {\n tagResults.push(\n generateTag('meta', {name: 'og:image', content: media}),\n );\n }\n\n if (media && typeof media === 'object') {\n const type = media.type || 'image';\n\n // Order matters here when adding multiple media tags @see https://ogp.me/#array\n const normalizedMedia = media\n ? {\n url: media?.url,\n secure_url: media?.url,\n type: inferMimeType(media.url),\n width: media?.width,\n height: media?.height,\n alt: media?.altText,\n }\n : {};\n\n for (const key of Object.keys(normalizedMedia)) {\n if (normalizedMedia[key as keyof typeof normalizedMedia]) {\n content = normalizedMedia[\n key as keyof typeof normalizedMedia\n ] as string;\n\n tagResults.push(\n generateTag(\n 'meta',\n {\n property: `og:${type}:${key}`,\n content,\n },\n normalizedMedia.url as string,\n ),\n );\n }\n }\n }\n }\n break;\n }\n\n case 'jsonLd': {\n const jsonLdBlocks = ensureArray(seoInput.jsonLd);\n let index = 0;\n for (const block of jsonLdBlocks) {\n if (typeof block !== 'object') {\n continue;\n }\n\n const tag = generateTag(\n 'script',\n {\n type: 'application/ld+json',\n children: JSON.stringify(block, (k, value) => {\n return typeof value === 'string' ? escapeHtml(value) : value;\n }),\n },\n // @ts-expect-error\n `json-ld-${block?.['@type'] || block?.name || index++}`,\n );\n\n tagResults.push(tag);\n }\n\n break;\n }\n\n case 'alternates': {\n const alternates = ensureArray(seoInput.alternates);\n\n for (const alternate of alternates) {\n if (!alternate) {\n continue;\n }\n\n const {language, url, default: defaultLang} = alternate;\n\n const hrefLang = language\n ? `${language}${defaultLang ? '-default' : ''}`\n : undefined;\n\n tagResults.push(\n generateTag('link', {\n rel: 'alternate',\n hrefLang,\n href: url,\n }),\n );\n }\n\n break;\n }\n\n case 'robots': {\n if (!seoInput.robots) {\n break;\n }\n\n const {\n maxImagePreview,\n maxSnippet,\n maxVideoPreview,\n noArchive,\n noFollow,\n noImageIndex,\n noIndex,\n noSnippet,\n noTranslate,\n unavailableAfter,\n } = seoInput.robots;\n\n const robotsParams = [\n noArchive && 'noarchive',\n noImageIndex && 'noimageindex',\n noSnippet && 'nosnippet',\n noTranslate && `notranslate`,\n maxImagePreview && `max-image-preview:${maxImagePreview}`,\n maxSnippet && `max-snippet:${maxSnippet}`,\n maxVideoPreview && `max-video-preview:${maxVideoPreview}`,\n unavailableAfter && `unavailable_after:${unavailableAfter}`,\n ];\n\n let robotsParam =\n (noIndex ? 'noindex' : 'index') +\n ',' +\n (noFollow ? 'nofollow' : 'follow');\n\n for (let param of robotsParams) {\n if (param) {\n robotsParam += `,${param}`;\n }\n }\n\n tagResults.push(\n generateTag('meta', {name: 'robots', content: robotsParam}),\n );\n\n break;\n }\n\n default: {\n // TODO: We should be able to catch unaccounted for keys at compile time\n // let exhaustiveCheck: never = seoKey;\n\n break;\n }\n }\n }\n\n return tagResults.flat().sort((a, b) => a.key.localeCompare(b.key));\n}\n\nexport function generateTag<T extends TagKey>(\n tagName: T,\n input: ComponentPropsWithoutRef<T>,\n group?: string,\n): CustomHeadTagObject {\n const tag: CustomHeadTagObject = {tag: tagName, props: {}, key: ''};\n\n // title tags don't have props so move to children\n if (tagName === 'title') {\n tag.children = input.title as string;\n tag.key = generateKey(tag);\n\n return tag;\n }\n\n // also move the input children to children and delete it\n if (tagName === 'script') {\n tag.children = typeof input.children === 'string' ? input.children : '';\n tag.key = generateKey(tag, group);\n delete input.children;\n tag.props = input;\n return tag;\n }\n\n // the rest goes on props\n tag.props = input;\n\n // remove empty props\n Object.keys(tag.props).forEach(\n (key) => !tag.props[key] && delete tag.props[key],\n );\n\n tag.key = generateKey(tag, group);\n\n return tag;\n}\n\n//**\n// * Generate a unique key for a tag\n// * @param tag - a generated tag object\n// * @param group? - the group the tag belongs to\n// * @returns - a unique key to be used for react\n// */\nexport function generateKey(tag: CustomHeadTagObject, group?: string) {\n const {tag: tagName, props} = tag;\n\n if (tagName === 'title') {\n // leading 0 moves title to the top when sorting\n return '0-title';\n }\n\n if (tagName === 'meta') {\n // leading 0 moves meta to the top when sorting exclude secure_url from the logic because the content is the same as\n // url\n const priority =\n props.content === group &&\n typeof props.property === 'string' &&\n !props.property.endsWith('secure_url') &&\n '0';\n const groupName = [group, priority];\n\n return [tagName, ...groupName, props.property || props.name]\n .filter((x) => x)\n .join('-');\n }\n\n if (tagName === 'link') {\n const key = [tagName, props.rel, props.hrefLang || props.media]\n .filter((x) => x)\n .join('-');\n\n // replace spaces with dashes, needed for media prop\n return key.replace(/\\s+/g, '-');\n }\n\n if (tagName === 'script') {\n return `${tagName}-${group}`;\n }\n\n return `${tagName}-${props.type}`;\n}\n\nexport function renderTitle<T extends CustomHeadTagObject['children']>(\n template?:\n | string\n | ((title: string) => string | undefined)\n | undefined\n | null,\n title?: T | null,\n): string | undefined {\n if (!title) {\n return undefined;\n }\n\n if (!template) {\n return title;\n }\n\n if (typeof template === 'function') {\n return template(title);\n }\n\n return template.replace('%s', title ?? '');\n}\n\nexport function inferMimeType(url: Maybe<string> | undefined) {\n const ext = url && url.split('.').pop();\n\n switch (ext) {\n case 'svg':\n return 'image/svg+xml';\n case 'png':\n return 'image/png';\n case 'gif':\n return 'image/gif';\n case 'swf':\n return 'application/x-shockwave-flash';\n case 'mp3':\n return 'audio/mpeg';\n case 'jpg':\n case 'jpeg':\n default:\n return 'image/jpeg';\n }\n}\n\nexport type SchemaType =\n | 'Product'\n | 'ItemList'\n | 'Organization'\n | 'WebSite'\n | 'WebPage'\n | 'BlogPosting'\n | 'Thing';\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n return Array.isArray(value) ? value : [value];\n}\n\nexport function validate<T>(\n schema: {validate: <T>(data: T) => NonNullable<T>},\n data: T,\n): T {\n try {\n return schema.validate<T>(data);\n } catch (error: unknown) {\n console.warn((error as Error).message);\n return data;\n }\n}\n","import {\n ensureArray,\n inferMimeType,\n renderTitle,\n schema,\n validate,\n type SeoConfig,\n} from './generate-seo-tags';\nimport {MetaFunction} from 'react-router';\n\nexport type GetSeoMetaReturn = ReturnType<MetaFunction>;\n\ntype GetSeoMetaTypeForDocs = {\n /** `getSeoMeta` takes an arbitrary number of configuration object parameters. Values in each object are overwritten based on the object order. \\`jsonLd\\` properties are preserved between each configuration object. */\n seoInputs: SeoConfig[];\n};\n\ntype SeoKey = keyof SeoConfig;\n\ntype Optional<T> = T | null | undefined;\n\n/**\n * Generate a Remix meta array from one or more SEO configuration objects. This is useful to pass SEO configuration for the parent route(s) and the current route. Similar to `Object.assign()`, each property is overwritten based on the object order. The exception is `jsonLd`, which is preserved so that each route has it's own independent jsonLd meta data.\n */\nexport function getSeoMeta(\n ...seoInputs: Optional<SeoConfig>[]\n): GetSeoMetaReturn {\n let tagResults: GetSeoMetaReturn = [];\n\n const dedupedSeoInput =\n seoInputs.reduce((acc, current) => {\n if (!current) return acc as SeoConfig;\n\n // remove seo properties with falsy values\n Object.keys(current).forEach(\n (key) => !current[key as SeoKey] && delete current[key as SeoKey],\n );\n\n const {jsonLd} = current;\n\n if (!jsonLd) {\n return {...acc, ...current} as SeoConfig;\n }\n\n // concatenate jsonLds if present\n if (!acc?.jsonLd) {\n return {...acc, ...current, jsonLd: [jsonLd]} as SeoConfig;\n } else {\n return {\n ...acc,\n ...current,\n jsonLd: ensureArray(acc.jsonLd).concat(jsonLd),\n };\n }\n }, {}) || ({} as SeoConfig);\n\n for (const seoKey of Object.keys(dedupedSeoInput)) {\n switch (seoKey) {\n case 'title': {\n const content = validate(schema.title, dedupedSeoInput.title);\n const title = renderTitle(dedupedSeoInput?.titleTemplate, content);\n\n if (!title) {\n break;\n }\n\n tagResults.push(\n {title},\n {property: 'og:title', content: title},\n {property: 'twitter:title', content: title},\n );\n\n break;\n }\n\n case 'description': {\n const content = validate(\n schema.description,\n dedupedSeoInput.description,\n );\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n {\n name: 'description',\n content,\n },\n {\n property: 'og:description',\n content,\n },\n {\n property: 'twitter:description',\n content,\n },\n );\n\n break;\n }\n\n case 'url': {\n const content = validate(schema.url, dedupedSeoInput.url);\n\n if (!content) {\n break;\n }\n\n const urlWithoutParams = content.split('?')[0];\n const urlWithoutTrailingSlash = urlWithoutParams.replace(/\\/$/, '');\n\n tagResults.push(\n {\n tagName: 'link',\n rel: 'canonical',\n href: urlWithoutTrailingSlash,\n },\n {\n property: 'og:url',\n content: urlWithoutTrailingSlash,\n },\n );\n\n break;\n }\n\n case 'handle': {\n const content = validate(schema.handle, dedupedSeoInput.handle);\n\n if (!content) {\n break;\n }\n\n tagResults.push(\n {property: 'twitter:site', content},\n {property: 'twitter:creator', content},\n );\n\n break;\n }\n\n case 'media': {\n let content;\n const values = ensureArray(dedupedSeoInput.media);\n\n for (const media of values) {\n if (typeof media === 'string') {\n tagResults.push({property: 'og:image', content: media});\n }\n\n if (media && typeof media === 'object') {\n const type = media.type || 'image';\n\n // Order matters here when adding multiple media tags @see https://ogp.me/#array\n const normalizedMedia = media\n ? {\n url: media?.url,\n secure_url: media?.url,\n type: inferMimeType(media.url),\n width: media?.width,\n height: media?.height,\n alt: media?.altText,\n }\n : {};\n\n for (const key of Object.keys(normalizedMedia)) {\n if (normalizedMedia[key as keyof typeof normalizedMedia]) {\n content = normalizedMedia[\n key as keyof typeof normalizedMedia\n ] as string;\n\n tagResults.push({\n property: `og:${type}:${key}`,\n content,\n });\n }\n }\n }\n }\n break;\n }\n\n case 'jsonLd': {\n const jsonLdBlocks = ensureArray(dedupedSeoInput.jsonLd);\n let index = 0;\n for (const block of jsonLdBlocks) {\n if (typeof block !== 'object' || Object.keys(block).length === 0) {\n continue;\n }\n\n tagResults.push({\n 'script:ld+json': block,\n });\n }\n\n break;\n }\n\n case 'alternates': {\n const alternates = ensureArray(dedupedSeoInput.alternates);\n\n for (const alternate of alternates) {\n if (!alternate) {\n continue;\n }\n\n const {language, url, default: defaultLang} = alternate;\n\n const hrefLang = language\n ? `${language}${defaultLang ? '-default' : ''}`\n : undefined;\n\n tagResults.push({\n tagName: 'link',\n rel: 'alternate',\n hrefLang,\n href: url,\n });\n }\n\n break;\n }\n\n case 'robots': {\n if (!dedupedSeoInput.robots) {\n break;\n }\n\n const {\n maxImagePreview,\n maxSnippet,\n maxVideoPreview,\n noArchive,\n noFollow,\n noImageIndex,\n noIndex,\n noSnippet,\n noTranslate,\n unavailableAfter,\n } = dedupedSeoInput.robots;\n\n const robotsParams = [\n noArchive && 'noarchive',\n noImageIndex && 'noimageindex',\n noSnippet && 'nosnippet',\n noTranslate && `notranslate`,\n maxImagePreview && `max-image-preview:${maxImagePreview}`,\n maxSnippet && `max-snippet:${maxSnippet}`,\n maxVideoPreview && `max-video-preview:${maxVideoPreview}`,\n unavailableAfter && `unavailable_after:${unavailableAfter}`,\n ];\n\n let robotsParam =\n (noIndex ? 'noindex' : 'index') +\n ',' +\n (noFollow ? 'nofollow' : 'follow');\n\n for (let param of robotsParams) {\n if (param) {\n robotsParam += `,${param}`;\n }\n }\n\n tagResults.push({name: 'robots', content: robotsParam});\n\n break;\n }\n\n default: {\n // TODO: We should be able to catch unaccounted for keys at compile time\n // let exhaustiveCheck: never = seoKey;\n\n break;\n }\n }\n }\n\n return tagResults;\n}\n","import {createElement, Fragment, lazy, Suspense, useMemo} from 'react';\nimport {\n type Location,\n type LoaderFunction,\n type Params,\n useLocation,\n useMatches,\n} from 'react-router';\nimport {generateSeoTags, type SeoConfig} from './generate-seo-tags';\n\nconst SeoLogger = lazy(() => import('./log-seo-tags'));\n\nexport interface SeoHandleFunction<\n Loader extends LoaderFunction | unknown = unknown,\n> {\n (args: {\n data: Loader extends LoaderFunction ? Awaited<ReturnType<Loader>> : unknown;\n id: string;\n params: Params;\n pathname: Location['pathname'];\n search: Location['search'];\n hash: Location['hash'];\n key: string;\n }): Partial<SeoConfig>;\n}\n\ninterface SeoProps {\n /** Enable debug mode that prints SEO properties for route in the console */\n debug?: boolean;\n}\n\ntype SeoWrapper = undefined | {seo: any};\n\n/**\n * @deprecated - use `getSeoMeta` instead\n */\nexport function Seo({debug}: SeoProps) {\n const matches = useMatches();\n const location = useLocation();\n\n console.warn(\n '[h2:warn:Seo] The `<Seo/>` component is deprecated. Use `getSeoMeta` instead.\\nSee: https://shopify.dev/docs/api/hydrogen/utilities/getseometa',\n );\n\n // Capture the seo and jsonLd configs from the route matches\n const seoConfig = useMemo(() => {\n return (\n matches\n .flatMap((match) => {\n const {handle, ...routeMatch} = match;\n const routeData = {...routeMatch, ...location};\n const handleSeo = (handle as SeoWrapper)?.seo;\n const loaderSeo = (routeMatch?.data as SeoWrapper)?.seo;\n\n if (!handleSeo && !loaderSeo) {\n return [];\n }\n\n // if seo is defined in the handle, invoke it with the route data\n if (handleSeo) {\n return recursivelyInvokeOrReturn(handleSeo, routeData);\n } else {\n return [loaderSeo];\n }\n })\n // merge route seo (priority) with the root seo if both are present\n // jsonLd definitions are instead concatenated because there can be\n // multiple jsonLd tags on any given root+route. e.g root renders Organization\n // schema and a product page renders Product schema\n .reduce((acc, current) => {\n // remove seo properties with falsy values\n Object.keys(current).forEach(\n (key) => !current[key] && delete current[key],\n );\n\n const {jsonLd} = current;\n\n if (!jsonLd) {\n return {...acc, ...current};\n }\n\n // concatenate jsonLds if present\n if (!acc?.jsonLd) {\n return {...acc, ...current, jsonLd: [jsonLd]};\n } else {\n if (Array.isArray(jsonLd)) {\n return {\n ...acc,\n ...current,\n jsonLd: [...acc.jsonLd, ...jsonLd],\n };\n } else {\n return {\n ...acc,\n ...current,\n jsonLd: [...acc.jsonLd, jsonLd],\n };\n }\n }\n }, {} as SeoConfig)\n );\n }, [matches, location]);\n\n // Generate seo and jsonLd tags from the route seo configs\n // and return the jsx elements as html\n const {html, loggerMarkup} = useMemo(() => {\n const headTags = generateSeoTags(seoConfig);\n const html = headTags.map((tag) => {\n if (tag.tag === 'script') {\n return createElement(tag.tag, {\n ...tag.props,\n key: tag.key,\n dangerouslySetInnerHTML: {__html: tag.children},\n });\n }\n\n return createElement(tag.tag, {...tag.props, key: tag.key}, tag.children);\n });\n\n const loggerMarkup = createElement(\n Suspense,\n {fallback: null},\n createElement(SeoLogger, {headTags}),\n );\n\n return {html, loggerMarkup};\n }, [seoConfig]);\n\n return createElement(Fragment, null, html, debug && loggerMarkup);\n}\n\n/**\n * Recursively invoke a function or return the value\n * @param value\n * @param rest\n * @returns\n */\nexport function recursivelyInvokeOrReturn<T, R extends any[]>(\n value: T | ((...rest: R) => T),\n ...rest: R\n): T | Record<string, T> {\n if (value instanceof Function) {\n return recursivelyInvokeOrReturn<T, R>(value(...rest), ...rest);\n }\n\n let result: Record<string, T> = {};\n\n if (Array.isArray(value)) {\n result = value.reduce((acc, item) => {\n return [...acc, recursivelyInvokeOrReturn(item)];\n }, []);\n\n return result;\n }\n\n if (value instanceof Object) {\n const entries = Object.entries(value);\n\n entries.forEach(([key, val]) => {\n // @ts-expect-error\n result[key] = recursivelyInvokeOrReturn<T, R>(val, ...rest);\n });\n\n return result;\n }\n\n return value;\n}\n","import {ShopPayButton as ShopPayButtonBase} from '@shopify/hydrogen-react';\nimport {ComponentProps} from 'react';\n\nexport function ShopPayButton(props: ComponentProps<typeof ShopPayButtonBase>) {\n return <ShopPayButtonBase channel=\"hydrogen\" {...props} />;\n}\n","import type {LoaderFunctionArgs} from 'react-router';\nimport type {Storefront} from '../storefront';\n\nconst SITEMAP_INDEX_PREFIX = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n`;\nconst SITEMAP_INDEX_SUFFIX = `\\n</sitemapindex>`;\n\nconst SITEMAP_PREFIX = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" xmlns:xhtml=\"http://www.w3.org/1999/xhtml\">`;\nconst SITEMAP_SUFFIX = `</urlset>`;\n\ntype SITEMAP_INDEX_TYPE =\n | 'pages'\n | 'products'\n | 'collections'\n | 'blogs'\n | 'articles'\n | 'metaObjects';\n\ninterface SitemapIndexOptions {\n /** The Storefront API Client from Hydrogen */\n storefront: Storefront;\n /** A Remix Request object */\n request: Request;\n /** The types of pages to include in the sitemap index. */\n types?: SITEMAP_INDEX_TYPE[];\n /** Add a URL to a custom child sitemap */\n customChildSitemaps?: string[];\n}\n\n/**\n * Generate a sitemap index that links to separate sitemaps for each resource type. Returns a standard Response object.\n */\nexport async function getSitemapIndex(\n options: SitemapIndexOptions,\n): Promise<Response> {\n const {\n storefront,\n request,\n types = [\n 'products',\n 'pages',\n 'collections',\n 'metaObjects',\n 'articles',\n 'blogs',\n ],\n customChildSitemaps = [],\n } = options;\n\n if (!request || !request.url)\n throw new Error('A request object is required to generate a sitemap index');\n\n if (!storefront || !storefront.query)\n throw new Error(\n 'A storefront client is required to generate a sitemap index',\n );\n\n const data = await storefront.query(SITEMAP_INDEX_QUERY);\n\n if (!data) {\n console.warn(\n '[h2:sitemap:warning] Sitemap index is available in API version 2024-10 and later',\n );\n throw new Response('Sitemap index not found.', {status: 404});\n }\n\n const baseUrl = new URL(request.url).origin;\n\n const body =\n SITEMAP_INDEX_PREFIX +\n types\n .map((type) => {\n if (!data[type]) {\n throw new Error(\n `[h2:sitemap:error] No data found for type ${type}. Check types passed to \\`getSitemapIndex\\``,\n );\n }\n return getSiteMapLinks(type, data[type].pagesCount.count, baseUrl);\n })\n .join('\\n') +\n customChildSitemaps\n .map(\n (url) =>\n ' <sitemap><loc>' +\n (baseUrl + (url.startsWith('/') ? url : '/' + url)) +\n '</loc></sitemap>',\n )\n .join('\\n') +\n SITEMAP_INDEX_SUFFIX;\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': `max-age=${60 * 60 * 24}`,\n },\n });\n}\n\ninterface GetSiteMapOptions {\n /** The params object from Remix */\n params: LoaderFunctionArgs['params'];\n /** The Storefront API Client from Hydrogen */\n storefront: Storefront;\n /** A Remix Request object */\n request: Request;\n /** A function that produces a canonical url for a resource. It is called multiple times for each locale supported by the app. */\n getLink: (options: {\n type: string | SITEMAP_INDEX_TYPE;\n baseUrl: string;\n handle?: string;\n locale?: string;\n }) => string;\n /** An array of locales to generate alternate tags */\n locales?: string[];\n /** Optionally customize the changefreq property for each URL */\n getChangeFreq?: (options: {\n type: string | SITEMAP_INDEX_TYPE;\n handle: string;\n }) => string;\n /** If the sitemap has no links, fallback to rendering a link to the homepage. This prevents errors in Google's search console. Defaults to `/`. */\n noItemsFallback?: string;\n}\n\n/**\n * Generate a sitemap for a specific resource type.\n */\nexport async function getSitemap(\n options: GetSiteMapOptions,\n): Promise<Response> {\n const {\n storefront,\n request,\n params,\n getLink,\n locales = [],\n getChangeFreq,\n noItemsFallback = '/',\n } = options;\n\n if (!params)\n throw new Error(\n '[h2:sitemap:error] Remix params object is required to generate a sitemap',\n );\n\n if (!request || !request.url)\n throw new Error('A request object is required to generate a sitemap');\n\n if (!storefront || !storefront.query)\n throw new Error('A storefront client is required to generate a index');\n\n if (!getLink)\n throw new Error(\n 'A `getLink` function to generate each resource is required to build a sitemap',\n );\n\n if (!params.type || !params.page)\n throw new Response('No data found', {status: 404});\n\n const type = params.type as keyof typeof QUERIES;\n\n const query = QUERIES[type];\n\n if (!query) throw new Response('Not found', {status: 404});\n\n const data = await storefront.query(query, {\n variables: {\n page: parseInt(params.page, 10),\n },\n });\n\n if (!data) {\n console.warn(\n '[h2:sitemap:warning] Sitemap is available in API version 2024-10 and later',\n );\n throw new Response('Sitemap not found.', {status: 404});\n }\n\n const baseUrl = new URL(request.url).origin;\n let body: string = '';\n\n if (!data?.sitemap?.resources?.items?.length) {\n body =\n SITEMAP_PREFIX +\n `\\n <url><loc>${baseUrl + noItemsFallback}</loc></url>\\n` +\n SITEMAP_SUFFIX;\n } else {\n body =\n SITEMAP_PREFIX +\n data.sitemap.resources.items\n .map((item: {handle: string; updatedAt: string; type?: string}) => {\n return renderUrlTag({\n getChangeFreq,\n url: getLink({\n type: item.type ?? type,\n baseUrl,\n handle: item.handle,\n }),\n type,\n getLink,\n updatedAt: item.updatedAt,\n handle: item.handle,\n metaobjectType: item.type,\n locales,\n baseUrl,\n });\n })\n .join('\\n') +\n SITEMAP_SUFFIX;\n }\n\n return new Response(body, {\n headers: {\n 'Content-Type': 'application/xml',\n 'Cache-Control': `max-age=${60 * 60 * 24}`,\n },\n });\n}\n\nfunction getSiteMapLinks(resource: string, count: number, baseUrl: string) {\n let links = ``;\n\n for (let i = 1; i <= count; i++) {\n links += ` <sitemap><loc>${baseUrl}/sitemap/${resource}/${i}.xml</loc></sitemap>\\n`;\n }\n return links;\n}\n\nfunction renderUrlTag({\n url,\n updatedAt,\n locales,\n type,\n getLink,\n baseUrl,\n handle,\n getChangeFreq,\n metaobjectType,\n}: {\n type: SITEMAP_INDEX_TYPE;\n baseUrl: string;\n handle: string;\n metaobjectType?: string;\n getLink: (options: {\n type: string;\n baseUrl: string;\n handle?: string;\n locale?: string;\n }) => string;\n url: string;\n updatedAt: string;\n locales: string[];\n getChangeFreq?: (options: {type: string; handle: string}) => string;\n}) {\n return `<url>\n <loc>${url}</loc>\n <lastmod>${updatedAt}</lastmod>\n <changefreq>${\n getChangeFreq\n ? getChangeFreq({type: metaobjectType ?? type, handle})\n : 'weekly'\n }</changefreq>\n${locales\n .map((locale) =>\n renderAlternateTag(\n getLink({type: metaobjectType ?? type, baseUrl, handle, locale}),\n locale,\n ),\n )\n .join('\\n')}\n</url>\n `.trim();\n}\n\nfunction renderAlternateTag(url: string, locale: string) {\n return ` <xhtml:link rel=\"alternate\" hreflang=\"${locale}\" href=\"${url}\" />`;\n}\n\nconst PRODUCT_SITEMAP_QUERY = `#graphql\n query SitemapProducts($page: Int!) {\n sitemap(type: PRODUCT) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst COLLECTION_SITEMAP_QUERY = `#graphql\n query SitemapCollections($page: Int!) {\n sitemap(type: COLLECTION) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst ARTICLE_SITEMAP_QUERY = `#graphql\n query SitemapArticles($page: Int!) {\n sitemap(type: ARTICLE) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst PAGE_SITEMAP_QUERY = `#graphql\n query SitemapPages($page: Int!) {\n sitemap(type: PAGE) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst BLOG_SITEMAP_QUERY = `#graphql\n query SitemapBlogs($page: Int!) {\n sitemap(type: BLOG) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n }\n }\n }\n }\n` as const;\n\nconst METAOBJECT_SITEMAP_QUERY = `#graphql\n query SitemapMetaobjects($page: Int!) {\n sitemap(type: METAOBJECT) {\n resources(page: $page) {\n items {\n handle\n updatedAt\n ... on SitemapResourceMetaobject {\n type\n }\n }\n }\n }\n }\n` as const;\n\nconst SITEMAP_INDEX_QUERY = `#graphql\nquery SitemapIndex {\n products: sitemap(type: PRODUCT) {\n pagesCount {\n count\n }\n }\n collections: sitemap(type: COLLECTION) {\n pagesCount {\n count\n }\n }\n articles: sitemap(type: ARTICLE) {\n pagesCount {\n count\n }\n }\n pages: sitemap(type: PAGE) {\n pagesCount {\n count\n }\n }\n blogs: sitemap(type: BLOG) {\n pagesCount {\n count\n }\n }\n metaObjects: sitemap(type: METAOBJECT) {\n pagesCount {\n count\n }\n }\n}\n` as const;\n\nconst QUERIES = {\n products: PRODUCT_SITEMAP_QUERY,\n articles: ARTICLE_SITEMAP_QUERY,\n collections: COLLECTION_SITEMAP_QUERY,\n pages: PAGE_SITEMAP_QUERY,\n blogs: BLOG_SITEMAP_QUERY,\n metaObjects: METAOBJECT_SITEMAP_QUERY,\n};\n"]}
|