@constructor-io/constructorio-client-javascript 2.22.0 → 2.25.3

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/README.md CHANGED
@@ -3,14 +3,19 @@
3
3
  [![npm](https://img.shields.io/npm/v/@constructor-io/constructorio-client-javascript)](https://www.npmjs.com/package/@constructor-io/constructorio-client-javascript)
4
4
  [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/Constructor-io/constructorio-client-javascript/blob/master/LICENSE)
5
5
  [![Minzipped Size](https://img.shields.io/bundlephobia/minzip/@constructor-io/constructorio-client-javascript)](https://bundlephobia.com/result?p=@constructor-io/constructorio-client-javascript)
6
- [![Dependencies](https://img.shields.io/david/Constructor-io/constructorio-client-javascript)](https://david-dm.org/constructor-io/constructorio-client-javascript)
7
6
 
8
7
  A JavaScript client for [Constructor.io](http://constructor.io/). [Constructor.io](http://constructor.io/) provides search as a service that optimizes results using artificial intelligence (including natural language processing, re-ranking to optimize for conversions, and user personalization).
9
8
 
9
+ > This client is intended for use in a browser environment but can also be used in React Native based mobile applications. Additional information about utilization in a React Native context can be found on the [Wiki](https://github.com/Constructor-io/constructorio-client-javascript/wiki/Utilization-in-a-DOM-less-environment). If you want a JavaScript client for server side integrations please use [@constructor-io/constructorio-node](https://github.com/Constructor-io/constructorio-node)
10
+
10
11
  ## 1. Install
11
12
 
12
13
  This package can be installed via npm: `npm i @constructor-io/constructorio-client-javascript`. Once installed, simply import or require the package into your repository.
13
14
 
15
+ Alternatively, a bundled version consisting of a single JavaScript file is published within the `./dist` folder on Github. This can be utilized within a browser context if hosted locally - _please do not link directly to the Github hosted version_.
16
+
17
+ **Important**: this library should only be used in a client-side context where standard HTTP request headers are populated by the client (`User-Agent`, `Referer`, etc.).
18
+
14
19
  ## 2. Retrieve an API key
15
20
 
16
21
  You can find this in your [Constructor.io dashboard](https://constructor.io/dashboard). Contact sales if you'd like to sign up, or support if you believe your company already has an account.
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable camelcase, no-unneeded-ternary, max-len */
10
10
  var ConstructorioID = require('@constructor-io/constructorio-id'); // Modules
@@ -33,35 +33,34 @@ var _require = require('../package.json'),
33
33
 
34
34
  var ConstructorIO = /*#__PURE__*/function () {
35
35
  /**
36
- * @param {string} apiKey - Constructor.io API key
37
- * @param {string} [serviceUrl='https://ac.cnstrc.com'] - API URL endpoint
38
- * @param {array} [segments] - User segments
39
- * @param {object} [testCells] - User test cells
40
- * @param {string} [clientId] - Client ID, defaults to value supplied by 'constructorio-id' module
41
- * @param {string} [sessionId] - Session ID, defaults to value supplied by 'constructorio-id' module
42
- * @param {string} [userId] - User ID
43
- * @param {function} [fetch] - If supplied, will be utilized for requests rather than default Fetch API
44
- * @param {number} [trackingSendDelay=250] - Amount of time to wait before sending tracking events (in ms)
45
- * @param {boolean} [sendReferrerWithTrackingEvents=true] - Indicates if the referrer is sent with tracking events
46
- * @param {boolean} [sendTrackingEvents=false] - Indicates if tracking events should be dispatched
47
- * @param {object} [idOptions] - Options object to be supplied to 'constructorio-id' module
48
- * @param {object} [eventDispatcher] - Options related to 'EventDispatcher' class
49
- * @param {boolean} [eventDispatcher.enabled=true] - Determine if events should be dispatched
50
- * @param {boolean} [eventDispatcher.waitForBeacon=true] - Wait for beacon before dispatching events
51
- * @param {object} [networkParameters] - Parameters relevant to network requests
52
- * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds) - may be overridden within individual method calls
53
- * @property {object} [search] - Interface to {@link module:search}
54
- * @property {object} [browse] - Interface to {@link module:browse}
55
- * @property {object} [autocomplete] - Interface to {@link module:autocomplete}
56
- * @property {object} [recommendations] - Interface to {@link module:recommendations}
57
- * @property {object} [tracker] - Interface to {@link module:tracker}
36
+ * @param {object} parameters - Parameters for client instantiation
37
+ * @param {string} parameters.apiKey - Constructor.io API key
38
+ * @param {string} [parameters.serviceUrl='https://ac.cnstrc.com'] - API URL endpoint
39
+ * @param {array} [parameters.segments] - User segments
40
+ * @param {object} [parameters.testCells] - User test cells
41
+ * @param {string} [parameters.clientId] - Client ID, defaults to value supplied by 'constructorio-id' module
42
+ * @param {string} [parameters.sessionId] - Session ID, defaults to value supplied by 'constructorio-id' module
43
+ * @param {string} [parameters.userId] - User ID
44
+ * @param {function} [parameters.fetch] - If supplied, will be utilized for requests rather than default Fetch API
45
+ * @param {number} [parameters.trackingSendDelay=250] - Amount of time to wait before sending tracking events (in ms)
46
+ * @param {boolean} [parameters.sendReferrerWithTrackingEvents=true] - Indicates if the referrer is sent with tracking events
47
+ * @param {boolean} [parameters.sendTrackingEvents=false] - Indicates if tracking events should be dispatched
48
+ * @param {object} [parameters.idOptions] - Options object to be supplied to 'constructorio-id' module
49
+ * @param {object} [parameters.eventDispatcher] - Options related to 'EventDispatcher' class
50
+ * @param {boolean} [parameters.eventDispatcher.enabled=true] - Determine if events should be dispatched
51
+ * @param {boolean} [parameters.eventDispatcher.waitForBeacon=true] - Wait for beacon before dispatching events
52
+ * @param {object} [parameters.networkParameters] - Parameters relevant to network requests
53
+ * @param {number} [parameters.networkParameters.timeout] - Request timeout (in milliseconds) - may be overridden within individual method calls
54
+ * @property {object} search - Interface to {@link module:search}
55
+ * @property {object} browse - Interface to {@link module:browse}
56
+ * @property {object} autocomplete - Interface to {@link module:autocomplete}
57
+ * @property {object} recommendations - Interface to {@link module:recommendations}
58
+ * @property {object} tracker - Interface to {@link module:tracker}
58
59
  * @returns {class}
59
60
  */
60
61
  function ConstructorIO() {
61
62
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
62
-
63
- _classCallCheck(this, ConstructorIO);
64
-
63
+ (0, _classCallCheck2["default"])(this, ConstructorIO);
65
64
  var canUseDOM = helpers.canUseDOM();
66
65
  var apiKey = options.apiKey,
67
66
  version = options.version,
@@ -106,8 +105,8 @@ var ConstructorIO = /*#__PURE__*/function () {
106
105
 
107
106
  this.options = {
108
107
  apiKey: apiKey,
109
- version: version || global.CLIENT_VERSION || "ciojs-client-".concat(canUseDOM ? '' : 'domless-').concat(packageVersion),
110
- serviceUrl: serviceUrl || 'https://ac.cnstrc.com',
108
+ version: version || typeof global !== 'undefined' && global.CLIENT_VERSION || "ciojs-client-".concat(canUseDOM ? '' : 'domless-').concat(process.env.BUNDLED ? 'bundled-' : '').concat(packageVersion),
109
+ serviceUrl: serviceUrl && serviceUrl.replace(/\/$/, '') || 'https://ac.cnstrc.com',
111
110
  sessionId: sessionId || session_id,
112
111
  clientId: clientId || client_id,
113
112
  userId: userId,
@@ -141,7 +140,7 @@ var ConstructorIO = /*#__PURE__*/function () {
141
140
  */
142
141
 
143
142
 
144
- _createClass(ConstructorIO, [{
143
+ (0, _createClass2["default"])(ConstructorIO, [{
145
144
  key: "setClientOptions",
146
145
  value: function setClientOptions(options) {
147
146
  if (Object.keys(options).length) {
@@ -168,10 +167,14 @@ var ConstructorIO = /*#__PURE__*/function () {
168
167
  }
169
168
  }
170
169
  }]);
171
-
172
170
  return ConstructorIO;
173
171
  }(); // Exposed for testing
174
172
 
175
173
 
176
- ConstructorIO.Tracker = Tracker;
174
+ ConstructorIO.Tracker = Tracker; // Expose on window object if available
175
+
176
+ if (helpers.canUseDOM()) {
177
+ window.ConstructorioClient = ConstructorIO;
178
+ }
179
+
177
180
  module.exports = ConstructorIO;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable object-curly-newline, no-underscore-dangle */
10
10
  var qs = require('qs');
@@ -104,8 +104,7 @@ function createAutocompleteUrl(query, parameters, options) {
104
104
 
105
105
  var Autocomplete = /*#__PURE__*/function () {
106
106
  function Autocomplete(options) {
107
- _classCallCheck(this, Autocomplete);
108
-
107
+ (0, _classCallCheck2["default"])(this, Autocomplete);
109
108
  this.options = options || {};
110
109
  this.eventDispatcher = new EventDispatcher(options.eventDispatcher);
111
110
  }
@@ -137,7 +136,7 @@ var Autocomplete = /*#__PURE__*/function () {
137
136
  */
138
137
 
139
138
 
140
- _createClass(Autocomplete, [{
139
+ (0, _createClass2["default"])(Autocomplete, [{
141
140
  key: "getAutocompleteResults",
142
141
  value: function getAutocompleteResults(query, parameters) {
143
142
  var _this = this;
@@ -192,7 +191,6 @@ var Autocomplete = /*#__PURE__*/function () {
192
191
  });
193
192
  }
194
193
  }]);
195
-
196
194
  return Autocomplete;
197
195
  }();
198
196
 
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
 
11
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
12
12
 
13
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
13
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
14
14
 
15
15
  /* eslint-disable object-curly-newline, no-underscore-dangle */
16
16
  var qs = require('qs');
@@ -133,7 +133,7 @@ function createBrowseUrlFromFilter(filterName, filterValue, parameters, options)
133
133
  function createBrowseUrlFromIDs(ids, parameters, options) {
134
134
  var serviceUrl = options.serviceUrl; // Validate id's are provided
135
135
 
136
- if (!ids || !(ids instanceof Array) || !ids.length) {
136
+ if (!ids || !Array.isArray(ids) || !ids.length) {
137
137
  throw new Error('ids is a required parameter of type array');
138
138
  }
139
139
 
@@ -173,8 +173,7 @@ function createBrowseUrlForFacets(parameters, options) {
173
173
 
174
174
  var Browse = /*#__PURE__*/function () {
175
175
  function Browse(options) {
176
- _classCallCheck(this, Browse);
177
-
176
+ (0, _classCallCheck2["default"])(this, Browse);
178
177
  this.options = options || {};
179
178
  this.eventDispatcher = new EventDispatcher(options.eventDispatcher);
180
179
  }
@@ -207,7 +206,7 @@ var Browse = /*#__PURE__*/function () {
207
206
  */
208
207
 
209
208
 
210
- _createClass(Browse, [{
209
+ (0, _createClass2["default"])(Browse, [{
211
210
  key: "getBrowseResults",
212
211
  value: function getBrowseResults(filterName, filterValue, parameters) {
213
212
  var _this = this;
@@ -391,6 +390,8 @@ var Browse = /*#__PURE__*/function () {
391
390
  * @param {object} [parameters] - Additional parameters to refine result set
392
391
  * @param {number} [parameters.page] - The page number of the results
393
392
  * @param {number} [parameters.resultsPerPage] - The number of results per page to return
393
+ * @param {object} [networkParameters] - Parameters relevant to the network request
394
+ * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
394
395
  * @returns {Promise}
395
396
  * @see https://docs.constructor.io/rest_api/browse/facets
396
397
  * @example
@@ -402,21 +403,27 @@ var Browse = /*#__PURE__*/function () {
402
403
 
403
404
  }, {
404
405
  key: "getBrowseFacets",
405
- value: function getBrowseFacets(parameters) {
406
+ value: function getBrowseFacets(parameters, networkParameters) {
406
407
  var _this4 = this;
407
408
 
408
409
  var requestUrl;
409
410
  var fetch = this.options && this.options.fetch || fetchPonyfill({
410
411
  Promise: Promise
411
412
  }).fetch;
413
+ var controller = new AbortController();
414
+ var signal = controller.signal;
412
415
 
413
416
  try {
414
417
  requestUrl = createBrowseUrlForFacets(parameters, this.options);
415
418
  } catch (e) {
416
419
  return Promise.reject(e);
417
- }
420
+ } // Handle network timeout if specified
421
+
418
422
 
419
- return fetch(requestUrl).then(function (response) {
423
+ helpers.applyNetworkTimeout(this.options, networkParameters, controller);
424
+ return fetch(requestUrl, {
425
+ signal: signal
426
+ }).then(function (response) {
420
427
  if (response.ok) {
421
428
  return response.json();
422
429
  }
@@ -433,7 +440,6 @@ var Browse = /*#__PURE__*/function () {
433
440
  });
434
441
  }
435
442
  }]);
436
-
437
443
  return Browse;
438
444
  }();
439
445
 
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable object-curly-newline, no-param-reassign */
10
10
  var qs = require('qs');
@@ -96,8 +96,7 @@ function createRecommendationsUrl(podId, parameters, options) {
96
96
 
97
97
  var Recommendations = /*#__PURE__*/function () {
98
98
  function Recommendations(options) {
99
- _classCallCheck(this, Recommendations);
100
-
99
+ (0, _classCallCheck2["default"])(this, Recommendations);
101
100
  this.options = options || {};
102
101
  this.eventDispatcher = new EventDispatcher(options.eventDispatcher);
103
102
  }
@@ -127,7 +126,7 @@ var Recommendations = /*#__PURE__*/function () {
127
126
  */
128
127
 
129
128
 
130
- _createClass(Recommendations, [{
129
+ (0, _createClass2["default"])(Recommendations, [{
131
130
  key: "getRecommendations",
132
131
  value: function getRecommendations(podId, parameters) {
133
132
  var _this = this;
@@ -175,7 +174,6 @@ var Recommendations = /*#__PURE__*/function () {
175
174
  });
176
175
  }
177
176
  }]);
178
-
179
177
  return Recommendations;
180
178
  }();
181
179
 
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable object-curly-newline, no-underscore-dangle */
10
10
  var qs = require('qs');
@@ -123,8 +123,7 @@ function createSearchUrl(query, parameters, options) {
123
123
 
124
124
  var Search = /*#__PURE__*/function () {
125
125
  function Search(options) {
126
- _classCallCheck(this, Search);
127
-
126
+ (0, _classCallCheck2["default"])(this, Search);
128
127
  this.options = options || {};
129
128
  this.eventDispatcher = new EventDispatcher(options.eventDispatcher);
130
129
  }
@@ -140,6 +139,7 @@ var Search = /*#__PURE__*/function () {
140
139
  * @param {object} [parameters.filters] - Key / value mapping (dictionary) of filters used to refine results
141
140
  * @param {string} [parameters.sortBy='relevance'] - The sort method for results
142
141
  * @param {string} [parameters.sortOrder='descending'] - The sort order for results
142
+ * @param {string} [parameters.section='Products'] - The section name for results
143
143
  * @param {object} [parameters.fmtOptions] - The format options used to refine result groups
144
144
  * @param {string[]} [parameters.hiddenFields] - Hidden metadata fields to return
145
145
  * @param {object} [networkParameters] - Parameters relevant to the network request
@@ -156,7 +156,7 @@ var Search = /*#__PURE__*/function () {
156
156
  */
157
157
 
158
158
 
159
- _createClass(Search, [{
159
+ (0, _createClass2["default"])(Search, [{
160
160
  key: "getSearchResults",
161
161
  value: function getSearchResults(query, parameters) {
162
162
  var _this = this;
@@ -211,7 +211,6 @@ var Search = /*#__PURE__*/function () {
211
211
  });
212
212
  }
213
213
  }]);
214
-
215
214
  return Search;
216
215
  }();
217
216
 
@@ -1,18 +1,18 @@
1
1
  "use strict";
2
2
 
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
6
 
7
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
8
8
 
9
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
9
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
10
 
11
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
12
 
13
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
13
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
14
14
 
15
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
15
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
16
 
17
17
  /* eslint-disable object-curly-newline, no-underscore-dangle, camelcase, no-unneeded-ternary */
18
18
  var qs = require('qs');
@@ -106,8 +106,7 @@ function applyParamsAsString(parameters, options) {
106
106
 
107
107
  var Tracker = /*#__PURE__*/function () {
108
108
  function Tracker(options) {
109
- _classCallCheck(this, Tracker);
110
-
109
+ (0, _classCallCheck2["default"])(this, Tracker);
111
110
  this.options = options || {};
112
111
  this.eventemitter = new EventEmitter();
113
112
  this.requests = new RequestQueue(options, this.eventemitter);
@@ -124,7 +123,7 @@ var Tracker = /*#__PURE__*/function () {
124
123
  */
125
124
 
126
125
 
127
- _createClass(Tracker, [{
126
+ (0, _createClass2["default"])(Tracker, [{
128
127
  key: "trackSessionStart",
129
128
  value: function trackSessionStart() {
130
129
  var networkParameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -176,13 +175,16 @@ var Tracker = /*#__PURE__*/function () {
176
175
  * @returns {(true|Error)}
177
176
  * @description User selected (clicked, or navigated to via keyboard) a result that appeared within autocomplete
178
177
  * @example
179
- * constructorio.tracker.trackAutocompleteSelect('T-Shirt', {
180
- * original_query: 'Shirt',
181
- * section: 'Products',
182
- * tr: 'click',
183
- * group_id: '88JU230',
184
- * display_name: 'apparel',
185
- * });
178
+ * constructorio.tracker.trackAutocompleteSelect(
179
+ * 'T-Shirt',
180
+ * {
181
+ * original_query: 'Shirt',
182
+ * section: 'Products',
183
+ * tr: 'click',
184
+ * group_id: '88JU230',
185
+ * display_name: 'apparel',
186
+ * },
187
+ * );
186
188
  */
187
189
 
188
190
  }, {
@@ -193,7 +195,7 @@ var Tracker = /*#__PURE__*/function () {
193
195
  // Ensure term is provided (required)
194
196
  if (term && typeof term === 'string') {
195
197
  // Ensure parameters are provided (required)
196
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
198
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
197
199
  var url = "".concat(this.options.serviceUrl, "/autocomplete/").concat(helpers.ourEncodeURIComponent(term), "/select?");
198
200
  var queryParams = {};
199
201
  var original_query = parameters.original_query,
@@ -248,11 +250,14 @@ var Tracker = /*#__PURE__*/function () {
248
250
  * @returns {(true|Error)}
249
251
  * @description User submitted a search (pressing enter within input element, or clicking submit element)
250
252
  * @example
251
- * constructorio.tracker.trackSearchSubmit('T-Shirt', {
252
- * original_query: 'Shirt',
253
- * group_id: '88JU230',
254
- * display_name: 'apparel',
255
- * });
253
+ * constructorio.tracker.trackSearchSubmit(
254
+ * 'T-Shirt',
255
+ * {
256
+ * original_query: 'Shirt',
257
+ * group_id: '88JU230',
258
+ * display_name: 'apparel',
259
+ * },
260
+ * );
256
261
  */
257
262
 
258
263
  }, {
@@ -263,7 +268,7 @@ var Tracker = /*#__PURE__*/function () {
263
268
  // Ensure term is provided (required)
264
269
  if (term && typeof term === 'string') {
265
270
  // Ensure parameters are provided (required)
266
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
271
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
267
272
  var url = "".concat(this.options.serviceUrl, "/autocomplete/").concat(helpers.ourEncodeURIComponent(term), "/search?");
268
273
  var queryParams = {};
269
274
  var original_query = parameters.original_query,
@@ -300,16 +305,19 @@ var Tracker = /*#__PURE__*/function () {
300
305
  * @param {string} term - Search results query term
301
306
  * @param {object} parameters - Additional parameters to be sent with request
302
307
  * @param {number} parameters.num_results - Number of search results in total
303
- * @param {array} [parameters.item_ids] - List of product item unique identifiers in search results listing
308
+ * @param {string[]} [parameters.item_ids] - List of product item unique identifiers in search results listing
304
309
  * @param {object} [networkParameters] - Parameters relevant to the network request
305
310
  * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
306
311
  * @returns {(true|Error)}
307
312
  * @description User viewed a search product listing page
308
313
  * @example
309
- * constructorio.tracker.trackSearchResultsLoaded('T-Shirt', {
310
- * num_results: 167,
311
- * item_ids: ['KMH876', 'KMH140', 'KMH437'],
312
- * });
314
+ * constructorio.tracker.trackSearchResultsLoaded(
315
+ * 'T-Shirt',
316
+ * {
317
+ * num_results: 167,
318
+ * item_ids: ['KMH876', 'KMH140', 'KMH437'],
319
+ * },
320
+ * );
313
321
  */
314
322
 
315
323
  }, {
@@ -320,7 +328,7 @@ var Tracker = /*#__PURE__*/function () {
320
328
  // Ensure term is provided (required)
321
329
  if (term && typeof term === 'string') {
322
330
  // Ensure parameters are provided (required)
323
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
331
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
324
332
  var url = "".concat(this.options.serviceUrl, "/behavior?");
325
333
  var queryParams = {
326
334
  action: 'search-results',
@@ -329,6 +337,7 @@ var Tracker = /*#__PURE__*/function () {
329
337
  var num_results = parameters.num_results,
330
338
  customer_ids = parameters.customer_ids,
331
339
  item_ids = parameters.item_ids;
340
+ var customerIDs;
332
341
 
333
342
  if (!helpers.isNil(num_results)) {
334
343
  queryParams.num_results = num_results;
@@ -336,9 +345,13 @@ var Tracker = /*#__PURE__*/function () {
336
345
 
337
346
 
338
347
  if (item_ids && Array.isArray(item_ids) && item_ids.length) {
339
- queryParams.customer_ids = item_ids.join(',');
348
+ customerIDs = item_ids;
340
349
  } else if (customer_ids && Array.isArray(customer_ids) && customer_ids.length) {
341
- queryParams.customer_ids = customer_ids.join(',');
350
+ customerIDs = customer_ids;
351
+ }
352
+
353
+ if (customerIDs && customerIDs.length) {
354
+ queryParams.customer_ids = customerIDs.slice(0, 100).join(',');
342
355
  }
343
356
 
344
357
  this.requests.queue("".concat(url).concat(applyParamsAsString(queryParams, this.options)), undefined, undefined, networkParameters);
@@ -368,11 +381,14 @@ var Tracker = /*#__PURE__*/function () {
368
381
  * @returns {(true|Error)}
369
382
  * @description User clicked a result that appeared within a search product listing page
370
383
  * @example
371
- * constructorio.tracker.trackSearchResultClick('T-Shirt', {
372
- * item_name: 'Red T-Shirt',
373
- * item_id: 'KMH876',
374
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
375
- * });
384
+ * constructorio.tracker.trackSearchResultClick(
385
+ * 'T-Shirt',
386
+ * {
387
+ * item_name: 'Red T-Shirt',
388
+ * item_id: 'KMH876',
389
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
390
+ * },
391
+ * );
376
392
  */
377
393
 
378
394
  }, {
@@ -383,7 +399,7 @@ var Tracker = /*#__PURE__*/function () {
383
399
  // Ensure term is provided (required)
384
400
  if (term && typeof term === 'string') {
385
401
  // Ensure parameters are provided (required)
386
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
402
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
387
403
  var url = "".concat(this.options.serviceUrl, "/autocomplete/").concat(helpers.ourEncodeURIComponent(term), "/click_through?");
388
404
  var queryParams = {};
389
405
  var item_name = parameters.item_name,
@@ -430,10 +446,10 @@ var Tracker = /*#__PURE__*/function () {
430
446
  * Send conversion event to API
431
447
  *
432
448
  * @function trackConversion
433
- * @param {string} term - Search results query term
449
+ * @param {string} [term] - Search results query term that led to conversion event
434
450
  * @param {object} parameters - Additional parameters to be sent with request
435
451
  * @param {string} parameters.item_id - Product item unique identifier
436
- * @param {string} parameters.revenue - Revenue (price) of product item
452
+ * @param {number} [parameters.revenue] - Sale price if available, otherwise the regular (retail) price of item
437
453
  * @param {string} [parameters.item_name] - Product item name
438
454
  * @param {string} [parameters.variation_id] - Product item variation unique identifier
439
455
  * @param {string} [parameters.type='add_to_cart'] - Conversion type
@@ -445,16 +461,20 @@ var Tracker = /*#__PURE__*/function () {
445
461
  * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
446
462
  * @returns {(true|Error)}
447
463
  * @description User performed an action indicating interest in an item (add to cart, add to wishlist, etc.)
464
+ * @see https://docs.constructor.io/rest_api/behavioral_logging/conversions
448
465
  * @example
449
- * constructorio.tracker.trackConversion('T-Shirt', {
450
- * item_id: 'KMH876',
451
- * revenue: 12.00,
452
- * item_name: 'Red T-Shirt',
453
- * variation_id: 'KMH879-7632',
454
- * type: 'like',
455
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
456
- * section: 'Products',
457
- * });
466
+ * constructorio.tracker.trackConversion(
467
+ * 'T-Shirt',
468
+ * {
469
+ * item_id: 'KMH876',
470
+ * revenue: 12.00,
471
+ * item_name: 'Red T-Shirt',
472
+ * variation_id: 'KMH879-7632',
473
+ * type: 'like',
474
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
475
+ * section: 'Products',
476
+ * },
477
+ * );
458
478
  */
459
479
 
460
480
  }, {
@@ -463,7 +483,7 @@ var Tracker = /*#__PURE__*/function () {
463
483
  var networkParameters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
464
484
 
465
485
  // Ensure parameters are provided (required)
466
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
486
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
467
487
  var searchTerm = helpers.ourEncodeURIComponent(term) || 'TERM_UNKNOWN';
468
488
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/conversion?");
469
489
  var queryParams = {};
@@ -540,8 +560,8 @@ var Tracker = /*#__PURE__*/function () {
540
560
  *
541
561
  * @function trackPurchase
542
562
  * @param {object} parameters - Additional parameters to be sent with request
543
- * @param {array} parameters.items - List of product item objects
544
- * @param {number} parameters.revenue - Revenue
563
+ * @param {object[]} parameters.items - List of product item objects
564
+ * @param {number} parameters.revenue - The subtotal (not including taxes, shipping, etc.) of the entire order
545
565
  * @param {string} [parameters.order_id] - Unique order identifier
546
566
  * @param {string} [parameters.section] - Index section
547
567
  * @param {object} [networkParameters] - Parameters relevant to the network request
@@ -549,12 +569,14 @@ var Tracker = /*#__PURE__*/function () {
549
569
  * @returns {(true|Error)}
550
570
  * @description User completed an order (usually fired on order confirmation page)
551
571
  * @example
552
- * constructorio.tracker.trackPurchase({
553
- * items: [{ item_id: 'KMH876' }, { item_id: 'KMH140' }],
554
- * revenue: 12.00,
555
- * order_id: 'OUNXBG2HMA',
556
- * section: 'Products',
557
- * });
572
+ * constructorio.tracker.trackPurchase(
573
+ * {
574
+ * items: [{ item_id: 'KMH876' }, { item_id: 'KMH140' }],
575
+ * revenue: 12.00,
576
+ * order_id: 'OUNXBG2HMA',
577
+ * section: 'Products',
578
+ * },
579
+ * );
558
580
  */
559
581
 
560
582
  }, {
@@ -563,7 +585,7 @@ var Tracker = /*#__PURE__*/function () {
563
585
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
564
586
 
565
587
  // Ensure parameters are provided (required)
566
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
588
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
567
589
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/purchase?");
568
590
  var queryParams = {};
569
591
  var bodyParams = {};
@@ -584,7 +606,7 @@ var Tracker = /*#__PURE__*/function () {
584
606
  }
585
607
 
586
608
  if (items && Array.isArray(items)) {
587
- bodyParams.items = items;
609
+ bodyParams.items = items.slice(0, 100);
588
610
  }
589
611
 
590
612
  if (revenue) {
@@ -627,14 +649,16 @@ var Tracker = /*#__PURE__*/function () {
627
649
  * @returns {(true|Error)}
628
650
  * @description User viewed a set of recommendations
629
651
  * @example
630
- * constructorio.tracker.trackRecommendationView({
631
- * result_count: 22,
632
- * result_page: 2,
633
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
634
- * url: 'https://demo.constructor.io/sandbox/farmstand',
635
- * pod_id: '019927c2-f955-4020',
636
- * num_results_viewed: 3,
637
- * });
652
+ * constructorio.tracker.trackRecommendationView(
653
+ * {
654
+ * result_count: 22,
655
+ * result_page: 2,
656
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
657
+ * url: 'https://demo.constructor.io/sandbox/farmstand',
658
+ * pod_id: '019927c2-f955-4020',
659
+ * num_results_viewed: 3,
660
+ * },
661
+ * );
638
662
  */
639
663
 
640
664
  }, {
@@ -643,7 +667,7 @@ var Tracker = /*#__PURE__*/function () {
643
667
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
644
668
 
645
669
  // Ensure parameters are provided (required)
646
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
670
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
647
671
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/recommendation_result_view?");
648
672
  var bodyParams = {};
649
673
  var result_count = parameters.result_count,
@@ -717,17 +741,19 @@ var Tracker = /*#__PURE__*/function () {
717
741
  * @returns {(true|Error)}
718
742
  * @description User clicked an item that appeared within a list of recommended results
719
743
  * @example
720
- * constructorio.tracker.trackRecommendationClick({
721
- * variation_id: 'KMH879-7632',
722
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
723
- * result_count: 22,
724
- * result_page: 2,
725
- * result_position_on_page: 2,
726
- * num_results_per_page: 12,
727
- * pod_id: '019927c2-f955-4020',
728
- * strategy_id: 'complimentary',
729
- * item_id: 'KMH876',
730
- * });
744
+ * constructorio.tracker.trackRecommendationClick(
745
+ * {
746
+ * variation_id: 'KMH879-7632',
747
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
748
+ * result_count: 22,
749
+ * result_page: 2,
750
+ * result_position_on_page: 2,
751
+ * num_results_per_page: 12,
752
+ * pod_id: '019927c2-f955-4020',
753
+ * strategy_id: 'complimentary',
754
+ * item_id: 'KMH876',
755
+ * },
756
+ * );
731
757
  */
732
758
 
733
759
  }, {
@@ -736,7 +762,7 @@ var Tracker = /*#__PURE__*/function () {
736
762
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
737
763
 
738
764
  // Ensure parameters are provided (required)
739
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
765
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
740
766
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/recommendation_result_click?");
741
767
  var bodyParams = {};
742
768
  var variation_id = parameters.variation_id,
@@ -817,27 +843,29 @@ var Tracker = /*#__PURE__*/function () {
817
843
  * @param {number} [parameters.result_count] - Number of results displayed
818
844
  * @param {number} [parameters.result_page] - Page number of results
819
845
  * @param {string} [parameters.result_id] - Browse result identifier (returned in response from Constructor)
820
- * @param {string} [parameters.selected_filters] - Selected filters
846
+ * @param {string} [parameters.selected_filters] - Selected filters
821
847
  * @param {string} [parameters.sort_order] - Sort order ('ascending' or 'descending')
822
848
  * @param {string} [parameters.sort_by] - Sorting method
823
- * @param {array} [parameters.items] - List of product item objects
849
+ * @param {object[]} [parameters.items] - List of product item objects
824
850
  * @param {object} [networkParameters] - Parameters relevant to the network request
825
851
  * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
826
852
  * @returns {(true|Error)}
827
853
  * @description User viewed a browse product listing page
828
854
  * @example
829
- * constructorio.tracker.trackBrowseResultsLoaded({
830
- * result_count: 22,
831
- * result_page: 2,
832
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
833
- * selected_filters: [ 'brand', 'color' ],
834
- * sort_order: 'ascending',
835
- * sort_by: 'price',
836
- * items: [{ item_id: 'KMH876' }, { item_id: 'KMH140' }],
837
- * url: 'https://demo.constructor.io/sandbox/farmstand',
838
- * filter_name: 'brand',
839
- * filter_value: 'XYZ',
840
- * });
855
+ * constructorio.tracker.trackBrowseResultsLoaded(
856
+ * {
857
+ * result_count: 22,
858
+ * result_page: 2,
859
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
860
+ * selected_filters: { brand: ['foo'], color: ['black'] },
861
+ * sort_order: 'ascending',
862
+ * sort_by: 'price',
863
+ * items: [{ item_id: 'KMH876' }, { item_id: 'KMH140' }],
864
+ * url: 'https://demo.constructor.io/sandbox/farmstand',
865
+ * filter_name: 'brand',
866
+ * filter_value: 'XYZ',
867
+ * },
868
+ * );
841
869
  */
842
870
 
843
871
  }, {
@@ -846,7 +874,7 @@ var Tracker = /*#__PURE__*/function () {
846
874
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
847
875
 
848
876
  // Ensure parameters are provided (required)
849
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
877
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
850
878
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/browse_result_load?");
851
879
  var bodyParams = {};
852
880
  var section = parameters.section,
@@ -904,7 +932,7 @@ var Tracker = /*#__PURE__*/function () {
904
932
  }
905
933
 
906
934
  if (items && Array.isArray(items)) {
907
- bodyParams.items = items;
935
+ bodyParams.items = items.slice(0, 100);
908
936
  }
909
937
 
910
938
  var requestURL = "".concat(requestPath).concat(applyParamsAsString({}, this.options));
@@ -935,24 +963,26 @@ var Tracker = /*#__PURE__*/function () {
935
963
  * @param {number} [parameters.result_page] - Page number of results
936
964
  * @param {number} [parameters.result_position_on_page] - Position of clicked item
937
965
  * @param {number} [parameters.num_results_per_page] - Number of results shown
938
- * @param {string} [parameters.selected_filters] - Selected filters
966
+ * @param {object} [parameters.selected_filters] - Selected filters
939
967
  * @param {object} [networkParameters] - Parameters relevant to the network request
940
968
  * @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
941
969
  * @returns {(true|Error)}
942
970
  * @description User clicked a result that appeared within a browse product listing page
943
971
  * @example
944
- * constructorio.tracker.trackBrowseResultClick({
945
- * variation_id: 'KMH879-7632',
946
- * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
947
- * result_count: 22,
948
- * result_page: 2,
949
- * result_position_on_page: 2,
950
- * num_results_per_page: 12,
951
- * selected_filters: [ 'brand', 'color' ],
952
- * filter_name: 'brand',
953
- * filter_value: 'XYZ',
954
- * item_id: 'KMH876',
955
- * });
972
+ * constructorio.tracker.trackBrowseResultClick(
973
+ * {
974
+ * variation_id: 'KMH879-7632',
975
+ * result_id: '019927c2-f955-4020-8b8d-6b21b93cb5a2',
976
+ * result_count: 22,
977
+ * result_page: 2,
978
+ * result_position_on_page: 2,
979
+ * num_results_per_page: 12,
980
+ * selected_filters: { brand: ['foo'], color: ['black'] },
981
+ * filter_name: 'brand',
982
+ * filter_value: 'XYZ',
983
+ * item_id: 'KMH876',
984
+ * },
985
+ * );
956
986
  */
957
987
 
958
988
  }, {
@@ -961,7 +991,7 @@ var Tracker = /*#__PURE__*/function () {
961
991
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
962
992
 
963
993
  // Ensure parameters are provided (required)
964
- if (parameters && _typeof(parameters) === 'object' && !Array.isArray(parameters)) {
994
+ if (parameters && (0, _typeof2["default"])(parameters) === 'object' && !Array.isArray(parameters)) {
965
995
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/browse_result_click?");
966
996
  var bodyParams = {};
967
997
  var section = parameters.section,
@@ -1049,11 +1079,13 @@ var Tracker = /*#__PURE__*/function () {
1049
1079
  * @returns {(true|Error)}
1050
1080
  * @description User clicked a result that appeared outside of the scope of search / browse / recommendations
1051
1081
  * @example
1052
- * constructorio.tracker.trackGenericResultClick({
1053
- * item_id: 'KMH876',
1054
- * item_name: 'Red T-Shirt',
1055
- * variation_id: 'KMH879-7632',
1056
- * });
1082
+ * constructorio.tracker.trackGenericResultClick(
1083
+ * {
1084
+ * item_id: 'KMH876',
1085
+ * item_name: 'Red T-Shirt',
1086
+ * variation_id: 'KMH879-7632',
1087
+ * },
1088
+ * );
1057
1089
  */
1058
1090
 
1059
1091
  }, {
@@ -1062,7 +1094,7 @@ var Tracker = /*#__PURE__*/function () {
1062
1094
  var networkParameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1063
1095
 
1064
1096
  // Ensure required parameters are provided
1065
- if (_typeof(parameters) === 'object' && !!parameters.item_id) {
1097
+ if ((0, _typeof2["default"])(parameters) === 'object' && !!parameters.item_id) {
1066
1098
  var requestPath = "".concat(this.options.serviceUrl, "/v2/behavioral_action/result_click?");
1067
1099
  var bodyParams = {};
1068
1100
  var item_id = parameters.item_id,
@@ -1102,7 +1134,7 @@ var Tracker = /*#__PURE__*/function () {
1102
1134
  * @returns {(true|Error)}
1103
1135
  * @example
1104
1136
  * constructorio.tracker.on('error', (data) => {
1105
- * // Handle tracking error
1137
+ * // Handle tracking error
1106
1138
  * });
1107
1139
  */
1108
1140
 
@@ -1121,7 +1153,6 @@ var Tracker = /*#__PURE__*/function () {
1121
1153
  return true;
1122
1154
  }
1123
1155
  }]);
1124
-
1125
1156
  return Tracker;
1126
1157
  }(); // Exposed for testing
1127
1158
 
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable no-unneeded-ternary */
10
10
  var helpers = require('../utils/helpers');
@@ -13,8 +13,7 @@ var EventDispatcher = /*#__PURE__*/function () {
13
13
  function EventDispatcher(options) {
14
14
  var _this = this;
15
15
 
16
- _classCallCheck(this, EventDispatcher);
17
-
16
+ (0, _classCallCheck2["default"])(this, EventDispatcher);
18
17
  this.events = [];
19
18
  this.enabled = options && options.enabled === false ? false : true; // Defaults to 'true'
20
19
 
@@ -50,7 +49,7 @@ var EventDispatcher = /*#__PURE__*/function () {
50
49
  } // Push event data to queue
51
50
 
52
51
 
53
- _createClass(EventDispatcher, [{
52
+ (0, _createClass2["default"])(EventDispatcher, [{
54
53
  key: "queue",
55
54
  value: function queue(name, data) {
56
55
  this.events.push({
@@ -75,7 +74,6 @@ var EventDispatcher = /*#__PURE__*/function () {
75
74
  }
76
75
  }
77
76
  }]);
78
-
79
77
  return EventDispatcher;
80
78
  }();
81
79
 
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
4
6
 
5
7
  /* eslint-disable no-param-reassign */
6
8
  var qs = require('qs');
@@ -12,12 +14,13 @@ var store = require('./store');
12
14
  var purchaseEventStorageKey = '_constructorio_purchase_order_ids';
13
15
  var utils = {
14
16
  ourEncodeURIComponent: function ourEncodeURIComponent(str) {
15
- if (str) {
17
+ if (str && typeof str === 'string') {
16
18
  var cleanedString = str.replace(/\[/g, '%5B') // Replace [
17
19
  .replace(/\]/g, '%5D') // Replace ]
18
20
  .replace(/&/g, '%26'); // Replace &
19
21
 
20
- var parsedStrObj = qs.parse("s=".concat(cleanedString));
22
+ var trimmedCleanedString = cleanedString.trim();
23
+ var parsedStrObj = qs.parse("s=".concat(trimmedCleanedString));
21
24
  parsedStrObj.s = parsedStrObj.s.replace(/\s/g, ' ');
22
25
  return qs.stringify(parsedStrObj).split('=')[1];
23
26
  }
@@ -133,7 +136,7 @@ var utils = {
133
136
  purchaseEventStorage[orderIdHash] = true;
134
137
  } else {
135
138
  // Create a new object map for the order ids
136
- purchaseEventStorage = _defineProperty({}, orderIdHash, true);
139
+ purchaseEventStorage = (0, _defineProperty2["default"])({}, orderIdHash, true);
137
140
  } // Push the order id map into session storage
138
141
 
139
142
 
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable class-methods-use-this */
10
10
  var store = require('../utils/store');
@@ -20,9 +20,8 @@ var HumanityCheck = /*#__PURE__*/function () {
20
20
  function HumanityCheck() {
21
21
  var _this = this;
22
22
 
23
- _classCallCheck(this, HumanityCheck);
24
-
25
- this.isHumanBoolean = !!store.session.get(storageKey) || false; // Humanity proved, remove handlers to prove humanity
23
+ (0, _classCallCheck2["default"])(this, HumanityCheck);
24
+ this.isHumanBoolean = this.getIsHumanFromSessionStorage(); // Humanity proved, remove handlers to prove humanity
26
25
 
27
26
  var remove = function remove() {
28
27
  _this.isHumanBoolean = true;
@@ -38,10 +37,15 @@ var HumanityCheck = /*#__PURE__*/function () {
38
37
  helpers.addEventListener(eventType, remove, true);
39
38
  });
40
39
  }
41
- } // Return boolean indicating if is human
40
+ }
42
41
 
42
+ (0, _createClass2["default"])(HumanityCheck, [{
43
+ key: "getIsHumanFromSessionStorage",
44
+ value: function getIsHumanFromSessionStorage() {
45
+ return !!store.session.get(storageKey) || false;
46
+ } // Return boolean indicating if is human
43
47
 
44
- _createClass(HumanityCheck, [{
48
+ }, {
45
49
  key: "isHuman",
46
50
  value: function isHuman() {
47
51
  return this.isHumanBoolean || !!store.session.get(storageKey);
@@ -50,6 +54,10 @@ var HumanityCheck = /*#__PURE__*/function () {
50
54
  }, {
51
55
  key: "isBot",
52
56
  value: function isBot() {
57
+ if (this.getIsHumanFromSessionStorage()) {
58
+ return false;
59
+ }
60
+
53
61
  var _helpers$getNavigator = helpers.getNavigator(),
54
62
  userAgent = _helpers$getNavigator.userAgent,
55
63
  webdriver = _helpers$getNavigator.webdriver;
@@ -58,7 +66,6 @@ var HumanityCheck = /*#__PURE__*/function () {
58
66
  return Boolean(userAgent.match(botRegex)) || Boolean(webdriver);
59
67
  }
60
68
  }]);
61
-
62
69
  return HumanityCheck;
63
70
  }();
64
71
 
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
6
6
 
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
7
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
8
8
 
9
9
  /* eslint-disable brace-style, no-unneeded-ternary */
10
10
  var fetchPonyfill = require('fetch-ponyfill');
@@ -23,8 +23,7 @@ var RequestQueue = /*#__PURE__*/function () {
23
23
  function RequestQueue(options, eventemitter) {
24
24
  var _this = this;
25
25
 
26
- _classCallCheck(this, RequestQueue);
27
-
26
+ (0, _classCallCheck2["default"])(this, RequestQueue);
28
27
  this.options = options;
29
28
  this.eventemitter = eventemitter;
30
29
  this.humanity = new HumanityCheck();
@@ -43,7 +42,7 @@ var RequestQueue = /*#__PURE__*/function () {
43
42
  } // Add request to queue to be dispatched
44
43
 
45
44
 
46
- _createClass(RequestQueue, [{
45
+ (0, _createClass2["default"])(RequestQueue, [{
47
46
  key: "queue",
48
47
  value: function queue(url) {
49
48
  var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GET';
@@ -181,7 +180,6 @@ var RequestQueue = /*#__PURE__*/function () {
181
180
  store.local.set(storageKey, queue);
182
181
  }
183
182
  }]);
184
-
185
183
  return RequestQueue;
186
184
  }();
187
185
 
package/package.json CHANGED
@@ -1,21 +1,24 @@
1
1
  {
2
2
  "name": "@constructor-io/constructorio-client-javascript",
3
- "version": "2.22.0",
3
+ "version": "2.25.3",
4
4
  "description": "Constructor.io JavaScript client",
5
5
  "main": "lib/constructorio.js",
6
6
  "scripts": {
7
7
  "clean": "sudo rm -rf node_modules package-lock.json",
8
- "version": "chmod +x ./scripts/verify-node-version.sh && ./scripts/verify-node-version.sh && npm run docs && git add ./docs/*",
8
+ "version": "chmod +x ./scripts/verify-node-version.sh && ./scripts/verify-node-version.sh && npm run docs && git add ./docs/* && npm run bundle && git add -A ./dist",
9
9
  "check-lisc": "license-checker --production --onlyAllow 'Apache-2.0;BSD-3-Clause;MIT'",
10
10
  "lint": "eslint 'src/**/*.js' 'spec/**/*.js'",
11
- "test": "npm run compile && mkdir -p test && cp -rf lib/* test && mocha ./spec/* --opts ./mocha.opts --recursive",
12
- "test:src": "mkdir -p test && cp -rf src/* test && mocha ./spec/* --opts ./mocha.opts --recursive",
11
+ "test": "npm run compile && mkdir -p test && cp -rf lib/* test && mocha ./spec/*",
12
+ "test:src": "mkdir -p test && cp -rf src/* test && mocha ./spec/*",
13
+ "test:bundled": "npm run bundle && BUNDLED=true PACKAGE_VERSION=$(echo $npm_package_version) mocha ./spec/*",
14
+ "test:all": "npm run test && npm run test:bundled",
13
15
  "precoverage": "rm -rf ./coverage && rm -rf ./.nyc_output",
14
16
  "coverage": "nyc --all --reporter=html npm run test:src",
15
17
  "postcoverage": "serve --listen 8080 --config ./serve.json && rm -rf test",
16
18
  "docs": "jsdoc --configure ./.jsdoc.json ./README.md --recurse ./src --destination ./docs",
17
- "compile": "babel -d lib/ src/",
18
- "prepublish": "npm run compile"
19
+ "compile": "babel src/ -d lib/",
20
+ "prepublish": "npm run compile",
21
+ "bundle": "rm -rf ./dist/* && npm run compile && node bundle.js"
19
22
  },
20
23
  "repository": {
21
24
  "type": "git",
@@ -34,26 +37,28 @@
34
37
  "lib/**/*"
35
38
  ],
36
39
  "devDependencies": {
37
- "@babel/cli": "^7.14.8",
38
- "@babel/core": "^7.14.8",
39
- "@babel/preset-env": "^7.14.8",
40
- "@babel/register": "^7.14.5",
40
+ "@babel/cli": "^7.15.7",
41
+ "@babel/core": "^7.15.8",
42
+ "@babel/plugin-transform-runtime": "^7.16.4",
43
+ "@babel/preset-env": "^7.15.8",
44
+ "@babel/register": "^7.15.3",
41
45
  "chai": "^4.2.0",
42
46
  "chai-as-promised": "^7.1.1",
43
47
  "dotenv": "^8.6.0",
44
- "eslint": "^5.12.1",
48
+ "esbuild": "^0.12.28",
49
+ "eslint": "^8.0.1",
45
50
  "eslint-config-airbnb-base": "^13.1.0",
46
- "eslint-plugin-import": "^2.23.4",
51
+ "eslint-plugin-import": "^2.25.2",
47
52
  "jsdoc": "^3.6.7",
48
53
  "jsdom": "^15.1.1",
49
54
  "license-checker": "^25.0.1",
50
55
  "lodash.clonedeep": "^4.5.0",
51
56
  "minami": "^1.2.3",
52
- "mocha": "^6.2.0",
57
+ "mocha": "^9.1.3",
53
58
  "mocha-jsdom": "^2.0.0",
54
- "nyc": "^14.1.1",
59
+ "nyc": "^15.1.0",
55
60
  "pre-push": "^0.1.1",
56
- "serve": "^11.3.2",
61
+ "serve": "^13.0.2",
57
62
  "sinon": "^7.5.0",
58
63
  "sinon-chai": "^3.7.0"
59
64
  },