import type { ConsentState, NuxtUseScriptOptions, RegistryScriptInput, UseFunctionType, UseScriptContext } from '#nuxt-scripts/types'; import type { GTag } from './google-analytics.js'; import { GoogleTagManagerOptions } from './schemas.js'; /** * Improved DataLayer type that better reflects GTM's capabilities * Can contain either gtag event parameters or custom data objects */ export type DataLayerItem = Parameters | Record; export type DataLayer = Array; /** * DataLayer push function type */ export interface DataLayerPush { (...args: Parameters): void; (obj: Record | any[]): void; } /** * Improved DataLayer API type with more precise methods */ export interface GoogleTagManagerDataLayerApi { name: string; push: DataLayerPush; set: (config: Record) => void; get: (key: string) => T; reset: () => void; listeners: Array<() => void>; } /** * DataLayer status information */ export interface GoogleTagManagerDataLayerStatus { dataLayer: { gtmDom: boolean; gtmLoad: boolean; subscribers: number; [key: string]: unknown; }; } /** * Container instance type */ export interface GoogleTagManagerContainer { callback: () => void; dataLayer: GoogleTagManagerDataLayerApi; state: Record; } /** * Complete GTM instance object */ export interface GoogleTagManagerInstance extends GoogleTagManagerDataLayerStatus { [containerId: string]: GoogleTagManagerContainer | any; } /** * Complete Google Tag Manager API accessible via window */ export interface GoogleTagManagerApi { google_tag_manager: GoogleTagManagerInstance; dataLayer: DataLayer & { push: DataLayerPush; }; } /** * Enhanced window type with GTM */ declare global { interface Window extends GoogleTagManagerApi { } } export { GoogleTagManagerOptions }; export type GoogleTagManagerInput = RegistryScriptInput; export interface GoogleTagManagerConsent { /** Push `['consent','update', state]` onto dataLayer with GCMv2 partial state. */ update: (state: ConsentState) => void; } /** * Hook to use Google Tag Manager in Nuxt applications */ export declare function useScriptGoogleTagManager(options?: GoogleTagManagerInput & { /** * Optional callback that runs before GTM starts * Allows for custom initialization or configuration */ onBeforeGtmStart?: (gtag: DataLayerPush) => void; }): UseScriptContext, T>, GoogleTagManagerConsent>;