{"version":3,"file":"analytics-schema-custom-storefront-customer-tracking.mjs","sources":["../../src/analytics-schema-custom-storefront-customer-tracking.ts"],"sourcesContent":["import {\n  ShopifyAnalyticsPayload,\n  ShopifyAnalyticsPayloadWithPrivacyFields,\n  ShopifyPageViewPayload,\n  ShopifyPageViewPayloadWithPrivacyFields,\n  ShopifyAddToCartPayload,\n  ShopifyAddToCartPayloadWithPrivacyFields,\n  ShopifyMonorailPayload,\n  ShopifyAnalyticsProduct,\n  ShopifyMonorailEvent,\n} from './analytics-types.js';\nimport {AnalyticsPageType, ShopifySalesChannel} from './analytics-constants.js';\nimport {addDataIf, schemaWrapper, parseGid} from './analytics-utils.js';\nimport {buildUUID} from './cookies-utils.js';\nimport {version} from '../package.json';\n\nconst SCHEMA_ID = 'custom_storefront_customer_tracking/1.2';\nconst PAGE_RENDERED_EVENT_NAME = 'page_rendered';\nconst COLLECTION_PAGE_RENDERED_EVENT_NAME = 'collection_page_rendered';\nconst PRODUCT_PAGE_RENDERED_EVENT_NAME = 'product_page_rendered';\nconst PRODUCT_ADDED_TO_CART_EVENT_NAME = 'product_added_to_cart';\nconst SEARCH_SUBMITTED_EVENT_NAME = 'search_submitted';\n\nfunction prepareAdditionalPayload(\n  payload: ShopifyPageViewPayload | ShopifyPageViewPayloadWithPrivacyFields,\n): Pick<ShopifyMonorailPayload, 'canonical_url' | 'customer_id'> {\n  return {\n    canonical_url: payload.canonicalUrl || payload.url,\n    customer_id: parseInt(parseGid(payload.customerId).id || '0'),\n  };\n}\n\n// Send the page view event to the Monorail server.\n// It also sends additional page view events based on the page type.\nexport function pageView(\n  payload: ShopifyPageViewPayload | ShopifyPageViewPayloadWithPrivacyFields,\n): ShopifyMonorailEvent[] {\n  const pageViewPayload = payload;\n  const additionalPayload = prepareAdditionalPayload(pageViewPayload);\n\n  const pageType = pageViewPayload.pageType;\n  const pageViewEvents = [];\n\n  pageViewEvents.push(\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: PAGE_RENDERED_EVENT_NAME,\n          ...additionalPayload,\n        },\n        formatPayload(pageViewPayload),\n      ),\n    ),\n  );\n\n  switch (pageType) {\n    case AnalyticsPageType.collection:\n      pageViewEvents.push(\n        schemaWrapper(\n          SCHEMA_ID,\n          addDataIf(\n            {\n              event_name: COLLECTION_PAGE_RENDERED_EVENT_NAME,\n              ...additionalPayload,\n              collection_name: pageViewPayload.collectionHandle,\n              collection_id: parseInt(\n                parseGid(pageViewPayload.collectionId).id,\n              ),\n            },\n            formatPayload(pageViewPayload),\n          ),\n        ),\n      );\n      break;\n    case AnalyticsPageType.product:\n      pageViewEvents.push(\n        schemaWrapper(\n          SCHEMA_ID,\n          addDataIf(\n            {\n              event_name: PRODUCT_PAGE_RENDERED_EVENT_NAME,\n              ...additionalPayload,\n              products: formatProductPayload(pageViewPayload.products),\n              total_value: pageViewPayload.totalValue,\n            },\n            formatPayload(pageViewPayload),\n          ),\n        ),\n      );\n      break;\n    case AnalyticsPageType.search:\n      pageViewEvents.push(\n        schemaWrapper(\n          SCHEMA_ID,\n          addDataIf(\n            {\n              event_name: SEARCH_SUBMITTED_EVENT_NAME,\n              ...additionalPayload,\n              search_string: pageViewPayload.searchString,\n            },\n            formatPayload(pageViewPayload),\n          ),\n        ),\n      );\n      break;\n  }\n\n  return pageViewEvents;\n}\n\n// Sends page view event to the Monorail server.\nexport function pageView2(\n  payload: ShopifyPageViewPayload,\n): ShopifyMonorailEvent[] {\n  const pageViewPayload = payload;\n  const additionalPayload = prepareAdditionalPayload(pageViewPayload);\n\n  return [\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: PAGE_RENDERED_EVENT_NAME,\n          ...additionalPayload,\n        },\n        formatPayload(pageViewPayload),\n      ),\n    ),\n  ];\n}\n\n// Sends collection view event to the Monorail server.\nexport function collectionView(\n  payload: ShopifyPageViewPayload,\n): ShopifyMonorailEvent[] {\n  const pageViewPayload = payload;\n  const additionalPayload = prepareAdditionalPayload(pageViewPayload);\n\n  return [\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: COLLECTION_PAGE_RENDERED_EVENT_NAME,\n          ...additionalPayload,\n          collection_name: pageViewPayload.collectionHandle,\n          collection_id: parseInt(parseGid(pageViewPayload.collectionId).id),\n        },\n        formatPayload(pageViewPayload),\n      ),\n    ),\n  ];\n}\n\n// Sends product view event to the Monorail server.\nexport function productView(\n  payload: ShopifyPageViewPayload,\n): ShopifyMonorailEvent[] {\n  const pageViewPayload = payload;\n  const additionalPayload = prepareAdditionalPayload(pageViewPayload);\n\n  return [\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: PRODUCT_PAGE_RENDERED_EVENT_NAME,\n          ...additionalPayload,\n          products: formatProductPayload(pageViewPayload.products),\n          total_value: pageViewPayload.totalValue,\n        },\n        formatPayload(pageViewPayload),\n      ),\n    ),\n  ];\n}\n\n// Sends search view event to the Monorail server.\nexport function searchView(\n  payload: ShopifyPageViewPayload,\n): ShopifyMonorailEvent[] {\n  const pageViewPayload = payload;\n  const additionalPayload = prepareAdditionalPayload(pageViewPayload);\n\n  return [\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: SEARCH_SUBMITTED_EVENT_NAME,\n          ...additionalPayload,\n          search_string: pageViewPayload.searchString,\n        },\n        formatPayload(pageViewPayload),\n      ),\n    ),\n  ];\n}\n\nexport function addToCart(\n  payload: ShopifyAddToCartPayload | ShopifyAddToCartPayloadWithPrivacyFields,\n): ShopifyMonorailEvent[] {\n  const addToCartPayload = payload;\n  const cartToken = parseGid(addToCartPayload.cartId);\n  return [\n    schemaWrapper(\n      SCHEMA_ID,\n      addDataIf(\n        {\n          event_name: PRODUCT_ADDED_TO_CART_EVENT_NAME,\n          customerId: addToCartPayload.customerId,\n          cart_token: cartToken?.id ? `${cartToken.id}` : null,\n          total_value: addToCartPayload.totalValue,\n          products: formatProductPayload(addToCartPayload.products),\n          customer_id: parseInt(\n            parseGid(addToCartPayload.customerId).id || '0',\n          ),\n        },\n        formatPayload(addToCartPayload),\n      ),\n    ),\n  ];\n}\n\nfunction formatPayload(\n  payload: ShopifyAnalyticsPayload | ShopifyAnalyticsPayloadWithPrivacyFields,\n): ShopifyMonorailPayload {\n  const payloadWithPrivacy =\n    payload as ShopifyAnalyticsPayloadWithPrivacyFields;\n\n  return {\n    source: payload.shopifySalesChannel || ShopifySalesChannel.headless,\n    asset_version_id: payload.assetVersionId || version,\n    hydrogenSubchannelId:\n      payload.storefrontId || payload.hydrogenSubchannelId || '0',\n\n    is_persistent_cookie: payload.hasUserConsent,\n    deprecated_visit_token: payload.visitToken,\n    unique_token: payload.uniqueToken,\n    event_time: Date.now(),\n    event_id: buildUUID(),\n\n    event_source_url: payload.url,\n    referrer: payload.referrer,\n    user_agent: payload.userAgent,\n    navigation_type: payload.navigationType,\n    navigation_api: payload.navigationApi,\n\n    shop_id: parseInt(parseGid(payload.shopId).id),\n    currency: payload.currency,\n\n    ccpa_enforced: payloadWithPrivacy.ccpaEnforced || false,\n    gdpr_enforced: payloadWithPrivacy.gdprEnforced || false,\n    gdpr_enforced_as_string: payloadWithPrivacy.gdprEnforced ? 'true' : 'false',\n    analytics_allowed: payload.analyticsAllowed || false,\n    marketing_allowed: payload.marketingAllowed || false,\n    sale_of_data_allowed: payload.saleOfDataAllowed || false,\n  };\n}\n\nfunction formatProductPayload(products?: ShopifyAnalyticsProduct[]): string[] {\n  return products\n    ? products.map((p: ShopifyAnalyticsProduct) => {\n        const product = addDataIf(\n          {\n            variant_gid: p.variantGid,\n            category: p.category,\n            sku: p.sku,\n            product_id: parseInt(parseGid(p.productGid).id),\n            variant_id: parseInt(parseGid(p.variantGid).id),\n          },\n          {\n            product_gid: p.productGid,\n            name: p.name,\n            variant: p.variantName || '',\n            brand: p.brand,\n            price: parseFloat(p.price),\n            quantity: Number(p.quantity || 0),\n          },\n        );\n        return JSON.stringify(product);\n      })\n    : [];\n}\n"],"names":[],"mappings":"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"}