/** * Minimal ConversionIQ SDK - Core functionality only * Target: <15KB gzipped */ import { ConversionIQConfig, EventData, TrackingOptions } from './types/index'; interface MinimalConfig { apiKey?: string; websiteId?: string; endpoint?: string; debug?: boolean; } export class MinimalConversionIQ { private config: MinimalConfig; private sessionId: string; private userId?: string; constructor(config: MinimalConfig = {}) { this.config = { endpoint: 'https://conversioniq-api-dev.azurewebsites.net', debug: false, ...config }; this.sessionId = this.generateSessionId(); } /** * Set user identification */ public identify(userId: string): void { this.userId = userId; this.track('identify', { user_id: userId }); } /** * Track a custom event */ public async track(eventType: string, data?: Record): Promise { // Validate required configuration if (!this.config.websiteId) { const error = 'ConversionIQ: websiteId is required but not configured'; if (this.config.debug) { console.error(error); } throw new Error(error); } const payload = { website_id: this.config.websiteId, event_type: eventType, user_id: this.userId, session_id: this.sessionId, timestamp: new Date().toISOString(), user_agent: navigator.userAgent, page_url: window.location.href, metadata: { ...data, viewport_width: window.innerWidth, viewport_height: window.innerHeight, sdk_version: '2.0.12-minimal' } }; try { await this.sendEvent(payload); if (this.config.debug) { console.log('ConversionIQ: Event tracked', payload); } } catch (error) { if (this.config.debug) { console.error('ConversionIQ: Failed to track event', error); } throw error; } } /** * Track a conversion */ public async trackConversion(value: number, currency = 'USD', metadata?: Record): Promise { await this.track('conversion', { value, currency, ...metadata }); } /** * Track a page view */ public async trackPageView(): Promise { await this.track('page_view', { url: window.location.href, title: document.title, referrer: document.referrer }); } /** * Track element click */ public async trackClick(selector: string, metadata?: Record): Promise { await this.track('click', { element: selector, page_url: window.location.href, ...metadata }); } private async sendEvent(payload: any): Promise { const response = await fetch(`${this.config.endpoint}/api/v1/events`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.config.apiKey}` }, body: JSON.stringify(payload) }); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } } private generateSessionId(): string { return 'ciq_' + Date.now().toString(36) + Math.random().toString(36).substring(2); } } // Auto-initialization for script tag usage only // Only run when loaded via