mixpanel-browser 2.47.0 → 2.48.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.
@@ -3,7 +3,7 @@
3
3
 
4
4
  var Config = {
5
5
  DEBUG: false,
6
- LIB_VERSION: '2.47.0'
6
+ LIB_VERSION: '2.48.1'
7
7
  };
8
8
 
9
9
  // since es6 imports are static and we run unit tests from the console, window won't be defined when importing this file
@@ -905,6 +905,7 @@
905
905
  'baiduspider',
906
906
  'bingbot',
907
907
  'bingpreview',
908
+ 'chrome-lighthouse',
908
909
  'facebookexternal',
909
910
  'petalbot',
910
911
  'pinterest',
@@ -3133,7 +3134,7 @@
3133
3134
  return this._mixpanel._track_or_batch({
3134
3135
  type: 'groups',
3135
3136
  data: date_encoded_data,
3136
- endpoint: this._get_config('api_host') + '/groups/',
3137
+ endpoint: this._get_config('api_host') + '/' + this._get_config('api_routes')['groups'],
3137
3138
  batcher: this._mixpanel.request_batchers.groups
3138
3139
  }, callback);
3139
3140
  };
@@ -3494,7 +3495,7 @@
3494
3495
  return this._mixpanel._track_or_batch({
3495
3496
  type: 'people',
3496
3497
  data: date_encoded_data,
3497
- endpoint: this._get_config('api_host') + '/engage/',
3498
+ endpoint: this._get_config('api_host') + '/' + this._get_config('api_routes')['engage'],
3498
3499
  batcher: this._mixpanel.request_batchers.people
3499
3500
  }, callback);
3500
3501
  };
@@ -3530,11 +3531,12 @@
3530
3531
 
3531
3532
  MixpanelPeople.prototype._flush_one_queue = function(action, action_method, callback, queue_to_params_fn) {
3532
3533
  var _this = this;
3533
- var queued_data = _.extend({}, this._mixpanel['persistence']._get_queue(action));
3534
+ var queued_data = _.extend({}, this._mixpanel['persistence'].load_queue(action));
3534
3535
  var action_params = queued_data;
3535
3536
 
3536
3537
  if (!_.isUndefined(queued_data) && _.isObject(queued_data) && !_.isEmptyObject(queued_data)) {
3537
3538
  _this._mixpanel['persistence']._pop_from_people_queue(action, queued_data);
3539
+ _this._mixpanel['persistence'].save();
3538
3540
  if (queue_to_params_fn) {
3539
3541
  action_params = queue_to_params_fn(queued_data);
3540
3542
  }
@@ -3556,8 +3558,6 @@
3556
3558
  _set_callback, _add_callback, _append_callback, _set_once_callback, _union_callback, _unset_callback, _remove_callback
3557
3559
  ) {
3558
3560
  var _this = this;
3559
- var $append_queue = this._mixpanel['persistence']._get_queue(APPEND_ACTION);
3560
- var $remove_queue = this._mixpanel['persistence']._get_queue(REMOVE_ACTION);
3561
3561
 
3562
3562
  this._flush_one_queue(SET_ACTION, this.set, _set_callback);
3563
3563
  this._flush_one_queue(SET_ONCE_ACTION, this.set_once, _set_once_callback);
@@ -3567,6 +3567,7 @@
3567
3567
 
3568
3568
  // we have to fire off each $append individually since there is
3569
3569
  // no concat method server side
3570
+ var $append_queue = this._mixpanel['persistence'].load_queue(APPEND_ACTION);
3570
3571
  if (!_.isUndefined($append_queue) && _.isArray($append_queue) && $append_queue.length) {
3571
3572
  var $append_item;
3572
3573
  var append_callback = function(response, data) {
@@ -3578,16 +3579,17 @@
3578
3579
  }
3579
3580
  };
3580
3581
  for (var i = $append_queue.length - 1; i >= 0; i--) {
3582
+ $append_queue = this._mixpanel['persistence'].load_queue(APPEND_ACTION);
3581
3583
  $append_item = $append_queue.pop();
3584
+ _this._mixpanel['persistence'].save();
3582
3585
  if (!_.isEmptyObject($append_item)) {
3583
3586
  _this.append($append_item, append_callback);
3584
3587
  }
3585
3588
  }
3586
- // Save the shortened append queue
3587
- _this._mixpanel['persistence'].save();
3588
3589
  }
3589
3590
 
3590
3591
  // same for $remove
3592
+ var $remove_queue = this._mixpanel['persistence'].load_queue(REMOVE_ACTION);
3591
3593
  if (!_.isUndefined($remove_queue) && _.isArray($remove_queue) && $remove_queue.length) {
3592
3594
  var $remove_item;
3593
3595
  var remove_callback = function(response, data) {
@@ -3599,12 +3601,13 @@
3599
3601
  }
3600
3602
  };
3601
3603
  for (var j = $remove_queue.length - 1; j >= 0; j--) {
3604
+ $remove_queue = this._mixpanel['persistence'].load_queue(REMOVE_ACTION);
3602
3605
  $remove_item = $remove_queue.pop();
3606
+ _this._mixpanel['persistence'].save();
3603
3607
  if (!_.isEmptyObject($remove_item)) {
3604
3608
  _this.remove($remove_item, remove_callback);
3605
3609
  }
3606
3610
  }
3607
- _this._mixpanel['persistence'].save();
3608
3611
  }
