UNPKG

better-analytics

Version:

Zero-dependency micro-analytics JavaScript SDK < 3KB gzipped with React/Next.js/Expo support

134 lines (132 loc) 3.21 kB
/** * Core Analytics Configuration */ interface AnalyticsConfig { /** Analytics endpoint (defaults to Better Analytics SaaS) */ endpoint?: string; /** Site identifier (required) */ site: string; /** Environment mode */ mode?: 'auto' | 'development' | 'production'; /** Enable debug logging */ debug?: boolean; /** Transform events before sending */ beforeSend?: BeforeSend; } /** * Base device information (common to all platforms) */ interface BaseDeviceInfo { userAgent?: string; screenWidth?: number; screenHeight?: number; language?: string; timezone?: string; } /** * Web-specific device information */ interface WebDeviceInfo extends BaseDeviceInfo { viewportWidth?: number; viewportHeight?: number; connectionType?: string; } /** * Mobile-specific device information (React Native/Expo) */ interface MobileDeviceInfo extends BaseDeviceInfo { platform?: string; platformVersion?: string; brand?: string; model?: string; isEmulator?: boolean; carrier?: string; } /** * Base event data structure */ interface BaseEventData { event: string; timestamp: number; site?: string; url: string; referrer: string; sessionId?: string; deviceId?: string; userId?: string; utm?: { source?: string; medium?: string; campaign?: string; term?: string; content?: string; }; props?: Record<string, unknown>; meta?: Record<string, unknown>; } /** * Web event data structure */ interface WebEventData extends BaseEventData { device?: WebDeviceInfo; page?: { title?: string; pathname?: string; hostname?: string; loadTime?: number; }; } /** * Mobile event data structure (React Native/Expo) */ interface MobileEventData extends BaseEventData { device?: MobileDeviceInfo; app?: { version?: string; buildNumber?: string; bundleId?: string; }; } /** * Main EventData type (defaults to web for backwards compatibility) */ type EventData = WebEventData; /** * BeforeSend event types */ interface PageViewEvent { type: 'pageview'; url: string; path?: string; data?: EventData; } interface CustomEvent { type: 'event'; name: string; url: string; data?: EventData; } interface IdentifyEvent { type: 'identify'; userId: string; traits?: Record<string, unknown>; data?: EventData; } type BeforeSendEvent = PageViewEvent | CustomEvent | IdentifyEvent; /** * BeforeSend middleware function * Return null to cancel the event, or modified event to send */ type BeforeSend = (event: BeforeSendEvent) => BeforeSendEvent | null | Promise<BeforeSendEvent | null>; /** * Route computation result */ interface RouteInfo { /** Computed route pattern (e.g., /user/[id]) */ route: string; /** Actual path (e.g., /user/123) */ path: string; /** Route parameters */ params?: Record<string, string | string[]>; } export type { AnalyticsConfig as A, BeforeSend as B, MobileEventData as M, RouteInfo as R, WebEventData as W, MobileDeviceInfo as a, BaseEventData as b, BeforeSendEvent as c };