@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
JavaScript
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