rudder-sdk-js 2.7.0 → 2.8.0

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 (2) hide show
  1. package/index.js +314 -178
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -4511,6 +4511,39 @@
4511
4511
  return isObject$1(val) || Array.isArray(val) || typeof val === 'function';
4512
4512
  }
4513
4513
 
4514
+ /* eslint-disable no-use-before-define */
4515
+ // import logger from "../utils/logUtil";
4516
+ var defaultAsyncState = true;
4517
+ var LOAD_ORIGIN = "RS_JS_SDK";
4518
+
4519
+ var ScriptLoader = function ScriptLoader(id, src) {
4520
+ var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultAsyncState;
4521
+ var exists = document.getElementById(id);
4522
+
4523
+ if (exists) {
4524
+ // logger.debug("script already loaded");
4525
+ return;
4526
+ }
4527
+
4528
+ var js = document.createElement("script");
4529
+ js.src = src;
4530
+ js.async = async === undefined ? defaultAsyncState : async;
4531
+ js.type = "text/javascript";
4532
+ js.id = id;
4533
+ js.dataset.loader = LOAD_ORIGIN;
4534
+ var headElmColl = document.getElementsByTagName("head");
4535
+
4536
+ if (headElmColl.length !== 0) {
4537
+ // logger.debug("==adding script==", js);
4538
+ headElmColl[0].insertBefore(js, headElmColl[0].firstChild);
4539
+ } else {
4540
+ var e = document.getElementsByTagName("script")[0]; // logger.debug("==parent script==", e);
4541
+ // logger.debug("==adding script==", js);
4542
+
4543
+ e.parentNode.insertBefore(js, e);
4544
+ }
4545
+ };
4546
+
4514
4547
  var LOG_LEVEL_INFO = 1;
4515
4548
  var LOG_LEVEL_DEBUG = 2;
4516
4549
  var LOG_LEVEL_WARN = 3;
@@ -4860,14 +4893,16 @@
4860
4893
  };
4861
4894
 
4862
4895
  // Reserved Keywords for properties/traits
4863
- var RESERVED_KEYS = ["anonymous_id", "id", "sent_at", "received_at", "timestamp", "original_timestamp", "event_text", "event"];
4864
- var CONFIG_URL = "https://api.rudderlabs.com/sourceConfig/?p=npm&v=2.7.0";
4865
- var CDN_INT_DIR = "js-integrations";
4896
+ var RESERVED_KEYS = ['anonymous_id', 'id', 'sent_at', 'received_at', 'timestamp', 'original_timestamp', 'event_text', 'event'];
4897
+ var CONFIG_URL = 'https://api.rudderlabs.com/sourceConfig/?p=npm&v=2.8.0';
4898
+ var CDN_INT_DIR = 'js-integrations';
4866
4899
  var DEST_SDK_BASE_URL = "https://cdn.rudderlabs.com/v1.1/".concat(CDN_INT_DIR);
4867
4900
  var MAX_WAIT_FOR_INTEGRATION_LOAD = 10000;
4868
4901
  var INTEGRATION_LOAD_CHECK_INTERVAL = 1000;
4869
- var INTG_SUFFIX = "_RS";
4870
- var POLYFILL_URL = "https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.find%2CArray.prototype.includes%2CPromise%2CString.prototype.endsWith%2CString.prototype.includes%2CString.prototype.startsWith%2CObject.entries";
4902
+ var INTG_SUFFIX = '_RS';
4903
+ var POLYFILL_URL = 'https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.find%2CArray.prototype.includes%2CPromise%2CString.prototype.endsWith%2CString.prototype.includes%2CString.prototype.startsWith%2CObject.entries%2CObject.values%2CElement.prototype.dataset';
4904
+ var DEFAULT_ERROR_REPORT_PROVIDER = 'bugsnag';
4905
+ var ERROR_REPORT_PROVIDERS = [DEFAULT_ERROR_REPORT_PROVIDER];
4871
4906
 
4872
4907
  var aes = {exports: {}};
4873
4908
 
@@ -10220,31 +10255,58 @@
10220
10255
 
10221
10256
  xhr.send();
10222
10257
  }
10258
+ /**
10259
+ * This function is to add breadcrumbs
10260
+ * @param {string} breadcrumb Message to add insight of an user's journey before the error occurred
10261
+ */
10262
+
10263
+
10264
+ function leaveBreadcrumb(breadcrumb) {
10265
+ if (window.rsBugsnagClient) {
10266
+ window.rsBugsnagClient.leaveBreadcrumb(breadcrumb);
10267
+ }
10268
+ }
10269
+ /**
10270
+ * This function is to send handled errors to Bugsnag if Bugsnag client is available
10271
+ * @param {Error} error Error instance from handled error
10272
+ */
10273
+
10274
+
10275
+ function notifyError(error) {
10276
+ if (window.rsBugsnagClient) {
10277
+ window.rsBugsnagClient.notify(error);
10278
+ }
10279
+ }
10223
10280
 
