shopkit-analytics 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +769 -0
  3. package/dist/adapters/index.d.mts +4 -0
  4. package/dist/adapters/index.d.ts +4 -0
  5. package/dist/adapters/index.js +2405 -0
  6. package/dist/adapters/index.js.map +1 -0
  7. package/dist/adapters/index.mjs +23 -0
  8. package/dist/adapters/index.mjs.map +1 -0
  9. package/dist/affiliate/index.d.mts +138 -0
  10. package/dist/affiliate/index.d.ts +138 -0
  11. package/dist/affiliate/index.js +816 -0
  12. package/dist/affiliate/index.js.map +1 -0
  13. package/dist/affiliate/index.mjs +74 -0
  14. package/dist/affiliate/index.mjs.map +1 -0
  15. package/dist/affiliate-tracker-BgHwibPv.d.mts +144 -0
  16. package/dist/affiliate-tracker-BgHwibPv.d.ts +144 -0
  17. package/dist/chunk-3TQR5DOP.mjs +79 -0
  18. package/dist/chunk-3TQR5DOP.mjs.map +1 -0
  19. package/dist/chunk-4MZH5OLR.mjs +2375 -0
  20. package/dist/chunk-4MZH5OLR.mjs.map +1 -0
  21. package/dist/chunk-JVEGG6JV.mjs +213 -0
  22. package/dist/chunk-JVEGG6JV.mjs.map +1 -0
  23. package/dist/chunk-P4OJDCEZ.mjs +57 -0
  24. package/dist/chunk-P4OJDCEZ.mjs.map +1 -0
  25. package/dist/chunk-TNXTKEGS.mjs +758 -0
  26. package/dist/chunk-TNXTKEGS.mjs.map +1 -0
  27. package/dist/events/index.d.mts +112 -0
  28. package/dist/events/index.d.ts +112 -0
  29. package/dist/events/index.js +2131 -0
  30. package/dist/events/index.js.map +1 -0
  31. package/dist/events/index.mjs +30 -0
  32. package/dist/events/index.mjs.map +1 -0
  33. package/dist/index-BnNRgdUv.d.ts +676 -0
  34. package/dist/index-GODWc1s6.d.mts +676 -0
  35. package/dist/index.d.mts +38 -0
  36. package/dist/index.d.ts +38 -0
  37. package/dist/index.js +3269 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/index.mjs +190 -0
  40. package/dist/index.mjs.map +1 -0
  41. package/dist/subscriber-43gnCKWe.d.ts +80 -0
  42. package/dist/subscriber-IFZJU57V.mjs +8 -0
  43. package/dist/subscriber-IFZJU57V.mjs.map +1 -0
  44. package/dist/subscriber-sWesj_5p.d.mts +80 -0
  45. package/dist/types.d.mts +991 -0
  46. package/dist/types.d.ts +991 -0
  47. package/dist/types.js +102 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/types.mjs +8 -0
  50. package/dist/types.mjs.map +1 -0
  51. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/affiliate/index.tsx","../../src/affiliate/AffiliateTracker.tsx","../../src/affiliate/constants.ts","../../src/affiliate/affiliate-tracker.ts","../../src/affiliate/hooks.ts","../../src/affiliate/utils.ts"],"sourcesContent":["// Main component\nexport { default as AffiliateTracker } from \"./AffiliateTracker\";\nexport type { AffiliateTrackerProps } from \"./AffiliateTracker\";\n\n// Export hooks\nexport {\n useAffiliateTracker,\n useHasAffiliateData,\n useAffiliateSource,\n useAutoCapture,\n useAffiliateEvents,\n} from \"./hooks\";\n\n// Export core functions\nexport {\n captureAffiliateParams,\n getAffiliateParams,\n clearAffiliateParams,\n configureAffiliateTracker,\n appendAffiliateParams,\n getAffiliateParamsAsUrlString,\n hasAffiliateData,\n getAffiliateSource,\n addEventListener,\n getConfig,\n resetConfig,\n ALL_AFFILIATE_PARAMETERS,\n DEFAULT_CONFIG,\n} from \"./affiliate-tracker\";\n\n// Export utility classes\nexport {\n AffiliateAnalytics,\n AffiliateUrlUtils,\n AffiliateAttribution,\n AffiliateTestUtils,\n AffiliateValidation,\n} from \"./utils\";\n\n// Export types\nexport type {\n AffiliateParams,\n AffiliateData,\n AffiliateConfig,\n AffiliateTrackerHookReturn,\n AffiliateEvent,\n AffiliateEventType,\n} from \"./types\";\n\n// Export constants\nexport {\n UTM_PARAMETERS,\n CLICK_ID_PARAMETERS,\n AFFILIATE_PARAMETERS,\n STORAGE_CONFIG,\n ATTRIBUTION_MODELS,\n STORAGE_TYPES,\n EVENT_TYPES,\n ATTRIBUTION_CHANNELS,\n SEARCH_ENGINES,\n SOCIAL_PLATFORMS,\n} from \"./constants\";\n\n// Export constant types\nexport type {\n UTMParameter,\n ClickIdParameter,\n AffiliateParameter,\n AllAffiliateParameter,\n AttributionModel,\n StorageType,\n EventType,\n AttributionChannel,\n} from \"./constants\";\n","\"use client\";\n\n\nimport { useEffect } from \"react\";\nimport {\n captureAffiliateParams,\n configureAffiliateTracker,\n} from \"./affiliate-tracker\";\nimport type { AffiliateConfig } from \"./types\";\n\ninterface AffiliateTrackerProps {\n config?: Partial<AffiliateConfig>;\n autoCapture?: boolean;\n children?: React.ReactNode;\n}\n\nconst AffiliateTracker: React.FC<AffiliateTrackerProps> = ({\n config,\n autoCapture = true,\n children,\n}) => {\n useEffect(() => {\n // Configure the tracker if config is provided\n if (config) {\n configureAffiliateTracker(config);\n }\n\n // Auto-capture affiliate params if enabled\n if (autoCapture) {\n captureAffiliateParams();\n }\n }, [config, autoCapture]);\n\n return children ? <>{children}</> : null;\n};\n\nexport default AffiliateTracker;\nexport type { AffiliateTrackerProps };\n","/**\n * Centralized constants for affiliate tracking parameters\n */\n\n// Core UTM parameters\nexport const UTM_PARAMETERS = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\n// Click ID parameters from various platforms\nexport const CLICK_ID_PARAMETERS = [\n \"gclid\", // Google Ads\n \"fbclid\", // Facebook\n \"msclkid\", // Microsoft Ads\n \"ttclid\", // TikTok\n \"twclid\", // Twitter\n \"li_fat_id\", // LinkedIn\n] as const;\n\n// Generic affiliate parameters\nexport const AFFILIATE_PARAMETERS = [\n \"click_id\",\n \"affiliate_id\",\n \"ref\",\n \"source\",\n \"referrer\",\n] as const;\n\n// All supported affiliate tracking parameters\nexport const ALL_AFFILIATE_PARAMETERS = [\n ...UTM_PARAMETERS,\n ...CLICK_ID_PARAMETERS,\n ...AFFILIATE_PARAMETERS,\n] as const;\n\n// Default storage configuration\nexport const STORAGE_CONFIG = {\n DEFAULT_KEY: \"affiliateParams\",\n DEFAULT_TTL: 30 * 24 * 60 * 60 * 1000, // 30 days in milliseconds\n} as const;\n\n// Attribution models\nexport const ATTRIBUTION_MODELS = {\n FIRST_TOUCH: \"first-touch\",\n LAST_TOUCH: \"last-touch\",\n} as const;\n\n// Storage types\nexport const STORAGE_TYPES = {\n SESSION: \"sessionStorage\",\n LOCAL: \"localStorage\",\n} as const;\n\n// Event types\nexport const EVENT_TYPES = {\n CAPTURE: \"capture\",\n CLEAR: \"clear\",\n EXPIRE: \"expire\",\n} as const;\n\n// Attribution channels for classification\nexport const ATTRIBUTION_CHANNELS = {\n DIRECT: \"direct\",\n PAID_SEARCH: \"paid_search\",\n ORGANIC_SEARCH: \"organic_search\",\n SOCIAL: \"social\",\n EMAIL: \"email\",\n AFFILIATE: \"affiliate\",\n REFERRAL: \"referral\",\n DISPLAY: \"display\",\n} as const;\n\n// Search engines for referrer classification\nexport const SEARCH_ENGINES = [\n \"google.com\",\n \"bing.com\",\n \"yahoo.com\",\n \"duckduckgo.com\",\n \"baidu.com\",\n \"yandex.com\",\n \"ask.com\",\n] as const;\n\n// Social media platforms for source classification\nexport const SOCIAL_PLATFORMS = [\n \"facebook\",\n \"instagram\",\n \"twitter\",\n \"linkedin\",\n \"tiktok\",\n \"youtube\",\n \"pinterest\",\n \"snapchat\",\n] as const;\n\n// Type definitions for the constants\nexport type UTMParameter = (typeof UTM_PARAMETERS)[number];\nexport type ClickIdParameter = (typeof CLICK_ID_PARAMETERS)[number];\nexport type AffiliateParameter = (typeof AFFILIATE_PARAMETERS)[number];\nexport type AllAffiliateParameter = (typeof ALL_AFFILIATE_PARAMETERS)[number];\nexport type AttributionModel =\n (typeof ATTRIBUTION_MODELS)[keyof typeof ATTRIBUTION_MODELS];\nexport type StorageType = (typeof STORAGE_TYPES)[keyof typeof STORAGE_TYPES];\nexport type EventType = (typeof EVENT_TYPES)[keyof typeof EVENT_TYPES];\nexport type AttributionChannel =\n (typeof ATTRIBUTION_CHANNELS)[keyof typeof ATTRIBUTION_CHANNELS];\n","import type {\n AffiliateParams,\n AffiliateData,\n AffiliateConfig,\n AffiliateEvent,\n} from \"./types\";\nimport {\n ALL_AFFILIATE_PARAMETERS,\n STORAGE_CONFIG,\n ATTRIBUTION_MODELS,\n STORAGE_TYPES,\n} from \"./constants\";\n\nconst DEFAULT_CONFIG: Required<AffiliateConfig> = {\n storageKey: STORAGE_CONFIG.DEFAULT_KEY,\n storageType: STORAGE_TYPES.SESSION,\n attribution: ATTRIBUTION_MODELS.LAST_TOUCH,\n ttl: STORAGE_CONFIG.DEFAULT_TTL,\n customParams: [],\n enableReferrerCapture: true,\n enableUserAgentCapture: false,\n onCapture: () => {},\n onError: () => {},\n};\n\nlet currentConfig: Required<AffiliateConfig> = { ...DEFAULT_CONFIG };\nlet eventListeners: ((event: AffiliateEvent) => void)[] = [];\n\n/**\n * Configure the affiliate tracker\n */\nexport function configureAffiliateTracker(\n config: Partial<AffiliateConfig> = {}\n): void {\n currentConfig = { ...DEFAULT_CONFIG, ...config };\n}\n\n/**\n * Generate a unique session ID\n */\nfunction generateSessionId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Get the appropriate storage object\n */\nfunction getStorage(): Storage | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n return currentConfig.storageType === \"localStorage\"\n ? window.localStorage\n : window.sessionStorage;\n } catch (error) {\n currentConfig.onError(new Error(`Storage not available: ${error}`));\n return null;\n }\n}\n\n/**\n * Check if stored data has expired\n */\nfunction isExpired(timestamp: number): boolean {\n return Date.now() - timestamp > currentConfig.ttl;\n}\n\n/**\n * Emit an event to all listeners\n */\nfunction emitEvent(event: AffiliateEvent): void {\n eventListeners.forEach((listener) => {\n try {\n listener(event);\n } catch (error) {\n currentConfig.onError(new Error(`Event listener error: ${error}`));\n }\n });\n}\n\n/**\n * Add an event listener\n */\nexport function addEventListener(\n listener: (event: AffiliateEvent) => void\n): () => void {\n eventListeners.push(listener);\n\n // Return unsubscribe function\n return () => {\n const index = eventListeners.indexOf(listener);\n if (index > -1) {\n eventListeners.splice(index, 1);\n }\n };\n}\n\n/**\n * Capture affiliate parameters from URL and store them\n */\nexport function captureAffiliateParams(\n customConfig?: Partial<AffiliateConfig>\n): AffiliateData | null {\n if (typeof window === \"undefined\") return null;\n\n // Temporarily override config if provided\n const originalConfig = currentConfig;\n if (customConfig) {\n currentConfig = { ...currentConfig, ...customConfig };\n }\n\n try {\n const storage = getStorage();\n if (!storage) return null;\n\n const urlParams = new URLSearchParams(window.location.search);\n const allKeys = [\n ...ALL_AFFILIATE_PARAMETERS,\n ...currentConfig.customParams,\n ];\n const affiliateParams: AffiliateParams = {};\n\n // Extract parameters from URL\n for (const key of allKeys) {\n const value = urlParams.get(key);\n if (value) {\n affiliateParams[key] = value;\n }\n }\n\n // Capture referrer if enabled and available\n if (currentConfig.enableReferrerCapture && document.referrer) {\n affiliateParams.referrer = document.referrer;\n }\n\n // Only proceed if we have affiliate data\n if (Object.keys(affiliateParams).length === 0) {\n return null;\n }\n\n // Check existing data for attribution logic\n const existingData = getAffiliateParams();\n let shouldUpdate = true;\n\n if (existingData && currentConfig.attribution === \"first-touch\") {\n // Don't update if we already have first-touch data\n shouldUpdate = false;\n }\n\n if (shouldUpdate) {\n const affiliateData: AffiliateData = {\n ...affiliateParams,\n timestamp: Date.now(),\n sessionId: generateSessionId(),\n attribution: currentConfig.attribution,\n url: window.location.href,\n ...(currentConfig.enableUserAgentCapture && {\n userAgent: navigator.userAgent,\n }),\n };\n\n storage.setItem(currentConfig.storageKey, JSON.stringify(affiliateData));\n\n // Emit capture event\n emitEvent({\n type: \"capture\",\n data: affiliateData,\n timestamp: Date.now(),\n });\n\n currentConfig.onCapture(affiliateData);\n return affiliateData;\n }\n\n return existingData;\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n currentConfig.onError(errorObj);\n return null;\n } finally {\n // Restore original config\n if (customConfig) {\n currentConfig = originalConfig;\n }\n }\n}\n\n/**\n * Get stored affiliate parameters\n */\nexport function getAffiliateParams(): AffiliateData | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const storage = getStorage();\n if (!storage) return null;\n\n const stored = storage.getItem(currentConfig.storageKey);\n if (!stored) return null;\n\n const data: AffiliateData = JSON.parse(stored);\n\n // Check if data has expired\n if (isExpired(data.timestamp)) {\n clearAffiliateParams();\n emitEvent({\n type: \"expire\",\n data,\n timestamp: Date.now(),\n });\n return null;\n }\n\n return data;\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n currentConfig.onError(errorObj);\n return null;\n }\n}\n\n/**\n * Clear stored affiliate parameters\n */\nexport function clearAffiliateParams(): void {\n if (typeof window === \"undefined\") return;\n\n try {\n const storage = getStorage();\n if (!storage) return;\n\n const existingData = getAffiliateParams();\n storage.removeItem(currentConfig.storageKey);\n\n // Emit clear event\n emitEvent({\n type: \"clear\",\n data: existingData || undefined,\n timestamp: Date.now(),\n });\n } catch (error) {\n const errorObj = error instanceof Error ? error : new Error(String(error));\n currentConfig.onError(errorObj);\n }\n}\n\n/**\n * Get affiliate parameters as URL search params string\n */\nexport function getAffiliateParamsAsUrlString(): string {\n const data = getAffiliateParams();\n if (!data) return \"\";\n\n const params = new URLSearchParams();\n\n // Only include the actual affiliate parameters, not metadata\n const affiliateKeys = [\n ...ALL_AFFILIATE_PARAMETERS,\n ...currentConfig.customParams,\n ];\n\n for (const key of affiliateKeys) {\n const value = data[key];\n if (typeof value === \"string\" && value) {\n params.set(key, value);\n }\n }\n\n return params.toString();\n}\n\n/**\n * Append affiliate parameters to a URL\n */\nexport function appendAffiliateParams(url: string): string {\n const affiliateParams = getAffiliateParamsAsUrlString();\n if (!affiliateParams) return url;\n\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n return `${url}${separator}${affiliateParams}`;\n}\n\n/**\n * Check if current session has affiliate data\n */\nexport function hasAffiliateData(): boolean {\n return getAffiliateParams() !== null;\n}\n\n/**\n * Get affiliate source (utm_source or referrer domain)\n */\nexport function getAffiliateSource(): string | null {\n const data = getAffiliateParams();\n if (!data) return null;\n\n if (data.utm_source) return data.utm_source;\n if (data.referrer) {\n try {\n return new URL(data.referrer).hostname;\n } catch {\n return data.referrer;\n }\n }\n\n return null;\n}\n\n/**\n * Get current configuration\n */\nexport function getConfig(): Required<AffiliateConfig> {\n return { ...currentConfig };\n}\n\n/**\n * Reset configuration to defaults\n */\nexport function resetConfig(): void {\n currentConfig = { ...DEFAULT_CONFIG };\n}\n\n// Export constants for external use\nexport { ALL_AFFILIATE_PARAMETERS, DEFAULT_CONFIG };\n","\"use client\";\n\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport type {\n AffiliateData,\n AffiliateConfig,\n AffiliateTrackerHookReturn,\n AffiliateEvent,\n} from \"./types\";\nimport {\n captureAffiliateParams,\n getAffiliateParams,\n clearAffiliateParams,\n configureAffiliateTracker,\n addEventListener,\n hasAffiliateData,\n getAffiliateSource,\n} from \"./affiliate-tracker\";\n\n/**\n * Hook for tracking affiliate parameters\n */\nexport function useAffiliateTracker(\n config?: Partial<AffiliateConfig>\n): AffiliateTrackerHookReturn {\n const [affiliateParams, setAffiliateParams] = useState<AffiliateData | null>(\n null\n );\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const configRef = useRef(config);\n\n // Update config ref when config changes\n useEffect(() => {\n configRef.current = config;\n }, [config]);\n\n // Configure tracker on mount\n useEffect(() => {\n if (configRef.current) {\n configureAffiliateTracker({\n ...configRef.current,\n onError: (err) => {\n setError(err);\n configRef.current?.onError?.(err);\n },\n });\n }\n }, []);\n\n // Load initial data\n const refreshParams = useCallback(() => {\n setIsLoading(true);\n setError(null);\n\n try {\n const params = getAffiliateParams();\n setAffiliateParams(params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n } finally {\n setIsLoading(false);\n }\n }, []);\n\n // Capture new params\n const captureParams = useCallback(() => {\n setError(null);\n\n try {\n const params = captureAffiliateParams(configRef.current);\n setAffiliateParams(params);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n }\n }, []);\n\n // Clear params\n const clearParams = useCallback(() => {\n setError(null);\n\n try {\n clearAffiliateParams();\n setAffiliateParams(null);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n }\n }, []);\n\n // Listen for events\n useEffect(() => {\n const unsubscribe = addEventListener((event: AffiliateEvent) => {\n switch (event.type) {\n case \"capture\":\n setAffiliateParams(event.data || null);\n break;\n case \"clear\":\n case \"expire\":\n setAffiliateParams(null);\n break;\n }\n });\n\n return unsubscribe;\n }, []);\n\n // Initial load\n useEffect(() => {\n refreshParams();\n }, [refreshParams]);\n\n return {\n affiliateParams,\n isLoading,\n error,\n captureParams,\n clearParams,\n refreshParams,\n };\n}\n\n/**\n * Hook for checking if affiliate data exists\n */\nexport function useHasAffiliateData(): boolean {\n const [hasData, setHasData] = useState(false);\n\n useEffect(() => {\n const checkData = () => {\n setHasData(hasAffiliateData());\n };\n\n checkData();\n\n const unsubscribe = addEventListener(() => {\n checkData();\n });\n\n return unsubscribe;\n }, []);\n\n return hasData;\n}\n\n/**\n * Hook for getting affiliate source\n */\nexport function useAffiliateSource(): string | null {\n const [source, setSource] = useState<string | null>(null);\n\n useEffect(() => {\n const updateSource = () => {\n setSource(getAffiliateSource());\n };\n\n updateSource();\n\n const unsubscribe = addEventListener(() => {\n updateSource();\n });\n\n return unsubscribe;\n }, []);\n\n return source;\n}\n\n/**\n * Hook for auto-capturing affiliate params on mount\n */\nexport function useAutoCapture(config?: Partial<AffiliateConfig>): void {\n const hasRun = useRef(false);\n\n useEffect(() => {\n if (hasRun.current) return;\n hasRun.current = true;\n\n if (config) {\n configureAffiliateTracker(config);\n }\n\n captureAffiliateParams();\n }, [config]);\n}\n\n/**\n * Hook for listening to affiliate events\n */\nexport function useAffiliateEvents(\n callback: (event: AffiliateEvent) => void,\n eventTypes?: Array<\"capture\" | \"clear\" | \"expire\">\n): void {\n const callbackRef = useRef(callback);\n const eventTypesRef = useRef(eventTypes);\n\n useEffect(() => {\n callbackRef.current = callback;\n eventTypesRef.current = eventTypes;\n });\n\n useEffect(() => {\n const unsubscribe = addEventListener((event: AffiliateEvent) => {\n if (\n !eventTypesRef.current ||\n eventTypesRef.current.includes(event.type)\n ) {\n callbackRef.current(event);\n }\n });\n\n return unsubscribe;\n }, []);\n}\n","import type { AffiliateData, AffiliateParams } from \"./types\";\nimport { getAffiliateParams, appendAffiliateParams } from \"./affiliate-tracker\";\nimport {\n ALL_AFFILIATE_PARAMETERS,\n SEARCH_ENGINES,\n SOCIAL_PLATFORMS,\n ATTRIBUTION_CHANNELS,\n} from \"./constants\";\n\n/**\n * Analytics integration utilities\n */\nexport class AffiliateAnalytics {\n /**\n * Send affiliate data to Google Analytics 4\n */\n static sendToGA4(\n eventName: string = \"affiliate_attribution\",\n customParams?: Record<string, any>\n ): void {\n const affiliateData = getAffiliateParams();\n if (!affiliateData || typeof window === \"undefined\") return;\n\n // Check if gtag is available\n if (typeof (window as any).gtag === \"function\") {\n const eventParams: Record<string, any> = {\n utm_source: affiliateData.utm_source,\n utm_medium: affiliateData.utm_medium,\n utm_campaign: affiliateData.utm_campaign,\n utm_term: affiliateData.utm_term,\n utm_content: affiliateData.utm_content,\n affiliate_id: affiliateData.affiliate_id,\n attribution_type: affiliateData.attribution,\n session_id: affiliateData.sessionId,\n ...customParams,\n };\n\n // Remove undefined values\n Object.keys(eventParams).forEach((key) => {\n if (eventParams[key] === undefined) {\n delete eventParams[key];\n }\n });\n\n (window as any).gtag(\"event\", eventName, eventParams);\n }\n }\n\n /**\n * Send affiliate data to Facebook Pixel\n */\n static sendToFacebookPixel(\n eventName: string = \"AffiliateAttribution\",\n customParams?: Record<string, any>\n ): void {\n const affiliateData = getAffiliateParams();\n if (!affiliateData || typeof window === \"undefined\") return;\n\n // Check if fbq is available\n if (typeof (window as any).fbq === \"function\") {\n const eventParams: Record<string, any> = {\n utm_source: affiliateData.utm_source,\n utm_medium: affiliateData.utm_medium,\n utm_campaign: affiliateData.utm_campaign,\n fbclid: affiliateData.fbclid,\n ...customParams,\n };\n\n // Remove undefined values\n Object.keys(eventParams).forEach((key) => {\n if (eventParams[key] === undefined) {\n delete eventParams[key];\n }\n });\n\n (window as any).fbq(\"trackCustom\", eventName, eventParams);\n }\n }\n\n /**\n * Send affiliate data to any custom analytics endpoint\n */\n static async sendToCustomEndpoint(\n endpoint: string,\n options: {\n method?: string;\n headers?: Record<string, string>;\n customData?: Record<string, any>;\n } = {}\n ): Promise<void> {\n const affiliateData = getAffiliateParams();\n if (!affiliateData) return;\n\n const { method = \"POST\", headers = {}, customData = {} } = options;\n\n try {\n await fetch(endpoint, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify({\n ...affiliateData,\n ...customData,\n }),\n });\n } catch (error) {\n console.error(\"Failed to send affiliate data to custom endpoint:\", error);\n }\n }\n}\n\n/**\n * URL manipulation utilities\n */\nexport class AffiliateUrlUtils {\n /**\n * Create affiliate links with current parameters\n */\n static createAffiliateLink(\n baseUrl: string,\n additionalParams?: Record<string, string>\n ): string {\n let url = appendAffiliateParams(baseUrl);\n\n if (additionalParams) {\n const separator = url.includes(\"?\") ? \"&\" : \"?\";\n const params = new URLSearchParams(additionalParams);\n url = `${url}${separator}${params.toString()}`;\n }\n\n return url;\n }\n\n /**\n * Extract affiliate parameters from a URL\n */\n static extractFromUrl(url: string): AffiliateParams {\n try {\n const urlObj = new URL(url);\n const params: AffiliateParams = {};\n\n // Common affiliate parameters\n const affiliateKeys = ALL_AFFILIATE_PARAMETERS;\n\n affiliateKeys.forEach((key) => {\n const value = urlObj.searchParams.get(key);\n if (value) {\n params[key] = value;\n }\n });\n\n return params;\n } catch {\n return {};\n }\n }\n\n /**\n * Clean URL by removing affiliate parameters\n */\n static cleanUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n const affiliateKeys = ALL_AFFILIATE_PARAMETERS;\n\n affiliateKeys.forEach((key) => {\n urlObj.searchParams.delete(key);\n });\n\n return urlObj.toString();\n } catch {\n return url;\n }\n }\n}\n\n/**\n * Attribution utilities\n */\nexport class AffiliateAttribution {\n /**\n * Determine the attribution channel based on affiliate data\n */\n static getAttributionChannel(data?: AffiliateData): string {\n const affiliateData = data || getAffiliateParams();\n if (!affiliateData) return ATTRIBUTION_CHANNELS.DIRECT;\n\n // Check for paid search\n if (\n affiliateData.gclid ||\n affiliateData.utm_medium === \"cpc\" ||\n affiliateData.utm_medium === \"ppc\"\n ) {\n return ATTRIBUTION_CHANNELS.PAID_SEARCH;\n }\n\n // Check for social media\n if (\n affiliateData.fbclid ||\n affiliateData.ttclid ||\n affiliateData.twclid ||\n affiliateData.li_fat_id ||\n (affiliateData.utm_source &&\n SOCIAL_PLATFORMS.some((platform) =>\n affiliateData.utm_source?.includes(platform)\n ))\n ) {\n return ATTRIBUTION_CHANNELS.SOCIAL;\n }\n\n // Check for email\n if (\n affiliateData.utm_medium === \"email\" ||\n affiliateData.utm_source === \"email\"\n ) {\n return ATTRIBUTION_CHANNELS.EMAIL;\n }\n\n // Check for affiliate/referral\n if (\n affiliateData.affiliate_id ||\n affiliateData.utm_medium === \"affiliate\" ||\n affiliateData.utm_medium === \"referral\"\n ) {\n return ATTRIBUTION_CHANNELS.AFFILIATE;\n }\n\n // Check for organic search\n if (\n affiliateData.utm_medium === \"organic\" ||\n (affiliateData.referrer && this.isSearchEngine(affiliateData.referrer))\n ) {\n return ATTRIBUTION_CHANNELS.ORGANIC_SEARCH;\n }\n\n // Check for display advertising\n if (\n affiliateData.utm_medium === \"display\" ||\n affiliateData.utm_medium === \"banner\"\n ) {\n return ATTRIBUTION_CHANNELS.DISPLAY;\n }\n\n // Default to referral if we have a referrer\n if (affiliateData.referrer) {\n return ATTRIBUTION_CHANNELS.REFERRAL;\n }\n\n return ATTRIBUTION_CHANNELS.DIRECT;\n }\n\n /**\n * Check if a URL is from a search engine\n */\n private static isSearchEngine(url: string): boolean {\n const searchEngines = SEARCH_ENGINES;\n\n try {\n const hostname = new URL(url).hostname.toLowerCase();\n return searchEngines.some((engine) => hostname.includes(engine));\n } catch {\n return false;\n }\n }\n\n /**\n * Get attribution score (0-100) based on data quality\n */\n static getAttributionScore(data?: AffiliateData): number {\n const affiliateData = data || getAffiliateParams();\n if (!affiliateData) return 0;\n\n let score = 0;\n\n // Base score for having data\n score += 20;\n\n // UTM parameters (high value)\n if (affiliateData.utm_source) score += 20;\n if (affiliateData.utm_medium) score += 20;\n if (affiliateData.utm_campaign) score += 15;\n\n // Click IDs (very high value)\n if (affiliateData.gclid || affiliateData.fbclid || affiliateData.msclkid)\n score += 25;\n\n // Referrer information\n if (affiliateData.referrer) score += 10;\n\n // Additional parameters\n if (affiliateData.utm_term) score += 5;\n if (affiliateData.utm_content) score += 5;\n\n return Math.min(score, 100);\n }\n}\n\n/**\n * Testing utilities\n */\nexport class AffiliateTestUtils {\n /**\n * Mock affiliate data for testing\n */\n static mockAffiliateData(params: Partial<AffiliateData> = {}): AffiliateData {\n return {\n utm_source: \"test_source\",\n utm_medium: \"test_medium\",\n utm_campaign: \"test_campaign\",\n timestamp: Date.now(),\n sessionId: \"test-session-id\",\n attribution: \"last-touch\",\n url: \"https://example.com?utm_source=test_source&utm_medium=test_medium\",\n ...params,\n };\n }\n\n /**\n * Create test URL with affiliate parameters\n */\n static createTestUrl(\n baseUrl: string = \"https://example.com\",\n params: AffiliateParams = {}\n ): string {\n const defaultParams = {\n utm_source: \"test_source\",\n utm_medium: \"test_medium\",\n utm_campaign: \"test_campaign\",\n ...params,\n };\n\n const url = new URL(baseUrl);\n Object.entries(defaultParams).forEach(([key, value]) => {\n if (value) {\n url.searchParams.set(key, value);\n }\n });\n\n return url.toString();\n }\n\n /**\n * Simulate URL navigation for testing\n */\n static simulateNavigation(url: string): void {\n if (typeof window !== \"undefined\") {\n // Update window.location.search for testing\n Object.defineProperty(window, \"location\", {\n value: {\n ...window.location,\n search: new URL(url).search,\n href: url,\n },\n writable: true,\n });\n }\n }\n}\n\n/**\n * Validation utilities\n */\nexport class AffiliateValidation {\n /**\n * Validate affiliate parameter format\n */\n static validateParams(params: AffiliateParams): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n // Check for required fields based on common patterns\n if (params.utm_source && params.utm_source.length > 100) {\n errors.push(\"utm_source is too long (max 100 characters)\");\n }\n\n if (params.utm_medium && params.utm_medium.length > 100) {\n errors.push(\"utm_medium is too long (max 100 characters)\");\n }\n\n if (params.utm_campaign && params.utm_campaign.length > 100) {\n errors.push(\"utm_campaign is too long (max 100 characters)\");\n }\n\n // Validate URL format for referrer\n if (params.referrer) {\n try {\n new URL(params.referrer);\n } catch {\n errors.push(\"referrer is not a valid URL\");\n }\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Sanitize affiliate parameters\n */\n static sanitizeParams(params: AffiliateParams): AffiliateParams {\n const sanitized: AffiliateParams = {};\n\n Object.entries(params).forEach(([key, value]) => {\n if (typeof value === \"string\" && value.trim()) {\n // Basic sanitization - remove potentially harmful characters\n sanitized[key] = value\n .trim()\n .replace(/[<>'\"]/g, \"\") // Remove basic XSS characters\n .substring(0, 200); // Limit length\n }\n });\n\n return sanitized;\n }\n}\n"],"mappings":"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","names":["import_react","error"]}
