@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 +6 -1
- package/lib/constructorio.js +36 -33
- package/lib/modules/autocomplete.js +5 -7
- package/lib/modules/browse.js +20 -14
- package/lib/modules/recommendations.js +5 -7
- package/lib/modules/search.js +6 -7
- package/lib/modules/tracker.js +150 -119
- package/lib/utils/event-dispatcher.js +5 -7
- package/lib/utils/helpers.js +7 -4
- package/lib/utils/humanity-check.js +16 -9
- package/lib/utils/request-queue.js +5 -7
- package/package.json +20 -15
package/README.md
CHANGED
|
@@ -3,14 +3,19 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@constructor-io/constructorio-client-javascript)
|
|
4
4
|
[](https://github.com/Constructor-io/constructorio-client-javascript/blob/master/LICENSE)
|
|
5
5
|
[](https://bundlephobia.com/result?p=@constructor-io/constructorio-client-javascript)
|
|
6
|
-
[](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.
|
package/lib/constructorio.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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 {
|
|
37
|
-
* @param {string}
|
|
38
|
-
* @param {
|
|
39
|
-
* @param {
|
|
40
|
-
* @param {
|
|
41
|
-
* @param {string} [
|
|
42
|
-
* @param {string} [
|
|
43
|
-
* @param {
|
|
44
|
-
* @param {
|
|
45
|
-
* @param {
|
|
46
|
-
* @param {boolean} [
|
|
47
|
-
* @param {
|
|
48
|
-
* @param {object} [
|
|
49
|
-
* @param {
|
|
50
|
-
* @param {boolean} [eventDispatcher.
|
|
51
|
-
* @param {
|
|
52
|
-
* @param {
|
|
53
|
-
* @
|
|
54
|
-
* @property {object}
|
|
55
|
-
* @property {object}
|
|
56
|
-
* @property {object}
|
|
57
|
-
* @property {object}
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/lib/modules/browse.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
10
|
|
|
11
|
-
function
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/lib/modules/search.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/lib/modules/tracker.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
12
12
|
|
|
13
|
-
function
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
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 &&
|
|
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(
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
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 &&
|
|
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 {
|
|
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(
|
|
310
|
-
*
|
|
311
|
-
*
|
|
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 &&
|
|
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
|
-
|
|
348
|
+
customerIDs = item_ids;
|
|
340
349
|
} else if (customer_ids && Array.isArray(customer_ids) && customer_ids.length) {
|
|
341
|
-
|
|
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(
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
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 &&
|
|
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 {
|
|
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(
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
*
|
|
456
|
-
*
|
|
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 &&
|
|
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 {
|
|
544
|
-
* @param {number} parameters.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
|
-
*
|
|
554
|
-
*
|
|
555
|
-
*
|
|
556
|
-
*
|
|
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 &&
|
|
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
|
-
*
|
|
632
|
-
*
|
|
633
|
-
*
|
|
634
|
-
*
|
|
635
|
-
*
|
|
636
|
-
*
|
|
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 &&
|
|
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
|
-
*
|
|
722
|
-
*
|
|
723
|
-
*
|
|
724
|
-
*
|
|
725
|
-
*
|
|
726
|
-
*
|
|
727
|
-
*
|
|
728
|
-
*
|
|
729
|
-
*
|
|
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 &&
|
|
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] -
|
|
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 {
|
|
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
|
-
*
|
|
831
|
-
*
|
|
832
|
-
*
|
|
833
|
-
*
|
|
834
|
-
*
|
|
835
|
-
*
|
|
836
|
-
*
|
|
837
|
-
*
|
|
838
|
-
*
|
|
839
|
-
*
|
|
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 &&
|
|
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 {
|
|
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
|
-
*
|
|
946
|
-
*
|
|
947
|
-
*
|
|
948
|
-
*
|
|
949
|
-
*
|
|
950
|
-
*
|
|
951
|
-
*
|
|
952
|
-
*
|
|
953
|
-
*
|
|
954
|
-
*
|
|
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 &&
|
|
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
|
-
*
|
|
1054
|
-
*
|
|
1055
|
-
*
|
|
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 (
|
|
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
|
-
*
|
|
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
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/lib/utils/helpers.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
6
6
|
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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/*
|
|
12
|
-
"test:src": "mkdir -p test && cp -rf src/* test && mocha ./spec/*
|
|
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/
|
|
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.
|
|
38
|
-
"@babel/core": "^7.
|
|
39
|
-
"@babel/
|
|
40
|
-
"@babel/
|
|
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
|
-
"
|
|
48
|
+
"esbuild": "^0.12.28",
|
|
49
|
+
"eslint": "^8.0.1",
|
|
45
50
|
"eslint-config-airbnb-base": "^13.1.0",
|
|
46
|
-
"eslint-plugin-import": "^2.
|
|
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": "^
|
|
57
|
+
"mocha": "^9.1.3",
|
|
53
58
|
"mocha-jsdom": "^2.0.0",
|
|
54
|
-
"nyc": "^
|
|
59
|
+
"nyc": "^15.1.0",
|
|
55
60
|
"pre-push": "^0.1.1",
|
|
56
|
-
"serve": "^
|
|
61
|
+
"serve": "^13.0.2",
|
|
57
62
|
"sinon": "^7.5.0",
|
|
58
63
|
"sinon-chai": "^3.7.0"
|
|
59
64
|
},
|