@philcrp/analytics 1.6.3 → 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/manager.ts","../src/providers/posthog.ts","../src/base.ts","../src/providers/posthog-node.ts","../src/global.ts","../src/server.ts"],"sourcesContent":["/* 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","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 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","import { PostHog } from 'posthog-node';\n\nimport { BaseAnalytics } from '@/base';\nimport type { AnalyticsEvent, PostHogNodeProviderAnalyticsConfig } from '@/types';\n\n/**\n * PostHog Node.js Analytics Provider\n * Uses official posthog-node SDK for server-side tracking\n */\nexport class PostHogNodeAnalyticsProvider extends BaseAnalytics {\n private readonly config: PostHogNodeProviderAnalyticsConfig;\n private client: PostHog | null = null;\n private initialized = false;\n\n constructor(config: PostHogNodeProviderAnalyticsConfig, business: string) {\n super({ business, debug: config.debug, enabled: config.enabled });\n this.config = config;\n }\n\n getProviderName(): string {\n return 'PostHogNode';\n }\n\n async initialize(): Promise<void> {\n if (!this.isEnabled() || this.initialized) {\n return;\n }\n\n try {\n const { key, debug, enabled, ...posthogNodeConfig } = this.config;\n // Mark variables as intentionally unused to avoid lint warnings\n void debug;\n void enabled;\n\n // Initialize PostHog Node client with default values\n this.client = new PostHog(key, {\n flushAt: 20,\n flushInterval: 10_000,\n host: 'https://app.posthog.com',\n ...posthogNodeConfig, // Apply user's posthog-node config options\n });\n\n this.initialized = true;\n this.log('PostHog Node.js initialized successfully');\n this.log(`Using business context: ${this.business}`);\n } catch (error) {\n this.logError('Failed to initialize PostHog Node.js', error);\n throw error;\n }\n }\n\n async track(event: AnalyticsEvent): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.client || !this.validateEvent(event)) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(event.properties);\n\n this.client.capture({\n distinctId: event.userId || event.anonymousId || 'anonymous',\n event: event.name,\n properties: enrichedProperties,\n timestamp: event.timestamp,\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 || !this.client) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(properties);\n\n this.client.identify({\n distinctId: userId,\n properties: enrichedProperties,\n });\n\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 || !this.client) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties({ page, ...properties });\n\n await this.track({\n name: '$pageview',\n properties: 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 Node.js doesn't have a reset method like the browser version\n // Instead, we can flush pending events and log the reset\n await this.flush();\n this.log('Reset user identity (flushed pending events)');\n } catch (error) {\n this.logError('Failed to reset user identity', error);\n }\n }\n\n /**\n * Check if feature flag is enabled for a user\n */\n async isFeatureEnabled(\n flag: string,\n distinctId: string,\n groups?: Record<string, any>,\n ): Promise<boolean> {\n if (!this.initialized || !this.client) {\n return false;\n }\n\n try {\n const result = await this.client.isFeatureEnabled(flag, distinctId, groups);\n return Boolean(result);\n } catch (error) {\n this.logError(`Failed to check feature flag: ${flag}`, error);\n return false;\n }\n }\n\n /**\n * Get feature flag payload for a user\n */\n async getFeatureFlag(\n flag: string,\n distinctId: string,\n groups?: Record<string, any>,\n ): Promise<any> {\n if (!this.initialized || !this.client) {\n return undefined;\n }\n\n try {\n return await this.client.getFeatureFlag(flag, distinctId, groups);\n } catch (error) {\n this.logError(`Failed to get feature flag: ${flag}`, error);\n return undefined;\n }\n }\n\n /**\n * Get all feature flags for a user\n */\n async getAllFlags(\n distinctId: string,\n groups?: Record<string, any>,\n ): Promise<Record<string, any>> {\n if (!this.initialized || !this.client) {\n return {};\n }\n\n try {\n const flags = await this.client.getAllFlags(distinctId, groups);\n return flags || {};\n } catch (error) {\n this.logError('Failed to get all feature flags', error);\n return {};\n }\n }\n\n /**\n * Flush pending events\n */\n async flush(): Promise<void> {\n if (!this.initialized || !this.client) {\n return;\n }\n\n try {\n await this.client.flush();\n this.log('Flushed pending events');\n } catch (error) {\n this.logError('Failed to flush events', error);\n }\n }\n\n /**\n * Shutdown the client and flush remaining events\n */\n async shutdown(): Promise<void> {\n if (!this.initialized || !this.client) {\n return;\n }\n\n try {\n await this.client.shutdown();\n this.initialized = false; // Mark as shut down\n this.log('PostHog Node.js client shut down');\n } catch (error) {\n this.logError('Failed to shutdown PostHog Node.js client', error);\n }\n }\n\n /**\n * Get the native PostHog Node instance for direct access to PostHog APIs\n */\n getNativeInstance(): 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 this.client;\n }\n\n /**\n * Group identify - associate user with a group\n */\n async groupIdentify(\n groupType: string,\n groupKey: string,\n properties?: Record<string, any>,\n ): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.client) {\n return;\n }\n\n try {\n const enrichedProperties = this.enrichProperties(properties);\n\n this.client.groupIdentify({\n groupKey,\n groupType,\n properties: enrichedProperties,\n });\n\n this.log(`Group identified: ${groupType}:${groupKey}`, enrichedProperties);\n } catch (error) {\n this.logError(`Failed to identify group: ${groupType}:${groupKey}`, error);\n }\n }\n\n /**\n * Create alias between user IDs\n */\n async alias(distinctId: string, alias: string): Promise<void> {\n if (!this.isEnabled() || !this.initialized || !this.client) {\n return;\n }\n\n try {\n this.client.alias({\n alias,\n distinctId,\n });\n\n this.log(`Created alias: ${distinctId} -> ${alias}`);\n } catch (error) {\n this.logError(`Failed to create alias: ${distinctId} -> ${alias}`, error);\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","/**\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","/**\n * Server-side analytics entry point\n * Includes all providers including posthog-node for server environments\n */\nimport { AnalyticsManager } from './manager';\nimport { PostHogAnalyticsProvider } from './providers/posthog';\nimport { PostHogNodeAnalyticsProvider } from './providers/posthog-node';\nimport type { AnalyticsConfig } from './types';\n\n// Re-export selective items from main entry\nexport { AnalyticsManager } from './manager';\nexport { PostHogAnalyticsProvider } from './providers/posthog';\nexport { PostHogNodeAnalyticsProvider } from './providers/posthog-node';\n\n// Re-export types\nexport type * from './types';\n\n// Re-export named global utilities (NOT singleton functions to avoid confusion)\nexport {\n clearGlobalAnalytics,\n getGlobalAnalytics,\n getGlobalAnalyticsNames,\n getGlobalAnalyticsOptional,\n hasGlobalAnalytics,\n removeGlobalAnalytics,\n setGlobalAnalytics,\n} from './global';\n\n// NOTE: createSingletonAnalytics and related functions are NOT re-exported\n// because they use createAnalytics() which doesn't support posthog-node.\n// Use createSingletonServerAnalytics() instead for server-side singleton.\n\n/**\n * Create server analytics with full provider support including posthog-node\n */\nexport function createServerAnalytics(config: AnalyticsConfig): AnalyticsManager {\n const manager = new AnalyticsManager(config.business, config.debug);\n\n // Register PostHog browser 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 PostHog Node.js if enabled (server-side)\n if (config.providers.posthogNode?.enabled) {\n const provider = new PostHogNodeAnalyticsProvider(\n config.providers.posthogNode,\n config.business,\n );\n manager.registerProvider('posthogNode', provider);\n }\n\n // Add other providers here as they are implemented\n // if (config.providers.umami?.enabled) { ... }\n // if (config.providers.ga?.enabled) { ... }\n\n return manager;\n}\n\n// ============================================\n// Server Entry Point Philosophy\n// ============================================\n//\n// 🎯 Keep it simple: Just provide createServerAnalytics()\n// 🚀 Let users manage instances however they prefer:\n// - Direct instantiation\n// - Module-level exports\n// - Dependency injection\n// - Custom singleton patterns\n//\n// Example user patterns:\n//\n// 1️⃣ Module export pattern:\n// export const analytics = createServerAnalytics(config);\n//\n// 2️⃣ Lazy initialization:\n// let _analytics: AnalyticsManager | null = null;\n// export const getAnalytics = () => _analytics ??= createServerAnalytics(config);\n//\n// 3️⃣ Class-based DI:\n// class AnalyticsService {\n// constructor() {\n// this.analytics = createServerAnalytics(config);\n// }\n// }\n//\n// 💡 This approach gives maximum flexibility while keeping the API minimal!\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@philcrp/analytics",
|
|
3
|
-
"version": "1.6.
|
|
4
|
-
"description": "A modern, type-safe analytics library for tracking user events across multiple providers, built by
|
|
5
|
-
"homepage": "https://github.com/
|
|
3
|
+
"version": "1.6.5",
|
|
4
|
+
"description": "A modern, type-safe analytics library for tracking user events across multiple providers, built by LobeHub",
|
|
5
|
+
"homepage": "https://github.com/lobehub/lobe-analytics",
|
|
6
6
|
"bugs": {
|
|
7
|
-
"url": "https://github.com/
|
|
7
|
+
"url": "https://github.com/lobehub/lobe-analytics/issues/new/choose"
|
|
8
8
|
},
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "
|
|
11
|
+
"url": "https://github.com/lobehub/lobe-analytics.git"
|
|
12
12
|
},
|
|
13
13
|
"license": "MIT",
|
|
14
|
-
"author": "
|
|
14
|
+
"author": "LobeHub <i@lobehub.com>",
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
|
17
17
|
"types": "./dist/index.d.mts",
|
|
@@ -35,71 +35,9 @@
|
|
|
35
35
|
"files": [
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
|
-
"scripts": {
|
|
39
|
-
"build": "tsup",
|
|
40
|
-
"ci": "npm run lint:circular && npm run lint && npm run type-check",
|
|
41
|
-
"dev": "tsup --watch",
|
|
42
|
-
"example": "bun run build && tsx examples/basic-usage.ts",
|
|
43
|
-
"lint": "eslint \"{src,tests}/**/*.{js,jsx,ts,tsx}\" --fix",
|
|
44
|
-
"lint:circular": "dpdm src/**/*.{ts,tsx} --warning false --tree false --exit-code circular:1 -T true",
|
|
45
|
-
"lint:md": "remark . --quiet --frail --output",
|
|
46
|
-
"prepack": "clean-package",
|
|
47
|
-
"postpack": "clean-package restore",
|
|
48
|
-
"prepare": "husky",
|
|
49
|
-
"prepublishOnly": "npm run build",
|
|
50
|
-
"prettier": "prettier -c --write --no-error-on-unmatched-pattern",
|
|
51
|
-
"release": "semantic-release",
|
|
52
|
-
"test": "vitest",
|
|
53
|
-
"test:coverage": "vitest run --coverage --passWithNoTests",
|
|
54
|
-
"test:watch": "vitest --watch",
|
|
55
|
-
"type-check": "tsc --noEmit"
|
|
56
|
-
},
|
|
57
|
-
"lint-staged": {
|
|
58
|
-
"*.{md,mdc}": [
|
|
59
|
-
"remark --silent --output --",
|
|
60
|
-
"prettier --write --no-error-on-unmatched-pattern"
|
|
61
|
-
],
|
|
62
|
-
"*.json": [
|
|
63
|
-
"prettier --write --no-error-on-unmatched-pattern"
|
|
64
|
-
],
|
|
65
|
-
"*.{js,jsx}": [
|
|
66
|
-
"prettier --write",
|
|
67
|
-
"eslint --fix"
|
|
68
|
-
],
|
|
69
|
-
"*.{mjs,cjs}": [
|
|
70
|
-
"prettier --write",
|
|
71
|
-
"eslint --fix"
|
|
72
|
-
],
|
|
73
|
-
"*.{ts,tsx}": [
|
|
74
|
-
"prettier --parser=typescript --write",
|
|
75
|
-
"eslint --fix"
|
|
76
|
-
]
|
|
77
|
-
},
|
|
78
38
|
"dependencies": {
|
|
79
39
|
"posthog-js": "^1.103.0"
|
|
80
40
|
},
|
|
81
|
-
"devDependencies": {
|
|
82
|
-
"@commitlint/cli": "^19.8.1",
|
|
83
|
-
"@lobehub/lint": "^1.26.2",
|
|
84
|
-
"@types/react": "^18.2.0",
|
|
85
|
-
"@vitest/coverage-v8": "^3.2.4",
|
|
86
|
-
"clean-package": "^2.2.0",
|
|
87
|
-
"dotenv": "^16.5.0",
|
|
88
|
-
"dpdm": "^3.14.0",
|
|
89
|
-
"eslint": "^8.57.1",
|
|
90
|
-
"husky": "^9.1.7",
|
|
91
|
-
"jsdom": "^26.1.0",
|
|
92
|
-
"lint-staged": "^16.1.2",
|
|
93
|
-
"prettier": "^3.5.3",
|
|
94
|
-
"react": "^18.2.0",
|
|
95
|
-
"remark": "^15.0.1",
|
|
96
|
-
"remark-cli": "^12.0.1",
|
|
97
|
-
"semantic-release": "^21.1.2",
|
|
98
|
-
"tsup": "^8.5.0",
|
|
99
|
-
"tsx": "^4.20.3",
|
|
100
|
-
"typescript": "^5.8.3",
|
|
101
|
-
"vitest": "^3.2.4"
|
|
102
|
-
},
|
|
103
41
|
"peerDependencies": {
|
|
104
42
|
"react": ">=16.8.0"
|
|
105
43
|
},
|
|
@@ -111,9 +49,5 @@
|
|
|
111
49
|
"optionalDependencies": {
|
|
112
50
|
"posthog-node": "^4.2.1"
|
|
113
51
|
},
|
|
114
|
-
"packageManager": "pnpm@10.11.0"
|
|
115
|
-
|
|
116
|
-
"access": "public",
|
|
117
|
-
"registry": "https://registry.npmjs.org"
|
|
118
|
-
}
|
|
119
|
-
}
|
|
52
|
+
"packageManager": "pnpm@10.11.0"
|
|
53
|
+
}
|