@datalyr/web 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Datalyr Inc.
3
+ Copyright (c) 2025 Datalyr Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -8,6 +8,7 @@ export declare class AttributionManager {
8
8
  private trackedParams;
9
9
  private UTM_PARAMS;
10
10
  private CLICK_IDS;
11
+ private DEFAULT_TRACKED_PARAMS;
11
12
  constructor(options?: {
12
13
  attributionWindow?: number;
13
14
  trackedParams?: string[];
@@ -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;IAC7F,OAAO,CAAC,SAAS,CAA6F;gBAElG,OAAO,GAAE;QACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB;IAKN;;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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @datalyr/web v1.0.0
2
+ * @datalyr/web v1.0.1
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
- this.CLICK_IDS = ['fbclid', 'gclid', 'ttclid', 'msclkid', 'twclid', 'li_fat_id', 'sclid', 'dclid', 'epik'];
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
- this.trackedParams = options.trackedParams || [];
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
- this.recentEventIds.delete(iterator.next().value);
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(arguments);
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, d, t) {
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, _d, _e, _f;
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 (((_d = (_c = this.pixels) === null || _c === void 0 ? void 0 : _c.google) === null || _d === void 0 ? void 0 : _d.enabled) && window.gtag) {
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 (((_f = (_e = this.pixels) === null || _e === void 0 ? void 0 : _e.tiktok) === null || _f === void 0 ? void 0 : _f.enabled) && window.ttq) {
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
- const payload = Object.assign(Object.assign({
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, workspace_id: this.config.workspaceId, eventId: eventId, event_id: eventId, // Snake case alias (same ID)
2649
- eventName, event_name: eventName, // Snake case alias
2650
- eventData, event_data: eventData, source: 'web', timestamp: new Date().toISOString() }, identityFields), {
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', sdk_name: 'datalyr-web-sdk' });
2705
+ sdk_version: '1.0.0',
2706
+ sdk_name: 'datalyr-web-sdk'
2707
+ };
2653
2708
  return payload;
2654
2709
  }
2655
2710
  /**