10224
10281
  function handleError(error, analyticsInstance) {
10225
- var errorMessage = error.message ? error.message : undefined;
10226
- var sampleAdBlockTest;
10282
+ var errorMessage = error.message;
10227
10283
 
10228
10284
  try {
10229
10285
  if (error instanceof Event) {
10230
- if (error.target && error.target.localName == "script") {
10231
- errorMessage = "error in script loading:: src:: ".concat(error.target.src, " id:: ").concat(error.target.id);
10232
-
10233
- if (analyticsInstance && error.target.src.includes("adsbygoogle")) {
10234
- sampleAdBlockTest = true;
10235
- analyticsInstance.page("RudderJS-Initiated", "ad-block page request", {
10236
- path: "/ad-blocked",
10237
- title: errorMessage
10238
- }, analyticsInstance.sendAdblockPageOptions);
10239
- }
10286
+ // Discard all the non-script loading errors
10287
+ if (error.target && error.target.localName !== "script") return; // Discard errors of scripts that are not loaded by the SDK
10288
+
10289
+ if (error.target.dataset && error.target.dataset.loader !== LOAD_ORIGIN) return;
10290
+ errorMessage = "error in script loading:: src:: ".concat(error.target.src, " id:: ").concat(error.target.id); // SDK triggered ad-blocker script
10291
+
10292
+ if (error.target.id === "ad-block") {
10293
+ analyticsInstance.page("RudderJS-Initiated", "ad-block page request", {
10294
+ path: "/ad-blocked",
10295
+ title: errorMessage
10296
+ }, analyticsInstance.sendAdblockPageOptions); // No need to proceed further for Ad-block errors
10297
+
10298
+ return;
10240
10299
  }
10241
10300
  }
10242
10301
 
10243
- if (errorMessage && !sampleAdBlockTest) {
10244
- logger.error("[Util] handleError:: ", errorMessage);
10245
- }
10246
- } catch (e) {
10247
- logger.error("[Util] handleError:: ", e);
10302
+ errorMessage = "[handleError]:: \"".concat(errorMessage, "\"");
10303
+ logger.error(errorMessage);
10304
+ var errorObj = error;
10305
+ if (!(error instanceof Error)) errorObj = new Error(errorMessage);
10306
+ notifyError(errorObj);
10307
+ } catch (err) {
10308
+ logger.error("[handleError] Exception:: ", err);
10309
+ notifyError(err);
10248
10310
  }
10249
10311
  }
10250
10312
 
@@ -10493,7 +10555,7 @@
10493
10555
  this.build = "1.0.0";
10494
10556
  this.name = "RudderLabs JavaScript SDK";
10495
10557
  this.namespace = "com.rudderlabs.javascript";
10496
- this.version = "2.7.0";
10558
+ this.version = "2.8.0";
10497
10559
  });
10498
10560
 
10499
10561
  /* eslint-disable max-classes-per-file */
@@ -10502,7 +10564,7 @@
10502
10564
  _classCallCheck(this, RudderLibraryInfo);
10503
10565
 
10504
10566
  this.name = "RudderLabs JavaScript SDK";
10505
- this.version = "2.7.0";
10567
+ this.version = "2.8.0";
10506
10568
  }); // Operating System information class
10507
10569
 
10508
10570
 
@@ -12528,23 +12590,6 @@
12528
12590
  value: function setQueue(value) {
12529
12591
  this.storage.set(this.queueName, value);
12530
12592
  }
