{"version":3,"file":"analytics.mjs","sources":["../../src/analytics.ts"],"sourcesContent":["import type {\n  ClientBrowserParameters,\n  ShopifyAddToCartPayload,\n  ShopifyAnalytics,\n  ShopifyPageViewPayload,\n  ShopifyMonorailEvent,\n} from './analytics-types.js';\nimport {AnalyticsEventName} from './analytics-constants.js';\nimport {errorIfServer} from './analytics-utils.js';\n\nimport {pageView as trekkiePageView} from './analytics-schema-trekkie-storefront-page-view.js';\nimport {\n  pageView as customerPageView,\n  pageView2 as customerPageView2,\n  collectionView as customerCollectionView,\n  productView as customerProductView,\n  searchView as customerSearchView,\n  addToCart as customerAddToCart,\n} from './analytics-schema-custom-storefront-customer-tracking.js';\nimport {getTrackingValues} from './tracking-utils.js';\n\n/**\n * Set user and session cookies and refresh the expiry time\n * @param event - The analytics event.\n * @param shopDomain - The Online Store domain to sent Shopify analytics under the same\n *   top level domain.\n */\nexport function sendShopifyAnalytics(\n  event: ShopifyAnalytics,\n  shopDomain?: string,\n): Promise<void> {\n  const {eventName, payload} = event;\n  if (!payload.hasUserConsent) return Promise.resolve();\n\n  let events: ShopifyMonorailEvent[] = [];\n  const pageViewPayload = payload as ShopifyPageViewPayload;\n\n  if (eventName === AnalyticsEventName.PAGE_VIEW) {\n    events = events.concat(\n      trekkiePageView(pageViewPayload),\n      customerPageView(pageViewPayload),\n    );\n  } else if (eventName === AnalyticsEventName.ADD_TO_CART) {\n    events = events.concat(\n      customerAddToCart(payload as ShopifyAddToCartPayload),\n    );\n  } else if (eventName === AnalyticsEventName.PAGE_VIEW_2) {\n    events = events.concat(\n      trekkiePageView(pageViewPayload),\n      customerPageView2(pageViewPayload),\n    );\n  } else if (eventName === AnalyticsEventName.COLLECTION_VIEW) {\n    events = events.concat(customerCollectionView(pageViewPayload));\n  } else if (eventName === AnalyticsEventName.PRODUCT_VIEW) {\n    events = events.concat(customerProductView(pageViewPayload));\n  } else if (eventName === AnalyticsEventName.SEARCH_VIEW) {\n    events = events.concat(customerSearchView(pageViewPayload));\n  }\n\n  if (events.length) {\n    return sendToShopify(events, shopDomain);\n  } else {\n    return Promise.resolve();\n  }\n}\n\n// Shopify monorail return invalid agent for Lighthouse userAgents\nfunction isLighthouseUserAgent(): boolean {\n  if (typeof window === 'undefined' || !window.navigator) return false;\n  return /Chrome-Lighthouse/.test(window.navigator.userAgent);\n}\n\ntype MonorailResponse = {\n  status: number;\n  message: string;\n};\n\nconst ERROR_MESSAGE = 'sendShopifyAnalytics request is unsuccessful';\n\nfunction sendToShopify(\n  events: ShopifyMonorailEvent[],\n  shopDomain?: string,\n): Promise<void> {\n  if (isLighthouseUserAgent()) {\n    return Promise.resolve();\n  }\n\n  const eventsToBeSent = {\n    events,\n    metadata: {\n      event_sent_at_ms: Date.now(),\n    },\n  };\n\n  try {\n    return fetch(\n      shopDomain\n        ? `https://${shopDomain}/.well-known/shopify/monorail/unstable/produce_batch`\n        : 'https://monorail-edge.shopifysvc.com/unstable/produce_batch',\n      {\n        method: 'post',\n        headers: {\n          'content-type': 'text/plain',\n        },\n        body: JSON.stringify(eventsToBeSent),\n      },\n    )\n      .then((response) => {\n        if (!response.ok) {\n          throw new Error('Response failed');\n        }\n        return response.text();\n      })\n      .then((data) => {\n        if (data) {\n          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n          const jsonResponse = JSON.parse(data);\n          // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call\n          jsonResponse.result.forEach((eventResponse: MonorailResponse) => {\n            if (eventResponse.status !== 200) {\n              console.error(ERROR_MESSAGE, '\\n\\n', eventResponse.message);\n            }\n          });\n        }\n      })\n      .catch((err) => {\n        console.error(ERROR_MESSAGE, err);\n        if (__HYDROGEN_DEV__) {\n          throw new Error(ERROR_MESSAGE);\n        }\n      });\n  } catch (error) {\n    // Do nothing\n    return Promise.resolve();\n  }\n}\n\nexport function getClientBrowserParameters(): ClientBrowserParameters {\n  if (errorIfServer('getClientBrowserParameters')) {\n    return {\n      uniqueToken: '',\n      visitToken: '',\n      url: '',\n      path: '',\n      search: '',\n      referrer: '',\n      title: '',\n      userAgent: '',\n      navigationType: '',\n      navigationApi: '',\n    };\n  }\n\n  const [navigationType, navigationApi] = getNavigationType();\n  const trackingValues = getTrackingValues();\n\n  return {\n    uniqueToken: trackingValues.uniqueToken,\n    visitToken: trackingValues.visitToken,\n    url: location.href,\n    path: location.pathname,\n    search: location.search,\n    referrer: document.referrer,\n    title: document.title,\n    userAgent: navigator.userAgent,\n    navigationType,\n    navigationApi,\n  };\n}\n\nfunction getNavigationTypeExperimental(): string | undefined {\n  try {\n    const navigationEntries =\n      performance?.getEntriesByType &&\n      performance?.getEntriesByType('navigation');\n\n    if (navigationEntries && navigationEntries[0]) {\n      // https://developer.mozilla.org/en-US/docs/Web/API/PerformanceNavigationTiming\n      const rawType = (\n        window.performance.getEntriesByType(\n          'navigation',\n        )[0] as PerformanceNavigationTiming\n      )['type'];\n      const navType = rawType && rawType.toString();\n\n      return navType;\n    }\n  } catch (err) {\n    // Do nothing\n  }\n  return undefined;\n}\n\nfunction getNavigationTypeLegacy(): string | undefined {\n  try {\n    if (\n      PerformanceNavigation &&\n      performance?.navigation?.type !== null &&\n      performance?.navigation?.type !== undefined\n    ) {\n      //  https://developer.mozilla.org/en-US/docs/Web/API/Performance/navigation\n      const rawType = performance.navigation.type;\n      switch (rawType) {\n        case PerformanceNavigation.TYPE_NAVIGATE:\n          return 'navigate';\n        case PerformanceNavigation.TYPE_RELOAD:\n          return 'reload';\n        case PerformanceNavigation.TYPE_BACK_FORWARD:\n          return 'back_forward';\n        default:\n          return `unknown: ${rawType}`;\n      }\n    }\n  } catch (err) {\n    // do nothing\n  }\n  return undefined;\n}\n\nfunction getNavigationType(): [string, string] {\n  try {\n    let navApi = 'PerformanceNavigationTiming';\n    let navType = getNavigationTypeExperimental();\n    if (!navType) {\n      navType = getNavigationTypeLegacy();\n      navApi = 'performance.navigation';\n    }\n    if (navType) {\n      return [navType, navApi];\n    } else {\n      return ['unknown', 'unknown'];\n    }\n  } catch (err) {\n    // do nothing\n  }\n  return ['error', 'error'];\n}\n"],"names":["trekkiePageView","customerPageView","customerAddToCart","customerPageView2","customerCollectionView","customerProductView","customerSearchView"],"mappings":"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"}