@anker-in/analysis 0.2.0 → 0.2.1

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 CHANGED
@@ -35,13 +35,18 @@ __export(index_exports, {
35
35
  MetaPixel: () => MetaPixel_default,
36
36
  PixelsManager: () => PixelsManager_default,
37
37
  TrackTagsVersionMap: () => TrackTagsVersionMap,
38
+ clearTrackTags: () => clearTrackTags,
38
39
  default: () => index_default,
39
40
  gtagTrack: () => gtagTrack,
41
+ hasTrackPoint: () => hasTrackPoint,
40
42
  isPlatformAvailable: () => isPlatformAvailable,
41
43
  logger: () => logger,
42
44
  metaTrack: () => metaTrack,
45
+ setTrackTags: () => setTrackTags,
43
46
  track: () => track,
44
47
  trackByTags: () => trackByTags,
48
+ triggerTrack: () => triggerTrack,
49
+ triggerTrackBatch: () => triggerTrackBatch,
45
50
  updateScriptType: () => updateScriptType,
46
51
  updateScriptsType: () => updateScriptsType,
47
52
  useTracking: () => useTracking,
@@ -171,6 +176,239 @@ var isPlatformAvailable = /* @__PURE__ */ __name((platform) => {
171
176
  }
172
177
  }, "isPlatformAvailable");
173
178
 
179
+ // src/constants/tagsMap.ts
180
+ var TrackTagsVersionMap = {
181
+ "fbq:act": "fbq:atc",
182
+ "gtag:conversion": "gtag:atc"
183
+ };
184
+
185
+ // src/autoTrack/trackByTags.ts
186
+ function parseTag(tag) {
187
+ const parts = tag.split(":");
188
+ if (parts.length < 2) {
189
+ return null;
190
+ }
191
+ return {
192
+ media: parts[0]?.toLowerCase() || "",
193
+ event: parts[1]?.toLowerCase() || "",
194
+ target: parts[2] || null
195
+ };
196
+ }
197
+ __name(parseTag, "parseTag");
198
+ function adaptEventName(tags) {
199
+ for (let i = 0; i < tags.length; i++) {
200
+ if (!tags[i]) {
201
+ continue;
202
+ }
203
+ for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {
204
+ if (tags[i]?.includes(oldEvent)) {
205
+ tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? "";
206
+ break;
207
+ }
208
+ }
209
+ }
210
+ }
211
+ __name(adaptEventName, "adaptEventName");
212
+ function handleTagTracking(parsedTag, eventData) {
213
+ const { media, event, target } = parsedTag;
214
+ if (!target) {
215
+ logger.warn(`Tag missing target: ${media}:${event}`);
216
+ return;
217
+ }
218
+ try {
219
+ switch (media) {
220
+ case "fbq":
221
+ case "meta": {
222
+ const config = {
223
+ platform: "meta",
224
+ event: target,
225
+ // target 作为事件名
226
+ data: eventData
227
+ };
228
+ track(config);
229
+ break;
230
+ }
231
+ case "gtag": {
232
+ const config = {
233
+ platform: "gtag",
234
+ eventName: "conversion",
235
+ send_to: target,
236
+ // target 作为转化目标ID
237
+ value: eventData?.value ?? 1,
238
+ currency: eventData?.currency,
239
+ transactionId: eventData?.transactionId
240
+ };
241
+ track(config);
242
+ break;
243
+ }
244
+ default:
245
+ logger.warn(`Unsupported media platform: ${media}`);
246
+ }
247
+ } catch (error) {
248
+ logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);
249
+ }
250
+ }
251
+ __name(handleTagTracking, "handleTagTracking");
252
+ function trackByTags({ tags, data }) {
253
+ if (!tags || tags.length === 0) {
254
+ logger.warn("trackByTags: tags array is empty");
255
+ return;
256
+ }
257
+ const adaptedTags = [...tags];
258
+ adaptEventName(adaptedTags);
259
+ const firstData = data && data.length > 0 ? data[0] : void 0;
260
+ const { event, ...trackingData } = firstData || {};
261
+ adaptedTags.forEach((tag) => {
262
+ const parsed = parseTag(tag);
263
+ if (!parsed) {
264
+ logger.warn(`trackByTags: Invalid tag format: ${tag}`);
265
+ return;
266
+ }
267
+ handleTagTracking(parsed, trackingData);
268
+ });
269
+ }
270
+ __name(trackByTags, "trackByTags");
271
+
272
+ // src/core/helpers/triggerTrack.ts
273
+ function getTrackTagsFromStorage(storageKey) {
274
+ if (typeof window === "undefined" || !window.sessionStorage) {
275
+ logger.warn("sessionStorage is not available");
276
+ return null;
277
+ }
278
+ try {
279
+ const trackTagsRaw = sessionStorage.getItem(storageKey);
280
+ if (!trackTagsRaw) {
281
+ return null;
282
+ }
283
+ const trackTags = JSON.parse(trackTagsRaw);
284
+ if (!trackTags || typeof trackTags !== "object") {
285
+ logger.warn(
286
+ `Invalid trackTags format in sessionStorage key: ${storageKey}`
287
+ );
288
+ return null;
289
+ }
290
+ return trackTags;
291
+ } catch (error) {
292
+ logger.error(`Failed to parse trackTags from sessionStorage:`, error);
293
+ return null;
294
+ }
295
+ }
296
+ __name(getTrackTagsFromStorage, "getTrackTagsFromStorage");
297
+ function triggerTrack(trackPoint, options = {}) {
298
+ const {
299
+ tags,
300
+ eventData = {},
301
+ storageKey = "trackTags",
302
+ silent = false
303
+ } = options;
304
+ if (!trackPoint || typeof trackPoint !== "string") {
305
+ if (!silent) {
306
+ logger.warn("triggerTrack: trackPoint is required and must be a string");
307
+ }
308
+ return;
309
+ }
310
+ const trackTagsRow = getTrackTagsFromStorage(storageKey);
311
+ if (!trackTagsRow) {
312
+ if (!silent) {
313
+ logger.warn(
314
+ `triggerTrack: trackTags not found in sessionStorage (key: ${storageKey})`
315
+ );
316
+ }
317
+ return;
318
+ }
319
+ const trackTags = tags || trackTagsRow[trackPoint];
320
+ if (!trackTags) {
321
+ if (!silent) {
322
+ logger.warn(`triggerTrack: No tags found for trackPoint: ${trackPoint}`);
323
+ }
324
+ return;
325
+ }
326
+ if (!Array.isArray(trackTags)) {
327
+ if (!silent) {
328
+ logger.warn(
329
+ `triggerTrack: Tags for trackPoint "${trackPoint}" is not an array`
330
+ );
331
+ }
332
+ return;
333
+ }
334
+ if (trackTags.length === 0) {
335
+ if (!silent) {
336
+ logger.log(
337
+ `triggerTrack: Tags array is empty for trackPoint: ${trackPoint}`
338
+ );
339
+ }
340
+ return;
341
+ }
342
+ try {
343
+ trackByTags({
344
+ tags: trackTags,
345
+ data: [{ event: "custom", ...eventData }]
346
+ });
347
+ logger.log(
348
+ `triggerTrack: Successfully triggered for trackPoint: ${trackPoint}`,
349
+ {
350
+ tagsCount: trackTags.length,
351
+ trackTags
352
+ }
353
+ );
354
+ } catch (error) {
355
+ logger.error(
356
+ `triggerTrack: Failed to track for trackPoint: ${trackPoint}`,
357
+ error
358
+ );
359
+ }
360
+ }
361
+ __name(triggerTrack, "triggerTrack");
362
+ function triggerTrackBatch(trackPoints, options = {}) {
363
+ if (!Array.isArray(trackPoints)) {
364
+ logger.warn("triggerTrackBatch: trackPoints must be an array");
365
+ return;
366
+ }
367
+ trackPoints.forEach((trackPoint) => {
368
+ triggerTrack(trackPoint, options);
369
+ });
370
+ }
371
+ __name(triggerTrackBatch, "triggerTrackBatch");
372
+ function setTrackTags(trackTags, storageKey = "trackTags") {
373
+ if (typeof window === "undefined" || !window.sessionStorage) {
374
+ logger.warn("sessionStorage is not available");
375
+ return;
376
+ }
377
+ try {
378
+ const trackTagsJson = JSON.stringify(trackTags);
379
+ sessionStorage.setItem(storageKey, trackTagsJson);
380
+ logger.log(
381
+ `setTrackTags: Successfully saved to sessionStorage (key: ${storageKey})`
382
+ );
383
+ } catch (error) {
384
+ logger.error("setTrackTags: Failed to save to sessionStorage", error);
385
+ }
386
+ }
387
+ __name(setTrackTags, "setTrackTags");
388
+ function clearTrackTags(storageKey = "trackTags") {
389
+ if (typeof window === "undefined" || !window.sessionStorage) {
390
+ return;
391
+ }
392
+ try {
393
+ sessionStorage.removeItem(storageKey);
394
+ logger.log(
395
+ `clearTrackTags: Successfully removed from sessionStorage (key: ${storageKey})`
396
+ );
397
+ } catch (error) {
398
+ logger.error("clearTrackTags: Failed to remove from sessionStorage", error);
399
+ }
400
+ }
401
+ __name(clearTrackTags, "clearTrackTags");
402
+ function hasTrackPoint(trackPoint, storageKey = "trackTags") {
403
+ const trackTags = getTrackTagsFromStorage(storageKey);
404
+ if (!trackTags) {
405
+ return false;
406
+ }
407
+ const tags = trackTags[trackPoint];
408
+ return Array.isArray(tags) && tags.length > 0;
409
+ }
410
+ __name(hasTrackPoint, "hasTrackPoint");
411
+
174
412
  // src/core/adapters/gtag.ts
