shopkit-analytics 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +35 -100
  2. package/dist/adapters/index.d.mts +2 -1
  3. package/dist/adapters/index.d.ts +2 -1
  4. package/dist/adapters/index.js +230 -64
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/adapters/index.mjs +3 -1
  7. package/dist/chunk-4RDPDMGW.mjs +68 -0
  8. package/dist/chunk-4RDPDMGW.mjs.map +1 -0
  9. package/dist/chunk-NC25KOAF.mjs +156 -0
  10. package/dist/chunk-NC25KOAF.mjs.map +1 -0
  11. package/dist/chunk-NGPUKV7E.mjs +46 -0
  12. package/dist/chunk-NGPUKV7E.mjs.map +1 -0
  13. package/dist/{chunk-U3UOXFS4.mjs → chunk-NJQ2MOM2.mjs} +206 -116
  14. package/dist/chunk-NJQ2MOM2.mjs.map +1 -0
  15. package/dist/chunk-NKDB4KX2.mjs +2 -0
  16. package/dist/chunk-NKDB4KX2.mjs.map +1 -0
  17. package/dist/{chunk-BNV3EVHH.mjs → chunk-QCS5UARA.mjs} +2 -2
  18. package/dist/events/index.js +218 -54
  19. package/dist/events/index.js.map +1 -1
  20. package/dist/events/index.mjs +9 -7
  21. package/dist/experiment/index.d.mts +25 -0
  22. package/dist/experiment/index.d.ts +25 -0
  23. package/dist/experiment/index.js +74 -0
  24. package/dist/experiment/index.js.map +1 -0
  25. package/dist/experiment/index.mjs +15 -0
  26. package/dist/experiment/index.mjs.map +1 -0
  27. package/dist/{index-DS9OI5Mz.d.ts → index-D_8w5bL_.d.ts} +13 -0
  28. package/dist/{index-Bym1_EAp.d.mts → index-th6sBtE3.d.mts} +13 -0
  29. package/dist/index.d.mts +6 -2
  30. package/dist/index.d.ts +6 -2
  31. package/dist/index.js +400 -64
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +30 -7
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/services/index.d.mts +51 -0
  36. package/dist/services/index.d.ts +51 -0
  37. package/dist/services/index.js +180 -0
  38. package/dist/services/index.js.map +1 -0
  39. package/dist/services/index.mjs +11 -0
  40. package/dist/services/index.mjs.map +1 -0
  41. package/dist/types-C__2IBCj.d.mts +7 -0
  42. package/dist/types-C__2IBCj.d.ts +7 -0
  43. package/dist/utils/index.d.mts +19 -0
  44. package/dist/utils/index.d.ts +19 -0
  45. package/dist/utils/index.js +93 -0
  46. package/dist/utils/index.js.map +1 -0
  47. package/dist/utils/index.mjs +12 -0
  48. package/dist/utils/index.mjs.map +1 -0
  49. package/package.json +19 -1
  50. package/templates/nextjs/README.md +206 -0
  51. package/templates/nextjs/api-events-route.ts +62 -0
  52. package/dist/chunk-U3UOXFS4.mjs.map +0 -1
  53. /package/dist/{chunk-BNV3EVHH.mjs.map → chunk-QCS5UARA.mjs.map} +0 -0
