@technoapple/ga4
Version:
TypeScript Node.js library to support GA4 analytics.
70 lines (58 loc) • 2.09 kB
text/typescript
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};