@anker-in/analysis 0.1.0 → 0.2.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/dist/index.cjs +699 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +387 -0
- package/dist/index.d.ts +372 -21
- package/dist/index.js +648 -33
- package/dist/index.js.map +1 -0
- package/package.json +23 -36
- package/dist/autoTrack/click.d.ts +0 -2
- package/dist/autoTrack/click.d.ts.map +0 -1
- package/dist/autoTrack/click.js +0 -80
- package/dist/autoTrack/index.d.ts +0 -2
- package/dist/autoTrack/index.d.ts.map +0 -1
- package/dist/autoTrack/index.js +0 -47
- package/dist/autoTrack/pv.d.ts +0 -2
- package/dist/autoTrack/pv.d.ts.map +0 -1
- package/dist/autoTrack/pv.js +0 -57
- package/dist/autoTrack/trackByTags.d.ts +0 -17
- package/dist/autoTrack/trackByTags.d.ts.map +0 -1
- package/dist/autoTrack/trackByTags.js +0 -141
- package/dist/constants/index.d.ts +0 -2
- package/dist/constants/index.d.ts.map +0 -1
- package/dist/constants/index.js +0 -1
- package/dist/constants/tagsMap.d.ts +0 -9
- package/dist/constants/tagsMap.d.ts.map +0 -1
- package/dist/constants/tagsMap.js +0 -8
- package/dist/core/adapters/gtag.d.ts +0 -37
- package/dist/core/adapters/gtag.d.ts.map +0 -1
- package/dist/core/adapters/gtag.js +0 -55
- package/dist/core/adapters/index.d.ts +0 -6
- package/dist/core/adapters/index.d.ts.map +0 -1
- package/dist/core/adapters/index.js +0 -5
- package/dist/core/adapters/meta.d.ts +0 -20
- package/dist/core/adapters/meta.d.ts.map +0 -1
- package/dist/core/adapters/meta.js +0 -41
- package/dist/core/helpers/function-utils.d.ts +0 -17
- package/dist/core/helpers/function-utils.d.ts.map +0 -1
- package/dist/core/helpers/function-utils.js +0 -43
- package/dist/core/helpers/index.d.ts +0 -8
- package/dist/core/helpers/index.d.ts.map +0 -1
- package/dist/core/helpers/index.js +0 -7
- package/dist/core/helpers/logger.d.ts +0 -20
- package/dist/core/helpers/logger.d.ts.map +0 -1
- package/dist/core/helpers/logger.js +0 -32
- package/dist/core/helpers/platform-detector.d.ts +0 -14
- package/dist/core/helpers/platform-detector.d.ts.map +0 -1
- package/dist/core/helpers/platform-detector.js +0 -28
- package/dist/core/helpers/script-loader.d.ts +0 -39
- package/dist/core/helpers/script-loader.d.ts.map +0 -1
- package/dist/core/helpers/script-loader.js +0 -107
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -9
- package/dist/core/track/gtagTrack.d.ts +0 -2
- package/dist/core/track/gtagTrack.d.ts.map +0 -1
- package/dist/core/track/gtagTrack.js +0 -12
- package/dist/core/track/index.d.ts +0 -4
- package/dist/core/track/index.d.ts.map +0 -1
- package/dist/core/track/index.js +0 -3
- package/dist/core/track/metaTrack.d.ts +0 -2
- package/dist/core/track/metaTrack.d.ts.map +0 -1
- package/dist/core/track/metaTrack.js +0 -18
- package/dist/core/track/track.d.ts +0 -6
- package/dist/core/track/track.d.ts.map +0 -1
- package/dist/core/track/track.js +0 -128
- package/dist/core/tracking/dispatcher.d.ts +0 -10
- package/dist/core/tracking/dispatcher.d.ts.map +0 -1
- package/dist/core/tracking/dispatcher.js +0 -67
- package/dist/core/tracking/index.d.ts +0 -6
- package/dist/core/tracking/index.d.ts.map +0 -1
- package/dist/core/tracking/index.js +0 -5
- package/dist/core/tracking/with-tracking.d.ts +0 -33
- package/dist/core/tracking/with-tracking.d.ts.map +0 -1
- package/dist/core/tracking/with-tracking.js +0 -137
- package/dist/core/utils.d.ts +0 -64
- package/dist/core/utils.d.ts.map +0 -1
- package/dist/core/utils.js +0 -182
- package/dist/index.d.ts.map +0 -1
- package/dist/pixels/GtagPixel.d.ts +0 -7
- package/dist/pixels/GtagPixel.d.ts.map +0 -1
- package/dist/pixels/GtagPixel.js +0 -73
- package/dist/pixels/MetaPixel.d.ts +0 -7
- package/dist/pixels/MetaPixel.d.ts.map +0 -1
- package/dist/pixels/MetaPixel.js +0 -61
- package/dist/pixels/PixelsManager.d.ts +0 -5
- package/dist/pixels/PixelsManager.d.ts.map +0 -1
- package/dist/pixels/PixelsManager.js +0 -17
- package/dist/pixels/index.d.ts +0 -4
- package/dist/pixels/index.d.ts.map +0 -1
- package/dist/pixels/index.js +0 -3
- package/dist/types/common.d.ts +0 -66
- package/dist/types/common.d.ts.map +0 -1
- package/dist/types/common.js +0 -1
- package/dist/types/gtag.d.ts +0 -34
- package/dist/types/gtag.d.ts.map +0 -1
- package/dist/types/gtag.js +0 -1
- package/dist/types/index.d.ts +0 -91
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/meta.d.ts +0 -8
- package/dist/types/meta.d.ts.map +0 -1
- package/dist/types/meta.js +0 -4
- package/dist/types/trackByTags.d.ts +0 -26
- package/dist/types/trackByTags.d.ts.map +0 -1
- package/dist/types/trackByTags.js +0 -4
|
@@ -0,0 +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/core/adapters/gtag.ts","../src/core/adapters/meta.ts","../src/core/tracking/dispatcher.ts","../src/constants/tagsMap.ts","../src/autoTrack/trackByTags.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 * 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 * 用于兼容旧版本标签,将旧事件名映射到新事件名\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 filterTagsByEvent(tags: string[], eventSymbol: string): string[] {\n return tags.filter((tag) => {\n const parsed = parseTag(tag);\n return parsed?.event === eventSymbol.toLowerCase();\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 - 事件数据数组,每个元素包含 event 字段用于匹配标签\n *\n * @example\n * ```typescript\n * trackByTags(\n * ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],\n * [{ event: 'atc' }]\n * );\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 if (!data || data.length === 0) {\n logger.warn(\"trackByTags: data array is empty\");\n return;\n }\n\n // 数据清洗:兼容旧版本标签\n const adaptedTags = [...tags];\n adaptEventName(adaptedTags);\n\n // 处理每个事件数据\n data.forEach((trackData) => {\n const eventSymbol = trackData.event?.toLowerCase();\n\n if (!eventSymbol) {\n logger.warn(\"trackByTags: event symbol is missing in trackData\");\n return;\n }\n\n // 根据事件标识符过滤标签\n const matchedTags = filterTagsByEvent(adaptedTags, eventSymbol);\n\n if (matchedTags.length === 0) {\n logger.log(`trackByTags: No tags found for event: ${eventSymbol}`);\n return;\n }\n\n // 提取事件数据(排除 event 字段)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { event, ...eventData } = trackData;\n\n // 处理每个匹配的标签\n matchedTags.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, eventData);\n });\n });\n}\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// ============= 工具函数 =============\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\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"]}
|
package/package.json
CHANGED
|
@@ -1,40 +1,32 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anker-in/analysis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Unified analytics SDK for multi-platform tracking (Google Analytics, Meta Pixel, TikTok Pixel)",
|
|
5
|
-
"main": "./dist/index.
|
|
5
|
+
"main": "./dist/index.cjs",
|
|
6
|
+
"module": "./dist/index.js",
|
|
6
7
|
"types": "./dist/index.d.ts",
|
|
7
8
|
"exports": {
|
|
8
9
|
".": {
|
|
9
|
-
"import":
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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"
|
|
10
|
+
"import": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"require": {
|
|
15
|
+
"types": "./dist/index.d.cts",
|
|
16
|
+
"default": "./dist/index.cjs"
|
|
17
|
+
}
|
|
32
18
|
}
|
|
33
19
|
},
|
|
34
20
|
"files": [
|
|
35
21
|
"dist/**",
|
|
36
22
|
"README.md"
|
|
37
23
|
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"lint": "eslint . --max-warnings 0",
|
|
28
|
+
"check-types": "tsc --noEmit"
|
|
29
|
+
},
|
|
38
30
|
"keywords": [
|
|
39
31
|
"analytics",
|
|
40
32
|
"tracking",
|
|
@@ -52,28 +44,23 @@
|
|
|
52
44
|
"access": "public"
|
|
53
45
|
},
|
|
54
46
|
"peerDependencies": {
|
|
47
|
+
"next": ">=14.2.8",
|
|
55
48
|
"react": ">=18.0.0",
|
|
56
49
|
"react-dom": ">=18.0.0",
|
|
57
|
-
"next": ">=14.2.8",
|
|
58
50
|
"vanilla-cookieconsent": ">=3.1.0"
|
|
59
51
|
},
|
|
60
52
|
"devDependencies": {
|
|
53
|
+
"@repo/eslint-config": "workspace:*",
|
|
54
|
+
"@repo/typescript-config": "workspace:*",
|
|
61
55
|
"@types/node": "^22.15.3",
|
|
62
56
|
"@types/react": "19.1.0",
|
|
63
57
|
"@types/react-dom": "19.1.1",
|
|
64
58
|
"eslint": "^9.34.0",
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"@repo/typescript-config": "0.0.0"
|
|
59
|
+
"tsup": "^8.5.1",
|
|
60
|
+
"typescript": "5.9.2"
|
|
68
61
|
},
|
|
69
62
|
"dependencies": {
|
|
70
63
|
"react": "^19.1.0",
|
|
71
64
|
"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
65
|
}
|
|
79
|
-
}
|
|
66
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../src/autoTrack/click.ts"],"names":[],"mappings":""}
|
package/dist/autoTrack/click.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// import { logger, throttle } from '../core/helpers';
|
|
2
|
-
export {};
|
|
3
|
-
// /**
|
|
4
|
-
// * 获取埋点数据
|
|
5
|
-
// */
|
|
6
|
-
// function getTrackData(element: HTMLElement): Record<string, any> {
|
|
7
|
-
// const data: Record<string, any> = {};
|
|
8
|
-
// // 获取 data-track 属性
|
|
9
|
-
// const trackAttr = element.getAttribute('data-track');
|
|
10
|
-
// if (trackAttr) {
|
|
11
|
-
// try {
|
|
12
|
-
// // 尝试解析为 JSON
|
|
13
|
-
// Object.assign(data, JSON.parse(trackAttr));
|
|
14
|
-
// } catch {
|
|
15
|
-
// // 如果不是 JSON,作为普通字符串使用
|
|
16
|
-
// data.track_id = trackAttr;
|
|
17
|
-
// }
|
|
18
|
-
// }
|
|
19
|
-
// // 获取其他 data-track-* 属性
|
|
20
|
-
// Array.from(element.attributes).forEach(attr => {
|
|
21
|
-
// if (attr.name.startsWith('data-track-')) {
|
|
22
|
-
// const key = attr.name.replace('data-track-', '');
|
|
23
|
-
// data[key] = attr.value;
|
|
24
|
-
// }
|
|
25
|
-
// });
|
|
26
|
-
// // 补充基础信息
|
|
27
|
-
// data.element_tag = element.tagName.toLowerCase();
|
|
28
|
-
// data.element_text = element.textContent?.trim().substring(0, 100);
|
|
29
|
-
// data.element_id = element.id;
|
|
30
|
-
// data.element_class = element.className;
|
|
31
|
-
// return data;
|
|
32
|
-
// }
|
|
33
|
-
// /**
|
|
34
|
-
// * 点击自动埋点
|
|
35
|
-
// */
|
|
36
|
-
// export function createClickAutoTrack(trackFn: (type: string, params: any) => void) {
|
|
37
|
-
// let enabled = false;
|
|
38
|
-
// let selector = '[data-track]';
|
|
39
|
-
// let clickHandler: ((e: Event) => void) | null = null;
|
|
40
|
-
// const handleClick = (e: Event) => {
|
|
41
|
-
// if (!enabled) return;
|
|
42
|
-
// const target = e.target as HTMLElement;
|
|
43
|
-
// if (!target) return;
|
|
44
|
-
// // 查找最近的匹配元素
|
|
45
|
-
// const element = target.closest(selector);
|
|
46
|
-
// if (!element) return;
|
|
47
|
-
// // 获取埋点数据
|
|
48
|
-
// const trackData = getTrackData(element as HTMLElement);
|
|
49
|
-
// trackFn('click', {
|
|
50
|
-
// ...trackData,
|
|
51
|
-
// timestamp: Date.now(),
|
|
52
|
-
// });
|
|
53
|
-
// logger.log('Click tracked:', trackData);
|
|
54
|
-
// };
|
|
55
|
-
// return {
|
|
56
|
-
// enable(customSelector?: string) {
|
|
57
|
-
// if (enabled) {
|
|
58
|
-
// logger.warn('Click auto track already enabled');
|
|
59
|
-
// return;
|
|
60
|
-
// }
|
|
61
|
-
// if (customSelector) {
|
|
62
|
-
// selector = customSelector;
|
|
63
|
-
// }
|
|
64
|
-
// enabled = true;
|
|
65
|
-
// // 使用事件委托监听点击
|
|
66
|
-
// clickHandler = throttle(handleClick, 300);
|
|
67
|
-
// document.addEventListener('click', clickHandler, true);
|
|
68
|
-
// logger.log(`Click auto track enabled with selector: ${selector}`);
|
|
69
|
-
// },
|
|
70
|
-
// disable() {
|
|
71
|
-
// if (!enabled) return;
|
|
72
|
-
// enabled = false;
|
|
73
|
-
// if (clickHandler) {
|
|
74
|
-
// document.removeEventListener('click', clickHandler, true);
|
|
75
|
-
// clickHandler = null;
|
|
76
|
-
// }
|
|
77
|
-
// logger.log('Click auto track disabled');
|
|
78
|
-
// },
|
|
79
|
-
// };
|
|
80
|
-
// }
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/autoTrack/index.ts"],"names":[],"mappings":"AAuDA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/autoTrack/index.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
// import type { AutoTrackConfig } from "../types";
|
|
2
|
-
// import { createPVAutoTrack } from "./pv";
|
|
3
|
-
// import { createClickAutoTrack } from "./click";
|
|
4
|
-
// import { logger } from "../core/helpers";
|
|
5
|
-
// /**
|
|
6
|
-
// * 创建自动埋点管理器
|
|
7
|
-
// */
|
|
8
|
-
// export function createAutoTrackManager(
|
|
9
|
-
// trackFn: (type: string, params: any) => void
|
|
10
|
-
// ) {
|
|
11
|
-
// const pvTracker = createPVAutoTrack(trackFn);
|
|
12
|
-
// const clickTracker = createClickAutoTrack(trackFn);
|
|
13
|
-
// let config: AutoTrackConfig = {};
|
|
14
|
-
// return {
|
|
15
|
-
// init(autoTrackConfig: AutoTrackConfig = {}) {
|
|
16
|
-
// config = autoTrackConfig;
|
|
17
|
-
// // PV 自动埋点(默认开启)
|
|
18
|
-
// if (autoTrackConfig.pv !== false) {
|
|
19
|
-
// pvTracker.enable();
|
|
20
|
-
// }
|
|
21
|
-
// // 点击自动埋点
|
|
22
|
-
// if (autoTrackConfig.click) {
|
|
23
|
-
// clickTracker.enable(autoTrackConfig.clickSelector);
|
|
24
|
-
// }
|
|
25
|
-
// logger.log("AutoTrack initialized with config:", autoTrackConfig);
|
|
26
|
-
// },
|
|
27
|
-
// disable() {
|
|
28
|
-
// pvTracker.disable();
|
|
29
|
-
// clickTracker.disable();
|
|
30
|
-
// logger.log("All auto tracks disabled");
|
|
31
|
-
// },
|
|
32
|
-
// getConfig() {
|
|
33
|
-
// return config;
|
|
34
|
-
// },
|
|
35
|
-
// // 导出单独的 tracker 以便直接控制
|
|
36
|
-
// pv: pvTracker,
|
|
37
|
-
// click: clickTracker,
|
|
38
|
-
// };
|
|
39
|
-
// }
|
|
40
|
-
// export { createPVAutoTrack, createClickAutoTrack };
|
|
41
|
-
// export {
|
|
42
|
-
// trackByTags,
|
|
43
|
-
// createTrackByTagsManager,
|
|
44
|
-
// type TrackByTagsData,
|
|
45
|
-
// TrackTagsVersionMap,
|
|
46
|
-
// } from "./trackByTags";
|
|
47
|
-
export { trackByTags } from "./trackByTags";
|
package/dist/autoTrack/pv.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pv.d.ts","sourceRoot":"","sources":["../../src/autoTrack/pv.ts"],"names":[],"mappings":""}
|
package/dist/autoTrack/pv.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// import { logger } from '../core/helpers';
|
|
2
|
-
export {};
|
|
3
|
-
// /**
|
|
4
|
-
// * PV 自动埋点
|
|
5
|
-
// */
|
|
6
|
-
// export function createPVAutoTrack(trackFn: (type: string, params: any) => void) {
|
|
7
|
-
// let enabled = false;
|
|
8
|
-
// let tracked = false;
|
|
9
|
-
// const trackPageView = () => {
|
|
10
|
-
// if (!enabled) return;
|
|
11
|
-
// trackFn('pv', {
|
|
12
|
-
// page_url: window.location.href,
|
|
13
|
-
// page_title: document.title,
|
|
14
|
-
// referrer: document.referrer,
|
|
15
|
-
// timestamp: Date.now(),
|
|
16
|
-
// });
|
|
17
|
-
// tracked = true;
|
|
18
|
-
// };
|
|
19
|
-
// const setupRouteListener = () => {
|
|
20
|
-
// // 监听 history API
|
|
21
|
-
// const originalPushState = history.pushState;
|
|
22
|
-
// const originalReplaceState = history.replaceState;
|
|
23
|
-
// history.pushState = function (...args) {
|
|
24
|
-
// originalPushState.apply(this, args);
|
|
25
|
-
// trackPageView();
|
|
26
|
-
// };
|
|
27
|
-
// history.replaceState = function (...args) {
|
|
28
|
-
// originalReplaceState.apply(this, args);
|
|
29
|
-
// trackPageView();
|
|
30
|
-
// };
|
|
31
|
-
// // 监听 popstate 事件
|
|
32
|
-
// window.addEventListener('popstate', trackPageView);
|
|
33
|
-
// // 监听 hashchange 事件
|
|
34
|
-
// window.addEventListener('hashchange', trackPageView);
|
|
35
|
-
// };
|
|
36
|
-
// return {
|
|
37
|
-
// enable() {
|
|
38
|
-
// if (enabled) {
|
|
39
|
-
// logger.warn('PV auto track already enabled');
|
|
40
|
-
// return;
|
|
41
|
-
// }
|
|
42
|
-
// enabled = true;
|
|
43
|
-
// // 立即上报一次 PV
|
|
44
|
-
// trackPageView();
|
|
45
|
-
// // 监听路由变化(适配 SPA)
|
|
46
|
-
// setupRouteListener();
|
|
47
|
-
// logger.log('PV auto track enabled');
|
|
48
|
-
// },
|
|
49
|
-
// disable() {
|
|
50
|
-
// enabled = false;
|
|
51
|
-
// logger.log('PV auto track disabled');
|
|
52
|
-
// },
|
|
53
|
-
// isTracked() {
|
|
54
|
-
// return tracked;
|
|
55
|
-
// },
|
|
56
|
-
// };
|
|
57
|
-
// }
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { TrackByTagsParams } from "../types";
|
|
2
|
-
/**
|
|
3
|
-
* 基于标签进行埋点上报
|
|
4
|
-
*
|
|
5
|
-
* @param tags - 标签数组,格式: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123']
|
|
6
|
-
* @param data - 事件数据数组,每个元素包含 event 字段用于匹配标签
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* ```typescript
|
|
10
|
-
* trackByTags(
|
|
11
|
-
* ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],
|
|
12
|
-
* [{ event: 'atc' }]
|
|
13
|
-
* );
|
|
14
|
-
* ```
|
|
15
|
-
*/
|
|
16
|
-
export declare function trackByTags({ tags, data }: TrackByTagsParams): void;
|
|
17
|
-
//# sourceMappingURL=trackByTags.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trackByTags.d.ts","sourceRoot":"","sources":["../../src/autoTrack/trackByTags.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA0B,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAmG1E;;;;;;;;;;;;;GAaG;AAEH,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAgDnE"}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { track } from "../core/tracking";
|
|
2
|
-
import { logger } from "../core/helpers";
|
|
3
|
-
import { TrackTagsVersionMap } from "../constants";
|
|
4
|
-
/**
|
|
5
|
-
* 解析单个标签
|
|
6
|
-
*/
|
|
7
|
-
function parseTag(tag) {
|
|
8
|
-
const parts = tag.split(":");
|
|
9
|
-
if (parts.length < 2) {
|
|
10
|
-
return null;
|
|
11
|
-
}
|
|
12
|
-
return {
|
|
13
|
-
media: parts[0]?.toLowerCase() || "",
|
|
14
|
-
event: parts[1]?.toLowerCase() || "",
|
|
15
|
-
target: parts[2] || null,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 适配事件名称(版本兼容)
|
|
20
|
-
* 将旧版本的事件名替换为新版本的事件名
|
|
21
|
-
*/
|
|
22
|
-
function adaptEventName(tags) {
|
|
23
|
-
for (let i = 0; i < tags.length; i++) {
|
|
24
|
-
if (!tags[i]) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {
|
|
28
|
-
if (tags[i]?.includes(oldEvent)) {
|
|
29
|
-
tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? "";
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 根据事件标识符过滤标签
|
|
37
|
-
*/
|
|
38
|
-
function filterTagsByEvent(tags, eventSymbol) {
|
|
39
|
-
return tags.filter((tag) => {
|
|
40
|
-
const parsed = parseTag(tag);
|
|
41
|
-
return parsed?.event === eventSymbol.toLowerCase();
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 处理单个标签的埋点
|
|
46
|
-
*/
|
|
47
|
-
function handleTagTracking(parsedTag,
|
|
48
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
-
eventData) {
|
|
50
|
-
const { media, event, target } = parsedTag;
|
|
51
|
-
if (!target) {
|
|
52
|
-
logger.warn(`Tag missing target: ${media}:${event}`);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
try {
|
|
56
|
-
switch (media) {
|
|
57
|
-
case "fbq":
|
|
58
|
-
case "meta": {
|
|
59
|
-
// Meta Pixel 埋点
|
|
60
|
-
const config = {
|
|
61
|
-
platform: "meta",
|
|
62
|
-
event: target, // target 作为事件名
|
|
63
|
-
data: eventData,
|
|
64
|
-
};
|
|
65
|
-
track(config);
|
|
66
|
-
break;
|
|
67
|
-
}
|
|
68
|
-
case "gtag": {
|
|
69
|
-
// Gtag 转化事件埋点
|
|
70
|
-
const config = {
|
|
71
|
-
platform: "gtag",
|
|
72
|
-
eventName: "conversion",
|
|
73
|
-
send_to: target, // target 作为转化目标ID
|
|
74
|
-
value: eventData?.value ?? 1.0,
|
|
75
|
-
currency: eventData?.currency,
|
|
76
|
-
transactionId: eventData?.transactionId,
|
|
77
|
-
};
|
|
78
|
-
track(config);
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
default:
|
|
82
|
-
logger.warn(`Unsupported media platform: ${media}`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 基于标签进行埋点上报
|
|
91
|
-
*
|
|
92
|
-
* @param tags - 标签数组,格式: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123']
|
|
93
|
-
* @param data - 事件数据数组,每个元素包含 event 字段用于匹配标签
|
|
94
|
-
*
|
|
95
|
-
* @example
|
|
96
|
-
* ```typescript
|
|
97
|
-
* trackByTags(
|
|
98
|
-
* ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],
|
|
99
|
-
* [{ event: 'atc' }]
|
|
100
|
-
* );
|
|
101
|
-
* ```
|
|
102
|
-
*/
|
|
103
|
-
export function trackByTags({ tags, data }) {
|
|
104
|
-
if (!tags || tags.length === 0) {
|
|
105
|
-
logger.warn("trackByTags: tags array is empty");
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
if (!data || data.length === 0) {
|
|
109
|
-
logger.warn("trackByTags: data array is empty");
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
// 数据清洗:兼容旧版本标签
|
|
113
|
-
const adaptedTags = [...tags];
|
|
114
|
-
adaptEventName(adaptedTags);
|
|
115
|
-
// 处理每个事件数据
|
|
116
|
-
data.forEach((trackData) => {
|
|
117
|
-
const eventSymbol = trackData.event?.toLowerCase();
|
|
118
|
-
if (!eventSymbol) {
|
|
119
|
-
logger.warn("trackByTags: event symbol is missing in trackData");
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
// 根据事件标识符过滤标签
|
|
123
|
-
const matchedTags = filterTagsByEvent(adaptedTags, eventSymbol);
|
|
124
|
-
if (matchedTags.length === 0) {
|
|
125
|
-
logger.log(`trackByTags: No tags found for event: ${eventSymbol}`);
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
// 提取事件数据(排除 event 字段)
|
|
129
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
130
|
-
const { event, ...eventData } = trackData;
|
|
131
|
-
// 处理每个匹配的标签
|
|
132
|
-
matchedTags.forEach((tag) => {
|
|
133
|
-
const parsed = parseTag(tag);
|
|
134
|
-
if (!parsed) {
|
|
135
|
-
logger.warn(`trackByTags: Invalid tag format: ${tag}`);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
handleTagTracking(parsed, eventData);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/constants/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { TrackTagsVersionMap } from "./tagsMap";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tagsMap.d.ts","sourceRoot":"","sources":["../../src/constants/tagsMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google Analytics / gtag.js 适配器
|
|
3
|
-
* 使用标准的 window.gtag() API
|
|
4
|
-
* 专注于转化事件追踪
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* gtag 命令类型
|
|
8
|
-
*/
|
|
9
|
-
type GtagCommand = "config" | "event" | "set" | "get";
|
|
10
|
-
/**
|
|
11
|
-
* gtag 埋点函数
|
|
12
|
-
* 调用 window.gtag() 标准 API
|
|
13
|
-
*/
|
|
14
|
-
export declare const gtagTrack: (command: GtagCommand, targetOrEventName: string, params?: Record<string, any>) => void;
|
|
15
|
-
/**
|
|
16
|
-
* 发送 gtag 事件
|
|
17
|
-
*/
|
|
18
|
-
export declare const gtagEvent: (eventName: string, eventParams?: Record<string, any>) => void;
|
|
19
|
-
/**
|
|
20
|
-
* 发送 gtag config
|
|
21
|
-
*/
|
|
22
|
-
export declare const gtagConfig: (measurementId: string, configParams?: Record<string, any>) => void;
|
|
23
|
-
/**
|
|
24
|
-
* 检测 gtag 是否可用
|
|
25
|
-
*/
|
|
26
|
-
export declare const isGtagAvailable: () => boolean;
|
|
27
|
-
/**
|
|
28
|
-
* gtag 适配器对象
|
|
29
|
-
*/
|
|
30
|
-
export declare const gtagAdapter: {
|
|
31
|
-
track: (command: GtagCommand, targetOrEventName: string, params?: Record<string, any>) => void;
|
|
32
|
-
event: (eventName: string, eventParams?: Record<string, any>) => void;
|
|
33
|
-
config: (measurementId: string, configParams?: Record<string, any>) => void;
|
|
34
|
-
isAvailable: () => boolean;
|
|
35
|
-
};
|
|
36
|
-
export {};
|
|
37
|
-
//# sourceMappingURL=gtag.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gtag.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/gtag.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,KAAK,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,SAAS,GACpB,SAAS,WAAW,EACpB,mBAAmB,MAAM,EACzB,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC3B,IAgBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GACpB,WAAW,MAAM,EACjB,cAAc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAChC,IAEF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GACrB,eAAe,MAAM,EACrB,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACjC,IAEF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,QAAO,OAKlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW;qBAtDb,WAAW,qBACD,MAAM,WAChB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC3B,IAAI;uBAsBM,MAAM,gBACH,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAChC,IAAI;4BAQU,MAAM,iBACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KACjC,IAAI;uBAO4B,OAAO;CAezC,CAAC"}
|