@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,55 @@
1
+ /**
2
+ * Google Analytics / gtag.js 适配器
3
+ * 使用标准的 window.gtag() API
4
+ * 专注于转化事件追踪
5
+ */
6
+ /**
7
+ * gtag 埋点函数
8
+ * 调用 window.gtag() 标准 API
9
+ */
10
+ export const gtagTrack = (command, targetOrEventName, params) => {
11
+ if (typeof window === "undefined") {
12
+ return;
13
+ }
14
+ // 确保 gtag 函数存在
15
+ if (typeof window.gtag !== "function") {
16
+ console.warn("gtag is not available. Please load gtag.js first.");
17
+ return;
18
+ }
19
+ try {
20
+ window.gtag(command, targetOrEventName, params);
21
+ }
22
+ catch (error) {
23
+ console.error("gtagTrack error:", error);
24
+ }
25
+ };
26
+ /**
27
+ * 发送 gtag 事件
28
+ */
29
+ export const gtagEvent = (eventName, eventParams) => {
30
+ gtagTrack("event", eventName, eventParams);
31
+ };
32
+ /**
33
+ * 发送 gtag config
34
+ */
35
+ export const gtagConfig = (measurementId, configParams) => {
36
+ gtagTrack("config", measurementId, configParams);
37
+ };
38
+ /**
39
+ * 检测 gtag 是否可用
40
+ */
41
+ export const isGtagAvailable = () => {
42
+ if (typeof window === "undefined") {
43
+ return false;
44
+ }
45
+ return typeof window.gtag === "function";
46
+ };
47
+ /**
48
+ * gtag 适配器对象
49
+ */
50
+ export const gtagAdapter = {
51
+ track: gtagTrack,
52
+ event: gtagEvent,
53
+ config: gtagConfig,
54
+ isAvailable: isGtagAvailable,
55
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Adapters 模块统一导出
3
+ */
4
+ export * from "./gtag";
5
+ export * from "./meta";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Adapters 模块统一导出
3
+ */
4
+ export * from "./gtag";
5
+ export * from "./meta";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Meta Pixel 适配器
3
+ * 提供 Facebook/Meta Pixel 的埋点功能
4
+ */
5
+ /**
6
+ * Meta Pixel 埋点函数
7
+ */
8
+ export declare const metaTrack: (event: string, data?: object) => void;
9
+ /**
10
+ * 检测 Meta Pixel 是否可用
11
+ */
12
+ export declare const isMetaAvailable: () => boolean;
13
+ /**
14
+ * Meta Pixel 适配器对象
15
+ */
16
+ export declare const metaAdapter: {
17
+ track: (event: string, data?: object) => void;
18
+ isAvailable: () => boolean;
19
+ };
20
+ //# sourceMappingURL=meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/meta.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,IAexD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,QAAO,OAKlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;mBA9BS,MAAM,SAAS,MAAM,KAAG,IAAI;uBAoB1B,OAAO;CAazC,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Meta Pixel 适配器
3
+ * 提供 Facebook/Meta Pixel 的埋点功能
4
+ */
5
+ /**
6
+ * Meta Pixel 埋点函数
7
+ */
8
+ export const metaTrack = (event, data) => {
9
+ if (typeof window === "undefined") {
10
+ return;
11
+ }
12
+ if (typeof window.fbq !== "undefined") {
13
+ try {
14
+ if (data) {
15
+ window.fbq("track", event, data);
16
+ }
17
+ else {
18
+ window.fbq("track", event);
19
+ }
20
+ }
21
+ catch (error) {
22
+ console.log("fbqTrack error", error);
23
+ }
24
+ }
25
+ };
26
+ /**
27
+ * 检测 Meta Pixel 是否可用
28
+ */
29
+ export const isMetaAvailable = () => {
30
+ if (typeof window === "undefined") {
31
+ return false;
32
+ }
33
+ return typeof window.fbq !== "undefined";
34
+ };
35
+ /**
36
+ * Meta Pixel 适配器对象
37
+ */
38
+ export const metaAdapter = {
39
+ track: metaTrack,
40
+ isAvailable: isMetaAvailable,
41
+ };
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 函数工具模块
3
+ * 提供防抖、节流、安全执行等通用函数工具
4
+ */
5
+ /**
6
+ * 防抖函数
7
+ */
8
+ export declare function debounce<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
9
+ /**
10
+ * 节流函数
11
+ */
12
+ export declare function throttle<T extends (...args: any[]) => any>(fn: T, delay: number): (...args: Parameters<T>) => void;
13
+ /**
14
+ * 安全执行函数,捕获错误
15
+ */
16
+ export declare function safeExecute<T>(fn: () => T, errorMessage?: string): T | undefined;
17
+ //# sourceMappingURL=function-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function-utils.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/function-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAQlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACxD,EAAE,EAAE,CAAC,EACL,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CASlC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,CAAC,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,GAAG,SAAS,CAOf"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 函数工具模块
3
+ * 提供防抖、节流、安全执行等通用函数工具
4
+ */
5
+ import { logger } from "./logger";
6
+ /**
7
+ * 防抖函数
8
+ */
9
+ export function debounce(fn, delay) {
10
+ let timer = null;
11
+ return function (...args) {
12
+ if (timer)
13
+ clearTimeout(timer);
14
+ timer = setTimeout(() => {
15
+ fn.apply(this, args);
16
+ }, delay);
17
+ };
18
+ }
19
+ /**
20
+ * 节流函数
21
+ */
22
+ export function throttle(fn, delay) {
23
+ let lastTime = 0;
24
+ return function (...args) {
25
+ const now = Date.now();
26
+ if (now - lastTime >= delay) {
27
+ lastTime = now;
28
+ fn.apply(this, args);
29
+ }
30
+ };
31
+ }
32
+ /**
33
+ * 安全执行函数,捕获错误
34
+ */
35
+ export function safeExecute(fn, errorMessage) {
36
+ try {
37
+ return fn();
38
+ }
39
+ catch (error) {
40
+ logger.error(errorMessage || "Error executing function:", error);
41
+ return undefined;
42
+ }
43
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Helpers 模块统一导出
3
+ */
4
+ export * from "./logger";
5
+ export * from "./script-loader";
6
+ export * from "./function-utils";
7
+ export * from "./platform-detector";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Helpers 模块统一导出
3
+ */
4
+ export * from "./logger";
5
+ export * from "./script-loader";
6
+ export * from "./function-utils";
7
+ export * from "./platform-detector";
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 日志工具模块
3
+ * 提供统一的日志记录功能
4
+ */
5
+ /**
6
+ * 创建日志工具
7
+ */
8
+ export declare function createLogger(initialEnabled?: boolean): {
9
+ setEnabled(value: boolean): void;
10
+ log(...args: any[]): void;
11
+ warn(...args: any[]): void;
12
+ error(...args: any[]): void;
13
+ };
14
+ export declare const logger: {
15
+ setEnabled(value: boolean): void;
16
+ log(...args: any[]): void;
17
+ warn(...args: any[]): void;
18
+ error(...args: any[]): void;
19
+ };
20
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,UAAQ;sBAI7B,OAAO;iBAIZ,GAAG,EAAE;kBAMJ,GAAG,EAAE;mBAMJ,GAAG,EAAE;EAMvB;AAGD,eAAO,MAAM,MAAM;sBAzBG,OAAO;iBAIZ,GAAG,EAAE;kBAMJ,GAAG,EAAE;mBAMJ,GAAG,EAAE;CASY,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * 日志工具模块
3
+ * 提供统一的日志记录功能
4
+ */
5
+ /**
6
+ * 创建日志工具
7
+ */
8
+ export function createLogger(initialEnabled = false) {
9
+ let enabled = initialEnabled;
10
+ return {
11
+ setEnabled(value) {
12
+ enabled = value;
13
+ },
14
+ log(...args) {
15
+ if (enabled) {
16
+ console.log("[Analysis SDK]", ...args);
17
+ }
18
+ },
19
+ warn(...args) {
20
+ if (enabled) {
21
+ console.warn("[Analysis SDK]", ...args);
22
+ }
23
+ },
24
+ error(...args) {
25
+ if (enabled) {
26
+ console.error("[Analysis SDK]", ...args);
27
+ }
28
+ },
29
+ };
30
+ }
31
+ // 全局 logger 实例
32
+ export const logger = createLogger();
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 平台检测模块
3
+ * 检测各个埋点平台的可用性
4
+ */
5
+ import type { PlatformType } from "../../types";
6
+ /**
7
+ * 检测指定平台是否可用
8
+ */
9
+ export declare const isPlatformAvailable: (platform: PlatformType) => boolean;
10
+ /**
11
+ * 检测所有可用的平台
12
+ */
13
+ export declare const detectAvailablePlatforms: () => PlatformType[];
14
+ //# sourceMappingURL=platform-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-detector.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/platform-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,YAAY,KAAG,OAgB5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,QAAO,YAAY,EAGvD,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 平台检测模块
3
+ * 检测各个埋点平台的可用性
4
+ */
5
+ /**
6
+ * 检测指定平台是否可用
7
+ */
8
+ export const isPlatformAvailable = (platform) => {
9
+ if (typeof window === "undefined") {
10
+ return false;
11
+ }
12
+ switch (platform) {
13
+ case "gtag":
14
+ return (typeof window.gtag !== "undefined" ||
15
+ typeof window.dataLayer !== "undefined");
16
+ case "meta":
17
+ return typeof window.fbq !== "undefined";
18
+ default:
19
+ return false;
20
+ }
21
+ };
22
+ /**
23
+ * 检测所有可用的平台
24
+ */
25
+ export const detectAvailablePlatforms = () => {
26
+ const platforms = ["gtag", "meta"];
27
+ return platforms.filter((platform) => isPlatformAvailable(platform));
28
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 脚本加载和管理模块
3
+ * 提供动态加载和控制第三方脚本的能力
4
+ */
5
+ /**
6
+ * 加载外部脚本
7
+ */
8
+ export declare function loadScript(src: string, id?: string): Promise<void>;
9
+ /**
10
+ * 更新脚本的 type 属性配置
11
+ */
12
+ export interface UpdateScriptTypeOptions {
13
+ /** 脚本元素的 ID */
14
+ id: string;
15
+ /** 是否启用脚本 */
16
+ enabled: boolean;
17
+ /** 是否在启用时重新执行脚本内容 */
18
+ executeOnEnable?: boolean;
19
+ /** 错误处理回调 */
20
+ onError?: (error: Error) => void;
21
+ }
22
+ /**
23
+ * 动态更新脚本的 type 属性
24
+ * 用于根据 cookie consent 状态动态启用/禁用脚本
25
+ *
26
+ * @param options - 配置选项
27
+ * @returns 是否成功更新
28
+ */
29
+ export declare function updateScriptType(options: UpdateScriptTypeOptions): boolean;
30
+ /**
31
+ * 批量更新多个脚本的 type 属性
32
+ *
33
+ * @param scriptIds - 脚本 ID 数组或生成 ID 的函数
34
+ * @param enabled - 是否启用脚本
35
+ * @param executeOnEnable - 是否在启用时重新执行脚本内容
36
+ * @returns 成功更新的脚本数量
37
+ */
38
+ export declare function updateScriptsType(scriptIds: string[] | ((index: number) => string), enabled: boolean, executeOnEnable?: boolean): number;
39
+ //# sourceMappingURL=script-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-loader.d.ts","sourceRoot":"","sources":["../../../src/core/helpers/script-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlE;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe;IACf,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa;IACb,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CA0C1E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,EACjD,OAAO,EAAE,OAAO,EAChB,eAAe,UAAO,GACrB,MAAM,CAyBR"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * 脚本加载和管理模块
3
+ * 提供动态加载和控制第三方脚本的能力
4
+ */
5
+ import { logger } from "./logger";
6
+ /**
7
+ * 加载外部脚本
8
+ */
9
+ export function loadScript(src, id) {
10
+ return new Promise((resolve, reject) => {
11
+ // 检查是否已加载
12
+ if (id && document.getElementById(id)) {
13
+ logger.log(`Script ${id} already loaded`);
14
+ resolve();
15
+ return;
16
+ }
17
+ const script = document.createElement("script");
18
+ script.src = src;
19
+ script.async = true;
20
+ if (id) {
21
+ script.id = id;
22
+ }
23
+ script.onload = () => {
24
+ logger.log(`Script loaded: ${src}`);
25
+ resolve();
26
+ };
27
+ script.onerror = () => {
28
+ logger.error(`Failed to load script: ${src}`);
29
+ reject(new Error(`Failed to load script: ${src}`));
30
+ };
31
+ document.head.appendChild(script);
32
+ });
33
+ }
34
+ /**
35
+ * 动态更新脚本的 type 属性
36
+ * 用于根据 cookie consent 状态动态启用/禁用脚本
37
+ *
38
+ * @param options - 配置选项
39
+ * @returns 是否成功更新
40
+ */
41
+ export function updateScriptType(options) {
42
+ const { id, enabled, executeOnEnable = true, onError } = options;
43
+ if (typeof window === "undefined") {
44
+ return false;
45
+ }
46
+ const scriptElement = document.getElementById(id);
47
+ if (!scriptElement) {
48
+ logger.warn(`Script element with id "${id}" not found`);
49
+ return false;
50
+ }
51
+ const newType = enabled ? "text/javascript" : "text/plain";
52
+ const currentType = scriptElement.getAttribute("type");
53
+ // 如果从 text/plain 变为 text/javascript,需要重新执行脚本
54
+ if (executeOnEnable &&
55
+ currentType === "text/plain" &&
56
+ newType === "text/javascript") {
57
+ scriptElement.setAttribute("type", newType);
58
+ // 重新执行脚本内容
59
+ const scriptContent = scriptElement.innerHTML;
60
+ if (scriptContent && typeof window.eval === "function") {
61
+ try {
62
+ window.eval(scriptContent);
63
+ logger.log(`Script "${id}" executed successfully`);
64
+ }
65
+ catch (e) {
66
+ const error = e instanceof Error ? e : new Error(String(e));
67
+ logger.error(`Script "${id}" execution error:`, error);
68
+ if (onError) {
69
+ onError(error);
70
+ }
71
+ }
72
+ }
73
+ }
74
+ else {
75
+ scriptElement.setAttribute("type", newType);
76
+ }
77
+ return true;
78
+ }
79
+ /**
80
+ * 批量更新多个脚本的 type 属性
81
+ *
82
+ * @param scriptIds - 脚本 ID 数组或生成 ID 的函数
83
+ * @param enabled - 是否启用脚本
84
+ * @param executeOnEnable - 是否在启用时重新执行脚本内容
85
+ * @returns 成功更新的脚本数量
86
+ */
87
+ export function updateScriptsType(scriptIds, enabled, executeOnEnable = true) {
88
+ if (typeof window === "undefined") {
89
+ return 0;
90
+ }
91
+ let successCount = 0;
92
+ const ids = Array.isArray(scriptIds)
93
+ ? scriptIds
94
+ : Array.from({ length: 100 }, (_, i) => scriptIds(i)).filter((id) => document.getElementById(id));
95
+ ids.forEach((id) => {
96
+ const success = updateScriptType({
97
+ id,
98
+ enabled,
99
+ executeOnEnable,
100
+ });
101
+ if (success) {
102
+ successCount++;
103
+ }
104
+ });
105
+ logger.log(`Updated ${successCount}/${ids.length} scripts`);
106
+ return successCount;
107
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core 模块统一导出
3
+ */
4
+ export * from "./tracking";
5
+ export * from "./adapters";
6
+ export * from "./helpers";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,cAAc,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Core 模块统一导出
3
+ */
4
+ // Tracking 模块
5
+ export * from "./tracking";
6
+ // Adapters 模块
7
+ export * from "./adapters";
8
+ // Helpers 模块
9
+ export * from "./helpers";
@@ -0,0 +1,2 @@
1
+ export declare const gtagTrack: (args: any) => void;
2
+ //# sourceMappingURL=gtagTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gtagTrack.d.ts","sourceRoot":"","sources":["../../../src/core/track/gtagTrack.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,GAAI,MAAM,GAAG,KAAG,IAUrC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export const gtagTrack = (args) => {
2
+ if (typeof window === "undefined") {
3
+ return;
4
+ }
5
+ window.dataLayer = window?.dataLayer || [];
6
+ try {
7
+ window?.dataLayer?.push(args);
8
+ }
9
+ catch (error) {
10
+ console.log("gtagTrack error", error);
11
+ }
12
+ };
@@ -0,0 +1,4 @@
1
+ export { track } from "./track";
2
+ export { gtagTrack } from "./gtagTrack";
3
+ export { metaTrack } from "./metaTrack";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/track/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { track } from "./track";
2
+ export { gtagTrack } from "./gtagTrack";
3
+ export { metaTrack } from "./metaTrack";
@@ -0,0 +1,2 @@
1
+ export declare const metaTrack: (event: string, data?: object) => void;
2
+ //# sourceMappingURL=metaTrack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metaTrack.d.ts","sourceRoot":"","sources":["../../../src/core/track/metaTrack.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,IAexD,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const metaTrack = (event, data) => {
2
+ if (typeof window === "undefined") {
3
+ return;
4
+ }
5
+ if (typeof window.fbq !== "undefined") {
6
+ try {
7
+ if (data) {
8
+ window.fbq("track", event, data);
9
+ }
10
+ else {
11
+ window.fbq("track", event);
12
+ }
13
+ }
14
+ catch (error) {
15
+ console.log("fbqTrack error", error);
16
+ }
17
+ }
18
+ };
@@ -0,0 +1,6 @@
1
+ import type { TrackConfig } from "../../types";
2
+ declare function track(config: TrackConfig<"gtag">): void;
3
+ declare function track(config: TrackConfig<"meta">): void;
4
+ export default track;
5
+ export { track };
6
+ //# sourceMappingURL=track.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../../src/core/track/track.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EAGZ,MAAM,aAAa,CAAC;AAKrB,iBAAS,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAClD,iBAAS,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAuJlD,eAAe,KAAK,CAAC;AACrB,OAAO,EAAE,KAAK,EAAE,CAAC"}