UNPKG

@technoapple/ga4

Version:

TypeScript Node.js library to support GA4 analytics.

70 lines (58 loc) 2.09 kB
import { ga4Option } from "./ga4option"; import { DataLayerObject } from "../types/dataLayer"; import { KeyValueParams, gtag } from "../types/gtag"; import { GA4Plugin, SendFunction } from "../types/plugins"; import {} from '../types/global'; class ga4 { private static instance: ga4; private _plugins: GA4Plugin[] = []; private constructor() { } public init(option:ga4Option){ window.dataLayer = window.dataLayer || Array<DataLayerObject>; window.gtag = window.gtag || function() { window.dataLayer.push(arguments); } window.gtag('js', new Date()); window.gtag('config', option.targetId); } public static getInstance():ga4 { if (!ga4.instance) { ga4.instance = new ga4(); } return ga4.instance; } public send(eventName:string, eventParameters: KeyValueParams ): boolean { window.gtag('event', eventName, eventParameters); return true; } /** * Register a plugin with the GA4 instance. * @param PluginClass The plugin class constructor * @param options Plugin-specific configuration options * @returns The plugin instance (call `.remove()` to unregister) */ // eslint-disable-next-line @typescript-eslint/no-explicit-any public use<T extends GA4Plugin>( PluginClass: new (send: SendFunction, options?: any) => T, options?: any ): T { const send: SendFunction = (eventName: string, params: Record<string, unknown>) => { window.gtag('event', eventName, params as KeyValueParams); }; const plugin = new PluginClass(send, options); this._plugins.push(plugin); return plugin; } /** * Remove all registered plugins and clean up their listeners. */ public removeAll(): void { this._plugins.forEach(p => p.remove()); this._plugins = []; } get gtag() : gtag { return window.gtag; } } export {ga4};