package/dist/index.mjs CHANGED
@@ -2,7 +2,12 @@
2
2
  import {
3
3
  initTracking,
4
4
  initializeEventTracking
5
- } from "./chunk-BNV3EVHH.mjs";
5
+ } from "./chunk-QCS5UARA.mjs";
6
+ import {
7
+ eventPublisher,
8
+ eventSubscriber,
9
+ publishEvent
10
+ } from "./chunk-HCA4E2RA.mjs";
6
11
  import {
7
12
  AffiliateTracker_default,
8
13
  captureAffiliateParams,
@@ -14,6 +19,7 @@ import {
14
19
  useAffiliateTracker,
15
20
  useHasAffiliateData
16
21
  } from "./chunk-TNXTKEGS.mjs";
22
+ import "./chunk-NKDB4KX2.mjs";
17
23
  import {
18
24
  BaseAdapter,
19
25
  DEFAULT_CURRENCY,
@@ -28,15 +34,24 @@ import {
28
34
  createAdapterLogger,
29
35
  createLogger,
30
36
  logger
31
- } from "./chunk-U3UOXFS4.mjs";
37
+ } from "./chunk-NJQ2MOM2.mjs";
38
+ import {
39
+ PRIMA_EXPERIMENT_COOKIES,
40
+ PRIMA_EXPERIMENT_COOKIE_NAMES,
41
+ getExperimentParams,
42
+ hasExperimentData
43
+ } from "./chunk-NGPUKV7E.mjs";
44
+ import {
45
+ FacebookCAPIService,
46
+ createFacebookCAPIService
47
+ } from "./chunk-NC25KOAF.mjs";
48
+ import {
49
+ generateEventId,
50
+ getBrowserInfo
51
+ } from "./chunk-4RDPDMGW.mjs";
32
52
  import {
33
53
  EventType
34
54
  } from "./chunk-3NR2AKE4.mjs";
35
- import {
36
- eventPublisher,
37
- eventSubscriber,
38
- publishEvent
39
- } from "./chunk-HCA4E2RA.mjs";
40
55
 
41
56
  // src/ShopkitAnalytics.tsx
42
57
  import { useEffect } from "react";
@@ -159,10 +174,13 @@ export {
159
174
  DEFAULT_CURRENCY,
160
175
  EventNames,
161
176
  EventType,
177
+ FacebookCAPIService,
162
178
  GoogleAdapter,
163
179
  KwikCheckoutAdapter,
164
180
  KwikPassAdapter,
165
181
  MoengageAdapter,
182
+ PRIMA_EXPERIMENT_COOKIES,
183
+ PRIMA_EXPERIMENT_COOKIE_NAMES,
166
184
  PixelAdapter,
167
185
  PostHogAdapter,
168
186
  ShopifyAdapter,
@@ -170,13 +188,18 @@ export {
170
188
  captureAffiliateParams,
171
189
  clearAffiliateParams,
172
190
  createAdapterLogger,
191
+ createFacebookCAPIService,
173
192
  createLogger,
174
193
  ShopkitAnalytics_default as default,
175
194
  eventPublisher,
176
195
  eventSubscriber,
196
+ generateEventId,
177
197
  getAffiliateParams,
178
198
  getAffiliateSource,
199
+ getBrowserInfo,
200
+ getExperimentParams,
179
201
  hasAffiliateData,
202
+ hasExperimentData,
180
203
  initTracking,
181
204
  initializeEventTracking,
182
205
  logger,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ShopkitAnalytics.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { useShopifyCookies } from \"@shopify/hydrogen-react\";\nimport { initializeEventTracking } from \"./events/init\";\nimport { AffiliateTracker } from \"./affiliate\";\nimport { createLogger, type LoggerConfig } from \"./logger\";\nimport {\n GoogleAdapter,\n PixelAdapter,\n MoengageAdapter,\n PostHogAdapter,\n ShopifyAdapter,\n KwikPassAdapter,\n KwikCheckoutAdapter,\n} from \"./adapters\";\nimport type {\n GoogleAdapterConfig,\n PixelAdapterConfig,\n MoengageAdapterConfig,\n PostHogAdapterConfig,\n ShopifyAdapterConfig,\n KwikPassConfig,\n KwikCheckoutConfig,\n} from \"./adapters\";\nimport type { TrackingAdapter } from \"./events/subscriber\";\nimport type { AffiliateConfig } from \"./affiliate/types\";\n\nexport interface ShopkitAnalyticsConfig {\n // Analytics Adapters\n googleAnalytics?: GoogleAdapterConfig;\n facebookPixel?: PixelAdapterConfig;\n moengage?: MoengageAdapterConfig;\n posthog?: PostHogAdapterConfig;\n shopify?: ShopifyAdapterConfig;\n kwikpass?: KwikPassConfig;\n kwikcheckout?: KwikCheckoutConfig;\n customAdapters?: TrackingAdapter[];\n\n // Affiliate Tracking\n affiliate?: {\n enabled?: boolean;\n config?: Partial<AffiliateConfig>;\n autoCapture?: boolean;\n };\n\n // Logger Settings\n logger?: LoggerConfig;\n\n // General Settings (deprecated - use logger.enabled instead)\n enableDebugLogs?: boolean;\n autoInitialize?: boolean;\n}\n\nexport interface ShopkitAnalyticsProps {\n config: ShopkitAnalyticsConfig;\n children?: React.ReactNode;\n onInitialized?: () => void;\n onError?: (error: Error) => void;\n}\n\nconst ShopkitAnalytics: React.FC<ShopkitAnalyticsProps> = ({\n config,\n children,\n onInitialized,\n onError,\n}) => {\n // Enable Shopify cookies if Shopify adapter is configured\n useShopifyCookies({\n hasUserConsent: true,\n domain: config.shopify?.domain || \"\",\n });\n\n useEffect(() => {\n const initializeAnalytics = async () => {\n if (config.autoInitialize === false) return;\n\n // Create logger instance\n const loggerConfig: LoggerConfig = {\n enabled: config.logger?.enabled ?? config.enableDebugLogs ?? true,\n level: config.logger?.level ?? \"info\",\n name: \"@shopkit/analytics\",\n prettyPrint: config.logger?.prettyPrint ?? false,\n };\n\n const logger = createLogger(loggerConfig);\n\n try {\n logger.info(\"Starting initialization...\");\n\n const adapters: TrackingAdapter[] = [];\n\n // Helper function to add logger config to adapter config\n const addLoggerConfig = (adapterConfig: any) => ({\n ...adapterConfig,\n enableDebugLogs: loggerConfig.enabled,\n logLevel: loggerConfig.level,\n });\n\n // Google Analytics 4\n if (config.googleAnalytics) {\n const gaAdapter = new GoogleAdapter(\n addLoggerConfig(config.googleAnalytics)\n );\n adapters.push(gaAdapter);\n logger.info(\"Added Google Analytics adapter\");\n }\n\n // Facebook Pixel\n if (config.facebookPixel) {\n const pixelAdapter = new PixelAdapter(\n addLoggerConfig(config.facebookPixel)\n );\n adapters.push(pixelAdapter);\n logger.info(\"Added Facebook Pixel adapter\");\n }\n\n // MoEngage\n if (config.moengage) {\n const moengageAdapter = new MoengageAdapter(\n addLoggerConfig(config.moengage)\n );\n adapters.push(moengageAdapter);\n logger.info(\"Added MoEngage adapter\");\n }\n\n // PostHog\n if (config.posthog) {\n const posthogAdapter = new PostHogAdapter(\n addLoggerConfig(config.posthog)\n );\n adapters.push(posthogAdapter);\n logger.info(\"Added PostHog adapter\");\n }\n\n // Shopify Analytics\n if (config.shopify) {\n const shopifyAdapter = new ShopifyAdapter(\n addLoggerConfig(config.shopify)\n );\n adapters.push(shopifyAdapter);\n logger.info(\"Added Shopify Analytics adapter\");\n }\n\n // KwikPass Analytics\n if (config.kwikpass) {\n const kwikpassAdapter = new KwikPassAdapter(\n addLoggerConfig(config.kwikpass)\n );\n adapters.push(kwikpassAdapter);\n logger.info(\"Added KwikPass Analytics adapter\");\n }\n\n // KwikCheckout Analytics\n if (config.kwikcheckout) {\n const kwikcheckoutAdapter = new KwikCheckoutAdapter(\n addLoggerConfig(config.kwikcheckout)\n );\n adapters.push(kwikcheckoutAdapter);\n logger.info(\"Added KwikCheckout Analytics adapter\");\n }\n\n // Custom adapters\n if (config.customAdapters) {\n adapters.push(...config.customAdapters);\n logger.info(`Added ${config.customAdapters.length} custom adapters`);\n }\n\n if (adapters.length === 0) {\n logger.warn(\"No analytics adapters configured\");\n } else {\n // Initialize the event tracking system\n await initializeEventTracking(adapters);\n logger.info(\"Event tracking initialized with adapters\", {\n adapters: adapters.map((a) => a.name),\n });\n }\n\n logger.info(\"Initialization completed successfully\");\n onInitialized?.();\n } catch (err) {\n const error =\n err instanceof Error\n ? err\n : new Error(\"Unknown initialization error\");\n logger.error(\"Initialization failed\", error);\n onError?.(error);\n }\n };\n\n initializeAnalytics();\n }, [config, onInitialized, onError]);\n\n return (\n <>\n {/* Affiliate Tracker */}\n {config.affiliate?.enabled !== false && (\n <AffiliateTracker\n config={config.affiliate?.config}\n autoCapture={config.affiliate?.autoCapture}\n />\n )}\n\n {children ? <>{children}</> : null}\n </>\n );\n};\n\nexport default ShopkitAnalytics;\n"],"mappings":"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","names":["logger"]}
1
+ {"version":3,"sources":["../src/ShopkitAnalytics.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useEffect } from \"react\";\nimport { useShopifyCookies } from \"@shopify/hydrogen-react\";\nimport { initializeEventTracking } from \"./events/init\";\nimport { AffiliateTracker } from \"./affiliate\";\nimport { createLogger, type LoggerConfig } from \"./logger\";\nimport {\n GoogleAdapter,\n PixelAdapter,\n MoengageAdapter,\n PostHogAdapter,\n ShopifyAdapter,\n KwikPassAdapter,\n KwikCheckoutAdapter,\n} from \"./adapters\";\nimport type {\n GoogleAdapterConfig,\n PixelAdapterConfig,\n MoengageAdapterConfig,\n PostHogAdapterConfig,\n ShopifyAdapterConfig,\n KwikPassConfig,\n KwikCheckoutConfig,\n} from \"./adapters\";\nimport type { TrackingAdapter } from \"./events/subscriber\";\nimport type { AffiliateConfig } from \"./affiliate/types\";\n\nexport interface ShopkitAnalyticsConfig {\n // Analytics Adapters\n googleAnalytics?: GoogleAdapterConfig;\n facebookPixel?: PixelAdapterConfig;\n moengage?: MoengageAdapterConfig;\n posthog?: PostHogAdapterConfig;\n shopify?: ShopifyAdapterConfig;\n kwikpass?: KwikPassConfig;\n kwikcheckout?: KwikCheckoutConfig;\n customAdapters?: TrackingAdapter[];\n\n // Affiliate Tracking\n affiliate?: {\n enabled?: boolean;\n config?: Partial<AffiliateConfig>;\n autoCapture?: boolean;\n };\n\n // Logger Settings\n logger?: LoggerConfig;\n\n // General Settings (deprecated - use logger.enabled instead)\n enableDebugLogs?: boolean;\n autoInitialize?: boolean;\n}\n\nexport interface ShopkitAnalyticsProps {\n config: ShopkitAnalyticsConfig;\n children?: React.ReactNode;\n onInitialized?: () => void;\n onError?: (error: Error) => void;\n}\n\nconst ShopkitAnalytics: React.FC<ShopkitAnalyticsProps> = ({\n config,\n children,\n onInitialized,\n onError,\n}) => {\n // Enable Shopify cookies if Shopify adapter is configured\n useShopifyCookies({\n hasUserConsent: true,\n domain: config.shopify?.domain || \"\",\n });\n\n useEffect(() => {\n const initializeAnalytics = async () => {\n if (config.autoInitialize === false) return;\n\n // Create logger instance\n const loggerConfig: LoggerConfig = {\n enabled: config.logger?.enabled ?? config.enableDebugLogs ?? true,\n level: config.logger?.level ?? \"info\",\n name: \"@shopkit/analytics\",\n prettyPrint: config.logger?.prettyPrint ?? false,\n };\n\n const logger = createLogger(loggerConfig);\n\n try {\n logger.info(\"Starting initialization...\");\n\n const adapters: TrackingAdapter[] = [];\n\n // Helper function to add logger config to adapter config\n const addLoggerConfig = (adapterConfig: any) => ({\n ...adapterConfig,\n enableDebugLogs: loggerConfig.enabled,\n logLevel: loggerConfig.level,\n });\n\n // Google Analytics 4\n if (config.googleAnalytics) {\n const gaAdapter = new GoogleAdapter(\n addLoggerConfig(config.googleAnalytics)\n );\n adapters.push(gaAdapter);\n logger.info(\"Added Google Analytics adapter\");\n }\n\n // Facebook Pixel\n if (config.facebookPixel) {\n const pixelAdapter = new PixelAdapter(\n addLoggerConfig(config.facebookPixel)\n );\n adapters.push(pixelAdapter);\n logger.info(\"Added Facebook Pixel adapter\");\n }\n\n // MoEngage\n if (config.moengage) {\n const moengageAdapter = new MoengageAdapter(\n addLoggerConfig(config.moengage)\n );\n adapters.push(moengageAdapter);\n logger.info(\"Added MoEngage adapter\");\n }\n\n // PostHog\n if (config.posthog) {\n const posthogAdapter = new PostHogAdapter(\n addLoggerConfig(config.posthog)\n );\n adapters.push(posthogAdapter);\n logger.info(\"Added PostHog adapter\");\n }\n\n // Shopify Analytics\n if (config.shopify) {\n const shopifyAdapter = new ShopifyAdapter(\n addLoggerConfig(config.shopify)\n );\n adapters.push(shopifyAdapter);\n logger.info(\"Added Shopify Analytics adapter\");\n }\n\n // KwikPass Analytics\n if (config.kwikpass) {\n const kwikpassAdapter = new KwikPassAdapter(\n addLoggerConfig(config.kwikpass)\n );\n adapters.push(kwikpassAdapter);\n logger.info(\"Added KwikPass Analytics adapter\");\n }\n\n // KwikCheckout Analytics\n if (config.kwikcheckout) {\n const kwikcheckoutAdapter = new KwikCheckoutAdapter(\n addLoggerConfig(config.kwikcheckout)\n );\n adapters.push(kwikcheckoutAdapter);\n logger.info(\"Added KwikCheckout Analytics adapter\");\n }\n\n // Custom adapters\n if (config.customAdapters) {\n adapters.push(...config.customAdapters);\n logger.info(`Added ${config.customAdapters.length} custom adapters`);\n }\n\n if (adapters.length === 0) {\n logger.warn(\"No analytics adapters configured\");\n } else {\n // Initialize the event tracking system\n await initializeEventTracking(adapters);\n logger.info(\"Event tracking initialized with adapters\", {\n adapters: adapters.map((a) => a.name),\n });\n }\n\n logger.info(\"Initialization completed successfully\");\n onInitialized?.();\n } catch (err) {\n const error =\n err instanceof Error\n ? err\n : new Error(\"Unknown initialization error\");\n logger.error(\"Initialization failed\", error);\n onError?.(error);\n }\n };\n\n initializeAnalytics();\n }, [config, onInitialized, onError]);\n\n return (\n <>\n {/* Affiliate Tracker */}\n {config.affiliate?.enabled !== false && (\n <AffiliateTracker\n config={config.affiliate?.config}\n autoCapture={config.affiliate?.autoCapture}\n />\n )}\n\n {children ? <>{children}</> : null}\n </>\n );\n};\n\nexport default ShopkitAnalytics;\n"],"mappings":"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","names":["logger"]}
@@ -0,0 +1,51 @@
1
+ import { TEvent } from '../types.mjs';
2
+
3
+ /**
4
+ * Facebook CAPI Configuration
5
+ */
6
+ interface FacebookCAPIConfig {
7
+ accessToken: string;
8
+ pixelId: string;
9
+ testEventCode?: string;
10
+ }
11
+ /**
12
+ * Facebook CAPI Service for server-side event tracking
13
+ * Only handles events that are implemented in PixelAdapter
14
+ */
15
+ declare class FacebookCAPIService {
16
+ private config;
17
+ private baseUrl;
18
+ constructor(config: FacebookCAPIConfig);
19
+ /**
20
+ * Send events to Facebook CAPI
21
+ */
22
+ sendEvents(events: TEvent[], userInfo?: {
23
+ clientIpAddress?: string;
24
+ clientUserAgent?: string;
25
+ fbc?: string;
26
+ fbp?: string;
27
+ }): Promise<void>;
28
+ /**
29
+ * Check if event type is supported (matches PixelAdapter implementation)
30
+ */
31
+ private isSupportedEvent;
32
+ /**
33
+ * Convert internal event to Facebook CAPI event format
34
+ * Only handles events implemented in PixelAdapter
35
+ */
36
+ private convertToFacebookEvent;
37
+ /**
38
+ * Map internal event types to Facebook event names (matching PixelAdapter)
39
+ */
40
+ private mapEventName;
41
+ }
42
+ /**
43
+ * Create Facebook CAPI service instance
44
+ */
45
+ declare function createFacebookCAPIService(config?: {
46
+ accessToken: string;
47
+ pixelId: string;
48
+ testEventCode?: string;
49
+ }): FacebookCAPIService | null;
50
+
51
+ export { type FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService };
@@ -0,0 +1,51 @@
1
+ import { TEvent } from '../types.js';
2
+
3
+ /**
4
+ * Facebook CAPI Configuration
5
+ */
6
+ interface FacebookCAPIConfig {
7
+ accessToken: string;
8
+ pixelId: string;
9
+ testEventCode?: string;
10
+ }
11
+ /**
12
+ * Facebook CAPI Service for server-side event tracking
13
+ * Only handles events that are implemented in PixelAdapter
14
+ */
15
+ declare class FacebookCAPIService {
16
+ private config;
17
+ private baseUrl;
18
+ constructor(config: FacebookCAPIConfig);
19
+ /**
20
+ * Send events to Facebook CAPI
21
+ */
22
+ sendEvents(events: TEvent[], userInfo?: {
23
+ clientIpAddress?: string;
24
+ clientUserAgent?: string;
25
+ fbc?: string;
26
+ fbp?: string;
27
+ }): Promise<void>;
28
+ /**
29
+ * Check if event type is supported (matches PixelAdapter implementation)
30
+ */
31
+ private isSupportedEvent;
32
+ /**
33
+ * Convert internal event to Facebook CAPI event format
34
+ * Only handles events implemented in PixelAdapter
35
+ */
36
+ private convertToFacebookEvent;
37
+ /**
38
+ * Map internal event types to Facebook event names (matching PixelAdapter)
39
+ */
40
+ private mapEventName;
41
+ }
42
+ /**
43
+ * Create Facebook CAPI service instance
44
+ */
45
+ declare function createFacebookCAPIService(config?: {
46
+ accessToken: string;
47
+ pixelId: string;
48
+ testEventCode?: string;
49
+ }): FacebookCAPIService | null;
50
+
51
+ export { type FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService };
@@ -0,0 +1,180 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/services/facebook-capi.ts
22
+ var facebook_capi_exports = {};
23
+ __export(facebook_capi_exports, {
24
+ FacebookCAPIService: () => FacebookCAPIService,
25
+ createFacebookCAPIService: () => createFacebookCAPIService
26
+ });
27
+ module.exports = __toCommonJS(facebook_capi_exports);
28
+ var FacebookCAPIService = class {
29
+ constructor(config) {
30
+ this.baseUrl = "https://graph.facebook.com/v18.0";
31
+ this.config = config;
32
+ }
33
+ /**
34
+ * Send events to Facebook CAPI
35
+ */
36
+ async sendEvents(events, userInfo) {
37
+ if (!this.config.accessToken || !this.config.pixelId) {
38
+ console.warn("Facebook CAPI: Missing access token or pixel ID");
39
+ return;
40
+ }
41
+ const supportedEvents = events.filter(
42
+ (event) => this.isSupportedEvent(event.type)
43
+ );
44
+ if (supportedEvents.length === 0) {
45
+ console.log("Facebook CAPI: No supported events to send");
46
+ return;
47
+ }
48
+ const capiEvents = supportedEvents.map(
49
+ (event) => this.convertToFacebookEvent(event, userInfo)
50
+ );
51
+ const payload = {
52
+ data: capiEvents,
53
+ test_event_code: this.config.testEventCode
54
+ };
55
+ try {
56
+ const response = await fetch(
57
+ `${this.baseUrl}/${this.config.pixelId}/events?access_token=${this.config.accessToken}`,
58
+ {
59
+ method: "POST",
60
+ headers: {
61
+ "Content-Type": "application/json"
62
+ },
63
+ body: JSON.stringify(payload)
64
+ }
65
+ );
66
+ if (!response.ok) {
67
+ const errorData = await response.json();
68
+ console.error("Facebook CAPI Error:", errorData);
69
+ throw new Error(`Facebook CAPI request failed: ${response.status}`);
70
+ }
71
+ const result = await response.json();
72
+ console.log("Facebook CAPI: Events sent successfully", {
73
+ events_received: result.events_received,
74
+ messages: result.messages
75
+ });
76
+ } catch (error) {
77
+ console.error("Facebook CAPI: Failed to send events", error);
78
+ throw error;
79
+ }
80
+ }
81
+ /**
82
+ * Check if event type is supported (matches PixelAdapter implementation)
83
+ */
84
+ isSupportedEvent(eventType) {
85
+ return [
86
+ "page_view" /* PAGE_VIEW */,
87
+ "product_view" /* PRODUCT_VIEW */,
88
+ "add_to_cart" /* ADD_TO_CART */,
89
+ "search" /* SEARCH */
90
+ ].includes(eventType);
91
+ }
92
+ /**
93
+ * Convert internal event to Facebook CAPI event format
94
+ * Only handles events implemented in PixelAdapter
95
+ */
96
+ convertToFacebookEvent(event, userInfo) {
97
+ const baseEvent = {
98
+ event_name: this.mapEventName(event.type),
99
+ event_time: Math.floor((event.timestamp || Date.now()) / 1e3),
100
+ event_id: event.eventId,
101
+ action_source: "website",
102
+ user_data: userInfo ? {
103
+ client_ip_address: userInfo.clientIpAddress,
104
+ client_user_agent: userInfo.clientUserAgent,
105
+ fbc: userInfo.fbc,
106
+ fbp: userInfo.fbp
107
+ } : void 0
108
+ };
109
+ switch (event.type) {
110
+ case "page_view" /* PAGE_VIEW */:
111
+ baseEvent.custom_data = {};
112
+ break;
113
+ case "product_view" /* PRODUCT_VIEW */:
114
+ const productEvent = event;
115
+ baseEvent.custom_data = {
116
+ content_type: "product_group",
117
+ content_ids: [productEvent.productId],
118
+ content_name: productEvent.productName,
119
+ content_category: productEvent.event_category,
120
+ value: productEvent.price,
121
+ currency: productEvent.currency || "INR"
122
+ };
123
+ break;
124
+ case "add_to_cart" /* ADD_TO_CART */:
125
+ const cartEvent = event;
126
+ baseEvent.custom_data = {
127
+ content_type: "product_group",
128
+ content_ids: [cartEvent.productId],
129
+ content_name: cartEvent.productName,
130
+ value: cartEvent.price,
131
+ currency: cartEvent.currency || "INR"
132
+ };
133
+ break;
134
+ case "search" /* SEARCH */:
135
+ const searchEvent = event;
136
+ baseEvent.custom_data = {
137
+ search_string: searchEvent.searchTerm,
138
+ content_category: "product",
139
+ content_ids: searchEvent.content_ids || []
140
+ };
141
+ break;
142
+ default:
143
+ baseEvent.custom_data = {};
144
+ break;
145
+ }
146
+ return baseEvent;
147
+ }
148
+ /**
149
+ * Map internal event types to Facebook event names (matching PixelAdapter)
150
+ */
151
+ mapEventName(eventType) {
152
+ const eventMap = {
153
+ ["page_view" /* PAGE_VIEW */]: "PageView",
154
+ ["product_view" /* PRODUCT_VIEW */]: "ViewContent",
155
+ ["add_to_cart" /* ADD_TO_CART */]: "AddToCart",
156
+ ["search" /* SEARCH */]: "Search"
157
+ };
158
+ return eventMap[eventType] || "CustomEvent";
159
+ }
160
+ };
161
+ function createFacebookCAPIService(config) {
162
+ const accessToken = config?.accessToken || process.env.FACEBOOK_CAPI_ACCESS_TOKEN;
163
+ const pixelId = config?.pixelId || process.env.NEXT_PUBLIC_PIXEL_ID;
164
+ const testEventCode = config?.testEventCode || process.env.FACEBOOK_TEST_EVENT_CODE;
165
+ if (!accessToken || !pixelId) {
166
+ console.warn("Facebook CAPI: Missing access token or pixel ID");
167
+ return null;
168
+ }
169
+ return new FacebookCAPIService({
170
+ accessToken,
171
+ pixelId,
172
+ testEventCode
173
+ });
174
+ }
175
+ // Annotate the CommonJS export names for ESM import in node:
176
+ 0 && (module.exports = {
177
+ FacebookCAPIService,
178
+ createFacebookCAPIService
179
+ });
180
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/facebook-capi.ts"],"sourcesContent":["import {\n TEvent,\n EventType,\n type IAddToCartEvent,\n type IProductViewEvent,\n type ISearchEvent,\n} from \"../types\";\n\n/**\n * Facebook CAPI Configuration\n */\nexport interface FacebookCAPIConfig {\n accessToken: string;\n pixelId: string;\n testEventCode?: string;\n}\n\n/**\n * Facebook CAPI Event Data Structure\n */\ninterface FacebookCAPIEvent {\n event_name: string;\n event_time: number;\n event_id?: string;\n user_data?: {\n client_ip_address?: string;\n client_user_agent?: string;\n fbc?: string;\n fbp?: string;\n };\n custom_data?: {\n currency?: string;\n value?: number;\n content_ids?: string[];\n content_type?: string;\n content_name?: string;\n content_category?: string;\n search_string?: string;\n [key: string]: any;\n };\n action_source: string;\n}\n\n/**\n * Facebook CAPI Service for server-side event tracking\n * Only handles events that are implemented in PixelAdapter\n */\nexport class FacebookCAPIService {\n private config: FacebookCAPIConfig;\n private baseUrl = \"https://graph.facebook.com/v18.0\";\n\n constructor(config: FacebookCAPIConfig) {\n this.config = config;\n }\n\n /**\n * Send events to Facebook CAPI\n */\n public async sendEvents(\n events: TEvent[],\n userInfo?: {\n clientIpAddress?: string;\n clientUserAgent?: string;\n fbc?: string;\n fbp?: string;\n }\n ): Promise<void> {\n if (!this.config.accessToken || !this.config.pixelId) {\n console.warn(\"Facebook CAPI: Missing access token or pixel ID\");\n return;\n }\n\n // Filter events to only supported ones\n const supportedEvents = events.filter((event) =>\n this.isSupportedEvent(event.type)\n );\n\n if (supportedEvents.length === 0) {\n console.log(\"Facebook CAPI: No supported events to send\");\n return;\n }\n\n const capiEvents = supportedEvents.map((event) =>\n this.convertToFacebookEvent(event, userInfo)\n );\n\n const payload = {\n data: capiEvents,\n test_event_code: this.config.testEventCode,\n };\n\n try {\n const response = await fetch(\n `${this.baseUrl}/${this.config.pixelId}/events?access_token=${this.config.accessToken}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(payload),\n }\n );\n\n if (!response.ok) {\n const errorData = await response.json();\n console.error(\"Facebook CAPI Error:\", errorData);\n throw new Error(`Facebook CAPI request failed: ${response.status}`);\n }\n\n const result = await response.json();\n console.log(\"Facebook CAPI: Events sent successfully\", {\n events_received: result.events_received,\n messages: result.messages,\n });\n } catch (error) {\n console.error(\"Facebook CAPI: Failed to send events\", error);\n throw error;\n }\n }\n\n /**\n * Check if event type is supported (matches PixelAdapter implementation)\n */\n private isSupportedEvent(eventType: EventType): boolean {\n return [\n EventType.PAGE_VIEW,\n EventType.PRODUCT_VIEW,\n EventType.ADD_TO_CART,\n EventType.SEARCH,\n ].includes(eventType);\n }\n\n /**\n * Convert internal event to Facebook CAPI event format\n * Only handles events implemented in PixelAdapter\n */\n private convertToFacebookEvent(\n event: TEvent,\n userInfo?: {\n clientIpAddress?: string;\n clientUserAgent?: string;\n fbc?: string;\n fbp?: string;\n }\n ): FacebookCAPIEvent {\n const baseEvent: FacebookCAPIEvent = {\n event_name: this.mapEventName(event.type),\n event_time: Math.floor((event.timestamp || Date.now()) / 1000),\n event_id: event.eventId,\n action_source: \"website\",\n user_data: userInfo\n ? {\n client_ip_address: userInfo.clientIpAddress,\n client_user_agent: userInfo.clientUserAgent,\n fbc: userInfo.fbc,\n fbp: userInfo.fbp,\n }\n : undefined,\n };\n\n // Add custom data based on event type (matching PixelAdapter logic)\n switch (event.type) {\n case EventType.PAGE_VIEW:\n baseEvent.custom_data = {};\n break;\n\n case EventType.PRODUCT_VIEW:\n const productEvent = event as IProductViewEvent;\n baseEvent.custom_data = {\n content_type: \"product_group\",\n content_ids: [productEvent.productId],\n content_name: productEvent.productName,\n content_category: productEvent.event_category,\n value: productEvent.price,\n currency: productEvent.currency || \"INR\",\n };\n break;\n\n case EventType.ADD_TO_CART:\n const cartEvent = event as IAddToCartEvent;\n baseEvent.custom_data = {\n content_type: \"product_group\",\n content_ids: [cartEvent.productId],\n content_name: cartEvent.productName,\n value: cartEvent.price,\n currency: cartEvent.currency || \"INR\",\n };\n break;\n\n case EventType.SEARCH:\n const searchEvent = event as ISearchEvent;\n baseEvent.custom_data = {\n search_string: searchEvent.searchTerm,\n content_category: \"product\",\n content_ids: searchEvent.content_ids || [],\n };\n break;\n\n default:\n baseEvent.custom_data = {};\n break;\n }\n\n return baseEvent;\n }\n\n /**\n * Map internal event types to Facebook event names (matching PixelAdapter)\n */\n private mapEventName(eventType: EventType): string {\n const eventMap: Record<EventType, string> = {\n [EventType.PAGE_VIEW]: \"PageView\",\n [EventType.PRODUCT_VIEW]: \"ViewContent\",\n [EventType.ADD_TO_CART]: \"AddToCart\",\n [EventType.SEARCH]: \"Search\",\n } as Record<EventType, string>;\n\n return eventMap[eventType] || \"CustomEvent\";\n }\n}\n\n/**\n * Create Facebook CAPI service instance\n */\nexport function createFacebookCAPIService(config?: {\n accessToken: string;\n pixelId: string;\n testEventCode?: string;\n}): FacebookCAPIService | null {\n const accessToken =\n config?.accessToken || process.env.FACEBOOK_CAPI_ACCESS_TOKEN;\n const pixelId = config?.pixelId || process.env.NEXT_PUBLIC_PIXEL_ID;\n const testEventCode =\n config?.testEventCode || process.env.FACEBOOK_TEST_EVENT_CODE;\n\n if (!accessToken || !pixelId) {\n console.warn(\"Facebook CAPI: Missing access token or pixel ID\");\n return null;\n }\n\n return new FacebookCAPIService({\n accessToken,\n pixelId,\n testEventCode,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+CO,IAAM,sBAAN,MAA0B;AAAA,EAI/B,YAAY,QAA4B;AAFxC,SAAQ,UAAU;AAGhB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WACX,QACA,UAMe;AACf,QAAI,CAAC,KAAK,OAAO,eAAe,CAAC,KAAK,OAAO,SAAS;AACpD,cAAQ,KAAK,iDAAiD;AAC9D;AAAA,IACF;AAGA,UAAM,kBAAkB,OAAO;AAAA,MAAO,CAAC,UACrC,KAAK,iBAAiB,MAAM,IAAI;AAAA,IAClC;AAEA,QAAI,gBAAgB,WAAW,GAAG;AAChC,cAAQ,IAAI,4CAA4C;AACxD;AAAA,IACF;AAEA,UAAM,aAAa,gBAAgB;AAAA,MAAI,CAAC,UACtC,KAAK,uBAAuB,OAAO,QAAQ;AAAA,IAC7C;AAEA,UAAM,UAAU;AAAA,MACd,MAAM;AAAA,MACN,iBAAiB,KAAK,OAAO;AAAA,IAC/B;AAEA,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,OAAO,IAAI,KAAK,OAAO,OAAO,wBAAwB,KAAK,OAAO,WAAW;AAAA,QACrF;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,QAC9B;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,gBAAQ,MAAM,wBAAwB,SAAS;AAC/C,cAAM,IAAI,MAAM,iCAAiC,SAAS,MAAM,EAAE;AAAA,MACpE;AAEA,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,cAAQ,IAAI,2CAA2C;AAAA,QACrD,iBAAiB,OAAO;AAAA,QACxB,UAAU,OAAO;AAAA,MACnB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,WAA+B;AACtD,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKP,EAAE,SAAS,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBACN,OACA,UAMmB;AACnB,UAAM,YAA+B;AAAA,MACnC,YAAY,KAAK,aAAa,MAAM,IAAI;AAAA,MACxC,YAAY,KAAK,OAAO,MAAM,aAAa,KAAK,IAAI,KAAK,GAAI;AAAA,MAC7D,UAAU,MAAM;AAAA,MAChB,eAAe;AAAA,MACf,WAAW,WACP;AAAA,QACE,mBAAmB,SAAS;AAAA,QAC5B,mBAAmB,SAAS;AAAA,QAC5B,KAAK,SAAS;AAAA,QACd,KAAK,SAAS;AAAA,MAChB,IACA;AAAA,IACN;AAGA,YAAQ,MAAM,MAAM;AAAA,MAClB;AACE,kBAAU,cAAc,CAAC;AACzB;AAAA,MAEF;AACE,cAAM,eAAe;AACrB,kBAAU,cAAc;AAAA,UACtB,cAAc;AAAA,UACd,aAAa,CAAC,aAAa,SAAS;AAAA,UACpC,cAAc,aAAa;AAAA,UAC3B,kBAAkB,aAAa;AAAA,UAC/B,OAAO,aAAa;AAAA,UACpB,UAAU,aAAa,YAAY;AAAA,QACrC;AACA;AAAA,MAEF;AACE,cAAM,YAAY;AAClB,kBAAU,cAAc;AAAA,UACtB,cAAc;AAAA,UACd,aAAa,CAAC,UAAU,SAAS;AAAA,UACjC,cAAc,UAAU;AAAA,UACxB,OAAO,UAAU;AAAA,UACjB,UAAU,UAAU,YAAY;AAAA,QAClC;AACA;AAAA,MAEF;AACE,cAAM,cAAc;AACpB,kBAAU,cAAc;AAAA,UACtB,eAAe,YAAY;AAAA,UAC3B,kBAAkB;AAAA,UAClB,aAAa,YAAY,eAAe,CAAC;AAAA,QAC3C;AACA;AAAA,MAEF;AACE,kBAAU,cAAc,CAAC;AACzB;AAAA,IACJ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,WAA8B;AACjD,UAAM,WAAsC;AAAA,MAC1C,4BAAoB,GAAG;AAAA,MACvB,kCAAuB,GAAG;AAAA,MAC1B,gCAAsB,GAAG;AAAA,MACzB,sBAAiB,GAAG;AAAA,IACtB;AAEA,WAAO,SAAS,SAAS,KAAK;AAAA,EAChC;AACF;AAKO,SAAS,0BAA0B,QAIX;AAC7B,QAAM,cACJ,QAAQ,eAAe,QAAQ,IAAI;AACrC,QAAM,UAAU,QAAQ,WAAW,QAAQ,IAAI;AAC/C,QAAM,gBACJ,QAAQ,iBAAiB,QAAQ,IAAI;AAEvC,MAAI,CAAC,eAAe,CAAC,SAAS;AAC5B,YAAQ,KAAK,iDAAiD;AAC9D,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,oBAAoB;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import {
3
+ FacebookCAPIService,
4
+ createFacebookCAPIService
5
+ } from "../chunk-NC25KOAF.mjs";
6
+ import "../chunk-3NR2AKE4.mjs";
7
+ export {
8
+ FacebookCAPIService,
9
+ createFacebookCAPIService
10
+ };
11
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ interface ExperimentData {
2
+ _prima_pr_ab_home?: string | null;
3
+ _prima_pr_ab_collection?: string | null;
4
+ _prima_pr_ab_product?: string | null;
5
+ }
6
+
7
+ export type { ExperimentData as E };
@@ -0,0 +1,7 @@
1
+ interface ExperimentData {
2
+ _prima_pr_ab_home?: string | null;
3
+ _prima_pr_ab_collection?: string | null;
4
+ _prima_pr_ab_product?: string | null;
5
+ }
6
+
7
+ export type { ExperimentData as E };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Generate a unique event ID for deduplication
3
+ * Format: timestamp_randomString_eventType
4
+ */
5
+ declare function generateEventId(eventType: string): string;
6
+ /**
7
+ * Extract browser information for CAPI user data
8
+ */
9
+ declare function getBrowserInfo(): {
10
+ clientUserAgent?: string;
11
+ fbc?: string;
12
+ fbp?: string;
13
+ };
14
+ /**
15
+ * Get client IP address (this will be handled server-side)
16
+ */
17
+ declare function getClientIpAddress(request?: Request): string | undefined;
18
+
19
+ export { generateEventId, getBrowserInfo, getClientIpAddress };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Generate a unique event ID for deduplication
3
+ * Format: timestamp_randomString_eventType
4
+ */
5
+ declare function generateEventId(eventType: string): string;
6
+ /**
7
+ * Extract browser information for CAPI user data
8
+ */
9
+ declare function getBrowserInfo(): {
10
+ clientUserAgent?: string;
11
+ fbc?: string;
12
+ fbp?: string;
13
+ };
14
+ /**
15
+ * Get client IP address (this will be handled server-side)
16
+ */
17
+ declare function getClientIpAddress(request?: Request): string | undefined;
18
+
19
+ export { generateEventId, getBrowserInfo, getClientIpAddress };
@@ -0,0 +1,93 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/utils/event-id.ts
22
+ var event_id_exports = {};
23
+ __export(event_id_exports, {
24
+ generateEventId: () => generateEventId,
25
+ getBrowserInfo: () => getBrowserInfo,
26
+ getClientIpAddress: () => getClientIpAddress
27
+ });
28
+ module.exports = __toCommonJS(event_id_exports);
29
+ function generateEventId(eventType) {
30
+ const timestamp = Date.now();
31
+ const randomString = Math.random().toString(36).substring(2, 8);
32
+ return `${timestamp}_${randomString}_${eventType}`;
33
+ }
34
+ function getBrowserInfo() {
35
+ if (typeof window === "undefined") {
36
+ return {};
37
+ }
38
+ const userAgent = navigator.userAgent;
39
+ const fbc = getFacebookClickId();
40
+ const fbp = getFacebookBrowserId();
41
+ return {
42
+ clientUserAgent: userAgent,
43
+ fbc,
44
+ fbp
45
+ };
46
+ }
47
+ function getFacebookClickId() {
48
+ if (typeof window === "undefined") {
49
+ return void 0;
50
+ }
51
+ const urlParams = new URLSearchParams(window.location.search);
52
+ const fbclid = urlParams.get("fbclid");
53
+ if (fbclid) {
54
+ return `fb.1.${Date.now()}.${fbclid}`;
55
+ }
56
+ const cookies = document.cookie.split(";");
57
+ for (const cookie of cookies) {
58
+ const [name, value] = cookie.trim().split("=");
59
+ if (name === "_fbc") {
60
+ return value;
61
+ }
62
+ }
63
+ return void 0;
64
+ }
65
+ function getFacebookBrowserId() {
66
+ if (typeof window === "undefined") {
67
+ return void 0;
68
+ }
69
+ const cookies = document.cookie.split(";");
70
+ for (const cookie of cookies) {
71
+ const [name, value] = cookie.trim().split("=");
72
+ if (name === "_fbp") {
73
+ return value;
74
+ }
75
+ }
76
+ return void 0;
77
+ }
78
+ function getClientIpAddress(request) {
79
+ if (!request) {
80
+ return void 0;
81
+ }
82
+ const forwarded = request.headers.get("x-forwarded-for");
83
+ const realIp = request.headers.get("x-real-ip");
84
+ const cfConnectingIp = request.headers.get("cf-connecting-ip");
85
+ return forwarded?.split(",")[0] || realIp || cfConnectingIp || void 0;
86
+ }
87
+ // Annotate the CommonJS export names for ESM import in node:
88
+ 0 && (module.exports = {
89
+ generateEventId,
90
+ getBrowserInfo,
91
+ getClientIpAddress
92
+ });
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/event-id.ts"],"sourcesContent":["/**\n * Generate a unique event ID for deduplication\n * Format: timestamp_randomString_eventType\n */\nexport function generateEventId(eventType: string): string {\n const timestamp = Date.now();\n const randomString = Math.random().toString(36).substring(2, 8);\n return `${timestamp}_${randomString}_${eventType}`;\n}\n\n/**\n * Extract browser information for CAPI user data\n */\nexport function getBrowserInfo(): {\n clientUserAgent?: string;\n fbc?: string;\n fbp?: string;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const userAgent = navigator.userAgent;\n\n // Get Facebook click ID from URL or cookies\n const fbc = getFacebookClickId();\n const fbp = getFacebookBrowserId();\n\n return {\n clientUserAgent: userAgent,\n fbc,\n fbp,\n };\n}\n\n/**\n * Get Facebook click ID (fbc) from URL parameters or cookies\n */\nfunction getFacebookClickId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n // Check URL parameters first\n const urlParams = new URLSearchParams(window.location.search);\n const fbclid = urlParams.get(\"fbclid\");\n\n if (fbclid) {\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n\n // Check cookies\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbc\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get Facebook browser ID (fbp) from cookies\n */\nfunction getFacebookBrowserId(): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const cookies = document.cookie.split(\";\");\n for (const cookie of cookies) {\n const [name, value] = cookie.trim().split(\"=\");\n if (name === \"_fbp\") {\n return value;\n }\n }\n\n return undefined;\n}\n\n/**\n * Get client IP address (this will be handled server-side)\n */\nexport function getClientIpAddress(request?: Request): string | undefined {\n if (!request) {\n return undefined;\n }\n\n // Try different headers for IP address\n const forwarded = request.headers.get(\"x-forwarded-for\");\n const realIp = request.headers.get(\"x-real-ip\");\n const cfConnectingIp = request.headers.get(\"cf-connecting-ip\");\n\n return forwarded?.split(\",\")[0] || realIp || cfConnectingIp || undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,SAAS,gBAAgB,WAA2B;AACzD,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,eAAe,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAC9D,SAAO,GAAG,SAAS,IAAI,YAAY,IAAI,SAAS;AAClD;AAKO,SAAS,iBAId;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,UAAU;AAG5B,QAAM,MAAM,mBAAmB;AAC/B,QAAM,MAAM,qBAAqB;AAEjC,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,qBAAyC;AAChD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAC5D,QAAM,SAAS,UAAU,IAAI,QAAQ;AAErC,MAAI,QAAQ;AACV,WAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,MAAM;AAAA,EACrC;AAGA,QAAM,UAAU,SAAS,OAAO,MAAM,GAAG;AACzC,aAAW,UAAU,SAAS;AAC5B,UAAM,CAAC,MAAM,KAAK,IAAI,OAAO,KAAK,EAAE,MAAM,GAAG;AAC7C,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,uBAA2C;AAClD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,SAAS,OAAO,MAAM,GAAG;AACzC,aAAW,UAAU,SAAS;AAC5B,UAAM,CAAC,MAAM,KAAK,IAAI,OAAO,KAAK,EAAE,MAAM,GAAG;AAC7C,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,SAAuC;AACxE,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,QAAQ,QAAQ,IAAI,iBAAiB;AACvD,QAAM,SAAS,QAAQ,QAAQ,IAAI,WAAW;AAC9C,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,kBAAkB;AAE7D,SAAO,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,UAAU,kBAAkB;AACjE;","names":[]}
@@ -0,0 +1,12 @@
1
+ "use client";
2
+ import {
3
+ generateEventId,
4
+ getBrowserInfo,
5
+ getClientIpAddress
6
+ } from "../chunk-4RDPDMGW.mjs";
7
+ export {
8
+ generateEventId,
9
+ getBrowserInfo,
10
+ getClientIpAddress
11
+ };
12
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}