@technoapple/ga4
Version:
TypeScript Node.js library to support GA4 analytics.
99 lines (78 loc) • 3.1 kB
text/typescript
export type SendFunction = (eventName: string, params: Record<string, unknown>) => void;
export interface GA4Plugin {
remove(): void;
}
// --- Event Tracker ---
export interface EventTrackerOptions {
events?: string[];
attributePrefix?: string;
hitFilter?: (params: Record<string, unknown>, element: Element, event: Event) => Record<string, unknown> | null;
}
// --- Outbound Link Tracker ---
export interface OutboundLinkTrackerOptions {
events?: string[];
linkSelector?: string;
shouldTrackOutboundLink?: (link: Element, parseUrl: (url: string) => { hostname: string; protocol: string; href: string }) => boolean;
eventName?: string;
attributePrefix?: string;
hitFilter?: (params: Record<string, unknown>, element: Element, event: Event) => Record<string, unknown> | null;
}
// --- Outbound Form Tracker ---
export interface OutboundFormTrackerOptions {
formSelector?: string;
shouldTrackOutboundForm?: (form: HTMLFormElement, parseUrl: (url: string) => { hostname: string; protocol: string; href: string }) => boolean;
eventName?: string;
hitFilter?: (params: Record<string, unknown>, element: Element, event: Event) => Record<string, unknown> | null;
}
// --- Page Visibility Tracker ---
export interface PageVisibilityTrackerOptions {
sendInitialPageview?: boolean;
sessionTimeout?: number;
timeZone?: string;
eventName?: string;
hitFilter?: (params: Record<string, unknown>) => Record<string, unknown> | null;
}
// --- URL Change Tracker ---
export interface UrlChangeTrackerOptions {
shouldTrackUrlChange?: (newPath: string, oldPath: string) => boolean;
trackReplaceState?: boolean;
hitFilter?: (params: Record<string, unknown>) => Record<string, unknown> | null;
}
// --- Impression Tracker ---
export interface ImpressionElementConfig {
id: string;
threshold?: number;
trackFirstImpressionOnly?: boolean;
}
export interface ImpressionTrackerOptions {
elements?: Array<string | ImpressionElementConfig>;
rootMargin?: string;
attributePrefix?: string;
eventName?: string;
hitFilter?: (params: Record<string, unknown>, element: Element) => Record<string, unknown> | null;
}
// --- Clean URL Tracker ---
export interface CleanUrlTrackerOptions {
stripQuery?: boolean;
queryParamsAllowlist?: string[];
queryParamsDenylist?: string[];
trailingSlash?: 'add' | 'remove';
urlFilter?: (url: string) => string;
}
// --- Media Query Tracker ---
export interface MediaQueryDefinitionItem {
name: string;
media: string;
}
export interface MediaQueryDefinition {
name: string;
dimensionIndex?: number;
items: MediaQueryDefinitionItem[];
}
export interface MediaQueryTrackerOptions {
definitions?: MediaQueryDefinition[];
changeTemplate?: (oldValue: string, newValue: string) => string;
changeTimeout?: number;
eventName?: string;
hitFilter?: (params: Record<string, unknown>) => Record<string, unknown> | null;
}