@anker-in/analysis 0.2.2 → 0.3.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 +53 -0
- package/dist/index.cjs +49 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +31 -1
- package/dist/index.d.ts +31 -1
- package/dist/index.js +42 -6
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
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,43 @@ function useTracking(config) {
|
|
|
597
598
|
}
|
|
598
599
|
__name(useTracking, "useTracking");
|
|
599
600
|
|
|
600
|
-
// src/
|
|
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
|
+
} catch (error) {
|
|
626
|
+
logger.error("Failed to save trackTags to sessionStorage:", error);
|
|
627
|
+
}
|
|
628
|
+
document.body.addEventListener("click", handleTrackClick);
|
|
629
|
+
return () => {
|
|
630
|
+
document.body.removeEventListener("click", handleTrackClick);
|
|
631
|
+
};
|
|
632
|
+
}, [trackTags]);
|
|
633
|
+
}
|
|
634
|
+
__name(useDataTrack, "useDataTrack");
|
|
635
|
+
|
|
636
|
+
// src/pixels/GtagPixel.tsx
|
|
637
|
+
var import_react2 = require("react");
|
|
602
638
|
var import_script = __toESM(require("next/script"));
|
|
603
639
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
604
640
|
var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
@@ -609,13 +645,13 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
609
645
|
onPixelLoaded,
|
|
610
646
|
...scriptProps
|
|
611
647
|
} = props;
|
|
612
|
-
const pixelIdsKey = (0,
|
|
613
|
-
const pixelIdsArray = (0,
|
|
648
|
+
const pixelIdsKey = (0, import_react2.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
|
|
649
|
+
const pixelIdsArray = (0, import_react2.useMemo)(
|
|
614
650
|
() => Array.isArray(pixelIds) ? pixelIds : [pixelIds],
|
|
615
651
|
[pixelIdsKey]
|
|
616
652
|
);
|
|
617
|
-
const onLoadRef = (0,
|
|
618
|
-
(0,
|
|
653
|
+
const onLoadRef = (0, import_react2.useRef)(onPixelLoaded);
|
|
654
|
+
(0, import_react2.useEffect)(() => {
|
|
619
655
|
onLoadRef.current = onPixelLoaded;
|
|
620
656
|
}, [onPixelLoaded]);
|
|
621
657
|
const initializeGtag = /* @__PURE__ */ __name((pixelId) => {
|
|
@@ -635,7 +671,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
635
671
|
console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);
|
|
636
672
|
}
|
|
637
673
|
}, "initializeGtag");
|
|
638
|
-
(0,
|
|
674
|
+
(0, import_react2.useEffect)(() => {
|
|
639
675
|
if (!cookieConsentEnabled || typeof window === "undefined") return;
|
|
640
676
|
if (typeof window.gtag !== "undefined" || typeof window.dataLayer !== "undefined") {
|
|
641
677
|
console.log("\u2705 Gtag already available");
|
|
@@ -683,7 +719,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
683
719
|
var GtagPixel_default = GtagPixel;
|
|
684
720
|
|
|
685
721
|
// src/pixels/MetaPixel.tsx
|
|
686
|
-
var
|
|
722
|
+
var import_react3 = require("react");
|
|
687
723
|
var import_script2 = __toESM(require("next/script"));
|
|
688
724
|
var import_jsx_runtime2 = (
|
|
689
725
|
// 添加 cookieConsentEnabled 条件
|
|
@@ -697,16 +733,16 @@ var MetaPixel = /* @__PURE__ */ __name((props) => {
|
|
|
697
733
|
onPixelLoaded,
|
|
698
734
|
...scriptProps
|
|
699
735
|
} = props;
|
|
700
|
-
const pixelIdsKey = (0,
|
|
701
|
-
const pixelIdsArray = (0,
|
|
736
|
+
const pixelIdsKey = (0, import_react3.useMemo)(() => JSON.stringify(pixelIds), [pixelIds]);
|
|
737
|
+
const pixelIdsArray = (0, import_react3.useMemo)(
|
|
702
738
|
() => Array.isArray(pixelIds) ? pixelIds : [pixelIds],
|
|
703
739
|
[pixelIdsKey]
|
|
704
740
|
);
|
|
705
|
-
const onLoadRef = (0,
|
|
706
|
-
(0,
|
|
741
|
+
const onLoadRef = (0, import_react3.useRef)(onPixelLoaded);
|
|
742
|
+
(0, import_react3.useEffect)(() => {
|
|
707
743
|
onLoadRef.current = onPixelLoaded;
|
|
708
744
|
}, [onPixelLoaded]);
|
|
709
|
-
(0,
|
|
745
|
+
(0, import_react3.useEffect)(() => {
|
|
710
746
|
if (!cookieConsentEnabled || typeof window === "undefined") return;
|
|
711
747
|
if (typeof window.fbq !== "undefined") {
|
|
712
748
|
console.log("\u2705 window.fbq already available");
|
|
@@ -821,6 +857,7 @@ var index_default = {
|
|
|
821
857
|
triggerTrackBatch,
|
|
822
858
|
updateScriptType,
|
|
823
859
|
updateScriptsType,
|
|
860
|
+
useDataTrack,
|
|
824
861
|
useTracking,
|
|
825
862
|
withTracking
|
|
826
863
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 } 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":"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","names":["config","import_react","Script","import_react","import_script","import_jsx_runtime","Script","import_jsx_runtime"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -444,6 +444,36 @@ declare const gtagTrack: (command: GtagCommand, targetOrEventName: string, param
|
|
|
444
444
|
*/
|
|
445
445
|
declare const metaTrack: (event: string, data?: object) => void;
|
|
446
446
|
|
|
447
|
+
interface UseDataTrackOptions {
|
|
448
|
+
/**
|
|
449
|
+
* 埋点标签映射对象
|
|
450
|
+
* 键为 data-track 属性值,值为标签数组
|
|
451
|
+
*/
|
|
452
|
+
trackTags?: Record<string, string[]>;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* 自动追踪带有 data-track 属性的元素点击事件的 Hook
|
|
456
|
+
*
|
|
457
|
+
* @param options - 配置选项
|
|
458
|
+
* @param options.trackTags - 埋点标签映射对象,键为 data-track 属性值,值为标签数组
|
|
459
|
+
* @example
|
|
460
|
+
* ```tsx
|
|
461
|
+
* function MyComponent() {
|
|
462
|
+
* useDataTrack({
|
|
463
|
+
* trackTags: {
|
|
464
|
+
* 'add-to-cart': ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],
|
|
465
|
+
* 'checkout': ['fbq:checkout:1234567890']
|
|
466
|
+
* }
|
|
467
|
+
* });
|
|
468
|
+
*
|
|
469
|
+
* return (
|
|
470
|
+
* <button data-track="add-to-cart">Add to Cart</button>
|
|
471
|
+
* );
|
|
472
|
+
* }
|
|
473
|
+
* ```
|
|
474
|
+
*/
|
|
475
|
+
declare function useDataTrack({ trackTags }: UseDataTrackOptions): void;
|
|
476
|
+
|
|
447
477
|
interface GtagPixelProps extends GtagConfig, React.ScriptHTMLAttributes<HTMLScriptElement> {
|
|
448
478
|
}
|
|
449
479
|
declare const GtagPixel: (props: GtagPixelProps) => react_jsx_runtime.JSX.Element;
|
|
@@ -479,4 +509,4 @@ declare const _default: {
|
|
|
479
509
|
updateScriptsType: typeof updateScriptsType;
|
|
480
510
|
};
|
|
481
511
|
|
|
482
|
-
export { type AnalysisConfig, type AutoTrackConfig, type BasePlatformConfig, type Currency, type GtagConfig, type GtagConfigParams, type GtagEventName, GtagPixel, type GtagTrackParams, MetaPixel, type MetaPixelConfig, type MetaTrackParams, type ParsedTag, PixelsManager, type PixelsManagerConfig, type PlatformType, type ScarabConfig, type TikTokPixelConfig, type TrackByTagsData, type TrackByTagsParams, type TrackConfig, type TrackEventType, type TrackParams, type TrackTagsConfig, TrackTagsVersionMap, type Tracker, type TriggerTrackOptions, type UpdateScriptTypeOptions, clearTrackTags, _default as default, gtagTrack, hasTrackPoint, isPlatformAvailable, logger, metaTrack, setTrackTags, track, trackByTags, triggerTrack, triggerTrackBatch, updateScriptType, updateScriptsType, useTracking, withTracking };
|
|
512
|
+
export { type AnalysisConfig, type AutoTrackConfig, type BasePlatformConfig, type Currency, type GtagConfig, type GtagConfigParams, type GtagEventName, GtagPixel, type GtagTrackParams, MetaPixel, type MetaPixelConfig, type MetaTrackParams, type ParsedTag, PixelsManager, type PixelsManagerConfig, type PlatformType, type ScarabConfig, type TikTokPixelConfig, type TrackByTagsData, type TrackByTagsParams, type TrackConfig, type TrackEventType, type TrackParams, type TrackTagsConfig, TrackTagsVersionMap, type Tracker, type TriggerTrackOptions, type UpdateScriptTypeOptions, type UseDataTrackOptions, clearTrackTags, _default as default, gtagTrack, hasTrackPoint, isPlatformAvailable, logger, metaTrack, setTrackTags, track, trackByTags, triggerTrack, triggerTrackBatch, updateScriptType, updateScriptsType, useDataTrack, useTracking, withTracking };
|
package/dist/index.d.ts
CHANGED
|
@@ -444,6 +444,36 @@ declare const gtagTrack: (command: GtagCommand, targetOrEventName: string, param
|
|
|
444
444
|
*/
|
|
445
445
|
declare const metaTrack: (event: string, data?: object) => void;
|
|
446
446
|
|
|
447
|
+
interface UseDataTrackOptions {
|
|
448
|
+
/**
|
|
449
|
+
* 埋点标签映射对象
|
|
450
|
+
* 键为 data-track 属性值,值为标签数组
|
|
451
|
+
*/
|
|
452
|
+
trackTags?: Record<string, string[]>;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* 自动追踪带有 data-track 属性的元素点击事件的 Hook
|
|
456
|
+
*
|
|
457
|
+
* @param options - 配置选项
|
|
458
|
+
* @param options.trackTags - 埋点标签映射对象,键为 data-track 属性值,值为标签数组
|
|
459
|
+
* @example
|
|
460
|
+
* ```tsx
|
|
461
|
+
* function MyComponent() {
|
|
462
|
+
* useDataTrack({
|
|
463
|
+
* trackTags: {
|
|
464
|
+
* 'add-to-cart': ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],
|
|
465
|
+
* 'checkout': ['fbq:checkout:1234567890']
|
|
466
|
+
* }
|
|
467
|
+
* });
|
|
468
|
+
*
|
|
469
|
+
* return (
|
|
470
|
+
* <button data-track="add-to-cart">Add to Cart</button>
|
|
471
|
+
* );
|
|
472
|
+
* }
|
|
473
|
+
* ```
|
|
474
|
+
*/
|
|
475
|
+
declare function useDataTrack({ trackTags }: UseDataTrackOptions): void;
|
|
476
|
+
|
|
447
477
|
interface GtagPixelProps extends GtagConfig, React.ScriptHTMLAttributes<HTMLScriptElement> {
|
|
448
478
|
}
|
|
449
479
|
declare const GtagPixel: (props: GtagPixelProps) => react_jsx_runtime.JSX.Element;
|
|
@@ -479,4 +509,4 @@ declare const _default: {
|
|
|
479
509
|
updateScriptsType: typeof updateScriptsType;
|
|
480
510
|
};
|
|
481
511
|
|
|
482
|
-
export { type AnalysisConfig, type AutoTrackConfig, type BasePlatformConfig, type Currency, type GtagConfig, type GtagConfigParams, type GtagEventName, GtagPixel, type GtagTrackParams, MetaPixel, type MetaPixelConfig, type MetaTrackParams, type ParsedTag, PixelsManager, type PixelsManagerConfig, type PlatformType, type ScarabConfig, type TikTokPixelConfig, type TrackByTagsData, type TrackByTagsParams, type TrackConfig, type TrackEventType, type TrackParams, type TrackTagsConfig, TrackTagsVersionMap, type Tracker, type TriggerTrackOptions, type UpdateScriptTypeOptions, clearTrackTags, _default as default, gtagTrack, hasTrackPoint, isPlatformAvailable, logger, metaTrack, setTrackTags, track, trackByTags, triggerTrack, triggerTrackBatch, updateScriptType, updateScriptsType, useTracking, withTracking };
|
|
512
|
+
export { type AnalysisConfig, type AutoTrackConfig, type BasePlatformConfig, type Currency, type GtagConfig, type GtagConfigParams, type GtagEventName, GtagPixel, type GtagTrackParams, MetaPixel, type MetaPixelConfig, type MetaTrackParams, type ParsedTag, PixelsManager, type PixelsManagerConfig, type PlatformType, type ScarabConfig, type TikTokPixelConfig, type TrackByTagsData, type TrackByTagsParams, type TrackConfig, type TrackEventType, type TrackParams, type TrackTagsConfig, TrackTagsVersionMap, type Tracker, type TriggerTrackOptions, type UpdateScriptTypeOptions, type UseDataTrackOptions, clearTrackTags, _default as default, gtagTrack, hasTrackPoint, isPlatformAvailable, logger, metaTrack, setTrackTags, track, trackByTags, triggerTrack, triggerTrackBatch, updateScriptType, updateScriptsType, useDataTrack, useTracking, withTracking };
|
package/dist/index.js
CHANGED
|
@@ -544,8 +544,43 @@ 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
|
+
} catch (error) {
|
|
572
|
+
logger.error("Failed to save trackTags to sessionStorage:", error);
|
|
573
|
+
}
|
|
574
|
+
document.body.addEventListener("click", handleTrackClick);
|
|
575
|
+
return () => {
|
|
576
|
+
document.body.removeEventListener("click", handleTrackClick);
|
|
577
|
+
};
|
|
578
|
+
}, [trackTags]);
|
|
579
|
+
}
|
|
580
|
+
__name(useDataTrack, "useDataTrack");
|
|
581
|
+
|
|
547
582
|
// src/pixels/GtagPixel.tsx
|
|
548
|
-
import { useEffect, useRef, useMemo } from "react";
|
|
583
|
+
import { useEffect as useEffect2, useRef, useMemo } from "react";
|
|
549
584
|
import Script from "next/script";
|
|
550
585
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
551
586
|
var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
@@ -562,7 +597,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
562
597
|
[pixelIdsKey]
|
|
563
598
|
);
|
|
564
599
|
const onLoadRef = useRef(onPixelLoaded);
|
|
565
|
-
|
|
600
|
+
useEffect2(() => {
|
|
566
601
|
onLoadRef.current = onPixelLoaded;
|
|
567
602
|
}, [onPixelLoaded]);
|
|
568
603
|
const initializeGtag = /* @__PURE__ */ __name((pixelId) => {
|
|
@@ -582,7 +617,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
582
617
|
console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);
|
|
583
618
|
}
|
|
584
619
|
}, "initializeGtag");
|
|
585
|
-
|
|
620
|
+
useEffect2(() => {
|
|
586
621
|
if (!cookieConsentEnabled || typeof window === "undefined") return;
|
|
587
622
|
if (typeof window.gtag !== "undefined" || typeof window.dataLayer !== "undefined") {
|
|
588
623
|
console.log("\u2705 Gtag already available");
|
|
@@ -630,7 +665,7 @@ var GtagPixel = /* @__PURE__ */ __name((props) => {
|
|
|
630
665
|
var GtagPixel_default = GtagPixel;
|
|
631
666
|
|
|
632
667
|
// src/pixels/MetaPixel.tsx
|
|
633
|
-
import { useEffect as
|
|
668
|
+
import { useEffect as useEffect3, useRef as useRef2, useMemo as useMemo2 } from "react";
|
|
634
669
|
import Script2 from "next/script";
|
|
635
670
|
import { Fragment as Fragment2, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
636
671
|
var MetaPixel = /* @__PURE__ */ __name((props) => {
|
|
@@ -647,10 +682,10 @@ var MetaPixel = /* @__PURE__ */ __name((props) => {
|
|
|
647
682
|
[pixelIdsKey]
|
|
648
683
|
);
|
|
649
684
|
const onLoadRef = useRef2(onPixelLoaded);
|
|
650
|
-
|
|
685
|
+
useEffect3(() => {
|
|
651
686
|
onLoadRef.current = onPixelLoaded;
|
|
652
687
|
}, [onPixelLoaded]);
|
|
653
|
-
|
|
688
|
+
useEffect3(() => {
|
|
654
689
|
if (!cookieConsentEnabled || typeof window === "undefined") return;
|
|
655
690
|
if (typeof window.fbq !== "undefined") {
|
|
656
691
|
console.log("\u2705 window.fbq already available");
|
|
@@ -766,6 +801,7 @@ export {
|
|
|
766
801
|
triggerTrackBatch,
|
|
767
802
|
updateScriptType,
|
|
768
803
|
updateScriptsType,
|
|
804
|
+
useDataTrack,
|
|
769
805
|
useTracking,
|
|
770
806
|
withTracking
|
|
771
807
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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","../src/index.ts"],"sourcesContent":["/**\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","/**\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"],"mappings":"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","names":["config","useEffect","useRef","useMemo","Script","Fragment","jsx","useMemo","useRef","useEffect","Script","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../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","../src/index.ts"],"sourcesContent":["/**\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 } 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","/**\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"],"mappings":"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","names":["config","useEffect","useEffect","useEffect","useRef","useMemo","Script","Fragment","jsx","useMemo","useRef","useEffect","Script","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anker-in/analysis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Unified analytics SDK for multi-platform tracking (Google Analytics, Meta Pixel, TikTok Pixel)",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -21,12 +21,6 @@
|
|
|
21
21
|
"dist/**",
|
|
22
22
|
"README.md"
|
|
23
23
|
],
|
|
24
|
-
"scripts": {
|
|
25
|
-
"build": "tsup",
|
|
26
|
-
"dev": "tsup --watch",
|
|
27
|
-
"lint": "eslint . --max-warnings 0",
|
|
28
|
-
"check-types": "tsc --noEmit"
|
|
29
|
-
},
|
|
30
24
|
"keywords": [
|
|
31
25
|
"analytics",
|
|
32
26
|
"tracking",
|
|
@@ -50,17 +44,23 @@
|
|
|
50
44
|
"vanilla-cookieconsent": ">=3.1.0"
|
|
51
45
|
},
|
|
52
46
|
"devDependencies": {
|
|
53
|
-
"@repo/eslint-config": "workspace:*",
|
|
54
|
-
"@repo/typescript-config": "workspace:*",
|
|
55
47
|
"@types/node": "^22.15.3",
|
|
56
48
|
"@types/react": "19.1.0",
|
|
57
49
|
"@types/react-dom": "19.1.1",
|
|
58
50
|
"eslint": "^9.34.0",
|
|
59
51
|
"tsup": "^8.5.1",
|
|
60
|
-
"typescript": "5.9.2"
|
|
52
|
+
"typescript": "5.9.2",
|
|
53
|
+
"@repo/eslint-config": "0.0.1",
|
|
54
|
+
"@repo/typescript-config": "0.0.1"
|
|
61
55
|
},
|
|
62
56
|
"dependencies": {
|
|
63
57
|
"react": "^19.1.0",
|
|
64
58
|
"react-dom": "^19.1.0"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsup",
|
|
62
|
+
"dev": "tsup --watch",
|
|
63
|
+
"lint": "eslint . --max-warnings 0",
|
|
64
|
+
"check-types": "tsc --noEmit"
|
|
65
65
|
}
|
|
66
|
-
}
|
|
66
|
+
}
|