3609
3612
  };
3610
3613
 
@@ -3686,6 +3689,9 @@
3686
3689
 
3687
3690
  MixpanelPersistence.prototype.properties = function() {
3688
3691
  var p = {};
3692
+
3693
+ this.load();
3694
+
3689
3695
  // Filter out reserved properties
3690
3696
  _.each(this['props'], function(v, k) {
3691
3697
  if (!_.include(RESERVED_PROPERTIES, k)) {
@@ -3762,6 +3768,7 @@
3762
3768
 
3763
3769
  MixpanelPersistence.prototype.save = function() {
3764
3770
  if (this.disabled) { return; }
3771
+
3765
3772
  this.storage.set(
3766
3773
  this.name,
3767
3774
  _.JSONEncode(this['props']),
@@ -3773,6 +3780,11 @@
3773
3780
  );
3774
3781
  };
3775
3782
 
3783
+ MixpanelPersistence.prototype.load_prop = function(key) {
3784
+ this.load();
3785
+ return this['props'][key];
3786
+ };
3787
+
3776
3788
  MixpanelPersistence.prototype.remove = function() {
3777
3789
  // remove both domain and subdomain cookies
3778
3790
  this.storage.remove(this.name, false, this.cookie_domain);
@@ -3796,6 +3808,8 @@
3796
3808
  if (typeof(default_value) === 'undefined') { default_value = 'None'; }
3797
3809
  this.expire_days = (typeof(days) === 'undefined') ? this.default_expiry : days;
3798
3810
 
3811
+ this.load();
3812
+
3799
3813
  _.each(props, function(val, prop) {
3800
3814
  if (!this['props'].hasOwnProperty(prop) || this['props'][prop] === default_value) {
3801
3815
  this['props'][prop] = val;
@@ -3817,8 +3831,8 @@
3817
3831
  if (_.isObject(props)) {
3818
3832
  this.expire_days = (typeof(days) === 'undefined') ? this.default_expiry : days;
3819
3833
 
3834
+ this.load();
3820
3835
  _.extend(this['props'], props);
3821
-
3822
3836
  this.save();
3823
3837
 
3824
3838
  return true;
@@ -3827,6 +3841,7 @@
3827
3841
  };
3828
3842
 
3829
3843
  MixpanelPersistence.prototype.unregister = function(prop) {
3844
+ this.load();
3830
3845
  if (prop in this['props']) {
3831
3846
  delete this['props'][prop];
3832
3847
  this.save();
@@ -3853,19 +3868,6 @@
3853
3868
  });
3854
3869
  };
3855
3870
 
3856
- // safely fills the passed in object with stored properties,
3857
- // does not override any properties defined in both
3858
- // returns the passed in object
3859
- MixpanelPersistence.prototype.safe_merge = function(props) {
3860
- _.each(this['props'], function(val, prop) {
3861
- if (!(prop in props)) {
3862
- props[prop] = val;
3863
- }
3864
- });
3865
-
3866
- return props;
3867
- };
3868
-
3869
3871
  MixpanelPersistence.prototype.update_config = function(config) {
3870
3872
  this.default_expiry = this.expire_days = config['cookie_expiration'];
3871
3873
  this.set_disabled(config['disable_persistence']);
@@ -4009,7 +4011,7 @@
4009
4011
  };
4010
4012
 
4011
4013
  MixpanelPersistence.prototype._pop_from_people_queue = function(queue, data) {
4012
- var q = this._get_queue(queue);
4014
+ var q = this['props'][this._get_queue_key(queue)];
4013
4015
  if (!_.isUndefined(q)) {
4014
4016
  _.each(data, function(v, k) {
4015
4017
  if (queue === APPEND_ACTION || queue === REMOVE_ACTION) {
@@ -4025,11 +4027,13 @@
4025
4027
  delete q[k];
4026
4028
  }
4027
4029
  }, this);
4028
-
4029
- this.save();
4030
4030
  }
4031
4031
  };
4032
4032
 
4033
+ MixpanelPersistence.prototype.load_queue = function(queue) {
4034
+ return this.load_prop(this._get_queue_key(queue));
4035
+ };
4036
+
4033
4037
  MixpanelPersistence.prototype._get_queue_key = function(queue) {
4034
4038
  if (queue === SET_ACTION) {
4035
4039
  return SET_QUEUE_KEY;
@@ -4050,25 +4054,21 @@
4050
4054
  }
4051
4055
  };
4052
4056
 
4053
- MixpanelPersistence.prototype._get_queue = function(queue) {
4054
- return this['props'][this._get_queue_key(queue)];
4055
- };
4056
4057
  MixpanelPersistence.prototype._get_or_create_queue = function(queue, default_val) {
4057
4058
  var key = this._get_queue_key(queue);
4058
4059
  default_val = _.isUndefined(default_val) ? {} : default_val;
4059
-
4060
4060
  return this['props'][key] || (this['props'][key] = default_val);
4061
4061
  };
4062
4062
 
4063
4063
  MixpanelPersistence.prototype.set_event_timer = function(event_name, timestamp) {
4064
- var timers = this['props'][EVENT_TIMERS_KEY] || {};
4064
+ var timers = this.load_prop(EVENT_TIMERS_KEY) || {};
4065
4065
  timers[event_name] = timestamp;
4066
4066
  this['props'][EVENT_TIMERS_KEY] = timers;
4067
4067
  this.save();
4068
4068
  };
4069
4069
 
4070
4070
  MixpanelPersistence.prototype.remove_event_timer = function(event_name) {
4071
- var timers = this['props'][EVENT_TIMERS_KEY] || {};
4071
+ var timers = this.load_prop(EVENT_TIMERS_KEY) || {};
4072
4072
  var timestamp = timers[event_name];
4073
4073
  if (!_.isUndefined(timestamp)) {
4074
4074
  delete this['props'][EVENT_TIMERS_KEY][event_name];
@@ -4139,11 +4139,18 @@
4139
4139
  };
4140
4140
  }
4141
4141
 
4142
+ var DEFAULT_API_ROUTES = {
4143
+ 'track': 'track/',
4144
+ 'engage': 'engage/',
4145
+ 'groups': 'groups/'
4146
+ };
4147
+
4142
4148
  /*
4143
4149
  * Module-level globals
4144
4150
  */
4145
4151
  var DEFAULT_CONFIG = {
4146
4152
  'api_host': 'https://api-js.mixpanel.com',
4153
+ 'api_routes': DEFAULT_API_ROUTES,
4147
4154
  'api_method': 'POST',
4148
4155
  'api_transport': 'XHR',
4149
4156
  'api_payload_format': PAYLOAD_TYPE_BASE64,
@@ -4342,6 +4349,10 @@
4342
4349
  if (!_.localStorage.is_supported(true) || !USE_XHR) {
4343
4350
  this._batch_requests = false;
4344
4351
  console.log('Turning off Mixpanel request-queueing; needs XHR and localStorage support');
4352
+ _.each(this.get_batcher_configs(), function(batcher_config) {
4353
+ console.log('Clearing batch queue ' + batcher_config.queue_key);
4354
+ _.localStorage.remove(batcher_config.queue_key);
4355
+ });
4345
4356
  } else {
4346
4357
  this.init_batchers();
4347
4358
  if (sendBeacon && window$1.addEventListener) {
@@ -4406,7 +4417,7 @@
4406
4417
  MixpanelLib.prototype._set_default_superprops = function() {
4407
4418
  this['persistence'].update_search_keyword(document$1.referrer);
4408
4419
  if (this.get_config('store_google')) {
4409
- this.register(_.info.campaignParams(), {persistent: false});
4420
+ this.register(_.info.campaignParams());
4410
4421
  }
4411
4422
  if (this.get_config('save_referrer')) {
4412
4423
  this['persistence'].update_referrer_info(document$1.referrer);
@@ -4689,12 +4700,22 @@
4689
4700
  return !!this.request_batchers.events;
4690
4701
  };
4691
4702
 
4703
+ MixpanelLib.prototype.get_batcher_configs = function() {
4704
+ var queue_prefix = '__mpq_' + this.get_config('token');
4705
+ var api_routes = this.get_config('api_routes');
4706
+ this._batcher_configs = this._batcher_configs || {
4707
+ events: {type: 'events', endpoint: '/' + api_routes['track'], queue_key: queue_prefix + '_ev'},
4708
+ people: {type: 'people', endpoint: '/' + api_routes['engage'], queue_key: queue_prefix + '_pp'},
4709
+ groups: {type: 'groups', endpoint: '/' + api_routes['groups'], queue_key: queue_prefix + '_gr'}
4710
+ };
4711
+ return this._batcher_configs;
4712
+ };
4713
+
4692
4714
  MixpanelLib.prototype.init_batchers = function() {
4693
- var token = this.get_config('token');
4694
4715
  if (!this.are_batchers_initialized()) {
4695
4716
  var batcher_for = _.bind(function(attrs) {
4696
4717
  return new RequestBatcher(
4697
- '__mpq_' + token + attrs.queue_suffix,
4718
+ attrs.queue_key,
4698
4719
  {
4699
4720
  libConfig: this['config'],
4700
4721
  sendRequestFunc: _.bind(function(data, options, cb) {
@@ -4713,10 +4734,11 @@
4713
4734
  }
4714
4735
  );
4715
4736
  }, this);
4737
+ var batcher_configs = this.get_batcher_configs();
4716
4738
  this.request_batchers = {
4717
- events: batcher_for({type: 'events', endpoint: '/track/', queue_suffix: '_ev'}),
4718
- people: batcher_for({type: 'people', endpoint: '/engage/', queue_suffix: '_pp'}),
4719
- groups: batcher_for({type: 'groups', endpoint: '/groups/', queue_suffix: '_gr'})
4739
+ events: batcher_for(batcher_configs.events),
4740
+ people: batcher_for(batcher_configs.people),
4741
+ groups: batcher_for(batcher_configs.groups)
4720
4742
  };
4721
4743
  }
4722
4744
  if (this.get_config('batch_autostart')) {
@@ -4725,6 +4747,7 @@
4725
4747
  };
4726
4748
 
4727
4749
  MixpanelLib.prototype.start_batch_senders = function() {
4750
+ this._batchers_were_started = true;
4728
4751
  if (this.are_batchers_initialized()) {
4729
4752
  this._batch_requests = true;
4730
4753
  _.each(this.request_batchers, function(batcher) {
@@ -4876,7 +4899,7 @@
4876
4899
  }
4877
4900
 
4878
4901
  // set defaults
4879
- properties = properties || {};
4902
+ properties = _.extend({}, properties);
4880
4903
  properties['token'] = this.get_config('token');
4881
4904
 
4882
4905
  // set $duration if time_event was previously called for this event
@@ -4922,7 +4945,7 @@
4922
4945
  var ret = this._track_or_batch({
4923
4946
  type: 'events',
4924
4947
  data: data,
4925
- endpoint: this.get_config('api_host') + '/track/',
4948
+ endpoint: this.get_config('api_host') + '/' + this.get_config('api_routes')['track'],
4926
4949
  batcher: this.request_batchers.events,
4927
4950
  should_send_immediately: should_send_immediately,
4928
4951
  send_request_options: options
@@ -4968,13 +4991,14 @@
4968
4991
  */
4969
4992
  MixpanelLib.prototype.add_group = addOptOutCheckMixpanelLib(function(group_key, group_id, callback) {
4970
4993
  var old_values = this.get_property(group_key);
4994
+ var prop = {};
4971
4995
  if (old_values === undefined) {
4972
- var prop = {};
4973
4996
  prop[group_key] = [group_id];
4974
4997
  this.register(prop);
4975
4998
  } else {
4976
4999
  if (old_values.indexOf(group_id) === -1) {
4977
5000
  old_values.push(group_id);
5001
+ prop[group_key] = old_values;
4978
5002
  this.register(prop);
4979
5003
  }
4980
5004
  }
@@ -5519,6 +5543,16 @@
5519
5543
  * The default config is:
5520
5544
  *
5521
5545
  * {
5546
+ * // host for requests (customizable for e.g. a local proxy)
5547
+ * api_host: 'https://api-js.mixpanel.com',
5548
+ *
5549
+ * // endpoints for different types of requests
5550
+ * api_routes: {
5551
+ * track: 'track/',
5552
+ * engage: 'engage/',
5553
+ * groups: 'groups/',
5554
+ * }
5555
+ *
5522
5556
  * // HTTP method for tracking requests
5523
5557
  * api_method: 'POST'
5524
5558
  *
@@ -5702,7 +5736,7 @@
5702
5736
  * @param {String} property_name The name of the super property you want to retrieve
5703
5737
  */
5704
5738
  MixpanelLib.prototype.get_property = function(property_name) {
5705
- return this['persistence']['props'][property_name];
5739
+ return this['persistence'].load_prop([property_name]);
5706
5740
  };
5707
5741
 
5708
5742
  MixpanelLib.prototype.toString = function() {
@@ -5775,9 +5809,13 @@
5775
5809
  }
5776
5810
 
5777
5811
  if (disabled) {
5778
- _.each(this.request_batchers, function(batcher) {
5779
- batcher.clear();
5780
- });
5812
+ this.stop_batch_senders();
5813
+ } else {
5814
+ // only start batchers after opt-in if they have previously been started
5815
+ // in order to avoid unintentionally starting up batching for the first time
5816
+ if (this._batchers_were_started) {
5817
+ this.start_batch_senders();
5818
+ }
5781
5819
  }
5782
5820
  };
5783
5821
 
@@ -5979,37 +6017,38 @@
5979
6017
  // EXPORTS (for closure compiler)
5980
6018
 
5981
6019
  // MixpanelLib Exports
5982
- MixpanelLib.prototype['init'] = MixpanelLib.prototype.init;
5983
- MixpanelLib.prototype['reset'] = MixpanelLib.prototype.reset;
5984
- MixpanelLib.prototype['disable'] = MixpanelLib.prototype.disable;
5985
- MixpanelLib.prototype['time_event'] = MixpanelLib.prototype.time_event;
5986
- MixpanelLib.prototype['track'] = MixpanelLib.prototype.track;
5987
- MixpanelLib.prototype['track_links'] = MixpanelLib.prototype.track_links;
5988
- MixpanelLib.prototype['track_forms'] = MixpanelLib.prototype.track_forms;
5989
- MixpanelLib.prototype['track_pageview'] = MixpanelLib.prototype.track_pageview;
5990
- MixpanelLib.prototype['register'] = MixpanelLib.prototype.register;
5991
- MixpanelLib.prototype['register_once'] = MixpanelLib.prototype.register_once;
5992
- MixpanelLib.prototype['unregister'] = MixpanelLib.prototype.unregister;
5993
- MixpanelLib.prototype['identify'] = MixpanelLib.prototype.identify;
5994
- MixpanelLib.prototype['alias'] = MixpanelLib.prototype.alias;
5995
- MixpanelLib.prototype['name_tag'] = MixpanelLib.prototype.name_tag;
5996
- MixpanelLib.prototype['set_config'] = MixpanelLib.prototype.set_config;
5997
- MixpanelLib.prototype['get_config'] = MixpanelLib.prototype.get_config;
5998
- MixpanelLib.prototype['get_property'] = MixpanelLib.prototype.get_property;
5999
- MixpanelLib.prototype['get_distinct_id'] = MixpanelLib.prototype.get_distinct_id;
6000
- MixpanelLib.prototype['toString'] = MixpanelLib.prototype.toString;
6001
- MixpanelLib.prototype['opt_out_tracking'] = MixpanelLib.prototype.opt_out_tracking;
6002
- MixpanelLib.prototype['opt_in_tracking'] = MixpanelLib.prototype.opt_in_tracking;
6003
- MixpanelLib.prototype['has_opted_out_tracking'] = MixpanelLib.prototype.has_opted_out_tracking;
6004
- MixpanelLib.prototype['has_opted_in_tracking'] = MixpanelLib.prototype.has_opted_in_tracking;
6005
- MixpanelLib.prototype['clear_opt_in_out_tracking'] = MixpanelLib.prototype.clear_opt_in_out_tracking;
6006
- MixpanelLib.prototype['get_group'] = MixpanelLib.prototype.get_group;
6007
- MixpanelLib.prototype['set_group'] = MixpanelLib.prototype.set_group;
6008
- MixpanelLib.prototype['add_group'] = MixpanelLib.prototype.add_group;
6009
- MixpanelLib.prototype['remove_group'] = MixpanelLib.prototype.remove_group;
6010
- MixpanelLib.prototype['track_with_groups'] = MixpanelLib.prototype.track_with_groups;
6011
- MixpanelLib.prototype['start_batch_senders'] = MixpanelLib.prototype.start_batch_senders;
6012
- MixpanelLib.prototype['stop_batch_senders'] = MixpanelLib.prototype.stop_batch_senders;
6020
+ MixpanelLib.prototype['init'] = MixpanelLib.prototype.init;
6021
+ MixpanelLib.prototype['reset'] = MixpanelLib.prototype.reset;
6022
+ MixpanelLib.prototype['disable'] = MixpanelLib.prototype.disable;
6023
+ MixpanelLib.prototype['time_event'] = MixpanelLib.prototype.time_event;
6024
+ MixpanelLib.prototype['track'] = MixpanelLib.prototype.track;
6025
+ MixpanelLib.prototype['track_links'] = MixpanelLib.prototype.track_links;
6026
+ MixpanelLib.prototype['track_forms'] = MixpanelLib.prototype.track_forms;
6027
+ MixpanelLib.prototype['track_pageview'] = MixpanelLib.prototype.track_pageview;
6028
+ MixpanelLib.prototype['register'] = MixpanelLib.prototype.register;
6029
+ MixpanelLib.prototype['register_once'] = MixpanelLib.prototype.register_once;
6030
+ MixpanelLib.prototype['unregister'] = MixpanelLib.prototype.unregister;
6031
+ MixpanelLib.prototype['identify'] = MixpanelLib.prototype.identify;
6032
+ MixpanelLib.prototype['alias'] = MixpanelLib.prototype.alias;
6033
+ MixpanelLib.prototype['name_tag'] = MixpanelLib.prototype.name_tag;
6034
+ MixpanelLib.prototype['set_config'] = MixpanelLib.prototype.set_config;
6035
+ MixpanelLib.prototype['get_config'] = MixpanelLib.prototype.get_config;
6036
+ MixpanelLib.prototype['get_property'] = MixpanelLib.prototype.get_property;
6037
+ MixpanelLib.prototype['get_distinct_id'] = MixpanelLib.prototype.get_distinct_id;
6038
+ MixpanelLib.prototype['toString'] = MixpanelLib.prototype.toString;
6039
+ MixpanelLib.prototype['opt_out_tracking'] = MixpanelLib.prototype.opt_out_tracking;
6040
+ MixpanelLib.prototype['opt_in_tracking'] = MixpanelLib.prototype.opt_in_tracking;
6041
+ MixpanelLib.prototype['has_opted_out_tracking'] = MixpanelLib.prototype.has_opted_out_tracking;
6042
+ MixpanelLib.prototype['has_opted_in_tracking'] = MixpanelLib.prototype.has_opted_in_tracking;
6043
+ MixpanelLib.prototype['clear_opt_in_out_tracking'] = MixpanelLib.prototype.clear_opt_in_out_tracking;
6044
+ MixpanelLib.prototype['get_group'] = MixpanelLib.prototype.get_group;
6045
+ MixpanelLib.prototype['set_group'] = MixpanelLib.prototype.set_group;
6046
+ MixpanelLib.prototype['add_group'] = MixpanelLib.prototype.add_group;
6047
+ MixpanelLib.prototype['remove_group'] = MixpanelLib.prototype.remove_group;
6048
+ MixpanelLib.prototype['track_with_groups'] = MixpanelLib.prototype.track_with_groups;
6049
+ MixpanelLib.prototype['start_batch_senders'] = MixpanelLib.prototype.start_batch_senders;
6050
+ MixpanelLib.prototype['stop_batch_senders'] = MixpanelLib.prototype.stop_batch_senders;
6051
+ MixpanelLib.prototype['DEFAULT_API_ROUTES'] = DEFAULT_API_ROUTES;
6013
6052
 
6014
6053
  // MixpanelPersistence Exports
6015
6054
  MixpanelPersistence.prototype['properties'] = MixpanelPersistence.prototype.properties;