@qhr123/sa2kit 0.3.0 → 0.3.1

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.
@@ -524,6 +524,45 @@ declare function createDesktopConfig(appId: string, options?: {
524
524
  appVersion?: string;
525
525
  }): Partial<AnalyticsConfig>;
526
526
 
527
+ /**
528
+ * Analytics 单例管理器
529
+ * Analytics Singleton Manager
530
+ *
531
+ * 提供统一的单例创建和管理功能,支持多个独立实例
532
+ */
533
+
534
+ /**
535
+ * 创建或获取 Analytics 实例
536
+ * @param instanceKey 实例唯一标识
537
+ * @param config Analytics 配置
538
+ * @returns Analytics 实例
539
+ */
540
+ declare function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics;
541
+ /**
542
+ * 获取已存在的 Analytics 实例
543
+ * @param instanceKey 实例唯一标识
544
+ * @returns Analytics 实例或 null
545
+ */
546
+ declare function getAnalyticsInstance(instanceKey: string): Analytics | null;
547
+ /**
548
+ * 重置指定实例
549
+ * @param instanceKey 实例唯一标识
550
+ */
551
+ declare function resetAnalytics(instanceKey: string): void;
552
+ /**
553
+ * 重置所有实例
554
+ */
555
+ declare function resetAllAnalytics(): void;
556
+ /**
557
+ * 检查实例是否已初始化
558
+ * @param instanceKey 实例唯一标识
559
+ */
560
+ declare function isAnalyticsInitialized(instanceKey: string): boolean;
561
+ /**
562
+ * 获取所有已创建的实例键名
563
+ */
564
+ declare function getAllInstanceKeys(): string[];
565
+
527
566
  /**
528
567
  * 埋点工具函数
529
568
  * Analytics Helper Functions
@@ -699,4 +738,4 @@ declare function useAutoTracking(analytics: Analytics | null, options?: {
699
738
 
700
739
  declare const ANALYTICS_VERSION = "1.0.0";
701
740
 
702
- export { ANALYTICS_VERSION, Analytics, type AnalyticsConfig, type AnalyticsDeviceAdapter, type AnalyticsEvent, type AnalyticsNetworkAdapter, type AnalyticsStorageAdapter, type ApiCallEvent, type BaseEvent, CatchError, type ClickEvent, type DeviceInfo, type ErrorEvent, EventPriority, EventQueue, EventType, type PageViewEvent, type PerformanceEvent, Track, TrackClick, TrackPerformance, type UploadResponse, Uploader, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isDevelopment, isMobile, mergeEventProperties, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
741
+ export { ANALYTICS_VERSION, Analytics, type AnalyticsConfig, type AnalyticsDeviceAdapter, type AnalyticsEvent, type AnalyticsNetworkAdapter, type AnalyticsStorageAdapter, type ApiCallEvent, type BaseEvent, CatchError, type ClickEvent, type DeviceInfo, type ErrorEvent, EventPriority, EventQueue, EventType, type PageViewEvent, type PerformanceEvent, Track, TrackClick, TrackPerformance, type UploadResponse, Uploader, createAnalytics, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getAllInstanceKeys, getAnalyticsInstance, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isAnalyticsInitialized, isDevelopment, isMobile, mergeEventProperties, resetAllAnalytics, resetAnalytics, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
@@ -524,6 +524,45 @@ declare function createDesktopConfig(appId: string, options?: {
524
524
  appVersion?: string;
525
525
  }): Partial<AnalyticsConfig>;
526
526
 
527
+ /**
528
+ * Analytics 单例管理器
529
+ * Analytics Singleton Manager
530
+ *
531
+ * 提供统一的单例创建和管理功能,支持多个独立实例
532
+ */
533
+
534
+ /**
535
+ * 创建或获取 Analytics 实例
536
+ * @param instanceKey 实例唯一标识
537
+ * @param config Analytics 配置
538
+ * @returns Analytics 实例
539
+ */
540
+ declare function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics;
541
+ /**
542
+ * 获取已存在的 Analytics 实例
543
+ * @param instanceKey 实例唯一标识
544
+ * @returns Analytics 实例或 null
545
+ */
546
+ declare function getAnalyticsInstance(instanceKey: string): Analytics | null;
547
+ /**
548
+ * 重置指定实例
549
+ * @param instanceKey 实例唯一标识
550
+ */
551
+ declare function resetAnalytics(instanceKey: string): void;
552
+ /**
553
+ * 重置所有实例
554
+ */
555
+ declare function resetAllAnalytics(): void;
556
+ /**
557
+ * 检查实例是否已初始化
558
+ * @param instanceKey 实例唯一标识
559
+ */
560
+ declare function isAnalyticsInitialized(instanceKey: string): boolean;
561
+ /**
562
+ * 获取所有已创建的实例键名
563
+ */
564
+ declare function getAllInstanceKeys(): string[];
565
+
527
566
  /**
528
567
  * 埋点工具函数
529
568
  * Analytics Helper Functions
@@ -699,4 +738,4 @@ declare function useAutoTracking(analytics: Analytics | null, options?: {
699
738
 
700
739
  declare const ANALYTICS_VERSION = "1.0.0";
701
740
 
702
- export { ANALYTICS_VERSION, Analytics, type AnalyticsConfig, type AnalyticsDeviceAdapter, type AnalyticsEvent, type AnalyticsNetworkAdapter, type AnalyticsStorageAdapter, type ApiCallEvent, type BaseEvent, CatchError, type ClickEvent, type DeviceInfo, type ErrorEvent, EventPriority, EventQueue, EventType, type PageViewEvent, type PerformanceEvent, Track, TrackClick, TrackPerformance, type UploadResponse, Uploader, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isDevelopment, isMobile, mergeEventProperties, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
741
+ export { ANALYTICS_VERSION, Analytics, type AnalyticsConfig, type AnalyticsDeviceAdapter, type AnalyticsEvent, type AnalyticsNetworkAdapter, type AnalyticsStorageAdapter, type ApiCallEvent, type BaseEvent, CatchError, type ClickEvent, type DeviceInfo, type ErrorEvent, EventPriority, EventQueue, EventType, type PageViewEvent, type PerformanceEvent, Track, TrackClick, TrackPerformance, type UploadResponse, Uploader, createAnalytics, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getAllInstanceKeys, getAnalyticsInstance, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isAnalyticsInitialized, isDevelopment, isMobile, mergeEventProperties, resetAllAnalytics, resetAnalytics, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
@@ -707,6 +707,30 @@ function createDesktopConfig(appId, options = {}) {
707
707
  };
708
708
  }
709
709
 
710
+ // src/analytics/client/singleton.ts
711
+ var instances = /* @__PURE__ */ new Map();
712
+ function createAnalytics(instanceKey, config) {
713
+ if (!instances.has(instanceKey)) {
714
+ instances.set(instanceKey, new Analytics(config));
715
+ }
716
+ return instances.get(instanceKey);
717
+ }
718
+ function getAnalyticsInstance(instanceKey) {
719
+ return instances.get(instanceKey) || null;
720
+ }
721
+ function resetAnalytics(instanceKey) {
722
+ instances.delete(instanceKey);
723
+ }
724
+ function resetAllAnalytics() {
725
+ instances.clear();
726
+ }
727
+ function isAnalyticsInitialized(instanceKey) {
728
+ return instances.has(instanceKey);
729
+ }
730
+ function getAllInstanceKeys() {
731
+ return Array.from(instances.keys());
732
+ }
733
+
710
734
  // src/analytics/utils/helpers.ts