12531
- /**
12532
- *
12533
- * Utility method for excluding null and empty values in JSON
12534
- * @param {*} _key
12535
- * @param {*} value
12536
- * @returns
12537
- */
12538
-
12539
- }, {
12540
- key: "replacer",
12541
- value: function replacer(_key, value) {
12542
- if (value === null || value === undefined) {
12543
- return undefined;
12544
- }
12545
-
12546
- return value;
12547
- }
12548
12593
  }, {
12549
12594
  key: "enqueue",
12550
12595
  value: function enqueue(message) {
@@ -12555,7 +12600,7 @@
12555
12600
  var data = {
12556
12601
  batch: batch
12557
12602
  };
12558
- var dataToSend = JSON.stringify(data, this.replacer);
12603
+ var dataToSend = JSON.stringify(data, replacer);
12559
12604
 
12560
12605
  if (dataToSend.length > defaults.maxPayloadSize) {
12561
12606
  batch = queue.slice(0, queue.length - 1);
@@ -12596,7 +12641,7 @@
12596
12641
  var data = {
12597
12642
  batch: batch
12598
12643
  };
12599
- var payload = JSON.stringify(data, this.replacer);
12644
+ var payload = JSON.stringify(data, replacer);
12600
12645
  var blob = new Blob([payload], {
12601
12646
  type: "text/plain"
12602
12647
  });
@@ -12690,7 +12735,7 @@
12690
12735
  message.sentAt = getCurrentTimeFormatted(); // add this, will get modified when actually being sent
12691
12736
  // check message size, if greater log an error
12692
12737
 
12693
- if (JSON.stringify(message).length > MESSAGE_LENGTH) {
12738
+ if (JSON.stringify(message, replacer).length > MESSAGE_LENGTH) {
12694
12739
  logger.error("[EventRepository] enqueue:: message length greater 32 Kb ", message);
12695
12740
  }
12696
12741
 
@@ -12703,37 +12748,6 @@
12703
12748
 
12704
12749
  var eventRepository = new EventRepository();
12705
12750
 
12706
- /* eslint-disable no-use-before-define */
12707
- // import logger from "../utils/logUtil";
12708
- var defaultAsyncState = true;
12709
-
12710
- var ScriptLoader = function ScriptLoader(id, src) {
12711
- var async = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultAsyncState;
12712
- var exists = document.getElementById(id);
12713
-
12714
- if (exists) {
12715
- // logger.debug("script already loaded");
12716
- return;
12717
- }
12718
-
12719
- var js = document.createElement("script");
12720
- js.src = src;
12721
- js.async = async === undefined ? defaultAsyncState : async;
12722
- js.type = "text/javascript";
12723
- js.id = id;
12724
- var headElmColl = document.getElementsByTagName("head");
12725
-
12726
- if (headElmColl.length !== 0) {
12727
- // logger.debug("==adding script==", js);
12728
- headElmColl[0].insertBefore(js, headElmColl[0].firstChild);
12729
- } else {
12730
- var e = document.getElementsByTagName("script")[0]; // logger.debug("==parent script==", e);
12731
- // logger.debug("==adding script==", js);
12732
-
12733
- e.parentNode.insertBefore(js, e);
12734
- }
12735
- };
12736
-
12737
12751
  /**
12738
12752
  * @description This is utility function for crc32 algorithm
12739
12753
  * @version v1.0.0
@@ -13151,6 +13165,106 @@
13151
13165
  return CookieConsentFactory;
13152
13166
  }();
13153
13167
 
13168
+ var META_DATA = {
13169
+ SDK: {
13170
+ name: "JS",
13171
+ installType: "npm"
13172
+ }
13173
+ }; // This API key token is parsed in the CI pipeline
13174
+
13175
+ var API_KEY = "{{RS_BUGSNAG_API_KEY}}"; // Errors only from Below SDKs are allowed to reach Bugsnag
13176
+
13177
+ var SDK_FILE_NAMES = ["browser.js", "rudder-analytics.min.js", "rudder-analytics-staging.min.js", "rudder-analytics.js"].concat(_toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13178
+ return "".concat(intgName, ".js");
13179
+ })), _toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13180
+ return "".concat(intgName, ".min.js");
13181
+ })), _toConsumableArray(Object.values(configToIntNames).map(function (intgName) {
13182
+ return "".concat(intgName, "-staging.min.js");
13183
+ })));
13184
+ /**
13185
+ * This function will load the Bugsnag native SDK through CDN
13186
+ * Once loaded it will be available in window.Bugsnag
13187
+ */
13188
+
13189
+ var load$1 = function load() {
13190
+ var pluginName = "bugsnag";
13191
+
13192
+ if (!window.hasOwnProperty(pluginName)) {
13193
+ ScriptLoader(pluginName, "https://d2wy8f7a9ursnm.cloudfront.net/v7/bugsnag.min.js");
13194
+ }
13195
+ };
13196
+ /**
13197
+ * This function is to initialize the bugsnag with apiKey, SDK meta data
13198
+ * and custom configuration for onError method.
13199
+ * After initialization Bugsnag instance will be available in window.rsBugsnagClient
13200
+ * @param {string} sourceId
13201
+ */
13202
+
13203
+
13204
+ function initClient(sourceId) {
13205
+ if (window.Bugsnag === undefined) return; // If the API key token is not parsed yet, don't proceed to initialize the client
13206
+ // This also prevents unnecessary errors sent to Bugsnag during development phase.
13207
+
13208
+ var apiKeyRegex = /{{.+}}/;
13209
+ if (API_KEY.match(apiKeyRegex) !== null) return;
13210
+ window.rsBugsnagClient = window.Bugsnag.start({
13211
+ apiKey: API_KEY,
13212
+ appVersion: "2.8.0",
13213
+ // Set SDK version as the app version
13214
+ metadata: META_DATA,
13215
+ onError: function onError(event) {
13216
+ var errorOrigin = getValue(event.errors[0], "stacktrace.0.file"); // Skip errors that do not have a valid stack trace
13217
+
13218
+ if (!errorOrigin || typeof errorOrigin !== "string") return false;
13219
+ var srcFileName = errorOrigin.substring(errorOrigin.lastIndexOf("/") + 1);
13220
+ if (!SDK_FILE_NAMES.includes(srcFileName)) // Discard the event if it's not originated at the SDK
13221
+ return false;
13222
+ event.addMetadata("source", {
13223
+ sourceId: sourceId
13224
+ });
13225
+ var errMsg = event.errors[0].errorMessage;
13226
+ event.context = errMsg; // Hack for easily grouping the script load errors
13227
+ // on the dashboard
13228
+
13229
+ if (errMsg.includes("error in script loading")) event.context = "Script load failures";
13230
+ event.severity = "error";
13231
+ return true;
13232
+ },
13233
+ autoTrackSessions: false,
13234
+ // auto tracking sessions is disabled
13235
+ collectUserIp: false,
13236
+ // collecting user's IP is disabled
13237
+ enabledBreadcrumbTypes: ["error", "log", "user"]
13238
+ });
13239
+ window.rsBugsnagClient.releaseStage = "production"; // set the release stage
13240
+ }
13241
+ /**
13242
+ * The responsibility of this function is to check Bugsnag native SDK
13243
+ * has been loaded or not in a certain interval.
13244
+ * If already loaded initialize the SDK.
13245
+ * @param {*} sourceId
13246
+ */
13247
+
13248
+
13249
+ var init = function init(sourceId) {
13250
+ if (window.hasOwnProperty("rsBugsnagClient")) return; // return if already initialized
13251
+
13252
+ if (window.Bugsnag !== undefined) {
13253
+ initClient(sourceId);
13254
+ } else {
13255
+ // Check if Bugsnag is loaded every '100'ms
13256
+ var interval = setInterval(function () {
13257
+ if (window.Bugsnag !== undefined) {
13258
+ clearInterval(interval);
13259
+ initClient(sourceId);
13260
+ }
13261
+ }, 100);
13262
+ setTimeout(function () {
13263
+ clearInterval(interval);
13264
+ }, MAX_WAIT_FOR_INTEGRATION_LOAD);
13265
+ }
13266
+ };
13267
+
13154
13268
  /**
13155
13269
  * class responsible for handling core
13156
13270
  * event tracking functionalities
@@ -13180,7 +13294,7 @@
13180
13294
 
13181
13295
  this.readyCallbacks = [];
13182
13296
  this.methodToCallbackMapping = {
13183
- syncPixel: "syncPixelCallback"
13297
+ syncPixel: 'syncPixelCallback'
13184
13298
  };
13185
13299
  this.loaded = false;
13186
13300
  this.loadIntegration = true;
@@ -13200,11 +13314,11 @@
13200
13314
  key: "initializeUser",
13201
13315
  value: function initializeUser(anonymousIdOptions) {
13202
13316
  // save once for storing older values to encrypted
13203
- this.userId = this.storage.getUserId() || "";
13317
+ this.userId = this.storage.getUserId() || '';
13204
13318
  this.storage.setUserId(this.userId);
13205
13319
  this.userTraits = this.storage.getUserTraits() || {};
13206
13320
  this.storage.setUserTraits(this.userTraits);
13207
- this.groupId = this.storage.getGroupId() || "";
13321
+ this.groupId = this.storage.getGroupId() || '';
13208
13322
  this.storage.setGroupId(this.groupId);
13209
13323
  this.groupTraits = this.storage.getGroupTraits() || {};
13210
13324
  this.storage.setGroupTraits(this.groupTraits);
@@ -13276,8 +13390,26 @@
13276
13390
 
13277
13391
  try {
13278
13392
  // logger.debug(`===in process response=== ${status}`)
13279
- if (typeof response === "string") {
13393
+ if (typeof response === 'string') {
13280
13394
  response = JSON.parse(response);
13395
+ } // Fetch Error reporting enable option from sourceConfig
13396
+
13397
+
13398
+ var isErrorReportEnabled = getValue(response.source.config, 'statsCollection.errorReports.enabled'); // Load Bugsnag only if it is enabled in the source config
13399
+
13400
+ if (isErrorReportEnabled === true) {
13401
+ // Fetch the name of the Error reporter from sourceConfig
13402
+ var provider = getValue(response.source.config, 'statsCollection.errorReports.provider') || DEFAULT_ERROR_REPORT_PROVIDER;
13403
+
13404
+ if (!ERROR_REPORT_PROVIDERS.includes(provider)) {
13405
+ logger.error('Invalid error reporting provider value');
13406
+ }
13407
+
13408
+ if (provider === 'bugsnag') {
13409
+ // Load Bugsnag client SDK
13410
+ load$1();
13411
+ init(response.source.id);
13412
+ }
13281
13413
  }
13282
13414
 
13283
13415
  response.source.destinations.forEach(function (destination, index) {
@@ -13306,11 +13438,11 @@
13306
13438
  cookieConsent && cookieConsent.isEnabled(intg.config);
13307
13439
  });
13308
13440
  } catch (e) {
13309
- logger.error(e);
13441
+ handleError(e);
13310
13442
  }
13311
13443
  }
13312
13444
 
13313
- var suffix = ""; // default suffix
13445
+ var suffix = ''; // default suffix
13314
13446
  // Get the CDN base URL is rudder staging url
13315
13447
 
13316
13448
  var _checkSDKUrl = checkSDKUrl(),
@@ -13318,10 +13450,11 @@
13318
13450
  staging = _checkSDKUrl.staging;
13319
13451
 
13320
13452
  if (rudderSDK && staging) {
13321
- suffix = "-staging"; // stagging suffix
13322
- } // logger.debug("this.clientIntegrations: ", this.clientIntegrations)
13323
- // Load all the client integrations dynamically
13453
+ suffix = '-staging'; // stagging suffix
13454
+ }
13324
13455
 
13456
+ leaveBreadcrumb('Starting device-mode initialization'); // logger.debug("this.clientIntegrations: ", this.clientIntegrations)
13457
+ // Load all the client integrations dynamically
13325
13458
 
13326
13459
  this.clientIntegrations.forEach(function (intg) {
13327
13460
  var modName = configToIntNames[intg.name]; // script URL can be constructed from this
@@ -13343,10 +13476,9 @@
13343
13476
  var intgInstance;
13344
13477
 
13345
13478
  try {
13346
- // logger.debug(
13347
- // pluginName,
13348
- // " [Analytics] processResponse :: trying to initialize integration ::"
13349
- // );
13479
+ var msg = "[Analytics] processResponse :: trying to initialize integration name:: ".concat(pluginName); // logger.debug(msg);
13480
+
13481
+ leaveBreadcrumb(msg);
13350
13482
  intgInstance = new intMod[modName](intg.config, self);
13351
13483
  intgInstance.init(); // logger.debug(pluginName, " initializing destination");
13352
13484
 
@@ -13355,7 +13487,8 @@
13355
13487
  self.dynamicallyLoadedIntegrations[pluginName] = intMod[modName];
13356
13488
  });
13357
13489
  } catch (e) {
13358
- logger.error(pluginName, " [Analytics] initialize integration (integration.init()) failed", e);
13490
+ e.message = "[Analytics] 'integration.init()' failed :: ".concat(pluginName, " :: ").concat(e.message);
13491
+ handleError(e);
13359
13492
  self.failedToBeLoadedIntegration.push(intgInstance);
13360
13493
  }
13361
13494
  }
@@ -13394,7 +13527,8 @@
13394
13527
  // " failed loaded count: ",
13395
13528
  // object.failedToBeLoadedIntegration.length
13396
13529
  // );
13397
- // eslint-disable-next-line no-param-reassign
13530
+ leaveBreadcrumb("Started replaying buffered events"); // eslint-disable-next-line no-param-reassign
13531
+
13398
13532
  object.clientIntegrationObjects = []; // eslint-disable-next-line no-param-reassign
13399
13533
 
13400
13534
  object.clientIntegrationObjects = object.successfullyLoadedIntegration; // logger.debug(
@@ -13498,19 +13632,20 @@
13498
13632
  }, {
13499
13633
  key: "page",
13500
13634
  value: function page(category, name, properties, options, callback) {
13635
+ leaveBreadcrumb("Page event");
13501
13636
  if (!this.loaded) return;
13502
- if (typeof options === "function") callback = options, options = null;
13503
- if (typeof properties === "function") callback = properties, options = properties = null;
13504
- if (typeof name === "function") callback = name, options = properties = name = null;
13505
- if (_typeof(category) === "object" && category != null && category != undefined) options = name, properties = category, name = category = null;
13506
- if (_typeof(name) === "object" && name != null && name != undefined) options = properties, properties = name, name = null;
13507
- if (typeof category === "string" && typeof name !== "string") name = category, category = null;
13508
-
13509
- if (this.sendAdblockPage && category != "RudderJS-Initiated") {
13637
+ if (typeof options === 'function') callback = options, options = null;
13638
+ if (typeof properties === 'function') callback = properties, options = properties = null;
13639
+ if (typeof name === 'function') callback = name, options = properties = name = null;
13640
+ if (_typeof(category) === 'object' && category != null && category != undefined) options = name, properties = category, name = category = null;
13641
+ if (_typeof(name) === 'object' && name != null && name != undefined) options = properties, properties = name, name = null;
13642
+ if (typeof category === 'string' && typeof name !== 'string') name = category, category = null;
13643
+
13644
+ if (this.sendAdblockPage && category != 'RudderJS-Initiated') {
13510
13645
  this.sendSampleRequest();
13511
13646
  }
13512
13647
 
13513
- var rudderElement = new RudderElementBuilder().setType("page").build();
13648
+ var rudderElement = new RudderElementBuilder().setType('page').build();
13514
13649
 
13515
13650
  if (!properties) {
13516
13651
  properties = {};
@@ -13525,7 +13660,7 @@
13525
13660
  }
13526
13661
 
13527
13662
  rudderElement.message.properties = this.getPageProperties(properties);
13528
- this.processAndSendDataToDestinations("page", rudderElement, options, callback);
13663
+ this.processAndSendDataToDestinations('page', rudderElement, options, callback);
13529
13664
  }
13530
13665
  /**
13531
13666
  * Process track params and forward to track call
@@ -13540,17 +13675,18 @@
13540
13675
  }, {
13541
13676
  key: "track",
13542
13677
  value: function track(event, properties, options, callback) {
13678
+ leaveBreadcrumb("Track event");
13543
13679
  if (!this.loaded) return;
13544
- if (typeof options === "function") callback = options, options = null;
13545
- if (typeof properties === "function") callback = properties, options = null, properties = null;
13546
- var rudderElement = new RudderElementBuilder().setType("track").build();
13680
+ if (typeof options === 'function') callback = options, options = null;
13681
+ if (typeof properties === 'function') callback = properties, options = null, properties = null;
13682
+ var rudderElement = new RudderElementBuilder().setType('track').build();
13547
13683
 
13548
13684
  if (event) {
13549
13685
  rudderElement.setEventName(event);
13550
13686
  }
13551
13687
 
13552
13688
  rudderElement.setProperty(properties || {});
13553
- this.processAndSendDataToDestinations("track", rudderElement, options, callback);
13689
+ this.processAndSendDataToDestinations('track', rudderElement, options, callback);
13554
13690
  }
13555
13691
  /**
13556
13692
  * Process identify params and forward to identify call
@@ -13565,10 +13701,11 @@
13565
13701
  }, {
13566
13702
  key: "identify",
13567
13703
  value: function identify(userId, traits, options, callback) {
13704
+ leaveBreadcrumb("Identify event");
13568
13705
  if (!this.loaded) return;
13569
- if (typeof options === "function") callback = options, options = null;
13570
- if (typeof traits === "function") callback = traits, options = null, traits = null;
13571
- if (_typeof(userId) === "object") options = traits, traits = userId, userId = this.userId;
13706
+ if (typeof options === 'function') callback = options, options = null;
13707
+ if (typeof traits === 'function') callback = traits, options = null, traits = null;
13708
+ if (_typeof(userId) === 'object') options = traits, traits = userId, userId = this.userId;
13572
13709
 
13573
13710
  if (userId && this.userId && userId !== this.userId) {
13574
13711
  this.reset();
@@ -13585,8 +13722,8 @@
13585
13722
  this.storage.setUserTraits(this.userTraits);
13586
13723
  }
13587
13724
 
13588
- var rudderElement = new RudderElementBuilder().setType("identify").build();
13589
- this.processAndSendDataToDestinations("identify", rudderElement, options, callback);
13725
+ var rudderElement = new RudderElementBuilder().setType('identify').build();
13726
+ this.processAndSendDataToDestinations('identify', rudderElement, options, callback);
13590
13727
  }
13591
13728
  /**
13592
13729
  *
@@ -13599,14 +13736,15 @@
13599
13736
  }, {
13600
13737
  key: "alias",
13601
13738
  value: function alias(to, from, options, callback) {
13739
+ leaveBreadcrumb("Alias event");
13602
13740
  if (!this.loaded) return;
13603
- if (typeof options === "function") callback = options, options = null;
13604
- if (typeof from === "function") callback = from, options = null, from = null;
13605
- if (_typeof(from) === "object") options = from, from = null;
13606
- var rudderElement = new RudderElementBuilder().setType("alias").build();
13741
+ if (typeof options === 'function') callback = options, options = null;
13742
+ if (typeof from === 'function') callback = from, options = null, from = null;
13743
+ if (_typeof(from) === 'object') options = from, from = null;
13744
+ var rudderElement = new RudderElementBuilder().setType('alias').build();
13607
13745
  rudderElement.message.previousId = from || (this.userId ? this.userId : this.getAnonymousId());
13608
13746
  rudderElement.message.userId = to;
13609
- this.processAndSendDataToDestinations("alias", rudderElement, options, callback);
13747
+ this.processAndSendDataToDestinations('alias', rudderElement, options, callback);
13610
13748
  }
13611
13749
  /**
13612
13750
  *
@@ -13619,14 +13757,15 @@
13619
13757
  }, {
13620
13758
  key: "group",
13621
13759
  value: function group(groupId, traits, options, callback) {
13760
+ leaveBreadcrumb("Group event");
13622
13761
  if (!this.loaded) return;
13623
13762
  if (!arguments.length) return;
13624
- if (typeof options === "function") callback = options, options = null;
13625
- if (typeof traits === "function") callback = traits, options = null, traits = null;
13626
- if (_typeof(groupId) === "object") options = traits, traits = groupId, groupId = this.groupId;
13763
+ if (typeof options === 'function') callback = options, options = null;
13764
+ if (typeof traits === 'function') callback = traits, options = null, traits = null;
13765
+ if (_typeof(groupId) === 'object') options = traits, traits = groupId, groupId = this.groupId;
13627
13766
  this.groupId = groupId;
13628
13767
  this.storage.setGroupId(this.groupId);
13629
- var rudderElement = new RudderElementBuilder().setType("group").build();
13768
+ var rudderElement = new RudderElementBuilder().setType('group').build();
13630
13769
 
13631
13770
  if (traits) {
13632
13771
  for (var key in traits) {
@@ -13637,12 +13776,12 @@
13637
13776
  }
13638
13777
 
13639
13778
  this.storage.setGroupTraits(this.groupTraits);
13640
- this.processAndSendDataToDestinations("group", rudderElement, options, callback);
13779
+ this.processAndSendDataToDestinations('group', rudderElement, options, callback);
13641
13780
  }
13642
13781
  }, {
13643
13782
  key: "IsEventBlackListed",
13644
13783
  value: function IsEventBlackListed(eventName, intgName) {
13645
- if (!eventName || !(typeof eventName === "string")) {
13784
+ if (!eventName || !(typeof eventName === 'string')) {
13646
13785
  return false;
13647
13786
  }
13648
13787
 
@@ -13663,30 +13802,29 @@
13663
13802
 
13664
13803
  switch (eventFilteringOption) {
13665
13804
  // disabled filtering
13666
- case "disable":
13805
+ case 'disable':
13667
13806
  return false;
13668
13807
  // Blacklist is choosen for filtering events
13669
13808
 
13670
- case "blacklistedEvents":
13809
+ case 'blacklistedEvents':
13671
13810
  if (Array.isArray(blacklistedEvents)) {
13672
13811
  return blacklistedEvents.find(function (eventObj) {
13673
13812
  return eventObj.eventName.trim().toUpperCase() === formattedEventName;
13674
- }) === undefined ? false : true;
13675
- } else {
13676
- return false;
13813
+ }) !== undefined;
13677
13814
  }
13678
13815
 
13816
+ return false;
13679
13817
  // Whitelist is choosen for filtering events
13680
13818
 
13681
- case "whitelistedEvents":
13819
+ case 'whitelistedEvents':
13682
13820
  if (Array.isArray(whitelistedEvents)) {
13683
13821
  return whitelistedEvents.find(function (eventObj) {
13684
13822
  return eventObj.eventName.trim().toUpperCase() === formattedEventName;
13685
- }) === undefined ? true : false;
13686
- } else {
13687
- return true;
13823
+ }) === undefined;
13688
13824
  }
13689
13825
 
13826
+ return true;
13827
+
13690
13828
  default:
13691
13829
  return false;
13692
13830
  }
@@ -13712,12 +13850,13 @@
13712
13850
  // rudderElement.message.context.page = getDefaultPageProperties();
13713
13851
 
13714
13852
 
13853
+ leaveBreadcrumb('Started sending data to destinations');
13715
13854
  rudderElement.message.context.traits = _objectSpread2({}, this.userTraits); // logger.debug("anonymousId: ", this.anonymousId)
13716
13855
 
13717
13856
  rudderElement.message.anonymousId = this.anonymousId;
13718
13857
  rudderElement.message.userId = rudderElement.message.userId ? rudderElement.message.userId : this.userId;
13719
13858
 
13720
- if (type == "group") {
13859
+ if (type == 'group') {
13721
13860
  if (this.groupId) {
13722
13861
  rudderElement.message.groupId = this.groupId;
13723
13862
  }
@@ -13746,8 +13885,8 @@
13746
13885
 
13747
13886
  var succesfulLoadedIntersectClientSuppliedIntegrations = findAllEnabledDestinations(clientSuppliedIntegrations, this.clientIntegrationObjects); // try to first send to all integrations, if list populated from BE
13748
13887
 
13749
- try {
13750
- succesfulLoadedIntersectClientSuppliedIntegrations.forEach(function (obj) {
13888
+ succesfulLoadedIntersectClientSuppliedIntegrations.forEach(function (obj) {
13889
+ try {
13751
13890
  if (!obj.isFailed || !obj.isFailed()) {
13752
13891
  if (obj[type]) {
13753
13892
  var sendEvent = !_this4.IsEventBlackListed(rudderElement.message.event, obj.name); // Block the event if it is blacklisted for the device-mode destination
@@ -13758,12 +13897,11 @@
13758
13897
  }
13759
13898
  }
13760
13899
  }
13761
- });
13762
- } catch (err) {
13763
- handleError({
13764
- message: "[sendToNative]:".concat(err)
13765
- });
13766
- }
13900
+ } catch (err) {
13901
+ err.message = "[sendToNative]::[Destination:".concat(obj.name, "]:: ").concat(err);
13902
+ handleError(err);
13903
+ }
13904
+ });
13767
13905
  } // convert integrations object to server identified names, kind of hack now!
13768
13906
 
13769
13907
 
@@ -13782,20 +13920,20 @@
13782
13920
  key: "utm",
13783
13921
  value: function utm(query) {
13784
13922
  // Remove leading ? if present
13785
- if (query.charAt(0) === "?") {
13923
+ if (query.charAt(0) === '?') {
13786
13924
  query = query.substring(1);
13787
13925
  }
13788
13926
 
13789
- query = query.replace(/\?/g, "&");
13927
+ query = query.replace(/\?/g, '&');
13790
13928
  var param;
13791
13929
  var params = parse$6(query);
13792
13930
  var results = {};
13793
13931
 
13794
13932
  for (var key in params) {
13795
13933
  if (Object.prototype.hasOwnProperty.call(params, key)) {
13796
- if (key.substr(0, 4) === "utm_") {
13934
+ if (key.substr(0, 4) === 'utm_') {
13797
13935
  param = key.substr(4);
13798
- if (param === "campaign") param = "name";
13936
+ if (param === 'campaign') param = 'name';
13799
13937
  results[param] = params[key];
13800
13938
  }
13801
13939
  }
@@ -13813,7 +13951,7 @@
13813
13951
  value: function addCampaignInfo(rudderElement) {
13814
13952
  var msgContext = rudderElement.message.context;
13815
13953
 
13816
- if (msgContext && _typeof(msgContext) === "object") {
13954
+ if (msgContext && _typeof(msgContext) === 'object') {
13817
13955
  var _getDefaultPageProper = getDefaultPageProperties(),
13818
13956
  search = _getDefaultPageProper.search;
13819
13957
 
@@ -13839,18 +13977,18 @@
13839
13977
  properties = _rudderElement$messag.properties;
13840
13978
  this.addCampaignInfo(rudderElement); // assign page properties to context.page
13841
13979
 
13842
- rudderElement.message.context.page = this.getContextPageProperties(type === "page" ? properties : undefined);
13843
- var topLevelElements = ["integrations", "anonymousId", "originalTimestamp"];
13980
+ rudderElement.message.context.page = this.getContextPageProperties(type === 'page' ? properties : undefined);
13981
+ var topLevelElements = ['integrations', 'anonymousId', 'originalTimestamp'];
13844
13982
 
13845
13983
  for (var key in options) {
13846
13984
  if (topLevelElements.includes(key)) {
13847
13985
  rudderElement.message[key] = options[key];
13848
- } else if (key !== "context") {
13986
+ } else if (key !== 'context') {
13849
13987
  rudderElement.message.context = merge(rudderElement.message.context, _defineProperty({}, key, options[key]));
13850
- } else if (_typeof(options[key]) === "object" && options[key] != null) {
13988
+ } else if (_typeof(options[key]) === 'object' && options[key] != null) {
13851
13989
  rudderElement.message.context = merge(rudderElement.message.context, _objectSpread2({}, options[key]));
13852
13990
  } else {
13853
- logger.error("[Analytics: processOptionsParam] context passed in options is not object");
13991
+ logger.error('[Analytics: processOptionsParam] context passed in options is not object');
13854
13992
  }
13855
13993
  }
13856
13994
  }
@@ -13890,15 +14028,16 @@
13890
14028
  }, {
13891
14029
  key: "reset",
13892
14030
  value: function reset(flag) {
14031
+ leaveBreadcrumb("reset API :: flag: ".concat(flag));
13893
14032
  if (!this.loaded) return;
13894
14033
 
13895
14034
  if (flag) {
13896
- this.anonymousId = "";
14035
+ this.anonymousId = '';
13897
14036
  }
13898
14037
 
13899
- this.userId = "";
14038
+ this.userId = '';
13900
14039
  this.userTraits = {};
13901
- this.groupId = "";
14040
+ this.groupId = '';
13902
14041
  this.groupTraits = {};
13903
14042
  this.storage.clear(flag);
13904
14043
  }
@@ -13957,7 +14096,7 @@
13957
14096
  }, {
13958
14097
  key: "isValidWriteKey",
13959
14098
  value: function isValidWriteKey(writeKey) {
13960
- if (!writeKey || typeof writeKey !== "string" || writeKey.trim().length == 0) {
14099
+ if (!writeKey || typeof writeKey !== 'string' || writeKey.trim().length == 0) {
13961
14100
  return false;
13962
14101
  }
13963
14102
 
@@ -13966,7 +14105,7 @@
13966
14105
  }, {
13967
14106
  key: "isValidServerUrl",
13968
14107
  value: function isValidServerUrl(serverUrl) {
13969
- if (!serverUrl || typeof serverUrl !== "string" || serverUrl.trim().length == 0) {
14108
+ if (!serverUrl || typeof serverUrl !== 'string' || serverUrl.trim().length == 0) {
13970
14109
  return false;
13971
14110
  }
13972
14111
 
@@ -13991,16 +14130,13 @@
13991
14130
  }
13992
14131
 
13993
14132
  if (!this.storage || Object.keys(this.storage).length === 0) {
13994
- throw Error("Cannot proceed as no storage is available");
14133
+ throw Error('Cannot proceed as no storage is available');
13995
14134
  }
13996
14135
 
13997
14136
  if (options && options.cookieConsentManager) this.cookieConsentOptions = cloneDeep(options.cookieConsentManager);
13998
14137
 
13999
14138
  if (!this.isValidWriteKey(writeKey) || !this.isValidServerUrl(serverUrl)) {
14000
- handleError({
14001
- message: "[Analytics] load:: Unable to load due to invalid writeKey or serverUrl"
14002
- });
14003
- throw Error("failed to initialize");
14139
+ throw Error('Unable to load the SDK due to invalid writeKey or serverUrl');
14004
14140
  }
14005
14141
 
14006
14142
  var storageOptions = {};
@@ -14029,7 +14165,7 @@
14029
14165
  this.sendAdblockPage = true;
14030
14166
  }
14031
14167
 
14032
- if (options && options.sendAdblockPageOptions && _typeof(options.sendAdblockPageOptions) === "object") {
14168
+ if (options && options.sendAdblockPageOptions && _typeof(options.sendAdblockPageOptions) === 'object') {
14033
14169
  this.sendAdblockPageOptions = options.sendAdblockPageOptions;
14034
14170
  }
14035
14171
 
@@ -14067,9 +14203,9 @@
14067
14203
 
14068
14204
  if (!this.destSDKBaseURL) {
14069
14205
  handleError({
14070
- message: "[Analytics] load:: CDN base URL is not valid"
14206
+ message: '[Analytics] load:: CDN base URL is not valid'
14071
14207
  });
14072
- throw Error("failed to load");
14208
+ throw Error('failed to load');
14073
14209
  }
14074
14210
  } else {
14075
14211
  // Get the CDN base URL from the included 'rudder-analytics.min.js' script tag
@@ -14077,13 +14213,13 @@
14077
14213
  rudderSDK = _checkSDKUrl2.rudderSDK;
14078
14214
 
14079
14215
  if (rudderSDK) {
14080
- this.destSDKBaseURL = rudderSDK.split("/").slice(0, -1).concat(CDN_INT_DIR).join("/");
14216
+ this.destSDKBaseURL = rudderSDK.split('/').slice(0, -1).concat(CDN_INT_DIR).join('/');
14081
14217
  }
14082
14218
  }
14083
14219
 
14084
14220
  if (options && options.getSourceConfig) {
14085
- if (typeof options.getSourceConfig !== "function") {
14086
- handleError('option "getSourceConfig" must be a function');
14221
+ if (typeof options.getSourceConfig !== 'function') {
14222
+ handleError(new Error('option "getSourceConfig" must be a function'));
14087
14223
  } else {
14088
14224
  var res = options.getSourceConfig();
14089
14225
 
@@ -14126,11 +14262,11 @@
14126
14262
  // If not present dynamically load from the polyfill cdn
14127
14263
 
14128
14264
  if (!String.prototype.endsWith || !String.prototype.startsWith || !String.prototype.includes || !Array.prototype.find || !Array.prototype.includes || !Promise || !Object.entries) {
14129
- ScriptLoader("polyfill", POLYFILL_URL);
14265
+ ScriptLoader('polyfill', POLYFILL_URL);
14130
14266
  var self = this;
14131
14267
  var interval = setInterval(function () {
14132
14268
  // check if the polyfill is loaded
14133
- if (window.hasOwnProperty("polyfill")) {
14269
+ if (window.hasOwnProperty('polyfill')) {
14134
14270
  clearInterval(interval);
14135
14271
  self.loadAfterPolyfill(writeKey, serverUrl, options);
14136
14272
  }
@@ -14147,7 +14283,7 @@
14147
14283
  value: function ready(callback) {
14148
14284
  if (!this.loaded) return;
14149
14285
 
14150
- if (typeof callback === "function") {
14286
+ if (typeof callback === 'function') {
14151
14287
  /**
14152
14288
  * If integrations are loaded or no integration is available for loading
14153
14289
  * execute the callback immediately
@@ -14162,7 +14298,7 @@
14162
14298
  return;
14163
14299
  }
14164
14300
 
14165
- logger.error("ready callback is not a function");
14301
+ logger.error('ready callback is not a function');
14166
14302
  }
14167
14303
  }, {
14168
14304
  key: "initializeCallbacks",
@@ -14184,7 +14320,7 @@
14184
14320
  Object.keys(this.methodToCallbackMapping).forEach(function (methodName) {
14185
14321
  if (_this7.methodToCallbackMapping.hasOwnProperty(methodName)) {
14186
14322
  if (window.rudderanalytics) {
14187
- if (typeof window.rudderanalytics[_this7.methodToCallbackMapping[methodName]] === "function") {
14323
+ if (typeof window.rudderanalytics[_this7.methodToCallbackMapping[methodName]] === 'function') {
14188
14324
  _this7.clientSuppliedCallbacks[methodName] = window.rudderanalytics[_this7.methodToCallbackMapping[methodName]];
14189
14325
  }
14190
14326
  } // let callback =
@@ -14215,7 +14351,7 @@
14215
14351
  }, {
14216
14352
  key: "sendSampleRequest",
14217
14353
  value: function sendSampleRequest() {
14218
- ScriptLoader("ad-block", "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js");
14354
+ ScriptLoader('ad-block', '//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js');
14219
14355
  }
14220
14356
  }]);
14221
14357
 
@@ -14243,8 +14379,8 @@
14243
14379
 
14244
14380
  function parseQueryString(query) {
14245
14381
  var queryDefaults = {
14246
- trait: "ajs_trait_",
14247
- prop: "ajs_prop_"
14382
+ trait: 'ajs_trait_',
14383
+ prop: 'ajs_prop_'
14248
14384
  };
14249
14385
 
14250
14386
  function getDataFromQueryObj(qObj, dataType) {
@@ -14260,33 +14396,33 @@
14260
14396
  var queryObject = parse$6(query);
14261
14397
 
14262
14398
  if (queryObject.ajs_aid) {
14263
- instance.toBeProcessedArray.push(["setAnonymousId", queryObject.ajs_aid]);
14399
+ instance.toBeProcessedArray.push(['setAnonymousId', queryObject.ajs_aid]);
14264
14400
  }
14265
14401
 
14266
14402
  if (queryObject.ajs_uid) {
14267
- instance.toBeProcessedArray.push(["identify", queryObject.ajs_uid, getDataFromQueryObj(queryObject, queryDefaults.trait)]);
14403
+ instance.toBeProcessedArray.push(['identify', queryObject.ajs_uid, getDataFromQueryObj(queryObject, queryDefaults.trait)]);
14268
14404
  }
14269
14405
 
14270
14406
  if (queryObject.ajs_event) {
14271
- instance.toBeProcessedArray.push(["track", queryObject.ajs_event, getDataFromQueryObj(queryObject, queryDefaults.prop)]);
14407
+ instance.toBeProcessedArray.push(['track', queryObject.ajs_event, getDataFromQueryObj(queryObject, queryDefaults.prop)]);
14272
14408
  }
14273
14409
  }
14274
14410
 
14275
14411
  Emitter$1(instance);
14276
- window.addEventListener("error", function (e) {
14412
+ window.addEventListener('error', function (e) {
14277
14413
  handleError(e, instance);
14278
14414
  }, true); // initialize supported callbacks
14279
14415
 
14280
14416
  instance.initializeCallbacks(); // register supported callbacks
14281
14417
 
14282
14418
  instance.registerCallbacks(false);
14283
- var defaultMethod = "load";
14419
+ var defaultMethod = 'load';
14284
14420
  var argumentsArray = window.rudderanalytics;
14285
14421
  var isValidArgsArray = Array.isArray(argumentsArray);
14286
14422
 
14287
14423
  if (isValidArgsArray) {
14288
14424
  /**
14289
- * Iterate the buffered API calls until we find load call and
14425
+ * Iterate the buffered API calls until we find load call and
14290
14426
  * queue it first for processing
14291
14427
  */
14292
14428
  var i = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rudder-sdk-js",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "description": "RudderStack Javascript SDK",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",