@philcrp/analytics 1.6.4 → 1.6.5
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.
- package/README.md +664 -6
- package/dist/global-CLXWNSdY.d.mts +587 -0
- package/dist/global-CLXWNSdY.d.ts +587 -0
- package/dist/index.d.mts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +983 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +939 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react/index.d.mts +168 -0
- package/dist/react/index.d.ts +168 -0
- package/dist/react/index.js +269 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +233 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/server.d.mts +16 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.js +766 -0
- package/dist/server.js.map +1 -0
- package/dist/server.mjs +729 -0
- package/dist/server.mjs.map +1 -0
- package/package.json +8 -74
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/base.ts","../src/manager.ts","../src/providers/ga4.ts","../src/providers/posthog.ts","../src/providers/xads.ts","../src/config.ts","../src/global.ts"],"sourcesContent":["// ====== Lobe Analytics Exports ======\n\n// Core Classes\nexport { BaseAnalytics } from './base';\nexport { AnalyticsManager } from './manager';\n\n// Providers\nexport { GoogleAnalyticsProvider } from './providers/ga4';\nexport { PostHogAnalyticsProvider } from './providers/posthog';\nexport { XAdsAnalyticsProvider } from './providers/xads';\n// Note: PostHogNodeAnalyticsProvider is available in '@lobehub/analytics/server'\n\n// Configuration\nexport { createAnalytics } from './config';\n\n// Global Instance Management\nexport {\n clearGlobalAnalytics,\n createSingletonAnalytics,\n getGlobalAnalytics,\n getGlobalAnalyticsNames,\n getGlobalAnalyticsOptional,\n getSingletonAnalytics,\n getSingletonAnalyticsOptional,\n hasGlobalAnalytics,\n hasSingletonAnalytics,\n removeGlobalAnalytics,\n resetSingletonAnalytics,\n setGlobalAnalytics,\n} from './global';\n\n// Type Definitions\nexport type {\n AnalyticsConfig,\n AnalyticsEvent,\n EventContext,\n GoogleAnalyticsProviderConfig,\n PostHogNodeProviderAnalyticsConfig,\n PostHogProviderAnalyticsConfig,\n PredefinedEvents,\n ProviderConfig,\n UmamiProviderAnalyticsConfig,\n XAdsEventIdMap,\n XAdsProviderAnalyticsConfig,\n} from './types';\n\n// Default export\nexport { AnalyticsManager as default } from './manager';\n","import type { AnalyticsEvent } from './types';\n\n/**\n * Base abstract class for analytics providers\n * All analytics implementations should extend this class\n */\nexport abstract class BaseAnalytics {\n protected readonly debug: boolean;\n protected readonly enabled: boolean;\n protected readonly business: string;\n\n constructor(config: { business: string; debug?: boolean; enabled?: boolean }) {\n this.debug = config.debug ?? false;\n this.enabled = config.enabled ?? true;\n this.business = config.business;\n }\n\n /**\n * Initialize the analytics provider\n */\n abstract initialize(): Promise<void>;\n\n /**\n * Track a single event\n */\n abstract track(event: AnalyticsEvent): Promise<void>;\n\n /**\n * Identify a user\n */\n abstract identify(userId: string, properties?: Record<string, any>): Promise<void>;\n\n /**\n * Track page view\n */\n abstract trackPageView(page: string, properties?: Record<string, any>): Promise<void>;\n\n /**\n * Reset user identity\n */\n abstract reset(): Promise<void>;\n\n /**\n * Get provider name for logging\n */\n abstract getProviderName(): string;\n\n /**\n * Check if provider is enabled\n */\n protected isEnabled(): boolean {\n if (!this.enabled) {\n this.log('Provider is disabled');\n return false;\n }\n return true;\n }\n\n /**\n * Validate event data\n */\n protected validateEvent(event: AnalyticsEvent): boolean {\n if (!event.name) {\n this.logError('Event name is required');\n return false;\n }\n return true;\n }\n\n /**\n * Log debug message\n */\n protected log(message: string, data?: any): void {\n if (this.debug) {\n console.log(`[${this.getProviderName()}] ${message}`, data || '');\n }\n }\n\n /**\n * Log error message\n */\n protected logError(message: string, error?: any): void {\n console.error(`[${this.getProviderName()}] ${message}`, error || '');\n }\n\n /**\n * 丰富属性数据,自动处理 spm 前缀\n * 确保无论通过哪种方式调用都会添加 business 前缀\n */\n protected enrichProperties(properties?: Record<string, any>): Record<string, any> {\n const enriched = { ...properties };\n\n // Add business field for all events\n enriched.business = this.business;\n\n if (enriched.spm && typeof enriched.spm === 'string' && enriched.spm.trim()) {\n // 检查是否已经是正确的格式,避免重复处理\n if (enriched.spm !== this.business && !enriched.spm.startsWith(`${this.business}.`)) {\n enriched.spm = `${this.business}.${enriched.spm}`;\n }\n } else {\n // 用户没有提供 spm 或 spm 为空,使用 business 作为默认值\n enriched.spm = this.business;\n }\n\n return enriched;\n }\n}\n","/* eslint-disable no-dupe-class-members */\nimport { BaseAnalytics } from './base';\nimport type { AnalyticsEvent, EventContext, PredefinedEvents, ProviderTypeMap } from './types';\n\n/**\n * Analytics 管理器\n * 统一管理多个分析工具提供商\n */\nexport class AnalyticsManager {\n private readonly providers = new Map<string, BaseAnalytics>();\n private readonly business: string;\n private globalContext: EventContext = {};\n private initialized = false;\n private readonly debug: boolean;\n\n constructor(business: string, debug = false) {\n this.business = business;\n this.debug = debug;\n }\n\n /**\n * 注册分析工具提供商\n */\n registerProvider(name: string, provider: BaseAnalytics): this {\n this.providers.set(name, provider);\n this.log(`Registered provider: ${name}`);\n return this;\n }\n\n /**\n * 移除分析工具提供商\n */\n unregisterProvider(name: string): this {\n this.providers.delete(name);\n this.log(`Unregistered provider: ${name}`);\n return this;\n }\n\n /**\n * 获取指定的提供商\n */\n getProvider<T extends keyof ProviderTypeMap>(name: T): ProviderTypeMap[T] | undefined;\n getProvider(name: string): BaseAnalytics | undefined;\n getProvider(name: string): any {\n return this.providers.get(name);\n }\n\n /**\n * 获取所有提供商\n */\n getAllProviders(): BaseAnalytics[] {\n return Array.from(this.providers.values());\n }\n\n /**\n * 初始化所有提供商\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n this.log('Already initialized');\n return;\n }\n\n const results = await this.executeOnAllProviders('initialize');\n this.initialized = true;\n\n this.log(`Initialized ${results.success.length}/${this.providers.size} providers`);\n if (results.errors.length > 0) {\n console.warn(`[AnalyticsManager] ${results.errors.length} providers failed to initialize`);\n }\n }\n\n /**\n * 追踪事件到所有提供商\n */\n async track(event: AnalyticsEvent): Promise<void> {\n if (!this.ensureInitialized()) return;\n\n const enrichedEvent = this.enrichEvent(event);\n await this.executeOnAllProviders('track', enrichedEvent);\n }\n\n /**\n * 类型安全的事件追踪\n */\n async trackEvent<K extends keyof PredefinedEvents>(\n eventName: K,\n properties: PredefinedEvents[K],\n ): Promise<void> {\n await this.track({\n name: eventName,\n properties: properties as Record<string, any>,\n });\n }\n\n /**\n * 识别用户\n */\n async identify(userId: string, properties?: Record<string, any>): Promise<void> {\n if (!this.ensureInitialized()) return;\n const mergedProperties = { ...this.globalContext, ...properties };\n await this.executeOnAllProviders('identify', userId, mergedProperties);\n }\n\n /**\n * 追踪页面浏览\n */\n async trackPageView(page: string, properties?: Record<string, any>): Promise<void> {\n if (!this.ensureInitialized()) return;\n const mergedProperties = { ...this.globalContext, ...properties };\n await this.executeOnAllProviders('trackPageView', page, mergedProperties);\n }\n\n /**\n * 重置用户身份\n */\n async reset(): Promise<void> {\n if (!this.ensureInitialized()) return;\n await this.executeOnAllProviders('reset');\n }\n\n /**\n * 设置全局上下文\n */\n setGlobalContext(context: EventContext): this {\n this.globalContext = { ...this.globalContext, ...context };\n this.log('Updated global context', this.globalContext);\n return this;\n }\n\n /**\n * 获取全局上下文\n */\n getGlobalContext(): EventContext {\n return { ...this.globalContext };\n }\n\n /**\n * 获取管理器状态\n */\n getStatus(): { initialized: boolean; providersCount: number } {\n return {\n initialized: this.initialized,\n providersCount: this.providers.size,\n };\n }\n\n /**\n * 检查是否已初始化\n */\n private ensureInitialized(): boolean {\n if (!this.initialized) {\n console.warn('[AnalyticsManager] Not initialized. Call initialize() first.');\n return false;\n }\n return true;\n }\n\n /**\n * 在所有提供商上执行操作\n */\n private async executeOnAllProviders(\n method: keyof BaseAnalytics,\n ...args: any[]\n ): Promise<{ errors: Array<{ error: any; provider: string }>; success: string[] }> {\n const results: { errors: Array<{ error: any; provider: string }>; success: string[] } = {\n errors: [],\n success: [],\n };\n\n const promises = Array.from(this.providers.entries()).map(async ([name, provider]) => {\n try {\n await (provider[method] as any)(...args);\n results.success.push(name);\n } catch (error) {\n results.errors.push({ error, provider: name });\n console.error(\n `[AnalyticsManager] ${method} failed for ${provider.getProviderName()}:`,\n error,\n );\n }\n });\n\n await Promise.allSettled(promises);\n return results;\n }\n\n /**\n * 丰富事件数据\n */\n private enrichEvent(event: AnalyticsEvent): AnalyticsEvent {\n return {\n ...event,\n properties: {\n ...this.globalContext,\n ...event.properties,\n },\n timestamp: event.timestamp || new Date(),\n };\n }\n\n /**\n * 记录日志\n */\n private log(message: string, data?: any): void {\n if (this.debug) {\n console.log(`[AnalyticsManager] ${message}`, data || '');\n }\n }\n}\n","/**\n * Google Analytics 4 Provider\n * Uses gtag.js library for client-side tracking\n */\nimport { BaseAnalytics } from '@/base';\nimport type { AnalyticsEvent, GoogleAnalyticsProviderConfig } from '@/types';\n\n/**\n * Google Analytics 4 Analytics Provider\n * Uses gtag.js for tracking events, page views, and user identification\n */\nexport class GoogleAnalyticsProvider extends BaseAnalytics {\n private readonly config: GoogleAnalyticsProviderConfig;\n private initialized = false;\n\n constructor(config: GoogleAnalyticsProviderConfig, business: string) {\n super({ business, debug: config.debug, enabled: config.enabled });\n this.config = config;\n }\n\n getProviderName(): string {\n return 'Google Analytics 4';\n }\n\n async initialize(): Promise<void> {\n if (!this.isEnabled() || this.initialized) {\n return;\n }\n\n try {\n // Ensure gtag function is available\n if (typeof window === 'undefined') {\n this.logError('GA4 provider requires browser environment');\n return;\n }\n\n // Initialize dataLayer if not exists\n (window as any).dataLayer = (window as any).dataLayer || [];\n const gtag =\n (window as any).gtag ||\n function () {\n (window as any).dataLayer.push(arguments);\n };\n (window as any).gtag = gtag;\n\n // Stub gtag is always assigned above, so `typeof gtag === 'function'` cannot be used to\n // decide whether to load gtag.js — that branch was never taken. Inject the script when the\n // tag is missing from the document (standard GA snippet queues until the script loads).\n const existingScript = document.querySelector(\n `script[src*=\"gtag/js\"], script[id*=\"ga\"], script[id*=\"gtag\"]`,\n );\n\n if (!existingScript) {\n const script = document.createElement('script');\n script.async = true;\n script.src = `https://www.googletagmanager.com/gtag/js?id=${this.config.measurementId}`;\n document.head.append(script);\n }\n\n // Initialize gtag\n gtag('js', new Date());\n\n // Configure GA4 with user config and our defaults\n const configOptions = {\n // User's gtag config options\n ...this.config.gtagConfig,\n // Our internal config (these override user config for consistency)\n debug_mode: this.debug || this.config.gtagConfig?.debug_mode,\n };\n\n gtag('config', this.config.measurementId, configOptions);\n\n this.initialized = true;\n this.log('Google Analytics 4 initialized successfully');\n this.log(`Measurement ID: ${this.config.measurementId}`);\n this.log(`Business context will be added to all events: ${this.business}`);\n } catch (error) {\n this.logError('Failed to initialize Google Analytics 4', error);\n throw error;\n }\n }\n\n async track(event: AnalyticsEvent): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.validateEvent(event)) {\n return;\n }\n\n try {\n const gtag = (window as any).gtag;\n if (!gtag) {\n this.logError('gtag function not available');\n return;\n }\n\n const enrichedProperties = this.enrichProperties(event.properties);\n\n // Send event with enriched properties\n const eventParams = {\n ...enrichedProperties,\n // Add user_id if provided in the event\n ...(event.userId && { user_id: event.userId }),\n };\n\n gtag('event', event.name, eventParams);\n\n this.log(`Tracked event: ${event.name}`, { ...event, properties: enrichedProperties });\n } catch (error) {\n this.logError(`Failed to track event: ${event.name}`, error);\n }\n }\n\n async identify(userId: string, properties?: Record<string, any>): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n const gtag = (window as any).gtag;\n if (!gtag) {\n this.logError('gtag function not available');\n return;\n }\n\n // 1. Set user_id in config (affects all subsequent events)\n gtag('config', this.config.measurementId, {\n user_id: userId,\n });\n\n // 2. Set user properties if provided\n if (properties && Object.keys(properties).length > 0) {\n const enrichedProperties = this.enrichProperties(properties);\n gtag('set', {\n user_properties: enrichedProperties,\n });\n }\n\n // 3. Track login event (GA4 recommended practice)\n gtag('event', 'login', {\n user_id: userId,\n ...this.enrichProperties(),\n });\n\n this.log(`Identified user: ${userId}`, properties);\n } catch (error) {\n this.logError(`Failed to identify user: ${userId}`, error);\n }\n }\n\n async trackPageView(page: string, properties?: Record<string, any>): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(properties);\n\n // Use the track method to send page_view event\n await this.track({\n name: 'page_view',\n properties: {\n page_location: page,\n page_title: page,\n ...enrichedProperties,\n },\n });\n\n this.log(`Tracked page view: ${page}`, enrichedProperties);\n } catch (error) {\n this.logError(`Failed to track page view: ${page}`, error);\n }\n }\n\n async reset(): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n const gtag = (window as any).gtag;\n if (!gtag) {\n this.logError('gtag function not available');\n return;\n }\n\n // 1. Clear user_id (set to null, not string \"null\")\n gtag('config', this.config.measurementId, {\n user_id: null,\n });\n\n // 2. Clear user properties\n gtag('set', {\n user_properties: {},\n });\n\n // 3. Track logout event\n gtag('event', 'logout', this.enrichProperties());\n\n this.log('Reset user identity and tracked logout');\n } catch (error) {\n this.logError('Failed to reset user identity', error);\n }\n }\n\n /**\n * Check if feature flag is enabled\n * Note: GA4 doesn't have built-in feature flags like PostHog,\n * so this always returns false\n */\n isFeatureEnabled(flag: string): boolean {\n this.log(`Feature flags not supported in GA4. Flag \"${flag}\" returns false`);\n return false;\n }\n\n /**\n * Get the native gtag function for direct access to GA4 APIs\n *\n * Note: When using the native gtag function directly, events will NOT automatically\n * include the business and spm properties. You need to add them manually if desired.\n *\n * @returns gtag function or null if not initialized\n *\n * @example\n * ```typescript\n * const analytics = createAnalytics({ business: 'myapp', ... });\n * const ga4Provider = analytics.getProvider('ga4');\n * const gtag = ga4Provider.getNativeInstance();\n *\n * // Manual business context addition required for direct calls\n * gtag?.('event', 'custom_event', {\n * custom: 'data',\n * business: 'myapp',\n * spm: 'myapp.custom_section'\n * });\n * ```\n */\n getNativeInstance(): ((...args: any[]) => void) | null {\n if (!this.isEnabled() || !this.initialized) {\n this.log('Cannot get native instance: provider not enabled or not initialized');\n return null;\n }\n\n const gtag = (window as any).gtag;\n if (!gtag) {\n this.log('gtag function not available');\n return null;\n }\n\n return gtag;\n }\n\n /**\n * Get current measurement ID\n */\n getMeasurementId(): string {\n return this.config.measurementId;\n }\n\n /**\n * Get current business context\n */\n getCurrentBusiness(): string {\n return this.business;\n }\n}\n","import { BeforeSendFn, CaptureResult, posthog } from 'posthog-js';\n\nimport { BaseAnalytics } from '@/base';\nimport type { AnalyticsEvent, PostHogProviderAnalyticsConfig } from '@/types';\n\n/**\n * PostHog Analytics Provider\n * Uses official posthog-js SDK\n */\nexport class PostHogAnalyticsProvider extends BaseAnalytics {\n private readonly config: PostHogProviderAnalyticsConfig;\n private initialized = false;\n\n constructor(config: PostHogProviderAnalyticsConfig, business: string) {\n super({ business, debug: config.debug, enabled: config.enabled });\n this.config = config;\n }\n\n getProviderName(): string {\n return 'PostHog';\n }\n\n async initialize(): Promise<void> {\n if (!this.isEnabled() || this.initialized) {\n return;\n }\n\n try {\n // Extract provider-specific properties and prepare posthog config\n const { key, host, ...posthogConfig } = this.config;\n\n // Build init config: start with user's posthog config, then apply our defaults/overrides\n const initConfig = {\n ...posthogConfig, // User's posthog-js config options\n api_host: host || posthogConfig.api_host || 'https://app.posthog.com',\n // Use before_send to dynamically add business context to all events\n before_send: this.createBeforeSendHandler(posthogConfig.before_send),\n debug: this.debug,\n loaded: () => this.log('PostHog loaded and ready'),\n };\n\n posthog.init(key, initConfig);\n\n this.initialized = true;\n this.log('PostHog initialized successfully');\n this.log(`Using before_send to add business context: ${this.business}`);\n } catch (error) {\n this.logError('Failed to initialize PostHog', error);\n throw error;\n }\n }\n\n async track(event: AnalyticsEvent): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.validateEvent(event)) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(event.properties);\n\n posthog.capture(event.name, {\n ...enrichedProperties,\n ...(event.userId && { distinct_id: event.userId }),\n });\n\n this.log(`Tracked event: ${event.name}`, { ...event, properties: enrichedProperties });\n } catch (error) {\n this.logError(`Failed to track event: ${event.name}`, error);\n }\n }\n\n async identify(userId: string, properties?: Record<string, any>): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(properties);\n posthog.identify(userId, enrichedProperties);\n this.log(`Identified user: ${userId}`, enrichedProperties);\n } catch (error) {\n this.logError(`Failed to identify user: ${userId}`, error);\n }\n }\n\n async trackPageView(page: string, properties?: Record<string, any>): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(properties);\n await this.track({\n name: '$pageview',\n properties: { page, ...enrichedProperties },\n });\n\n this.log(`Tracked page view: ${page}`, enrichedProperties);\n } catch (error) {\n this.logError(`Failed to track page view: ${page}`, error);\n }\n }\n\n async reset(): Promise<void> {\n if (!this.isEnabled() || !this.initialized) {\n return;\n }\n\n try {\n posthog.reset();\n this.log('Reset user identity');\n } catch (error) {\n this.logError('Failed to reset user identity', error);\n }\n }\n\n /**\n * Check if feature flag is enabled\n */\n isFeatureEnabled(flag: string): boolean {\n if (!this.initialized) {\n return false;\n }\n\n try {\n return Boolean(posthog.isFeatureEnabled(flag));\n } catch (error) {\n this.logError(`Failed to check feature flag: ${flag}`, error);\n return false;\n }\n }\n\n /**\n * Get the native PostHog instance for direct access to PostHog APIs\n *\n * Note: When using the native instance directly, events will still include\n * the business spm prefix because it's registered as a global property.\n *\n * @returns PostHog native instance or null if not initialized\n *\n * @example\n * ```typescript\n * const analytics = createAnalytics({ business: 'myapp', ... });\n * const posthogProvider = analytics.getProvider('posthog');\n * const posthog = posthogProvider.getNativeInstance();\n *\n * // These calls will automatically include spm: 'myapp'\n * posthog?.capture('custom_event', { custom: 'data' });\n * posthog?.isFeatureEnabled('new_feature');\n * posthog?.group('company', 'company_123');\n * ```\n */\n getNativeInstance(): typeof posthog | null {\n if (!this.isEnabled() || !this.initialized) {\n this.log('Cannot get native instance: provider not enabled or not initialized');\n return null;\n }\n\n return posthog;\n }\n\n /**\n * Create a before_send handler that adds business context to all events\n * This ensures both wrapper calls and direct PostHog calls include business information\n */\n private createBeforeSendHandler(userBeforeSend?: BeforeSendFn | BeforeSendFn[]): BeforeSendFn {\n return (event: CaptureResult | null): CaptureResult | null => {\n // Return null if event is null\n if (!event) {\n return null;\n }\n\n // Record whether user originally had spm field\n const originallyHadSpm = event.properties?.spm !== undefined;\n\n // Call user's before_send first if provided\n let processedEvent: CaptureResult | null = event;\n if (userBeforeSend) {\n if (Array.isArray(userBeforeSend)) {\n // Handle array of before_send functions\n for (const fn of userBeforeSend) {\n processedEvent = fn(processedEvent);\n if (!processedEvent) {\n return null; // User function filtered out the event\n }\n }\n } else if (typeof userBeforeSend === 'function') {\n processedEvent = userBeforeSend(processedEvent);\n if (!processedEvent) {\n return null; // User function filtered out the event\n }\n }\n }\n\n // Ensure properties object exists\n if (!processedEvent.properties) {\n processedEvent.properties = {};\n }\n\n // Always ensure business field is present (final override to prevent user deletion)\n processedEvent.properties.business = this.business;\n\n // Set spm only if:\n // 1. User didn't originally have spm AND\n // 2. User's before_send didn't add spm OR added empty spm\n const currentSpm = processedEvent.properties.spm;\n const shouldSetDefaultSpm =\n !originallyHadSpm &&\n (!currentSpm || (typeof currentSpm === 'string' && !currentSpm.trim()));\n\n if (shouldSetDefaultSpm) {\n processedEvent.properties.spm = this.business;\n }\n\n return processedEvent;\n };\n }\n\n /**\n * Update the business context dynamically\n * This will affect all future events\n */\n updateBusiness(newBusiness: string): void {\n if (!this.isEnabled() || !this.initialized) {\n this.log('Cannot update business: provider not enabled or not initialized');\n return;\n }\n\n // Note: We can't change the readonly business field, but we could store it in a mutable field\n // For now, log that this feature would need architectural changes\n this.log(`Business update requested: ${newBusiness} (current: ${this.business})`);\n this.log('Note: Dynamic business updates require storing business in a mutable field');\n }\n\n /**\n * Get current business context\n */\n getCurrentBusiness(): string {\n return this.business;\n }\n}\n","import { BaseAnalytics } from '@/base';\nimport type { AnalyticsEvent, XAdsProviderAnalyticsConfig } from '@/types';\n\nconst X_ADS_SCRIPT_SELECTOR = 'script[src=\"https://static.ads-twitter.com/uwt.js\"]';\nconst X_ADS_SCRIPT_SRC = 'https://static.ads-twitter.com/uwt.js';\n\ninterface XAdsContentItem {\n content_id?: string;\n content_name?: string;\n content_price?: number;\n num_items?: number;\n}\n\ninterface XAdsEventParameters {\n contents?: XAdsContentItem[];\n conversion_id?: string;\n currency?: string;\n value?: number;\n}\n\ninterface XAdsFunction {\n (...args: unknown[]): void;\n exe?: (...args: unknown[]) => void;\n queue?: unknown[][];\n version?: string;\n}\n\ninterface XAdsGlobalState {\n configuredPixelIds: Set<string>;\n scriptRequested: boolean;\n}\n\ndeclare global {\n interface Window {\n __LOBE_ANALYTICS_X_ADS_STATE__?: XAdsGlobalState;\n twq?: XAdsFunction;\n }\n}\n\n/**\n * X Ads Analytics Provider\n * Uses X Pixel (twq + uwt.js) for client-side conversion tracking\n */\nexport class XAdsAnalyticsProvider extends BaseAnalytics {\n private readonly config: XAdsProviderAnalyticsConfig;\n private initialized = false;\n\n constructor(config: XAdsProviderAnalyticsConfig, business: string) {\n super({ business, debug: config.debug, enabled: config.enabled });\n this.config = config;\n }\n\n getProviderName(): string {\n return 'X Ads';\n }\n\n async initialize(): Promise<void> {\n if (!this.isEnabled() || this.initialized) {\n return;\n }\n\n if (typeof window === 'undefined') {\n this.logError('X Ads provider requires browser environment');\n return;\n }\n\n if (!this.config.pixelId) {\n this.logError('X Ads pixelId is required');\n return;\n }\n\n try {\n const twq = this.ensureTwq();\n const state = this.getGlobalState();\n\n this.ensureScript(state);\n\n if (!state.configuredPixelIds.has(this.config.pixelId)) {\n twq('config', this.config.pixelId);\n state.configuredPixelIds.add(this.config.pixelId);\n }\n\n this.initialized = true;\n this.log('X Ads initialized successfully');\n this.log(`Pixel ID: ${this.config.pixelId}`);\n } catch (error) {\n this.logError('Failed to initialize X Ads', error);\n throw error;\n }\n }\n\n async track(event: AnalyticsEvent): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.validateEvent(event)) {\n return;\n }\n\n const eventId = this.getEventId(event.name);\n if (!eventId) {\n this.log(`Skipping event: ${event.name} is not configured for X Ads`);\n return;\n }\n\n const twq = window.twq;\n if (!twq) {\n this.logError('twq function not available');\n return;\n }\n\n try {\n const eventParams = this.getEventParameters(event);\n\n if (eventParams) {\n twq('event', eventId, eventParams);\n } else {\n twq('event', eventId);\n }\n\n this.log(`Tracked event: ${event.name}`, {\n event: event.name,\n eventId,\n ...eventParams,\n });\n } catch (error) {\n this.logError(`Failed to track event: ${event.name}`, error);\n }\n }\n\n async identify(): Promise<void> {\n this.log('Identify is not supported in X Ads provider');\n }\n\n async trackPageView(): Promise<void> {\n this.log('Page views are handled by the X Pixel base code');\n }\n\n async reset(): Promise<void> {\n this.log('Reset is not supported in X Ads provider');\n }\n\n private ensureScript(state: XAdsGlobalState) {\n if (state.scriptRequested || document.querySelector(X_ADS_SCRIPT_SELECTOR)) {\n state.scriptRequested = true;\n return;\n }\n\n const script = document.createElement('script');\n script.async = true;\n script.src = X_ADS_SCRIPT_SRC;\n document.head.append(script);\n\n state.scriptRequested = true;\n }\n\n private ensureTwq(): XAdsFunction {\n if (window.twq) {\n return window.twq;\n }\n\n const twq: XAdsFunction = (...args: unknown[]) => {\n if (twq.exe) {\n twq.exe(...args);\n return;\n }\n\n const queue = twq.queue || [];\n queue.push(args);\n twq.queue = queue;\n };\n\n twq.version = '1.1';\n twq.queue = [];\n\n window.twq = twq;\n\n return twq;\n }\n\n private getGlobalState(): XAdsGlobalState {\n if (!window.__LOBE_ANALYTICS_X_ADS_STATE__) {\n window.__LOBE_ANALYTICS_X_ADS_STATE__ = {\n configuredPixelIds: new Set<string>(),\n scriptRequested: false,\n };\n }\n\n return window.__LOBE_ANALYTICS_X_ADS_STATE__;\n }\n\n private getEventId(eventName: string): string | undefined {\n if (eventName === 'purchase') {\n return this.config.purchaseEventId ?? this.config.eventIds?.[eventName];\n }\n\n return this.config.eventIds?.[eventName];\n }\n\n private getEventParameters(event: AnalyticsEvent): XAdsEventParameters | undefined {\n if (event.name === 'purchase') {\n return this.mapPurchaseEventParameters(event.properties);\n }\n\n return undefined;\n }\n\n private mapPurchaseEventParameters(properties?: Record<string, unknown>): XAdsEventParameters {\n const eventParams: XAdsEventParameters = {};\n\n const currency = properties?.currency;\n if (typeof currency === 'string' && currency.trim()) {\n eventParams.currency = currency.trim().toUpperCase();\n }\n\n const value = this.toFiniteNumber(properties?.value);\n if (value !== undefined) {\n eventParams.value = value;\n }\n\n const transactionId = properties?.transaction_id;\n if (typeof transactionId === 'string' || typeof transactionId === 'number') {\n eventParams.conversion_id = String(transactionId);\n }\n\n const contents = this.mapContents(properties?.items);\n if (contents.length > 0) {\n eventParams.contents = contents;\n }\n\n return eventParams;\n }\n\n private mapContents(items: unknown): XAdsContentItem[] {\n if (!Array.isArray(items)) {\n return [];\n }\n\n const contents = items\n .map((item) => {\n if (!item || typeof item !== 'object') {\n return null;\n }\n\n const content = item as Record<string, unknown>;\n const contentItem: XAdsContentItem = {};\n const contentPrice = this.toFiniteNumber(content.price);\n const numItems = this.toFiniteNumber(content.quantity);\n\n if (typeof content.item_id === 'string' && content.item_id.trim()) {\n contentItem.content_id = content.item_id;\n }\n\n if (typeof content.item_name === 'string' && content.item_name.trim()) {\n contentItem.content_name = content.item_name;\n }\n\n if (contentPrice !== undefined) {\n contentItem.content_price = contentPrice;\n }\n\n if (numItems !== undefined) {\n contentItem.num_items = numItems;\n }\n\n return Object.keys(contentItem).length > 0 ? contentItem : null;\n })\n .filter((content): content is XAdsContentItem => content !== null);\n\n return contents;\n }\n\n private toFiniteNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n\n return undefined;\n }\n}\n","import { AnalyticsManager } from './manager';\nimport { GoogleAnalyticsProvider } from './providers/ga4';\nimport { PostHogAnalyticsProvider } from './providers/posthog';\nimport { XAdsAnalyticsProvider } from './providers/xads';\nimport type { AnalyticsConfig } from './types';\n\n/**\n * Create a configured Analytics manager with providers\n *\n * @param config Analytics configuration\n * @returns Configured AnalyticsManager instance\n *\n * @example\n * ```typescript\n * const analytics = createAnalytics({\n * business: 'myapp',\n * debug: true,\n * providers: {\n * posthog: {\n * enabled: true,\n * key: 'phc_your_key',\n * host: 'https://app.posthog.com',\n * },\n * ga4: {\n * enabled: true,\n * measurementId: 'G-XXXXXXXXXX',\n * gtagConfig: {\n * debug_mode: true,\n * },\n * },\n * },\n * });\n *\n * await analytics.initialize();\n * ```\n */\nexport function createAnalytics(config: AnalyticsConfig): AnalyticsManager {\n const manager = new AnalyticsManager(config.business, config.debug);\n\n // Register PostHog if enabled\n if (config.providers.posthog?.enabled) {\n const provider = new PostHogAnalyticsProvider(config.providers.posthog, config.business);\n manager.registerProvider('posthog', provider);\n }\n\n // Register Google Analytics 4 if enabled\n if (config.providers.ga4?.enabled) {\n const provider = new GoogleAnalyticsProvider(config.providers.ga4, config.business);\n manager.registerProvider('ga4', provider);\n }\n\n // Register X Ads if enabled\n if (config.providers.xAds?.enabled) {\n const provider = new XAdsAnalyticsProvider(config.providers.xAds, config.business);\n manager.registerProvider('xAds', provider);\n }\n\n // Note: posthogNode provider is not available in the client entry point\n // Use '@lobehub/analytics/server' for server-side analytics\n if (config.providers.posthogNode?.enabled) {\n console.warn(\n 'PostHog Node.js provider is not available in the client entry point. ' +\n 'Please use \"@lobehub/analytics/server\" for server-side analytics.',\n );\n }\n\n // Add more providers as they are implemented\n // if (config.providers.umami?.enabled) {\n // const provider = new UmamiAnalytics(config.providers.umami);\n // manager.registerProvider('umami', provider);\n // }\n\n return manager;\n}\n","/**\n * Global Analytics Instance Manager\n *\n * 提供全局实例管理功能,支持:\n * 1. 全局实例注册和获取\n * 2. 单例模式\n * 3. 命名空间支持\n *\n * 使用 globalThis 确保跨模块实例的状态一致性\n */\nimport { createAnalytics } from './config';\nimport type { AnalyticsManager } from './manager';\nimport type { AnalyticsConfig } from './types';\n\n/**\n * 全局状态键名,确保唯一性\n */\nconst GLOBAL_STATE_KEY = '__LOBE_ANALYTICS_GLOBAL_STATE__';\n\n/**\n * 扩展 globalThis 类型\n */\ndeclare global {\n // eslint-disable-next-line no-var\n var __LOBE_ANALYTICS_GLOBAL_STATE__: GlobalAnalyticsState | undefined;\n}\n\n/**\n * 全局状态接口\n */\ninterface GlobalAnalyticsState {\n instances: Map<string, AnalyticsManager>;\n singletonConfig: AnalyticsConfig | null;\n singletonInstance: AnalyticsManager | null;\n}\n\n/**\n * 获取全局状态,确保跨模块实例的一致性\n */\nfunction getGlobalState(): GlobalAnalyticsState {\n if (!globalThis[GLOBAL_STATE_KEY]) {\n globalThis[GLOBAL_STATE_KEY] = {\n instances: new Map<string, AnalyticsManager>(),\n singletonConfig: null,\n singletonInstance: null,\n };\n }\n return globalThis[GLOBAL_STATE_KEY];\n}\n\n/**\n * 默认实例名称\n */\nconst DEFAULT_INSTANCE_NAME = '__default__';\n\n/**\n * 注册全局 Analytics 实例\n *\n * @param instance Analytics 管理器实例\n * @param name 实例名称,默认为 '__default__'\n *\n * @example\n * ```typescript\n * const analytics = createAnalytics({ ... });\n * setGlobalAnalytics(analytics);\n * ```\n */\nexport function setGlobalAnalytics(\n instance: AnalyticsManager,\n name: string = DEFAULT_INSTANCE_NAME,\n): void {\n const state = getGlobalState();\n state.instances.set(name, instance);\n}\n\n/**\n * 获取全局 Analytics 实例\n *\n * @param name 实例名称,默认为 '__default__'\n * @returns Analytics 管理器实例\n * @throws {Error} 如果实例不存在\n *\n * @example\n * ```typescript\n * // 在任何文件中使用\n * const analytics = getGlobalAnalytics();\n * analytics.track({ name: 'some_event' });\n * ```\n */\nexport function getGlobalAnalytics(name: string = DEFAULT_INSTANCE_NAME): AnalyticsManager {\n const state = getGlobalState();\n const instance = state.instances.get(name);\n\n if (!instance) {\n throw new Error(\n `Global analytics instance \"${name}\" not found. ` +\n `Make sure to register it first using setGlobalAnalytics() or use AnalyticsProvider.`,\n );\n }\n\n return instance;\n}\n\n/**\n * 获取全局 Analytics 实例(可选,不抛出错误)\n *\n * @param name 实例名称,默认为 '__default__'\n * @returns Analytics 管理器实例或 null\n *\n * @example\n * ```typescript\n * const analytics = getGlobalAnalyticsOptional();\n * analytics?.track({ name: 'optional_event' });\n * ```\n */\nexport function getGlobalAnalyticsOptional(\n name: string = DEFAULT_INSTANCE_NAME,\n): AnalyticsManager | null {\n const state = getGlobalState();\n return state.instances.get(name) || null;\n}\n\n/**\n * 检查全局实例是否存在\n *\n * @param name 实例名称,默认为 '__default__'\n * @returns 是否存在\n */\nexport function hasGlobalAnalytics(name: string = DEFAULT_INSTANCE_NAME): boolean {\n const state = getGlobalState();\n return state.instances.has(name);\n}\n\n/**\n * 移除全局 Analytics 实例\n *\n * @param name 实例名称,默认为 '__default__'\n * @returns 是否成功移除\n */\nexport function removeGlobalAnalytics(name: string = DEFAULT_INSTANCE_NAME): boolean {\n const state = getGlobalState();\n return state.instances.delete(name);\n}\n\n/**\n * 清除所有全局实例\n */\nexport function clearGlobalAnalytics(): void {\n const state = getGlobalState();\n state.instances.clear();\n}\n\n/**\n * 获取所有已注册的实例名称\n *\n * @returns 实例名称数组\n */\nexport function getGlobalAnalyticsNames(): string[] {\n const state = getGlobalState();\n return Array.from(state.instances.keys());\n}\n\n/**\n * 简单的配置比较函数\n *\n * 注意:这是一个简化的实现,仅比较 JSON 序列化后的字符串\n * 对于复杂对象可能不够准确,但对于大多数配置场景是足够的\n */\nfunction isConfigEqual(config1: AnalyticsConfig, config2: AnalyticsConfig): boolean {\n try {\n return JSON.stringify(config1) === JSON.stringify(config2);\n } catch {\n return false;\n }\n}\n\n/**\n * 创建或获取单例 Analytics 实例\n *\n * 单例模式适用于整个应用只需要一个 Analytics 配置的场景。\n * 如果已存在单例且配置相同,返回现有实例;否则创建新实例。\n *\n * @param config Analytics 配置\n * @returns Analytics 管理器实例\n *\n * @example\n * ```typescript\n * // 在应用启动时创建\n * const analytics = createSingletonAnalytics({\n * debug: true,\n * providers: {\n * posthog: {\n * enabled: true,\n * key: 'your_key',\n * host: 'https://app.posthog.com',\n * },\n * },\n * });\n *\n * // 在其他地方获取同一实例\n * const sameAnalytics = getSingletonAnalytics();\n * ```\n */\nexport function createSingletonAnalytics(config: AnalyticsConfig): AnalyticsManager {\n const state = getGlobalState();\n\n // 检查是否已存在相同配置的单例\n if (\n state.singletonInstance &&\n state.singletonConfig &&\n isConfigEqual(state.singletonConfig, config)\n ) {\n return state.singletonInstance;\n }\n\n // 创建新的单例实例\n state.singletonInstance = createAnalytics(config);\n state.singletonConfig = config;\n\n // 同时注册为全局默认实例\n setGlobalAnalytics(state.singletonInstance);\n\n return state.singletonInstance;\n}\n\n/**\n * 获取单例 Analytics 实例\n *\n * @returns Analytics 管理器实例\n * @throws {Error} 如果单例未创建\n *\n * @example\n * ```typescript\n * const analytics = getSingletonAnalytics();\n * analytics.track({ name: 'some_event' });\n * ```\n */\nexport function getSingletonAnalytics(): AnalyticsManager {\n const state = getGlobalState();\n\n if (!state.singletonInstance) {\n throw new Error(\n 'Singleton analytics instance not created. ' +\n 'Call createSingletonAnalytics() first or use getGlobalAnalytics().',\n );\n }\n\n return state.singletonInstance;\n}\n\n/**\n * 获取单例 Analytics 实例(可选,不抛出错误)\n *\n * @returns Analytics 管理器实例或 null\n */\nexport function getSingletonAnalyticsOptional(): AnalyticsManager | null {\n const state = getGlobalState();\n return state.singletonInstance;\n}\n\n/**\n * 检查单例是否已创建\n *\n * @returns 是否存在单例\n */\nexport function hasSingletonAnalytics(): boolean {\n const state = getGlobalState();\n return state.singletonInstance !== null;\n}\n\n/**\n * 重置单例实例\n *\n * 主要用于测试场景\n */\nexport function resetSingletonAnalytics(): void {\n const state = getGlobalState();\n state.singletonInstance = null;\n state.singletonConfig = null;\n}\n"],"mappings":"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","names":[]}
|