175
413
  var gtagTrack = /* @__PURE__ */ __name((command, targetOrEventName, params) => {
176
414
  if (typeof window === "undefined") {
@@ -263,121 +501,6 @@ function handleMetaTrack(params) {
263
501
  }
264
502
  __name(handleMetaTrack, "handleMetaTrack");
265
503
 
266
- // src/constants/tagsMap.ts
267
- var TrackTagsVersionMap = {
268
- "fbq:act": "fbq:atc",
269
- "gtag:conversion": "gtag:atc"
270
- };
271
-
272
- // src/autoTrack/trackByTags.ts
273
- function parseTag(tag) {
274
- const parts = tag.split(":");
275
- if (parts.length < 2) {
276
- return null;
277
- }
278
- return {
279
- media: parts[0]?.toLowerCase() || "",
280
- event: parts[1]?.toLowerCase() || "",
281
- target: parts[2] || null
282
- };
283
- }
284
- __name(parseTag, "parseTag");
285
- function adaptEventName(tags) {
286
- for (let i = 0; i < tags.length; i++) {
287
- if (!tags[i]) {
288
- continue;
289
- }
290
- for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {
291
- if (tags[i]?.includes(oldEvent)) {
292
- tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? "";
293
- break;
294
- }
295
- }
296
- }
297
- }
298
- __name(adaptEventName, "adaptEventName");
299
- function filterTagsByEvent(tags, eventSymbol) {
300
- return tags.filter((tag) => {
301
- const parsed = parseTag(tag);
302
- return parsed?.event === eventSymbol.toLowerCase();
303
- });
304
- }
305
- __name(filterTagsByEvent, "filterTagsByEvent");
306
- function handleTagTracking(parsedTag, eventData) {
307
- const { media, event, target } = parsedTag;
308
- if (!target) {
309
- logger.warn(`Tag missing target: ${media}:${event}`);
310
- return;
311
- }
312
- try {
313
- switch (media) {
314
- case "fbq":
315
- case "meta": {
316
- const config = {
317
- platform: "meta",
318
- event: target,
319
- // target 作为事件名
320
- data: eventData
321
- };
322
- track(config);
323
- break;
324
- }
325
- case "gtag": {
326
- const config = {
327
- platform: "gtag",
328
- eventName: "conversion",
329
- send_to: target,
330
- // target 作为转化目标ID
331
- value: eventData?.value ?? 1,
332
- currency: eventData?.currency,
333
- transactionId: eventData?.transactionId
334
- };
335
- track(config);
336
- break;
337
- }
338
- default:
339
- logger.warn(`Unsupported media platform: ${media}`);
340
- }
341
- } catch (error) {
342
- logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);
343
- }
344
- }
345
- __name(handleTagTracking, "handleTagTracking");
346
- function trackByTags({ tags, data }) {
347
- if (!tags || tags.length === 0) {
348
- logger.warn("trackByTags: tags array is empty");
349
- return;
350
- }
351
- if (!data || data.length === 0) {
352
- logger.warn("trackByTags: data array is empty");
353
- return;
354
- }
355
- const adaptedTags = [...tags];
356
- adaptEventName(adaptedTags);
357
- data.forEach((trackData) => {
358
- const eventSymbol = trackData.event?.toLowerCase();
359
- if (!eventSymbol) {
360
- logger.warn("trackByTags: event symbol is missing in trackData");
361
- return;
362
- }
363
- const matchedTags = filterTagsByEvent(adaptedTags, eventSymbol);
364
- if (matchedTags.length === 0) {
365
- logger.log(`trackByTags: No tags found for event: ${eventSymbol}`);
366
- return;
367
- }
368
- const { event, ...eventData } = trackData;
369
- matchedTags.forEach((tag) => {
370
- const parsed = parseTag(tag);
371
- if (!parsed) {
372
- logger.warn(`trackByTags: Invalid tag format: ${tag}`);
373
- return;
374
- }
375
- handleTagTracking(parsed, eventData);
376
- });
377
- });
378
- }
379
- __name(trackByTags, "trackByTags");
380
-
381
504
  // src/core/tracking/with-tracking.ts
382
505
  function executeTracking(trackPoint, trackConfig) {
383
506
  const configs = Array.isArray(trackConfig) ? trackConfig : [trackConfig ?? {}];
@@ -685,12 +808,17 @@ var index_default = {
685
808
  MetaPixel,
686
809
  PixelsManager,
687
810
  TrackTagsVersionMap,
811
+ clearTrackTags,
688
812
  gtagTrack,
813
+ hasTrackPoint,
689
814
  isPlatformAvailable,
690
815
  logger,
691
816
  metaTrack,
817
+ setTrackTags,
692
818
  track,
693
819
  trackByTags,
820
+ triggerTrack,
821
+ triggerTrackBatch,
694
822
  updateScriptType,
695
823
  updateScriptsType,
696
824
  useTracking,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/helpers/logger.ts","../src/core/helpers/script-loader.ts","../src/core/helpers/function-utils.ts","../src/core/helpers/platform-detector.ts","../src/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"],"sourcesContent":["/**\n * Analysis SDK - 埋点 SDK 主入口\n *\n * 提供统一的埋点接口,支持多平台埋点上报\n */\n\n// ============= 默认导出 =============\n\nimport { track } from \"./core/tracking\";\nimport { trackByTags } from \"./autoTrack/trackByTags\";\nimport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\nimport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= 核心功能 =============\n\nexport { track } from \"./core/tracking\";\nexport { gtagTrack } from \"./core/adapters\";\nexport { metaTrack } from \"./core/adapters\";\n\n// ============= 高阶函数 - 无侵入式埋点 =============\n\nexport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= TrackByTags 功能 =============\n\nexport { trackByTags } from \"./autoTrack/trackByTags\";\n\n// ============= 工具函数 =============\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","/**\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"],"mappings":"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","names":["config","Script","import_react","import_script","import_jsx_runtime","Script","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/helpers/logger.ts","../src/core/helpers/script-loader.ts","../src/core/helpers/function-utils.ts","../src/core/helpers/platform-detector.ts","../src/constants/tagsMap.ts","../src/autoTrack/trackByTags.ts","../src/core/helpers/triggerTrack.ts","../src/core/adapters/gtag.ts","../src/core/adapters/meta.ts","../src/core/tracking/dispatcher.ts","../src/core/tracking/with-tracking.ts","../src/pixels/GtagPixel.tsx","../src/pixels/MetaPixel.tsx","../src/pixels/PixelsManager.tsx"],"sourcesContent":["/**\n * Analysis SDK - 埋点 SDK 主入口\n *\n * 提供统一的埋点接口,支持多平台埋点上报\n */\n\n// ============= 默认导出 =============\n\nimport { track } from \"./core/tracking\";\nimport { trackByTags } from \"./autoTrack/trackByTags\";\nimport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\nimport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= 核心功能 =============\n\nexport { track } from \"./core/tracking\";\nexport { gtagTrack } from \"./core/adapters\";\nexport { metaTrack } from \"./core/adapters\";\n\n// ============= 高阶函数 - 无侵入式埋点 =============\n\nexport { withTracking, useTracking } from \"./core/tracking\";\n\n// ============= TrackByTags 功能 =============\n\nexport { trackByTags } from \"./autoTrack/trackByTags\";\n\n// ============= TriggerTrack 功能 =============\n\nexport {\n triggerTrack,\n triggerTrackBatch,\n setTrackTags,\n clearTrackTags,\n hasTrackPoint,\n} from \"./core/helpers/triggerTrack\";\n\n// ============= 工具函数 =============\n\nexport {\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n} from \"./core/helpers\";\n\n// ============= Pixels 组件 =============\n\nexport { GtagPixel, MetaPixel, PixelsManager } from \"./pixels\";\n\n// ============= 常量 =============\n\nexport { TrackTagsVersionMap } from \"./constants\";\n\n// ============= 类型定义 =============\n\n// 导出所有通用类型\nexport type {\n PlatformType,\n TrackEventType,\n BasePlatformConfig,\n PixelsManagerConfig,\n GtagConfig,\n MetaPixelConfig,\n TikTokPixelConfig,\n ScarabConfig,\n AnalysisConfig,\n TrackParams,\n Tracker,\n AutoTrackConfig,\n Currency,\n TrackConfig,\n GtagEventName,\n GtagTrackParams,\n GtagConfigParams,\n MetaTrackParams,\n TrackByTagsData,\n TrackByTagsParams,\n ParsedTag,\n} from \"./types\";\n\n// 导出工具函数类型\nexport type { UpdateScriptTypeOptions } from \"./core/helpers\";\n\n// 导出 TriggerTrack 类型\nexport type {\n TrackTagsConfig,\n TriggerTrackOptions,\n} from \"./core/helpers/triggerTrack\";\n\nexport default {\n track,\n trackByTags,\n withTracking,\n useTracking,\n logger,\n isPlatformAvailable,\n updateScriptType,\n updateScriptsType,\n};\n","/**\n * 日志工具模块\n * 提供统一的日志记录功能\n */\n\n/**\n * 创建日志工具\n */\nexport function createLogger(initialEnabled = false) {\n let enabled = initialEnabled;\n\n return {\n setEnabled(value: boolean) {\n enabled = value;\n },\n\n log(...args: any[]) {\n if (enabled) {\n console.log(\"[Analysis SDK]\", ...args);\n }\n },\n\n warn(...args: any[]) {\n if (enabled) {\n console.warn(\"[Analysis SDK]\", ...args);\n }\n },\n\n error(...args: any[]) {\n if (enabled) {\n console.error(\"[Analysis SDK]\", ...args);\n }\n },\n };\n}\n\n// 全局 logger 实例\nexport const logger = createLogger();\n","/**\n * 脚本加载和管理模块\n * 提供动态加载和控制第三方脚本的能力\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 加载外部脚本\n */\nexport function loadScript(src: string, id?: string): Promise<void> {\n return new Promise((resolve, reject) => {\n // 检查是否已加载\n if (id && document.getElementById(id)) {\n logger.log(`Script ${id} already loaded`);\n resolve();\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = src;\n script.async = true;\n if (id) {\n script.id = id;\n }\n\n script.onload = () => {\n logger.log(`Script loaded: ${src}`);\n resolve();\n };\n\n script.onerror = () => {\n logger.error(`Failed to load script: ${src}`);\n reject(new Error(`Failed to load script: ${src}`));\n };\n\n document.head.appendChild(script);\n });\n}\n\n/**\n * 更新脚本的 type 属性配置\n */\nexport interface UpdateScriptTypeOptions {\n /** 脚本元素的 ID */\n id: string;\n /** 是否启用脚本 */\n enabled: boolean;\n /** 是否在启用时重新执行脚本内容 */\n executeOnEnable?: boolean;\n /** 错误处理回调 */\n onError?: (error: Error) => void;\n}\n\n/**\n * 动态更新脚本的 type 属性\n * 用于根据 cookie consent 状态动态启用/禁用脚本\n *\n * @param options - 配置选项\n * @returns 是否成功更新\n */\nexport function updateScriptType(options: UpdateScriptTypeOptions): boolean {\n const { id, enabled, executeOnEnable = true, onError } = options;\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const scriptElement = document.getElementById(id);\n if (!scriptElement) {\n logger.warn(`Script element with id \"${id}\" not found`);\n return false;\n }\n\n const newType = enabled ? \"text/javascript\" : \"text/plain\";\n const currentType = scriptElement.getAttribute(\"type\");\n\n // 如果从 text/plain 变为 text/javascript,需要重新执行脚本\n if (\n executeOnEnable &&\n currentType === \"text/plain\" &&\n newType === \"text/javascript\"\n ) {\n scriptElement.setAttribute(\"type\", newType);\n\n // 重新执行脚本内容\n const scriptContent = scriptElement.innerHTML;\n if (scriptContent && typeof window.eval === \"function\") {\n try {\n window.eval(scriptContent);\n logger.log(`Script \"${id}\" executed successfully`);\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n logger.error(`Script \"${id}\" execution error:`, error);\n if (onError) {\n onError(error);\n }\n }\n }\n } else {\n scriptElement.setAttribute(\"type\", newType);\n }\n\n return true;\n}\n\n/**\n * 批量更新多个脚本的 type 属性\n *\n * @param scriptIds - 脚本 ID 数组或生成 ID 的函数\n * @param enabled - 是否启用脚本\n * @param executeOnEnable - 是否在启用时重新执行脚本内容\n * @returns 成功更新的脚本数量\n */\nexport function updateScriptsType(\n scriptIds: string[] | ((index: number) => string),\n enabled: boolean,\n executeOnEnable = true\n): number {\n if (typeof window === \"undefined\") {\n return 0;\n }\n\n let successCount = 0;\n const ids = Array.isArray(scriptIds)\n ? scriptIds\n : Array.from({ length: 100 }, (_, i) => scriptIds(i)).filter((id) =>\n document.getElementById(id)\n );\n\n ids.forEach((id) => {\n const success = updateScriptType({\n id,\n enabled,\n executeOnEnable,\n });\n if (success) {\n successCount++;\n }\n });\n\n logger.log(`Updated ${successCount}/${ids.length} scripts`);\n return successCount;\n}\n","/**\n * 函数工具模块\n * 提供防抖、节流、安全执行等通用函数工具\n */\n\nimport { logger } from \"./logger\";\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let timer: ReturnType<typeof setTimeout> | null = null;\n return function (this: any, ...args: Parameters<T>) {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n fn.apply(this, args);\n }, delay);\n };\n}\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastTime = 0;\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n if (now - lastTime >= delay) {\n lastTime = now;\n fn.apply(this, args);\n }\n };\n}\n\n/**\n * 安全执行函数,捕获错误\n */\nexport function safeExecute<T>(\n fn: () => T,\n errorMessage?: string\n): T | undefined {\n try {\n return fn();\n } catch (error) {\n logger.error(errorMessage || \"Error executing function:\", error);\n return undefined;\n }\n}\n","/**\n * 平台检测模块\n * 检测各个埋点平台的可用性\n */\n\nimport type { PlatformType } from \"../../types\";\n\n/**\n * 检测指定平台是否可用\n */\nexport const isPlatformAvailable = (platform: PlatformType): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n switch (platform) {\n case \"gtag\":\n return (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n );\n case \"meta\":\n return typeof window.fbq !== \"undefined\";\n default:\n return false;\n }\n};\n\n/**\n * 检测所有可用的平台\n */\nexport const detectAvailablePlatforms = (): PlatformType[] => {\n const platforms: PlatformType[] = [\"gtag\", \"meta\"];\n return platforms.filter((platform) => isPlatformAvailable(platform));\n};\n","/**\n * 标签版本映射表\n * 用于兼容旧版本标签,将旧事件名映射到新事件名\n */\nexport const TrackTagsVersionMap = {\n \"fbq:act\": \"fbq:atc\",\n \"gtag:conversion\": \"gtag:atc\",\n} as const;\n","import { track } from \"../core/tracking\";\nimport { logger } from \"../core/helpers\";\nimport type { TrackConfig, ParsedTag, TrackByTagsParams } from \"../types\";\nimport { TrackTagsVersionMap } from \"../constants\";\n\n/**\n * 解析单个标签\n */\nfunction parseTag(tag: string): ParsedTag | null {\n const parts = tag.split(\":\");\n\n if (parts.length < 2) {\n return null;\n }\n\n return {\n media: parts[0]?.toLowerCase() || \"\",\n event: parts[1]?.toLowerCase() || \"\",\n target: parts[2] || null,\n };\n}\n\n/**\n * 适配事件名称(版本兼容)\n * 将旧版本的事件名替换为新版本的事件名\n */\nfunction adaptEventName(tags: string[]): void {\n for (let i = 0; i < tags.length; i++) {\n if (!tags[i]) {\n continue;\n }\n for (const [oldEvent, newEvent] of Object.entries(TrackTagsVersionMap)) {\n if (tags[i]?.includes(oldEvent)) {\n tags[i] = tags[i]?.replace(oldEvent, newEvent) ?? \"\";\n break;\n }\n }\n }\n}\n\n/**\n * 处理单个标签的埋点\n */\nfunction handleTagTracking(\n parsedTag: ParsedTag,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n eventData?: Record<string, any>\n): void {\n const { media, event, target } = parsedTag;\n\n if (!target) {\n logger.warn(`Tag missing target: ${media}:${event}`);\n return;\n }\n\n try {\n switch (media) {\n case \"fbq\":\n case \"meta\": {\n // Meta Pixel 埋点\n const config: TrackConfig<\"meta\"> = {\n platform: \"meta\",\n event: target, // target 作为事件名\n data: eventData,\n };\n track(config);\n break;\n }\n\n case \"gtag\": {\n // Gtag 转化事件埋点\n const config: TrackConfig<\"gtag\"> = {\n platform: \"gtag\",\n eventName: \"conversion\",\n send_to: target, // target 作为转化目标ID\n value: eventData?.value ?? 1.0,\n currency: eventData?.currency,\n transactionId: eventData?.transactionId,\n };\n track(config);\n break;\n }\n\n default:\n logger.warn(`Unsupported media platform: ${media}`);\n }\n } catch (error) {\n logger.error(`Failed to track tag ${media}:${event}:${target}:`, error);\n }\n}\n\n/**\n * 基于标签进行埋点上报(简化版)\n *\n * @param tags - 标签数组,格式: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123']\n * @param data - 事件数据数组,包含事件相关的额外数据\n *\n * @example\n * ```typescript\n * trackByTags({\n * tags: ['fbq:atc:1234567890', 'gtag:atc:AW-123456789/abc123'],\n * data: [{ event: 'custom' }]\n * });\n * ```\n */\nexport function trackByTags({ tags, data }: TrackByTagsParams): void {\n if (!tags || tags.length === 0) {\n logger.warn(\"trackByTags: tags array is empty\");\n return;\n }\n\n // 数据清洗:兼容旧版本标签\n const adaptedTags = [...tags];\n adaptEventName(adaptedTags);\n\n // 获取事件数据(如果提供了 data)\n const firstData = data && data.length > 0 ? data[0] : undefined;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { event, ...trackingData } = firstData || {};\n\n // 直接处理所有标签,不再过滤\n adaptedTags.forEach((tag) => {\n const parsed = parseTag(tag);\n\n if (!parsed) {\n logger.warn(`trackByTags: Invalid tag format: ${tag}`);\n return;\n }\n\n handleTagTracking(parsed, trackingData);\n });\n}\n","/**\n * 触发埋点上报工具\n *\n * 从 sessionStorage 读取 trackTags 配置,并根据 trackPoint 触发对应的埋点上报\n */\n\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport { logger } from \"./logger\";\n\n/**\n * TrackTags 配置类型\n * key: trackPoint 标识\n * value: 标签数组\n */\nexport interface TrackTagsConfig {\n [trackPoint: string]: string[];\n}\n\n/**\n * 埋点触发选项\n */\nexport interface TriggerTrackOptions {\n tags?: Array<string>;\n /** 自定义事件数据 */\n eventData?: Record<string, unknown>;\n /** 自定义存储键名,默认为 'trackTags' */\n storageKey?: string;\n /** 是否静默失败(不输出警告日志),默认为 false */\n silent?: boolean;\n}\n\n/**\n * 从 sessionStorage 获取 trackTags 配置\n *\n * @param storageKey - 存储键名\n * @returns TrackTags 配置对象,获取失败返回 null\n */\nfunction getTrackTagsFromStorage(storageKey: string): TrackTagsConfig | null {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return null;\n }\n\n try {\n const trackTagsRaw = sessionStorage.getItem(storageKey);\n\n if (!trackTagsRaw) {\n return null;\n }\n\n const trackTags = JSON.parse(trackTagsRaw);\n\n if (!trackTags || typeof trackTags !== \"object\") {\n logger.warn(\n `Invalid trackTags format in sessionStorage key: ${storageKey}`\n );\n return null;\n }\n\n return trackTags as TrackTagsConfig;\n } catch (error) {\n logger.error(`Failed to parse trackTags from sessionStorage:`, error);\n return null;\n }\n}\n\n/**\n * 触发埋点上报\n *\n * 从 sessionStorage 读取 trackTags 配置,根据 trackPoint 获取对应的标签数组,\n * 然后调用 trackByTags 进行埋点上报。\n *\n * @param trackPoint - 埋点标识,对应 trackTags 中的 key\n * @param options - 可选配置项\n *\n * @example\n * ```typescript\n * // 基础用法\n * triggerTrack('add_to_cart');\n *\n * // 带自定义数据\n * triggerTrack('purchase', {\n * eventData: {\n * value: 99.99,\n * currency: 'USD',\n * transactionId: 'ORDER-123'\n * }\n * });\n *\n * // 使用自定义存储键\n * triggerTrack('custom_event', {\n * storageKey: 'customTrackTags'\n * });\n * ```\n */\nexport function triggerTrack(\n trackPoint: string,\n options: TriggerTrackOptions = {}\n): void {\n const {\n tags,\n eventData = {},\n storageKey = \"trackTags\",\n silent = false,\n } = options;\n\n // 1. 验证 trackPoint\n if (!trackPoint || typeof trackPoint !== \"string\") {\n if (!silent) {\n logger.warn(\"triggerTrack: trackPoint is required and must be a string\");\n }\n return;\n }\n\n // 2. 从 sessionStorage 获取 trackTags\n const trackTagsRow = getTrackTagsFromStorage(storageKey);\n\n if (!trackTagsRow) {\n if (!silent) {\n logger.warn(\n `triggerTrack: trackTags not found in sessionStorage (key: ${storageKey})`\n );\n }\n return;\n }\n\n // 3. 根据 trackPoint 获取对应的 tags\n const trackTags = tags || trackTagsRow[trackPoint];\n\n if (!trackTags) {\n if (!silent) {\n logger.warn(`triggerTrack: No tags found for trackPoint: ${trackPoint}`);\n }\n return;\n }\n\n if (!Array.isArray(trackTags)) {\n if (!silent) {\n logger.warn(\n `triggerTrack: Tags for trackPoint \"${trackPoint}\" is not an array`\n );\n }\n return;\n }\n\n if (trackTags.length === 0) {\n if (!silent) {\n logger.log(\n `triggerTrack: Tags array is empty for trackPoint: ${trackPoint}`\n );\n }\n return;\n }\n\n // 4. 触发埋点\n try {\n trackByTags({\n tags: trackTags,\n data: [{ event: \"custom\", ...eventData }],\n });\n\n logger.log(\n `triggerTrack: Successfully triggered for trackPoint: ${trackPoint}`,\n {\n tagsCount: trackTags.length,\n trackTags,\n }\n );\n } catch (error) {\n logger.error(\n `triggerTrack: Failed to track for trackPoint: ${trackPoint}`,\n error\n );\n }\n}\n\n/**\n * 批量触发多个埋点\n *\n * @param trackPoints - 埋点标识数组\n * @param options - 可选配置项(应用到所有埋点)\n *\n * @example\n * ```typescript\n * // 批量触发多个埋点\n * triggerTrackBatch(['view_item', 'add_to_cart']);\n *\n * // 带共享的事件数据\n * triggerTrackBatch(['event1', 'event2'], {\n * eventData: { sessionId: '12345' }\n * });\n * ```\n */\nexport function triggerTrackBatch(\n trackPoints: string[],\n options: TriggerTrackOptions = {}\n): void {\n if (!Array.isArray(trackPoints)) {\n logger.warn(\"triggerTrackBatch: trackPoints must be an array\");\n return;\n }\n\n trackPoints.forEach((trackPoint) => {\n triggerTrack(trackPoint, options);\n });\n}\n\n/**\n * 设置 trackTags 到 sessionStorage\n *\n * @param trackTags - TrackTags 配置对象\n * @param storageKey - 存储键名,默认为 'trackTags'\n *\n * @example\n * ```typescript\n * setTrackTags({\n * 'add_to_cart': ['fbq:atc:123456', 'gtag:atc:AW-123/abc'],\n * 'purchase': ['fbq:purchase:123456', 'gtag:purchase:AW-123/xyz']\n * });\n * ```\n */\nexport function setTrackTags(\n trackTags: TrackTagsConfig,\n storageKey: string = \"trackTags\"\n): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n logger.warn(\"sessionStorage is not available\");\n return;\n }\n\n try {\n const trackTagsJson = JSON.stringify(trackTags);\n sessionStorage.setItem(storageKey, trackTagsJson);\n logger.log(\n `setTrackTags: Successfully saved to sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"setTrackTags: Failed to save to sessionStorage\", error);\n }\n}\n\n/**\n * 清除 trackTags\n *\n * @param storageKey - 存储键名,默认为 'trackTags'\n */\nexport function clearTrackTags(storageKey: string = \"trackTags\"): void {\n if (typeof window === \"undefined\" || !window.sessionStorage) {\n return;\n }\n\n try {\n sessionStorage.removeItem(storageKey);\n logger.log(\n `clearTrackTags: Successfully removed from sessionStorage (key: ${storageKey})`\n );\n } catch (error) {\n logger.error(\"clearTrackTags: Failed to remove from sessionStorage\", error);\n }\n}\n\n/**\n * 检查某个 trackPoint 是否存在\n *\n * @param trackPoint - 埋点标识\n * @param storageKey - 存储键名,默认为 'trackTags'\n * @returns 是否存在对应的标签配置\n */\nexport function hasTrackPoint(\n trackPoint: string,\n storageKey: string = \"trackTags\"\n): boolean {\n const trackTags = getTrackTagsFromStorage(storageKey);\n\n if (!trackTags) {\n return false;\n }\n\n const tags = trackTags[trackPoint];\n return Array.isArray(tags) && tags.length > 0;\n}\n","/**\n * Google Analytics / gtag.js 适配器\n * 使用标准的 window.gtag() API\n * 专注于转化事件追踪\n */\n\n/**\n * gtag 命令类型\n */\ntype GtagCommand = \"config\" | \"event\" | \"set\" | \"get\";\n\n/**\n * gtag 埋点函数\n * 调用 window.gtag() 标准 API\n */\nexport const gtagTrack = (\n command: GtagCommand,\n targetOrEventName: string,\n params?: Record<string, any>\n): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n // 确保 gtag 函数存在\n if (typeof window.gtag !== \"function\") {\n console.warn(\"gtag is not available. Please load gtag.js first.\");\n return;\n }\n\n try {\n window.gtag(command, targetOrEventName, params);\n } catch (error) {\n console.error(\"gtagTrack error:\", error);\n }\n};\n\n/**\n * 发送 gtag 事件\n */\nexport const gtagEvent = (\n eventName: string,\n eventParams?: Record<string, any>\n): void => {\n gtagTrack(\"event\", eventName, eventParams);\n};\n\n/**\n * 发送 gtag config\n */\nexport const gtagConfig = (\n measurementId: string,\n configParams?: Record<string, any>\n): void => {\n gtagTrack(\"config\", measurementId, configParams);\n};\n\n/**\n * 检测 gtag 是否可用\n */\nexport const isGtagAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.gtag === \"function\";\n};\n\n/**\n * gtag 适配器对象\n */\nexport const gtagAdapter = {\n track: gtagTrack,\n event: gtagEvent,\n config: gtagConfig,\n isAvailable: isGtagAvailable,\n};\n","/**\n * Meta Pixel 适配器\n * 提供 Facebook/Meta Pixel 的埋点功能\n */\n\n/**\n * Meta Pixel 埋点函数\n */\nexport const metaTrack = (event: string, data?: object): void => {\n if (typeof window === \"undefined\") {\n return;\n }\n if (typeof window.fbq !== \"undefined\") {\n try {\n if (data) {\n window.fbq(\"track\", event, data);\n } else {\n window.fbq(\"track\", event);\n }\n } catch (error) {\n console.log(\"fbqTrack error\", error);\n }\n }\n};\n\n/**\n * 检测 Meta Pixel 是否可用\n */\nexport const isMetaAvailable = (): boolean => {\n if (typeof window === \"undefined\") {\n return false;\n }\n return typeof window.fbq !== \"undefined\";\n};\n\n/**\n * Meta Pixel 适配器对象\n */\nexport const metaAdapter = {\n track: metaTrack,\n isAvailable: isMetaAvailable,\n};\n","/**\n * 埋点调度器模块\n * 负责根据平台类型分发事件到对应的适配器\n */\n\nimport type { PlatformType } from \"../../types\";\nimport type {\n TrackConfig,\n GtagTrackParams,\n MetaTrackParams,\n} from \"../../types\";\nimport { isPlatformAvailable, logger } from \"../helpers\";\nimport { gtagEvent, gtagConfig } from \"../adapters/gtag\";\nimport { metaTrack } from \"../adapters/meta\";\n\nfunction track(config: TrackConfig<\"gtag\">): void;\nfunction track(config: TrackConfig<\"meta\">): void;\n\nfunction track<P extends PlatformType>(config: TrackConfig<P>): void {\n const { platform, ...params } = config;\n\n if (!isPlatformAvailable(platform)) {\n logger.warn(`Platform ${platform} is not available`);\n return;\n }\n\n try {\n switch (platform) {\n case \"gtag\": {\n const gtagParams = params as unknown as GtagTrackParams;\n handleGtagTrack(gtagParams);\n break;\n }\n\n case \"meta\": {\n const metaParams = params as unknown as MetaTrackParams;\n handleMetaTrack(metaParams);\n break;\n }\n\n default:\n logger.warn(`Unsupported platform: ${platform}`);\n }\n } catch (error) {\n logger.error(`Failed to track on platform ${platform}:`, error);\n }\n}\n\n/**\n * 处理 Gtag 埋点(转化事件)\n */\nfunction handleGtagTrack(params: GtagTrackParams): void {\n const { eventName, measurementId, ...restParams } = params;\n\n // 如果有 measurementId,先发送 config\n if (measurementId) {\n gtagConfig(measurementId, {});\n }\n\n // 构建事件参数\n const eventParams: Record<string, any> = { ...restParams };\n\n // 处理 transactionId -> transaction_id 转换\n if (eventParams.transactionId && !eventParams.transaction_id) {\n eventParams.transaction_id = eventParams.transactionId;\n delete eventParams.transactionId;\n }\n\n // 发送转化事件\n gtagEvent(eventName, eventParams);\n\n logger.log(`Gtag conversion tracked: ${eventName}`, eventParams);\n}\n\n/**\n * 处理 Meta Pixel 埋点\n */\nfunction handleMetaTrack(params: {\n event: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data?: Record<string, any>;\n}): void {\n const { event, data } = params;\n\n if (!event) {\n logger.warn(\"Meta Pixel event name is required\");\n return;\n }\n\n metaTrack(event, data);\n logger.log(`Meta Pixel event tracked: ${event}`, data);\n}\n\nexport default track;\nexport { track };\n","/**\n * 埋点装饰器模块\n * 提供函数包装器和 React Hooks,为业务函数添加埋点能力\n */\n\nimport { track } from \"./dispatcher\";\nimport { logger, debounce, throttle } from \"../helpers\";\nimport { trackByTags } from \"../../autoTrack/trackByTags\";\nimport type {\n TrackConfig,\n PlatformType,\n WithTrackingConfig,\n} from \"../../types\";\n\n/**\n * 执行埋点上报\n */\nfunction executeTracking<P extends PlatformType>(\n trackPoint?: string,\n trackConfig?: TrackConfig<P> | TrackConfig<P>[]\n): void {\n const configs = Array.isArray(trackConfig)\n ? trackConfig\n : [trackConfig ?? {}];\n\n configs.forEach((config) => {\n try {\n track(config as any);\n } catch (error) {\n logger.error(\"withTracking: 埋点执行失败\", error);\n }\n });\n if (\n typeof window !== \"undefined\" &&\n !!trackPoint &&\n (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"]?.length > 0\n ) {\n trackByTags({\n tags: (window as any).__FUN_TRACK_TAGS__?.[trackPoint ?? \"\"] ?? [],\n data: [{ event: \"custom\" }],\n });\n }\n}\n\nexport function withTracking<T extends (...args: any[]) => any>(\n fn: T,\n config: WithTrackingConfig\n): T {\n const {\n trackConfig,\n timing = \"after\",\n condition,\n trackOnError = false,\n errorTrackConfig,\n debounce: debounceTime,\n throttle: throttleTime,\n trackPoint,\n } = config;\n\n // 核心包装函数\n function wrappedFunction(...args: Parameters<T>): ReturnType<T> {\n // 条件检查\n if (condition && !condition(args)) {\n return fn(...args);\n }\n\n // 生成埋点配置\n const getTrackConfig = (result?: any) => {\n return typeof trackConfig === \"function\"\n ? trackConfig(args, result)\n : trackConfig;\n };\n\n // Before 时机\n if (timing === \"before\" || timing === \"both\") {\n const config = getTrackConfig();\n executeTracking(trackPoint, config);\n }\n\n // 执行原函数\n try {\n const result = fn(...args);\n\n // 处理异步函数\n if (result instanceof Promise) {\n return result\n .then((resolvedResult) => {\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(resolvedResult);\n executeTracking(trackPoint, config);\n }\n return resolvedResult;\n })\n .catch((error) => {\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error, args));\n }\n throw error;\n }) as ReturnType<T>;\n }\n\n // 同步函数 After 时机\n if (timing === \"after\" || timing === \"both\") {\n const config = getTrackConfig(result);\n executeTracking(trackPoint, config);\n }\n\n return result;\n } catch (error) {\n // 错误时上报\n if (trackOnError && errorTrackConfig) {\n executeTracking(trackPoint, errorTrackConfig(error as Error, args));\n }\n throw error;\n }\n }\n\n if (typeof window !== \"undefined\" && !!trackPoint) {\n const urlParams = new URLSearchParams(window.location.search);\n if (urlParams.has(\"TRACK_DEV\")) {\n return ((...args) => {\n window.open(\n `http://localhost:3002/tracking?trackPoint=${trackPoint}`,\n \"_blank\"\n );\n }) as T;\n }\n }\n\n // 应用防抖/节流\n if (debounceTime) {\n return debounce(wrappedFunction, debounceTime) as T;\n }\n\n if (throttleTime) {\n return throttle(wrappedFunction, throttleTime) as T;\n }\n\n // __TRACK_POINT_MARKER__(trackPoint);\n\n return wrappedFunction as T;\n}\n\n// 定义标记函数(仅用于 AST 识别)\nfunction __TRACK_POINT_MARKER__(trackPoint?: string) {\n // 空函数,仅用于 AST 标记\n}\n\n/**\n * React Hooks 专用\n *\n * 为 React 组件提供埋点 Hook\n *\n * @example\n * ```typescript\n * function ProductCard({ product }) {\n * const trackAddToCart = useTracking({\n * trackConfig: {\n * platform: \"gtag\",\n * eventName: \"add_to_cart\"\n * }\n * });\n *\n * const handleClick = () => {\n * trackAddToCart(() => {\n * addToCart(product.id);\n * });\n * };\n *\n * return <button onClick={handleClick}>Add to Cart</button>;\n * }\n * ```\n */\nexport function useTracking(config: WithTrackingConfig) {\n return <T extends (...args: any[]) => any>(fn: T) => {\n return withTracking(fn, config);\n };\n}\n","import type { GtagConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface GtagPixelProps\n extends GtagConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst GtagPixel = (props: GtagPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onPixelLoaded,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // Gtag 初始化函数\n const initializeGtag = (pixelId: string) => {\n try {\n window.dataLayer = window.dataLayer || [];\n if (typeof window.gtag !== \"function\") {\n window.gtag = function gtag() {\n window.dataLayer!.push(arguments);\n };\n }\n window.gtag(\"js\", new Date());\n window.gtag(\"config\", pixelId, {\n allow_enhanced_conversions: true,\n });\n console.log(`✅ GtagPixel ${pixelId} initialized`);\n } catch (error) {\n console.error(`Failed to initialize GtagPixel ${pixelId}:`, error);\n }\n };\n\n // 检测 gtag 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 gtag 或 dataLayer 已存在,立即初始化\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag already available\");\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n return;\n }\n\n // 否则轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (\n typeof window.gtag !== \"undefined\" ||\n typeof window.dataLayer !== \"undefined\"\n ) {\n console.log(\"✅ Gtag became available!\");\n clearInterval(checkScriptLoaded);\n pixelIdsArray.forEach((pixelId) => initializeGtag(pixelId));\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for gtag\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled, pixelIdsArray]);\n\n return (\n <>\n {pixelIdsArray.length > 0 &&\n pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`GtagPixel_${pixelId}_${index}`}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n strategy={strategy}\n src={`https://www.googletagmanager.com/gtag/js?id=${pixelId}`}\n onLoad={() => {\n console.log(`✅ GtagPixel ${pixelId} loaded from network`);\n initializeGtag(pixelId);\n }}\n onError={() => {\n console.error(`❌ GtagPixel ${pixelId} script load error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n );\n};\n\nexport default GtagPixel;\n","import type { BasePlatformConfig } from \"../types\";\nimport React, { useEffect, useRef, useMemo } from \"react\";\nimport Script from \"next/script\";\n\ninterface MetaPixelProps\n extends BasePlatformConfig,\n React.ScriptHTMLAttributes<HTMLScriptElement> {}\n\nconst MetaPixel = (props: MetaPixelProps) => {\n const {\n cookieConsentEnabled,\n pixelIds,\n strategy,\n onPixelLoaded,\n ...scriptProps\n } = props;\n\n const pixelIdsKey = useMemo(() => JSON.stringify(pixelIds), [pixelIds]);\n\n const pixelIdsArray = useMemo(\n () => (Array.isArray(pixelIds) ? pixelIds : [pixelIds]),\n [pixelIdsKey]\n );\n\n // 使用 ref 存储 onLoad,避免依赖项变化导致 useEffect 重复执行\n const onLoadRef = useRef(onPixelLoaded);\n\n // 更新 ref(保持最新的回调引用)\n useEffect(() => {\n onLoadRef.current = onPixelLoaded;\n }, [onPixelLoaded]);\n\n // 检测 fbq 是否加载完成(仅在 cookieConsentEnabled=true 时监听)\n useEffect(() => {\n if (!cookieConsentEnabled || typeof window === \"undefined\") return;\n\n // 如果 fbq 已经存在,立即触发回调\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq already available\");\n onLoadRef.current?.();\n return;\n }\n\n // 否则开始轮询检测\n const checkScriptLoaded = setInterval(() => {\n if (typeof window.fbq !== \"undefined\") {\n console.log(\"✅ window.fbq became available!\");\n clearInterval(checkScriptLoaded);\n onLoadRef.current?.();\n }\n }, 100);\n\n // 5秒超时\n const timeout = setTimeout(() => {\n clearInterval(checkScriptLoaded);\n console.warn(\"⚠️ Timeout waiting for window.fbq\");\n }, 5000);\n\n return () => {\n clearInterval(checkScriptLoaded);\n clearTimeout(timeout);\n };\n }, [cookieConsentEnabled]);\n\n return (\n <>\n {pixelIdsArray?.length > 0 && ( // 添加 cookieConsentEnabled 条件\n <>\n <Script\n key=\"MetaPixel\"\n id=\"MetaPixel\"\n strategy={strategy}\n type={cookieConsentEnabled ? \"text/plain\" : \"text/javascript\"}\n data-category=\"targeting\"\n src={`https://connect.facebook.net/en_US/fbevents.js`}\n onLoad={() => {\n console.log(\"✅ MetaPixel main script loaded from network\");\n }}\n onError={() => {\n console.error(\"❌ MetaPixel main script load error\");\n }}\n />\n {pixelIdsArray.map((pixelId, index) => (\n <Script\n key={pixelId}\n id={`MetaPixel_${pixelId}_${index}`}\n strategy={strategy}\n type=\"text/javascript\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(f,b,n)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];}(window, document);\n fbq('init', '${pixelId}');\n fbq('track', 'PageView');\n `,\n }}\n onError={() => {\n console.error(`❌ MetaPixel ${pixelId} script error`);\n }}\n {...scriptProps}\n />\n ))}\n </>\n )}\n </>\n );\n};\n\nexport default MetaPixel;\n","import type { PixelsManagerConfig, BasePlatformConfig } from \"../types\";\nimport React from \"react\";\nimport GtagPixel from \"./GtagPixel\";\nimport MetaPixel from \"./MetaPixel\";\n\n// 定义 Pixel 组件的公共 props 类型\ntype PixelComponentProps = BasePlatformConfig &\n React.ScriptHTMLAttributes<HTMLScriptElement>;\n\n// Pixel 组件映射表\nconst PIXEL_COMPONENTS: Record<\n PixelsManagerConfig[\"type\"],\n React.ComponentType<PixelComponentProps> | null\n> = {\n gtag: GtagPixel,\n meta: MetaPixel,\n};\n\nconst PixelsManager: React.FC<PixelsManagerConfig> = (config) => {\n const { type, ...pixelProps } = config;\n\n const PixelComponent = PIXEL_COMPONENTS[type];\n\n if (!PixelComponent) {\n return null;\n }\n\n return <PixelComponent {...pixelProps} />;\n};\n\nexport default PixelsManager;\n"],"mappings":"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","names":["config","Script","import_react","import_script","import_jsx_runtime","Script","import_jsx_runtime"]}