{"version":3,"file":"eafc5cf0.js","sources":["../../../node_modules/@shopify/hydrogen/dist/esnext/foundation/Analytics/connectors/Shopify/utils.js","../../../node_modules/@shopify/hydrogen/dist/esnext/foundation/Analytics/connectors/Shopify/ShopifyAnalytics.client.js"],"sourcesContent":["const zeros = '00000000';\nconst tokenHash = 'xxxx-4xxx-xxxx-xxxxxxxxxxxx';\nexport function buildUUID() {\n let hash = '';\n try {\n const crypto = window.crypto;\n const randomValuesArray = new Uint16Array(31);\n crypto.getRandomValues(randomValuesArray);\n // Generate a strong UUID\n let i = 0;\n hash = tokenHash\n .replace(/[x]/g, (c, ...args) => {\n const r = randomValuesArray[i] % 16;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n i++;\n return v.toString(16);\n })\n .toUpperCase();\n }\n catch (err) {\n // crypto not available, generate weak UUID\n hash = tokenHash\n .replace(/[x]/g, (c, ...args) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n })\n .toUpperCase();\n }\n return `${hexTime()}-${hash}`;\n}\nexport function hexTime() {\n // 32 bit representations of new Date().getTime() and performance.now()\n let dateNumber = 0;\n let perfNumber = 0;\n // Result of zero-fill right shift is always positive\n dateNumber = new Date().getTime() >>> 0;\n try {\n perfNumber = performance.now() >>> 0;\n }\n catch (err) {\n perfNumber = 0;\n }\n const output = Math.abs(dateNumber + perfNumber)\n .toString(16)\n .toLowerCase();\n return zeros.substr(0, 8 - output.length) + output;\n}\nexport function addDataIf(keyValuePairs, formattedData) {\n Object.entries(keyValuePairs).forEach(([key, value]) => {\n if (value) {\n formattedData[key] = value;\n }\n });\n return formattedData;\n}\n","import { useEffect } from 'react';\nimport { parse, stringify } from 'worktop/cookie';\nimport { SHOPIFY_Y, SHOPIFY_S } from '../../../../constants.js';\nimport { ClientAnalytics } from '../../ClientAnalytics.js';\nimport { buildUUID, addDataIf } from './utils.js';\nconst longTermLength = 60 * 60 * 24 * 360 * 2; // ~2 year expiry\nconst shortTermLength = 60 * 30; // 30 mins\nconst myShopifyDomain = 'myshopify.com';\nconst oxygenDomain = 'myshopify.dev';\nlet isInit = false;\nlet microSessionCount = 0;\nexport function ShopifyAnalyticsClient({ cookieDomain }) {\n useEffect(() => {\n try {\n // Find Shopify cookies\n const cookieData = parse(document.cookie);\n const shopifyYCookie = cookieData[SHOPIFY_Y] || buildUUID();\n const shopifySCookie = cookieData[SHOPIFY_S] || buildUUID();\n /**\n * Set user and session cookies and refresh the expiry time\n */\n updateCookie(SHOPIFY_Y, shopifyYCookie, longTermLength, cookieDomain);\n updateCookie(SHOPIFY_S, shopifySCookie, shortTermLength, cookieDomain);\n ClientAnalytics.pushToPageAnalyticsData({\n shopify: {\n pageId: buildUUID(),\n userId: shopifyYCookie,\n sessionId: shopifySCookie,\n },\n });\n microSessionCount = 0;\n // TODO: Fix with useEvent when ready\n // RFC: https://github.com/reactjs/rfcs/blob/useevent/text/0000-useevent.md\n if (!isInit) {\n isInit = true;\n const eventNames = ClientAnalytics.eventNames;\n ClientAnalytics.subscribe(eventNames.PAGE_VIEW, trackPageView);\n // On a slow network, the pageview event could be already fired before\n // we subscribed to the pageview event\n if (ClientAnalytics.hasSentFirstPageView()) {\n trackPageView(ClientAnalytics.getPageAnalyticsData());\n }\n }\n }\n catch (err) {\n // Do nothing\n }\n });\n return null;\n}\nfunction updateCookie(cookieName, value, maxage, cookieDomain) {\n const cookieString = stringify(cookieName, value, {\n maxage,\n domain: getCookieDomain(cookieDomain),\n secure: import.meta.env.PROD,\n samesite: 'Lax',\n path: '/',\n });\n document.cookie = cookieString;\n return cookieString;\n}\nfunction getCookieDomain(cookieDomain) {\n const hostname = location.hostname;\n if (hostname.indexOf(myShopifyDomain) !== -1) {\n return `.${hostname.split('.').slice(-3).join('.')}`;\n }\n else if (hostname.indexOf(cookieDomain) !== -1) {\n return `.${cookieDomain}`;\n }\n else {\n return '';\n }\n}\nfunction trackPageView(payload) {\n microSessionCount += 1;\n try {\n payload &&\n payload.shopify &&\n sendToServer(storefrontPageViewSchema(payload));\n }\n catch (error) {\n console.error(`Error Shopify analytics: ${ClientAnalytics.eventNames.PAGE_VIEW}`, error);\n }\n}\nfunction storefrontPageViewSchema(payload) {\n return {\n schema_id: 'trekkie_storefront_page_view/1.4',\n payload: buildStorefrontPageViewPayload(payload),\n metadata: {\n event_created_at_ms: Date.now(),\n },\n };\n}\nfunction buildStorefrontPageViewPayload(payload) {\n const location = document.location;\n const shopify = payload.shopify;\n let formattedData = {\n appClientId: '6167201',\n hydrogenSubchannelId: shopify.storefrontId || '0',\n isPersistentCookie: shopify.isPersistentCookie,\n uniqToken: shopify.userId,\n visitToken: shopify.sessionId,\n microSessionId: shopify.pageId,\n microSessionCount,\n url: location.href,\n path: location.pathname,\n search: location.search,\n referrer: document.referrer,\n title: document.title,\n shopId: stripGId(shopify.shopId),\n currency: shopify.currency,\n contentLanguage: shopify.acceptedLanguage,\n };\n formattedData = addDataIf({\n isMerchantRequest: isMerchantRequest(),\n }, formattedData);\n formattedData = addDataIf({\n pageType: shopify.pageType,\n }, formattedData);\n if (shopify.resourceId) {\n try {\n formattedData = addDataIf({\n resourceType: getResourceType(shopify.resourceId),\n resourceId: stripGId(shopify.resourceId),\n }, formattedData);\n }\n catch (err) {\n // do nothing\n }\n }\n formattedData = addDataIf({\n customerId: shopify.customerId,\n }, formattedData);\n return formattedData;\n}\nfunction isMerchantRequest() {\n const hostname = location.hostname;\n if (hostname.indexOf(oxygenDomain) !== -1 || hostname === 'localhost') {\n return true;\n }\n return false;\n}\nfunction stripGId(text = '') {\n return parseInt(text.substring(text.lastIndexOf('/') + 1));\n}\nfunction getResourceType(text) {\n return text\n .substring(0, text.lastIndexOf('/'))\n .replace(/.*shopify\\//, '')\n .toLowerCase();\n}\nconst BATCH_SENT_TIMEOUT = 500;\nlet batchedData = [];\nlet batchedTimeout;\nfunction sendToServer(data) {\n batchedData.push(data);\n if (batchedTimeout) {\n clearTimeout(batchedTimeout);\n batchedTimeout = null;\n }\n batchedTimeout = setTimeout(() => {\n const batchedDataToBeSent = {\n events: batchedData,\n metadata: {\n event_sent_at_ms: Date.now(),\n },\n };\n batchedData = [];\n batchedTimeout = null;\n // Send to Shopify\n try {\n fetch('https://monorail-edge.shopifysvc.com/unstable/produce_batch', {\n method: 'post',\n headers: {\n 'content-type': 'text/plain',\n },\n body: JSON.stringify(batchedDataToBeSent),\n });\n }\n catch (error) {\n // Do nothing\n }\n }, BATCH_SENT_TIMEOUT);\n}\n"],"names":["zeros","tokenHash","buildUUID","hash","crypto","randomValuesArray","i","c","args","r","v","hexTime","dateNumber","perfNumber","output","addDataIf","keyValuePairs","formattedData","key","value","longTermLength","shortTermLength","myShopifyDomain","oxygenDomain","isInit","microSessionCount","ShopifyAnalyticsClient","cookieDomain","useEffect","cookieData","parse","shopifyYCookie","SHOPIFY_Y","shopifySCookie","SHOPIFY_S","updateCookie","ClientAnalytics","eventNames","trackPageView","cookieName","maxage","cookieString","stringify","getCookieDomain","hostname","payload","sendToServer","storefrontPageViewSchema","error","buildStorefrontPageViewPayload","location","shopify","stripGId","isMerchantRequest","getResourceType","text","BATCH_SENT_TIMEOUT","batchedData","batchedTimeout","data","batchedDataToBeSent"],"mappings":"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"}