UNPKG

@shopana/ga

Version:

Type-safe Google Analytics 4 (GA4) tracking library for React and Next.js with ecommerce support, event batching, and SSR compatibility

225 lines 7.56 kB
import {} from '../types/common'; import {} from '../types/events'; import {} from './TransactionRegistry'; import { normalizeItems, sanitizeNumeric } from './utils'; export function buildPurchaseEvent(params, registry, onDuplicate = console.warn) { if (!params.measurementId) { throw new Error('measurementId is required for purchase events'); } if (!params.transactionId) { throw new Error('transactionId is required for purchase events'); } if (registry) { registry.guard(params.transactionId, onDuplicate); } return { name: 'purchase', measurementId: params.measurementId, params: { transaction_id: params.transactionId, currency: params.currency ?? 'USD', coupon: params.coupon, affiliation: params.affiliation, ...sanitizeNumeric(params, ['value', 'tax', 'shipping']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildAddToCartEvent(params) { return buildCartEvent('add_to_cart', params); } export function buildRemoveFromCartEvent(params) { return buildCartEvent('remove_from_cart', params); } function buildCartEvent(name, params) { if (!params.measurementId) { throw new Error('measurementId is required for cart events'); } return { name, measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildViewCartEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for view_cart events'); } return { name: 'view_cart', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildBeginCheckoutEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for begin_checkout events'); } return { name: 'begin_checkout', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', coupon: params.coupon, ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildAddPaymentInfoEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for add_payment_info events'); } return { name: 'add_payment_info', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', payment_type: params.payment_type, coupon: params.coupon, ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildAddShippingInfoEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for add_shipping_info events'); } return { name: 'add_shipping_info', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', shipping_tier: params.shipping_tier, coupon: params.coupon, ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildViewItemEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for view_item events'); } return { name: 'view_item', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildViewItemListEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for view_item_list events'); } return { name: 'view_item_list', measurementId: params.measurementId, params: { item_list_id: params.item_list_id, item_list_name: params.item_list_name, items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildSelectItemEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for select_item events'); } return { name: 'select_item', measurementId: params.measurementId, params: { item_list_id: params.item_list_id, item_list_name: params.item_list_name, items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildViewPromotionEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for view_promotion events'); } return { name: 'view_promotion', measurementId: params.measurementId, params: { promotion_id: params.promotion_id, promotion_name: params.promotion_name, creative_name: params.creative_name, creative_slot: params.creative_slot, location_id: params.location_id, items: params.items ? normalizeItems(params.items) : undefined, ...(params.extraParams ?? {}), }, }; } export function buildSelectPromotionEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for select_promotion events'); } return { name: 'select_promotion', measurementId: params.measurementId, params: { promotion_id: params.promotion_id, promotion_name: params.promotion_name, creative_name: params.creative_name, creative_slot: params.creative_slot, location_id: params.location_id, items: params.items ? normalizeItems(params.items) : undefined, ...(params.extraParams ?? {}), }, }; } export function buildAddToWishlistEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for add_to_wishlist events'); } return { name: 'add_to_wishlist', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', ...sanitizeNumeric(params, ['value']), items: normalizeItems(params.items), ...(params.extraParams ?? {}), }, }; } export function buildGenerateLeadEvent(params) { if (!params.measurementId) { throw new Error('measurementId is required for generate_lead events'); } return { name: 'generate_lead', measurementId: params.measurementId, params: { currency: params.currency ?? 'USD', ...sanitizeNumeric(params, ['value']), ...(params.extraParams ?? {}), }, }; } //# sourceMappingURL=commerceTracking.js.map