better-analytics
Version:
Zero-dependency micro-analytics JavaScript SDK < 3KB gzipped with React/Next.js/Expo support
134 lines (132 loc) • 3.21 kB
text/typescript
/**
* 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 };