@anker-in/analysis 0.1.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.
Files changed (101) hide show
  1. package/README.md +240 -0
  2. package/dist/autoTrack/click.d.ts +2 -0
  3. package/dist/autoTrack/click.d.ts.map +1 -0
  4. package/dist/autoTrack/click.js +80 -0
  5. package/dist/autoTrack/index.d.ts +2 -0
  6. package/dist/autoTrack/index.d.ts.map +1 -0
  7. package/dist/autoTrack/index.js +47 -0
  8. package/dist/autoTrack/pv.d.ts +2 -0
  9. package/dist/autoTrack/pv.d.ts.map +1 -0
  10. package/dist/autoTrack/pv.js +57 -0
  11. package/dist/autoTrack/trackByTags.d.ts +17 -0
  12. package/dist/autoTrack/trackByTags.d.ts.map +1 -0
  13. package/dist/autoTrack/trackByTags.js +141 -0
  14. package/dist/constants/index.d.ts +2 -0
  15. package/dist/constants/index.d.ts.map +1 -0
  16. package/dist/constants/index.js +1 -0
  17. package/dist/constants/tagsMap.d.ts +9 -0
  18. package/dist/constants/tagsMap.d.ts.map +1 -0
  19. package/dist/constants/tagsMap.js +8 -0
  20. package/dist/core/adapters/gtag.d.ts +37 -0
  21. package/dist/core/adapters/gtag.d.ts.map +1 -0
  22. package/dist/core/adapters/gtag.js +55 -0
  23. package/dist/core/adapters/index.d.ts +6 -0
  24. package/dist/core/adapters/index.d.ts.map +1 -0
  25. package/dist/core/adapters/index.js +5 -0
  26. package/dist/core/adapters/meta.d.ts +20 -0
  27. package/dist/core/adapters/meta.d.ts.map +1 -0
  28. package/dist/core/adapters/meta.js +41 -0
  29. package/dist/core/helpers/function-utils.d.ts +17 -0
  30. package/dist/core/helpers/function-utils.d.ts.map +1 -0
  31. package/dist/core/helpers/function-utils.js +43 -0
  32. package/dist/core/helpers/index.d.ts +8 -0
  33. package/dist/core/helpers/index.d.ts.map +1 -0
  34. package/dist/core/helpers/index.js +7 -0
  35. package/dist/core/helpers/logger.d.ts +20 -0
  36. package/dist/core/helpers/logger.d.ts.map +1 -0
  37. package/dist/core/helpers/logger.js +32 -0
  38. package/dist/core/helpers/platform-detector.d.ts +14 -0
  39. package/dist/core/helpers/platform-detector.d.ts.map +1 -0
  40. package/dist/core/helpers/platform-detector.js +28 -0
  41. package/dist/core/helpers/script-loader.d.ts +39 -0
  42. package/dist/core/helpers/script-loader.d.ts.map +1 -0
  43. package/dist/core/helpers/script-loader.js +107 -0
  44. package/dist/core/index.d.ts +7 -0
  45. package/dist/core/index.d.ts.map +1 -0
  46. package/dist/core/index.js +9 -0
  47. package/dist/core/track/gtagTrack.d.ts +2 -0
  48. package/dist/core/track/gtagTrack.d.ts.map +1 -0
  49. package/dist/core/track/gtagTrack.js +12 -0
  50. package/dist/core/track/index.d.ts +4 -0
  51. package/dist/core/track/index.d.ts.map +1 -0
  52. package/dist/core/track/index.js +3 -0
  53. package/dist/core/track/metaTrack.d.ts +2 -0
  54. package/dist/core/track/metaTrack.d.ts.map +1 -0
  55. package/dist/core/track/metaTrack.js +18 -0
  56. package/dist/core/track/track.d.ts +6 -0
  57. package/dist/core/track/track.d.ts.map +1 -0
  58. package/dist/core/track/track.js +128 -0
  59. package/dist/core/tracking/dispatcher.d.ts +10 -0
  60. package/dist/core/tracking/dispatcher.d.ts.map +1 -0
  61. package/dist/core/tracking/dispatcher.js +67 -0
  62. package/dist/core/tracking/index.d.ts +6 -0
  63. package/dist/core/tracking/index.d.ts.map +1 -0
  64. package/dist/core/tracking/index.js +5 -0
  65. package/dist/core/tracking/with-tracking.d.ts +33 -0
  66. package/dist/core/tracking/with-tracking.d.ts.map +1 -0
  67. package/dist/core/tracking/with-tracking.js +137 -0
  68. package/dist/core/utils.d.ts +64 -0
  69. package/dist/core/utils.d.ts.map +1 -0
  70. package/dist/core/utils.js +182 -0
  71. package/dist/index.d.ts +36 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +34 -0
  74. package/dist/pixels/GtagPixel.d.ts +7 -0
  75. package/dist/pixels/GtagPixel.d.ts.map +1 -0
  76. package/dist/pixels/GtagPixel.js +73 -0
  77. package/dist/pixels/MetaPixel.d.ts +7 -0
  78. package/dist/pixels/MetaPixel.d.ts.map +1 -0
  79. package/dist/pixels/MetaPixel.js +61 -0
  80. package/dist/pixels/PixelsManager.d.ts +5 -0
  81. package/dist/pixels/PixelsManager.d.ts.map +1 -0
  82. package/dist/pixels/PixelsManager.js +17 -0
  83. package/dist/pixels/index.d.ts +4 -0
  84. package/dist/pixels/index.d.ts.map +1 -0
  85. package/dist/pixels/index.js +3 -0
  86. package/dist/types/common.d.ts +66 -0
  87. package/dist/types/common.d.ts.map +1 -0
  88. package/dist/types/common.js +1 -0
  89. package/dist/types/gtag.d.ts +34 -0
  90. package/dist/types/gtag.d.ts.map +1 -0
  91. package/dist/types/gtag.js +1 -0
  92. package/dist/types/index.d.ts +91 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/index.js +1 -0
  95. package/dist/types/meta.d.ts +8 -0
  96. package/dist/types/meta.d.ts.map +1 -0
  97. package/dist/types/meta.js +4 -0
  98. package/dist/types/trackByTags.d.ts +26 -0
  99. package/dist/types/trackByTags.d.ts.map +1 -0
  100. package/dist/types/trackByTags.js +4 -0
  101. package/package.json +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI5D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,EACL,MAAM,EACN,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAI/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKlD,YAAY,EACV,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,OAAO,EACP,eAAe,EACf,QAAQ,EACR,WAAW,EACX,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,SAAS,GACV,MAAM,SAAS,CAAC;AAGjB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAI9D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAGL,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;;;;;;;;;;;;;;;;AAE5D,wBASE"}
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Analysis SDK - 埋点 SDK 主入口
3
+ *
4
+ * 提供统一的埋点接口,支持多平台埋点上报
5
+ */
6
+ // ============= 核心功能 =============
7
+ export { track } from "./core/tracking";
8
+ export { gtagTrack } from "./core/adapters";
9
+ export { metaTrack } from "./core/adapters";
10
+ // ============= 高阶函数 - 无侵入式埋点 =============
11
+ export { withTracking, useTracking } from "./core/tracking";
12
+ // ============= TrackByTags 功能 =============
13
+ export { trackByTags } from "./autoTrack/trackByTags";
14
+ // ============= 工具函数 =============
15
+ export { logger, isPlatformAvailable, updateScriptType, updateScriptsType, } from "./core/helpers";
16
+ // ============= Pixels 组件 =============
17
+ export { GtagPixel, MetaPixel, PixelsManager } from "./pixels";
18
+ // ============= 常量 =============
19
+ export { TrackTagsVersionMap } from "./constants";
20
+ // ============= 默认导出 =============
21
+ import { track } from "./core/tracking";
22
+ import { trackByTags } from "./autoTrack/trackByTags";
23
+ import { logger, isPlatformAvailable, updateScriptType, updateScriptsType, } from "./core/helpers";
24
+ import { withTracking, useTracking } from "./core/tracking";
25
+ export default {
26
+ track,
27
+ trackByTags,
28
+ withTracking,
29
+ useTracking,
30
+ logger,
31
+ isPlatformAvailable,
32
+ updateScriptType,
33
+ updateScriptsType,
34
+ };
@@ -0,0 +1,7 @@
1
+ import type { GtagConfig } from "../types";
2
+ import React from "react";
3
+ interface GtagPixelProps extends GtagConfig, React.ScriptHTMLAttributes<HTMLScriptElement> {
4
+ }
5
+ declare const GtagPixel: (props: GtagPixelProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default GtagPixel;
7
+ //# sourceMappingURL=GtagPixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GtagPixel.d.ts","sourceRoot":"","sources":["../../src/pixels/GtagPixel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAqC,MAAM,OAAO,CAAC;AAG1D,UAAU,cACR,SAAQ,UAAU,EAChB,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;CAAG;AAEpD,QAAA,MAAM,SAAS,GAAI,OAAO,cAAc,4CA0GvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useMemo } from "react";
3
+ import Script from "next/script";
4
+ const GtagPixel = (props) => {
5
+ const { cookieConsentEnabled, pixelIds, strategy, onPixelLoaded, ...scriptProps } = props;
6
+ const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);
7
+ const pixelIdsArray = useMemo(() => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]), [pixelIdsKey]);
8
+ // 使用 ref 存储 onPixelLoaded,避免依赖项变化导致 useEffect 重复执行
9
+ const onLoadRef = useRef(onPixelLoaded);
10
+ // 更新 ref(保持最新的回调引用)
11
+ useEffect(() => {
12
+ onLoadRef.current = onPixelLoaded;
13
+ }, [onPixelLoaded]);
14
+ // Gtag 初始化函数
15
+ const initializeGtag = (pixelId) => {
16
+ try {
17
+ window.dataLayer = window.dataLayer || [];
18
+ if (typeof window.gtag !== "function") {
19
+ window.gtag = function gtag() {
20
+ window.dataLayer.push(arguments);
21
+ };
22
+ }
23
+ window.gtag("js", new Date());
24
+ window.gtag("config", pixelId, {
25
+ allow_enhanced_conversions: true,
26
+ });
27
+ console.log(`✅ GtagPixel ${pixelId} initialized`);
28
+ }
29
+ catch (error) {
30
+ console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);
31
+ }
32
+ };
33
+ // 检测 gtag 是否加载完成(仅在 cookieConsentEnabled=true 时监听)
34
+ useEffect(() => {
35
+ if (!cookieConsentEnabled || typeof window === "undefined")
36
+ return;
37
+ // 如果 gtag 或 dataLayer 已存在,立即初始化
38
+ if (typeof window.gtag !== "undefined" ||
39
+ typeof window.dataLayer !== "undefined") {
40
+ console.log("✅ Gtag already available");
41
+ pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));
42
+ onLoadRef.current?.();
43
+ return;
44
+ }
45
+ // 否则轮询检测
46
+ const checkScriptLoaded = setInterval(() => {
47
+ if (typeof window.gtag !== "undefined" ||
48
+ typeof window.dataLayer !== "undefined") {
49
+ console.log("✅ Gtag became available!");
50
+ clearInterval(checkScriptLoaded);
51
+ pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));
52
+ onLoadRef.current?.();
53
+ }
54
+ }, 100);
55
+ // 5秒超时
56
+ const timeout = setTimeout(() => {
57
+ clearInterval(checkScriptLoaded);
58
+ console.warn("⚠️ Timeout waiting for gtag");
59
+ }, 5000);
60
+ return () => {
61
+ clearInterval(checkScriptLoaded);
62
+ clearTimeout(timeout);
63
+ };
64
+ }, [cookieConsentEnabled, pixelIdsArray]);
65
+ return (_jsx(_Fragment, { children: pixelIdsArray.length > 0 &&
66
+ pixelIdsArray.map((pixelId, index) => (_jsx(Script, { id: `GtagPixel_${pixelId}_${index}`, type: cookieConsentEnabled ? "text/plain" : "text/javascript", "data-category": "targeting", strategy: strategy, src: `https://www.googletagmanager.com/gtag/js?id=${pixelId}`, onLoad: () => {
67
+ console.log(`✅ GtagPixel ${pixelId} loaded from network`);
68
+ initializeGtag(pixelId);
69
+ }, onError: () => {
70
+ console.error(`❌ GtagPixel ${pixelId} script load error`);
71
+ }, ...scriptProps }, pixelId))) }));
72
+ };
73
+ export default GtagPixel;
@@ -0,0 +1,7 @@
1
+ import type { BasePlatformConfig } from "../types";
2
+ import React from "react";
3
+ interface MetaPixelProps extends BasePlatformConfig, React.ScriptHTMLAttributes<HTMLScriptElement> {
4
+ }
5
+ declare const MetaPixel: (props: MetaPixelProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default MetaPixel;
7
+ //# sourceMappingURL=MetaPixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetaPixel.d.ts","sourceRoot":"","sources":["../../src/pixels/MetaPixel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,KAAqC,MAAM,OAAO,CAAC;AAG1D,UAAU,cACR,SAAQ,kBAAkB,EACxB,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;CAAG;AAEpD,QAAA,MAAM,SAAS,GAAI,OAAO,cAAc,4CAqGvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useMemo } from "react";
3
+ import Script from "next/script";
4
+ const MetaPixel = (props) => {
5
+ const { cookieConsentEnabled, pixelIds, strategy, onPixelLoaded, ...scriptProps } = props;
6
+ const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);
7
+ const pixelIdsArray = useMemo(() => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]), [pixelIdsKey]);
8
+ // 使用 ref 存储 onLoad,避免依赖项变化导致 useEffect 重复执行
9
+ const onLoadRef = useRef(onPixelLoaded);
10
+ // 更新 ref(保持最新的回调引用)
11
+ useEffect(() => {
12
+ onLoadRef.current = onPixelLoaded;
13
+ }, [onPixelLoaded]);
14
+ // 检测 fbq 是否加载完成(仅在 cookieConsentEnabled=true 时监听)
15
+ useEffect(() => {
16
+ if (!cookieConsentEnabled || typeof window === "undefined")
17
+ return;
18
+ // 如果 fbq 已经存在,立即触发回调
19
+ if (typeof window.fbq !== "undefined") {
20
+ console.log("✅ window.fbq already available");
21
+ onLoadRef.current?.();
22
+ return;
23
+ }
24
+ // 否则开始轮询检测
25
+ const checkScriptLoaded = setInterval(() => {
26
+ if (typeof window.fbq !== "undefined") {
27
+ console.log("✅ window.fbq became available!");
28
+ clearInterval(checkScriptLoaded);
29
+ onLoadRef.current?.();
30
+ }
31
+ }, 100);
32
+ // 5秒超时
33
+ const timeout = setTimeout(() => {
34
+ clearInterval(checkScriptLoaded);
35
+ console.warn("⚠️ Timeout waiting for window.fbq");
36
+ }, 5000);
37
+ return () => {
38
+ clearInterval(checkScriptLoaded);
39
+ clearTimeout(timeout);
40
+ };
41
+ }, [cookieConsentEnabled]);
42
+ return (_jsx(_Fragment, { children: pixelIdsArray?.length > 0 && ( // 添加 cookieConsentEnabled 条件
43
+ _jsxs(_Fragment, { children: [_jsx(Script, { id: "MetaPixel", strategy: strategy, type: cookieConsentEnabled ? "text/plain" : "text/javascript", "data-category": "targeting", src: `https://connect.facebook.net/en_US/fbevents.js`, onLoad: () => {
44
+ console.log("✅ MetaPixel main script loaded from network");
45
+ }, onError: () => {
46
+ console.error("❌ MetaPixel main script load error");
47
+ } }, "MetaPixel"), pixelIdsArray.map((pixelId, index) => (_jsx(Script, { id: `MetaPixel_${pixelId}_${index}`, strategy: strategy, type: "text/javascript", dangerouslySetInnerHTML: {
48
+ __html: `
49
+ !function(f,b,n)
50
+ {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
51
+ n.callMethod.apply(n,arguments):n.queue.push(arguments)};
52
+ if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
53
+ n.queue=[];}(window, document);
54
+ fbq('init', '${pixelId}');
55
+ fbq('track', 'PageView');
56
+ `,
57
+ }, onError: () => {
58
+ console.error(`❌ MetaPixel ${pixelId} script error`);
59
+ }, ...scriptProps }, pixelId)))] })) }));
60
+ };
61
+ export default MetaPixel;
@@ -0,0 +1,5 @@
1
+ import type { PixelsManagerConfig } from "../types";
2
+ import React from "react";
3
+ declare const PixelsManager: React.FC<PixelsManagerConfig>;
4
+ export default PixelsManager;
5
+ //# sourceMappingURL=PixelsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PixelsManager.d.ts","sourceRoot":"","sources":["../../src/pixels/PixelsManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAsB,MAAM,UAAU,CAAC;AACxE,OAAO,KAAK,MAAM,OAAO,CAAC;AAiB1B,QAAA,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAUhD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import GtagPixel from "./GtagPixel";
3
+ import MetaPixel from "./MetaPixel";
4
+ // Pixel 组件映射表
5
+ const PIXEL_COMPONENTS = {
6
+ gtag: GtagPixel,
7
+ meta: MetaPixel,
8
+ };
9
+ const PixelsManager = (config) => {
10
+ const { type, ...pixelProps } = config;
11
+ const PixelComponent = PIXEL_COMPONENTS[type];
12
+ if (!PixelComponent) {
13
+ return null;
14
+ }
15
+ return _jsx(PixelComponent, { ...pixelProps });
16
+ };
17
+ export default PixelsManager;
@@ -0,0 +1,4 @@
1
+ export { default as GtagPixel } from "./GtagPixel";
2
+ export { default as MetaPixel } from "./MetaPixel";
3
+ export { default as PixelsManager } from "./PixelsManager";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pixels/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as GtagPixel } from "./GtagPixel";
2
+ export { default as MetaPixel } from "./MetaPixel";
3
+ export { default as PixelsManager } from "./PixelsManager";
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Track 通用类型定义
3
+ */
4
+ import type { PlatformType } from "./index";
5
+ import type { GtagTrackParams } from "./gtag";
6
+ import type { MetaTrackParams } from "./meta";
7
+ /**
8
+ * 货币类型
9
+ */
10
+ export type Currency = "CNY" | "USD" | "EUR" | string;
11
+ /**
12
+ * 平台参数映射
13
+ */
14
+ export type PlatformTrackParamsMap = {
15
+ gtag: GtagTrackParams;
16
+ meta: MetaTrackParams;
17
+ };
18
+ /**
19
+ * Track 配置类型
20
+ */
21
+ export type TrackConfig<P extends PlatformType> = {
22
+ platform: P;
23
+ } & PlatformTrackParamsMap[P];
24
+ /**
25
+ * withTracking 配置选项
26
+ */
27
+ export interface WithTrackingConfig<P extends PlatformType = PlatformType> {
28
+ /**
29
+ * 埋点配置
30
+ * - 可以是静态配置对象
31
+ * - 可以是函数,接收原函数参数和返回值,动态生成配置
32
+ */
33
+ trackConfig?: TrackConfig<P> | ((args: any[], result?: any) => TrackConfig<P> | TrackConfig<P>[]);
34
+ /**
35
+ * 触发时机
36
+ * - before: 函数执行前触发(默认)
37
+ * - after: 函数执行后触发
38
+ * - both: 执行前后都触发
39
+ */
40
+ timing?: "before" | "after" | "both";
41
+ /**
42
+ * 条件判断:返回 true 才触发埋点
43
+ */
44
+ condition?: (args: any[], result?: any) => boolean;
45
+ /**
46
+ * 错误处理:函数执行失败时是否仍然上报
47
+ */
48
+ trackOnError?: boolean;
49
+ /**
50
+ * 错误时的埋点配置
51
+ */
52
+ errorTrackConfig?: (error: Error, args: any[]) => TrackConfig<P>;
53
+ /**
54
+ * 防抖时间(毫秒),避免重复上报
55
+ */
56
+ debounce?: number;
57
+ /**
58
+ * 节流时间(毫秒),限制上报频率
59
+ */
60
+ throttle?: number;
61
+ /**
62
+ * 用于 AST 解析的标识
63
+ */
64
+ trackPoint?: string;
65
+ }
66
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,YAAY,IAAI;IAChD,QAAQ,EAAE,CAAC,CAAC;CACb,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACvE;;;;OAIG;IACH,WAAW,CAAC,EACR,WAAW,CAAC,CAAC,CAAC,GACd,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAErC;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;IAEnD;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;IAEjE;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Gtag 平台 Track 类型定义
3
+ * 专注于转化事件追踪
4
+ */
5
+ import type { Currency } from "./common";
6
+ /** 转化事件名称 */
7
+ export type GtagEventName = "conversion" | "generate_lead" | "sign_up" | "purchase" | "add_to_cart" | "remove_from_cart" | "begin_checkout" | "view_item" | string;
8
+ /**
9
+ * Gtag 转化事件参数
10
+ * 对应 gtag('event', eventName, eventParams)
11
+ */
12
+ export interface GtagTrackParams {
13
+ eventName: GtagEventName;
14
+ send_to?: string;
15
+ value?: number;
16
+ currency?: Currency;
17
+ transaction_id?: string;
18
+ transactionId?: string;
19
+ measurementId?: string;
20
+ [key: string]: any;
21
+ }
22
+ /**
23
+ * Gtag Config 配置
24
+ * 对应 gtag('config', measurementId, configParams)
25
+ */
26
+ export interface GtagConfigParams {
27
+ command: "config";
28
+ measurementId: string;
29
+ configParams?: {
30
+ send_page_view?: boolean;
31
+ [key: string]: any;
32
+ };
33
+ }
34
+ //# sourceMappingURL=gtag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gtag.d.ts","sourceRoot":"","sources":["../../src/types/gtag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,aAAa;AACb,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,eAAe,GACf,SAAS,GACT,UAAU,GACV,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,MAAM,CAAC;AAIX;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,QAAQ,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE;QACb,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ /**
2
+ * 埋点平台类型
3
+ */
4
+ export type PlatformType = "gtag" | "meta";
5
+ declare global {
6
+ interface Window {
7
+ gtag?: (...args: any[]) => void;
8
+ fbq?: (...args: any[]) => void;
9
+ dataLayer?: any[];
10
+ }
11
+ }
12
+ /**
13
+ * 埋点事件类型
14
+ */
15
+ export type TrackEventType = "ads" | "pv" | "click" | "buynow" | "add2cart" | "checkout" | "purchase" | "search" | "view_item";
16
+ /**
17
+ * 平台配置基础接口
18
+ */
19
+ export interface BasePlatformConfig {
20
+ pixelIds: string | Array<string>;
21
+ cookieConsentEnabled: boolean;
22
+ debug?: boolean;
23
+ strategy?: "lazyOnload" | "afterInteractive" | "beforeInteractive" | "worker";
24
+ onPixelLoaded?: () => void;
25
+ }
26
+ export interface PixelsManagerConfig extends BasePlatformConfig {
27
+ type: PlatformType;
28
+ }
29
+ /**
30
+ * Gtag 配置
31
+ */
32
+ export interface GtagConfig extends BasePlatformConfig {
33
+ }
34
+ /**
35
+ * Meta Pixel 配置
36
+ */
37
+ export interface MetaPixelConfig extends BasePlatformConfig {
38
+ }
39
+ /**
40
+ * TikTok Pixel 配置
41
+ */
42
+ export interface TikTokPixelConfig extends BasePlatformConfig {
43
+ pixelId: string;
44
+ }
45
+ /**
46
+ * Scarab 配置
47
+ */
48
+ export interface ScarabConfig extends BasePlatformConfig {
49
+ customerId: string;
50
+ [key: string]: any;
51
+ }
52
+ /**
53
+ * SDK 初始化配置
54
+ */
55
+ export interface AnalysisConfig {
56
+ gtag?: GtagConfig;
57
+ metaPixel?: MetaPixelConfig;
58
+ tiktokPixel?: TikTokPixelConfig;
59
+ scarab?: ScarabConfig;
60
+ debug?: boolean;
61
+ }
62
+ /**
63
+ * 埋点参数
64
+ */
65
+ export interface TrackParams {
66
+ type: TrackEventType;
67
+ params?: Record<string, any>;
68
+ platform?: PlatformType[];
69
+ }
70
+ /**
71
+ * Tracker 实例
72
+ */
73
+ export interface Tracker {
74
+ platform: PlatformType;
75
+ isReady: boolean;
76
+ init: (config: any) => Promise<void> | void;
77
+ track: (type: TrackEventType, params?: Record<string, any>) => void;
78
+ }
79
+ /**
80
+ * 自动埋点配置
81
+ */
82
+ export interface AutoTrackConfig {
83
+ pv?: boolean;
84
+ click?: boolean;
85
+ clickSelector?: string;
86
+ }
87
+ export type { Currency, TrackConfig, WithTrackingConfig } from "./common";
88
+ export type { GtagEventName, GtagTrackParams, GtagConfigParams } from "./gtag";
89
+ export type { MetaTrackParams } from "./meta";
90
+ export type { TrackByTagsData, TrackByTagsParams, ParsedTag, } from "./trackByTags";
91
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAChC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAC/B,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;KACnB;CACF;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,IAAI,GACJ,OAAO,GACP,QAAQ,GACR,UAAU,GACV,UAAU,GACV,UAAU,GACV,QAAQ,GACR,WAAW,CAAC;AAEhB;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,YAAY,GAAG,kBAAkB,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC9E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,IAAI,EAAE,YAAY,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,kBAAkB;CAErD;AAED;;GAEG;AACH,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;CAE1D;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,kBAAkB;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,KAAK,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CACrE;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG1E,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAG/E,YAAY,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAG9C,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,SAAS,GACV,MAAM,eAAe,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Meta Pixel 平台 Track 类型定义
3
+ */
4
+ export interface MetaTrackParams {
5
+ event: string;
6
+ data?: Record<string, any>;
7
+ }
8
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/types/meta.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Meta Pixel 平台 Track 类型定义
3
+ */
4
+ export {};
@@ -0,0 +1,26 @@
1
+ /**
2
+ * TrackByTags 相关类型定义
3
+ */
4
+ /**
5
+ * TrackByTags 事件数据接口
6
+ */
7
+ export interface TrackByTagsData {
8
+ event: string;
9
+ [key: string]: any;
10
+ }
11
+ /**
12
+ * TrackByTags 函数参数接口
13
+ */
14
+ export interface TrackByTagsParams {
15
+ tags: string[];
16
+ data: TrackByTagsData[];
17
+ }
18
+ /**
19
+ * 解析后的标签结构(内部使用)
20
+ */
21
+ export interface ParsedTag {
22
+ media: string;
23
+ event: string;
24
+ target: string | null;
25
+ }
26
+ //# sourceMappingURL=trackByTags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackByTags.d.ts","sourceRoot":"","sources":["../../src/types/trackByTags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,eAAe,EAAE,CAAC;CACzB;AACD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * TrackByTags 相关类型定义
3
+ */
4
+ export {};
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@anker-in/analysis",
3
+ "version": "0.1.0",
4
+ "description": "Unified analytics SDK for multi-platform tracking (Google Analytics, Meta Pixel, TikTok Pixel)",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./types": {
14
+ "import": "./dist/types/index.js",
15
+ "require": "./dist/types/index.js",
16
+ "types": "./dist/types/index.d.ts"
17
+ },
18
+ "./core": {
19
+ "import": "./dist/core/track/index.js",
20
+ "require": "./dist/core/track/index.js",
21
+ "types": "./dist/core/track/index.d.ts"
22
+ },
23
+ "./pixels": {
24
+ "import": "./dist/pixels/index.js",
25
+ "require": "./dist/pixels/index.js",
26
+ "types": "./dist/pixels/index.d.ts"
27
+ },
28
+ "./autoTrack": {
29
+ "import": "./dist/autoTrack/index.js",
30
+ "require": "./dist/autoTrack/index.js",
31
+ "types": "./dist/autoTrack/index.d.ts"
32
+ }
33
+ },
34
+ "files": [
35
+ "dist/**",
36
+ "README.md"
37
+ ],
38
+ "keywords": [
39
+ "analytics",
40
+ "tracking",
41
+ "gtag",
42
+ "google-analytics",
43
+ "meta-pixel",
44
+ "facebook-pixel",
45
+ "tiktok-pixel",
46
+ "tracking-sdk",
47
+ "analytics-sdk"
48
+ ],
49
+ "author": "Anker",
50
+ "license": "MIT",
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "peerDependencies": {
55
+ "react": ">=18.0.0",
56
+ "react-dom": ">=18.0.0",
57
+ "next": ">=14.2.8",
58
+ "vanilla-cookieconsent": ">=3.1.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^22.15.3",
62
+ "@types/react": "19.1.0",
63
+ "@types/react-dom": "19.1.1",
64
+ "eslint": "^9.34.0",
65
+ "typescript": "5.9.2",
66
+ "@repo/eslint-config": "0.0.0",
67
+ "@repo/typescript-config": "0.0.0"
68
+ },
69
+ "dependencies": {
70
+ "react": "^19.1.0",
71
+ "react-dom": "^19.1.0"
72
+ },
73
+ "scripts": {
74
+ "build": "tsc",
75
+ "dev": "tsc --watch",
76
+ "lint": "eslint . --max-warnings 0",
77
+ "check-types": "tsc --noEmit"
78
+ }
79
+ }