@anker-in/analysis 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -74,6 +74,31 @@ trackByTags({
74
74
  });
75
75
  ```
76
76
 
77
+ ### useDataTrack Hook 使用
78
+
79
+ ```tsx
80
+ import { useDataTrack } from "@anker-in/analysis";
81
+
82
+ function ProductPage({ product }) {
83
+ // 自动追踪带有 data-track 属性的元素点击事件
84
+ useDataTrack({
85
+ trackTags: {
86
+ 'add-to-cart': ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],
87
+ 'checkout': ['fbq:checkout:1234567890']
88
+ },
89
+ type: 'product',
90
+ product: product
91
+ });
92
+
93
+ return (
94
+ <div>
95
+ <button data-track="add-to-cart">Add to Cart</button>
96
+ <button data-track="checkout">Checkout</button>
97
+ </div>
98
+ );
99
+ }
100
+ ```
101
+
77
102
  ### Pixels 组件使用
78
103
 
79
104
  ```tsx
@@ -143,6 +168,33 @@ trackByTags({
143
168
  });
144
169
  ```
145
170
 
171
+ ### useDataTrack(options)
172
+
173
+ 自动追踪带有 `data-track` 属性的元素点击事件的 React Hook。
174
+
175
+ **参数:**
176
+
177
+ ```typescript
178
+ useDataTrack({
179
+ trackTags?: Record<string, string[]>, // 埋点标签映射对象
180
+ type?: string, // 类型标识,当为 'product' 时会从 product 中获取额外的 trackTags
181
+ product?: {
182
+ variants?: Array<{
183
+ metafields?: {
184
+ trackTags?: Record<string, string[]>
185
+ }
186
+ }>
187
+ }
188
+ });
189
+ ```
190
+
191
+ **特性:**
192
+
193
+ - 自动向上查找最多 3 层父元素,寻找带有 `data-track` 属性的元素
194
+ - 支持从产品 metafields 中合并额外的 trackTags(当 `type='product'` 时)
195
+ - 自动将 trackTags 缓存到 sessionStorage
196
+ - 组件卸载时自动清理事件监听器
197
+
146
198
  ### Pixels 组件
147
199
 
148
200
  #### GtagPixel
@@ -193,6 +245,7 @@ import type {
193
245
  MetaTrackParams,
194
246
  TrackByTagsData,
195
247
  TrackByTagsParams,
248
+ UseDataTrackOptions,
196
249
  PlatformType,
197
250
  // ... 更多类型
198
251
  } from "@anker-in/analysis";
package/dist/index.cjs CHANGED
@@ -49,6 +49,7 @@ __export(index_exports, {
49
49
  triggerTrackBatch: () => triggerTrackBatch,
50
50
  updateScriptType: () => updateScriptType,
51
51
  updateScriptsType: () => updateScriptsType,
52
+ useDataTrack: () => useDataTrack,
52
53
  useTracking: () => useTracking,
53
54
  withTracking: () => withTracking
54
55
  });
@@ -597,8 +598,44 @@ function useTracking(config) {
597
598
  }
598
599
  __name(useTracking, "useTracking");
599
600
 
600
- // src/pixels/GtagPixel.tsx
601
+ // src/autoTrack/useDataTrack.ts
601
602
  var import_react = require("react");
603
+ function useDataTrack({ trackTags }) {
604
+ (0, import_react.useEffect)(() => {
605
+ const handleTrackClick = /* @__PURE__ */ __name((e) => {
606
+ logger.log("click", e.target);
607
+ let target = e.target;
608
+ let trackValue = null;
609
+ for (let i = 0; i <= 3; i++) {
610
+ if (!target) break;
611
+ trackValue = target.getAttribute("data-track");
612
+ if (trackValue) break;
613
+ target = target.parentElement;
614
+ }
615
+ if (!trackValue) return;
616
+ const tags = trackTags?.[trackValue] || [];
617
+ if (!tags.length) {
618
+ logger.warn(`No tags found for data-track="${trackValue}"`);
619
+ return;
620
+ }
621
+ trackByTags({ tags });
622
+ }, "handleTrackClick");
623
+ try {
624
+ sessionStorage.setItem("trackTags", JSON.stringify(trackTags));
625
+ trackByTags({ tags: trackTags?.["pageView"] || [] });
626
+ } catch (error) {
627
+ logger.error("Failed to save trackTags to sessionStorage:", error);
628
+ }
629
+ document.body.addEventListener("click", handleTrackClick);
630
+ return () => {
631
+ document.body.removeEventListener("click", handleTrackClick);
632
+ };
633
+ }, [trackTags]);
634
+ }
635
+ __name(useDataTrack, "useDataTrack");
636
+
637
+ // src/pixels/GtagPixel.tsx
638
+ var import_react2 = require("react");
602
639
  var import_script = __toESM(require("next/script"));
603
640
  var import_jsx_runtime = require("react/jsx-runtime");
604
641
  var GtagPixel = /* @__PURE__ */ __name((props) => {
@@ -609,13 +646,13 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
609
646
  onPixelLoaded,
610
647
  ...scriptProps
611
648
  } = props;
612
- const pixelIdsKey = (0, import_react.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
613
- const pixelIdsArray = (0, import_react.useMemo)(
649
+ const pixelIdsKey = (0, import_react2.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
650
+ const pixelIdsArray = (0, import_react2.useMemo)(
614
651
  () => Array.isArray(pixelIds) ? pixelIds : [pixelIds],
615
652
  [pixelIdsKey]
616
653
  );
617
- const onLoadRef = (0, import_react.useRef)(onPixelLoaded);
618
- (0, import_react.useEffect)(() => {
654
+ const onLoadRef = (0, import_react2.useRef)(onPixelLoaded);
655
+ (0, import_react2.useEffect)(() => {
619
656
  onLoadRef.current = onPixelLoaded;
620
657
  }, [onPixelLoaded]);
621
658
  const initializeGtag = /* @__PURE__ */ __name((pixelId) => {
@@ -635,7 +672,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
635
672
  console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);
636
673
  }
637
674
  }, "initializeGtag");
638
- (0, import_react.useEffect)(() => {
675
+ (0, import_react2.useEffect)(() => {
639
676
  if (!cookieConsentEnabled || typeof window === "undefined") return;
640
677
  if (typeof window.gtag !== "undefined" || typeof window.dataLayer !== "undefined") {
641
678
  console.log("\u2705 Gtag already available");
@@ -683,7 +720,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
683
720
  var GtagPixel_default = GtagPixel;
684
721
 
685
722
  // src/pixels/MetaPixel.tsx
686
- var import_react2 = require("react");
723
+ var import_react3 = require("react");
687
724
  var import_script2 = __toESM(require("next/script"));
688
725
  var import_jsx_runtime2 = (
689
726
  // 添加 cookieConsentEnabled 条件
@@ -697,16 +734,16 @@ var MetaPixel = /* @__PURE__ */ __name((props) => {
697
734
  onPixelLoaded,
698
735
  ...scriptProps
699
736
  } = props;
700
- const pixelIdsKey = (0, import_react2.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
701
- const pixelIdsArray = (0, import_react2.useMemo)(
737
+ const pixelIdsKey = (0, import_react3.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
738
+ const pixelIdsArray = (0, import_react3.useMemo)(
702
739
  () => Array.isArray(pixelIds) ? pixelIds : [pixelIds],
703
740
  [pixelIdsKey]
704
741
  );
705
- const onLoadRef = (0, import_react2.useRef)(onPixelLoaded);
706
- (0, import_react2.useEffect)(() => {
742
+ const onLoadRef = (0, import_react3.useRef)(onPixelLoaded);
743
+ (0, import_react3.useEffect)(() => {
707
744
  onLoadRef.current = onPixelLoaded;
708
745
  }, [onPixelLoaded]);
709
- (0, import_react2.useEffect)(() => {
746
+ (0, import_react3.useEffect)(() => {
710
747
  if (!cookieConsentEnabled || typeof window === "undefined") return;
711
748
  if (typeof window.fbq !== "undefined") {
712
749
  console.log("\u2705 window.fbq already available");
@@ -821,6 +858,7 @@ var index_default = {
821
858
  triggerTrackBatch,
822
859
  updateScriptType,
823
860
  updateScriptsType,
861
+ useDataTrack,
824
862
  useTracking,
825
863
  withTracking
826
864
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/helpers/logger.ts","../src/core/helpers/script-loader.ts","../src/core/helpers/function-utils.ts","../src/core/helpers/platform-detector.ts","../src/constants/tagsMap.ts","../src/autoTrack/trackByTags.ts","../src/core/helpers/triggerTrack.ts","../src/core/adapters/gtag.ts","../src/core/adapters/meta.ts","../src/core/tracking/dispatcher.ts","../src/core/tracking/with-tracking.ts","../src/pixels/GtagPixel.tsx","../src/pixels/MetaPixel.tsx","../src/pixels/PixelsManager.tsx"],"sourcesContent":["/**\n * Analysis SDK - 埋点 SDK 主入口\n *\n * 提供统一的埋点接口,支持多平台埋点上报\n */\n\n// ============= 默认导出 =============\n\nimport { track } from \"./core/tracking\";\nimport { trackByTags } from \"./autoTrack/trackByTags\";\nimport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\nimport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= 核心功能 =============\n\nexport { track } from \"./core/tracking\";\nexport { gtagTrack } from \"./core/adapters\";\nexport { metaTrack } from \"./core/adapters\";\n\n// ============= 高阶函数 - 无侵入式埋点 =============\n\nexport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= TrackByTags 功能 =============\n\nexport { trackByTags } from \"./autoTrack/trackByTags\";\n\n// ============= TriggerTrack 功能 =============\n\nexport {\n triggerTrack,\n triggerTrackBatch,\n setTrackTags,\n clearTrackTags,\n hasTrackPoint,\n} from \"./core/helpers/triggerTrack\";\n\n// ============= 工具函数 =============\n\nexport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\n\n// ============= Pixels 组件 =============\n\nexport { GtagPixel, MetaPixel, PixelsManager } from \"./pixels\";\n\n// ============= 常量 =============\n\nexport { TrackTagsVersionMap } from \"./constants\";\n\n// ============= 类型定义 =============\n\n// 导出所有通用类型\nexport type {\n PlatformType,\n TrackEventType,\n BasePlatformConfig,\n PixelsManagerConfig,\n GtagConfig,\n MetaPixelConfig,\n TikTokPixelConfig,\n ScarabConfig,\n AnalysisConfig,\n TrackParams,\n Tracker,\n AutoTrackConfig,\n Currency,\n TrackConfig,\n GtagEventName,\n GtagTrackParams,\n GtagConfigParams,\n MetaTrackParams,\n TrackByTagsData,\n TrackByTagsParams,\n ParsedTag,\n} from \"./types\";\n\n// 导出工具函数类型\nexport type { UpdateScriptTypeOptions } from \"./core/helpers\";\n\n// 导出 TriggerTrack 类型\nexport type {\n TrackTagsConfig,\n TriggerTrackOptions,\n} from \"./core/helpers/triggerTrack\";\n\nexport default {\n track,\n trackByTags,\n withTracking,\n useTracking,\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n};\n","/**\n * 日志工具模块\n * 提供统一的日志记录功能\n */\n\n/**\n * 创建日志工具\n */\nexport function createLogger(initialEnabled = false) {\n let enabled = initialEnabled;\n\n return {\n setEnabled(value: boolean) {\n enabled = value;\n },\n\n log(...args: any[]) {\n if (enabled) {\n console.log(\"[Analysis SDK]\", ...args);\n }\n },\n\n warn(...args: any[]) {\n if (enabled) {\n console.warn(\"[Analysis SDK]\", ...args);\n }\n },\n\n error(...args: any[]) {\n if (enabled) {\n console.error(\"[Analysis SDK]\", ...args);\n }\n },\n };\n}\n\n// 全局 logger 实例\nexport const logger = createLogger();\n","/**\n * 脚本加载和管理模块\n * 提供动态加载和控制第三方脚本的能力\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 加载外部脚本\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // 检查是否已加载\n if (id && document.getElementById(id)) {\n logger.log(`Script ${id} already loaded`);\n resolve();\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = src;\n script.async = true;\n if (id) {\n script.id = id;\n }\n\n script.onload = () => {\n logger.log(`Script loaded: ${src}`);\n resolve();\n };\n\n script.onerror = () => {\n logger.error(`Failed to load script: ${src}`);\n reject(new Error(`Failed to load script: ${src}`));\n };\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * 更新脚本的 type 属性配置\n */\nexport interface UpdateScriptTypeOptions {\n /** 脚本元素的 ID */\n id: string;\n /** 是否启用脚本 */\n enabled: boolean;\n /** 是否在启用时重新执行脚本内容 */\n executeOnEnable?: boolean;\n /** 错误处理回调 */\n onError?: (error: Error) => void;\n}\n\n/**\n * 动态更新脚本的 type 属性\n * 用于根据 cookie consent 状态动态启用/禁用脚本\n *\n * @param options - 配置选项\n * @returns 是否成功更新\n */\nexport function updateScriptType(options: UpdateScriptTypeOptions): boolean {\n const { id, enabled, executeOnEnable = true, onError } = options;\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const scriptElement = document.getElementById(id);\n if (!scriptElement) {\n logger.warn(`Script element with id \"${id}\" not found`);\n return false;\n }\n\n const newType = enabled ? \"text/javascript\" : \"text/plain\";\n const currentType = scriptElement.getAttribute(\"type\");\n\n // 如果从 text/plain 变为 text/javascript,需要重新执行脚本\n if (\n executeOnEnable &&\n currentType === \"text/plain\" &&\n newType === \"text/javascript\"\n ) {\n scriptElement.setAttribute(\"type\", newType);\n\n // 重新执行脚本内容\n const scriptContent = scriptElement.innerHTML;\n if (scriptContent && typeof window.eval === \"function\") {\n try {\n window.eval(scriptContent);\n logger.log(`Script \"${id}\" executed successfully`);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n logger.error(`Script \"${id}\" execution error:`, error);\n if (onError) {\n onError(error);\n }\n }\n }\n } else {\n scriptElement.setAttribute(\"type\", newType);\n }\n\n return true;\n}\n\n/**\n * 批量更新多个脚本的 type 属性\n *\n * @param scriptIds - 脚本 ID 数组或生成 ID 的函数\n * @param enabled - 是否启用脚本\n * @param executeOnEnable - 是否在启用时重新执行脚本内容\n * @returns 成功更新的脚本数量\n */\nexport function updateScriptsType(\n scriptIds: string[] | ((index: number) => string),\n enabled: boolean,\n executeOnEnable = true\n): number {\n if (typeof window === \"undefined\") {\n return 0;\n }\n\n let successCount = 0;\n const ids = Array.isArray(scriptIds)\n ? scriptIds\n : Array.from({ length: 100 }, (_, i) => scriptIds(i)).filter((id) =>\n document.getElementById(id)\n );\n\n ids.forEach((id) => {\n const success = updateScriptType({\n id,\n enabled,\n executeOnEnable,\n });\n if (success) {\n successCount++;\n }\n });\n\n logger.log(`Updated ${successCount}/${ids.length} scripts`);\n return successCount;\n}\n","/**\n * 函数工具模块\n * 提供防抖、节流、安全执行等通用函数工具\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function (this: any, ...args: Parameters<T>) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastTime = 0;\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n if (now - lastTime >= delay) {\n lastTime = now;\n fn.apply(this, args);\n }\n };\n}\n\n/**\n * 安全执行函数,捕获错误\n */\nexport function safeExecute<T>(\n fn: () => T,\n errorMessage?: string\n): T | undefined {\n try {\n return fn();\n } catch (error) {\n logger.error(errorMessage || \"Error executing function:\", error);\n return undefined;\n }\n}\n","/**\n * 平台检测模块\n * 检测各个埋点平台的可用性\n */\n\nimport type { PlatformType } from \"../../types\";\n\n/**\n * 检测指定平台是否可用\n */\nexport const isPlatformAvailable = (platform: PlatformType): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n switch (platform) {\n case \"gtag\":\n return (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n );\n case \"meta\":\n return typeof window.fbq !== \"undefined\";\n default:\n return false;\n }\n};\n\n/**\n * 检测所有可用的平台\n */\nexport const detectAvailablePlatforms = (): PlatformType[] => {\n const platforms: PlatformType[] = [\"gtag\", \"meta\"];\n return platforms.filter((platform) => isPlatformAvailable(platform));\n};\n","/**\n * 标签版本映射表\n * 用于兼容旧版本标签,将旧事件名映射到新事件名\n */\nexport const TrackTagsVersionMap = {\n \"fbq:act\": \"fbq:atc\",\n \"gtag:conversion\": \"gtag:atc\",\n} as const;\n","import { track } from \"../core/tracking\";\nimport { logger } from \"../core/helpers\";\nimport type { TrackConfig, ParsedTag, TrackByTagsParams } from \"../types\";\nimport { TrackTagsVersionMap } from \"../constants\";\n\n/**\n * 解析单个标签\n */\nfunction parseTag(tag: string): ParsedTag | null {\n const parts = tag.split(\":\");\n\n if (parts.length < 2) {\n return null;\n }\n\n return {\n media: parts[0]?.toLowerCase() || \"\",\n event: parts[1]?.toLowerCase() || \"\",\n target: parts[2] || null,\n };\n}\n\n/**\n * 适配事件名称(版本兼容)\n * 将旧版本的事件名替换为新版本的事件名\n */\nfunction adaptEventName(tags: string[]): void {\n for (let i = 0; i < tags.length; i++) {\n if (!tags[i]) {\n continue;\n }\n for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {\n if (tags[i]?.includes(oldEvent)) {\n tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? \"\";\n break;\n }\n }\n }\n}\n\n/**\n * 处理单个标签的埋点\n */\nfunction handleTagTracking(\n parsedTag: ParsedTag,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventData?: Record<string, any>\n): void {\n const { media, event, target } = parsedTag;\n\n if (!target) {\n logger.warn(`Tag missing target: ${media}:${event}`);\n return;\n }\n\n try {\n switch (media) {\n case \"fbq\":\n case \"meta\": {\n // Meta Pixel 埋点\n const config: TrackConfig<\"meta\"> = {\n platform: \"meta\",\n event: target, // target 作为事件名\n data: eventData,\n };\n track(config);\n break;\n }\n\n case \"gtag\": {\n // Gtag 转化事件埋点\n const config: TrackConfig<\"gtag\"> = {\n platform: \"gtag\",\n eventName: \"conversion\",\n send_to: target, // target 作为转化目标ID\n value: eventData?.value ?? 1.0,\n currency: eventData?.currency,\n transactionId: eventData?.transactionId,\n };\n track(config);\n break;\n }\n\n default:\n logger.warn(`Unsupported media platform: ${media}`);\n }\n } catch (error) {\n logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);\n }\n}\n\n/**\n * 基于标签进行埋点上报(简化版)\n *\n * @param tags - 标签数组,格式: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123']\n * @param data - 事件数据数组,包含事件相关的额外数据\n *\n * @example\n * ```typescript\n * trackByTags({\n * tags: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],\n * data: [{ event: 'custom' }]\n * });\n * ```\n */\nexport function trackByTags({ tags, data }: TrackByTagsParams): void {\n if (!tags || tags.length === 0) {\n logger.warn(\"trackByTags: tags array is empty\");\n return;\n }\n\n // 数据清洗:兼容旧版本标签\n const adaptedTags = [...tags];\n adaptEventName(adaptedTags);\n\n // 获取事件数据(如果提供了 data)\n const firstData = data && data.length > 0 ? data[0] : undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { event, ...trackingData } = firstData || {};\n\n // 直接处理所有标签,不再过滤\n adaptedTags.forEach((tag) => {\n const parsed = parseTag(tag);\n\n if (!parsed) {\n logger.warn(`trackByTags: Invalid tag format: ${tag}`);\n return;\n }\n\n handleTagTracking(parsed, trackingData);\n });\n}\n","/**\n * 触发埋点上报工具\n *\n * 从 sessionStorage 读取 trackTags 配置,并根据 trackPoint 触发对应的埋点上报\n */\n\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport { logger } from \"./logger\";\n\n/**\n * TrackTags 配置类型\n * key: trackPoint 标识\n * value: 标签数组\n */\nexport interface TrackTagsConfig {\n [trackPoint: string]: string[];\n}\n\n/**\n * 埋点触发选项\n */\nexport interface TriggerTrackOptions {\n tags?: Array<string>;\n /** 自定义事件数据 */\n eventData?: Record<string, unknown>;\n /** 自定义存储键名,默认为 'trackTags' */\n storageKey?: string;\n /** 是否静默失败(不输出警告日志),默认为 false */\n silent?: boolean;\n}\n\n/**\n * 从 sessionStorage 获取 trackTags 配置\n *\n * @param storageKey - 存储键名\n * @returns TrackTags 配置对象,获取失败返回 null\n */\nfunction getTrackTagsFromStorage(storageKey: string): TrackTagsConfig | null {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return null;\n }\n\n try {\n const trackTagsRaw = sessionStorage.getItem(storageKey);\n\n if (!trackTagsRaw) {\n return null;\n }\n\n const trackTags = JSON.parse(trackTagsRaw);\n\n if (!trackTags || typeof trackTags !== \"object\") {\n logger.warn(\n `Invalid trackTags format in sessionStorage key: ${storageKey}`\n );\n return null;\n }\n\n return trackTags as TrackTagsConfig;\n } catch (error) {\n logger.error(`Failed to parse trackTags from sessionStorage:`, error);\n return null;\n }\n}\n\n/**\n * 触发埋点上报\n *\n * 从 sessionStorage 读取 trackTags 配置,根据 trackPoint 获取对应的标签数组,\n * 然后调用 trackByTags 进行埋点上报。\n *\n * @param trackPoint - 埋点标识,对应 trackTags 中的 key\n * @param options - 可选配置项\n *\n * @example\n * ```typescript\n * // 基础用法\n * triggerTrack('add_to_cart');\n *\n * // 带自定义数据\n * triggerTrack('purchase', {\n * eventData: {\n * value: 99.99,\n * currency: 'USD',\n * transactionId: 'ORDER-123'\n * }\n * });\n *\n * // 使用自定义存储键\n * triggerTrack('custom_event', {\n * storageKey: 'customTrackTags'\n * });\n * ```\n */\nexport function triggerTrack(\n trackPoint: string,\n options: TriggerTrackOptions = {}\n): void {\n const {\n tags,\n eventData = {},\n storageKey = \"trackTags\",\n silent = false,\n } = options;\n\n // 1. 验证 trackPoint\n if (!trackPoint || typeof trackPoint !== \"string\") {\n if (!silent) {\n logger.warn(\"triggerTrack: trackPoint is required and must be a string\");\n }\n return;\n }\n\n // 2. 从 sessionStorage 获取 trackTags\n const trackTagsRow = getTrackTagsFromStorage(storageKey);\n\n if (!trackTagsRow) {\n if (!silent) {\n logger.warn(\n `triggerTrack: trackTags not found in sessionStorage (key: ${storageKey})`\n );\n }\n return;\n }\n\n // 3. 根据 trackPoint 获取对应的 tags\n const trackTags = tags || trackTagsRow[trackPoint];\n\n if (!trackTags) {\n if (!silent) {\n logger.warn(`triggerTrack: No tags found for trackPoint: ${trackPoint}`);\n }\n return;\n }\n\n if (!Array.isArray(trackTags)) {\n if (!silent) {\n logger.warn(\n `triggerTrack: Tags for trackPoint \"${trackPoint}\" is not an array`\n );\n }\n return;\n }\n\n if (trackTags.length === 0) {\n if (!silent) {\n logger.log(\n `triggerTrack: Tags array is empty for trackPoint: ${trackPoint}`\n );\n }\n return;\n }\n\n // 4. 触发埋点\n try {\n trackByTags({\n tags: trackTags,\n data: [{ event: \"custom\", ...eventData }],\n });\n\n logger.log(\n `triggerTrack: Successfully triggered for trackPoint: ${trackPoint}`,\n {\n tagsCount: trackTags.length,\n trackTags,\n }\n );\n } catch (error) {\n logger.error(\n `triggerTrack: Failed to track for trackPoint: ${trackPoint}`,\n error\n );\n }\n}\n\n/**\n * 批量触发多个埋点\n *\n * @param trackPoints - 埋点标识数组\n * @param options - 可选配置项(应用到所有埋点)\n *\n * @example\n * ```typescript\n * // 批量触发多个埋点\n * triggerTrackBatch(['view_item', 'add_to_cart']);\n *\n * // 带共享的事件数据\n * triggerTrackBatch(['event1', 'event2'], {\n * eventData: { sessionId: '12345' }\n * });\n * ```\n */\nexport function triggerTrackBatch(\n trackPoints: string[],\n options: TriggerTrackOptions = {}\n): void {\n if (!Array.isArray(trackPoints)) {\n logger.warn(\"triggerTrackBatch: trackPoints must be an array\");\n return;\n }\n\n trackPoints.forEach((trackPoint) => {\n triggerTrack(trackPoint, options);\n });\n}\n\n/**\n * 设置 trackTags 到 sessionStorage\n *\n * @param trackTags - TrackTags 配置对象\n * @param storageKey - 存储键名,默认为 'trackTags'\n *\n * @example\n * ```typescript\n * setTrackTags({\n * 'add_to_cart': ['fbq:atc:123456', 'gtag:atc:AW-123/abc'],\n * 'purchase': ['fbq:purchase:123456', 'gtag:purchase:AW-123/xyz']\n * });\n * ```\n */\nexport function setTrackTags(\n trackTags: TrackTagsConfig,\n storageKey: string = \"trackTags\"\n): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return;\n }\n\n try {\n const trackTagsJson = JSON.stringify(trackTags);\n sessionStorage.setItem(storageKey, trackTagsJson);\n logger.log(\n `setTrackTags: Successfully saved to sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"setTrackTags: Failed to save to sessionStorage\", error);\n }\n}\n\n/**\n * 清除 trackTags\n *\n * @param storageKey - 存储键名,默认为 'trackTags'\n */\nexport function clearTrackTags(storageKey: string = \"trackTags\"): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n return;\n }\n\n try {\n sessionStorage.removeItem(storageKey);\n logger.log(\n `clearTrackTags: Successfully removed from sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"clearTrackTags: Failed to remove from sessionStorage\", error);\n }\n}\n\n/**\n * 检查某个 trackPoint 是否存在\n *\n * @param trackPoint - 埋点标识\n * @param storageKey - 存储键名,默认为 'trackTags'\n * @returns 是否存在对应的标签配置\n */\nexport function hasTrackPoint(\n trackPoint: string,\n storageKey: string = \"trackTags\"\n): boolean {\n const trackTags = getTrackTagsFromStorage(storageKey);\n\n if (!trackTags) {\n return false;\n }\n\n const tags = trackTags[trackPoint];\n return Array.isArray(tags) && tags.length > 0;\n}\n","/**\n * Google Analytics / gtag.js 适配器\n * 使用标准的 window.gtag() API\n * 专注于转化事件追踪\n */\n\n/**\n * gtag 命令类型\n */\ntype GtagCommand = \"config\" | \"event\" | \"set\" | \"get\";\n\n/**\n * gtag 埋点函数\n * 调用 window.gtag() 标准 API\n */\nexport const gtagTrack = (\n command: GtagCommand,\n targetOrEventName: string,\n params?: Record<string, any>\n): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n // 确保 gtag 函数存在\n if (typeof window.gtag !== \"function\") {\n console.warn(\"gtag is not available. Please load gtag.js first.\");\n return;\n }\n\n try {\n window.gtag(command, targetOrEventName, params);\n } catch (error) {\n console.error(\"gtagTrack error:\", error);\n }\n};\n\n/**\n * 发送 gtag 事件\n */\nexport const gtagEvent = (\n eventName: string,\n eventParams?: Record<string, any>\n): void => {\n gtagTrack(\"event\", eventName, eventParams);\n};\n\n/**\n * 发送 gtag config\n */\nexport const gtagConfig = (\n measurementId: string,\n configParams?: Record<string, any>\n): void => {\n gtagTrack(\"config\", measurementId, configParams);\n};\n\n/**\n * 检测 gtag 是否可用\n */\nexport const isGtagAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.gtag === \"function\";\n};\n\n/**\n * gtag 适配器对象\n */\nexport const gtagAdapter = {\n track: gtagTrack,\n event: gtagEvent,\n config: gtagConfig,\n isAvailable: isGtagAvailable,\n};\n","/**\n * Meta Pixel 适配器\n * 提供 Facebook/Meta Pixel 的埋点功能\n */\n\n/**\n * Meta Pixel 埋点函数\n */\nexport const metaTrack = (event: string, data?: object): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n if (typeof window.fbq !== \"undefined\") {\n try {\n if (data) {\n window.fbq(\"track\", event, data);\n } else {\n window.fbq(\"track\", event);\n }\n } catch (error) {\n console.log(\"fbqTrack error\", error);\n }\n }\n};\n\n/**\n * 检测 Meta Pixel 是否可用\n */\nexport const isMetaAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.fbq !== \"undefined\";\n};\n\n/**\n * Meta Pixel 适配器对象\n */\nexport const metaAdapter = {\n track: metaTrack,\n isAvailable: isMetaAvailable,\n};\n","/**\n * 埋点调度器模块\n * 负责根据平台类型分发事件到对应的适配器\n */\n\nimport type { PlatformType } from \"../../types\";\nimport type {\n TrackConfig,\n GtagTrackParams,\n MetaTrackParams,\n} from \"../../types\";\nimport { isPlatformAvailable, logger } from \"../helpers\";\nimport { gtagEvent, gtagConfig } from \"../adapters/gtag\";\nimport { metaTrack } from \"../adapters/meta\";\n\nfunction track(config: TrackConfig<\"gtag\">): void;\nfunction track(config: TrackConfig<\"meta\">): void;\n\nfunction track<P extends PlatformType>(config: TrackConfig<P>): void {\n const { platform, ...params } = config;\n\n if (!isPlatformAvailable(platform)) {\n logger.warn(`Platform ${platform} is not available`);\n return;\n }\n\n try {\n switch (platform) {\n case \"gtag\": {\n const gtagParams = params as unknown as GtagTrackParams;\n handleGtagTrack(gtagParams);\n break;\n }\n\n case \"meta\": {\n const metaParams = params as unknown as MetaTrackParams;\n handleMetaTrack(metaParams);\n break;\n }\n\n default:\n logger.warn(`Unsupported platform: ${platform}`);\n }\n } catch (error) {\n logger.error(`Failed to track on platform ${platform}:`, error);\n }\n}\n\n/**\n * 处理 Gtag 埋点(转化事件)\n */\nfunction handleGtagTrack(params: GtagTrackParams): void {\n const { eventName, measurementId, ...restParams } = params;\n\n // 如果有 measurementId,先发送 config\n if (measurementId) {\n gtagConfig(measurementId, {});\n }\n\n // 构建事件参数\n const eventParams: Record<string, any> = { ...restParams };\n\n // 处理 transactionId -> transaction_id 转换\n if (eventParams.transactionId && !eventParams.transaction_id) {\n eventParams.transaction_id = eventParams.transactionId;\n delete eventParams.transactionId;\n }\n\n // 发送转化事件\n gtagEvent(eventName, eventParams);\n\n logger.log(`Gtag conversion tracked: ${eventName}`, eventParams);\n}\n\n/**\n * 处理 Meta Pixel 埋点\n */\nfunction handleMetaTrack(params: {\n event: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: Record<string, any>;\n}): void {\n const { event, data } = params;\n\n if (!event) {\n logger.warn(\"Meta Pixel event name is required\");\n return;\n }\n\n metaTrack(event, data);\n logger.log(`Meta Pixel event tracked: ${event}`, data);\n}\n\nexport default track;\nexport { track };\n","/**\n * 埋点装饰器模块\n * 提供函数包装器和 React Hooks,为业务函数添加埋点能力\n */\n\nimport { track } from \"./dispatcher\";\nimport { logger, debounce, throttle } from \"../helpers\";\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport type {\n TrackConfig,\n PlatformType,\n WithTrackingConfig,\n} from \"../../types\";\n\n/**\n * 执行埋点上报\n */\nfunction executeTracking<P extends PlatformType>(\n trackPoint?: string,\n trackConfig?: TrackConfig<P> | TrackConfig<P>[]\n): void {\n const configs = Array.isArray(trackConfig)\n ? trackConfig\n : [trackConfig ?? {}];\n\n configs.forEach((config) => {\n try {\n track(config as any);\n } catch (error) {\n logger.error(\"withTracking: 埋点执行失败\", error);\n }\n });\n if (\n typeof window !== \"undefined\" &&\n !!trackPoint &&\n (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"]?.length > 0\n ) {\n trackByTags({\n tags: (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"] ?? [],\n data: [{ event: \"custom\" }],\n });\n }\n}\n\nexport function withTracking<T extends (...args: any[]) => any>(\n fn: T,\n config: WithTrackingConfig\n): T {\n const {\n trackConfig,\n timing = \"after\",\n condition,\n trackOnError = false,\n errorTrackConfig,\n debounce: debounceTime,\n throttle: throttleTime,\n trackPoint,\n } = config;\n\n // 核心包装函数\n function wrappedFunction(...args: Parameters<T>): ReturnType<T> {\n // 条件检查\n if (condition && !condition(args)) {\n return fn(...args);\n }\n\n // 生成埋点配置\n const getTrackConfig = (result?: any) => {\n return typeof trackConfig === \"function\"\n ? trackConfig(args, result)\n : trackConfig;\n };\n\n // Before 时机\n if (timing === \"before\" || timing === \"both\") {\n const config = getTrackConfig();\n executeTracking(trackPoint, config);\n }\n\n // 执行原函数\n try {\n const result = fn(...args);\n\n // 处理异步函数\n if (result instanceof Promise) {\n return result\n .then((resolvedResult) => {\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(resolvedResult);\n executeTracking(trackPoint, config);\n }\n return resolvedResult;\n })\n .catch((error) => {\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error, args));\n }\n throw error;\n }) as ReturnType<T>;\n }\n\n // 同步函数 After 时机\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(result);\n executeTracking(trackPoint, config);\n }\n\n return result;\n } catch (error) {\n // 错误时上报\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error as Error, args));\n }\n throw error;\n }\n }\n\n if (typeof window !== \"undefined\" && !!trackPoint) {\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has(\"TRACK_DEV\")) {\n return ((...args) => {\n window.open(\n `http://localhost:3002/tracking?trackPoint=${trackPoint}`,\n \"_blank\"\n );\n }) as T;\n }\n }\n\n // 应用防抖/节流\n if (debounceTime) {\n return debounce(wrappedFunction, debounceTime) as T;\n }\n\n if (throttleTime) {\n return throttle(wrappedFunction, throttleTime) as T;\n }\n\n // __TRACK_POINT_MARKER__(trackPoint);\n\n return wrappedFunction as T;\n}\n\n// 定义标记函数(仅用于 AST 识别)\nfunction __TRACK_POINT_MARKER__(trackPoint?: string) {\n // 空函数,仅用于 AST 标记\n}\n\n/**\n * React Hooks 专用\n *\n * 为 React 组件提供埋点 Hook\n *\n * @example\n * ```typescript\n * function ProductCard({ product }) {\n * const trackAddToCart = useTracking({\n * trackConfig: {\n * platform: \"gtag\",\n * eventName: \"add_to_cart\"\n * }\n * });\n *\n * const handleClick = () => {\n * trackAddToCart(() => {\n * addToCart(product.id);\n * });\n * };\n *\n * return <button onClick={handleClick}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useTracking(config: WithTrackingConfig) {\n return <T extends (...args: any[]) => any>(fn: T) => {\n return withTracking(fn, config);\n };\n}\n","import type { GtagConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface GtagPixelProps\n extends GtagConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst GtagPixel = (props: GtagPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onPixelLoaded,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // Gtag 初始化函数\n const initializeGtag = (pixelId: string) => {\n try {\n window.dataLayer = window.dataLayer || [];\n if (typeof window.gtag !== \"function\") {\n window.gtag = function gtag() {\n window.dataLayer!.push(arguments);\n };\n }\n window.gtag(\"js\", new Date());\n window.gtag(\"config\", pixelId, {\n allow_enhanced_conversions: true,\n });\n console.log(`✅ GtagPixel ${pixelId} initialized`);\n } catch (error) {\n console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);\n }\n };\n\n // 检测 gtag 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 gtag 或 dataLayer 已存在,立即初始化\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag already available\");\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n return;\n }\n\n // 否则轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag became available!\");\n clearInterval(checkScriptLoaded);\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for gtag\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled, pixelIdsArray]);\n\n return (\n <>\n {pixelIdsArray.length > 0 &&\n pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`GtagPixel_${pixelId}_${index}`}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n strategy={strategy}\n src={`https://www.googletagmanager.com/gtag/js?id=${pixelId}`}\n onLoad={() => {\n console.log(`✅ GtagPixel ${pixelId} loaded from network`);\n initializeGtag(pixelId);\n }}\n onError={() => {\n console.error(`❌ GtagPixel ${pixelId} script load error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n );\n};\n\nexport default GtagPixel;\n","import type { BasePlatformConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface MetaPixelProps\n extends BasePlatformConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst MetaPixel = (props: MetaPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onLoad,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // 检测 fbq 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 fbq 已经存在,立即触发回调\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq already available\");\n onLoadRef.current?.();\n return;\n }\n\n // 否则开始轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq became available!\");\n clearInterval(checkScriptLoaded);\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for window.fbq\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled]);\n\n return (\n <>\n {pixelIdsArray?.length > 0 && ( // 添加 cookieConsentEnabled 条件\n <>\n <Script\n key=\"MetaPixel\"\n id=\"MetaPixel\"\n strategy={strategy}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n src={`https://connect.facebook.net/en_US/fbevents.js`}\n onLoad={() => {\n console.log(\"✅ MetaPixel main script loaded from network\");\n }}\n onError={() => {\n console.error(\"❌ MetaPixel main script load error\");\n }}\n />\n {pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`MetaPixel_${pixelId}_${index}`}\n strategy={strategy}\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(f,b,n)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];}(window, document);\n fbq('init', '${pixelId}');\n fbq('track', 'PageView');\n `,\n }}\n onError={() => {\n console.error(`❌ MetaPixel ${pixelId} script error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n )}\n </>\n );\n};\n\nexport default MetaPixel;\n","import type { PixelsManagerConfig, BasePlatformConfig } from \"../types\";\nimport React from \"react\";\nimport GtagPixel from \"./GtagPixel\";\nimport MetaPixel from \"./MetaPixel\";\n\n// 定义 Pixel 组件的公共 props 类型\ntype PixelComponentProps = BasePlatformConfig &\n React.ScriptHTMLAttributes<HTMLScriptElement>;\n\n// Pixel 组件映射表\nconst PIXEL_COMPONENTS: Record<\n PixelsManagerConfig[\"type\"],\n React.ComponentType<PixelComponentProps> | null\n> = {\n gtag: GtagPixel,\n meta: MetaPixel,\n};\n\nconst PixelsManager: React.FC<PixelsManagerConfig> = (config) => {\n const { type, ...pixelProps } = config;\n\n const PixelComponent = PIXEL_COMPONENTS[type];\n\n if (!PixelComponent) {\n return null;\n }\n\n return <PixelComponent {...pixelProps} />;\n};\n\nexport default PixelsManager;\n"],"mappings":"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","names":["config","Script","import_react","import_script","import_jsx_runtime","Script","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/helpers/logger.ts","../src/core/helpers/script-loader.ts","../src/core/helpers/function-utils.ts","../src/core/helpers/platform-detector.ts","../src/constants/tagsMap.ts","../src/autoTrack/trackByTags.ts","../src/core/helpers/triggerTrack.ts","../src/core/adapters/gtag.ts","../src/core/adapters/meta.ts","../src/core/tracking/dispatcher.ts","../src/core/tracking/with-tracking.ts","../src/autoTrack/useDataTrack.ts","../src/pixels/GtagPixel.tsx","../src/pixels/MetaPixel.tsx","../src/pixels/PixelsManager.tsx"],"sourcesContent":["/**\n * Analysis SDK - 埋点 SDK 主入口\n *\n * 提供统一的埋点接口,支持多平台埋点上报\n */\n\n// ============= 默认导出 =============\n\nimport { track } from \"./core/tracking\";\nimport { trackByTags } from \"./autoTrack/trackByTags\";\nimport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\nimport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= 核心功能 =============\n\nexport { track } from \"./core/tracking\";\nexport { gtagTrack } from \"./core/adapters\";\nexport { metaTrack } from \"./core/adapters\";\n\n// ============= 高阶函数 - 无侵入式埋点 =============\n\nexport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= TrackByTags 功能 =============\n\nexport { trackByTags } from \"./autoTrack/trackByTags\";\n\n// ============= 自动追踪 Hooks =============\n\nexport { useDataTrack, type UseDataTrackOptions } from \"./autoTrack\";\n\n// ============= TriggerTrack 功能 =============\n\nexport {\n triggerTrack,\n triggerTrackBatch,\n setTrackTags,\n clearTrackTags,\n hasTrackPoint,\n} from \"./core/helpers/triggerTrack\";\n\n// ============= 工具函数 =============\n\nexport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\n\n// ============= Pixels 组件 =============\n\nexport { GtagPixel, MetaPixel, PixelsManager } from \"./pixels\";\n\n// ============= 常量 =============\n\nexport { TrackTagsVersionMap } from \"./constants\";\n\n// ============= 类型定义 =============\n\n// 导出所有通用类型\nexport type {\n PlatformType,\n TrackEventType,\n BasePlatformConfig,\n PixelsManagerConfig,\n GtagConfig,\n MetaPixelConfig,\n TikTokPixelConfig,\n ScarabConfig,\n AnalysisConfig,\n TrackParams,\n Tracker,\n AutoTrackConfig,\n Currency,\n TrackConfig,\n GtagEventName,\n GtagTrackParams,\n GtagConfigParams,\n MetaTrackParams,\n TrackByTagsData,\n TrackByTagsParams,\n ParsedTag,\n} from \"./types\";\n\n// 导出工具函数类型\nexport type { UpdateScriptTypeOptions } from \"./core/helpers\";\n\n// 导出 TriggerTrack 类型\nexport type {\n TrackTagsConfig,\n TriggerTrackOptions,\n} from \"./core/helpers/triggerTrack\";\n\nexport default {\n track,\n trackByTags,\n withTracking,\n useTracking,\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n};\n","/**\n * 日志工具模块\n * 提供统一的日志记录功能\n */\n\n/**\n * 创建日志工具\n */\nexport function createLogger(initialEnabled = false) {\n let enabled = initialEnabled;\n\n return {\n setEnabled(value: boolean) {\n enabled = value;\n },\n\n log(...args: any[]) {\n if (enabled) {\n console.log(\"[Analysis SDK]\", ...args);\n }\n },\n\n warn(...args: any[]) {\n if (enabled) {\n console.warn(\"[Analysis SDK]\", ...args);\n }\n },\n\n error(...args: any[]) {\n if (enabled) {\n console.error(\"[Analysis SDK]\", ...args);\n }\n },\n };\n}\n\n// 全局 logger 实例\nexport const logger = createLogger();\n","/**\n * 脚本加载和管理模块\n * 提供动态加载和控制第三方脚本的能力\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 加载外部脚本\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // 检查是否已加载\n if (id && document.getElementById(id)) {\n logger.log(`Script ${id} already loaded`);\n resolve();\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = src;\n script.async = true;\n if (id) {\n script.id = id;\n }\n\n script.onload = () => {\n logger.log(`Script loaded: ${src}`);\n resolve();\n };\n\n script.onerror = () => {\n logger.error(`Failed to load script: ${src}`);\n reject(new Error(`Failed to load script: ${src}`));\n };\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * 更新脚本的 type 属性配置\n */\nexport interface UpdateScriptTypeOptions {\n /** 脚本元素的 ID */\n id: string;\n /** 是否启用脚本 */\n enabled: boolean;\n /** 是否在启用时重新执行脚本内容 */\n executeOnEnable?: boolean;\n /** 错误处理回调 */\n onError?: (error: Error) => void;\n}\n\n/**\n * 动态更新脚本的 type 属性\n * 用于根据 cookie consent 状态动态启用/禁用脚本\n *\n * @param options - 配置选项\n * @returns 是否成功更新\n */\nexport function updateScriptType(options: UpdateScriptTypeOptions): boolean {\n const { id, enabled, executeOnEnable = true, onError } = options;\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const scriptElement = document.getElementById(id);\n if (!scriptElement) {\n logger.warn(`Script element with id \"${id}\" not found`);\n return false;\n }\n\n const newType = enabled ? \"text/javascript\" : \"text/plain\";\n const currentType = scriptElement.getAttribute(\"type\");\n\n // 如果从 text/plain 变为 text/javascript,需要重新执行脚本\n if (\n executeOnEnable &&\n currentType === \"text/plain\" &&\n newType === \"text/javascript\"\n ) {\n scriptElement.setAttribute(\"type\", newType);\n\n // 重新执行脚本内容\n const scriptContent = scriptElement.innerHTML;\n if (scriptContent && typeof window.eval === \"function\") {\n try {\n window.eval(scriptContent);\n logger.log(`Script \"${id}\" executed successfully`);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n logger.error(`Script \"${id}\" execution error:`, error);\n if (onError) {\n onError(error);\n }\n }\n }\n } else {\n scriptElement.setAttribute(\"type\", newType);\n }\n\n return true;\n}\n\n/**\n * 批量更新多个脚本的 type 属性\n *\n * @param scriptIds - 脚本 ID 数组或生成 ID 的函数\n * @param enabled - 是否启用脚本\n * @param executeOnEnable - 是否在启用时重新执行脚本内容\n * @returns 成功更新的脚本数量\n */\nexport function updateScriptsType(\n scriptIds: string[] | ((index: number) => string),\n enabled: boolean,\n executeOnEnable = true\n): number {\n if (typeof window === \"undefined\") {\n return 0;\n }\n\n let successCount = 0;\n const ids = Array.isArray(scriptIds)\n ? scriptIds\n : Array.from({ length: 100 }, (_, i) => scriptIds(i)).filter((id) =>\n document.getElementById(id)\n );\n\n ids.forEach((id) => {\n const success = updateScriptType({\n id,\n enabled,\n executeOnEnable,\n });\n if (success) {\n successCount++;\n }\n });\n\n logger.log(`Updated ${successCount}/${ids.length} scripts`);\n return successCount;\n}\n","/**\n * 函数工具模块\n * 提供防抖、节流、安全执行等通用函数工具\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function (this: any, ...args: Parameters<T>) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastTime = 0;\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n if (now - lastTime >= delay) {\n lastTime = now;\n fn.apply(this, args);\n }\n };\n}\n\n/**\n * 安全执行函数,捕获错误\n */\nexport function safeExecute<T>(\n fn: () => T,\n errorMessage?: string\n): T | undefined {\n try {\n return fn();\n } catch (error) {\n logger.error(errorMessage || \"Error executing function:\", error);\n return undefined;\n }\n}\n","/**\n * 平台检测模块\n * 检测各个埋点平台的可用性\n */\n\nimport type { PlatformType } from \"../../types\";\n\n/**\n * 检测指定平台是否可用\n */\nexport const isPlatformAvailable = (platform: PlatformType): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n switch (platform) {\n case \"gtag\":\n return (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n );\n case \"meta\":\n return typeof window.fbq !== \"undefined\";\n default:\n return false;\n }\n};\n\n/**\n * 检测所有可用的平台\n */\nexport const detectAvailablePlatforms = (): PlatformType[] => {\n const platforms: PlatformType[] = [\"gtag\", \"meta\"];\n return platforms.filter((platform) => isPlatformAvailable(platform));\n};\n","/**\n * 标签版本映射表\n * 用于兼容旧版本标签,将旧事件名映射到新事件名\n */\nexport const TrackTagsVersionMap = {\n \"fbq:act\": \"fbq:atc\",\n \"gtag:conversion\": \"gtag:atc\",\n} as const;\n","import { track } from \"../core/tracking\";\nimport { logger } from \"../core/helpers\";\nimport type { TrackConfig, ParsedTag, TrackByTagsParams } from \"../types\";\nimport { TrackTagsVersionMap } from \"../constants\";\n\n/**\n * 解析单个标签\n */\nfunction parseTag(tag: string): ParsedTag | null {\n const parts = tag.split(\":\");\n\n if (parts.length < 2) {\n return null;\n }\n\n return {\n media: parts[0]?.toLowerCase() || \"\",\n event: parts[1]?.toLowerCase() || \"\",\n target: parts[2] || null,\n };\n}\n\n/**\n * 适配事件名称(版本兼容)\n * 将旧版本的事件名替换为新版本的事件名\n */\nfunction adaptEventName(tags: string[]): void {\n for (let i = 0; i < tags.length; i++) {\n if (!tags[i]) {\n continue;\n }\n for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {\n if (tags[i]?.includes(oldEvent)) {\n tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? \"\";\n break;\n }\n }\n }\n}\n\n/**\n * 处理单个标签的埋点\n */\nfunction handleTagTracking(\n parsedTag: ParsedTag,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventData?: Record<string, any>\n): void {\n const { media, event, target } = parsedTag;\n\n if (!target) {\n logger.warn(`Tag missing target: ${media}:${event}`);\n return;\n }\n\n try {\n switch (media) {\n case \"fbq\":\n case \"meta\": {\n // Meta Pixel 埋点\n const config: TrackConfig<\"meta\"> = {\n platform: \"meta\",\n event: target, // target 作为事件名\n data: eventData,\n };\n track(config);\n break;\n }\n\n case \"gtag\": {\n // Gtag 转化事件埋点\n const config: TrackConfig<\"gtag\"> = {\n platform: \"gtag\",\n eventName: \"conversion\",\n send_to: target, // target 作为转化目标ID\n value: eventData?.value ?? 1.0,\n currency: eventData?.currency,\n transactionId: eventData?.transactionId,\n };\n track(config);\n break;\n }\n\n default:\n logger.warn(`Unsupported media platform: ${media}`);\n }\n } catch (error) {\n logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);\n }\n}\n\n/**\n * 基于标签进行埋点上报(简化版)\n *\n * @param tags - 标签数组,格式: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123']\n * @param data - 事件数据数组,包含事件相关的额外数据\n *\n * @example\n * ```typescript\n * trackByTags({\n * tags: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],\n * data: [{ event: 'custom' }]\n * });\n * ```\n */\nexport function trackByTags({ tags, data }: TrackByTagsParams): void {\n if (!tags || tags.length === 0) {\n logger.warn(\"trackByTags: tags array is empty\");\n return;\n }\n\n // 数据清洗:兼容旧版本标签\n const adaptedTags = [...tags];\n adaptEventName(adaptedTags);\n\n // 获取事件数据(如果提供了 data)\n const firstData = data && data.length > 0 ? data[0] : undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { event, ...trackingData } = firstData || {};\n\n // 直接处理所有标签,不再过滤\n adaptedTags.forEach((tag) => {\n const parsed = parseTag(tag);\n\n if (!parsed) {\n logger.warn(`trackByTags: Invalid tag format: ${tag}`);\n return;\n }\n\n handleTagTracking(parsed, trackingData);\n });\n}\n","/**\n * 触发埋点上报工具\n *\n * 从 sessionStorage 读取 trackTags 配置,并根据 trackPoint 触发对应的埋点上报\n */\n\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport { logger } from \"./logger\";\n\n/**\n * TrackTags 配置类型\n * key: trackPoint 标识\n * value: 标签数组\n */\nexport interface TrackTagsConfig {\n [trackPoint: string]: string[];\n}\n\n/**\n * 埋点触发选项\n */\nexport interface TriggerTrackOptions {\n tags?: Array<string>;\n /** 自定义事件数据 */\n eventData?: Record<string, unknown>;\n /** 自定义存储键名,默认为 'trackTags' */\n storageKey?: string;\n /** 是否静默失败(不输出警告日志),默认为 false */\n silent?: boolean;\n}\n\n/**\n * 从 sessionStorage 获取 trackTags 配置\n *\n * @param storageKey - 存储键名\n * @returns TrackTags 配置对象,获取失败返回 null\n */\nfunction getTrackTagsFromStorage(storageKey: string): TrackTagsConfig | null {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return null;\n }\n\n try {\n const trackTagsRaw = sessionStorage.getItem(storageKey);\n\n if (!trackTagsRaw) {\n return null;\n }\n\n const trackTags = JSON.parse(trackTagsRaw);\n\n if (!trackTags || typeof trackTags !== \"object\") {\n logger.warn(\n `Invalid trackTags format in sessionStorage key: ${storageKey}`\n );\n return null;\n }\n\n return trackTags as TrackTagsConfig;\n } catch (error) {\n logger.error(`Failed to parse trackTags from sessionStorage:`, error);\n return null;\n }\n}\n\n/**\n * 触发埋点上报\n *\n * 从 sessionStorage 读取 trackTags 配置,根据 trackPoint 获取对应的标签数组,\n * 然后调用 trackByTags 进行埋点上报。\n *\n * @param trackPoint - 埋点标识,对应 trackTags 中的 key\n * @param options - 可选配置项\n *\n * @example\n * ```typescript\n * // 基础用法\n * triggerTrack('add_to_cart');\n *\n * // 带自定义数据\n * triggerTrack('purchase', {\n * eventData: {\n * value: 99.99,\n * currency: 'USD',\n * transactionId: 'ORDER-123'\n * }\n * });\n *\n * // 使用自定义存储键\n * triggerTrack('custom_event', {\n * storageKey: 'customTrackTags'\n * });\n * ```\n */\nexport function triggerTrack(\n trackPoint: string,\n options: TriggerTrackOptions = {}\n): void {\n const {\n tags,\n eventData = {},\n storageKey = \"trackTags\",\n silent = false,\n } = options;\n\n // 1. 验证 trackPoint\n if (!trackPoint || typeof trackPoint !== \"string\") {\n if (!silent) {\n logger.warn(\"triggerTrack: trackPoint is required and must be a string\");\n }\n return;\n }\n\n // 2. 从 sessionStorage 获取 trackTags\n const trackTagsRow = getTrackTagsFromStorage(storageKey);\n\n if (!trackTagsRow) {\n if (!silent) {\n logger.warn(\n `triggerTrack: trackTags not found in sessionStorage (key: ${storageKey})`\n );\n }\n return;\n }\n\n // 3. 根据 trackPoint 获取对应的 tags\n const trackTags = tags || trackTagsRow[trackPoint];\n\n if (!trackTags) {\n if (!silent) {\n logger.warn(`triggerTrack: No tags found for trackPoint: ${trackPoint}`);\n }\n return;\n }\n\n if (!Array.isArray(trackTags)) {\n if (!silent) {\n logger.warn(\n `triggerTrack: Tags for trackPoint \"${trackPoint}\" is not an array`\n );\n }\n return;\n }\n\n if (trackTags.length === 0) {\n if (!silent) {\n logger.log(\n `triggerTrack: Tags array is empty for trackPoint: ${trackPoint}`\n );\n }\n return;\n }\n\n // 4. 触发埋点\n try {\n trackByTags({\n tags: trackTags,\n data: [{ event: \"custom\", ...eventData }],\n });\n\n logger.log(\n `triggerTrack: Successfully triggered for trackPoint: ${trackPoint}`,\n {\n tagsCount: trackTags.length,\n trackTags,\n }\n );\n } catch (error) {\n logger.error(\n `triggerTrack: Failed to track for trackPoint: ${trackPoint}`,\n error\n );\n }\n}\n\n/**\n * 批量触发多个埋点\n *\n * @param trackPoints - 埋点标识数组\n * @param options - 可选配置项(应用到所有埋点)\n *\n * @example\n * ```typescript\n * // 批量触发多个埋点\n * triggerTrackBatch(['view_item', 'add_to_cart']);\n *\n * // 带共享的事件数据\n * triggerTrackBatch(['event1', 'event2'], {\n * eventData: { sessionId: '12345' }\n * });\n * ```\n */\nexport function triggerTrackBatch(\n trackPoints: string[],\n options: TriggerTrackOptions = {}\n): void {\n if (!Array.isArray(trackPoints)) {\n logger.warn(\"triggerTrackBatch: trackPoints must be an array\");\n return;\n }\n\n trackPoints.forEach((trackPoint) => {\n triggerTrack(trackPoint, options);\n });\n}\n\n/**\n * 设置 trackTags 到 sessionStorage\n *\n * @param trackTags - TrackTags 配置对象\n * @param storageKey - 存储键名,默认为 'trackTags'\n *\n * @example\n * ```typescript\n * setTrackTags({\n * 'add_to_cart': ['fbq:atc:123456', 'gtag:atc:AW-123/abc'],\n * 'purchase': ['fbq:purchase:123456', 'gtag:purchase:AW-123/xyz']\n * });\n * ```\n */\nexport function setTrackTags(\n trackTags: TrackTagsConfig,\n storageKey: string = \"trackTags\"\n): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return;\n }\n\n try {\n const trackTagsJson = JSON.stringify(trackTags);\n sessionStorage.setItem(storageKey, trackTagsJson);\n logger.log(\n `setTrackTags: Successfully saved to sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"setTrackTags: Failed to save to sessionStorage\", error);\n }\n}\n\n/**\n * 清除 trackTags\n *\n * @param storageKey - 存储键名,默认为 'trackTags'\n */\nexport function clearTrackTags(storageKey: string = \"trackTags\"): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n return;\n }\n\n try {\n sessionStorage.removeItem(storageKey);\n logger.log(\n `clearTrackTags: Successfully removed from sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"clearTrackTags: Failed to remove from sessionStorage\", error);\n }\n}\n\n/**\n * 检查某个 trackPoint 是否存在\n *\n * @param trackPoint - 埋点标识\n * @param storageKey - 存储键名,默认为 'trackTags'\n * @returns 是否存在对应的标签配置\n */\nexport function hasTrackPoint(\n trackPoint: string,\n storageKey: string = \"trackTags\"\n): boolean {\n const trackTags = getTrackTagsFromStorage(storageKey);\n\n if (!trackTags) {\n return false;\n }\n\n const tags = trackTags[trackPoint];\n return Array.isArray(tags) && tags.length > 0;\n}\n","/**\n * Google Analytics / gtag.js 适配器\n * 使用标准的 window.gtag() API\n * 专注于转化事件追踪\n */\n\n/**\n * gtag 命令类型\n */\ntype GtagCommand = \"config\" | \"event\" | \"set\" | \"get\";\n\n/**\n * gtag 埋点函数\n * 调用 window.gtag() 标准 API\n */\nexport const gtagTrack = (\n command: GtagCommand,\n targetOrEventName: string,\n params?: Record<string, any>\n): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n // 确保 gtag 函数存在\n if (typeof window.gtag !== \"function\") {\n console.warn(\"gtag is not available. Please load gtag.js first.\");\n return;\n }\n\n try {\n window.gtag(command, targetOrEventName, params);\n } catch (error) {\n console.error(\"gtagTrack error:\", error);\n }\n};\n\n/**\n * 发送 gtag 事件\n */\nexport const gtagEvent = (\n eventName: string,\n eventParams?: Record<string, any>\n): void => {\n gtagTrack(\"event\", eventName, eventParams);\n};\n\n/**\n * 发送 gtag config\n */\nexport const gtagConfig = (\n measurementId: string,\n configParams?: Record<string, any>\n): void => {\n gtagTrack(\"config\", measurementId, configParams);\n};\n\n/**\n * 检测 gtag 是否可用\n */\nexport const isGtagAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.gtag === \"function\";\n};\n\n/**\n * gtag 适配器对象\n */\nexport const gtagAdapter = {\n track: gtagTrack,\n event: gtagEvent,\n config: gtagConfig,\n isAvailable: isGtagAvailable,\n};\n","/**\n * Meta Pixel 适配器\n * 提供 Facebook/Meta Pixel 的埋点功能\n */\n\n/**\n * Meta Pixel 埋点函数\n */\nexport const metaTrack = (event: string, data?: object): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n if (typeof window.fbq !== \"undefined\") {\n try {\n if (data) {\n window.fbq(\"track\", event, data);\n } else {\n window.fbq(\"track\", event);\n }\n } catch (error) {\n console.log(\"fbqTrack error\", error);\n }\n }\n};\n\n/**\n * 检测 Meta Pixel 是否可用\n */\nexport const isMetaAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.fbq !== \"undefined\";\n};\n\n/**\n * Meta Pixel 适配器对象\n */\nexport const metaAdapter = {\n track: metaTrack,\n isAvailable: isMetaAvailable,\n};\n","/**\n * 埋点调度器模块\n * 负责根据平台类型分发事件到对应的适配器\n */\n\nimport type { PlatformType } from \"../../types\";\nimport type {\n TrackConfig,\n GtagTrackParams,\n MetaTrackParams,\n} from \"../../types\";\nimport { isPlatformAvailable, logger } from \"../helpers\";\nimport { gtagEvent, gtagConfig } from \"../adapters/gtag\";\nimport { metaTrack } from \"../adapters/meta\";\n\nfunction track(config: TrackConfig<\"gtag\">): void;\nfunction track(config: TrackConfig<\"meta\">): void;\n\nfunction track<P extends PlatformType>(config: TrackConfig<P>): void {\n const { platform, ...params } = config;\n\n if (!isPlatformAvailable(platform)) {\n logger.warn(`Platform ${platform} is not available`);\n return;\n }\n\n try {\n switch (platform) {\n case \"gtag\": {\n const gtagParams = params as unknown as GtagTrackParams;\n handleGtagTrack(gtagParams);\n break;\n }\n\n case \"meta\": {\n const metaParams = params as unknown as MetaTrackParams;\n handleMetaTrack(metaParams);\n break;\n }\n\n default:\n logger.warn(`Unsupported platform: ${platform}`);\n }\n } catch (error) {\n logger.error(`Failed to track on platform ${platform}:`, error);\n }\n}\n\n/**\n * 处理 Gtag 埋点(转化事件)\n */\nfunction handleGtagTrack(params: GtagTrackParams): void {\n const { eventName, measurementId, ...restParams } = params;\n\n // 如果有 measurementId,先发送 config\n if (measurementId) {\n gtagConfig(measurementId, {});\n }\n\n // 构建事件参数\n const eventParams: Record<string, any> = { ...restParams };\n\n // 处理 transactionId -> transaction_id 转换\n if (eventParams.transactionId && !eventParams.transaction_id) {\n eventParams.transaction_id = eventParams.transactionId;\n delete eventParams.transactionId;\n }\n\n // 发送转化事件\n gtagEvent(eventName, eventParams);\n\n logger.log(`Gtag conversion tracked: ${eventName}`, eventParams);\n}\n\n/**\n * 处理 Meta Pixel 埋点\n */\nfunction handleMetaTrack(params: {\n event: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: Record<string, any>;\n}): void {\n const { event, data } = params;\n\n if (!event) {\n logger.warn(\"Meta Pixel event name is required\");\n return;\n }\n\n metaTrack(event, data);\n logger.log(`Meta Pixel event tracked: ${event}`, data);\n}\n\nexport default track;\nexport { track };\n","/**\n * 埋点装饰器模块\n * 提供函数包装器和 React Hooks,为业务函数添加埋点能力\n */\n\nimport { track } from \"./dispatcher\";\nimport { logger, debounce, throttle } from \"../helpers\";\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport type {\n TrackConfig,\n PlatformType,\n WithTrackingConfig,\n} from \"../../types\";\n\n/**\n * 执行埋点上报\n */\nfunction executeTracking<P extends PlatformType>(\n trackPoint?: string,\n trackConfig?: TrackConfig<P> | TrackConfig<P>[]\n): void {\n const configs = Array.isArray(trackConfig)\n ? trackConfig\n : [trackConfig ?? {}];\n\n configs.forEach((config) => {\n try {\n track(config as any);\n } catch (error) {\n logger.error(\"withTracking: 埋点执行失败\", error);\n }\n });\n if (\n typeof window !== \"undefined\" &&\n !!trackPoint &&\n (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"]?.length > 0\n ) {\n trackByTags({\n tags: (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"] ?? [],\n data: [{ event: \"custom\" }],\n });\n }\n}\n\nexport function withTracking<T extends (...args: any[]) => any>(\n fn: T,\n config: WithTrackingConfig\n): T {\n const {\n trackConfig,\n timing = \"after\",\n condition,\n trackOnError = false,\n errorTrackConfig,\n debounce: debounceTime,\n throttle: throttleTime,\n trackPoint,\n } = config;\n\n // 核心包装函数\n function wrappedFunction(...args: Parameters<T>): ReturnType<T> {\n // 条件检查\n if (condition && !condition(args)) {\n return fn(...args);\n }\n\n // 生成埋点配置\n const getTrackConfig = (result?: any) => {\n return typeof trackConfig === \"function\"\n ? trackConfig(args, result)\n : trackConfig;\n };\n\n // Before 时机\n if (timing === \"before\" || timing === \"both\") {\n const config = getTrackConfig();\n executeTracking(trackPoint, config);\n }\n\n // 执行原函数\n try {\n const result = fn(...args);\n\n // 处理异步函数\n if (result instanceof Promise) {\n return result\n .then((resolvedResult) => {\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(resolvedResult);\n executeTracking(trackPoint, config);\n }\n return resolvedResult;\n })\n .catch((error) => {\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error, args));\n }\n throw error;\n }) as ReturnType<T>;\n }\n\n // 同步函数 After 时机\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(result);\n executeTracking(trackPoint, config);\n }\n\n return result;\n } catch (error) {\n // 错误时上报\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error as Error, args));\n }\n throw error;\n }\n }\n\n if (typeof window !== \"undefined\" && !!trackPoint) {\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has(\"TRACK_DEV\")) {\n return ((...args) => {\n window.open(\n `http://localhost:3002/tracking?trackPoint=${trackPoint}`,\n \"_blank\"\n );\n }) as T;\n }\n }\n\n // 应用防抖/节流\n if (debounceTime) {\n return debounce(wrappedFunction, debounceTime) as T;\n }\n\n if (throttleTime) {\n return throttle(wrappedFunction, throttleTime) as T;\n }\n\n // __TRACK_POINT_MARKER__(trackPoint);\n\n return wrappedFunction as T;\n}\n\n// 定义标记函数(仅用于 AST 识别)\nfunction __TRACK_POINT_MARKER__(trackPoint?: string) {\n // 空函数,仅用于 AST 标记\n}\n\n/**\n * React Hooks 专用\n *\n * 为 React 组件提供埋点 Hook\n *\n * @example\n * ```typescript\n * function ProductCard({ product }) {\n * const trackAddToCart = useTracking({\n * trackConfig: {\n * platform: \"gtag\",\n * eventName: \"add_to_cart\"\n * }\n * });\n *\n * const handleClick = () => {\n * trackAddToCart(() => {\n * addToCart(product.id);\n * });\n * };\n *\n * return <button onClick={handleClick}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useTracking(config: WithTrackingConfig) {\n return <T extends (...args: any[]) => any>(fn: T) => {\n return withTracking(fn, config);\n };\n}\n","import { useEffect } from 'react'\nimport { trackByTags } from './trackByTags'\nimport { logger } from '../core/helpers'\n\nexport interface UseDataTrackOptions {\n /**\n * 埋点标签映射对象\n * 键为 data-track 属性值,值为标签数组\n */\n trackTags?: Record<string, string[]>\n}\n\n/**\n * 自动追踪带有 data-track 属性的元素点击事件的 Hook\n *\n * @param options - 配置选项\n * @param options.trackTags - 埋点标签映射对象,键为 data-track 属性值,值为标签数组\n * @example\n * ```tsx\n * function MyComponent() {\n * useDataTrack({\n * trackTags: {\n * 'add-to-cart': ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],\n * 'checkout': ['fbq:checkout:1234567890']\n * }\n * });\n *\n * return (\n * <button data-track=\"add-to-cart\">Add to Cart</button>\n * );\n * }\n * ```\n */\nexport function useDataTrack({ trackTags }: UseDataTrackOptions): void {\n useEffect(() => {\n const handleTrackClick = (e: MouseEvent) => {\n logger.log('click', e.target)\n\n // 查找带 data-track 属性的元素(向上查找最多 3 层)\n let target = e.target as HTMLElement | null\n let trackValue: string | null = null\n\n for (let i = 0; i <= 3; i++) {\n if (!target) break // 防止节点为null时报错\n\n trackValue = target.getAttribute('data-track')\n\n // 找到有值的 data-track 则终止循环\n if (trackValue) break\n\n // 未找到则向上获取父元素,继续下一轮循环\n target = target.parentElement\n }\n\n if (!trackValue) return\n\n const tags = trackTags?.[trackValue] || []\n\n if (!tags.length) {\n logger.warn(`No tags found for data-track=\"${trackValue}\"`)\n return\n }\n\n // 触发埋点\n trackByTags({ tags })\n }\n\n try {\n sessionStorage.setItem('trackTags', JSON.stringify(trackTags))\n trackByTags({ tags: trackTags?.['pageView'] || [] })\n } catch (error) {\n logger.error('Failed to save trackTags to sessionStorage:', error)\n }\n\n // 添加事件监听\n document.body.addEventListener('click', handleTrackClick)\n\n // 清理函数\n return () => {\n document.body.removeEventListener('click', handleTrackClick)\n }\n }, [trackTags])\n}\n","import type { GtagConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface GtagPixelProps\n extends GtagConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst GtagPixel = (props: GtagPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onPixelLoaded,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // Gtag 初始化函数\n const initializeGtag = (pixelId: string) => {\n try {\n window.dataLayer = window.dataLayer || [];\n if (typeof window.gtag !== \"function\") {\n window.gtag = function gtag() {\n window.dataLayer!.push(arguments);\n };\n }\n window.gtag(\"js\", new Date());\n window.gtag(\"config\", pixelId, {\n allow_enhanced_conversions: true,\n });\n console.log(`✅ GtagPixel ${pixelId} initialized`);\n } catch (error) {\n console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);\n }\n };\n\n // 检测 gtag 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 gtag 或 dataLayer 已存在,立即初始化\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag already available\");\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n return;\n }\n\n // 否则轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag became available!\");\n clearInterval(checkScriptLoaded);\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for gtag\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled, pixelIdsArray]);\n\n return (\n <>\n {pixelIdsArray.length > 0 &&\n pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`GtagPixel_${pixelId}_${index}`}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n strategy={strategy}\n src={`https://www.googletagmanager.com/gtag/js?id=${pixelId}`}\n onLoad={() => {\n console.log(`✅ GtagPixel ${pixelId} loaded from network`);\n initializeGtag(pixelId);\n }}\n onError={() => {\n console.error(`❌ GtagPixel ${pixelId} script load error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n );\n};\n\nexport default GtagPixel;\n","import type { BasePlatformConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface MetaPixelProps\n extends BasePlatformConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst MetaPixel = (props: MetaPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onLoad,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // 检测 fbq 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 fbq 已经存在,立即触发回调\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq already available\");\n onLoadRef.current?.();\n return;\n }\n\n // 否则开始轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq became available!\");\n clearInterval(checkScriptLoaded);\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for window.fbq\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled]);\n\n return (\n <>\n {pixelIdsArray?.length > 0 && ( // 添加 cookieConsentEnabled 条件\n <>\n <Script\n key=\"MetaPixel\"\n id=\"MetaPixel\"\n strategy={strategy}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n src={`https://connect.facebook.net/en_US/fbevents.js`}\n onLoad={() => {\n console.log(\"✅ MetaPixel main script loaded from network\");\n }}\n onError={() => {\n console.error(\"❌ MetaPixel main script load error\");\n }}\n />\n {pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`MetaPixel_${pixelId}_${index}`}\n strategy={strategy}\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(f,b,n)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];}(window, document);\n fbq('init', '${pixelId}');\n fbq('track', 'PageView');\n `,\n }}\n onError={() => {\n console.error(`❌ MetaPixel ${pixelId} script error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n )}\n </>\n );\n};\n\nexport default MetaPixel;\n","import type { PixelsManagerConfig, BasePlatformConfig } from \"../types\";\nimport React from \"react\";\nimport GtagPixel from \"./GtagPixel\";\nimport MetaPixel from \"./MetaPixel\";\n\n// 定义 Pixel 组件的公共 props 类型\ntype PixelComponentProps = BasePlatformConfig &\n React.ScriptHTMLAttributes<HTMLScriptElement>;\n\n// Pixel 组件映射表\nconst PIXEL_COMPONENTS: Record<\n PixelsManagerConfig[\"type\"],\n React.ComponentType<PixelComponentProps> | null\n> = {\n gtag: GtagPixel,\n meta: MetaPixel,\n};\n\nconst PixelsManager: React.FC<PixelsManagerConfig> = (config) => {\n const { type, ...pixelProps } = config;\n\n const PixelComponent = PIXEL_COMPONENTS[type];\n\n if (!PixelComponent) {\n return null;\n }\n\n return <PixelComponent {...pixelProps} />;\n};\n\nexport default PixelsManager;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,aAAa,iBAAiB,OAAO;AACnD,MAAI,UAAU;AAEd,SAAO;AAAA,IACL,WAAW,OAAgB;AACzB,gBAAU;AAAA,IACZ;AAAA,IAEA,OAAO,MAAa;AAClB,UAAI,SAAS;AACX,gBAAQ,IAAI,kBAAkB,GAAG,IAAI;AAAA,MACvC;AAAA,IACF;AAAA,IAEA,QAAQ,MAAa;AACnB,UAAI,SAAS;AACX,gBAAQ,KAAK,kBAAkB,GAAG,IAAI;AAAA,MACxC;AAAA,IACF;AAAA,IAEA,SAAS,MAAa;AACpB,UAAI,SAAS;AACX,gBAAQ,MAAM,kBAAkB,GAAG,IAAI;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;AA1BgB;AA6BT,IAAM,SAAS,aAAa;;;ACwB5B,SAAS,iBAAiB,SAA2C;AAC1E,QAAM,EAAE,IAAI,SAAS,kBAAkB,MAAM,QAAQ,IAAI;AACzD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,SAAS,eAAe,EAAE;AAChD,MAAI,CAAC,eAAe;AAClB,WAAO,KAAK,2BAA2B,EAAE,aAAa;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,UAAU,oBAAoB;AAC9C,QAAM,cAAc,cAAc,aAAa,MAAM;AAGrD,MACE,mBACA,gBAAgB,gBAChB,YAAY,mBACZ;AACA,kBAAc,aAAa,QAAQ,OAAO;AAG1C,UAAM,gBAAgB,cAAc;AACpC,QAAI,iBAAiB,OAAO,OAAO,SAAS,YAAY;AACtD,UAAI;AACF,eAAO,KAAK,aAAa;AACzB,eAAO,IAAI,WAAW,EAAE,yBAAyB;AAAA,MACnD,SAAS,GAAG;AACV,cAAM,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;AAC1D,eAAO,MAAM,WAAW,EAAE,sBAAsB,KAAK;AACrD,YAAI,SAAS;AACX,kBAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,kBAAc,aAAa,QAAQ,OAAO;AAAA,EAC5C;AAEA,SAAO;AACT;AA1CgB;AAoDT,SAAS,kBACd,WACA,SACA,kBAAkB,MACV;AACR,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe;AACnB,QAAM,MAAM,MAAM,QAAQ,SAAS,IAC/B,YACA,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,EAAE;AAAA,IAAO,CAAC,OAC1D,SAAS,eAAe,EAAE;AAAA,EAC5B;AAEJ,MAAI,QAAQ,CAAC,OAAO;AAClB,UAAM,UAAU,iBAAiB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,SAAS;AACX;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,IAAI,WAAW,YAAY,IAAI,IAAI,MAAM,UAAU;AAC1D,SAAO;AACT;AA7BgB;;;ACvGT,SAAS,SACd,IACA,OACkC;AAClC,MAAI,QAA8C;AAClD,SAAO,YAAwB,MAAqB;AAClD,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,MAAM;AACvB,SAAG,MAAM,MAAM,IAAI;AAAA,IACrB,GAAG,KAAK;AAAA,EACV;AACF;AAXgB;AAgBT,SAAS,SACd,IACA,OACkC;AAClC,MAAI,WAAW;AACf,SAAO,YAAwB,MAAqB;AAClD,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,YAAY,OAAO;AAC3B,iBAAW;AACX,SAAG,MAAM,MAAM,IAAI;AAAA,IACrB;AAAA,EACF;AACF;AAZgB;;;AChBT,IAAM,sBAAsB,wBAAC,aAAoC;AACtE,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aACE,OAAO,OAAO,SAAS,eACvB,OAAO,OAAO,cAAc;AAAA,IAEhC,KAAK;AACH,aAAO,OAAO,OAAO,QAAQ;AAAA,IAC/B;AACE,aAAO;AAAA,EACX;AACF,GAhBmC;;;ACN5B,IAAM,sBAAsB;AAAA,EACjC,WAAW;AAAA,EACX,mBAAmB;AACrB;;;ACCA,SAAS,SAAS,KAA+B;AAC/C,QAAM,QAAQ,IAAI,MAAM,GAAG;AAE3B,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,CAAC,GAAG,YAAY,KAAK;AAAA,IAClC,OAAO,MAAM,CAAC,GAAG,YAAY,KAAK;AAAA,IAClC,QAAQ,MAAM,CAAC,KAAK;AAAA,EACtB;AACF;AAZS;AAkBT,SAAS,eAAe,MAAsB;AAC5C,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,CAAC,KAAK,CAAC,GAAG;AACZ;AAAA,IACF;AACA,eAAW,CAAC,UAAU,QAAQ,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AACtE,UAAI,KAAK,CAAC,GAAG,SAAS,QAAQ,GAAG;AAC/B,aAAK,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,UAAU,QAAQ,KAAK;AAClD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAZS;AAiBT,SAAS,kBACP,WAEA,WACM;AACN,QAAM,EAAE,OAAO,OAAO,OAAO,IAAI;AAEjC,MAAI,CAAC,QAAQ;AACX,WAAO,KAAK,uBAAuB,KAAK,IAAI,KAAK,EAAE;AACnD;AAAA,EACF;AAEA,MAAI;AACF,YAAQ,OAAO;AAAA,MACb,KAAK;AAAA,MACL,KAAK,QAAQ;AAEX,cAAM,SAA8B;AAAA,UAClC,UAAU;AAAA,UACV,OAAO;AAAA;AAAA,UACP,MAAM;AAAA,QACR;AACA,cAAM,MAAM;AACZ;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AAEX,cAAM,SAA8B;AAAA,UAClC,UAAU;AAAA,UACV,WAAW;AAAA,UACX,SAAS;AAAA;AAAA,UACT,OAAO,WAAW,SAAS;AAAA,UAC3B,UAAU,WAAW;AAAA,UACrB,eAAe,WAAW;AAAA,QAC5B;AACA,cAAM,MAAM;AACZ;AAAA,MACF;AAAA,MAEA;AACE,eAAO,KAAK,+BAA+B,KAAK,EAAE;AAAA,IACtD;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,uBAAuB,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,KAAK;AAAA,EACxE;AACF;AA9CS;AA8DF,SAAS,YAAY,EAAE,MAAM,KAAK,GAA4B;AACnE,MAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,WAAO,KAAK,kCAAkC;AAC9C;AAAA,EACF;AAGA,QAAM,cAAc,CAAC,GAAG,IAAI;AAC5B,iBAAe,WAAW;AAG1B,QAAM,YAAY,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI;AAEtD,QAAM,EAAE,OAAO,GAAG,aAAa,IAAI,aAAa,CAAC;AAGjD,cAAY,QAAQ,CAAC,QAAQ;AAC3B,UAAM,SAAS,SAAS,GAAG;AAE3B,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,oCAAoC,GAAG,EAAE;AACrD;AAAA,IACF;AAEA,sBAAkB,QAAQ,YAAY;AAAA,EACxC,CAAC;AACH;AA1BgB;;;ACpEhB,SAAS,wBAAwB,YAA4C;AAC3E,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,gBAAgB;AAC3D,WAAO,KAAK,iCAAiC;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,eAAe,eAAe,QAAQ,UAAU;AAEtD,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,MAAM,YAAY;AAEzC,QAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C,aAAO;AAAA,QACL,mDAAmD,UAAU;AAAA,MAC/D;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,MAAM,kDAAkD,KAAK;AACpE,WAAO;AAAA,EACT;AACF;AA3BS;AA0DF,SAAS,aACd,YACA,UAA+B,CAAC,GAC1B;AACN,QAAM;AAAA,IACJ;AAAA,IACA,YAAY,CAAC;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,EACX,IAAI;AAGJ,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,2DAA2D;AAAA,IACzE;AACA;AAAA,EACF;AAGA,QAAM,eAAe,wBAAwB,UAAU;AAEvD,MAAI,CAAC,cAAc;AACjB,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,6DAA6D,UAAU;AAAA,MACzE;AAAA,IACF;AACA;AAAA,EACF;AAGA,QAAM,YAAY,QAAQ,aAAa,UAAU;AAEjD,MAAI,CAAC,WAAW;AACd,QAAI,CAAC,QAAQ;AACX,aAAO,KAAK,+CAA+C,UAAU,EAAE;AAAA,IACzE;AACA;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,sCAAsC,UAAU;AAAA,MAClD;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,qDAAqD,UAAU;AAAA,MACjE;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAI;AACF,gBAAY;AAAA,MACV,MAAM;AAAA,MACN,MAAM,CAAC,EAAE,OAAO,UAAU,GAAG,UAAU,CAAC;AAAA,IAC1C,CAAC;AAED,WAAO;AAAA,MACL,wDAAwD,UAAU;AAAA,MAClE;AAAA,QACE,WAAW,UAAU;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,iDAAiD,UAAU;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACF;AA/EgB;AAkGT,SAAS,kBACd,aACA,UAA+B,CAAC,GAC1B;AACN,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,WAAO,KAAK,iDAAiD;AAC7D;AAAA,EACF;AAEA,cAAY,QAAQ,CAAC,eAAe;AAClC,iBAAa,YAAY,OAAO;AAAA,EAClC,CAAC;AACH;AAZgB;AA4BT,SAAS,aACd,WACA,aAAqB,aACf;AACN,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,gBAAgB;AAC3D,WAAO,KAAK,iCAAiC;AAC7C;AAAA,EACF;AAEA,MAAI;AACF,UAAM,gBAAgB,KAAK,UAAU,SAAS;AAC9C,mBAAe,QAAQ,YAAY,aAAa;AAChD,WAAO;AAAA,MACL,4DAA4D,UAAU;AAAA,IACxE;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,kDAAkD,KAAK;AAAA,EACtE;AACF;AAlBgB;AAyBT,SAAS,eAAe,aAAqB,aAAmB;AACrE,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,gBAAgB;AAC3D;AAAA,EACF;AAEA,MAAI;AACF,mBAAe,WAAW,UAAU;AACpC,WAAO;AAAA,MACL,kEAAkE,UAAU;AAAA,IAC9E;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,wDAAwD,KAAK;AAAA,EAC5E;AACF;AAbgB;AAsBT,SAAS,cACd,YACA,aAAqB,aACZ;AACT,QAAM,YAAY,wBAAwB,UAAU;AAEpD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,UAAU,UAAU;AACjC,SAAO,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS;AAC9C;AAZgB;;;AC7PT,IAAM,YAAY,wBACvB,SACA,mBACA,WACS;AACT,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AAGA,MAAI,OAAO,OAAO,SAAS,YAAY;AACrC,YAAQ,KAAK,mDAAmD;AAChE;AAAA,EACF;AAEA,MAAI;AACF,WAAO,KAAK,SAAS,mBAAmB,MAAM;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAM,oBAAoB,KAAK;AAAA,EACzC;AACF,GApByB;AAyBlB,IAAM,YAAY,wBACvB,WACA,gBACS;AACT,YAAU,SAAS,WAAW,WAAW;AAC3C,GALyB;AAUlB,IAAM,aAAa,wBACxB,eACA,iBACS;AACT,YAAU,UAAU,eAAe,YAAY;AACjD,GAL0B;;;AC1CnB,IAAM,YAAY,wBAAC,OAAe,SAAwB;AAC/D,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AACA,MAAI,OAAO,OAAO,QAAQ,aAAa;AACrC,QAAI;AACF,UAAI,MAAM;AACR,eAAO,IAAI,SAAS,OAAO,IAAI;AAAA,MACjC,OAAO;AACL,eAAO,IAAI,SAAS,KAAK;AAAA,MAC3B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAI,kBAAkB,KAAK;AAAA,IACrC;AAAA,EACF;AACF,GAfyB;;;ACUzB,SAAS,MAA8B,QAA8B;AACnE,QAAM,EAAE,UAAU,GAAG,OAAO,IAAI;AAEhC,MAAI,CAAC,oBAAoB,QAAQ,GAAG;AAClC,WAAO,KAAK,YAAY,QAAQ,mBAAmB;AACnD;AAAA,EACF;AAEA,MAAI;AACF,YAAQ,UAAU;AAAA,MAChB,KAAK,QAAQ;AACX,cAAM,aAAa;AACnB,wBAAgB,UAAU;AAC1B;AAAA,MACF;AAAA,MAEA,KAAK,QAAQ;AACX,cAAM,aAAa;AACnB,wBAAgB,UAAU;AAC1B;AAAA,MACF;AAAA,MAEA;AACE,eAAO,KAAK,yBAAyB,QAAQ,EAAE;AAAA,IACnD;AAAA,EACF,SAAS,OAAO;AACd,WAAO,MAAM,+BAA+B,QAAQ,KAAK,KAAK;AAAA,EAChE;AACF;AA5BS;AAiCT,SAAS,gBAAgB,QAA+B;AACtD,QAAM,EAAE,WAAW,eAAe,GAAG,WAAW,IAAI;AAGpD,MAAI,eAAe;AACjB,eAAW,eAAe,CAAC,CAAC;AAAA,EAC9B;AAGA,QAAM,cAAmC,EAAE,GAAG,WAAW;AAGzD,MAAI,YAAY,iBAAiB,CAAC,YAAY,gBAAgB;AAC5D,gBAAY,iBAAiB,YAAY;AACzC,WAAO,YAAY;AAAA,EACrB;AAGA,YAAU,WAAW,WAAW;AAEhC,SAAO,IAAI,4BAA4B,SAAS,IAAI,WAAW;AACjE;AArBS;AA0BT,SAAS,gBAAgB,QAIhB;AACP,QAAM,EAAE,OAAO,KAAK,IAAI;AAExB,MAAI,CAAC,OAAO;AACV,WAAO,KAAK,mCAAmC;AAC/C;AAAA,EACF;AAEA,YAAU,OAAO,IAAI;AACrB,SAAO,IAAI,6BAA6B,KAAK,IAAI,IAAI;AACvD;AAdS;;;AC5DT,SAAS,gBACP,YACA,aACM;AACN,QAAM,UAAU,MAAM,QAAQ,WAAW,IACrC,cACA,CAAC,eAAe,CAAC,CAAC;AAEtB,UAAQ,QAAQ,CAAC,WAAW;AAC1B,QAAI;AACF,YAAM,MAAa;AAAA,IACrB,SAAS,OAAO;AACd,aAAO,MAAM,sDAAwB,KAAK;AAAA,IAC5C;AAAA,EACF,CAAC;AACD,MACE,OAAO,WAAW,eAClB,CAAC,CAAC,cACD,OAAe,qBAAqB,cAAc,EAAE,GAAG,SAAS,GACjE;AACA,gBAAY;AAAA,MACV,MAAO,OAAe,qBAAqB,cAAc,EAAE,KAAK,CAAC;AAAA,MACjE,MAAM,CAAC,EAAE,OAAO,SAAS,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAzBS;AA2BF,SAAS,aACd,IACA,QACG;AACH,QAAM;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,IACV;AAAA,EACF,IAAI;AAGJ,WAAS,mBAAmB,MAAoC;AAE9D,QAAI,aAAa,CAAC,UAAU,IAAI,GAAG;AACjC,aAAO,GAAG,GAAG,IAAI;AAAA,IACnB;AAGA,UAAM,iBAAiB,wBAAC,WAAiB;AACvC,aAAO,OAAO,gBAAgB,aAC1B,YAAY,MAAM,MAAM,IACxB;AAAA,IACN,GAJuB;AAOvB,QAAI,WAAW,YAAY,WAAW,QAAQ;AAC5C,YAAMA,UAAS,eAAe;AAC9B,sBAAgB,YAAYA,OAAM;AAAA,IACpC;AAGA,QAAI;AACF,YAAM,SAAS,GAAG,GAAG,IAAI;AAGzB,UAAI,kBAAkB,SAAS;AAC7B,eAAO,OACJ,KAAK,CAAC,mBAAmB;AACxB,cAAI,WAAW,WAAW,WAAW,QAAQ;AAC3C,kBAAMA,UAAS,eAAe,cAAc;AAC5C,4BAAgB,YAAYA,OAAM;AAAA,UACpC;AACA,iBAAO;AAAA,QACT,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,cAAI,gBAAgB,kBAAkB;AACpC,4BAAgB,YAAY,iBAAiB,OAAO,IAAI,CAAC;AAAA,UAC3D;AACA,gBAAM;AAAA,QACR,CAAC;AAAA,MACL;AAGA,UAAI,WAAW,WAAW,WAAW,QAAQ;AAC3C,cAAMA,UAAS,eAAe,MAAM;AACpC,wBAAgB,YAAYA,OAAM;AAAA,MACpC;AAEA,aAAO;AAAA,IACT,SAAS,OAAO;AAEd,UAAI,gBAAgB,kBAAkB;AACpC,wBAAgB,YAAY,iBAAiB,OAAgB,IAAI,CAAC;AAAA,MACpE;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAvDS;AAyDT,MAAI,OAAO,WAAW,eAAe,CAAC,CAAC,YAAY;AACjD,UAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,QAAI,UAAU,IAAI,WAAW,GAAG;AAC9B,cAAQ,IAAI,SAAS;AACnB,eAAO;AAAA,UACL,6CAA6C,UAAU;AAAA,UACvD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc;AAChB,WAAO,SAAS,iBAAiB,YAAY;AAAA,EAC/C;AAEA,MAAI,cAAc;AAChB,WAAO,SAAS,iBAAiB,YAAY;AAAA,EAC/C;AAIA,SAAO;AACT;AAjGgB;AAiIT,SAAS,YAAY,QAA4B;AACtD,SAAO,CAAoC,OAAU;AACnD,WAAO,aAAa,IAAI,MAAM;AAAA,EAChC;AACF;AAJgB;;;AC7KhB,mBAA0B;AAiCnB,SAAS,aAAa,EAAE,UAAU,GAA8B;AACrE,8BAAU,MAAM;AACd,UAAM,mBAAmB,wBAAC,MAAkB;AAC1C,aAAO,IAAI,SAAS,EAAE,MAAM;AAG5B,UAAI,SAAS,EAAE;AACf,UAAI,aAA4B;AAEhC,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAI,CAAC,OAAQ;AAEb,qBAAa,OAAO,aAAa,YAAY;AAG7C,YAAI,WAAY;AAGhB,iBAAS,OAAO;AAAA,MAClB;AAEA,UAAI,CAAC,WAAY;AAEjB,YAAM,OAAO,YAAY,UAAU,KAAK,CAAC;AAEzC,UAAI,CAAC,KAAK,QAAQ;AAChB,eAAO,KAAK,iCAAiC,UAAU,GAAG;AAC1D;AAAA,MACF;AAGA,kBAAY,EAAE,KAAK,CAAC;AAAA,IACtB,GA9ByB;AAgCzB,QAAI;AACF,qBAAe,QAAQ,aAAa,KAAK,UAAU,SAAS,CAAC;AAC7D,kBAAY,EAAE,MAAM,YAAY,UAAU,KAAK,CAAC,EAAE,CAAC;AAAA,IACrD,SAAS,OAAO;AACd,aAAO,MAAM,+CAA+C,KAAK;AAAA,IACnE;AAGA,aAAS,KAAK,iBAAiB,SAAS,gBAAgB;AAGxD,WAAO,MAAM;AACX,eAAS,KAAK,oBAAoB,SAAS,gBAAgB;AAAA,IAC7D;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAChB;AAjDgB;;;AChChB,IAAAC,gBAAkD;AAClD,oBAAmB;AA0Ff;AApFJ,IAAM,YAAY,wBAAC,UAA0B;AAC3C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,kBAAc,uBAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAEtE,QAAM,oBAAgB;AAAA,IACpB,MAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,IACrD,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,gBAAY,sBAAO,aAAa;AAGtC,+BAAU,MAAM;AACd,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,aAAa,CAAC;AAGlB,QAAM,iBAAiB,wBAAC,YAAoB;AAC1C,QAAI;AACF,aAAO,YAAY,OAAO,aAAa,CAAC;AACxC,UAAI,OAAO,OAAO,SAAS,YAAY;AACrC,eAAO,OAAO,gCAAS,OAAO;AAC5B,iBAAO,UAAW,KAAK,SAAS;AAAA,QAClC,GAFc;AAAA,MAGhB;AACA,aAAO,KAAK,MAAM,oBAAI,KAAK,CAAC;AAC5B,aAAO,KAAK,UAAU,SAAS;AAAA,QAC7B,4BAA4B;AAAA,MAC9B,CAAC;AACD,cAAQ,IAAI,oBAAe,OAAO,cAAc;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ,MAAM,kCAAkC,OAAO,KAAK,KAAK;AAAA,IACnE;AAAA,EACF,GAhBuB;AAmBvB,+BAAU,MAAM;AACd,QAAI,CAAC,wBAAwB,OAAO,WAAW,YAAa;AAG5D,QACE,OAAO,OAAO,SAAS,eACvB,OAAO,OAAO,cAAc,aAC5B;AACA,cAAQ,IAAI,+BAA0B;AACtC,oBAAc,QAAQ,CAAC,YAAY,eAAe,OAAO,CAAC;AAC1D,gBAAU,UAAU;AACpB;AAAA,IACF;AAGA,UAAM,oBAAoB,YAAY,MAAM;AAC1C,UACE,OAAO,OAAO,SAAS,eACvB,OAAO,OAAO,cAAc,aAC5B;AACA,gBAAQ,IAAI,+BAA0B;AACtC,sBAAc,iBAAiB;AAC/B,sBAAc,QAAQ,CAAC,YAAY,eAAe,OAAO,CAAC;AAC1D,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF,GAAG,GAAG;AAGN,UAAM,UAAU,WAAW,MAAM;AAC/B,oBAAc,iBAAiB;AAC/B,cAAQ,KAAK,uCAA6B;AAAA,IAC5C,GAAG,GAAI;AAEP,WAAO,MAAM;AACX,oBAAc,iBAAiB;AAC/B,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,sBAAsB,aAAa,CAAC;AAExC,SACE,2EACG,wBAAc,SAAS,KACtB,cAAc,IAAI,CAAC,SAAS,UAC1B;AAAA,IAAC,cAAAC;AAAA,IAAA;AAAA,MAEC,IAAI,aAAa,OAAO,IAAI,KAAK;AAAA,MACjC,MAAM,uBAAuB,eAAe;AAAA,MAC5C,iBAAc;AAAA,MACd;AAAA,MACA,KAAK,+CAA+C,OAAO;AAAA,MAC3D,QAAQ,MAAM;AACZ,gBAAQ,IAAI,oBAAe,OAAO,sBAAsB;AACxD,uBAAe,OAAO;AAAA,MACxB;AAAA,MACA,SAAS,MAAM;AACb,gBAAQ,MAAM,oBAAe,OAAO,oBAAoB;AAAA,MAC1D;AAAA,MACC,GAAG;AAAA;AAAA,IAbC;AAAA,EAcP,CACD,GACL;AAEJ,GA1GkB;AA4GlB,IAAO,oBAAQ;;;ACnHf,IAAAC,gBAAkD;AAClD,IAAAC,iBAAmB;AAiEX,IAAAC;AAAA;AAAA,EAAA;AAAA;AA3DR,IAAM,YAAY,wBAAC,UAA0B;AAC3C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AAEJ,QAAM,kBAAc,uBAAQ,MAAM,KAAK,UAAU,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAEtE,QAAM,oBAAgB;AAAA,IACpB,MAAO,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AAAA,IACrD,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,gBAAY,sBAAO,aAAa;AAGtC,+BAAU,MAAM;AACd,cAAU,UAAU;AAAA,EACtB,GAAG,CAAC,aAAa,CAAC;AAGlB,+BAAU,MAAM;AACd,QAAI,CAAC,wBAAwB,OAAO,WAAW,YAAa;AAG5D,QAAI,OAAO,OAAO,QAAQ,aAAa;AACrC,cAAQ,IAAI,qCAAgC;AAC5C,gBAAU,UAAU;AACpB;AAAA,IACF;AAGA,UAAM,oBAAoB,YAAY,MAAM;AAC1C,UAAI,OAAO,OAAO,QAAQ,aAAa;AACrC,gBAAQ,IAAI,qCAAgC;AAC5C,sBAAc,iBAAiB;AAC/B,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF,GAAG,GAAG;AAGN,UAAM,UAAU,WAAW,MAAM;AAC/B,oBAAc,iBAAiB;AAC/B,cAAQ,KAAK,6CAAmC;AAAA,IAClD,GAAG,GAAI;AAEP,WAAO,MAAM;AACX,oBAAc,iBAAiB;AAC/B,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,oBAAoB,CAAC;AAEzB,SACE,6EACG,yBAAe,SAAS,KACvB,8EACE;AAAA;AAAA,MAAC,eAAAC;AAAA,MAAA;AAAA,QAEC,IAAG;AAAA,QACH;AAAA,QACA,MAAM,uBAAuB,eAAe;AAAA,QAC5C,iBAAc;AAAA,QACd,KAAK;AAAA,QACL,QAAQ,MAAM;AACZ,kBAAQ,IAAI,kDAA6C;AAAA,QAC3D;AAAA,QACA,SAAS,MAAM;AACb,kBAAQ,MAAM,yCAAoC;AAAA,QACpD;AAAA;AAAA,MAXI;AAAA,IAYN;AAAA,IACC,cAAc,IAAI,CAAC,SAAS,UAC3B;AAAA,MAAC,eAAAA;AAAA,MAAA;AAAA,QAEC,IAAI,aAAa,OAAO,IAAI,KAAK;AAAA,QACjC;AAAA,QACA,MAAK;AAAA,QACL,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAMS,OAAO;AAAA;AAAA;AAAA,QAG1B;AAAA,QACA,SAAS,MAAM;AACb,kBAAQ,MAAM,oBAAe,OAAO,eAAe;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAlBC;AAAA,IAmBP,CACD;AAAA,KACH,GAEJ;AAEJ,GArGkB;AAuGlB,IAAO,oBAAQ;;;ACpFN,IAAAC,sBAAA;AAjBT,IAAM,mBAGF;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,gBAA+C,wBAAC,WAAW;AAC/D,QAAM,EAAE,MAAM,GAAG,WAAW,IAAI;AAEhC,QAAM,iBAAiB,iBAAiB,IAAI;AAE5C,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,6CAAC,kBAAgB,GAAG,YAAY;AACzC,GAVqD;AAYrD,IAAO,wBAAQ;;;AfqEf,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":["config","import_react","Script","import_react","import_script","import_jsx_runtime","Script","import_jsx_runtime"]}
package/dist/index.js CHANGED
@@ -544,8 +544,44 @@ function useTracking(config) {
544
544
  }
545
545
  __name(useTracking, "useTracking");
546
546
 
547
+ // src/autoTrack/useDataTrack.ts
548
+ import { useEffect } from "react";
549
+ function useDataTrack({ trackTags }) {
550
+ useEffect(() => {
551
+ const handleTrackClick = /* @__PURE__ */ __name((e) => {
552
+ logger.log("click", e.target);
553
+ let target = e.target;
554
+ let trackValue = null;
555
+ for (let i = 0; i <= 3; i++) {
556
+ if (!target) break;
557
+ trackValue = target.getAttribute("data-track");
558
+ if (trackValue) break;
559
+ target = target.parentElement;
560
+ }
561
+ if (!trackValue) return;
562
+ const tags = trackTags?.[trackValue] || [];
563
+ if (!tags.length) {
564
+ logger.warn(`No tags found for data-track="${trackValue}"`);
565
+ return;
566
+ }
567
+ trackByTags({ tags });
568
+ }, "handleTrackClick");
569
+ try {
570
+ sessionStorage.setItem("trackTags", JSON.stringify(trackTags));
571
+ trackByTags({ tags: trackTags?.["pageView"] || [] });
572
+ } catch (error) {
573
+ logger.error("Failed to save trackTags to sessionStorage:", error);
574
+ }
575
+ document.body.addEventListener("click", handleTrackClick);
576
+ return () => {
577
+ document.body.removeEventListener("click", handleTrackClick);
578
+ };
579
+ }, [trackTags]);
580
+ }
581
+ __name(useDataTrack, "useDataTrack");
582
+
547
583
  // src/pixels/GtagPixel.tsx
548
- import { useEffect, useRef, useMemo } from "react";
584
+ import { useEffect as useEffect2, useRef, useMemo } from "react";
549
585
  import Script from "next/script";
550
586
  import { Fragment, jsx } from "react/jsx-runtime";
551
587
  var GtagPixel = /* @__PURE__ */ __name((props) => {
@@ -562,7 +598,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
562
598
  [pixelIdsKey]
563
599
  );
564
600
  const onLoadRef = useRef(onPixelLoaded);
565
- useEffect(() => {
601
+ useEffect2(() => {
566
602
  onLoadRef.current = onPixelLoaded;
567
603
  }, [onPixelLoaded]);
568
604
  const initializeGtag = /* @__PURE__ */ __name((pixelId) => {
@@ -582,7 +618,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
582
618
  console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);
583
619
  }
584
620
  }, "initializeGtag");
585
- useEffect(() => {
621
+ useEffect2(() => {
586
622
  if (!cookieConsentEnabled || typeof window === "undefined") return;
587
623
  if (typeof window.gtag !== "undefined" || typeof window.dataLayer !== "undefined") {
588
624
  console.log("\u2705 Gtag already available");
@@ -630,7 +666,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
630
666
  var GtagPixel_default = GtagPixel;
631
667
 
632
668
  // src/pixels/MetaPixel.tsx
633
- import { useEffect as useEffect2, useRef as useRef2, useMemo as useMemo2 } from "react";
669
+ import { useEffect as useEffect3, useRef as useRef2, useMemo as useMemo2 } from "react";
634
670
  import Script2 from "next/script";
635
671
  import { Fragment as Fragment2, jsx as jsx2, jsxs } from "react/jsx-runtime";
636
672
  var MetaPixel = /* @__PURE__ */ __name((props) => {
@@ -647,10 +683,10 @@ var MetaPixel = /* @__PURE__ */ __name((props) => {
647
683
  [pixelIdsKey]
648
684
  );
649
685
  const onLoadRef = useRef2(onPixelLoaded);
650
- useEffect2(() => {
686
+ useEffect3(() => {
651
687
  onLoadRef.current = onPixelLoaded;
652
688
  }, [onPixelLoaded]);
653
- useEffect2(() => {
689
+ useEffect3(() => {
654
690
  if (!cookieConsentEnabled || typeof window === "undefined") return;
655
691
  if (typeof window.fbq !== "undefined") {
656
692
  console.log("\u2705 window.fbq already available");
@@ -766,6 +802,7 @@ export {
766
802
  triggerTrackBatch,
767
803
  updateScriptType,
768
804
  updateScriptsType,
805
+ useDataTrack,
769
806
  useTracking,
770
807
  withTracking
771
808
  };