shopkit-analytics 1.0.7 → 1.0.8
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/{chunk-GWDONFBA.mjs → chunk-KHCQXBXT.mjs} +11 -2
- package/dist/chunk-KHCQXBXT.mjs.map +1 -0
- package/dist/index.d.mts +2 -7
- package/dist/index.d.ts +2 -7
- package/dist/index.mjs +3 -10
- package/dist/index.mjs.map +1 -1
- package/dist/services/index.d.mts +6 -1
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.js +18 -6
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +5 -3
- package/package.json +1 -1
- package/dist/chunk-GWDONFBA.mjs.map +0 -1
|
@@ -135,7 +135,16 @@ var FacebookCAPIService = class {
|
|
|
135
135
|
}
|
|
136
136
|
};
|
|
137
137
|
|
|
138
|
+
// src/services/facebook-capi-factory.ts
|
|
139
|
+
function createFacebookCAPIService(config) {
|
|
140
|
+
if (!config.accessToken || !config.pixelId) {
|
|
141
|
+
throw new Error("Facebook CAPI: accessToken and pixelId are required");
|
|
142
|
+
}
|
|
143
|
+
return new FacebookCAPIService(config);
|
|
144
|
+
}
|
|
145
|
+
|
|
138
146
|
export {
|
|
139
|
-
FacebookCAPIService
|
|
147
|
+
FacebookCAPIService,
|
|
148
|
+
createFacebookCAPIService
|
|
140
149
|
};
|
|
141
|
-
//# sourceMappingURL=chunk-
|
|
150
|
+
//# sourceMappingURL=chunk-KHCQXBXT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/facebook-capi.ts","../src/services/facebook-capi-factory.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","import { FacebookCAPIService, FacebookCAPIConfig } from \"./facebook-capi\";\n\n/**\n * Create Facebook CAPI service instance\n */\nexport function createFacebookCAPIService(\n config: FacebookCAPIConfig\n): FacebookCAPIService {\n if (!config.accessToken || !config.pixelId) {\n throw new Error(\"Facebook CAPI: accessToken and pixelId are required\");\n }\n\n return new FacebookCAPIService(config);\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.mts
CHANGED
|
@@ -10,7 +10,7 @@ export { DEFAULT_CURRENCY, EventNames, eventPublisher, initTracking, initializeE
|
|
|
10
10
|
export { E as ExperimentData, P as PRIMA_EXPERIMENT_COOKIES, a as PRIMA_EXPERIMENT_COOKIE_NAMES } from './types-BBZbvq9-.mjs';
|
|
11
11
|
export { getExperimentParams, hasExperimentData } from './experiment/index.mjs';
|
|
12
12
|
export { generateEventId, getBrowserInfo } from './utils/index.mjs';
|
|
13
|
-
|
|
13
|
+
export { FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService } from './services/index.mjs';
|
|
14
14
|
import '@shopify/hydrogen-react';
|
|
15
15
|
|
|
16
16
|
interface ShopkitAnalyticsConfig {
|
|
@@ -39,9 +39,4 @@ interface ShopkitAnalyticsProps {
|
|
|
39
39
|
}
|
|
40
40
|
declare const ShopkitAnalytics: React.FC<ShopkitAnalyticsProps>;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
* Create Facebook CAPI service instance
|
|
44
|
-
*/
|
|
45
|
-
declare function createFacebookCAPIService(config: FacebookCAPIConfig): FacebookCAPIService;
|
|
46
|
-
|
|
47
|
-
export { AffiliateConfig, FacebookCAPIConfig, FacebookCAPIService, GoogleAdapterConfig, KwikCheckoutConfig, KwikPassConfig, LoggerConfig, MoengageAdapterConfig, PixelAdapterConfig, PostHogAdapterConfig, ShopifyAdapterConfig, ShopkitAnalytics, type ShopkitAnalyticsConfig, type ShopkitAnalyticsProps, TrackingAdapter, createFacebookCAPIService, ShopkitAnalytics as default };
|
|
42
|
+
export { AffiliateConfig, GoogleAdapterConfig, KwikCheckoutConfig, KwikPassConfig, LoggerConfig, MoengageAdapterConfig, PixelAdapterConfig, PostHogAdapterConfig, ShopifyAdapterConfig, ShopkitAnalytics, type ShopkitAnalyticsConfig, type ShopkitAnalyticsProps, TrackingAdapter, ShopkitAnalytics as default };
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { DEFAULT_CURRENCY, EventNames, eventPublisher, initTracking, initializeE
|
|
|
10
10
|
export { E as ExperimentData, P as PRIMA_EXPERIMENT_COOKIES, a as PRIMA_EXPERIMENT_COOKIE_NAMES } from './types-BBZbvq9-.js';
|
|
11
11
|
export { getExperimentParams, hasExperimentData } from './experiment/index.js';
|
|
12
12
|
export { generateEventId, getBrowserInfo } from './utils/index.js';
|
|
13
|
-
|
|
13
|
+
export { FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService } from './services/index.js';
|
|
14
14
|
import '@shopify/hydrogen-react';
|
|
15
15
|
|
|
16
16
|
interface ShopkitAnalyticsConfig {
|
|
@@ -39,9 +39,4 @@ interface ShopkitAnalyticsProps {
|
|
|
39
39
|
}
|
|
40
40
|
declare const ShopkitAnalytics: React.FC<ShopkitAnalyticsProps>;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
* Create Facebook CAPI service instance
|
|
44
|
-
*/
|
|
45
|
-
declare function createFacebookCAPIService(config: FacebookCAPIConfig): FacebookCAPIService;
|
|
46
|
-
|
|
47
|
-
export { AffiliateConfig, FacebookCAPIConfig, FacebookCAPIService, GoogleAdapterConfig, KwikCheckoutConfig, KwikPassConfig, LoggerConfig, MoengageAdapterConfig, PixelAdapterConfig, PostHogAdapterConfig, ShopifyAdapterConfig, ShopkitAnalytics, type ShopkitAnalyticsConfig, type ShopkitAnalyticsProps, TrackingAdapter, createFacebookCAPIService, ShopkitAnalytics as default };
|
|
42
|
+
export { AffiliateConfig, GoogleAdapterConfig, KwikCheckoutConfig, KwikPassConfig, LoggerConfig, MoengageAdapterConfig, PixelAdapterConfig, PostHogAdapterConfig, ShopifyAdapterConfig, ShopkitAnalytics, type ShopkitAnalyticsConfig, type ShopkitAnalyticsProps, TrackingAdapter, ShopkitAnalytics as default };
|
package/dist/index.mjs
CHANGED
|
@@ -41,8 +41,9 @@ import {
|
|
|
41
41
|
hasExperimentData
|
|
42
42
|
} from "./chunk-C6F4QLQO.mjs";
|
|
43
43
|
import {
|
|
44
|
-
FacebookCAPIService
|
|
45
|
-
|
|
44
|
+
FacebookCAPIService,
|
|
45
|
+
createFacebookCAPIService
|
|
46
|
+
} from "./chunk-KHCQXBXT.mjs";
|
|
46
47
|
import {
|
|
47
48
|
generateEventId,
|
|
48
49
|
getBrowserInfo
|
|
@@ -166,14 +167,6 @@ var ShopkitAnalytics = ({
|
|
|
166
167
|
] });
|
|
167
168
|
};
|
|
168
169
|
var ShopkitAnalytics_default = ShopkitAnalytics;
|
|
169
|
-
|
|
170
|
-
// src/services/facebook-capi-factory.ts
|
|
171
|
-
function createFacebookCAPIService(config) {
|
|
172
|
-
if (!config.accessToken || !config.pixelId) {
|
|
173
|
-
throw new Error("Facebook CAPI: accessToken and pixelId are required");
|
|
174
|
-
}
|
|
175
|
-
return new FacebookCAPIService(config);
|
|
176
|
-
}
|
|
177
170
|
export {
|
|
178
171
|
AffiliateTracker_default as AffiliateTracker,
|
|
179
172
|
BaseAdapter,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ShopkitAnalytics.tsx"
|
|
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"]}
|
|
@@ -40,4 +40,9 @@ declare class FacebookCAPIService {
|
|
|
40
40
|
private mapEventName;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Create Facebook CAPI service instance
|
|
45
|
+
*/
|
|
46
|
+
declare function createFacebookCAPIService(config: FacebookCAPIConfig): FacebookCAPIService;
|
|
47
|
+
|
|
48
|
+
export { type FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService };
|
package/dist/services/index.d.ts
CHANGED
|
@@ -40,4 +40,9 @@ declare class FacebookCAPIService {
|
|
|
40
40
|
private mapEventName;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
/**
|
|
44
|
+
* Create Facebook CAPI service instance
|
|
45
|
+
*/
|
|
46
|
+
declare function createFacebookCAPIService(config: FacebookCAPIConfig): FacebookCAPIService;
|
|
47
|
+
|
|
48
|
+
export { type FacebookCAPIConfig, FacebookCAPIService, createFacebookCAPIService };
|
package/dist/services/index.js
CHANGED
|
@@ -18,12 +18,15 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
};
|
|
19
19
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
20
|
|
|
21
|
-
// src/services/
|
|
22
|
-
var
|
|
23
|
-
__export(
|
|
24
|
-
FacebookCAPIService: () => FacebookCAPIService
|
|
21
|
+
// src/services/index.ts
|
|
22
|
+
var services_exports = {};
|
|
23
|
+
__export(services_exports, {
|
|
24
|
+
FacebookCAPIService: () => FacebookCAPIService,
|
|
25
|
+
createFacebookCAPIService: () => createFacebookCAPIService
|
|
25
26
|
});
|
|
26
|
-
module.exports = __toCommonJS(
|
|
27
|
+
module.exports = __toCommonJS(services_exports);
|
|
28
|
+
|
|
29
|
+
// src/services/facebook-capi.ts
|
|
27
30
|
var FacebookCAPIService = class {
|
|
28
31
|
constructor(config) {
|
|
29
32
|
this.baseUrl = "https://graph.facebook.com/v18.0";
|
|
@@ -157,8 +160,17 @@ var FacebookCAPIService = class {
|
|
|
157
160
|
return eventMap[eventType] || "CustomEvent";
|
|
158
161
|
}
|
|
159
162
|
};
|
|
163
|
+
|
|
164
|
+
// src/services/facebook-capi-factory.ts
|
|
165
|
+
function createFacebookCAPIService(config) {
|
|
166
|
+
if (!config.accessToken || !config.pixelId) {
|
|
167
|
+
throw new Error("Facebook CAPI: accessToken and pixelId are required");
|
|
168
|
+
}
|
|
169
|
+
return new FacebookCAPIService(config);
|
|
170
|
+
}
|
|
160
171
|
// Annotate the CommonJS export names for ESM import in node:
|
|
161
172
|
0 && (module.exports = {
|
|
162
|
-
FacebookCAPIService
|
|
173
|
+
FacebookCAPIService,
|
|
174
|
+
createFacebookCAPIService
|
|
163
175
|
});
|
|
164
176
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../src/services/index.ts","../../src/services/facebook-capi.ts","../../src/services/facebook-capi-factory.ts"],"sourcesContent":["export { FacebookCAPIService } from \"./facebook-capi\";\nexport type { FacebookCAPIConfig } from \"./facebook-capi\";\nexport { createFacebookCAPIService } from \"./facebook-capi-factory\";\n","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","import { FacebookCAPIService, FacebookCAPIConfig } from \"./facebook-capi\";\n\n/**\n * Create Facebook CAPI service instance\n */\nexport function createFacebookCAPIService(\n config: FacebookCAPIConfig\n): FacebookCAPIService {\n if (!config.accessToken || !config.pixelId) {\n throw new Error(\"Facebook CAPI: accessToken and pixelId are required\");\n }\n\n return new FacebookCAPIService(config);\n}\n"],"mappings":"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","names":[]}
|
package/dist/services/index.mjs
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
-
FacebookCAPIService
|
|
4
|
-
|
|
3
|
+
FacebookCAPIService,
|
|
4
|
+
createFacebookCAPIService
|
|
5
|
+
} from "../chunk-KHCQXBXT.mjs";
|
|
5
6
|
import "../chunk-JB4K4EOM.mjs";
|
|
6
7
|
export {
|
|
7
|
-
FacebookCAPIService
|
|
8
|
+
FacebookCAPIService,
|
|
9
|
+
createFacebookCAPIService
|
|
8
10
|
};
|
|
9
11
|
//# sourceMappingURL=index.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shopkit-analytics",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "A comprehensive analytics package combining event tracking and affiliate tracking for e-commerce applications with multiple platform adapters",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
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"],"mappings":"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","names":[]}
|