{"version":3,"file":"analytics-schema-custom-storefront-customer-tracking.mjs","names":[],"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"],"mappings":"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"}