@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.
- package/README.md +240 -0
- package/dist/autoTrack/click.d.ts +2 -0
- package/dist/autoTrack/click.d.ts.map +1 -0
- package/dist/autoTrack/click.js +80 -0
- package/dist/autoTrack/index.d.ts +2 -0
- package/dist/autoTrack/index.d.ts.map +1 -0
- package/dist/autoTrack/index.js +47 -0
- package/dist/autoTrack/pv.d.ts +2 -0
- package/dist/autoTrack/pv.d.ts.map +1 -0
- package/dist/autoTrack/pv.js +57 -0
- package/dist/autoTrack/trackByTags.d.ts +17 -0
- package/dist/autoTrack/trackByTags.d.ts.map +1 -0
- package/dist/autoTrack/trackByTags.js +141 -0
- package/dist/constants/index.d.ts +2 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +1 -0
- package/dist/constants/tagsMap.d.ts +9 -0
- package/dist/constants/tagsMap.d.ts.map +1 -0
- package/dist/constants/tagsMap.js +8 -0
- package/dist/core/adapters/gtag.d.ts +37 -0
- package/dist/core/adapters/gtag.d.ts.map +1 -0
- package/dist/core/adapters/gtag.js +55 -0
- package/dist/core/adapters/index.d.ts +6 -0
- package/dist/core/adapters/index.d.ts.map +1 -0
- package/dist/core/adapters/index.js +5 -0
- package/dist/core/adapters/meta.d.ts +20 -0
- package/dist/core/adapters/meta.d.ts.map +1 -0
- package/dist/core/adapters/meta.js +41 -0
- package/dist/core/helpers/function-utils.d.ts +17 -0
- package/dist/core/helpers/function-utils.d.ts.map +1 -0
- package/dist/core/helpers/function-utils.js +43 -0
- package/dist/core/helpers/index.d.ts +8 -0
- package/dist/core/helpers/index.d.ts.map +1 -0
- package/dist/core/helpers/index.js +7 -0
- package/dist/core/helpers/logger.d.ts +20 -0
- package/dist/core/helpers/logger.d.ts.map +1 -0
- package/dist/core/helpers/logger.js +32 -0
- package/dist/core/helpers/platform-detector.d.ts +14 -0
- package/dist/core/helpers/platform-detector.d.ts.map +1 -0
- package/dist/core/helpers/platform-detector.js +28 -0
- package/dist/core/helpers/script-loader.d.ts +39 -0
- package/dist/core/helpers/script-loader.d.ts.map +1 -0
- package/dist/core/helpers/script-loader.js +107 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/track/gtagTrack.d.ts +2 -0
- package/dist/core/track/gtagTrack.d.ts.map +1 -0
- package/dist/core/track/gtagTrack.js +12 -0
- package/dist/core/track/index.d.ts +4 -0
- package/dist/core/track/index.d.ts.map +1 -0
- package/dist/core/track/index.js +3 -0
- package/dist/core/track/metaTrack.d.ts +2 -0
- package/dist/core/track/metaTrack.d.ts.map +1 -0
- package/dist/core/track/metaTrack.js +18 -0
- package/dist/core/track/track.d.ts +6 -0
- package/dist/core/track/track.d.ts.map +1 -0
- package/dist/core/track/track.js +128 -0
- package/dist/core/tracking/dispatcher.d.ts +10 -0
- package/dist/core/tracking/dispatcher.d.ts.map +1 -0
- package/dist/core/tracking/dispatcher.js +67 -0
- package/dist/core/tracking/index.d.ts +6 -0
- package/dist/core/tracking/index.d.ts.map +1 -0
- package/dist/core/tracking/index.js +5 -0
- package/dist/core/tracking/with-tracking.d.ts +33 -0
- package/dist/core/tracking/with-tracking.d.ts.map +1 -0
- package/dist/core/tracking/with-tracking.js +137 -0
- package/dist/core/utils.d.ts +64 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +182 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/pixels/GtagPixel.d.ts +7 -0
- package/dist/pixels/GtagPixel.d.ts.map +1 -0
- package/dist/pixels/GtagPixel.js +73 -0
- package/dist/pixels/MetaPixel.d.ts +7 -0
- package/dist/pixels/MetaPixel.d.ts.map +1 -0
- package/dist/pixels/MetaPixel.js +61 -0
- package/dist/pixels/PixelsManager.d.ts +5 -0
- package/dist/pixels/PixelsManager.d.ts.map +1 -0
- package/dist/pixels/PixelsManager.js +17 -0
- package/dist/pixels/index.d.ts +4 -0
- package/dist/pixels/index.d.ts.map +1 -0
- package/dist/pixels/index.js +3 -0
- package/dist/types/common.d.ts +66 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +1 -0
- package/dist/types/gtag.d.ts +34 -0
- package/dist/types/gtag.d.ts.map +1 -0
- package/dist/types/gtag.js +1 -0
- package/dist/types/index.d.ts +91 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/meta.d.ts +8 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +4 -0
- package/dist/types/trackByTags.d.ts +26 -0
- package/dist/types/trackByTags.d.ts.map +1 -0
- package/dist/types/trackByTags.js +4 -0
- 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 @@
|
|
|
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,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 @@
|
|
|
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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|