711
735
  function throttle(func, wait) {
712
736
  let timeout = null;
@@ -860,7 +884,7 @@ function Track(eventName, priority = 1 /* NORMAL */) {
860
884
  return function(_target, propertyKey, descriptor) {
861
885
  const originalMethod = descriptor.value;
862
886
  descriptor.value = async function(...args) {
863
- const analytics = getAnalyticsInstance(this);
887
+ const analytics = getAnalyticsInstance2(this);
864
888
  const finalEventName = eventName || propertyKey;
865
889
  const startTime = Date.now();
866
890
  try {
@@ -897,7 +921,7 @@ function TrackClick(eventName) {
897
921
  return function(_target, propertyKey, descriptor) {
898
922
  const originalMethod = descriptor.value;
899
923
  descriptor.value = function(...args) {
900
- const analytics = getAnalyticsInstance(this);
924
+ const analytics = getAnalyticsInstance2(this);
901
925
  const finalEventName = eventName || propertyKey;
902
926
  analytics?.track(
903
927
  "click" /* CLICK */,
@@ -916,7 +940,7 @@ function TrackPerformance(metricName) {
916
940
  return function(_target, propertyKey, descriptor) {
917
941
  const originalMethod = descriptor.value;
918
942
  descriptor.value = async function(...args) {
919
- const analytics = getAnalyticsInstance(this);
943
+ const analytics = getAnalyticsInstance2(this);
920
944
  const finalMetricName = metricName || propertyKey;
921
945
  const startTime = performance.now();
922
946
  try {
@@ -945,7 +969,7 @@ function CatchError(_eventName) {
945
969
  try {
946
970
  return await originalMethod.apply(this, args);
947
971
  } catch (error) {
948
- const analytics = getAnalyticsInstance(this);
972
+ const analytics = getAnalyticsInstance2(this);
949
973
  analytics?.trackError(
950
974
  error instanceof Error ? error.message : String(error),
951
975
  error instanceof Error ? error.stack : void 0,
@@ -961,7 +985,7 @@ function CatchError(_eventName) {
961
985
  return descriptor;
962
986
  };
963
987
  }
964
- function getAnalyticsInstance(instance) {
988
+ function getAnalyticsInstance2(instance) {
965
989
  if (instance.analytics) {
966
990
  return instance.analytics;
967
991
  }
@@ -1147,6 +1171,7 @@ exports.Track = Track;
1147
1171
  exports.TrackClick = TrackClick;
1148
1172
  exports.TrackPerformance = TrackPerformance;
1149
1173
  exports.Uploader = Uploader;
1174
+ exports.createAnalytics = createAnalytics;
1150
1175
  exports.createDesktopConfig = createDesktopConfig;
1151
1176
  exports.createMiniappConfig = createMiniappConfig;
1152
1177
  exports.createMobileConfig = createMobileConfig;
@@ -1156,6 +1181,8 @@ exports.deepClone = deepClone;
1156
1181
  exports.formatEvent = formatEvent;
1157
1182
  exports.formatTimestamp = formatTimestamp;
1158
1183
  exports.generateUniqueId = generateUniqueId;
1184
+ exports.getAllInstanceKeys = getAllInstanceKeys;
1185
+ exports.getAnalyticsInstance = getAnalyticsInstance;
1159
1186
  exports.getBatchSize = getBatchSize;
1160
1187
  exports.getCurrentPageTitle = getCurrentPageTitle;
1161
1188
  exports.getCurrentPageUrl = getCurrentPageUrl;
@@ -1163,9 +1190,12 @@ exports.getEventSize = getEventSize;
1163
1190
  exports.getGlobalAnalytics = getGlobalAnalytics;
1164
1191
  exports.getPageDuration = getPageDuration;
1165
1192
  exports.getReferrer = getReferrer;
1193
+ exports.isAnalyticsInitialized = isAnalyticsInitialized;
1166
1194
  exports.isDevelopment = isDevelopment;
1167
1195
  exports.isMobile = isMobile;
1168
1196
  exports.mergeEventProperties = mergeEventProperties;
1197
+ exports.resetAllAnalytics = resetAllAnalytics;
1198
+ exports.resetAnalytics = resetAnalytics;
1169
1199
  exports.safeParse = safeParse;
1170
1200
  exports.safeStringify = safeStringify;
1171
1201
  exports.sanitizeEvent = sanitizeEvent;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","useEffect","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n *\n * 注意:此模块不包含平台特定的适配器(web/mobile/desktop/miniapp)\n * 如需使用平台适配器,请在项目中自行实现\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具\nexport * from './client/presets';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
1
+ {"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/client/singleton.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","getAnalyticsInstance","useEffect","useCallback","useRef"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n *\n * 注意:此模块不包含平台特定的适配器(web/mobile/desktop/miniapp)\n * 如需使用平台适配器,请在项目中自行实现\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
@@ -705,6 +705,30 @@ function createDesktopConfig(appId, options = {}) {
705
705
  };
706
706
  }
707
707
 
708
+ // src/analytics/client/singleton.ts
709
+ var instances = /* @__PURE__ */ new Map();
710
+ function createAnalytics(instanceKey, config) {
711
+ if (!instances.has(instanceKey)) {
712
+ instances.set(instanceKey, new Analytics(config));
713
+ }
714
+ return instances.get(instanceKey);
715
+ }
716
+ function getAnalyticsInstance(instanceKey) {
717
+ return instances.get(instanceKey) || null;
718
+ }
719
+ function resetAnalytics(instanceKey) {
720
+ instances.delete(instanceKey);
721
+ }
722
+ function resetAllAnalytics() {
723
+ instances.clear();
724
+ }
725
+ function isAnalyticsInitialized(instanceKey) {
726
+ return instances.has(instanceKey);
727
+ }
728
+ function getAllInstanceKeys() {
729
+ return Array.from(instances.keys());
730
+ }
731
+
708
732
  // src/analytics/utils/helpers.ts
709
733
  function throttle(func, wait) {
710
734
  let timeout = null;
@@ -858,7 +882,7 @@ function Track(eventName, priority = 1 /* NORMAL */) {
858
882
  return function(_target, propertyKey, descriptor) {
859
883
  const originalMethod = descriptor.value;
860
884
  descriptor.value = async function(...args) {
861
- const analytics = getAnalyticsInstance(this);
885
+ const analytics = getAnalyticsInstance2(this);
862
886
  const finalEventName = eventName || propertyKey;
863
887
  const startTime = Date.now();
864
888
  try {
@@ -895,7 +919,7 @@ function TrackClick(eventName) {
895
919
  return function(_target, propertyKey, descriptor) {
896
920
  const originalMethod = descriptor.value;
897
921
  descriptor.value = function(...args) {
898
- const analytics = getAnalyticsInstance(this);
922
+ const analytics = getAnalyticsInstance2(this);
899
923
  const finalEventName = eventName || propertyKey;
900
924
  analytics?.track(
901
925
  "click" /* CLICK */,
@@ -914,7 +938,7 @@ function TrackPerformance(metricName) {
914
938
  return function(_target, propertyKey, descriptor) {
915
939
  const originalMethod = descriptor.value;
916
940
  descriptor.value = async function(...args) {
917
- const analytics = getAnalyticsInstance(this);
941
+ const analytics = getAnalyticsInstance2(this);
918
942
  const finalMetricName = metricName || propertyKey;
919
943
  const startTime = performance.now();
920
944
  try {
@@ -943,7 +967,7 @@ function CatchError(_eventName) {
943
967
  try {
944
968
  return await originalMethod.apply(this, args);
945
969
  } catch (error) {
946
- const analytics = getAnalyticsInstance(this);
970
+ const analytics = getAnalyticsInstance2(this);
947
971
  analytics?.trackError(
948
972
  error instanceof Error ? error.message : String(error),
949
973
  error instanceof Error ? error.stack : void 0,
@@ -959,7 +983,7 @@ function CatchError(_eventName) {
959
983
  return descriptor;
960
984
  };
961
985
  }
962
- function getAnalyticsInstance(instance) {
986
+ function getAnalyticsInstance2(instance) {
963
987
  if (instance.analytics) {
964
988
  return instance.analytics;
965
989
  }
@@ -1135,6 +1159,6 @@ function useAutoTracking(analytics, options = {}) {
1135
1159
  // src/analytics/index.ts
1136
1160
  var ANALYTICS_VERSION = "1.0.0";
1137
1161
 
1138
- export { ANALYTICS_VERSION, Analytics, CatchError, EventPriority, EventQueue, EventType, Track, TrackClick, TrackPerformance, Uploader, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isDevelopment, isMobile, mergeEventProperties, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
1162
+ export { ANALYTICS_VERSION, Analytics, CatchError, EventPriority, EventQueue, EventType, Track, TrackClick, TrackPerformance, Uploader, createAnalytics, createDesktopConfig, createMiniappConfig, createMobileConfig, createWebConfig, debounce, deepClone, formatEvent, formatTimestamp, generateUniqueId, getAllInstanceKeys, getAnalyticsInstance, getBatchSize, getCurrentPageTitle, getCurrentPageUrl, getEventSize, getGlobalAnalytics, getPageDuration, getReferrer, isAnalyticsInitialized, isDevelopment, isMobile, mergeEventProperties, resetAllAnalytics, resetAnalytics, safeParse, safeStringify, sanitizeEvent, setGlobalAnalytics, throttle, useAnalytics, useAutoTracking, useErrorTracking, usePageDuration, usePageView, usePerformanceTracking, useTrackClick, useTrackEvent, validateEvent, validateEvents };
1139
1163
  //# sourceMappingURL=index.mjs.map
1140
1164
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n *\n * 注意:此模块不包含平台特定的适配器(web/mobile/desktop/miniapp)\n * 如需使用平台适配器,请在项目中自行实现\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具\nexport * from './client/presets';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
1
+ {"version":3,"sources":["../../src/analytics/types.ts","../../src/analytics/core/EventQueue.ts","../../src/analytics/core/Uploader.ts","../../src/analytics/core/Analytics.ts","../../src/analytics/client/presets.ts","../../src/analytics/client/singleton.ts","../../src/analytics/utils/helpers.ts","../../src/analytics/utils/decorators.ts","../../src/analytics/utils/hooks.ts","../../src/analytics/index.ts"],"names":["EventType","EventPriority","getAnalyticsInstance"],"mappings":";;;AAQO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AAEL,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,YAAA,CAAA,GAAa,YAAA;AAGb,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AAxBC,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AA8BL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,cAAW,CAAA,CAAA,GAAX,UAAA;AAJU,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;AC/BL,IAAM,aAAN,MAAiB;AAAA,EAItB,WAAA,CAAY,UAAkB,GAAA,EAAK;AAHnC,IAAA,IAAA,CAAQ,QAA0B,EAAC;AAIjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAA6B;AAEnC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAAA,IACjC;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAGrB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAgC;AAC3C,IAAA,MAAA,CAAO,QAAQ,CAAC,KAAA,KAAU,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAAiC;AACvC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA+B;AAC7B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAC7B,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA0C;AACxC,IAAA,MAAM,kBAAA,GAAqB,KAAK,KAAA,CAAM,MAAA;AAAA,MACpC,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,IAAY;AAAA;AAAA,KAC/B;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,WAAW,CAAC,CAAA;AAE5D,IAAA,OAAO,kBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAmB;AACjB,IAAA,OAAO,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,EAAC;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAG7B,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAC1B,IAAA,IAAI,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,CAAC,GAAG,QAAA,IAAY,CAAA;AAEhD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,CAAC,GAAG,QAAA,IAAY,CAAA;AACnD,MAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,QAAA,cAAA,GAAiB,eAAA;AACjB,QAAA,mBAAA,GAAsB,CAAA;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,mBAAA,EAAqB,CAAC,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA6B;AAC3B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACvB;AACF;;;ACpGO,IAAM,WAAN,MAAe;AAAA,EAKpB,YAAY,MAAA,EAAwB;AAHpC,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,UAAA,uBAAgF,GAAA,EAAI;AAG1F,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,MAAA,EAA4C;AACvD,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGhC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,QAAA,EAAS;AAC3D,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,MAAM,IAAA,CAAK,YAAY,MAAM,CAAA;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,MAAM,CAAA;AAErF,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,eAAe,CAAA;AAAA,MACrD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,GAAA,EAAK,MAAM,CAAA;AAGjC,MAAA,MAAM,IAAA,CAAK,gBAAgB,MAAM,CAAA;AACjC,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAA4C;AAC5D,IAAA,MAAM,UAAU,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,OAAO,SAAS,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAE5E,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAA,KAAW,MAAM,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAElD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,QAAA,EAAS;AAC3D,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAEpD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,OAAA,EAAS;AACjC,MAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AAE7C,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAClC,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAC1B,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,OAAO,aAAA,IAAiB,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAElE,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,MAAM,CAAA;AAE7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA;AAAA,MAC5B,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,UAAA,EAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,GAAoC;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,EAAU;AAEhE,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,YAAY,CAAA;AAEnD,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,WAAA,EAAY;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,MAAA,EAAyC;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,EAAU;AAClE,MAAA,MAAM,SAAA,GAAY,CAAC,GAAG,cAAA,EAAgB,GAAG,MAAM,CAAA;AAC/C,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA;AAAA,IACvD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,MAAA,EAAyC;AACrE,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,GAAA,EAAK;AAAA,MACvB,MAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,QAA0B,SAAA,EAAuC;AACxF,IAAA,MAAM,UAA8B,EAAC;AAErC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,MAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA4B;AAC1B,IAAA,OAAO,KAAK,UAAA,CAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EACxB;AACF;;;AC/KA,IAAM,WAAA,GAAc,OAAA;AAEb,IAAM,YAAN,MAAgB;AAAA,EAcrB,WAAA,CACE,MAAA,EAUA,cAAA,EACA,cAAA,EACA,aAAA,EACA;AApBF,IAAA,IAAA,CAAQ,SAAA,GAAoB,EAAA;AAC5B,IAAA,IAAA,CAAQ,QAAA,GAAmB,EAAA;AAC3B,IAAA,IAAA,CAAQ,UAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,IAAA,CAAQ,UAAA,GAAkB,IAAA;AAoBxB,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AACrC,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,OAAA,CAAQ,OAAA;AACrC,MAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,OAAA,CAAQ,MAAA;AAAA,IACtC,CAAA,MAAA,IAAW,cAAA,IAAkB,cAAA,IAAkB,aAAA,EAAe;AAC5D,MAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,MAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,MAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,IACxE;AAGA,IAAA,MAAM,SAAA,GAAa,MAAA,CAAe,SAAA,IAAa,MAAA,CAAO,QAAA,IAAY,uBAAA;AAClE,IAAA,MAAM,QAAA,GAAY,OAAe,QAAA,IAAY,KAAA;AAE7C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,OAAO,UAAA,IAAc,OAAA;AAAA,MACjC,QAAA;AAAA,MACA,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,OAAO,SAAA,IAAa,EAAA;AAAA,MAC/B,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,YAAA,EAAc,OAAO,YAAA,IAAgB,GAAA;AAAA,MACrC,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,aAAA,EAAe,OAAO,aAAA,IAAiB,GAAA;AAAA,MACvC,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,IAAA;AAAA,MACjD,eAAA,EAAiB,OAAO,eAAA,IAAmB,KAAA;AAAA,MAC3C,eAAA,EAAiB,OAAO,eAAA,IAAmB,IAAA;AAAA,MAC3C,qBAAA,EAAuB,OAAO,qBAAA,IAAyB,IAAA;AAAA,MACvD,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,MACvB,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,EAAC;AAAA,MAClC,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MACtC,YAAY,MAAA,CAAO;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,YAAY,CAAA;AACzD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,MAC3B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,MACtB,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA;AAAA,MACvB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,MAC3B,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAA,EAAW,CAAC,MAAA,KAAW,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA,MAClD,SAAS,CAAC,KAAA,EAAO,WAAW,IAAA,CAAK,aAAA,CAAc,OAAO,MAAM;AAAA,KAC7D,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC3B,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,IAAI,+BAA+B,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,KAAK,cAAA,EAAe;AAG1B,MAAA,MAAM,KAAK,WAAA,EAAY;AAGvB,MAAA,MAAM,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAGvC,MAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,gBAAA,CAAiB,yBAAA,GAA4B,CAAC,CAAA,KAAmB;AACtE,UAAA,IAAA,CAAK,IAAI,CAAA,oBAAA,EAAuB,CAAA,CAAE,OAAO,OAAA,GAAU,SAAA,GAAY,UAAU,CAAA,CAAE,CAAA;AAAA,QAC7E,CAAA,EAAmB;AAAA,MACrB;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,IAAI,oCAAoC,CAAA;AAAA,IAC/C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CACE,eAAA,EACA,gBAAA,EACA,eAAA,EACA,QAAA,GAAA,CAAA,eACM;AACN,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAE9D,MAAA,UAAA;AAAA,QACE,MAAM,IAAA,CAAK,KAAA,CAAM,eAAA,EAAiB,gBAAA,EAAkB,iBAAiB,QAAQ,CAAA;AAAA,QAC7E;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AAKJ,IAAA,IAAI,OAAO,qBAAqB,QAAA,EAAU;AAExC,MAAA,SAAA,GAAY,eAAA;AACZ,MAAA,SAAA,GAAY,gBAAA;AACZ,MAAA,UAAA,GAAa,eAAA;AAAA,IACf,CAAA,MAAO;AAEL,MAAA,SAAA,GAAA,QAAA;AACA,MAAA,SAAA,GAAY,eAAA;AACZ,MAAA,UAAA,GAAa,gBAAA;AAAA,IACf;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,SAAA,EAAW,YAAY,QAAQ,CAAA;AAGzE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,UAAA,GAAa,KAAK,CAAA,IAAK,KAAA;AAC1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,GAAA,CAAI,qCAAqC,KAAK,CAAA;AACnD,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,cAAc,CAAA;AACtC,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,cAAc,CAAA;AAGxC,IAAA,IAAI,QAAA,IAAA,CAAA,aAAgC;AAClC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzB;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAC5B,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,OAAA,EAAiB,SAAA,EAAmB,UAAA,EAAwC;AACxF,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,WAAA;AAAA,MAEH,WAAA;AAAA,MACA;AAAA,QACE,QAAA,EAAU,OAAA;AAAA,QACV,UAAA,EAAY,SAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,aAOA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,OAAA;AAAA,MAEH,OAAA;AAAA,MACA;AAAA,QACE,GAAG,WAAA;AAAA,QACH,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,YAAA,EACA,UAAA,EACA,SAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,OAAA;AAAA,MAEH,OAAA;AAAA,MACA;AAAA,QACE,aAAA,EAAe,YAAA;AAAA,QACf,WAAA,EAAa,UAAA;AAAA,QACb,UAAA,EAAY,SAAA;AAAA,QACZ,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,UAAA,EACA,WAAA,EACA,UAAA,EACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,aAAA;AAAA,MAEH,aAAA;AAAA,MACA;AAAA,QACE,WAAA,EAAa,UAAA;AAAA,QACb,YAAA,EAAc,WAAA;AAAA,QACd,WAAA,EAAa,UAAA;AAAA,QACb,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aACE,MAAA,EACA,SAAA,EACA,SAAA,EACA,QAAA,EACA,SACA,UAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA;AAAA,MAAA,UAAA;AAAA,MAEH,UAAA;AAAA,MACA;AAAA,QACE,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA;AAAA,QACA,OAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,MAAA,CAAA;AAAA,KAEF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAsB;AAC9B,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,MAAA;AACrB,IAAA,IAAA,CAAK,GAAA,CAAI,eAAe,MAAM,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAA,EAAwD;AAC9D,IAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,UAAA,EAAW,GAAI,QAAA;AAClC,IAAA,IAAA,CAAK,OAAO,MAAA,GAAS,MAAA;AACrB,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB;AAAA,MAC7B,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,MACf,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,iBAAiB,QAAQ,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,UAAA,EAAuC;AACzD,IAAA,IAAA,CAAK,OAAO,gBAAA,GAAmB;AAAA,MAC7B,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,MACf,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAyB,UAAU,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ,EAAG;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,UAAA,EAAW;AAC1C,IAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,UAAA,CAAW,qBAAA,EAAsB;AAEjE,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,kBAAkB,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,aAAA,CAAc,KAAK,UAAU,CAAA;AAC7B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAGA,IAAA,MAAM,KAAK,KAAA,EAAM;AAEjB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,IAAI,qBAAqB,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CACN,SAAA,EACA,SAAA,EACA,UAAA,EACA,QAAA,GAAA,CAAA,eACW;AAEX,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAC1B,MAAA,SAAA,GAAY,QAAA,CAAS,KAAA;AACrB,MAAA,QAAA,GAAW,SAAS,QAAA,IAAY,MAAA;AAAA,IAClC;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,KAAK,eAAA,EAAgB;AAAA,MAC/B,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA;AAAA,MACA,OAAA,EAAS,KAAK,MAAA,CAAO,MAAA;AAAA,MACrB,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,QAAA,EAAU,OAAA;AAAA,MACV,UAAA,EAAY,SAAA;AAAA,MACZ,QAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,GAAG,KAAK,MAAA,CAAO,gBAAA;AAAA,QACf,GAAG;AAAA,OACL;AAAA,MACA,QAAA,EAAU,KAAK,WAAA,EAAY;AAAA,MAC3B,WAAA,EAAa,KAAK,MAAA,CAAO,UAAA;AAAA,MACzB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,GAAgC;AAC5C,IAAA,IAAI;AAEF,MAAA,IAAI,gBAAA,GAAmB,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc;AAE/D,MAAA,IAAI,CAAC,gBAAA,EAAkB;AAErB,QAAA,IAAA,CAAK,UAAA,GAAa,MAAM,IAAA,CAAK,aAAA,CAAc,aAAA,EAAc;AACzD,QAAA,IAAA,CAAK,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,EAAiB;AAG1D,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,IAAA,CAAK,UAAU,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,UAAA,GAAa,gBAAA;AAClB,QAAA,IAAA,CAAK,WAAW,gBAAA,CAAiB,SAAA;AAAA,MACnC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAElD,MAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI;AAEF,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,cAAA,CAAe,YAAA,EAAa;AAE/D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAA,CAAK,SAAA,GAAY,eAAA;AAAA,MACnB,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,SAAA,GAAY,KAAK,iBAAA,EAAkB;AACxC,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAAA,MACxD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,iBAAA,EAAkB;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,YAAY,MAAM;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAQ,EAAG;AAC9B,QAAA,IAAA,CAAK,KAAA,EAAM;AAAA,MACb;AAGA,MAAA,IAAA,CAAK,SAAS,kBAAA,EAAmB;AAAA,IACnC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,aAAa,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAAgC;AACtD,IAAA,IAAA,CAAK,GAAA,CAAI,gCAAgC,MAAM,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,OAAc,MAAA,EAAgC;AAClE,IAAA,IAAA,CAAK,GAAA,CAAI,yBAAA,EAA2B,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA0B;AAChC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAsB;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAO,QAAA,IAAY,SAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CAAI,SAAiB,IAAA,EAAkB;AAE7C,IAAA,MAAM,YAAA,GACJ,OAAO,MAAA,KAAW,WAAA,GAAc,aAAa,OAAA,CAAQ,iBAAiB,MAAM,MAAA,GAAS,KAAA;AAEvF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,YAAA,EAAc;AACrC,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAIE;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO;AAAA,MAC/B,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,OAAA;AAAQ,KACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AACF;;;ACpiBO,SAAS,eAAA,CACd,KAAA,EACA,OAAA,GAKI,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,KAAA;AAAA,IACV,kBAAA,EAAoB,QAAQ,kBAAA,IAAsB,IAAA;AAAA,IAClD,KAAA,EACE,QAAQ,KAAA,KACP,OAAO,YAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,QAAA,KAAa,aAAA;AAAA;AAAA,GAEjE;AACF;AAKO,SAAS,kBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,QAAA;AAAA,IACV,kBAAA,EAAoB,KAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;AAKO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,SAAA;AAAA,IACV,kBAAA,EAAoB,IAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;AAKO,SAAS,mBAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACqB;AAC1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,QAAQ,UAAA,IAAc,OAAA;AAAA,IAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,uBAAA;AAAA,IAC9B,QAAA,EAAU,SAAA;AAAA,IACV,kBAAA,EAAoB,KAAA;AAAA,IACpB,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA;AAAA,GAE1B;AACF;;;ACxFA,IAAM,SAAA,uBAAgB,GAAA,EAAuB;AAQtC,SAAS,eAAA,CAAgB,aAAqB,MAAA,EAAoC;AACvF,EAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA,EAAG;AAC/B,IAAA,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,IAAI,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,SAAA,CAAU,IAAI,WAAW,CAAA;AAClC;AAOO,SAAS,qBAAqB,WAAA,EAAuC;AAC1E,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA;AACvC;AAMO,SAAS,eAAe,WAAA,EAA2B;AACxD,EAAA,SAAA,CAAU,OAAO,WAAW,CAAA;AAC9B;AAKO,SAAS,iBAAA,GAA0B;AACxC,EAAA,SAAA,CAAU,KAAA,EAAM;AAClB;AAMO,SAAS,uBAAuB,WAAA,EAA8B;AACnE,EAAA,OAAO,SAAA,CAAU,IAAI,WAAW,CAAA;AAClC;AAKO,SAAS,kBAAA,GAA+B;AAC7C,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA;AACpC;;;ACrDO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,OAAA,GAAe,IAAA;AACnB,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,GAAM,QAAA,CAAA;AAEhC,IAAA,IAAI,SAAA,IAAa,CAAA,IAAK,SAAA,GAAY,IAAA,EAAM;AACtC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAC,OAAA,EAAS;AACnB,MAAA,OAAA,GAAU,WAAW,MAAM;AACzB,QAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AACpB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MACvB,GAAG,SAAS,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AACF;AAKO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,OAAA,GAAe,IAAA;AAEnB,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,OAAA,GAAU,WAAW,MAAM;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,GAAG,IAAI,CAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,YAAY,KAAA,EAA+B;AACzD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtC;AAKO,SAAS,cAAc,KAAA,EAAgC;AAC5D,EAAA,IAAI,CAAC,MAAM,QAAA,IAAY,CAAC,MAAM,UAAA,IAAc,CAAC,MAAM,UAAA,EAAY;AAC7D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,aAAa,CAAA,EAAG;AAC5C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,CAAC,MAAM,SAAA,EAAW;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,eAAe,MAAA,EAG7B;AACA,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,MAAM,UAA4B,EAAC;AAEnC,EAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAKO,SAAS,aAAa,KAAA,EAA+B;AAC1D,EAAA,OAAO,IAAI,KAAK,CAAC,IAAA,CAAK,UAAU,KAAK,CAAC,CAAC,CAAA,CAAE,IAAA;AAC3C;AAKO,SAAS,aAAa,MAAA,EAAkC;AAC7D,EAAA,OAAO,MAAA,CAAO,OAAO,CAAC,KAAA,EAAO,UAAU,KAAA,GAAQ,YAAA,CAAa,KAAK,CAAA,EAAG,CAAC,CAAA;AACvE;AAKO,SAAS,aAAA,CACd,OACA,aAAA,GAA0B,CAAC,YAAY,OAAA,EAAS,QAAA,EAAU,KAAK,CAAA,EAC/C;AAChB,EAAA,MAAM,SAAA,GAAY,EAAE,GAAG,KAAA,EAAM;AAE7B,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,eAAA,GAAkB,EAAE,GAAG,SAAA,CAAU,UAAA,EAAW;AAElD,IAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC7B,MAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,QAAA,eAAA,CAAgB,GAAG,CAAA,GAAI,KAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,UAAA,GAAa,eAAA;AAAA,EACzB;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,oBAAA,CACd,mBACG,oBAAA,EACkB;AACrB,EAAA,OAAO,OAAO,MAAA,CAAO,EAAC,EAAG,cAAA,EAAgB,GAAG,oBAAoB,CAAA;AAClE;AAKO,SAAS,gBAAA,CAAiB,SAAiB,EAAA,EAAY;AAC5D,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC7E;AAKO,SAAS,QAAA,GAAoB;AAClC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAE7C,EAAA,OAAO,gEAAA,CAAiE,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAClG;AAKO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,IAAI,QAAA,KAAa,aAAA;AAClC;AAKO,SAAS,eAAA,CACd,SAAA,EACA,MAAA,GAAuC,UAAA,EAC/B;AACR,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,SAAS,CAAA;AAE/B,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC,KAAK,UAAA;AAAA,IACL;AACE,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA;AAEjC;AAKO,SAAS,UAAa,GAAA,EAAW;AACtC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AACvC;AAKO,SAAS,aAAA,CAAc,GAAA,EAAU,QAAA,GAAmB,IAAA,EAAc;AACvE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAClD,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAKO,SAAS,SAAA,CAAa,MAAc,QAAA,EAAgB;AACzD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAKO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,OAAO,IAAA,CAAK,KAAI,GAAI,SAAA;AACtB;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,mBAAA,GAA8B;AAC5C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;AAKO,SAAS,WAAA,GAAsB;AACpC,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAA;AACT;;;ACxPO,SAAS,KAAA,CAAM,WAAoB,QAAA,GAAA,CAAA,eAAgD;AACxF,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,MAAM,SAAA,GAAYC,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,iBAAiB,SAAA,IAAa,WAAA;AAGpC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AAGpD,QAAA,SAAA,EAAW,KAAA;AAAA,UAAA,QAAA;AAAA,UAET,cAAA;AAAA,UACA;AAAA,YACE,OAAA,EAAS,IAAA;AAAA,YACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACvB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,WAC3B;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAEd,QAAA,SAAA,EAAW,KAAA;AAAA,UAAA,OAAA;AAAA,UAET,GAAG,cAAc,CAAA,MAAA,CAAA;AAAA,UACjB;AAAA,YACE,OAAA,EAAS,KAAA;AAAA,YACT,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,YACvB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAC9D;AAAA,UAAA,CAAA;AAAA,SAEF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,WAAW,SAAA,EAAoB;AAC7C,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,YAAwB,IAAA,EAAa;AACtD,MAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,iBAAiB,SAAA,IAAa,WAAA;AAEpC,MAAA,SAAA,EAAW,KAAA;AAAA,QAAA,OAAA;AAAA,QAET,cAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,SAC3B;AAAA,QAAA,CAAA;AAAA,OAEF;AAEA,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,iBAAiB,UAAA,EAAqB;AACpD,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAC3C,MAAA,MAAM,kBAAkB,UAAA,IAAc,WAAA;AACtC,MAAA,MAAM,SAAA,GAAY,YAAY,GAAA,EAAI;AAElC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,IAAI,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAErC,QAAA,SAAA,EAAW,gBAAA,CAAiB,eAAA,EAAiB,QAAA,EAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,EAAI,GAAI,SAAA;AAErC,QAAA,SAAA,EAAW,gBAAA,CAAiB,eAAA,EAAiB,QAAA,EAAU,IAAA,EAAM;AAAA,UAC3D,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAED,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,WAAW,UAAA,EAAqB;AAC9C,EAAA,OAAO,SAAU,OAAA,EAAc,WAAA,EAAqB,UAAA,EAAgC;AAClF,IAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA;AAElC,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAA8B,IAAA,EAAa;AAC5D,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,MAC9C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,SAAA,GAAYA,sBAAqB,IAAI,CAAA;AAE3C,QAAA,SAAA,EAAW,UAAA;AAAA,UACT,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UACrD,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,MAAA;AAAA,UACvC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,OAAA;AAAA,UACtC;AAAA,YACE,MAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA;AAC3B,SACF;AAEA,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAKA,SAASA,sBAAqB,QAAA,EAAiC;AAE7D,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAO,QAAA,CAAS,SAAA;AAAA,EAClB;AACA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,OAAO,QAAA,CAAS,UAAA;AAAA,EAClB;AACA,EAAA,IAAK,WAAmB,aAAA,EAAe;AACrC,IAAA,OAAQ,UAAA,CAAmB,aAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,mBAAmB,SAAA,EAA4B;AAC7D,EAAC,WAAmB,aAAA,GAAgB,SAAA;AACtC;AAKO,SAAS,kBAAA,GAAuC;AACrD,EAAA,OAAQ,WAAmB,aAAA,IAAiB,IAAA;AAC9C;AC3KO,SAAS,aAAa,SAAA,EAA6B;AACxD,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,WAAA,CAAY,SAAA,EAA6B,OAAA,EAAkB,SAAA,EAAoB;AAC7F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,MAAM,OAAA,KAAY,OAAO,WAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA,CAAA;AAC/E,IAAA,MAAM,QAAQ,SAAA,KAAc,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA,CAAA;AAE/E,IAAA,SAAA,CAAU,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,SAAA,EAAW,OAAA,EAAS,SAAS,CAAC,CAAA;AACpC;AAKO,SAAS,cAAc,SAAA,EAA6B;AACzD,EAAA,OAAO,WAAA;AAAA,IACL,CACE,SAAA,EACA,SAAA,EACA,UAAA,EACA,QAAA,KACG;AACH,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,KAAA,CAAM,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF;AAKO,SAAS,cAAc,SAAA,EAA6B;AACzD,EAAA,OAAO,WAAA;AAAA,IACL,CAAC,WAAA,KAKK;AACJ,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,WAAW,WAAW,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS;AAAA,GACZ;AACF;AAKO,SAAS,gBAAgB,SAAA,EAA6B;AAC3D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC3C,QAAA,SAAA,CAAU,KAAA;AAAA,UAAA,YAAA;AAAA,UAER,YAAA;AAAA,UACA;AAAA,YACE,QAAA;AAAA,YACA,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO;AAAA,WACnE;AAAA,UAAA,CAAA;AAAA,SAEF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,uBAAuB,SAAA,EAA6B;AAClE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAGjD,IAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,QAAA,IAAY,MAAA,CAAO,WAAA,EAAa;AAC7D,MAAA,MAAM,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA;AAClC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,eAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,GAA2B,MAAA,CAAO,eAAA;AAC9D,MAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,eAAA;AAErD,MAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAC3D,MAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,YAAA,EAAc,IAAI,CAAA;AAC/D,MAAA,SAAA,CAAU,gBAAA,CAAiB,kBAAA,EAAoB,cAAA,EAAgB,IAAI,CAAA;AAAA,IACrE;AAGA,IAAA,IAAI,yBAAyB,MAAA,EAAQ;AACnC,MAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACjD,QAAA,IAAA,CAAK,UAAA,EAAW,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACnC,UAAA,IAAI,KAAA,CAAM,cAAc,UAAA,EAAY;AAClC,YAAA,SAAA,CAAU,gBAAA,CAAiB,oBAAA,EAAsB,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM;AAAA,cACrE,eAAe,KAAA,CAAM;AAAA,aACtB,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAED,MAAA,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,CAAC,UAAU,GAAG,CAAA;AAE7C,MAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,IACnC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,iBAAiB,SAAA,EAA6B;AAC5D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAEjD,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACzC,MAAA,SAAA,CAAU,UAAA,CAAW,MAAM,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,IAAA,EAAM;AAAA,QACzE,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,wBAAA,GAA2B,CAAC,KAAA,KAAiC;AACjE,MAAA,SAAA,CAAU,UAAA,CAAW,6BAAA,EAA+B,MAAA,EAAW,kBAAA,EAAoB;AAAA,QACjF,MAAA,EAAQ,MAAA,CAAO,KAAA,CAAM,MAAM;AAAA,OAC5B,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,sBAAsB,wBAAwB,CAAA;AAEtE,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,sBAAsB,wBAAwB,CAAA;AAAA,IAC3E,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAChB;AAKO,SAAS,eAAA,CACd,SAAA,EACA,OAAA,GAKI,EAAC,EACL;AACA,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,IAAA;AAAA,IAChB,iBAAA,GAAoB,IAAA;AAAA,IACpB,gBAAA,GAAmB,IAAA;AAAA,IACnB,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAGJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AACnE,MAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,KAAA,GAAQ,EAAA;AACjE,MAAA,SAAA,CAAU,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,IACpC;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,aAAa,CAAC,CAAA;AAG7B,EAAA,MAAM,YAAA,GAAe,MAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,SAAA,EAAW;AAEtC,IAAA,YAAA,CAAa,OAAA,GAAU,KAAK,GAAA,EAAI;AAEhC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,YAAA,CAAa,OAAA;AAC3C,MAAA,SAAA,CAAU,KAAA;AAAA,QAAA,YAAA;AAAA,QAER,YAAA;AAAA,QACA;AAAA,UACE,QAAA;AAAA,UACA,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO;AAAA,SACnE;AAAA,QAAA,CAAA;AAAA,OAEF;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,iBAAiB,CAAC,CAAA;AAGjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,IAAoB,CAAC,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAEtE,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,IAAI,aAAA,IAAiB,MAAA,IAAU,QAAA,IAAY,MAAA,CAAO,WAAA,EAAa;AAC7D,QAAA,MAAM,MAAA,GAAS,OAAO,WAAA,CAAY,MAAA;AAClC,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,eAAA;AAC9C,QAAA,SAAA,CAAU,gBAAA,CAAiB,gBAAA,EAAkB,QAAA,EAAU,IAAI,CAAA;AAAA,MAC7D;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,UAAU,CAAA;AAC1C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAGhC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAEjE,IAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAsB;AACzC,MAAA,SAAA,CAAU,UAAA,CAAW,MAAM,OAAA,EAAS,KAAA,CAAM,OAAO,KAAA,EAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IAC3E,CAAA;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,WAAW,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAC7B;;;ACzNO,IAAM,iBAAA,GAAoB","file":"index.mjs","sourcesContent":["/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = `${Date.now()}_${Math.random()}`;\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log(`Debug mode changed: ${e.detail.enabled ? 'enabled' : 'disabled'}`);\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = `temp_${Date.now()}_${Math.random()}`;\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return `${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log(`[Analytics] ${message}`, data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`;\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n `${finalEventName}_error`,\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n if ((globalThis as any).__analytics__) {\n return (globalThis as any).__analytics__;\n }\n return null;\n}\n\n/**\n * 设置全局 Analytics 实例\n */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n (globalThis as any).__analytics__ = analytics;\n}\n\n/**\n * 获取全局 Analytics 实例\n */\nexport function getGlobalAnalytics(): Analytics | null {\n return (globalThis as any).__analytics__ || null;\n}\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n *\n * 注意:此模块不包含平台特定的适配器(web/mobile/desktop/miniapp)\n * 如需使用平台适配器,请在项目中自行实现\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qhr123/sa2kit",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "A modern, type-safe React utility library with cross-platform support",
5
5
  "keywords": [
6
6
  "react",