@datalyr/web 1.0.0 → 1.0.2
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/LICENSE +1 -1
- package/README.md +55 -51
- package/dist/attribution.d.ts +1 -0
- package/dist/attribution.d.ts.map +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/datalyr.cjs.js +76 -21
- package/dist/datalyr.cjs.js.map +1 -1
- package/dist/datalyr.esm.js +76 -21
- package/dist/datalyr.esm.js.map +1 -1
- package/dist/datalyr.esm.min.js +1 -1
- package/dist/datalyr.esm.min.js.map +1 -1
- package/dist/datalyr.js +76 -21
- package/dist/datalyr.js.map +1 -1
- package/dist/datalyr.min.js +1 -1
- package/dist/datalyr.min.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/queue.d.ts +0 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -34,16 +34,13 @@ pnpm add @datalyr/web
|
|
|
34
34
|
## Quick Start
|
|
35
35
|
|
|
36
36
|
```javascript
|
|
37
|
-
import
|
|
37
|
+
import datalyr from '@datalyr/web';
|
|
38
38
|
|
|
39
|
-
// Initialize with your workspace ID
|
|
40
|
-
|
|
39
|
+
// Initialize the SDK with your workspace ID
|
|
40
|
+
datalyr.init({
|
|
41
41
|
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
// Initialize the SDK
|
|
45
|
-
await datalyr.init();
|
|
46
|
-
|
|
47
44
|
// Track an event
|
|
48
45
|
datalyr.track('Button Clicked', {
|
|
49
46
|
button_name: 'Sign Up',
|
|
@@ -63,7 +60,10 @@ datalyr.identify('user_123', {
|
|
|
63
60
|
### Initialization
|
|
64
61
|
|
|
65
62
|
```javascript
|
|
66
|
-
|
|
63
|
+
import datalyr from '@datalyr/web';
|
|
64
|
+
|
|
65
|
+
// Initialize the SDK with configuration
|
|
66
|
+
datalyr.init({
|
|
67
67
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
68
68
|
|
|
69
69
|
// Optional configuration
|
|
@@ -79,8 +79,6 @@ const datalyr = new Datalyr({
|
|
|
79
79
|
trackSPA: true, // Track SPA route changes
|
|
80
80
|
trackPageViews: true // Track initial page view
|
|
81
81
|
});
|
|
82
|
-
|
|
83
|
-
await datalyr.init();
|
|
84
82
|
```
|
|
85
83
|
|
|
86
84
|
### Track Events
|
|
@@ -243,7 +241,9 @@ datalyr.track('Signup');
|
|
|
243
241
|
// Includes: utm_source, utm_medium, first_touch_source, last_touch_source, etc.
|
|
244
242
|
|
|
245
243
|
// Track custom URL parameters
|
|
246
|
-
|
|
244
|
+
import datalyr from '@datalyr/web';
|
|
245
|
+
|
|
246
|
+
datalyr.init({
|
|
247
247
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
248
248
|
trackedParams: ['ref', 'affiliate_id', 'promo_code']
|
|
249
249
|
});
|
|
@@ -254,7 +254,9 @@ const datalyr = new Datalyr({
|
|
|
254
254
|
For single-page applications:
|
|
255
255
|
|
|
256
256
|
```javascript
|
|
257
|
-
|
|
257
|
+
import datalyr from '@datalyr/web';
|
|
258
|
+
|
|
259
|
+
datalyr.init({
|
|
258
260
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
259
261
|
trackSPA: true // Auto-track route changes (default: true)
|
|
260
262
|
});
|
|
@@ -270,14 +272,16 @@ datalyr.page('Product Details', {
|
|
|
270
272
|
Control data collection:
|
|
271
273
|
|
|
272
274
|
```javascript
|
|
275
|
+
import datalyr from '@datalyr/web';
|
|
276
|
+
|
|
273
277
|
// Standard mode (default) - balanced privacy
|
|
274
|
-
|
|
278
|
+
datalyr.init({
|
|
275
279
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
276
280
|
privacyMode: 'standard'
|
|
277
281
|
});
|
|
278
282
|
|
|
279
|
-
//
|
|
280
|
-
|
|
283
|
+
// Or strict mode - minimal data collection
|
|
284
|
+
datalyr.init({
|
|
281
285
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
282
286
|
privacyMode: 'strict'
|
|
283
287
|
});
|
|
@@ -300,14 +304,16 @@ await datalyr.flush();
|
|
|
300
304
|
Automatically track users across subdomains:
|
|
301
305
|
|
|
302
306
|
```javascript
|
|
307
|
+
import datalyr from '@datalyr/web';
|
|
308
|
+
|
|
303
309
|
// Auto-detect domain for *.example.com
|
|
304
|
-
|
|
310
|
+
datalyr.init({
|
|
305
311
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
306
312
|
cookieDomain: 'auto' // Default
|
|
307
313
|
});
|
|
308
314
|
|
|
309
315
|
// Or set explicitly
|
|
310
|
-
|
|
316
|
+
datalyr.init({
|
|
311
317
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
312
318
|
cookieDomain: '.example.com'
|
|
313
319
|
});
|
|
@@ -318,7 +324,9 @@ const datalyr = new Datalyr({
|
|
|
318
324
|
The SDK can automatically load and manage third-party tracking scripts with built-in security:
|
|
319
325
|
|
|
320
326
|
```javascript
|
|
321
|
-
|
|
327
|
+
import datalyr from '@datalyr/web';
|
|
328
|
+
|
|
329
|
+
datalyr.init({
|
|
322
330
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
323
331
|
enableContainer: true // Default: true
|
|
324
332
|
});
|
|
@@ -352,6 +360,8 @@ The container manager supports:
|
|
|
352
360
|
Extend SDK functionality:
|
|
353
361
|
|
|
354
362
|
```javascript
|
|
363
|
+
import datalyr from '@datalyr/web';
|
|
364
|
+
|
|
355
365
|
// Create a plugin
|
|
356
366
|
const myPlugin = {
|
|
357
367
|
name: 'my-plugin',
|
|
@@ -373,8 +383,8 @@ const myPlugin = {
|
|
|
373
383
|
}
|
|
374
384
|
};
|
|
375
385
|
|
|
376
|
-
// Register plugin
|
|
377
|
-
|
|
386
|
+
// Register plugin during initialization
|
|
387
|
+
datalyr.init({
|
|
378
388
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
379
389
|
plugins: [myPlugin]
|
|
380
390
|
});
|
|
@@ -385,9 +395,10 @@ const datalyr = new Datalyr({
|
|
|
385
395
|
Full TypeScript definitions are included:
|
|
386
396
|
|
|
387
397
|
```typescript
|
|
388
|
-
import {
|
|
398
|
+
import datalyr, { EventProperties, UserTraits } from '@datalyr/web';
|
|
389
399
|
|
|
390
|
-
|
|
400
|
+
// Initialize the SDK
|
|
401
|
+
datalyr.init({
|
|
391
402
|
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
392
403
|
});
|
|
393
404
|
|
|
@@ -416,15 +427,13 @@ datalyr.identify('user_123', traits);
|
|
|
416
427
|
|
|
417
428
|
```jsx
|
|
418
429
|
import { useEffect } from 'react';
|
|
419
|
-
import
|
|
420
|
-
|
|
421
|
-
const datalyr = new Datalyr({
|
|
422
|
-
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
423
|
-
});
|
|
430
|
+
import datalyr from '@datalyr/web';
|
|
424
431
|
|
|
425
432
|
function App() {
|
|
426
433
|
useEffect(() => {
|
|
427
|
-
datalyr.init(
|
|
434
|
+
datalyr.init({
|
|
435
|
+
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
436
|
+
});
|
|
428
437
|
}, []);
|
|
429
438
|
|
|
430
439
|
const handleClick = () => {
|
|
@@ -442,14 +451,12 @@ function App() {
|
|
|
442
451
|
```vue
|
|
443
452
|
<script setup>
|
|
444
453
|
import { onMounted } from 'vue';
|
|
445
|
-
import
|
|
446
|
-
|
|
447
|
-
const datalyr = new Datalyr({
|
|
448
|
-
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
449
|
-
});
|
|
454
|
+
import datalyr from '@datalyr/web';
|
|
450
455
|
|
|
451
456
|
onMounted(() => {
|
|
452
|
-
datalyr.init(
|
|
457
|
+
datalyr.init({
|
|
458
|
+
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
459
|
+
});
|
|
453
460
|
});
|
|
454
461
|
|
|
455
462
|
const trackClick = () => {
|
|
@@ -469,15 +476,13 @@ const trackClick = () => {
|
|
|
469
476
|
'use client';
|
|
470
477
|
|
|
471
478
|
import { useEffect } from 'react';
|
|
472
|
-
import
|
|
473
|
-
|
|
474
|
-
const datalyr = new Datalyr({
|
|
475
|
-
workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID
|
|
476
|
-
});
|
|
479
|
+
import datalyr from '@datalyr/web';
|
|
477
480
|
|
|
478
481
|
export function AnalyticsProvider({ children }) {
|
|
479
482
|
useEffect(() => {
|
|
480
|
-
datalyr.init(
|
|
483
|
+
datalyr.init({
|
|
484
|
+
workspaceId: process.env.NEXT_PUBLIC_DATALYR_WORKSPACE_ID
|
|
485
|
+
});
|
|
481
486
|
}, []);
|
|
482
487
|
|
|
483
488
|
return children;
|
|
@@ -506,16 +511,14 @@ Initialize the SDK as early as possible in your application lifecycle:
|
|
|
506
511
|
|
|
507
512
|
```javascript
|
|
508
513
|
// In your main entry file
|
|
509
|
-
import
|
|
514
|
+
import datalyr from '@datalyr/web';
|
|
510
515
|
|
|
511
|
-
|
|
516
|
+
// Initialize before other code
|
|
517
|
+
datalyr.init({
|
|
512
518
|
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
513
519
|
});
|
|
514
520
|
|
|
515
|
-
//
|
|
516
|
-
datalyr.init().then(() => {
|
|
517
|
-
// Start your app
|
|
518
|
-
});
|
|
521
|
+
// Your app code...
|
|
519
522
|
```
|
|
520
523
|
|
|
521
524
|
### 2. Use Consistent Event Naming
|
|
@@ -617,13 +620,12 @@ If you're currently using the Datalyr script tag, migration is straightforward:
|
|
|
617
620
|
|
|
618
621
|
### After (Web SDK):
|
|
619
622
|
```javascript
|
|
620
|
-
import
|
|
623
|
+
import datalyr from '@datalyr/web';
|
|
621
624
|
|
|
622
|
-
|
|
625
|
+
datalyr.init({
|
|
623
626
|
workspaceId: 'YOUR_WORKSPACE_ID'
|
|
624
627
|
});
|
|
625
628
|
|
|
626
|
-
await datalyr.init();
|
|
627
629
|
datalyr.track('Button Clicked');
|
|
628
630
|
```
|
|
629
631
|
|
|
@@ -660,7 +662,9 @@ The SDK is designed with privacy in mind:
|
|
|
660
662
|
Enable debug mode for detailed logging:
|
|
661
663
|
|
|
662
664
|
```javascript
|
|
663
|
-
|
|
665
|
+
import datalyr from '@datalyr/web';
|
|
666
|
+
|
|
667
|
+
datalyr.init({
|
|
664
668
|
workspaceId: 'YOUR_WORKSPACE_ID',
|
|
665
669
|
debug: true
|
|
666
670
|
});
|
|
@@ -672,7 +676,7 @@ const datalyr = new Datalyr({
|
|
|
672
676
|
|
|
673
677
|
## API Reference
|
|
674
678
|
|
|
675
|
-
###
|
|
679
|
+
### Initialization Options
|
|
676
680
|
|
|
677
681
|
| Option | Type | Default | Description |
|
|
678
682
|
|--------|------|---------|-------------|
|
|
@@ -694,7 +698,7 @@ const datalyr = new Datalyr({
|
|
|
694
698
|
|
|
695
699
|
| Method | Description |
|
|
696
700
|
|--------|-------------|
|
|
697
|
-
| `init()` | Initialize the SDK |
|
|
701
|
+
| `init(config)` | Initialize the SDK with configuration |
|
|
698
702
|
| `track(event, properties?)` | Track an event |
|
|
699
703
|
| `identify(userId?, traits?)` | Identify a user |
|
|
700
704
|
| `page(name?, properties?)` | Track a page view |
|
package/dist/attribution.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../src/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,UAAU,CAA2E;
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../src/attribution.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,UAAU,CAA2E;IAE7F,OAAO,CAAC,SAAS,CAgBf;IAEF,OAAO,CAAC,sBAAsB,CAO5B;gBAEU,OAAO,GAAE;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB;IAMN;;OAEG;IACH,kBAAkB,IAAI,WAAW;IAwDjC;;OAEG;IACH,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAU/C;;OAEG;IACH,aAAa,IAAI,WAAW,GAAG,IAAI;IAInC;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAO9C;;OAEG;IACH,YAAY,IAAI,WAAW,GAAG,IAAI;IAIlC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAqBhE;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACH,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAgDzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6CvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAKvD;;OAEG;IACH,uBAAuB,IAAI,IAAI;CAYhC"}
|
package/dist/container.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
|
package/dist/datalyr.cjs.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @datalyr/web v1.0.
|
|
2
|
+
* @datalyr/web v1.0.2
|
|
3
3
|
* Datalyr Web SDK - Modern attribution tracking for web applications
|
|
4
4
|
* (c) 2025 Datalyr Inc.
|
|
5
5
|
* Released under the MIT License
|
|
@@ -809,9 +809,36 @@ class SessionManager {
|
|
|
809
809
|
class AttributionManager {
|
|
810
810
|
constructor(options = {}) {
|
|
811
811
|
this.UTM_PARAMS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
|
|
812
|
-
|
|
812
|
+
// Updated to match dl.js - includes ALL ad platform click IDs
|
|
813
|
+
this.CLICK_IDS = [
|
|
814
|
+
'fbclid', // Facebook/Meta
|
|
815
|
+
'gclid', // Google Ads
|
|
816
|
+
'gbraid', // Google Ads (iOS)
|
|
817
|
+
'wbraid', // Google Ads (web)
|
|
818
|
+
'ttclid', // TikTok
|
|
819
|
+
'msclkid', // Microsoft/Bing
|
|
820
|
+
'twclid', // Twitter/X
|
|
821
|
+
'li_fat_id', // LinkedIn
|
|
822
|
+
'sclid', // Snapchat
|
|
823
|
+
'dclid', // Google Display/DoubleClick
|
|
824
|
+
'epik', // Pinterest
|
|
825
|
+
'rdt_cid', // Reddit
|
|
826
|
+
'obclid', // Outbrain
|
|
827
|
+
'irclid', // Impact Radius
|
|
828
|
+
'ko_click_id' // Klaviyo
|
|
829
|
+
];
|
|
830
|
+
// Default tracked params matching dl.js
|
|
831
|
+
this.DEFAULT_TRACKED_PARAMS = [
|
|
832
|
+
'lyr', // Datalyr partner tracking
|
|
833
|
+
'ref', // Generic referral
|
|
834
|
+
'source', // Generic source (non-UTM)
|
|
835
|
+
'campaign', // Generic campaign (non-UTM)
|
|
836
|
+
'medium', // Generic medium (non-UTM)
|
|
837
|
+
'gad_source' // Google Ads source parameter
|
|
838
|
+
];
|
|
813
839
|
this.attributionWindow = options.attributionWindow || 30 * 24 * 60 * 60 * 1000; // 30 days
|
|
814
|
-
|
|
840
|
+
// Merge default tracked params with user-provided ones
|
|
841
|
+
this.trackedParams = [...this.DEFAULT_TRACKED_PARAMS, ...(options.trackedParams || [])];
|
|
815
842
|
}
|
|
816
843
|
/**
|
|
817
844
|
* Capture current attribution from URL
|
|
@@ -898,9 +925,9 @@ class AttributionManager {
|
|
|
898
925
|
const touchpoint = {
|
|
899
926
|
timestamp: Date.now(),
|
|
900
927
|
sessionId,
|
|
901
|
-
source: attribution.source,
|
|
902
|
-
medium: attribution.medium,
|
|
903
|
-
campaign: attribution.campaign
|
|
928
|
+
source: attribution.source || undefined,
|
|
929
|
+
medium: attribution.medium || undefined,
|
|
930
|
+
campaign: attribution.campaign || undefined
|
|
904
931
|
};
|
|
905
932
|
journey.push(touchpoint);
|
|
906
933
|
// Keep last 30 touchpoints
|
|
@@ -1072,7 +1099,6 @@ class EventQueue {
|
|
|
1072
1099
|
this.recentEventIds = new Set();
|
|
1073
1100
|
this.MAX_RECENT_EVENT_IDS = 1000;
|
|
1074
1101
|
this.OFFLINE_QUEUE_KEY = 'dl_offline_queue';
|
|
1075
|
-
this.currentEndpointIndex = 0;
|
|
1076
1102
|
this.config = {
|
|
1077
1103
|
batchSize: config.batchSize || 10,
|
|
1078
1104
|
flushInterval: config.flushInterval || 5000,
|
|
@@ -1133,7 +1159,10 @@ class EventQueue {
|
|
|
1133
1159
|
const toDelete = this.recentEventIds.size - this.MAX_RECENT_EVENT_IDS;
|
|
1134
1160
|
const iterator = this.recentEventIds.values();
|
|
1135
1161
|
for (let i = 0; i < toDelete; i++) {
|
|
1136
|
-
|
|
1162
|
+
const next = iterator.next();
|
|
1163
|
+
if (!next.done) {
|
|
1164
|
+
this.recentEventIds.delete(next.value);
|
|
1165
|
+
}
|
|
1137
1166
|
}
|
|
1138
1167
|
}
|
|
1139
1168
|
return false;
|
|
@@ -1244,7 +1273,6 @@ class EventQueue {
|
|
|
1244
1273
|
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
1245
1274
|
}
|
|
1246
1275
|
this.log(`Batch sent successfully to ${currentEndpoint}: ${events.length} events`);
|
|
1247
|
-
this.currentEndpointIndex = 0; // Reset to primary on success
|
|
1248
1276
|
}
|
|
1249
1277
|
catch (error) {
|
|
1250
1278
|
// Try next fallback endpoint if available
|
|
@@ -2058,8 +2086,8 @@ class ContainerManager {
|
|
|
2058
2086
|
document.head.appendChild(script);
|
|
2059
2087
|
// Initialize gtag
|
|
2060
2088
|
window.dataLayer = window.dataLayer || [];
|
|
2061
|
-
function gtag() {
|
|
2062
|
-
window.dataLayer.push(
|
|
2089
|
+
function gtag(...args) {
|
|
2090
|
+
window.dataLayer.push(args);
|
|
2063
2091
|
}
|
|
2064
2092
|
window.gtag = gtag;
|
|
2065
2093
|
gtag('js', new Date());
|
|
@@ -2078,7 +2106,7 @@ class ContainerManager {
|
|
|
2078
2106
|
initializeTikTokPixel(config) {
|
|
2079
2107
|
try {
|
|
2080
2108
|
// Load TikTok Pixel script
|
|
2081
|
-
(function (w,
|
|
2109
|
+
(function (w, _d, t) {
|
|
2082
2110
|
w.TiktokAnalyticsObject = t;
|
|
2083
2111
|
var ttq = w[t] = w[t] || [];
|
|
2084
2112
|
ttq.methods = ['page', 'track', 'identify', 'instances', 'debug', 'on', 'off', 'once', 'ready', 'alias', 'group', 'enableCookie', 'disableCookie'];
|
|
@@ -2095,6 +2123,7 @@ class ContainerManager {
|
|
|
2095
2123
|
return e;
|
|
2096
2124
|
};
|
|
2097
2125
|
ttq.load = function (e, n) {
|
|
2126
|
+
var _a;
|
|
2098
2127
|
var i = 'https://analytics.tiktok.com/i18n/pixel/events.js';
|
|
2099
2128
|
ttq._i = ttq._i || {};
|
|
2100
2129
|
ttq._i[e] = [];
|
|
@@ -2105,7 +2134,7 @@ class ContainerManager {
|
|
|
2105
2134
|
o.async = true;
|
|
2106
2135
|
o.src = i + '?sdkid=' + e + '&lib=' + t;
|
|
2107
2136
|
var a = document.getElementsByTagName('script')[0];
|
|
2108
|
-
a.parentNode.insertBefore(o, a);
|
|
2137
|
+
(_a = a.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(o, a);
|
|
2109
2138
|
};
|
|
2110
2139
|
})(window, document, 'ttq');
|
|
2111
2140
|
// Initialize pixel
|
|
@@ -2121,7 +2150,7 @@ class ContainerManager {
|
|
|
2121
2150
|
* Track event to all initialized pixels
|
|
2122
2151
|
*/
|
|
2123
2152
|
trackToPixels(eventName, properties = {}) {
|
|
2124
|
-
var _a, _b, _c,
|
|
2153
|
+
var _a, _b, _c, _e, _f, _g;
|
|
2125
2154
|
// Track to Meta Pixel
|
|
2126
2155
|
if (((_b = (_a = this.pixels) === null || _a === void 0 ? void 0 : _a.meta) === null || _b === void 0 ? void 0 : _b.enabled) && window.fbq) {
|
|
2127
2156
|
try {
|
|
@@ -2132,7 +2161,7 @@ class ContainerManager {
|
|
|
2132
2161
|
}
|
|
2133
2162
|
}
|
|
2134
2163
|
// Track to Google Tag
|
|
2135
|
-
if (((
|
|
2164
|
+
if (((_e = (_c = this.pixels) === null || _c === void 0 ? void 0 : _c.google) === null || _e === void 0 ? void 0 : _e.enabled) && window.gtag) {
|
|
2136
2165
|
try {
|
|
2137
2166
|
window.gtag('event', eventName, properties);
|
|
2138
2167
|
}
|
|
@@ -2141,7 +2170,7 @@ class ContainerManager {
|
|
|
2141
2170
|
}
|
|
2142
2171
|
}
|
|
2143
2172
|
// Track to TikTok Pixel
|
|
2144
|
-
if (((
|
|
2173
|
+
if (((_g = (_f = this.pixels) === null || _f === void 0 ? void 0 : _f.tiktok) === null || _g === void 0 ? void 0 : _g.enabled) && window.ttq) {
|
|
2145
2174
|
try {
|
|
2146
2175
|
// Map common events to TikTok names
|
|
2147
2176
|
const tiktokEventMap = {
|
|
@@ -2643,13 +2672,39 @@ class Datalyr {
|
|
|
2643
2672
|
// Create payload with both camelCase and snake_case fields
|
|
2644
2673
|
const identityFields = this.identity.getIdentityFields();
|
|
2645
2674
|
const eventId = generateUUID();
|
|
2646
|
-
|
|
2675
|
+
// Ensure we have all required identity fields
|
|
2676
|
+
const distinctId = identityFields.distinct_id;
|
|
2677
|
+
const anonymousId = identityFields.anonymous_id;
|
|
2678
|
+
const visitorId = identityFields.visitor_id || anonymousId;
|
|
2679
|
+
const sessionId = identityFields.session_id;
|
|
2680
|
+
const payload = {
|
|
2647
2681
|
// Required fields
|
|
2648
|
-
workspaceId: this.config.workspaceId,
|
|
2649
|
-
|
|
2650
|
-
|
|
2682
|
+
workspaceId: this.config.workspaceId,
|
|
2683
|
+
workspace_id: this.config.workspaceId, // Snake case alias
|
|
2684
|
+
eventId: eventId,
|
|
2685
|
+
event_id: eventId, // Snake case alias (same ID)
|
|
2686
|
+
eventName,
|
|
2687
|
+
event_name: eventName, // Snake case alias
|
|
2688
|
+
eventData,
|
|
2689
|
+
event_data: eventData, // Snake case alias
|
|
2690
|
+
source: 'web',
|
|
2691
|
+
timestamp: new Date().toISOString(),
|
|
2692
|
+
// Identity fields (explicit to satisfy TypeScript)
|
|
2693
|
+
distinct_id: distinctId,
|
|
2694
|
+
anonymous_id: anonymousId,
|
|
2695
|
+
visitor_id: visitorId,
|
|
2696
|
+
visitorId: visitorId,
|
|
2697
|
+
user_id: identityFields.user_id,
|
|
2698
|
+
canonical_id: identityFields.canonical_id,
|
|
2699
|
+
sessionId: sessionId,
|
|
2700
|
+
session_id: sessionId,
|
|
2701
|
+
// Resolution metadata
|
|
2702
|
+
resolution_method: 'browser_sdk',
|
|
2703
|
+
resolution_confidence: 1.0,
|
|
2651
2704
|
// SDK metadata
|
|
2652
|
-
sdk_version: '1.0.0',
|
|
2705
|
+
sdk_version: '1.0.0',
|
|
2706
|
+
sdk_name: 'datalyr-web-sdk'
|
|
2707
|
+
};
|
|
2653
2708
|
return payload;
|
|
2654
2709
|
}
|
|
2655
2710
|
/**
|