@@ -0,0 +1,74 @@
1
+ "use client";
2
+ import {
3
+ AFFILIATE_PARAMETERS,
4
+ ALL_AFFILIATE_PARAMETERS,
5
+ ATTRIBUTION_CHANNELS,
6
+ ATTRIBUTION_MODELS,
7
+ AffiliateAnalytics,
8
+ AffiliateAttribution,
9
+ AffiliateTestUtils,
10
+ AffiliateTracker_default,
11
+ AffiliateUrlUtils,
12
+ AffiliateValidation,
13
+ CLICK_ID_PARAMETERS,
14
+ DEFAULT_CONFIG,
15
+ EVENT_TYPES,
16
+ SEARCH_ENGINES,
17
+ SOCIAL_PLATFORMS,
18
+ STORAGE_CONFIG,
19
+ STORAGE_TYPES,
20
+ UTM_PARAMETERS,
21
+ addEventListener,
22
+ appendAffiliateParams,
23
+ captureAffiliateParams,
24
+ clearAffiliateParams,
25
+ configureAffiliateTracker,
26
+ getAffiliateParams,
27
+ getAffiliateParamsAsUrlString,
28
+ getAffiliateSource,
29
+ getConfig,
30
+ hasAffiliateData,
31
+ resetConfig,
32
+ useAffiliateEvents,
33
+ useAffiliateSource,
34
+ useAffiliateTracker,
35
+ useAutoCapture,
36
+ useHasAffiliateData
37
+ } from "../chunk-TNXTKEGS.mjs";
38
+ export {
39
+ AFFILIATE_PARAMETERS,
40
+ ALL_AFFILIATE_PARAMETERS,
41
+ ATTRIBUTION_CHANNELS,
42
+ ATTRIBUTION_MODELS,
43
+ AffiliateAnalytics,
44
+ AffiliateAttribution,
45
+ AffiliateTestUtils,
46
+ AffiliateTracker_default as AffiliateTracker,
47
+ AffiliateUrlUtils,
48
+ AffiliateValidation,
49
+ CLICK_ID_PARAMETERS,
50
+ DEFAULT_CONFIG,
51
+ EVENT_TYPES,
52
+ SEARCH_ENGINES,
53
+ SOCIAL_PLATFORMS,
54
+ STORAGE_CONFIG,
55
+ STORAGE_TYPES,
56
+ UTM_PARAMETERS,
57
+ addEventListener,
58
+ appendAffiliateParams,
59
+ captureAffiliateParams,
60
+ clearAffiliateParams,
61
+ configureAffiliateTracker,
62
+ getAffiliateParams,
63
+ getAffiliateParamsAsUrlString,
64
+ getAffiliateSource,
65
+ getConfig,
66
+ hasAffiliateData,
67
+ resetConfig,
68
+ useAffiliateEvents,
69
+ useAffiliateSource,
70
+ useAffiliateTracker,
71
+ useAutoCapture,
72
+ useHasAffiliateData
73
+ };
74
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,144 @@
1
+ interface AffiliateParams {
2
+ utm_source?: string;
3
+ utm_medium?: string;
4
+ utm_campaign?: string;
5
+ utm_term?: string;
6
+ utm_content?: string;
7
+ click_id?: string;
8
+ referrer?: string;
9
+ gclid?: string;
10
+ fbclid?: string;
11
+ msclkid?: string;
12
+ ttclid?: string;
13
+ twclid?: string;
14
+ li_fat_id?: string;
15
+ affiliate_id?: string;
16
+ ref?: string;
17
+ source?: string;
18
+ [key: string]: string | undefined;
19
+ }
20
+ interface AffiliateData {
21
+ utm_source?: string;
22
+ utm_medium?: string;
23
+ utm_campaign?: string;
24
+ utm_term?: string;
25
+ utm_content?: string;
26
+ click_id?: string;
27
+ referrer?: string;
28
+ gclid?: string;
29
+ fbclid?: string;
30
+ msclkid?: string;
31
+ ttclid?: string;
32
+ twclid?: string;
33
+ li_fat_id?: string;
34
+ affiliate_id?: string;
35
+ ref?: string;
36
+ source?: string;
37
+ timestamp: number;
38
+ sessionId: string;
39
+ attribution: "first-touch" | "last-touch";
40
+ url: string;
41
+ userAgent?: string;
42
+ [key: string]: string | number | undefined;
43
+ }
44
+ interface AffiliateConfig {
45
+ storageKey?: string;
46
+ storageType?: "sessionStorage" | "localStorage";
47
+ attribution?: "first-touch" | "last-touch";
48
+ ttl?: number;
49
+ customParams?: string[];
50
+ enableReferrerCapture?: boolean;
51
+ enableUserAgentCapture?: boolean;
52
+ onCapture?: (data: AffiliateData) => void;
53
+ onError?: (error: Error) => void;
54
+ }
55
+ interface AffiliateTrackerHookReturn {
56
+ affiliateParams: AffiliateData | null;
57
+ isLoading: boolean;
58
+ error: Error | null;
59
+ captureParams: () => void;
60
+ clearParams: () => void;
61
+ refreshParams: () => void;
62
+ }
63
+ type AffiliateEventType = "capture" | "clear" | "expire";
64
+ interface AffiliateEvent {
65
+ type: AffiliateEventType;
66
+ data?: AffiliateData;
67
+ timestamp: number;
68
+ }
69
+
70
+ interface AffiliateTrackerProps {
71
+ config?: Partial<AffiliateConfig>;
72
+ autoCapture?: boolean;
73
+ children?: React.ReactNode;
74
+ }
75
+ declare const AffiliateTracker: React.FC<AffiliateTrackerProps>;
76
+
77
+ /**
78
+ * Hook for tracking affiliate parameters
79
+ */
80
+ declare function useAffiliateTracker(config?: Partial<AffiliateConfig>): AffiliateTrackerHookReturn;
81
+ /**
82
+ * Hook for checking if affiliate data exists
83
+ */
84
+ declare function useHasAffiliateData(): boolean;
85
+ /**
86
+ * Hook for getting affiliate source
87
+ */
88
+ declare function useAffiliateSource(): string | null;
89
+ /**
90
+ * Hook for auto-capturing affiliate params on mount
91
+ */
92
+ declare function useAutoCapture(config?: Partial<AffiliateConfig>): void;
93
+ /**
94
+ * Hook for listening to affiliate events
95
+ */
96
+ declare function useAffiliateEvents(callback: (event: AffiliateEvent) => void, eventTypes?: Array<"capture" | "clear" | "expire">): void;
97
+
98
+ declare const DEFAULT_CONFIG: Required<AffiliateConfig>;
99
+ /**
100
+ * Configure the affiliate tracker
101
+ */
102
+ declare function configureAffiliateTracker(config?: Partial<AffiliateConfig>): void;
103
+ /**
104
+ * Add an event listener
105
+ */
106
+ declare function addEventListener(listener: (event: AffiliateEvent) => void): () => void;
107
+ /**
108
+ * Capture affiliate parameters from URL and store them
109
+ */
110
+ declare function captureAffiliateParams(customConfig?: Partial<AffiliateConfig>): AffiliateData | null;
111
+ /**
112
+ * Get stored affiliate parameters
113
+ */
114
+ declare function getAffiliateParams(): AffiliateData | null;
115
+ /**
116
+ * Clear stored affiliate parameters
117
+ */
118
+ declare function clearAffiliateParams(): void;
119
+ /**
120
+ * Get affiliate parameters as URL search params string
121
+ */
122
+ declare function getAffiliateParamsAsUrlString(): string;
123
+ /**
124
+ * Append affiliate parameters to a URL
125
+ */
126
+ declare function appendAffiliateParams(url: string): string;
127
+ /**
128
+ * Check if current session has affiliate data
129
+ */
130
+ declare function hasAffiliateData(): boolean;
131
+ /**
132
+ * Get affiliate source (utm_source or referrer domain)
133
+ */
134
+ declare function getAffiliateSource(): string | null;
135
+ /**
136
+ * Get current configuration
137
+ */
138
+ declare function getConfig(): Required<AffiliateConfig>;
139
+ /**
140
+ * Reset configuration to defaults
141
+ */
142
+ declare function resetConfig(): void;
143
+
144
+ export { type AffiliateConfig as A, DEFAULT_CONFIG as D, AffiliateTracker as a, useHasAffiliateData as b, useAffiliateSource as c, captureAffiliateParams as d, clearAffiliateParams as e, getAffiliateSource as f, getAffiliateParams as g, hasAffiliateData as h, type AffiliateTrackerProps as i, type AffiliateParams as j, type AffiliateData as k, useAutoCapture as l, useAffiliateEvents as m, configureAffiliateTracker as n, appendAffiliateParams as o, getAffiliateParamsAsUrlString as p, addEventListener as q, getConfig as r, resetConfig as s, type AffiliateTrackerHookReturn as t, useAffiliateTracker as u, type AffiliateEvent as v, type AffiliateEventType as w };
@@ -0,0 +1,144 @@
1
+ interface AffiliateParams {
2
+ utm_source?: string;
3
+ utm_medium?: string;
4
+ utm_campaign?: string;
5
+ utm_term?: string;
6
+ utm_content?: string;
7
+ click_id?: string;
8
+ referrer?: string;
9
+ gclid?: string;
10
+ fbclid?: string;
11
+ msclkid?: string;
12
+ ttclid?: string;
13
+ twclid?: string;
14
+ li_fat_id?: string;
15
+ affiliate_id?: string;
16
+ ref?: string;
17
+ source?: string;
18
+ [key: string]: string | undefined;
19
+ }
20
+ interface AffiliateData {
21
+ utm_source?: string;
22
+ utm_medium?: string;
23
+ utm_campaign?: string;
24
+ utm_term?: string;
25
+ utm_content?: string;
26
+ click_id?: string;
27
+ referrer?: string;
28
+ gclid?: string;
29
+ fbclid?: string;
30
+ msclkid?: string;
31
+ ttclid?: string;
32
+ twclid?: string;
33
+ li_fat_id?: string;
34
+ affiliate_id?: string;
35
+ ref?: string;
36
+ source?: string;
37
+ timestamp: number;
38
+ sessionId: string;
39
+ attribution: "first-touch" | "last-touch";
40
+ url: string;
41
+ userAgent?: string;
42
+ [key: string]: string | number | undefined;
43
+ }
44
+ interface AffiliateConfig {
45
+ storageKey?: string;
46
+ storageType?: "sessionStorage" | "localStorage";
47
+ attribution?: "first-touch" | "last-touch";
48
+ ttl?: number;
49
+ customParams?: string[];
50
+ enableReferrerCapture?: boolean;
51
+ enableUserAgentCapture?: boolean;
52
+ onCapture?: (data: AffiliateData) => void;
53
+ onError?: (error: Error) => void;
54
+ }
55
+ interface AffiliateTrackerHookReturn {
56
+ affiliateParams: AffiliateData | null;
57
+ isLoading: boolean;
58
+ error: Error | null;
59
+ captureParams: () => void;
60
+ clearParams: () => void;
61
+ refreshParams: () => void;
62
+ }
63
+ type AffiliateEventType = "capture" | "clear" | "expire";
64
+ interface AffiliateEvent {
65
+ type: AffiliateEventType;
66
+ data?: AffiliateData;
67
+ timestamp: number;
68
+ }
69
+
70
+ interface AffiliateTrackerProps {
71
+ config?: Partial<AffiliateConfig>;
72
+ autoCapture?: boolean;
73
+ children?: React.ReactNode;
74
+ }
75
+ declare const AffiliateTracker: React.FC<AffiliateTrackerProps>;
76
+
77
+ /**
78
+ * Hook for tracking affiliate parameters
79
+ */
80
+ declare function useAffiliateTracker(config?: Partial<AffiliateConfig>): AffiliateTrackerHookReturn;
81
+ /**
82
+ * Hook for checking if affiliate data exists
83
+ */
84
+ declare function useHasAffiliateData(): boolean;
85
+ /**
86
+ * Hook for getting affiliate source
87
+ */
88
+ declare function useAffiliateSource(): string | null;
89
+ /**
90
+ * Hook for auto-capturing affiliate params on mount
91
+ */
92
+ declare function useAutoCapture(config?: Partial<AffiliateConfig>): void;
93
+ /**
94
+ * Hook for listening to affiliate events
95
+ */
96
+ declare function useAffiliateEvents(callback: (event: AffiliateEvent) => void, eventTypes?: Array<"capture" | "clear" | "expire">): void;
97
+
98
+ declare const DEFAULT_CONFIG: Required<AffiliateConfig>;
99
+ /**
100
+ * Configure the affiliate tracker
101
+ */
102
+ declare function configureAffiliateTracker(config?: Partial<AffiliateConfig>): void;
103
+ /**
104
+ * Add an event listener
105
+ */
106
+ declare function addEventListener(listener: (event: AffiliateEvent) => void): () => void;
107
+ /**
108
+ * Capture affiliate parameters from URL and store them
109
+ */
110
+ declare function captureAffiliateParams(customConfig?: Partial<AffiliateConfig>): AffiliateData | null;
111
+ /**
112
+ * Get stored affiliate parameters
113
+ */
114
+ declare function getAffiliateParams(): AffiliateData | null;
115
+ /**
116
+ * Clear stored affiliate parameters
117
+ */
118
+ declare function clearAffiliateParams(): void;
119
+ /**
120
+ * Get affiliate parameters as URL search params string
121
+ */
122
+ declare function getAffiliateParamsAsUrlString(): string;
123
+ /**
124
+ * Append affiliate parameters to a URL
125
+ */
126
+ declare function appendAffiliateParams(url: string): string;
127
+ /**
128
+ * Check if current session has affiliate data
129
+ */
130
+ declare function hasAffiliateData(): boolean;
131
+ /**
132
+ * Get affiliate source (utm_source or referrer domain)
133
+ */
134
+ declare function getAffiliateSource(): string | null;
135
+ /**
136
+ * Get current configuration
137
+ */
138
+ declare function getConfig(): Required<AffiliateConfig>;
139
+ /**
140
+ * Reset configuration to defaults
141
+ */
142
+ declare function resetConfig(): void;
143
+
144
+ export { type AffiliateConfig as A, DEFAULT_CONFIG as D, AffiliateTracker as a, useHasAffiliateData as b, useAffiliateSource as c, captureAffiliateParams as d, clearAffiliateParams as e, getAffiliateSource as f, getAffiliateParams as g, hasAffiliateData as h, type AffiliateTrackerProps as i, type AffiliateParams as j, type AffiliateData as k, useAutoCapture as l, useAffiliateEvents as m, configureAffiliateTracker as n, appendAffiliateParams as o, getAffiliateParamsAsUrlString as p, addEventListener as q, getConfig as r, resetConfig as s, type AffiliateTrackerHookReturn as t, useAffiliateTracker as u, type AffiliateEvent as v, type AffiliateEventType as w };
@@ -0,0 +1,79 @@
1
+ "use client";
2
+
3
+ // src/types.ts
4
+ var EventType = /* @__PURE__ */ ((EventType2) => {
5
+ EventType2["PRODUCT_VIEW"] = "product_view";
6
+ EventType2["STARTED_ORDER"] = "started_order";
7
+ EventType2["PAGE_VIEW"] = "page_view";
8
+ EventType2["BUTTON_CLICK"] = "button_click";
9
+ EventType2["FORM_SUBMISSION"] = "form_submission";
10
+ EventType2["VIEW_ITEM"] = "view_item";
11
+ EventType2["VIEWED_PRODUCT"] = "viewed_product";
12
+ EventType2["CHECKOUT_PAYMENT"] = "checkout_payment";
13
+ EventType2["COLLECTION_VIEW"] = "collection_view";
14
+ EventType2["ADD_TO_CART"] = "add_to_cart";
15
+ EventType2["REMOVE_FROM_CART"] = "remove_from_cart";
16
+ EventType2["CHECKOUT_STARTED"] = "checkout_started";
17
+ EventType2["CHECKOUT_COMPLETED"] = "checkout_completed";
18
+ EventType2["SEARCH"] = "search";
19
+ EventType2["CART_PAGE_LAND"] = "cart_page_land";
20
+ EventType2["CLOSE_CART"] = "close_cart";
21
+ EventType2["QUANTITY_CHANGE"] = "quantity_change";
22
+ EventType2["FILTER_APPLIED"] = "filter_applied";
23
+ EventType2["NEWSLETTER_SUBSCRIPTION"] = "newsletter_subscription";
24
+ EventType2["USER_SIGNUP"] = "user_signup";
25
+ EventType2["USER_LOGIN"] = "user_login";
26
+ EventType2["CUSTOM"] = "custom";
27
+ EventType2["USER_ENGAGEMENT"] = "user_engagement";
28
+ EventType2["SESSION_START"] = "session_start";
29
+ EventType2["FIRST_VISIT"] = "first_visit";
30
+ EventType2["SCROLL"] = "scroll";
31
+ EventType2["FORM_START"] = "form_start";
32
+ EventType2["ADD_PAYMENT_INFO"] = "add_payment_info";
33
+ EventType2["CART_VIEWED"] = "cart_viewed";
34
+ EventType2["PAGES_SCREENS_PER_SESSION"] = "pages_screens_per_session";
35
+ EventType2["VIEW_CONTENT"] = "view_content";
36
+ EventType2["PURCHASE"] = "purchase";
37
+ EventType2["VIEW_SEARCH_RESULTS"] = "view_search_results";
38
+ EventType2["ORDER_PLACED"] = "order_placed";
39
+ EventType2["BEGIN_CHECKOUT"] = "begin_checkout";
40
+ EventType2["ITEM_PURCHASED"] = "item_purchased";
41
+ EventType2["UPDATE_CART"] = "update_cart";
42
+ EventType2["CUSTOMER_REGISTERED"] = "customer_registered";
43
+ EventType2["CUSTOMER_LOGGED_IN"] = "customer_logged_in";
44
+ EventType2["SHOPIFY_CHECKOUT_UPDATED"] = "shopify_checkout_updated";
45
+ EventType2["SHOPIFY_ABANDONED_CHECKOUT"] = "shopify_abandoned_checkout";
46
+ EventType2["SHOPIFY_ORDER_FULFILLED"] = "shopify_order_fulfilled";
47
+ EventType2["SHOPIFY_CHECKOUT_STARTED"] = "shopify_checkout_started";
48
+ EventType2["SHOPIFY_ADD_TO_CART"] = "shopify_add_to_cart";
49
+ EventType2["SHOPIFY_REMOVED_FROM_CART"] = "shopify_removed_from_cart";
50
+ EventType2["SHOPIFY_UPDATE_CART"] = "shopify_update_cart";
51
+ EventType2["SPINFORM_RESULT"] = "spinform_result";
52
+ EventType2["COUPON_COPIED"] = "coupon_copied";
53
+ EventType2["STARTED_CHECKOUT_GK"] = "started_checkout_gk";
54
+ EventType2["MOBILE_ADDED_GK"] = "mobile_added_gk";
55
+ EventType2["ADDRESS_SELECTED_GK"] = "address_selected_gk";
56
+ EventType2["ADDRESS_COMPLETED_GK"] = "address_completed_gk";
57
+ EventType2["PAYMENT_METHOD_SELECTED_GK"] = "payment_method_selected_gk";
58
+ EventType2["PAYMENT_COMPLETED_GK"] = "payment_completed_gk";
59
+ EventType2["ORDER_SUCCESS"] = "order_success";
60
+ EventType2["ORDER_COMPLETED"] = "order_completed";
61
+ EventType2["PIN_CODE_ADDED_GK"] = "pin_code_added_gk";
62
+ EventType2["ADDRESS_ADDED_GK"] = "address_added_gk";
63
+ EventType2["KP_MP_PHONE_NUMBER_LOGGED_IN"] = "kp_mp_phone_number_logged_in";
64
+ EventType2["KP_PHONE_NUMBER_LOGGED_IN"] = "kp_phone_number_logged_in";
65
+ EventType2["KP_MP_SHOPIFY_LOGGED_IN"] = "kp_mp_shopify_logged_in";
66
+ EventType2["KP_MP_SUCCESSFULLY_LOGGED_OUT"] = "kp_mp_successfully_logged_out";
67
+ EventType2["KP_WHATSAPP_LOGGED_IN"] = "kp_whatsapp_logged_in";
68
+ EventType2["KP_MP_TRUECALLER_LOGGED_IN"] = "kp_mp_truecaller_logged_in";
69
+ EventType2["KP_MP_WHATSAPP_LOGGED_IN"] = "kp_mp_whatsapp_logged_in";
70
+ EventType2["KP_TRUECALLER_LOGGED_IN"] = "kp_truecaller_logged_in";
71
+ EventType2["KP_SHOPIFY_LOGGED_IN"] = "kp_shopify_logged_in";
72
+ EventType2["KP_SUCCESSFULLY_LOGGED_OUT"] = "kp_successfully_logged_out";
73
+ return EventType2;
74
+ })(EventType || {});
75
+
76
+ export {
77
+ EventType
78
+ };
79
+ //# sourceMappingURL=chunk-3TQR5DOP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["\n/**\n * Event types that can be tracked across the application\n */\nexport enum EventType {\n PRODUCT_VIEW = \"product_view\",\n STARTED_ORDER = \"started_order\",\n PAGE_VIEW = \"page_view\",\n BUTTON_CLICK = \"button_click\",\n FORM_SUBMISSION = \"form_submission\",\n VIEW_ITEM = \"view_item\",\n VIEWED_PRODUCT = \"viewed_product\",\n CHECKOUT_PAYMENT = \"checkout_payment\",\n COLLECTION_VIEW = \"collection_view\",\n ADD_TO_CART = \"add_to_cart\",\n REMOVE_FROM_CART = \"remove_from_cart\",\n CHECKOUT_STARTED = \"checkout_started\",\n CHECKOUT_COMPLETED = \"checkout_completed\",\n SEARCH = \"search\",\n CART_PAGE_LAND = \"cart_page_land\",\n CLOSE_CART = \"close_cart\",\n QUANTITY_CHANGE = \"quantity_change\",\n FILTER_APPLIED = \"filter_applied\",\n NEWSLETTER_SUBSCRIPTION = \"newsletter_subscription\",\n USER_SIGNUP = \"user_signup\",\n USER_LOGIN = \"user_login\",\n CUSTOM = \"custom\",\n USER_ENGAGEMENT = \"user_engagement\",\n SESSION_START = \"session_start\",\n FIRST_VISIT = \"first_visit\",\n SCROLL = \"scroll\",\n FORM_START = \"form_start\",\n ADD_PAYMENT_INFO = \"add_payment_info\",\n CART_VIEWED = \"cart_viewed\",\n PAGES_SCREENS_PER_SESSION = \"pages_screens_per_session\",\n VIEW_CONTENT = \"view_content\",\n PURCHASE = \"purchase\",\n VIEW_SEARCH_RESULTS = \"view_search_results\",\n ORDER_PLACED = \"order_placed\",\n BEGIN_CHECKOUT = \"begin_checkout\",\n\n // MoEngage events\n ITEM_PURCHASED = \"item_purchased\",\n UPDATE_CART = \"update_cart\",\n CUSTOMER_REGISTERED = \"customer_registered\",\n CUSTOMER_LOGGED_IN = \"customer_logged_in\",\n SHOPIFY_CHECKOUT_UPDATED = \"shopify_checkout_updated\",\n SHOPIFY_ABANDONED_CHECKOUT = \"shopify_abandoned_checkout\",\n SHOPIFY_ORDER_FULFILLED = \"shopify_order_fulfilled\",\n SHOPIFY_CHECKOUT_STARTED = \"shopify_checkout_started\",\n SHOPIFY_ADD_TO_CART = \"shopify_add_to_cart\",\n SHOPIFY_REMOVED_FROM_CART = \"shopify_removed_from_cart\",\n SHOPIFY_UPDATE_CART = \"shopify_update_cart\",\n SPINFORM_RESULT = \"spinform_result\",\n COUPON_COPIED = \"coupon_copied\",\n STARTED_CHECKOUT_GK = \"started_checkout_gk\",\n MOBILE_ADDED_GK = \"mobile_added_gk\",\n ADDRESS_SELECTED_GK = \"address_selected_gk\",\n ADDRESS_COMPLETED_GK = \"address_completed_gk\",\n PAYMENT_METHOD_SELECTED_GK = \"payment_method_selected_gk\",\n PAYMENT_COMPLETED_GK = \"payment_completed_gk\",\n ORDER_SUCCESS = \"order_success\",\n ORDER_COMPLETED = \"order_completed\",\n PIN_CODE_ADDED_GK = \"pin_code_added_gk\",\n ADDRESS_ADDED_GK = \"address_added_gk\",\n KP_MP_PHONE_NUMBER_LOGGED_IN = \"kp_mp_phone_number_logged_in\",\n KP_PHONE_NUMBER_LOGGED_IN = \"kp_phone_number_logged_in\",\n KP_MP_SHOPIFY_LOGGED_IN = \"kp_mp_shopify_logged_in\",\n KP_MP_SUCCESSFULLY_LOGGED_OUT = \"kp_mp_successfully_logged_out\",\n KP_WHATSAPP_LOGGED_IN = \"kp_whatsapp_logged_in\",\n KP_MP_TRUECALLER_LOGGED_IN = \"kp_mp_truecaller_logged_in\",\n KP_MP_WHATSAPP_LOGGED_IN = \"kp_mp_whatsapp_logged_in\",\n KP_TRUECALLER_LOGGED_IN = \"kp_truecaller_logged_in\",\n KP_SHOPIFY_LOGGED_IN = \"kp_shopify_logged_in\",\n KP_SUCCESSFULLY_LOGGED_OUT = \"kp_successfully_logged_out\",\n}\n\n/**\n * Base event interface that all events should implement\n */\nexport interface BaseEvent {\n type: EventType;\n timestamp?: number;\n event_category?: string;\n description?: string;\n [key: string]: any;\n}\n\n/**\n * Page view event\n */\nexport interface IPageViewEvent extends BaseEvent {\n type: EventType.PAGE_VIEW;\n path: string;\n title: string;\n referrer?: string;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n campaign_id?: string;\n content?: string;\n debug_mode?: boolean;\n engagement_time_msec?: number;\n entrances?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n gclid?: string;\n ignore_referrer?: boolean;\n medium?: string;\n page_location?: string;\n page_path?: string;\n page_referrer?: string;\n page_title?: string;\n page_source?: string;\n page_term?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * User engagement event\n */\nexport interface IUserEngagementEvent extends BaseEvent {\n type: EventType.USER_ENGAGEMENT;\n engagementTime?: number; // in seconds\n pagePath?: string;\n pageTitle?: string;\n scrollDepth?: number; // in percentage\n formId?: string;\n formName?: string;\n formFields?: Array<{\n fieldName: string;\n fieldValue: string;\n }>;\n buttonId?: string;\n buttonText?: string;\n location?: string;\n customProperties?: Record<string, any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n ga_session_id?: string;\n ga_session_number?: number;\n gclid?: string;\n ignore_referrer?: boolean;\n medium?: string;\n page_location?: string;\n page_path?: string;\n page_referrer?: string;\n page_title?: string;\n source?: string;\n srsltid?: string;\n term?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * Session start event\n */\nexport interface ISessionStartEvent extends BaseEvent {\n type: EventType.SESSION_START;\n sessionId: string;\n userId?: string;\n userAgent?: string;\n referrer?: string;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * First visit event\n */\nexport interface IFirstVisitEvent extends BaseEvent {\n type: EventType.FIRST_VISIT;\n userId?: string;\n userAgent?: string;\n referrer?: string;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * Scroll event\n */\nexport interface IScrollEvent extends BaseEvent {\n type: EventType.SCROLL;\n scrollDepth: number; // in percentage\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n engagement_time_msec?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n ignore_referrer?: boolean;\n page_location?: string;\n page_referrer?: string;\n page_title?: string;\n percent_scrolled?: number;\n}\n\n/**\n * Form start event\n */\nexport interface IFormStartEvent extends BaseEvent {\n type: EventType.FORM_START;\n formId: string;\n formName?: string;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * Form submission event\n */\nexport interface IFormSubmissionEvent extends BaseEvent {\n type: EventType.FORM_SUBMISSION;\n formId: string;\n formName?: string;\n success: boolean;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * User signup event\n */\nexport interface IUserSignupEvent extends BaseEvent {\n type: EventType.USER_SIGNUP;\n userId?: string;\n method?: string;\n success: boolean;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * User login event\n */\nexport interface IUserLoginEvent extends BaseEvent {\n type: EventType.USER_LOGIN;\n userId?: string;\n method?: string;\n success: boolean;\n pagePath: string;\n pageTitle: string;\n timestamp: number;\n customProperties?: Record<string, any>;\n}\n\n/**\n * Button click event\n */\nexport interface IButtonClickEvent extends BaseEvent {\n type: EventType.BUTTON_CLICK;\n buttonId?: string;\n buttonText?: string;\n location: string;\n}\n\n/**\n * View item event for e-commerce tracking\n */\nexport interface IViewItemEvent extends BaseEvent {\n type: EventType.VIEW_ITEM;\n currency: string;\n value: number;\n items: Array<{\n item_id: string;\n item_name: string;\n price: number;\n currency: string;\n }>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n ecomm_pagetype?: string;\n ecomm_prodid?: string;\n ecomm_totalvalue?: number;\n engagement_time_msec?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n gclid?: string;\n ignore_referrer?: boolean;\n medium?: string;\n page_location?: string;\n page_path?: string;\n page_referrer?: string;\n page_title?: string;\n source?: string;\n srsltid?: string;\n term?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * Checkout payment event\n */\nexport interface ICheckoutPaymentEvent extends BaseEvent {\n type: EventType.CHECKOUT_PAYMENT;\n cartValue: number;\n currency: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n }>;\n}\n\n/**\n * Viewed product event after 20 seconds\n */\nexport interface IViewedProductEvent extends BaseEvent {\n type: EventType.VIEWED_PRODUCT;\n productId: string;\n productName: string;\n price: number;\n currency: string;\n viewDuration: number;\n}\n\nexport interface IPCollectionViewEvent extends BaseEvent {\n type: EventType.COLLECTION_VIEW;\n productId: string;\n productName: string;\n price?: number;\n currency?: string;\n category?: string;\n}\n\n/**\n * Add to cart event\n */\nexport interface IAddToCartEvent extends BaseEvent {\n type: EventType.ADD_TO_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity?: number;\n variant?: string;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n ecomm_pagetype?: string;\n ecomm_prodid?: string;\n ecomm_totalvalue?: number;\n value?: number;\n engagement_time_msec?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n ignore_referrer?: boolean;\n page_location?: string;\n page_referrer?: string;\n page_title?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * Remove from cart event\n */\nexport interface IRemoveFromCartEvent extends BaseEvent {\n type: EventType.REMOVE_FROM_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n}\n\n/**\n * Checkout started event\n */\nexport interface ICheckoutStartedEvent extends BaseEvent {\n type: EventType.CHECKOUT_STARTED;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n coupon?: string;\n discount?: number | string;\n}\n\n/**\n * Checkout completed event\n */\nexport interface ICheckoutCompletedEvent extends BaseEvent {\n type: EventType.CHECKOUT_COMPLETED;\n orderId: string;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Cart viewed event\n */\nexport interface ICartViewedEvent extends BaseEvent {\n type: EventType.CART_VIEWED;\n cartId: string;\n products: Array<{\n variantId: string;\n price: number;\n quantity: number;\n }>;\n}\n\n/**\n * Search event\n */\nexport interface ISearchEvent extends BaseEvent {\n type: EventType.SEARCH;\n searchTerm: string;\n content_ids: string[];\n resultsCount?: number;\n}\n\n/**\n * Filter applied event\n */\nexport interface IFilterAppliedEvent extends BaseEvent {\n type: EventType.FILTER_APPLIED;\n filterType: string;\n filterValue: string | number | boolean;\n}\n\n/**\n * Newsletter subscription event\n */\nexport interface INewsletterSubscriptionEvent extends BaseEvent {\n type: EventType.NEWSLETTER_SUBSCRIPTION;\n email: string;\n success: boolean;\n}\n\n/**\n * View content event (for Facebook Pixel ViewContent)\n */\nexport interface IViewContentEvent extends BaseEvent {\n type: EventType.VIEW_CONTENT;\n content_type?: string;\n content_ids?: string[];\n content_name?: string;\n content_category?: string;\n value?: number;\n currency?: string;\n items?: Array<any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n ga_session_id?: string;\n engagement_time_msec?: number;\n session_engaged?: boolean;\n page_title?: string;\n page_location?: string;\n page_referrer?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n}\n\n/**\n * Purchase event (for Facebook Pixel Purchase)\n */\nexport interface IPurchaseEvent extends BaseEvent {\n type: EventType.PURCHASE;\n value: number;\n currency?: string;\n content_type?: string;\n content_ids?: string[];\n num_items?: number;\n contents?: Array<{\n id: string;\n quantity: number;\n item_price?: number;\n }>;\n transaction_id?: string;\n coupon?: string;\n shipping?: number;\n tax?: number;\n items?: Array<any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n ga_session_id?: string;\n engagement_time_msec?: number;\n session_engaged?: boolean;\n page_title?: string;\n page_location?: string;\n page_referrer?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n}\n\n/**\n * View search results event (for GA4)\n */\nexport interface IViewSearchResultsEvent extends BaseEvent {\n type: EventType.VIEW_SEARCH_RESULTS;\n search_term?: string;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n campaign?: string;\n campaign_id?: string;\n content?: string;\n ga_session_id?: string;\n ga_session_number?: number;\n gclid?: string;\n medium?: string;\n page_location?: string;\n page_path?: string;\n page_referrer?: string;\n page_title?: string;\n source?: string;\n srsltid?: string;\n term?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n engagement_time_msec?: number;\n}\n\n/**\n * Order placed event (for GA4)\n */\nexport interface IOrderPlacedEvent extends BaseEvent {\n type: EventType.ORDER_PLACED;\n transaction_id?: string;\n order_id?: string;\n total_amount?: number;\n value: number;\n currency?: string;\n items?: Array<any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n coupon?: string;\n discount?: number;\n engagement_time_msec?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n ignore_referrer?: boolean;\n page_location?: string;\n page_referrer?: string;\n page_title?: string;\n payment_type?: string;\n shipping?: number;\n shipping_name?: string;\n tax?: number;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * Begin checkout event (for GA4)\n */\nexport interface IBeginCheckoutEvent extends BaseEvent {\n type: EventType.BEGIN_CHECKOUT;\n currency?: string;\n value: number;\n coupon?: string;\n items?: Array<any>;\n // GA4 specific parameters\n batch_ordering_id?: string;\n batch_page_id?: string;\n ecomm_pagetype?: string;\n ecomm_prodid?: string;\n ecomm_totalvalue?: number;\n engagement_time_msec?: number;\n ga_session_id?: string;\n ga_session_number?: number;\n ignore_referrer?: boolean;\n page_location?: string;\n page_referrer?: string;\n page_title?: string;\n user_id?: string;\n user_properties?: Record<string, any>;\n session_engaged?: boolean;\n}\n\n/**\n * Custom event for any other tracking needs\n */\nexport interface ICustomEvent extends BaseEvent {\n type: EventType.CUSTOM;\n name: string;\n properties?: Record<string, any>;\n}\n\n/**\n * Add Payment Info event\n */\nexport interface IAddPaymentInfoEvent extends BaseEvent {\n type: EventType.ADD_PAYMENT_INFO;\n cartValue: number;\n currency?: string;\n itemCount: number;\n paymentType?: string;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Item purchased event\n */\nexport interface IItemPurchasedEvent extends BaseEvent {\n type: EventType.ITEM_PURCHASED;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n orderId?: string;\n}\n\n/**\n * Update cart event\n */\nexport interface IUpdateCartEvent extends BaseEvent {\n type: EventType.UPDATE_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n}\n\n/**\n * Customer registered event\n */\nexport interface ICustomerRegisteredEvent extends BaseEvent {\n type: EventType.CUSTOMER_REGISTERED;\n userId: string;\n email?: string;\n phone?: string;\n firstName?: string;\n lastName?: string;\n}\n\n/**\n * Customer logged in event\n */\nexport interface ICustomerLoggedInEvent extends BaseEvent {\n type: EventType.CUSTOMER_LOGGED_IN;\n userId: string;\n email?: string;\n phone?: string;\n method?: string;\n}\n\n/**\n * Shopify checkout updated event\n */\nexport interface IShopifyCheckoutUpdatedEvent extends BaseEvent {\n type: EventType.SHOPIFY_CHECKOUT_UPDATED;\n checkoutId: string;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Shopify abandoned checkout event\n */\nexport interface IShopifyAbandonedCheckoutEvent extends BaseEvent {\n type: EventType.SHOPIFY_ABANDONED_CHECKOUT;\n checkoutId: string;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Shopify order fulfilled event\n */\nexport interface IShopifyOrderFulfilledEvent extends BaseEvent {\n type: EventType.SHOPIFY_ORDER_FULFILLED;\n orderId: string;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Shopify checkout started event\n */\nexport interface IShopifyCheckoutStartedEvent extends BaseEvent {\n type: EventType.SHOPIFY_CHECKOUT_STARTED;\n checkoutId: string;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n variant?: string;\n }>;\n}\n\n/**\n * Shopify add to cart event\n */\nexport interface IShopifyAddToCartEvent extends BaseEvent {\n type: EventType.SHOPIFY_ADD_TO_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n}\n\n/**\n * Shopify remove from cart event\n */\nexport interface IShopifyRemoveFromCartEvent extends BaseEvent {\n type: EventType.SHOPIFY_REMOVED_FROM_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n}\n\n/**\n * Shopify update cart event\n */\nexport interface IShopifyUpdateCartEvent extends BaseEvent {\n type: EventType.SHOPIFY_UPDATE_CART;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n quantity: number;\n variant?: string;\n}\n\n/**\n * Spinform result event\n */\nexport interface ISpinformResultEvent extends BaseEvent {\n type: EventType.SPINFORM_RESULT;\n result?: string;\n}\n\n/**\n * Coupon copied event\n */\nexport interface ICouponCopiedEvent extends BaseEvent {\n type: EventType.COUPON_COPIED;\n couponCode?: string;\n}\n\n/**\n * Started checkout GK event\n */\nexport interface IStartedCheckoutGKEvent extends BaseEvent {\n type: EventType.STARTED_CHECKOUT_GK;\n cartValue?: number;\n currency?: string;\n}\n\n/**\n * Mobile added GK event\n */\nexport interface IMobileAddedGKEvent extends BaseEvent {\n type: EventType.MOBILE_ADDED_GK;\n mobile?: string;\n}\n\n/**\n * Address selected GK event\n */\nexport interface IAddressSelectedGKEvent extends BaseEvent {\n type: EventType.ADDRESS_SELECTED_GK;\n addressId?: string;\n}\n\n/**\n * Address completed GK event\n */\nexport interface IAddressCompletedGKEvent extends BaseEvent {\n type: EventType.ADDRESS_COMPLETED_GK;\n addressId?: string;\n}\n\n/**\n * Payment method selected GK event\n */\nexport interface IPaymentMethodSelectedGKEvent extends BaseEvent {\n type: EventType.PAYMENT_METHOD_SELECTED_GK;\n paymentMethod?: string;\n}\n\n/**\n * Payment completed GK event\n */\nexport interface IPaymentCompletedGKEvent extends BaseEvent {\n type: EventType.PAYMENT_COMPLETED_GK;\n amount?: number;\n currency?: string;\n}\n\n/**\n * Order success event\n */\nexport interface IOrderSuccessEvent extends BaseEvent {\n type: EventType.ORDER_SUCCESS;\n orderId?: string;\n amount?: number;\n currency?: string;\n}\n\n/**\n * Order completed event\n */\nexport interface IOrderCompletedEvent extends BaseEvent {\n type: EventType.ORDER_COMPLETED;\n orderId?: string;\n amount?: number;\n currency?: string;\n}\n\n/**\n * Cart page land event\n */\nexport interface ICartPageLandEvent extends BaseEvent {\n type: EventType.CART_PAGE_LAND;\n event_category: string;\n description: string;\n}\n\n/**\n * Close cart event\n */\nexport interface ICloseCartEvent extends BaseEvent {\n type: EventType.CLOSE_CART;\n event_category: string;\n description: string;\n}\n\n/**\n * Quantity change event\n */\nexport interface IQuantityChangeEvent extends BaseEvent {\n type: EventType.QUANTITY_CHANGE;\n event_category: string;\n description: string;\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n}\n\n/**\n * PIN code added GK event\n */\nexport interface IPinCodeAddedGKEvent extends BaseEvent {\n type: EventType.PIN_CODE_ADDED_GK;\n pinCode?: string;\n}\n\n/**\n * Address added GK event\n */\nexport interface IAddressAddedGKEvent extends BaseEvent {\n type: EventType.ADDRESS_ADDED_GK;\n addressId?: string;\n}\n\n/**\n * KP MP phone number logged in event\n */\nexport interface IKPMPPhoneNumberLoggedInEvent extends BaseEvent {\n type: EventType.KP_MP_PHONE_NUMBER_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP phone number logged in event\n */\nexport interface IKPPhoneNumberLoggedInEvent extends BaseEvent {\n type: EventType.KP_PHONE_NUMBER_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP MP Shopify logged in event\n */\nexport interface IKPMPShopifyLoggedInEvent extends BaseEvent {\n type: EventType.KP_MP_SHOPIFY_LOGGED_IN;\n userId?: string;\n}\n\n/**\n * KP MP successfully logged out event\n */\nexport interface IKPMPSuccessfullyLoggedOutEvent extends BaseEvent {\n type: EventType.KP_MP_SUCCESSFULLY_LOGGED_OUT;\n userId?: string;\n}\n\n/**\n * KP WhatsApp logged in event\n */\nexport interface IKPWhatsAppLoggedInEvent extends BaseEvent {\n type: EventType.KP_WHATSAPP_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP MP Truecaller logged in event\n */\nexport interface IKPMPTruecallerLoggedInEvent extends BaseEvent {\n type: EventType.KP_MP_TRUECALLER_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP MP WhatsApp logged in event\n */\nexport interface IKPMPWhatsAppLoggedInEvent extends BaseEvent {\n type: EventType.KP_MP_WHATSAPP_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP Truecaller logged in event\n */\nexport interface IKPTruecallerLoggedInEvent extends BaseEvent {\n type: EventType.KP_TRUECALLER_LOGGED_IN;\n phone?: string;\n}\n\n/**\n * KP Shopify logged in event\n */\nexport interface IKPShopifyLoggedInEvent extends BaseEvent {\n type: EventType.KP_SHOPIFY_LOGGED_IN;\n userId?: string;\n}\n\n/**\n * KP successfully logged out event\n */\nexport interface IKPSuccessfullyLoggedOutEvent extends BaseEvent {\n type: EventType.KP_SUCCESSFULLY_LOGGED_OUT;\n userId?: string;\n}\n\n/**\n * Pages screens per session event\n */\nexport interface IPagesScreensPerSessionEvent extends BaseEvent {\n type: EventType.PAGES_SCREENS_PER_SESSION;\n currency: string;\n firebase_conversion: boolean;\n ga_session_id: string;\n ga_session_number: number;\n synthetic_bundle: boolean;\n value: number;\n}\n\n/**\n * Started order event\n */\nexport interface IStartedOrderEvent extends BaseEvent {\n type: EventType.STARTED_ORDER;\n cartValue: number;\n currency?: string;\n itemCount: number;\n items: Array<{\n productId: string;\n productName: string;\n price: number;\n quantity: number;\n }>;\n event_category: string;\n description: string;\n}\n\n/**\n * Product view event\n */\nexport interface IProductViewEvent extends BaseEvent {\n type: EventType.PRODUCT_VIEW;\n event_category: string;\n description: string;\n productId: string;\n productName: string;\n price: number;\n currency?: string;\n category?: string;\n}\n\n/**\n * Union type of all possible events\n */\nexport type TEvent =\n | IProductViewEvent\n | IPageViewEvent\n | IButtonClickEvent\n | IFormSubmissionEvent\n | ICartPageLandEvent\n | ICloseCartEvent\n | IQuantityChangeEvent\n | IViewItemEvent\n | IPCollectionViewEvent\n | IAddToCartEvent\n | IRemoveFromCartEvent\n | ICheckoutStartedEvent\n | ICheckoutCompletedEvent\n | ICartViewedEvent\n | ISearchEvent\n | IFilterAppliedEvent\n | INewsletterSubscriptionEvent\n | IUserSignupEvent\n | IUserLoginEvent\n | IViewContentEvent\n | IPurchaseEvent\n | IViewSearchResultsEvent\n | IOrderPlacedEvent\n | IBeginCheckoutEvent\n | ICustomEvent\n | IUserEngagementEvent\n | ISessionStartEvent\n | IFirstVisitEvent\n | IScrollEvent\n | IFormStartEvent\n | IAddPaymentInfoEvent\n | IItemPurchasedEvent\n | IUpdateCartEvent\n | ICustomerRegisteredEvent\n | ICustomerLoggedInEvent\n | IShopifyCheckoutUpdatedEvent\n | IShopifyAbandonedCheckoutEvent\n | IShopifyOrderFulfilledEvent\n | IShopifyCheckoutStartedEvent\n | IShopifyAddToCartEvent\n | IShopifyRemoveFromCartEvent\n | IShopifyUpdateCartEvent\n | ISpinformResultEvent\n | ICouponCopiedEvent\n | IStartedCheckoutGKEvent\n | IMobileAddedGKEvent\n | IAddressSelectedGKEvent\n | IAddressCompletedGKEvent\n | IPaymentMethodSelectedGKEvent\n | IPaymentCompletedGKEvent\n | IOrderSuccessEvent\n | IOrderCompletedEvent\n | IPinCodeAddedGKEvent\n | IAddressAddedGKEvent\n | IKPMPPhoneNumberLoggedInEvent\n | IKPPhoneNumberLoggedInEvent\n | IKPMPShopifyLoggedInEvent\n | IKPMPSuccessfullyLoggedOutEvent\n | IKPWhatsAppLoggedInEvent\n | IKPMPTruecallerLoggedInEvent\n | IKPMPWhatsAppLoggedInEvent\n | IKPTruecallerLoggedInEvent\n | IKPShopifyLoggedInEvent\n | IKPSuccessfullyLoggedOutEvent\n | IPagesScreensPerSessionEvent\n | IViewedProductEvent\n | ICheckoutPaymentEvent\n | IStartedOrderEvent;\n"],"mappings":";;;AAIO,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,eAAY;AACZ,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,+BAA4B;AAC5B,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,cAAW;AACX,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,oBAAiB;AAGjB,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,wBAAqB;AACrB,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,gCAA6B;AAC7B,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,+BAA4B;AAC5B,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,yBAAsB;AACtB,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,gCAA6B;AAC7B,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,qBAAkB;AAClB,EAAAA,WAAA,uBAAoB;AACpB,EAAAA,WAAA,sBAAmB;AACnB,EAAAA,WAAA,kCAA+B;AAC/B,EAAAA,WAAA,+BAA4B;AAC5B,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,mCAAgC;AAChC,EAAAA,WAAA,2BAAwB;AACxB,EAAAA,WAAA,gCAA6B;AAC7B,EAAAA,WAAA,8BAA2B;AAC3B,EAAAA,WAAA,6BAA0B;AAC1B,EAAAA,WAAA,0BAAuB;AACvB,EAAAA,WAAA,gCAA6B;AAtEnB,SAAAA;AAAA,GAAA;","names":["EventType"]}